Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Latest 25 from a total of 1,281 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Execute Order | 20889546 | 506 days ago | IN | 0 ETH | 0.00223782 | ||||
| Execute Order | 20889545 | 506 days ago | IN | 0 ETH | 0.00392171 | ||||
| Execute Order | 20888857 | 506 days ago | IN | 0 ETH | 0.00276229 | ||||
| Execute Order | 20888166 | 506 days ago | IN | 0 ETH | 0.00257646 | ||||
| Execute Order | 20883585 | 507 days ago | IN | 0 ETH | 0.00327069 | ||||
| Execute Order | 20883101 | 507 days ago | IN | 0 ETH | 0.00255057 | ||||
| Execute Order | 20882681 | 507 days ago | IN | 0 ETH | 0.00242636 | ||||
| Execute Order | 20882176 | 507 days ago | IN | 0 ETH | 0.00321209 | ||||
| Execute Order | 20872860 | 508 days ago | IN | 0 ETH | 0.00873357 | ||||
| Execute Order | 20872663 | 508 days ago | IN | 0 ETH | 0.00916828 | ||||
| Execute Order | 20872662 | 508 days ago | IN | 0 ETH | 0.00305239 | ||||
| Execute Order | 20872653 | 508 days ago | IN | 0 ETH | 0.00923263 | ||||
| Execute Order | 20872620 | 508 days ago | IN | 0 ETH | 0.00957803 | ||||
| Execute Order | 20872605 | 508 days ago | IN | 0 ETH | 0.00999961 | ||||
| Execute Order | 20872590 | 508 days ago | IN | 0 ETH | 0.0104863 | ||||
| Execute Order | 20872575 | 509 days ago | IN | 0 ETH | 0.00314151 | ||||
| Execute Order | 20872569 | 509 days ago | IN | 0 ETH | 0.01083597 | ||||
| Execute Order | 20872567 | 509 days ago | IN | 0 ETH | 0.01072555 | ||||
| Execute Order | 20872552 | 509 days ago | IN | 0 ETH | 0.00794427 | ||||
| Execute Order | 20872537 | 509 days ago | IN | 0 ETH | 0.00985413 | ||||
| Execute Order | 20872522 | 509 days ago | IN | 0 ETH | 0.00941021 | ||||
| Execute Order | 20872520 | 509 days ago | IN | 0 ETH | 0.00308665 | ||||
| Execute Order | 20872442 | 509 days ago | IN | 0 ETH | 0.01049199 | ||||
| Execute Order | 20872427 | 509 days ago | IN | 0 ETH | 0.0032975 | ||||
| Execute Order | 20871706 | 509 days ago | IN | 0 ETH | 0.00938174 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
AnbotoExecV2
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.14;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol";
import "@openzeppelin/contracts/utils/cryptography/SignatureChecker.sol";
/* ========== STRUCTS ========== */
/**
* @notice Represents a customer order.
* @member inputToken Token being sold.
* @member totalAmount Amount to sell.
* @member outputToken Token being bought.
* @member outMin Minumum amount the user expects to get.
* @member maxGasPrice Maximum gas price accepted.
* @member maxFeeAbsolute Agreed max fee amount for order.
* This fee is covering tx gas fee and taken dependant on the ratio between tx gas price and max gas price.
* @member feePercent Agreed Anboto service fee amount in percents, where 1_00 equals one percent.
* @member isFeeTakenInInput If true, the fee will be taken in input tokens; otherwise it will be taken in output token.
* @member deadline Deadline until which the order is valid.
* @member salt Random additional input to make the order unique.
*/
struct Order {
IERC20 inputToken;
uint256 totalAmount;
IERC20 outputToken;
uint256 outMin;
uint256 maxGasPrice;
uint256 maxFeeAbsolute;
uint256 feePercent;
bool isFeeTakenInInput;
uint256 deadline;
uint256 salt;
}
/**
* @notice Exchange quote for swapping tokens.
* @member spender Address approved to execute swap.
* @member swapTarget Contract executing the swap.
* @member sellAmount Amount to sell in the swap.
* @member swapCallData Custom swap data.
*/
struct Quote {
address spender;
address swapTarget;
uint256 sellAmount;
bytes swapCallData;
}
/**
* @notice CoW settlement details.
* @member sellAmount Amount to sell to the CoW.
* @member buyAmount Amount to buy from the CoW.
*/
struct Settlement {
uint256 sellAmount;
uint256 buyAmount;
}
/* ========== CONTRACTS ========== */
/**
* @title Composite order contract version 2.
* @notice This contract manages sliced execution of customer's swap orders.
* Slices can be executed in two ways:
* - via executing a swap on external exchange based on a quote
* - by settling a CoW order based on settlement provided by Anboto CoW solver
* @dev Contract is Ownable and EIP712.
* It uses SafeERC20 for token operations.
* It supports EIP1271 signed messages.
*/
contract AnbotoExecV2 is Ownable, EIP712 {
using SafeERC20 for IERC20;
/* ========== EVENTS ========== */
/**
* @notice Event emitted when new Anboto authorized address is set.
* @dev Emitted when `setAnboto` is called.
* @param anboto Anboto authorized address.
* @param set `true` if authorized, `false` if unathorized.
*/
event AnbotoSet(address indexed anboto, bool set);
/**
* @notice Event emitted when exchange allowlist is updated.
* @dev Emmited when `_updateExchangeAllowlist` is called.
* @param exchange Address of exchange to update.
* @param allowed True when exchange is allowed, false when disallowed.
*/
event ExchangeAllowlistUpdated(address exchange, bool allowed);
/**
* @notice Event emitted when address for Anboto CoW solver is set.
* @dev Emitted when `setAnbotoCowSolver` is called.
* @param anbotoCowSolver Address belonging to Anboto CoW solver.
*/
event AnbotoCowSolverSet(address indexed anbotoCowSolver);
/**
* @notice Event emitted when order slice is executed.
* @dev Emitted when `executeOrder` is called.
* @param maker Maker of the order.
* @param sig Order signature.
* @param spentAmount Amount of user tokens spent in execution.
* @param boughtAmount Amount of tokens bought for user in execution.
* @param feeAmount Amount of tokens taken as fees.
*/
event OrderExecuted(
address indexed maker,
bytes indexed sig,
uint256 spentAmount,
uint256 boughtAmount,
uint256 feeAmount
);
/**
* @notice Event emitted when part of the order is executed by settling CoW order.
* @dev Emitted when `settleCow` is called.
* @param maker Maker of the order.
* @param sig Order signature.
* @param spentAmount Amount of user tokens spent in settlement.
* @param boughtAmount Amount of tokens bought for user in settlement.
* @param feeAmount Amount of tokens taken as fees.
*/
event CowSettled(
address indexed maker,
bytes indexed sig,
uint256 spentAmount,
uint256 boughtAmount,
uint256 feeAmount
);
/**
* @notice Event emitted when fees are claimed.
* @dev Emitted when `claimFees` is called.
* @param claimedTo Where claimed fees were sent to.
* @param token Token claimed.
* @param amount Amount claimed.
*/
event FeesClaimed(address indexed claimedTo, address indexed token, uint256 amount);
/* ========== CONSTANTS ========== */
/** @notice One hundred percent. */
uint256 public constant FULL_PERCENT = 100_00;
/** @notice Order struct type signature hash. */
bytes32 private constant ORDER_TYPEHASH =
keccak256(
"Order(address inputToken,uint256 totalAmount,address outputToken,uint256 outMin,uint256 maxGasPrice,uint256 maxFeeAbsolute,uint256 feePercent,bool isFeeTakenInInput,uint256 deadline,uint256 salt)"
);
/* ========== STATE VARIABLES ========== */
/** @notice Addresses approved to execute order slices. */
mapping(address => bool) public isAnboto;
/** @notice Tracks how much each order is already fulfilled. */
mapping(bytes => uint256) public orderFulfilledAmount;
/** @notice Which exchanges are allowed to be used for executing orders. */
mapping(address => bool) public exchangeAllowlist;
/** @notice Address where CoW settlement contract is deployed. */
address public immutable cowSettlementContract;
/** @notice Address of approved Anboto CoW solver. */
address public anbotoCowSolver;
/* ========== CONSTRUCTOR ========== */
/**
* @notice Contract constructor setting contract domain name and version,
* and other state.
* @param _allowedExchanges Address of exchanges that are allowed to be used for executing orders.
* @param _cowSettlementContract Address where CoW settlement contract is deployed.
* @param _anbotoCowSolver Address of approved Anboto CoW solver.
*/
constructor(
address[] memory _allowedExchanges,
address _cowSettlementContract,
address _anbotoCowSolver
) EIP712("AnbotoExecV2", "2") {
for (uint256 i; i < _allowedExchanges.length; ++i) {
_updateExchangeAllowlist(_allowedExchanges[i], true);
}
cowSettlementContract = _cowSettlementContract;
_setAnbotoCowSolver(_anbotoCowSolver);
}
/* ========== ADMINISTRATION ========== */
/**
* @notice Sets or unsets the address as Anboto approved.
* @dev Requirements:
* - can only be called by owner
* @param _anboto Address to approve or unapprove.
* @param _set Approves the address when `true`, unapproves when `false`.
*/
function setAnboto(address _anboto, bool _set) external onlyOwner {
isAnboto[_anboto] = _set;
emit AnbotoSet(_anboto, _set);
}
function updateExchangeAllowlist(
address[] calldata exchanges,
bool[] calldata allowed
) external onlyOwner {
require(
exchanges.length == allowed.length,
"AnbotoExecV2::updateExchangeAllowlist: Parameter length mismatch."
);
for (uint256 i; i < exchanges.length; ++i) {
_updateExchangeAllowlist(exchanges[i], allowed[i]);
}
}
function _updateExchangeAllowlist(address exchange, bool allowed) private {
exchangeAllowlist[exchange] = allowed;
emit ExchangeAllowlistUpdated(exchange, allowed);
}
/**
* @notice Sets address as approved Anboto CoW solver.
* @dev Requirements:
* - can only be called by owner
* @param _anbotoCowSolver Address to set.
*/
function setAnbotoCowSolver(address _anbotoCowSolver) external onlyOwner {
_setAnbotoCowSolver(_anbotoCowSolver);
}
/**
* @dev Sets address as approved Anboto CoW solver.
* @param _anbotoCowSolver Address to set.
*/
function _setAnbotoCowSolver(address _anbotoCowSolver) private {
anbotoCowSolver = _anbotoCowSolver;
emit AnbotoCowSolverSet(_anbotoCowSolver);
}
/* ========== ORDER FULFILLMENT ========== */
/**
* @notice Executes a slice of the original order.
* The slice is executed by swapping tokens with external exchange as
* specified in the quote, while making sure that original order
* specifications are honored.
* Allowance should be set with input token beforehand by maker.
* Portion of the output will be held as a fee.
* Un-swapped portion of the input will be returned to the maker.
* @dev Requirements:
* - should be called by owner or Anboto approved address
* - should be called before order deadline
* - should be called with different token order input and output tokens
* - should be called with valid signature; order is signed by maker and is unchanged
* - should be called when gas price is not too high
* - quote sell amount should not over fulfill order
* - quote buy amount should be over limit specified by order
* - quote swap target needs to be on exchange allowlist
* @param _order Original order made by maker.
* @param _quote Slice execution specifications.
* @param _maker Anboto user that made the order.
* @param _sig Order signed by maker.
*/
function executeOrder(
Order calldata _order,
Quote calldata _quote,
address _maker,
bytes calldata _sig
) external {
// Verify conditions.
require(
msg.sender == owner() || isAnboto[msg.sender],
"AnbotoExecV2::executeOrder: Caller is not Anboto."
);
validateOrder(_order, _maker, _sig);
require(
exchangeAllowlist[_quote.swapTarget],
"AnbotoExecV2::executeOrder: Swap target not allowed."
);
require(
tx.gasprice <= _order.maxGasPrice,
"AnbotoExecV2::executeOrder: Gas price too high."
);
// Unpack structs.
uint256 sliceInputAmount = _quote.sellAmount;
IERC20 inputToken = _order.inputToken;
IERC20 outputToken = _order.outputToken;
// Update state and check that order total is not exceeded.
orderFulfilledAmount[_sig] += sliceInputAmount;
checkOrderTotal(_order, _sig);
// Get the balance before the swap.
uint256 swapInputBalance = inputToken.balanceOf(address(this));
uint256 swapOutputBalance = outputToken.balanceOf(address(this));
// Transfer input tokens.
inputToken.safeTransferFrom(_maker, address(this), sliceInputAmount);
uint256 feeAmountInputToken;
if (_order.isFeeTakenInInput) {
// Take fees in input tokens.
feeAmountInputToken = getFee(
_order,
sliceInputAmount,
sliceInputAmount,
tx.gasprice
);
}
// Execute the swap.
inputToken.safeApprove(_quote.spender, sliceInputAmount - feeAmountInputToken);
{
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory data) = _quote.swapTarget.call(
_quote.swapCallData
);
if (!success) revert(getRevertMsg(data));
}
// Get the balance after the swap.
// Equals amount of input tokens that were pulled from maker but not swapped.
swapInputBalance =
inputToken.balanceOf(address(this)) -
swapInputBalance -
feeAmountInputToken;
// Equals amount of output tokens that were obtained in the swap.
swapOutputBalance = outputToken.balanceOf(address(this)) - swapOutputBalance;
// If we swapped less than expected
if (swapInputBalance > 0) {
// - correct collected fees
uint256 feeCorrection = (feeAmountInputToken * swapInputBalance) /
(sliceInputAmount - feeAmountInputToken);
uint256 swapInputBalanceCorrected = swapInputBalance + feeCorrection;
feeAmountInputToken -= feeCorrection;
// - correct slice amount
sliceInputAmount -= swapInputBalanceCorrected;
// - correct fulfilled tally
orderFulfilledAmount[_sig] -= swapInputBalanceCorrected;
// - return unspent tokens
inputToken.safeTransfer(_maker, swapInputBalanceCorrected);
// - set approval to 0
inputToken.safeApprove(_quote.spender, 0);
}
uint256 feeAmountOutputToken;
if (!_order.isFeeTakenInInput) {
// Take fees in output tokens.
feeAmountOutputToken = getFee(
_order,
sliceInputAmount,
swapOutputBalance,
tx.gasprice
);
}
uint256 swapOutputBalanceCorrected = swapOutputBalance - feeAmountOutputToken;
// Check if enough output tokens were received by the swap.
checkOutputAmount(_order, sliceInputAmount, swapOutputBalanceCorrected);
// Transfer output tokens (minus fees) to the maker.
outputToken.safeTransfer(_maker, swapOutputBalanceCorrected);
emit OrderExecuted(
_maker,
_sig,
sliceInputAmount,
swapOutputBalanceCorrected,
feeAmountInputToken + feeAmountOutputToken
);
}
/**
* @notice Use a slice of the original order to settle a CoW order.
* The CoW order is settled by swapping tokens with CoW settlement contract
* as specified in the settlement, while making sure that original order
* specifications are honored.
* Allowance should be set with input token beforehand by maker.
* Portion of the output will be held as a fee.
* @dev Requirements:
* - should be called by CoW settlement contract
* - transaction should be originating from Anboto CoW solver
* - should be called before order deadline
* - should be called with different token order input and output tokens
* - should be called with valid signature; order is signed by maker and is unchanged
* - settlement sell amount should not over fulfill order
* - settlement buy amount should be over limit specified by order
* @param _order Original order made by maker.
* @param _settlement CoW settlement specifications.
* @param _maker Anboto user that made the order.
* @param _sig Order signed by maker.
*/
function settleCow(
Order calldata _order,
Settlement calldata _settlement,
address _maker,
bytes calldata _sig
) external {
// Verify conditions.
require(
msg.sender == cowSettlementContract,
"AnbotoExecV2::settleCow: Caller is not CoW settlement contract."
);
require(
// solhint-disable-next-line avoid-tx-origin
tx.origin == anbotoCowSolver,
"AnbotoExecV2::settleCow: Origin is not Anboto CoW solver."
);
validateOrder(_order, _maker, _sig);
// Unpack structs.
IERC20 inputToken = _order.inputToken;
IERC20 outputToken = _order.outputToken;
uint256 sellAmount = _settlement.sellAmount;
uint256 buyAmount = _settlement.buyAmount;
// Calculate fees.
uint256 feeAmountInputToken;
if (_order.isFeeTakenInInput) {
// Take fees in input tokens.
feeAmountInputToken = getCowFee(_order, sellAmount);
}
uint256 feeAmountOutputToken;
if (!_order.isFeeTakenInInput) {
// Take fees in output tokens.
feeAmountOutputToken = getCowFee(_order, buyAmount);
}
// Update balance and verify settlement.
orderFulfilledAmount[_sig] += sellAmount + feeAmountInputToken;
checkOrderTotal(_order, _sig);
checkOutputAmount(
_order,
sellAmount + feeAmountInputToken,
buyAmount - feeAmountOutputToken
);
// Settle order.
inputToken.safeTransferFrom(_maker, cowSettlementContract, sellAmount);
outputToken.safeTransferFrom(cowSettlementContract, address(this), buyAmount);
// Take fees.
if (feeAmountInputToken > 0) {
inputToken.safeTransferFrom(_maker, address(this), feeAmountInputToken);
}
// Transfer output tokens (minus fees) to the maker.
outputToken.safeTransfer(_maker, buyAmount - feeAmountOutputToken);
emit CowSettled(
_maker,
_sig,
sellAmount + feeAmountInputToken,
buyAmount,
feeAmountInputToken + feeAmountOutputToken
);
}
/* ========== FEES ========== */
/**
* @notice Claim collected fees.
* @dev Requirements:
* - can only be called by owner
* - cannot be claimed to null address
* @param _tokens Claim fees collected in these tokens.
* @param _claimTo Where to send collected fees.
*/
function claimFees(IERC20[] calldata _tokens, address _claimTo) external onlyOwner {
require(
_claimTo != address(0),
"AnbotoExecV2::claimFees: Cannot claim to null address."
);
for (uint256 i = 0; i < _tokens.length; i++) {
uint256 amountToClaim = _tokens[i].balanceOf(address(this));
_tokens[i].safeTransfer(_claimTo, amountToClaim);
emit FeesClaimed(_claimTo, address(_tokens[i]), amountToClaim);
}
}
/* ========== HELPERS ========== */
/**
* @notice Checks validity of order signature.
* The signature is considered valid, if
* - it is signed by provided signer and
* - provided order matches signed one.
* @dev Uses EIP712 and EIP1271 standard libraries.
* @param _order Signed order.
* @param _signer Order signer.
* @param _sig Signature to validate.
* @return `true` if order is valid, `false` otherwise.
*/
function isValidSignature(
Order calldata _order,
address _signer,
bytes calldata _sig
) public view returns (bool) {
bytes32 digest = _hashTypedDataV4(hashOrder(_order));
return SignatureChecker.isValidSignatureNow(_signer, digest, _sig);
}
/**
* @dev Calculates hash of an Order struct.
* Used as part of EIP712 and checking validity of order signature.
* @param _order Order to hash.
* @return Hash of the order.
*/
function hashOrder(Order calldata _order) private pure returns (bytes32) {
return
keccak256(
abi.encode(
ORDER_TYPEHASH,
_order.inputToken,
_order.totalAmount,
_order.outputToken,
_order.outMin,
_order.maxGasPrice,
_order.maxFeeAbsolute,
_order.feePercent,
_order.isFeeTakenInInput,
_order.deadline,
_order.salt
)
);
}
/**
* @dev Gets revert message when a low-level call reverts, so that it can
* be bubbled-up to caller.
* @param _returnData Data returned from reverted low-level call.
* @return Revert message.
*/
function getRevertMsg(bytes memory _returnData) private pure returns (string memory) {
// if the _res length is less than 68, then the transaction failed silently (without a revert message)
if (_returnData.length < 68)
return "AnbotoExecV2::getRevertMsg: Transaction reverted silently.";
// solhint-disable-next-line no-inline-assembly
assembly {
// slice the sig hash
_returnData := add(_returnData, 0x04)
}
return abi.decode(_returnData, (string)); // all that remains is the revert string
}
/**
* @dev Calculates fees owed to Anboto.
* @param _order Order made by maker.
* @param _sliceAmount Size of slice being executed.
* @param _baseAmount Base amount for fee calculation.
* @param _gasPrice Tx gas price
* @return feeAmount Amount of fees owed to Anboto.
*/
function getFee(
Order calldata _order,
uint256 _sliceAmount,
uint256 _baseAmount,
uint256 _gasPrice
) private pure returns (uint256 feeAmount) {
if (_order.maxFeeAbsolute > 0) {
// Take absolute fee when absolute max fee is specified.
// Absolute fees are total amount owed for whole order, so for each
// slice we need to take amount proportional to amount sold in the
// slice as compared to the total order. This amount is multiplied by
// ratio of tx gas price to max gas price so we could take the fee to
// cover the transaction costs.
feeAmount +=
(_order.maxFeeAbsolute * _gasPrice * _sliceAmount) /
(_order.maxGasPrice * _order.totalAmount);
}
if (_order.feePercent > 0) {
// Take relative fee when relative fee percent is specified.
feeAmount += (_baseAmount * _order.feePercent) / FULL_PERCENT;
}
// Should not collect more fees than we have.
require(
_baseAmount > feeAmount,
"AnbotoExecV2::calculateFee: Fee larger than base amount."
);
}
/**
* @dev Calculates fees owed to Anboto.
* @param _order Order made by maker.
* @param _baseAmount Base amount for fee calculation.
* @return feeAmount Amount of fees owed to Anboto.
*/
function getCowFee(Order calldata _order, uint256 _baseAmount)
private
pure
returns (uint256 feeAmount)
{
require(
_order.feePercent < FULL_PERCENT,
"AnbotoExecV2::getCowFee: Fee larger than base amount."
);
if (_order.feePercent > 0) {
if (_order.isFeeTakenInInput) {
feeAmount =
(_baseAmount * _order.feePercent) /
(FULL_PERCENT - _order.feePercent);
} else {
feeAmount = (_baseAmount * _order.feePercent) / FULL_PERCENT;
}
}
}
/**
* @dev Validates order and its signature:
* - order deadline should not have passed
* - order fee amount should not be too high
* - order input and output tokens should not be same
* - order should be signed by maker and should be unchanged
* @param _order Order made by maker.
* @param _maker Anboto user that made the order.
* @param _sig Order signed by maker.
*/
function validateOrder(
Order calldata _order,
address _maker,
bytes calldata _sig
) private view {
require(
block.timestamp <= _order.deadline,
"AnbotoExecV2::validateOrder: Order deadline passed."
);
require(
_order.inputToken != _order.outputToken,
"AnbotoExecV2::validateOrder: Input and output tokens are same."
);
// Verify signature.
require(
isValidSignature(_order, _maker, _sig),
"AnbotoExecV2::validateOrder: Invalid signature."
);
}
/**
* @dev Checks that order total amount has not been exceeded.
* @param _order Order made by maker.
* @param _sig Order signed by maker.
*/
function checkOrderTotal(Order calldata _order, bytes calldata _sig) private view {
require(
orderFulfilledAmount[_sig] <= _order.totalAmount,
"AnbotoExecV2::checkOrderTotal: Order total exceeded."
);
}
/**
* @dev Checks that output amount is not too low.
* @param _order Order made by maker.
* @param _soldAmount Amount of tokens sold in trade.
* @param _boughtAmount Amount of tokens bought in trade.
*/
function checkOutputAmount(
Order calldata _order,
uint256 _soldAmount,
uint256 _boughtAmount
) private pure {
require(
_boughtAmount * _order.totalAmount >= _order.outMin * _soldAmount,
"AnbotoExecV2::checkOutputAmount: Output amount too low."
);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing 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/IERC1271.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC1271 standard signature validation method for
* contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271].
*
* _Available since v4.1._
*/
interface IERC1271 {
/**
* @dev Should return whether the signature provided is valid for the provided data
* @param hash Hash of the data to be signed
* @param signature Signature byte array associated with _data
*/
function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC20
* applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The default value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address to, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_transfer(owner, to, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
address owner = _msgSender();
_approve(owner, spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
* - the caller must have allowance for ``from``'s tokens of at least
* `amount`.
*/
function transferFrom(
address from,
address to,
uint256 amount
) public virtual override returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, amount);
_transfer(from, to, amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, allowance(owner, spender) + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
address owner = _msgSender();
uint256 currentAllowance = allowance(owner, spender);
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(owner, spender, currentAllowance - subtractedValue);
}
return true;
}
/**
* @dev Moves `amount` of tokens from `sender` to `recipient`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `from` must have a balance of at least `amount`.
*/
function _transfer(
address from,
address to,
uint256 amount
) internal virtual {
require(from != address(0), "ERC20: transfer from the zero address");
require(to != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(from, to, amount);
uint256 fromBalance = _balances[from];
require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[from] = fromBalance - amount;
}
_balances[to] += amount;
emit Transfer(from, to, amount);
_afterTokenTransfer(from, to, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `amount`.
*
* Does not update the allowance amount in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Might emit an {Approval} event.
*/
function _spendAllowance(
address owner,
address spender,
uint256 amount
) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
require(currentAllowance >= amount, "ERC20: insufficient allowance");
unchecked {
_approve(owner, spender, currentAllowance - amount);
}
}
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
/**
* @dev Hook that is called after any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* has been transferred to `to`.
* - when `from` is zero, `amount` tokens have been minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens have been burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.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 v4.4.1 (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.0;
import "../IERC20.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;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
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));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
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");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @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");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.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
* ====
*
* [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://diligence.consensys.net/posts/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.5.11/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 functionCall(target, data, "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");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(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) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(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) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason 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 {
// 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
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)
pragma solidity ^0.8.0;
import "./ECDSA.sol";
/**
* @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
*
* The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
* thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
* they need in their contracts using a combination of `abi.encode` and `keccak256`.
*
* This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
* scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
* ({_hashTypedDataV4}).
*
* The implementation of the domain separator was designed to be as efficient as possible while still properly updating
* the chain id to protect against replay attacks on an eventual fork of the chain.
*
* NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
* https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
*
* _Available since v3.4._
*/
abstract contract EIP712 {
/* solhint-disable var-name-mixedcase */
// Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
// invalidate the cached domain separator if the chain id changes.
bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
uint256 private immutable _CACHED_CHAIN_ID;
address private immutable _CACHED_THIS;
bytes32 private immutable _HASHED_NAME;
bytes32 private immutable _HASHED_VERSION;
bytes32 private immutable _TYPE_HASH;
/* solhint-enable var-name-mixedcase */
/**
* @dev Initializes the domain separator and parameter caches.
*
* The meaning of `name` and `version` is specified in
* https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
*
* - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
* - `version`: the current major version of the signing domain.
*
* NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
* contract upgrade].
*/
constructor(string memory name, string memory version) {
bytes32 hashedName = keccak256(bytes(name));
bytes32 hashedVersion = keccak256(bytes(version));
bytes32 typeHash = keccak256(
"EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
);
_HASHED_NAME = hashedName;
_HASHED_VERSION = hashedVersion;
_CACHED_CHAIN_ID = block.chainid;
_CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
_CACHED_THIS = address(this);
_TYPE_HASH = typeHash;
}
/**
* @dev Returns the domain separator for the current chain.
*/
function _domainSeparatorV4() internal view returns (bytes32) {
if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
return _CACHED_DOMAIN_SEPARATOR;
} else {
return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
}
}
function _buildDomainSeparator(
bytes32 typeHash,
bytes32 nameHash,
bytes32 versionHash
) private view returns (bytes32) {
return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
}
/**
* @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
* function returns the hash of the fully encoded EIP712 message for this domain.
*
* This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
*
* ```solidity
* bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
* keccak256("Mail(address to,string contents)"),
* mailTo,
* keccak256(bytes(mailContents))
* )));
* address signer = ECDSA.recover(digest, signature);
* ```
*/
function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.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
}
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");
} else if (error == RecoverError.InvalidSignatureV) {
revert("ECDSA: invalid signature 'v' 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) {
// Check the signature length
// - case 65: r,s,v signature (standard)
// - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
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.
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 if (signature.length == 64) {
bytes32 r;
bytes32 vs;
// ecrecover takes the signature parameters, and the only way to get them
// currently is to use assembly.
assembly {
r := mload(add(signature, 0x20))
vs := mload(add(signature, 0x40))
}
return tryRecover(hash, r, vs);
} 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 (v != 27 && v != 28) {
return (address(0), RecoverError.InvalidSignatureV);
}
// 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) {
// 32 is the length in bytes of hash,
// enforced by the type signature above
return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
}
/**
* @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) {
return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/SignatureChecker.sol)
pragma solidity ^0.8.0;
import "./ECDSA.sol";
import "../Address.sol";
import "../../interfaces/IERC1271.sol";
/**
* @dev Signature verification helper that can be used instead of `ECDSA.recover` to seamlessly support both ECDSA
* signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets like
* Argent and Gnosis Safe.
*
* _Available since v4.1._
*/
library SignatureChecker {
/**
* @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the
* signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECDSA.recover`.
*
* NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus
* change through time. It could return true at block N and false at block N+1 (or the opposite).
*/
function isValidSignatureNow(
address signer,
bytes32 hash,
bytes memory signature
) internal view returns (bool) {
(address recovered, ECDSA.RecoverError error) = ECDSA.tryRecover(hash, signature);
if (error == ECDSA.RecoverError.NoError && recovered == signer) {
return true;
}
(bool success, bytes memory result) = signer.staticcall(
abi.encodeWithSelector(IERC1271.isValidSignature.selector, hash, signature)
);
return (success && result.length == 32 && abi.decode(result, (bytes4)) == IERC1271.isValidSignature.selector);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @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] = _HEX_SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.14;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
contract ConstantRateExchange {
using SafeERC20 for IERC20;
IERC20 public immutable TOKEN_A;
IERC20 public immutable TOKEN_B;
uint256 public immutable PRICE_A;
uint256 public immutable PRICE_B;
constructor (IERC20 _tokenA, IERC20 _tokenB, uint256 _priceA, uint256 _priceB) {
require(_priceA != 0 && _priceB != 0, "Price cannot be zero.");
TOKEN_A = _tokenA;
TOKEN_B = _tokenB;
PRICE_A = _priceA;
PRICE_B = _priceB;
}
function swapAB(uint256 _amountA) external {
uint256 amountB = _amountA * PRICE_A / PRICE_B; // multiplication can overflow, should use mulmod
TOKEN_A.safeTransferFrom(msg.sender, address(this), _amountA);
TOKEN_B.safeTransfer(msg.sender, amountB);
}
function swapBA(uint256 _amountB) external {
uint256 amountA = _amountB * PRICE_B / PRICE_A; // multiplication can overflow, should use mulmod
TOKEN_B.safeTransferFrom(msg.sender, address(this), _amountB);
TOKEN_A.safeTransfer(msg.sender, amountA);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.14;
import "hardhat/console.sol";
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
/**
* Used for tests.
*/
contract MockToken is ERC20 {
constructor(
string memory _name,
string memory _symbol
) ERC20(_name, _symbol) {
_mint(msg.sender, 1_000_000);
}
function mint(address account, uint256 amount) external {
_mint(account, amount);
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.14;
import "hardhat/console.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
struct InteractionData {
address target;
uint256 value;
bytes callData;
}
struct TradeData {
uint256 sellTokenIndex;
uint256 buyTokenIndex;
address receiver;
uint256 sellAmount;
uint256 buyAmount;
}
contract SettlementContractMock {
using SafeERC20 for IERC20;
mapping(address => bool) public isSolver;
constructor(address[] memory _solvers) {
for (uint256 i = 0; i < _solvers.length; i++) {
isSolver[_solvers[i]] = true;
}
}
function settle(
IERC20[] calldata _tokens,
TradeData[] calldata _trades,
InteractionData[] calldata _interactions
) external onlySolver {
// get tokens in
for (uint256 i = 0; i < _trades.length; i++) {
TradeData memory trade = _trades[i];
_tokens[trade.sellTokenIndex].safeTransferFrom(
trade.receiver,
address(this),
trade.sellAmount
);
}
// execute interactions
for (uint256 i = 0; i < _interactions.length; i++) {
InteractionData memory interaction = _interactions[i];
(bool success, bytes memory data) = interaction.target.call{
value: interaction.value
}(interaction.callData);
if (!success) revert("Interaction reverted");
}
// send tokens out
for (uint256 i = 0; i < _trades.length; i++) {
TradeData memory trade = _trades[i];
_tokens[trade.buyTokenIndex].safeTransfer(trade.receiver, trade.buyAmount);
}
}
function settleSimple(InteractionData[] calldata _interactions) external onlySolver {
// execute interactions
for (uint256 i = 0; i < _interactions.length; i++) {
InteractionData memory interaction = _interactions[i];
(bool success, bytes memory data) = interaction.target.call{
value: interaction.value
}(interaction.callData);
if (!success) revert(_getRevertMsg(data));
}
}
function setSolver(address _solver, bool _set) external {
isSolver[_solver] = _set;
}
/**
* @notice This function decodes transaction error message
* @param _returnData encoded error message
* @return Decoded revert message
*/
function _getRevertMsg(bytes memory _returnData)
private
pure
returns (string memory)
{
// if the _res length is less than 68, then the transaction failed silently (without a revert message)
if (_returnData.length < 68) return "Interaction reverted.";
assembly {
// slice the sig hash
_returnData := add(_returnData, 0x04)
}
return abi.decode(_returnData, (string)); // all that remains is the revert string
}
/* ========== RESTRICTION FUNCTIONS ========== */
function _onlySolver() private view {
require(isSolver[msg.sender], "Only solvers.");
}
/* ========== MODIFIERS ========== */
modifier onlySolver() {
_onlySolver();
_;
}
}// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67;
function _sendLogPayload(bytes memory payload) private view {
address consoleAddress = CONSOLE_ADDRESS;
/// @solidity memory-safe-assembly
assembly {
pop(staticcall(gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0))
}
}
function log() internal view {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int256 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
}
function logUint(uint256 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function logString(string memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function logBool(bool p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function logAddress(address p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function logBytes(bytes memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
}
function logBytes1(bytes1 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
}
function logBytes2(bytes2 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
}
function logBytes3(bytes3 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
}
function logBytes4(bytes4 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
}
function logBytes5(bytes5 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
}
function logBytes6(bytes6 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
}
function logBytes7(bytes7 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
}
function logBytes8(bytes8 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
}
function logBytes9(bytes9 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
}
function logBytes10(bytes10 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
}
function logBytes11(bytes11 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
}
function logBytes12(bytes12 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
}
function logBytes13(bytes13 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
}
function logBytes14(bytes14 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
}
function logBytes15(bytes15 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
}
function logBytes16(bytes16 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
}
function logBytes17(bytes17 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
}
function logBytes18(bytes18 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
}
function logBytes19(bytes19 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
}
function logBytes20(bytes20 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
}
function logBytes21(bytes21 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
}
function logBytes22(bytes22 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
}
function logBytes23(bytes23 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
}
function logBytes24(bytes24 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
}
function logBytes25(bytes25 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
}
function logBytes26(bytes26 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
}
function logBytes27(bytes27 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
}
function logBytes28(bytes28 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
}
function logBytes29(bytes29 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
}
function logBytes30(bytes30 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
}
function logBytes31(bytes31 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
}
function logBytes32(bytes32 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
}
function log(uint256 p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function log(string memory p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function log(bool p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function log(address p0) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function log(uint256 p0, uint256 p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
}
function log(uint256 p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
}
function log(uint256 p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
}
function log(uint256 p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
}
function log(string memory p0, uint256 p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
}
function log(string memory p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
}
function log(string memory p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
}
function log(string memory p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
}
function log(bool p0, uint256 p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
}
function log(bool p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
}
function log(bool p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
}
function log(bool p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
}
function log(address p0, uint256 p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
}
function log(address p0, string memory p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
}
function log(address p0, bool p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
}
function log(address p0, address p1) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
}
function log(uint256 p0, uint256 p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
}
function log(uint256 p0, bool p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
}
function log(uint256 p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
}
function log(uint256 p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
}
function log(uint256 p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
}
function log(uint256 p0, address p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
}
function log(uint256 p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
}
function log(uint256 p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
}
function log(uint256 p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
}
function log(string memory p0, string memory p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
}
function log(string memory p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
}
function log(string memory p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
}
function log(string memory p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
}
function log(string memory p0, bool p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
}
function log(string memory p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
}
function log(string memory p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
}
function log(string memory p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
}
function log(string memory p0, address p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
}
function log(string memory p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
}
function log(string memory p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
}
function log(string memory p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
}
function log(bool p0, uint256 p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
}
function log(bool p0, uint256 p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
}
function log(bool p0, uint256 p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
}
function log(bool p0, uint256 p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
}
function log(bool p0, string memory p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
}
function log(bool p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
}
function log(bool p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
}
function log(bool p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
}
function log(bool p0, bool p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
}
function log(bool p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
}
function log(bool p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
}
function log(bool p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
}
function log(bool p0, address p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
}
function log(bool p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
}
function log(bool p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
}
function log(bool p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
}
function log(address p0, uint256 p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
}
function log(address p0, uint256 p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
}
function log(address p0, uint256 p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
}
function log(address p0, uint256 p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
}
function log(address p0, string memory p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
}
function log(address p0, string memory p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
}
function log(address p0, string memory p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
}
function log(address p0, string memory p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
}
function log(address p0, bool p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
}
function log(address p0, bool p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
}
function log(address p0, bool p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
}
function log(address p0, bool p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
}
function log(address p0, address p1, uint256 p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
}
function log(address p0, address p1, string memory p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
}
function log(address p0, address p1, bool p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
}
function log(address p0, address p1, address p2) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view {
_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 view {
_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 view {
_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 view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view {
_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 view {
_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 view {
_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 view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, address p3) internal view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, address p3) internal view {
_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 view {
_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 view {
_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 view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, address p3) internal view {
_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 view {
_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 view {
_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 view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, address p3) internal view {
_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 view {
_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 view {
_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 view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, address p3) internal view {
_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 view {
_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 view {
_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 view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, uint256 p3) internal view {
_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 view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, uint256 p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, string memory p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, bool p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, address p3) internal view {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
}
}{
"optimizer": {
"enabled": true,
"runs": 99999
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address[]","name":"_allowedExchanges","type":"address[]"},{"internalType":"address","name":"_cowSettlementContract","type":"address"},{"internalType":"address","name":"_anbotoCowSolver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"anbotoCowSolver","type":"address"}],"name":"AnbotoCowSolverSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"anboto","type":"address"},{"indexed":false,"internalType":"bool","name":"set","type":"bool"}],"name":"AnbotoSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":true,"internalType":"bytes","name":"sig","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"spentAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"boughtAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"CowSettled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"exchange","type":"address"},{"indexed":false,"internalType":"bool","name":"allowed","type":"bool"}],"name":"ExchangeAllowlistUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimedTo","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FeesClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"maker","type":"address"},{"indexed":true,"internalType":"bytes","name":"sig","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"spentAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"boughtAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"OrderExecuted","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"},{"inputs":[],"name":"FULL_PERCENT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"anbotoCowSolver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20[]","name":"_tokens","type":"address[]"},{"internalType":"address","name":"_claimTo","type":"address"}],"name":"claimFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cowSettlementContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exchangeAllowlist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"contract IERC20","name":"inputToken","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"contract IERC20","name":"outputToken","type":"address"},{"internalType":"uint256","name":"outMin","type":"uint256"},{"internalType":"uint256","name":"maxGasPrice","type":"uint256"},{"internalType":"uint256","name":"maxFeeAbsolute","type":"uint256"},{"internalType":"uint256","name":"feePercent","type":"uint256"},{"internalType":"bool","name":"isFeeTakenInInput","type":"bool"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"}],"internalType":"struct Order","name":"_order","type":"tuple"},{"components":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"address","name":"swapTarget","type":"address"},{"internalType":"uint256","name":"sellAmount","type":"uint256"},{"internalType":"bytes","name":"swapCallData","type":"bytes"}],"internalType":"struct Quote","name":"_quote","type":"tuple"},{"internalType":"address","name":"_maker","type":"address"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"executeOrder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAnboto","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"contract IERC20","name":"inputToken","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"contract IERC20","name":"outputToken","type":"address"},{"internalType":"uint256","name":"outMin","type":"uint256"},{"internalType":"uint256","name":"maxGasPrice","type":"uint256"},{"internalType":"uint256","name":"maxFeeAbsolute","type":"uint256"},{"internalType":"uint256","name":"feePercent","type":"uint256"},{"internalType":"bool","name":"isFeeTakenInInput","type":"bool"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"}],"internalType":"struct Order","name":"_order","type":"tuple"},{"internalType":"address","name":"_signer","type":"address"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"orderFulfilledAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_anboto","type":"address"},{"internalType":"bool","name":"_set","type":"bool"}],"name":"setAnboto","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_anbotoCowSolver","type":"address"}],"name":"setAnbotoCowSolver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"contract IERC20","name":"inputToken","type":"address"},{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"contract IERC20","name":"outputToken","type":"address"},{"internalType":"uint256","name":"outMin","type":"uint256"},{"internalType":"uint256","name":"maxGasPrice","type":"uint256"},{"internalType":"uint256","name":"maxFeeAbsolute","type":"uint256"},{"internalType":"uint256","name":"feePercent","type":"uint256"},{"internalType":"bool","name":"isFeeTakenInInput","type":"bool"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"salt","type":"uint256"}],"internalType":"struct Order","name":"_order","type":"tuple"},{"components":[{"internalType":"uint256","name":"sellAmount","type":"uint256"},{"internalType":"uint256","name":"buyAmount","type":"uint256"}],"internalType":"struct Settlement","name":"_settlement","type":"tuple"},{"internalType":"address","name":"_maker","type":"address"},{"internalType":"bytes","name":"_sig","type":"bytes"}],"name":"settleCow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"exchanges","type":"address[]"},{"internalType":"bool[]","name":"allowed","type":"bool[]"}],"name":"updateExchangeAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
6101606040523480156200001257600080fd5b5060405162003770380380620037708339810160408190526200003591620002c3565b6040518060400160405280600c81526020016b20b73137ba37a2bc32b1ab1960a11b815250604051806040016040528060018152602001601960f91b8152506200008e620000886200018f60201b60201c565b62000193565b815160209283012081519183019190912060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f818801819052818301969096526060810194909452608080850193909352308483018190528151808603909301835260c0948501909152815191909501209052919091526101205260005b83518110156200016c5762000159848281518110620001435762000143620003bb565b60200260200101516001620001e360201b60201c565b6200016481620003d1565b905062000120565b506001600160a01b03821661014052620001868162000246565b505050620003f9565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038216600081815260036020908152604091829020805460ff19168515159081179091558251938452908301527f627cd1344146c37272a586e0d2cce7d499f8d0c9d40756a50c8e45ef46a4e5bc910160405180910390a15050565b600480546001600160a01b0319166001600160a01b0383169081179091556040517faa89234be0adbe6a6e50f84f07e9bda5649637085d7607fac10623be1e7971a090600090a250565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620002be57600080fd5b919050565b600080600060608486031215620002d957600080fd5b83516001600160401b0380821115620002f157600080fd5b818601915086601f8301126200030657600080fd5b81516020828211156200031d576200031d62000290565b8160051b604051601f19603f8301168101818110868211171562000345576200034562000290565b60405292835281830193508481018201928a8411156200036457600080fd5b948201945b838610156200038d576200037d86620002a6565b8552948201949382019362000369565b97506200039e9050888201620002a6565b955050505050620003b260408501620002a6565b90509250925092565b634e487b7160e01b600052603260045260246000fd5b600060018201620003f257634e487b7160e01b600052601160045260246000fd5b5060010190565b60805160a05160c05160e05161010051610120516101405161330762000469600039600081816102ac015281816103f60152818161064f0152610690015260006125c401526000612613015260006125ee01526000612547015260006125710152600061259b01526133076000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80638da5cb5b11610097578063ec22430b11610066578063ec22430b14610256578063f2fde38b14610281578063fe8f3bb414610294578063ffaa9379146102a757600080fd5b80638da5cb5b146101eb578063cbe8bba814610209578063cc00f58014610220578063e2cb23821461024357600080fd5b806351d307af116100d357806351d307af1461018a578063554ff3ec1461019d5780636f93ea88146101b0578063715018a6146101e357600080fd5b80630a8a9f98146101055780630b27e58a1461011a5780630f5624b7146101645780632f6fa94e14610177575b600080fd5b610118610113366004612a61565b6102ce565b005b60045461013a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610118610172366004612af5565b6103de565b610118610185366004612be1565b61079b565b610118610198366004612c38565b610a74565b6101186101ab366004612ca4565b610c22565b6101d36101be366004612ca4565b60016020526000908152604090205460ff1681565b604051901515815260200161015b565b610118610caf565b60005473ffffffffffffffffffffffffffffffffffffffff1661013a565b61021261271081565b60405190815260200161015b565b6101d361022e366004612ca4565b60036020526000908152604090205460ff1681565b6101d3610251366004612cc1565b610d3c565b610212610264366004612de0565b805160208183018101805160028252928201919093012091525481565b61011861028f366004612ca4565b610d9f565b6101186102a2366004612e60565b610ecc565b61013a7f000000000000000000000000000000000000000000000000000000000000000081565b60005473ffffffffffffffffffffffffffffffffffffffff163314610354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527f507bb1755646eddf30f01d29781b35b93c46fadda8b9d6a325e1c30b25514304910160405180910390a25050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146104a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f416e626f746f4578656356323a3a736574746c65436f773a2043616c6c65722060448201527f6973206e6f7420436f5720736574746c656d656e7420636f6e74726163742e00606482015260840161034b565b60045473ffffffffffffffffffffffffffffffffffffffff16321461054a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f416e626f746f4578656356323a3a736574746c65436f773a204f726967696e2060448201527f6973206e6f7420416e626f746f20436f5720736f6c7665722e00000000000000606482015260840161034b565b610556858484846116de565b60006105656020870187612ca4565b905060006105796060880160408901612ca4565b90508535602087013560006105956101008b0160e08c01612eec565b156105a7576105a48a846118e1565b90505b60006105ba6101008c0160e08d01612eec565b6105cb576105c88b846118e1565b90505b6105d58285612f38565b600289896040516105e7929190612f50565b908152602001604051809103902060008282546106049190612f38565b9091555061061590508b89896119eb565b6106328b6106238487612f38565b61062d8487612f60565b611aa4565b61067473ffffffffffffffffffffffffffffffffffffffff87168a7f000000000000000000000000000000000000000000000000000000000000000087611b4e565b6106b673ffffffffffffffffffffffffffffffffffffffff86167f00000000000000000000000000000000000000000000000000000000000000003086611b4e565b81156106de576106de73ffffffffffffffffffffffffffffffffffffffff87168a3085611b4e565b61070a896106ec8386612f60565b73ffffffffffffffffffffffffffffffffffffffff88169190611c2a565b878760405161071a929190612f50565b60405190819003902073ffffffffffffffffffffffffffffffffffffffff8a167f64012eb5dbb8623c87d95b6a75ccd51eec4c0385237d9dbe5843509e0601e8ae6107658588612f38565b866107708688612f38565b6040805193845260208401929092529082015260600160405180910390a35050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461081c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161034b565b73ffffffffffffffffffffffffffffffffffffffff81166108bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f416e626f746f4578656356323a3a636c61696d466565733a2043616e6e6f742060448201527f636c61696d20746f206e756c6c20616464726573732e00000000000000000000606482015260840161034b565b60005b82811015610a6e5760008484838181106108de576108de612f77565b90506020020160208101906108f39190612ca4565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa15801561095f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109839190612fa6565b90506109ce838287878681811061099c5761099c612f77565b90506020020160208101906109b19190612ca4565b73ffffffffffffffffffffffffffffffffffffffff169190611c2a565b8484838181106109e0576109e0612f77565b90506020020160208101906109f59190612ca4565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ffe3464cd748424446c37877c28ce5b700222c5bc9f90d908afcc4e5cb22707ff83604051610a5391815260200190565b60405180910390a35080610a6681612fbf565b9150506108c2565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610af5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161034b565b828114610baa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f416e626f746f4578656356323a3a75706461746545786368616e6765416c6c6f60448201527f776c6973743a20506172616d65746572206c656e677468206d69736d6174636860648201527f2e00000000000000000000000000000000000000000000000000000000000000608482015260a40161034b565b60005b83811015610c1b57610c0b858583818110610bca57610bca612f77565b9050602002016020810190610bdf9190612ca4565b848484818110610bf157610bf1612f77565b9050602002016020810190610c069190612eec565b611c80565b610c1481612fbf565b9050610bad565b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ca3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161034b565b610cac81611d0e565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161034b565b610d3a6000611d7d565b565b600080610d50610d4b87611df2565b611ef1565b9050610d93858286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f5a92505050565b9150505b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161034b565b73ffffffffffffffffffffffffffffffffffffffff8116610ec3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161034b565b610cac81611d7d565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610f0157503360009081526001602052604090205460ff165b610f8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f416e626f746f4578656356323a3a657865637574654f726465723a2043616c6c60448201527f6572206973206e6f7420416e626f746f2e000000000000000000000000000000606482015260840161034b565b610f99858484846116de565b60036000610fad6040870160208801612ca4565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000205460ff16611063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f416e626f746f4578656356323a3a657865637574654f726465723a205377617060448201527f20746172676574206e6f7420616c6c6f7765642e000000000000000000000000606482015260840161034b565b84608001353a11156110f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416e626f746f4578656356323a3a657865637574654f726465723a204761732060448201527f707269636520746f6f20686967682e0000000000000000000000000000000000606482015260840161034b565b6040840135600061110b6020880188612ca4565b9050600061111f6060890160408a01612ca4565b90508260028686604051611134929190612f50565b908152602001604051809103902060008282546111519190612f38565b9091555061116290508886866119eb565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156111cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f39190612fa6565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611263573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112879190612fa6565b90506112ab73ffffffffffffffffffffffffffffffffffffffff8516893088611b4e565b60006112be6101008c0160e08d01612eec565b156112d2576112cf8b87883a61214b565b90505b61130a6112e260208c018c612ca4565b6112ec8389612f60565b73ffffffffffffffffffffffffffffffffffffffff8816919061225a565b60008061131d60408d0160208e01612ca4565b73ffffffffffffffffffffffffffffffffffffffff1661134060608e018e612ff7565b60405161134e929190612f50565b6000604051808303816000865af19150503d806000811461138b576040519150601f19603f3d011682016040523d82523d6000602084013e611390565b606091505b5091509150816113d6576113a3816123dc565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034b91906130d2565b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201528190849073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015611446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146a9190612fa6565b6114749190612f60565b61147e9190612f60565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909350829073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190602401602060405180830381865afa1580156114ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115119190612fa6565b61151b9190612f60565b915082156115f457600061152f8288612f60565b61153985846130e5565b6115439190613122565b905060006115518286612f38565b905061155d8284612f60565b92506115698189612f60565b97508060028b8b60405161157e929190612f50565b9081526020016040518091039020600082825461159b9190612f60565b909155506115c2905073ffffffffffffffffffffffffffffffffffffffff88168c83611c2a565b6115f16115d260208e018e612ca4565b73ffffffffffffffffffffffffffffffffffffffff891690600061225a565b50505b60006116076101008d0160e08e01612eec565b61161a576116178c88853a61214b565b90505b60006116268285612f60565b90506116338d8983611aa4565b61165473ffffffffffffffffffffffffffffffffffffffff87168c83611c2a565b8989604051611664929190612f50565b60405190819003902073ffffffffffffffffffffffffffffffffffffffff8c167f09c6933d9f62d39850a62c05237e4d0261b66d1cc9090dd881405809525bfb6d8a846116b18789612f38565b6040805193845260208401929092529082015260600160405180910390a350505050505050505050505050565b836101000135421115611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f416e626f746f4578656356323a3a76616c69646174654f726465723a204f726460448201527f657220646561646c696e65207061737365642e00000000000000000000000000606482015260840161034b565b6117836060850160408601612ca4565b73ffffffffffffffffffffffffffffffffffffffff166117a66020860186612ca4565b73ffffffffffffffffffffffffffffffffffffffff1603611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f416e626f746f4578656356323a3a76616c69646174654f726465723a20496e7060448201527f757420616e64206f757470757420746f6b656e73206172652073616d652e0000606482015260840161034b565b61185584848484610d3c565b610a6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416e626f746f4578656356323a3a76616c69646174654f726465723a20496e7660448201527f616c6964207369676e61747572652e0000000000000000000000000000000000606482015260840161034b565b60006127108360c0013510611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f416e626f746f4578656356323a3a676574436f774665653a20466565206c617260448201527f676572207468616e206261736520616d6f756e742e0000000000000000000000606482015260840161034b565b60c0830135156119e557611993610100840160e08501612eec565b156119c7576119a860c0840135612710612f60565b6119b660c0850135846130e5565b6119c09190613122565b90506119e5565b6127106119d860c0850135846130e5565b6119e29190613122565b90505b92915050565b826020013560028383604051611a02929190612f50565b9081526020016040518091039020541115611a9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f416e626f746f4578656356323a3a636865636b4f72646572546f74616c3a204f60448201527f7264657220746f74616c2065786365656465642e000000000000000000000000606482015260840161034b565b505050565b611ab28260608501356130e5565b611ac06020850135836130e5565b1015611a9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f416e626f746f4578656356323a3a636865636b4f7574707574416d6f756e743a60448201527f204f757470757420616d6f756e7420746f6f206c6f772e000000000000000000606482015260840161034b565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610a6e9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612421565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611a9f9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611ba8565b73ffffffffffffffffffffffffffffffffffffffff821660008181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f627cd1344146c37272a586e0d2cce7d499f8d0c9d40756a50c8e45ef46a4e5bc910160405180910390a15050565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517faa89234be0adbe6a6e50f84f07e9bda5649637085d7607fac10623be1e7971a090600090a250565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60007fd876f94781a73741f8387317185c571f9b611dad759d185f8dc40b92855cc994611e226020840184612ca4565b6020840135611e376060860160408701612ca4565b6060860135608087013560a088013560c0890135611e5c6101008b0160e08c01612eec565b60408051602081019a909a5273ffffffffffffffffffffffffffffffffffffffff988916908a0152606089019690965295909316608087015260a086019190915260c085015260e0840152610100838101929092521515610120838101919091529084013561014083015283013561016082015261018001604051602081830303815290604052805190602001209050919050565b60006119e5611efe61252d565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000611f698585612661565b90925090506000816004811115611f8257611f8261315d565b148015611fba57508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15611fca57600192505050612144565b6000808773ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b8888604051602401611fff92919061318c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161208891906131a5565b600060405180830381855afa9150503d80600081146120c3576040519150601f19603f3d011682016040523d82523d6000602084013e6120c8565b606091505b50915091508180156120db575080516020145b801561213d575080517f1626ba7e000000000000000000000000000000000000000000000000000000009061211990830160209081019084016131c1565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b9450505050505b9392505050565b600060a08501351561219957612169602086013560808701356130e5565b846121788460a08901356130e5565b61218291906130e5565b61218c9190613122565b6121969082612f38565b90505b60c0850135156121cb576127106121b460c0870135856130e5565b6121be9190613122565b6121c89082612f38565b90505b808311610d97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f416e626f746f4578656356323a3a63616c63756c6174654665653a204665652060448201527f6c6172676572207468616e206261736520616d6f756e742e0000000000000000606482015260840161034b565b8015806122fa57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156122d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f89190612fa6565b155b612386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840161034b565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611a9f9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611ba8565b6060604482511015612407576040518060600160405280603a8152602001613298603a913992915050565b600482019150818060200190518101906119e59190613203565b6000612483826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126cf9092919063ffffffff16565b805190915015611a9f57808060200190518101906124a1919061327a565b611a9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161034b565b60003073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614801561259357507f000000000000000000000000000000000000000000000000000000000000000046145b156125bd57507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b60008082516041036126975760208301516040840151606085015160001a61268b878285856126de565b945094505050506126c8565b82516040036126c057602083015160408401516126b58683836127f6565b9350935050506126c8565b506000905060025b9250929050565b6060610d978484600085612848565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561271557506000905060036127ed565b8460ff16601b1415801561272d57508460ff16601c14155b1561273e57506000905060046127ed565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612792573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166127e6576000600192509250506127ed565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83168161282c60ff86901c601b612f38565b905061283a878288856126de565b935093505050935093915050565b6060824710156128da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161034b565b73ffffffffffffffffffffffffffffffffffffffff85163b612958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161034b565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161298191906131a5565b60006040518083038185875af1925050503d80600081146129be576040519150601f19603f3d011682016040523d82523d6000602084013e6129c3565b606091505b50915091506129d38282866129de565b979650505050505050565b606083156129ed575081612144565b8251156129fd5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034b91906130d2565b73ffffffffffffffffffffffffffffffffffffffff81168114610cac57600080fd5b8015158114610cac57600080fd5b60008060408385031215612a7457600080fd5b8235612a7f81612a31565b91506020830135612a8f81612a53565b809150509250929050565b60006101408284031215612aad57600080fd5b50919050565b60008083601f840112612ac557600080fd5b50813567ffffffffffffffff811115612add57600080fd5b6020830191508360208285010111156126c857600080fd5b60008060008060008587036101c0811215612b0f57600080fd5b612b198888612a9a565b955060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec082011215612b4b57600080fd5b5061014086019350610180860135612b6281612a31565b92506101a086013567ffffffffffffffff811115612b7f57600080fd5b612b8b88828901612ab3565b969995985093965092949392505050565b60008083601f840112612bae57600080fd5b50813567ffffffffffffffff811115612bc657600080fd5b6020830191508360208260051b85010111156126c857600080fd5b600080600060408486031215612bf657600080fd5b833567ffffffffffffffff811115612c0d57600080fd5b612c1986828701612b9c565b9094509250506020840135612c2d81612a31565b809150509250925092565b60008060008060408587031215612c4e57600080fd5b843567ffffffffffffffff80821115612c6657600080fd5b612c7288838901612b9c565b90965094506020870135915080821115612c8b57600080fd5b50612c9887828801612b9c565b95989497509550505050565b600060208284031215612cb657600080fd5b813561214481612a31565b6000806000806101808587031215612cd857600080fd5b612ce28686612a9a565b9350610140850135612cf381612a31565b925061016085013567ffffffffffffffff811115612d1057600080fd5b612c9887828801612ab3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612d9257612d92612d1c565b604052919050565b600067ffffffffffffffff821115612db457612db4612d1c565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600060208284031215612df257600080fd5b813567ffffffffffffffff811115612e0957600080fd5b8201601f81018413612e1a57600080fd5b8035612e2d612e2882612d9a565b612d4b565b818152856020838501011115612e4257600080fd5b81602084016020830137600091810160200191909152949350505050565b60008060008060006101a08688031215612e7957600080fd5b612e838787612a9a565b945061014086013567ffffffffffffffff80821115612ea157600080fd5b908701906080828a031215612eb557600080fd5b90945061016087013590612ec882612a31565b9093506101808701359080821115612edf57600080fd5b50612b8b88828901612ab3565b600060208284031215612efe57600080fd5b813561214481612a53565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612f4b57612f4b612f09565b500190565b8183823760009101908152919050565b600082821015612f7257612f72612f09565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612fb857600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ff057612ff0612f09565b5060010190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261302c57600080fd5b83018035915067ffffffffffffffff82111561304757600080fd5b6020019150368190038213156126c857600080fd5b60005b8381101561307757818101518382015260200161305f565b83811115610a6e5750506000910152565b600081518084526130a081602086016020860161305c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006119e26020830184613088565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561311d5761311d612f09565b500290565b600082613158577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b828152604060208201526000610d976040830184613088565b600082516131b781846020870161305c565b9190910192915050565b6000602082840312156131d357600080fd5b81517fffffffff000000000000000000000000000000000000000000000000000000008116811461214457600080fd5b60006020828403121561321557600080fd5b815167ffffffffffffffff81111561322c57600080fd5b8201601f8101841361323d57600080fd5b805161324b612e2882612d9a565b81815285602083850101111561326057600080fd5b61327182602083016020860161305c565b95945050505050565b60006020828403121561328c57600080fd5b815161214481612a5356fe416e626f746f4578656356323a3a6765745265766572744d73673a205472616e73616374696f6e2072657665727465642073696c656e746c792ea26469706673582212200fc82f0a66b286168b80a232c756d90d474b72077ec7970f88b985c05ce55a6864736f6c634300080e00330000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000def1c0ded9bec7f1a1670819833240f027b25eff0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000def171fe48cf0115b1d80b88dc8eab59176fee570000000000000000000000006352a56caadc4f1e25cd6c75970fa768a3304e6400000000000000000000000076f4eed9fe41262669d0250b2a97db79712ad855
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c80638da5cb5b11610097578063ec22430b11610066578063ec22430b14610256578063f2fde38b14610281578063fe8f3bb414610294578063ffaa9379146102a757600080fd5b80638da5cb5b146101eb578063cbe8bba814610209578063cc00f58014610220578063e2cb23821461024357600080fd5b806351d307af116100d357806351d307af1461018a578063554ff3ec1461019d5780636f93ea88146101b0578063715018a6146101e357600080fd5b80630a8a9f98146101055780630b27e58a1461011a5780630f5624b7146101645780632f6fa94e14610177575b600080fd5b610118610113366004612a61565b6102ce565b005b60045461013a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610118610172366004612af5565b6103de565b610118610185366004612be1565b61079b565b610118610198366004612c38565b610a74565b6101186101ab366004612ca4565b610c22565b6101d36101be366004612ca4565b60016020526000908152604090205460ff1681565b604051901515815260200161015b565b610118610caf565b60005473ffffffffffffffffffffffffffffffffffffffff1661013a565b61021261271081565b60405190815260200161015b565b6101d361022e366004612ca4565b60036020526000908152604090205460ff1681565b6101d3610251366004612cc1565b610d3c565b610212610264366004612de0565b805160208183018101805160028252928201919093012091525481565b61011861028f366004612ca4565b610d9f565b6101186102a2366004612e60565b610ecc565b61013a7f000000000000000000000000000000000000000000000000000000000000000081565b60005473ffffffffffffffffffffffffffffffffffffffff163314610354576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821660008181526001602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001685151590811790915591519182527f507bb1755646eddf30f01d29781b35b93c46fadda8b9d6a325e1c30b25514304910160405180910390a25050565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146104a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603f60248201527f416e626f746f4578656356323a3a736574746c65436f773a2043616c6c65722060448201527f6973206e6f7420436f5720736574746c656d656e7420636f6e74726163742e00606482015260840161034b565b60045473ffffffffffffffffffffffffffffffffffffffff16321461054a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603960248201527f416e626f746f4578656356323a3a736574746c65436f773a204f726967696e2060448201527f6973206e6f7420416e626f746f20436f5720736f6c7665722e00000000000000606482015260840161034b565b610556858484846116de565b60006105656020870187612ca4565b905060006105796060880160408901612ca4565b90508535602087013560006105956101008b0160e08c01612eec565b156105a7576105a48a846118e1565b90505b60006105ba6101008c0160e08d01612eec565b6105cb576105c88b846118e1565b90505b6105d58285612f38565b600289896040516105e7929190612f50565b908152602001604051809103902060008282546106049190612f38565b9091555061061590508b89896119eb565b6106328b6106238487612f38565b61062d8487612f60565b611aa4565b61067473ffffffffffffffffffffffffffffffffffffffff87168a7f000000000000000000000000000000000000000000000000000000000000000087611b4e565b6106b673ffffffffffffffffffffffffffffffffffffffff86167f00000000000000000000000000000000000000000000000000000000000000003086611b4e565b81156106de576106de73ffffffffffffffffffffffffffffffffffffffff87168a3085611b4e565b61070a896106ec8386612f60565b73ffffffffffffffffffffffffffffffffffffffff88169190611c2a565b878760405161071a929190612f50565b60405190819003902073ffffffffffffffffffffffffffffffffffffffff8a167f64012eb5dbb8623c87d95b6a75ccd51eec4c0385237d9dbe5843509e0601e8ae6107658588612f38565b866107708688612f38565b6040805193845260208401929092529082015260600160405180910390a35050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461081c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161034b565b73ffffffffffffffffffffffffffffffffffffffff81166108bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f416e626f746f4578656356323a3a636c61696d466565733a2043616e6e6f742060448201527f636c61696d20746f206e756c6c20616464726573732e00000000000000000000606482015260840161034b565b60005b82811015610a6e5760008484838181106108de576108de612f77565b90506020020160208101906108f39190612ca4565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff91909116906370a0823190602401602060405180830381865afa15801561095f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109839190612fa6565b90506109ce838287878681811061099c5761099c612f77565b90506020020160208101906109b19190612ca4565b73ffffffffffffffffffffffffffffffffffffffff169190611c2a565b8484838181106109e0576109e0612f77565b90506020020160208101906109f59190612ca4565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167ffe3464cd748424446c37877c28ce5b700222c5bc9f90d908afcc4e5cb22707ff83604051610a5391815260200190565b60405180910390a35080610a6681612fbf565b9150506108c2565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610af5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161034b565b828114610baa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f416e626f746f4578656356323a3a75706461746545786368616e6765416c6c6f60448201527f776c6973743a20506172616d65746572206c656e677468206d69736d6174636860648201527f2e00000000000000000000000000000000000000000000000000000000000000608482015260a40161034b565b60005b83811015610c1b57610c0b858583818110610bca57610bca612f77565b9050602002016020810190610bdf9190612ca4565b848484818110610bf157610bf1612f77565b9050602002016020810190610c069190612eec565b611c80565b610c1481612fbf565b9050610bad565b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610ca3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161034b565b610cac81611d0e565b50565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161034b565b610d3a6000611d7d565b565b600080610d50610d4b87611df2565b611ef1565b9050610d93858286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611f5a92505050565b9150505b949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161034b565b73ffffffffffffffffffffffffffffffffffffffff8116610ec3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161034b565b610cac81611d7d565b60005473ffffffffffffffffffffffffffffffffffffffff16331480610f0157503360009081526001602052604090205460ff165b610f8d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f416e626f746f4578656356323a3a657865637574654f726465723a2043616c6c60448201527f6572206973206e6f7420416e626f746f2e000000000000000000000000000000606482015260840161034b565b610f99858484846116de565b60036000610fad6040870160208801612ca4565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040016000205460ff16611063576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f416e626f746f4578656356323a3a657865637574654f726465723a205377617060448201527f20746172676574206e6f7420616c6c6f7765642e000000000000000000000000606482015260840161034b565b84608001353a11156110f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416e626f746f4578656356323a3a657865637574654f726465723a204761732060448201527f707269636520746f6f20686967682e0000000000000000000000000000000000606482015260840161034b565b6040840135600061110b6020880188612ca4565b9050600061111f6060890160408a01612ca4565b90508260028686604051611134929190612f50565b908152602001604051809103902060008282546111519190612f38565b9091555061116290508886866119eb565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa1580156111cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f39190612fa6565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8416906370a0823190602401602060405180830381865afa158015611263573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112879190612fa6565b90506112ab73ffffffffffffffffffffffffffffffffffffffff8516893088611b4e565b60006112be6101008c0160e08d01612eec565b156112d2576112cf8b87883a61214b565b90505b61130a6112e260208c018c612ca4565b6112ec8389612f60565b73ffffffffffffffffffffffffffffffffffffffff8816919061225a565b60008061131d60408d0160208e01612ca4565b73ffffffffffffffffffffffffffffffffffffffff1661134060608e018e612ff7565b60405161134e929190612f50565b6000604051808303816000865af19150503d806000811461138b576040519150601f19603f3d011682016040523d82523d6000602084013e611390565b606091505b5091509150816113d6576113a3816123dc565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034b91906130d2565b50506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201528190849073ffffffffffffffffffffffffffffffffffffffff8816906370a0823190602401602060405180830381865afa158015611446573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146a9190612fa6565b6114749190612f60565b61147e9190612f60565b6040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152909350829073ffffffffffffffffffffffffffffffffffffffff8616906370a0823190602401602060405180830381865afa1580156114ed573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115119190612fa6565b61151b9190612f60565b915082156115f457600061152f8288612f60565b61153985846130e5565b6115439190613122565b905060006115518286612f38565b905061155d8284612f60565b92506115698189612f60565b97508060028b8b60405161157e929190612f50565b9081526020016040518091039020600082825461159b9190612f60565b909155506115c2905073ffffffffffffffffffffffffffffffffffffffff88168c83611c2a565b6115f16115d260208e018e612ca4565b73ffffffffffffffffffffffffffffffffffffffff891690600061225a565b50505b60006116076101008d0160e08e01612eec565b61161a576116178c88853a61214b565b90505b60006116268285612f60565b90506116338d8983611aa4565b61165473ffffffffffffffffffffffffffffffffffffffff87168c83611c2a565b8989604051611664929190612f50565b60405190819003902073ffffffffffffffffffffffffffffffffffffffff8c167f09c6933d9f62d39850a62c05237e4d0261b66d1cc9090dd881405809525bfb6d8a846116b18789612f38565b6040805193845260208401929092529082015260600160405180910390a350505050505050505050505050565b836101000135421115611773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f416e626f746f4578656356323a3a76616c69646174654f726465723a204f726460448201527f657220646561646c696e65207061737365642e00000000000000000000000000606482015260840161034b565b6117836060850160408601612ca4565b73ffffffffffffffffffffffffffffffffffffffff166117a66020860186612ca4565b73ffffffffffffffffffffffffffffffffffffffff1603611849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f416e626f746f4578656356323a3a76616c69646174654f726465723a20496e7060448201527f757420616e64206f757470757420746f6b656e73206172652073616d652e0000606482015260840161034b565b61185584848484610d3c565b610a6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f416e626f746f4578656356323a3a76616c69646174654f726465723a20496e7660448201527f616c6964207369676e61747572652e0000000000000000000000000000000000606482015260840161034b565b60006127108360c0013510611978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f416e626f746f4578656356323a3a676574436f774665653a20466565206c617260448201527f676572207468616e206261736520616d6f756e742e0000000000000000000000606482015260840161034b565b60c0830135156119e557611993610100840160e08501612eec565b156119c7576119a860c0840135612710612f60565b6119b660c0850135846130e5565b6119c09190613122565b90506119e5565b6127106119d860c0850135846130e5565b6119e29190613122565b90505b92915050565b826020013560028383604051611a02929190612f50565b9081526020016040518091039020541115611a9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f416e626f746f4578656356323a3a636865636b4f72646572546f74616c3a204f60448201527f7264657220746f74616c2065786365656465642e000000000000000000000000606482015260840161034b565b505050565b611ab28260608501356130e5565b611ac06020850135836130e5565b1015611a9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f416e626f746f4578656356323a3a636865636b4f7574707574416d6f756e743a60448201527f204f757470757420616d6f756e7420746f6f206c6f772e000000000000000000606482015260840161034b565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052610a6e9085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612421565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611a9f9084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611ba8565b73ffffffffffffffffffffffffffffffffffffffff821660008181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527f627cd1344146c37272a586e0d2cce7d499f8d0c9d40756a50c8e45ef46a4e5bc910160405180910390a15050565b600480547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040517faa89234be0adbe6a6e50f84f07e9bda5649637085d7607fac10623be1e7971a090600090a250565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60007fd876f94781a73741f8387317185c571f9b611dad759d185f8dc40b92855cc994611e226020840184612ca4565b6020840135611e376060860160408701612ca4565b6060860135608087013560a088013560c0890135611e5c6101008b0160e08c01612eec565b60408051602081019a909a5273ffffffffffffffffffffffffffffffffffffffff988916908a0152606089019690965295909316608087015260a086019190915260c085015260e0840152610100838101929092521515610120838101919091529084013561014083015283013561016082015261018001604051602081830303815290604052805190602001209050919050565b60006119e5611efe61252d565b836040517f19010000000000000000000000000000000000000000000000000000000000006020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000611f698585612661565b90925090506000816004811115611f8257611f8261315d565b148015611fba57508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b15611fca57600192505050612144565b6000808773ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b8888604051602401611fff92919061318c565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161208891906131a5565b600060405180830381855afa9150503d80600081146120c3576040519150601f19603f3d011682016040523d82523d6000602084013e6120c8565b606091505b50915091508180156120db575080516020145b801561213d575080517f1626ba7e000000000000000000000000000000000000000000000000000000009061211990830160209081019084016131c1565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b9450505050505b9392505050565b600060a08501351561219957612169602086013560808701356130e5565b846121788460a08901356130e5565b61218291906130e5565b61218c9190613122565b6121969082612f38565b90505b60c0850135156121cb576127106121b460c0870135856130e5565b6121be9190613122565b6121c89082612f38565b90505b808311610d97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f416e626f746f4578656356323a3a63616c63756c6174654665653a204665652060448201527f6c6172676572207468616e206261736520616d6f756e742e0000000000000000606482015260840161034b565b8015806122fa57506040517fdd62ed3e00000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff838116602483015284169063dd62ed3e90604401602060405180830381865afa1580156122d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f89190612fa6565b155b612386576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606482015260840161034b565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052611a9f9084907f095ea7b30000000000000000000000000000000000000000000000000000000090606401611ba8565b6060604482511015612407576040518060600160405280603a8152602001613298603a913992915050565b600482019150818060200190518101906119e59190613203565b6000612483826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166126cf9092919063ffffffff16565b805190915015611a9f57808060200190518101906124a1919061327a565b611a9f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161034b565b60003073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000eb401fab7f573ea207c6980e4341d5bbdb0d9eb81614801561259357507f000000000000000000000000000000000000000000000000000000000000000146145b156125bd57507feb383475c1ea7f3cf44ab708f086da6b7a074ea1148c60152bce08da2968bff990565b50604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6020808301919091527fbc4044ff66c75c5a96a4d8da93941184a621cc3890933798b20e44e1ddcd7dd2828401527fad7c5bef027816a800da1736444fb58a807ef4c9603b7848673f7e3a68eb14a560608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b60008082516041036126975760208301516040840151606085015160001a61268b878285856126de565b945094505050506126c8565b82516040036126c057602083015160408401516126b58683836127f6565b9350935050506126c8565b506000905060025b9250929050565b6060610d978484600085612848565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561271557506000905060036127ed565b8460ff16601b1415801561272d57508460ff16601c14155b1561273e57506000905060046127ed565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612792573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166127e6576000600192509250506127ed565b9150600090505b94509492505050565b6000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83168161282c60ff86901c601b612f38565b905061283a878288856126de565b935093505050935093915050565b6060824710156128da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161034b565b73ffffffffffffffffffffffffffffffffffffffff85163b612958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161034b565b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161298191906131a5565b60006040518083038185875af1925050503d80600081146129be576040519150601f19603f3d011682016040523d82523d6000602084013e6129c3565b606091505b50915091506129d38282866129de565b979650505050505050565b606083156129ed575081612144565b8251156129fd5782518084602001fd5b816040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034b91906130d2565b73ffffffffffffffffffffffffffffffffffffffff81168114610cac57600080fd5b8015158114610cac57600080fd5b60008060408385031215612a7457600080fd5b8235612a7f81612a31565b91506020830135612a8f81612a53565b809150509250929050565b60006101408284031215612aad57600080fd5b50919050565b60008083601f840112612ac557600080fd5b50813567ffffffffffffffff811115612add57600080fd5b6020830191508360208285010111156126c857600080fd5b60008060008060008587036101c0811215612b0f57600080fd5b612b198888612a9a565b955060407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec082011215612b4b57600080fd5b5061014086019350610180860135612b6281612a31565b92506101a086013567ffffffffffffffff811115612b7f57600080fd5b612b8b88828901612ab3565b969995985093965092949392505050565b60008083601f840112612bae57600080fd5b50813567ffffffffffffffff811115612bc657600080fd5b6020830191508360208260051b85010111156126c857600080fd5b600080600060408486031215612bf657600080fd5b833567ffffffffffffffff811115612c0d57600080fd5b612c1986828701612b9c565b9094509250506020840135612c2d81612a31565b809150509250925092565b60008060008060408587031215612c4e57600080fd5b843567ffffffffffffffff80821115612c6657600080fd5b612c7288838901612b9c565b90965094506020870135915080821115612c8b57600080fd5b50612c9887828801612b9c565b95989497509550505050565b600060208284031215612cb657600080fd5b813561214481612a31565b6000806000806101808587031215612cd857600080fd5b612ce28686612a9a565b9350610140850135612cf381612a31565b925061016085013567ffffffffffffffff811115612d1057600080fd5b612c9887828801612ab3565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612d9257612d92612d1c565b604052919050565b600067ffffffffffffffff821115612db457612db4612d1c565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b600060208284031215612df257600080fd5b813567ffffffffffffffff811115612e0957600080fd5b8201601f81018413612e1a57600080fd5b8035612e2d612e2882612d9a565b612d4b565b818152856020838501011115612e4257600080fd5b81602084016020830137600091810160200191909152949350505050565b60008060008060006101a08688031215612e7957600080fd5b612e838787612a9a565b945061014086013567ffffffffffffffff80821115612ea157600080fd5b908701906080828a031215612eb557600080fd5b90945061016087013590612ec882612a31565b9093506101808701359080821115612edf57600080fd5b50612b8b88828901612ab3565b600060208284031215612efe57600080fd5b813561214481612a53565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612f4b57612f4b612f09565b500190565b8183823760009101908152919050565b600082821015612f7257612f72612f09565b500390565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060208284031215612fb857600080fd5b5051919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612ff057612ff0612f09565b5060010190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261302c57600080fd5b83018035915067ffffffffffffffff82111561304757600080fd5b6020019150368190038213156126c857600080fd5b60005b8381101561307757818101518382015260200161305f565b83811115610a6e5750506000910152565b600081518084526130a081602086016020860161305c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6020815260006119e26020830184613088565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561311d5761311d612f09565b500290565b600082613158577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b828152604060208201526000610d976040830184613088565b600082516131b781846020870161305c565b9190910192915050565b6000602082840312156131d357600080fd5b81517fffffffff000000000000000000000000000000000000000000000000000000008116811461214457600080fd5b60006020828403121561321557600080fd5b815167ffffffffffffffff81111561322c57600080fd5b8201601f8101841361323d57600080fd5b805161324b612e2882612d9a565b81815285602083850101111561326057600080fd5b61327182602083016020860161305c565b95945050505050565b60006020828403121561328c57600080fd5b815161214481612a5356fe416e626f746f4578656356323a3a6765745265766572744d73673a205472616e73616374696f6e2072657665727465642073696c656e746c792ea26469706673582212200fc82f0a66b286168b80a232c756d90d474b72077ec7970f88b985c05ce55a6864736f6c634300080e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000def1c0ded9bec7f1a1670819833240f027b25eff0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582000000000000000000000000def171fe48cf0115b1d80b88dc8eab59176fee570000000000000000000000006352a56caadc4f1e25cd6c75970fa768a3304e6400000000000000000000000076f4eed9fe41262669d0250b2a97db79712ad855
-----Decoded View---------------
Arg [0] : _allowedExchanges (address[]): 0xDef1C0ded9bec7F1a1670819833240f027b25EfF,0x1111111254EEB25477B68fb85Ed929f73A960582,0xDEF171Fe48CF0115B1d80b88dc8eAB59176FEe57,0x6352a56caadC4F1E25CD6c75970Fa768A3304e64,0x76f4eeD9fE41262669D0250b2A97db79712aD855
Arg [1] : _cowSettlementContract (address): 0x0000000000000000000000000000000000000000
Arg [2] : _anbotoCowSolver (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [4] : 000000000000000000000000def1c0ded9bec7f1a1670819833240f027b25eff
Arg [5] : 0000000000000000000000001111111254eeb25477b68fb85ed929f73a960582
Arg [6] : 000000000000000000000000def171fe48cf0115b1d80b88dc8eab59176fee57
Arg [7] : 0000000000000000000000006352a56caadc4f1e25cd6c75970fa768a3304e64
Arg [8] : 00000000000000000000000076f4eed9fe41262669d0250b2a97db79712ad855
Deployed Bytecode Sourcemap
2511:22521:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7344:147;;;;;;:::i;:::-;;:::i;:::-;;6143:30;;;;;;;;;;;;859:42:17;847:55;;;829:74;;817:2;802:18;6143:30:12;;;;;;;;15188:2238;;;;;;:::i;:::-;;:::i;17742:501::-;;;;;;:::i;:::-;;:::i;7497:420::-;;;;;;:::i;:::-;;:::i;8301:127::-;;;;;;:::i;:::-;;:::i;5653:40::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4505:14:17;;4498:22;4480:41;;4468:2;4453:18;5653:40:12;4340:187:17;1668:101:0;;;:::i;1036:85::-;1082:7;1108:6;;;1036:85;;5149:45:12;;5188:6;5149:45;;;;;4678:25:17;;;4666:2;4651:18;5149:45:12;4532:177:17;5907:49:12;;;;;;:::i;:::-;;;;;;;;;;;;;;;;18720:289;;;;;;:::i;:::-;;:::i;5767:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1918:198:0;;;;;;:::i;:::-;;:::i;9961:4123:12:-;;;;;;:::i;:::-;;:::i;6033:46::-;;;;;7344:147;1082:7:0;1108:6;1248:23;1108:6;719:10:7;1248:23:0;1240:68;;;;;;;8003:2:17;1240:68:0;;;7985:21:17;;;8022:18;;;8015:30;8081:34;8061:18;;;8054:62;8133:18;;1240:68:0;;;;;;;;;7420:17:12::1;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;;;;:24;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;7460;;4480:41:17;;;7460:24:12::1;::::0;4453:18:17;7460:24:12::1;;;;;;;7344:147:::0;;:::o;15188:2238::-;15408:10;:35;15422:21;15408:35;;15387:145;;;;;;;8364:2:17;15387:145:12;;;8346:21:17;8403:2;8383:18;;;8376:30;8442:34;8422:18;;;8415:62;8513:33;8493:18;;;8486:61;8564:19;;15387:145:12;8162:427:17;15387:145:12;15633:15;;;;15620:9;:28;15542:189;;;;;;;8796:2:17;15542:189:12;;;8778:21:17;8835:2;8815:18;;;8808:30;8874:34;8854:18;;;8847:62;8945:27;8925:18;;;8918:55;8990:19;;15542:189:12;8594:421:17;15542:189:12;15741:35;15755:6;15763;15771:4;;15741:13;:35::i;:::-;15814:17;15834;;;;:6;:17;:::i;:::-;15814:37;-1:-1:-1;15861:18:12;15882;;;;;;;;:::i;:::-;15861:39;-1:-1:-1;15931:22:12;;15983:21;;;;15910:18;16083:24;;;;;;;;:::i;:::-;16079:148;;;16187:29;16197:6;16205:10;16187:9;:29::i;:::-;16165:51;;16079:148;16236:28;16279:24;;;;;;;;:::i;:::-;16274:150;;16385:28;16395:6;16403:9;16385;:28::i;:::-;16362:51;;16274:150;16513:32;16526:19;16513:10;:32;:::i;:::-;16483:20;16504:4;;16483:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;:62;;;;;;;:::i;:::-;;;;-1:-1:-1;16555:29:12;;-1:-1:-1;16571:6:12;16579:4;;16555:15;:29::i;:::-;16594:139;16625:6;16645:32;16658:19;16645:10;:32;:::i;:::-;16691;16703:20;16691:9;:32;:::i;:::-;16594:17;:139::i;:::-;16769:70;:27;;;16797:6;16805:21;16828:10;16769:27;:70::i;:::-;16849:77;:28;;;16878:21;16909:4;16916:9;16849:28;:77::i;:::-;16962:23;;16958:125;;17001:71;:27;;;17029:6;17045:4;17052:19;17001:27;:71::i;:::-;17154:66;17179:6;17187:32;17199:20;17187:9;:32;:::i;:::-;17154:24;;;;:66;:24;:66::i;:::-;17280:4;;17236:183;;;;;;;:::i;:::-;;;;;;;;;;;;;17298:32;17311:19;17298:10;:32;:::i;:::-;17344:9;17367:42;17389:20;17367:19;:42;:::i;:::-;17236:183;;;10462:25:17;;;10518:2;10503:18;;10496:34;;;;10546:18;;;10539:34;10450:2;10435:18;17236:183:12;;;;;;;15347:2079;;;;;;15188:2238;;;;;:::o;17742:501::-;1082:7:0;1108:6;1248:23;1108:6;719:10:7;1248:23:0;1240:68;;;;;;;8003:2:17;1240:68:0;;;7985:21:17;;;8022:18;;;8015:30;8081:34;8061:18;;;8054:62;8133:18;;1240:68:0;7801:356:17;1240:68:0;17856:22:12::1;::::0;::::1;17835:123;;;::::0;::::1;::::0;;10786:2:17;17835:123:12::1;::::0;::::1;10768:21:17::0;10825:2;10805:18;;;10798:30;10864:34;10844:18;;;10837:62;10935:24;10915:18;;;10908:52;10977:19;;17835:123:12::1;10584:418:17::0;17835:123:12::1;17974:9;17969:268;17989:18:::0;;::::1;17969:268;;;18028:21;18052:7;;18060:1;18052:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:35;::::0;;;;18081:4:::1;18052:35;::::0;::::1;829:74:17::0;18052:20:12::1;::::0;;;::::1;::::0;::::1;::::0;802:18:17;;18052:35:12::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18028:59;;18101:48;18125:8;18135:13;18101:7;;18109:1;18101:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:23;;::::0;:48;:23:::1;:48::i;:::-;18199:7;;18207:1;18199:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;18169:57;;18181:8;18169:57;;;18212:13;18169:57;;;;4678:25:17::0;;4666:2;4651:18;;4532:177;18169:57:12::1;;;;;;;;-1:-1:-1::0;18009:3:12;::::1;::::0;::::1;:::i;:::-;;;;17969:268;;;;17742:501:::0;;;:::o;7497:420::-;1082:7:0;1108:6;1248:23;1108:6;719:10:7;1248:23:0;1240:68;;;;;;;8003:2:17;1240:68:0;;;7985:21:17;;;8022:18;;;8015:30;8081:34;8061:18;;;8054:62;8133:18;;1240:68:0;7801:356:17;1240:68:0;7657:34:12;;::::1;7636:146;;;::::0;::::1;::::0;;11787:2:17;7636:146:12::1;::::0;::::1;11769:21:17::0;11826:2;11806:18;;;11799:30;11865:34;11845:18;;;11838:62;11936:34;11916:18;;;11909:62;12008:3;11987:19;;;11980:32;12029:19;;7636:146:12::1;11585:469:17::0;7636:146:12::1;7798:9;7793:118;7809:20:::0;;::::1;7793:118;;;7850:50;7875:9;;7885:1;7875:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;7889:7;;7897:1;7889:10;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;7850:24;:50::i;:::-;7831:3;::::0;::::1;:::i;:::-;;;7793:118;;;;7497:420:::0;;;;:::o;8301:127::-;1082:7:0;1108:6;1248:23;1108:6;719:10:7;1248:23:0;1240:68;;;;;;;8003:2:17;1240:68:0;;;7985:21:17;;;8022:18;;;8015:30;8081:34;8061:18;;;8054:62;8133:18;;1240:68:0;7801:356:17;1240:68:0;8384:37:12::1;8404:16;8384:19;:37::i;:::-;8301:127:::0;:::o;1668:101:0:-;1082:7;1108:6;1248:23;1108:6;719:10:7;1248:23:0;1240:68;;;;;;;8003:2:17;1240:68:0;;;7985:21:17;;;8022:18;;;8015:30;8081:34;8061:18;;;8054:62;8133:18;;1240:68:0;7801:356:17;1240:68:0;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;18720:289:12:-;18858:4;18874:14;18891:35;18908:17;18918:6;18908:9;:17::i;:::-;18891:16;:35::i;:::-;18874:52;;18943:59;18980:7;18989:6;18997:4;;18943:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18943:36:12;;-1:-1:-1;;;18943:59:12:i;:::-;18936:66;;;18720:289;;;;;;;:::o;1918:198:0:-;1082:7;1108:6;1248:23;1108:6;719:10:7;1248:23:0;1240:68;;;;;;;8003:2:17;1240:68:0;;;7985:21:17;;;8022:18;;;8015:30;8081:34;8061:18;;;8054:62;8133:18;;1240:68:0;7801:356:17;1240:68:0;2006:22:::1;::::0;::::1;1998:73;;;::::0;::::1;::::0;;12261:2:17;1998:73:0::1;::::0;::::1;12243:21:17::0;12300:2;12280:18;;;12273:30;12339:34;12319:18;;;12312:62;12410:8;12390:18;;;12383:36;12436:19;;1998:73:0::1;12059:402:17::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;9961:4123:12:-:0;1082:7:0;1108:6;;;10174:10:12;:21;;:45;;-1:-1:-1;10208:10:12;10199:20;;;;:8;:20;;;;;;;;10174:45;10153:141;;;;;;;12668:2:17;10153:141:12;;;12650:21:17;12707:2;12687:18;;;12680:30;12746:34;12726:18;;;12719:62;12817:19;12797:18;;;12790:47;12854:19;;10153:141:12;12466:413:17;10153:141:12;10304:35;10318:6;10326;10334:4;;10304:13;:35::i;:::-;10370:17;:36;10388:17;;;;;;;;:::i;:::-;10370:36;;;;;;;;;;;;;-1:-1:-1;10370:36:12;;;;10349:135;;;;;;;13086:2:17;10349:135:12;;;13068:21:17;13125:2;13105:18;;;13098:30;13164:34;13144:18;;;13137:62;13235:22;13215:18;;;13208:50;13275:19;;10349:135:12;12884:416:17;10349:135:12;10530:6;:18;;;10515:11;:33;;10494:127;;;;;;;13507:2:17;10494:127:12;;;13489:21:17;13546:2;13526:18;;;13519:30;13585:34;13565:18;;;13558:62;13656:17;13636:18;;;13629:45;13691:19;;10494:127:12;13305:411:17;10494:127:12;10686:17;;;;10659:24;10733:17;;;;:6;:17;:::i;:::-;10713:37;-1:-1:-1;10760:18:12;10781;;;;;;;;:::i;:::-;10760:39;;10908:16;10878:20;10899:4;;10878:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;:46;;;;;;;:::i;:::-;;;;-1:-1:-1;10934:29:12;;-1:-1:-1;10950:6:12;10958:4;;10934:15;:29::i;:::-;11045:35;;;;;11074:4;11045:35;;;829:74:17;11018:24:12;;11045:20;;;;;;802:18:17;;11045:35:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11118:36;;;;;11148:4;11118:36;;;829:74:17;11018:62:12;;-1:-1:-1;11090:25:12;;11118:21;;;;;;802:18:17;;11118:36:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11090:64;-1:-1:-1;11199:68:12;:27;;;11227:6;11243:4;11250:16;11199:27;:68::i;:::-;11278:27;11319:24;;;;;;;;:::i;:::-;11315:260;;;11423:141;11447:6;11471:16;11505;11539:11;11423:6;:141::i;:::-;11401:163;;11315:260;11614:78;11637:14;;;;:6;:14;:::i;:::-;11653:38;11672:19;11653:16;:38;:::i;:::-;11614:22;;;;:78;:22;:78::i;:::-;11780:12;;11815:17;;;;;;;;:::i;:::-;:22;;11855:19;;;;:6;:19;:::i;:::-;11815:73;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11779:109;;;;11907:7;11902:40;;11923:18;11936:4;11923:12;:18::i;:::-;11916:26;;;;;;;;;;;:::i;11902:40::-;-1:-1:-1;;12123:35:12;;;;;12152:4;12123:35;;;829:74:17;12204:19:12;;12173:16;;12123:20;;;;;;802:18:17;;12123:35:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;;;:::i;:::-;:100;;;;:::i;:::-;12327:36;;;;;12357:4;12327:36;;;829:74:17;12092:131:12;;-1:-1:-1;12366:17:12;;12327:21;;;;;;802:18:17;;12327:36:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;;:::i;:::-;12307:76;-1:-1:-1;12442:20:12;;12438:755;;12518:21;12602:38;12621:19;12602:16;:38;:::i;:::-;12543;12565:16;12543:19;:38;:::i;:::-;12542:99;;;;:::i;:::-;12518:123;-1:-1:-1;12655:33:12;12691:32;12518:123;12691:16;:32;:::i;:::-;12655:68;-1:-1:-1;12738:36:12;12761:13;12738:36;;:::i;:::-;;-1:-1:-1;12826:45:12;12846:25;12826:45;;:::i;:::-;;;12956:25;12926:20;12947:4;;12926:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;:55;;;;;;;:::i;:::-;;;;-1:-1:-1;13034:58:12;;-1:-1:-1;13034:23:12;;;13058:6;13066:25;13034:23;:58::i;:::-;13141:41;13164:14;;;;:6;:14;:::i;:::-;13141:22;;;;13180:1;13141:22;:41::i;:::-;12464:729;;12438:755;13203:28;13246:24;;;;;;;;:::i;:::-;13241:264;;13352:142;13376:6;13400:16;13434:17;13469:11;13352:6;:142::i;:::-;13329:165;;13241:264;13515:34;13552:40;13572:20;13552:17;:40;:::i;:::-;13515:77;;13671:71;13689:6;13697:16;13715:26;13671:17;:71::i;:::-;13814:60;:24;;;13839:6;13847:26;13814:24;:60::i;:::-;13937:4;;13890:187;;;;;;;:::i;:::-;;;;;;;;;;;;;13955:16;13985:26;14025:42;14047:20;14025:19;:42;:::i;:::-;13890:187;;;10462:25:17;;;10518:2;10503:18;;10496:34;;;;10546:18;;;10539:34;10450:2;10435:18;13890:187:12;;;;;;;10113:3971;;;;;;;;9961:4123;;;;;:::o;23448:605::-;23624:6;:15;;;23605;:34;;23584:132;;;;;;;15830:2:17;23584:132:12;;;15812:21:17;15869:2;15849:18;;;15842:30;15908:34;15888:18;;;15881:62;15979:21;15959:18;;;15952:49;16018:19;;23584:132:12;15628:415:17;23584:132:12;23768:18;;;;;;;;:::i;:::-;23747:39;;:17;;;;:6;:17;:::i;:::-;:39;;;23726:148;;;;;;;16250:2:17;23726:148:12;;;16232:21:17;16289:2;16269:18;;;16262:30;16328:34;16308:18;;;16301:62;16399:32;16379:18;;;16372:60;16449:19;;23726:148:12;16048:426:17;23726:148:12;23935:38;23952:6;23960;23968:4;;23935:16;:38::i;:::-;23914:132;;;;;;;16681:2:17;23914:132:12;;;16663:21:17;16720:2;16700:18;;;16693:30;16759:34;16739:18;;;16732:62;16830:17;16810:18;;;16803:45;16865:19;;23914:132:12;16479:411:17;22396:626:12;22505:17;5188:6;22559;:17;;;:32;22538:132;;;;;;;17097:2:17;22538:132:12;;;17079:21:17;17136:2;17116:18;;;17109:30;17175:34;17155:18;;;17148:62;17246:23;17226:18;;;17219:51;17287:19;;22538:132:12;16895:417:17;22538:132:12;22685:17;;;;:21;22681:335;;22726:24;;;;;;;;:::i;:::-;22722:284;;;22859:32;22874:17;;;;5188:6;22859:32;:::i;:::-;22803:31;22817:17;;;;22803:11;:31;:::i;:::-;22802:90;;;;:::i;:::-;22770:122;;22722:284;;;5188:6;22944:31;22958:17;;;;22944:11;:31;:::i;:::-;22943:48;;;;:::i;:::-;22931:60;;22722:284;22396:626;;;;:::o;24225:246::-;24368:6;:18;;;24338:20;24359:4;;24338:26;;;;;;;:::i;:::-;;;;;;;;;;;;;;:48;;24317:147;;;;;;;17519:2:17;24317:147:12;;;17501:21:17;17558:2;17538:18;;;17531:30;17597:34;17577:18;;;17570:62;17668:22;17648:18;;;17641:50;17708:19;;24317:147:12;17317:416:17;24317:147:12;24225:246;;;:::o;24709:321::-;24915:27;24931:11;24915:13;;;;:27;:::i;:::-;24877:34;24893:18;;;;24877:13;:34;:::i;:::-;:65;;24856:167;;;;;;;17940:2:17;24856:167:12;;;17922:21:17;17979:2;17959:18;;;17952:30;18018:34;17998:18;;;17991:62;18089:25;18069:18;;;18062:53;18132:19;;24856:167:12;17738:419:17;912:241:5;1077:68;;18374:42:17;18443:15;;;1077:68:5;;;18425:34:17;18495:15;;18475:18;;;18468:43;18527:18;;;18520:34;;;1050:96:5;;1070:5;;1100:27;;18337:18:17;;1077:68:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1050:19;:96::i;701:205::-;840:58;;18769:42:17;18757:55;;840:58:5;;;18739:74:17;18829:18;;;18822:34;;;813:86:5;;833:5;;863:23;;18712:18:17;;840:58:5;18565:297:17;7923:187:12;8007:27;;;;;;;:17;:27;;;;;;;;;:37;;;;;;;;;;;;;8060:43;;19035:74:17;;;19125:18;;;19118:50;8060:43:12;;19008:18:17;8060:43:12;;;;;;;7923:187;;:::o;8553:166::-;8626:15;:34;;;;;;;;;;;;;8676:36;;;;-1:-1:-1;;8676:36:12;8553:166;:::o;2270:187:0:-;2343:16;2362:6;;;2378:17;;;;;;;;;;2410:40;;2362:6;;;;;;;2410:40;;2343:16;2410:40;2333:124;2270:187;:::o;19221:606:12:-;19285:7;5304:230;19418:17;;;;:6;:17;:::i;:::-;19457:18;;;;19497;;;;;;;;:::i;:::-;19537:13;;;;19572:18;;;;19612:21;;;;19655:17;;;;19694:24;;;;;;;;:::i;:::-;19350:456;;;;;;19629:25:17;;;;19673:42;19751:15;;;19731:18;;;19724:43;19783:18;;;19776:34;;;;19846:15;;;;19826:18;;;19819:43;19878:19;;;19871:35;;;;19922:19;;;19915:35;19966:19;;;19959:35;19740:15:12;20010:19:17;;;20003:35;;;;20082:14;20075:22;19777:11:12;20054:19:17;;;20047:51;;;;19740:15:12;;;;20114:19:17;;;20107:35;19777:11:12;;;20158:19:17;;;20151:36;19601:19;;19350:456:12;;;;;;;;;;;;19323:497;;;;;;19304:516;;19221:606;;;:::o;4339:165:11:-;4416:7;4442:55;4464:20;:18;:20::i;:::-;4486:10;9226:57:9;;24052:66:17;9226:57:9;;;24040:79:17;24135:11;;;24128:27;;;24171:12;;;24164:28;;;9190:7:9;;24208:12:17;;9226:57:9;;;;;;;;;;;;9216:68;;;;;;9209:75;;9097:194;;;;;1039:633:10;1175:4;1192:17;1211:24;1239:33;1256:4;1262:9;1239:16;:33::i;:::-;1191:81;;-1:-1:-1;1191:81:10;-1:-1:-1;1295:26:10;1286:5;:35;;;;;;;;:::i;:::-;;:58;;;;;1338:6;1325:19;;:9;:19;;;1286:58;1282:100;;;1367:4;1360:11;;;;;;1282:100;1393:12;1407:19;1430:6;:17;;1484:34;;;1520:4;1526:9;1461:75;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1430:116;;;;1461:75;1430:116;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1392:154;;;;1564:7;:30;;;;;1575:6;:13;1592:2;1575:19;1564:30;:100;;;;-1:-1:-1;1598:28:10;;1630:34;;1598:28;;;;;;;;;;;;:::i;:::-;:66;;;1564:100;1556:109;;;;;;1039:633;;;;;;:::o;20960:1213:12:-;21121:17;21154:21;;;;:25;21150:631;;21730:39;21751:18;;;;21730;;;;:39;:::i;:::-;21697:12;21661:33;21685:9;21661:21;;;;:33;:::i;:::-;:48;;;;:::i;:::-;21660:110;;;;:::i;:::-;21631:139;;;;:::i;:::-;;;21150:631;21794:17;;;;:21;21790:186;;5188:6;21918:31;21932:17;;;;21918:11;:31;:::i;:::-;21917:48;;;;:::i;:::-;21904:61;;;;:::i;:::-;;;21790:186;22075:9;22061:11;:23;22040:126;;;;;;;21503:2:17;22040:126:12;;;21485:21:17;21542:2;21522:18;;;21515:30;21581:34;21561:18;;;21554:62;21652:26;21632:18;;;21625:54;21696:19;;22040:126:12;21301:420:17;1413:603:5;1768:10;;;1767:62;;-1:-1:-1;1784:39:5;;;;;1808:4;1784:39;;;21961:34:17;1784:15:5;22031::17;;;22011:18;;;22004:43;1784:15:5;;;;;21873:18:17;;1784:39:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;1767:62;1746:163;;;;;;;22260:2:17;1746:163:5;;;22242:21:17;22299:2;22279:18;;;22272:30;22338:34;22318:18;;;22311:62;22409:24;22389:18;;;22382:52;22451:19;;1746:163:5;22058:418:17;1746:163:5;1946:62;;18769:42:17;18757:55;;1946:62:5;;;18739:74:17;18829:18;;;18822:34;;;1919:90:5;;1939:5;;1969:22;;18712:18:17;;1946:62:5;18565:297:17;20060:583:12;20130:13;20291:2;20270:11;:18;:23;20266:108;;;20307:67;;;;;;;;;;;;;;;;;;20060:583;-1:-1:-1;;20060:583:12:o;20266:108::-;20530:4;20517:11;20513:22;20498:37;;20573:11;20562:33;;;;;;;;;;;;:::i;3207:706:5:-;3626:23;3652:69;3680:4;3652:69;;;;;;;;;;;;;;;;;3660:5;3652:27;;;;:69;;;;;:::i;:::-;3735:17;;3626:95;;-1:-1:-1;3735:21:5;3731:176;;3830:10;3819:30;;;;;;;;;;;;:::i;:::-;3811:85;;;;;;;23573:2:17;3811:85:5;;;23555:21:17;23612:2;23592:18;;;23585:30;23651:34;23631:18;;;23624:62;23722:12;23702:18;;;23695:40;23752:19;;3811:85:5;23371:406:17;3143:308:11;3196:7;3227:4;3219:29;3236:12;3219:29;;:66;;;;;3269:16;3252:13;:33;3219:66;3215:230;;;-1:-1:-1;3308:24:11;;3143:308::o;3215:230::-;-1:-1:-1;3633:73:11;;;3392:10;3633:73;;;;24490:25:17;;;;3404:12:11;24531:18:17;;;24524:34;3418:15:11;24574:18:17;;;24567:34;3677:13:11;24617:18:17;;;24610:34;3700:4:11;24660:19:17;;;;24653:84;;;;3633:73:11;;;;;;;;;;24462:19:17;;;;3633:73:11;;;3623:84;;;;;;3143:308::o;2243:1279:9:-;2324:7;2333:12;2554:9;:16;2574:2;2554:22;2550:966;;2843:4;2828:20;;2822:27;2892:4;2877:20;;2871:27;2949:4;2934:20;;2928:27;2592:9;2920:36;2990:25;3001:4;2920:36;2822:27;2871;2990:10;:25::i;:::-;2983:32;;;;;;;;;2550:966;3036:9;:16;3056:2;3036:22;3032:484;;3305:4;3290:20;;3284:27;3355:4;3340:20;;3334:27;3395:23;3406:4;3284:27;3334;3395:10;:23::i;:::-;3388:30;;;;;;;;3032:484;-1:-1:-1;3465:1:9;;-1:-1:-1;3469:35:9;3032:484;2243:1279;;;;;:::o;3861:223:6:-;3994:12;4025:52;4047:6;4055:4;4061:1;4064:12;4025:21;:52::i;5716:1603:9:-;5842:7;;6766:66;6753:79;;6749:161;;;-1:-1:-1;6864:1:9;;-1:-1:-1;6868:30:9;6848:51;;6749:161;6923:1;:7;;6928:2;6923:7;;:18;;;;;6934:1;:7;;6939:2;6934:7;;6923:18;6919:100;;;-1:-1:-1;6973:1:9;;-1:-1:-1;6977:30:9;6957:51;;6919:100;7130:24;;;7113:14;7130:24;;;;;;;;;24975:25:17;;;25048:4;25036:17;;25016:18;;;25009:45;;;;25070:18;;;25063:34;;;25113:18;;;25106:34;;;7130:24:9;;24947:19:17;;7130:24:9;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7130:24:9;;;;;;-1:-1:-1;;7168:20:9;;;7164:101;;7220:1;7224:29;7204:50;;;;;;;7164:101;7283:6;-1:-1:-1;7291:20:9;;-1:-1:-1;5716:1603:9;;;;;;;;:::o;4789:336::-;4899:7;;4957:66;4944:80;;4899:7;5050:25;5066:3;5051:18;;;5073:2;5050:25;:::i;:::-;5034:42;;5093:25;5104:4;5110:1;5113;5116;5093:10;:25::i;:::-;5086:32;;;;;;4789:336;;;;;;:::o;4948:499:6:-;5113:12;5170:5;5145:21;:30;;5137:81;;;;;;;25353:2:17;5137:81:6;;;25335:21:17;25392:2;25372:18;;;25365:30;25431:34;25411:18;;;25404:62;25502:8;25482:18;;;25475:36;25528:19;;5137:81:6;25151:402:17;5137:81:6;1465:19;;;;5228:60;;;;;;;25760:2:17;5228:60:6;;;25742:21:17;25799:2;25779:18;;;25772:30;25838:31;25818:18;;;25811:59;25887:18;;5228:60:6;25558:353:17;5228:60:6;5300:12;5314:23;5341:6;:11;;5360:5;5367:4;5341:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5299:73;;;;5389:51;5406:7;5415:10;5427:12;5389:16;:51::i;:::-;5382:58;4948:499;-1:-1:-1;;;;;;;4948:499:6:o;7561:692::-;7707:12;7735:7;7731:516;;;-1:-1:-1;7765:10:6;7758:17;;7731:516;7876:17;;:21;7872:365;;8070:10;8064:17;8130:15;8117:10;8113:2;8109:19;8102:44;7872:365;8209:12;8202:20;;;;;;;;;;;:::i;14:154:17:-;100:42;93:5;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:118;259:5;252:13;245:21;238:5;235:32;225:60;;281:1;278;271:12;296:382;361:6;369;422:2;410:9;401:7;397:23;393:32;390:52;;;438:1;435;428:12;390:52;477:9;464:23;496:31;521:5;496:31;:::i;:::-;546:5;-1:-1:-1;603:2:17;588:18;;575:32;616:30;575:32;616:30;:::i;:::-;665:7;655:17;;;296:382;;;;;:::o;914:154::-;972:5;1017:3;1008:6;1003:3;999:16;995:26;992:46;;;1034:1;1031;1024:12;992:46;-1:-1:-1;1056:6:17;914:154;-1:-1:-1;914:154:17:o;1073:347::-;1124:8;1134:6;1188:3;1181:4;1173:6;1169:17;1165:27;1155:55;;1206:1;1203;1196:12;1155:55;-1:-1:-1;1229:20:17;;1272:18;1261:30;;1258:50;;;1304:1;1301;1294:12;1258:50;1341:4;1333:6;1329:17;1317:29;;1393:3;1386:4;1377:6;1369;1365:19;1361:30;1358:39;1355:59;;;1410:1;1407;1400:12;1425:888;1577:6;1585;1593;1601;1609;1653:9;1644:7;1640:23;1683:3;1679:2;1675:12;1672:32;;;1700:1;1697;1690:12;1672:32;1723:52;1767:7;1756:9;1723:52;:::i;:::-;1713:62;;1868:2;1799:66;1795:2;1791:75;1787:84;1784:104;;;1884:1;1881;1874:12;1784:104;;1922:3;1911:9;1907:19;1897:29;;1976:3;1965:9;1961:19;1948:33;1990:31;2015:5;1990:31;:::i;:::-;2040:5;-1:-1:-1;2096:3:17;2081:19;;2068:33;2124:18;2113:30;;2110:50;;;2156:1;2153;2146:12;2110:50;2195:58;2245:7;2236:6;2225:9;2221:22;2195:58;:::i;:::-;1425:888;;;;-1:-1:-1;1425:888:17;;-1:-1:-1;2272:8:17;;2169:84;1425:888;-1:-1:-1;;;1425:888:17:o;2318:375::-;2389:8;2399:6;2453:3;2446:4;2438:6;2434:17;2430:27;2420:55;;2471:1;2468;2461:12;2420:55;-1:-1:-1;2494:20:17;;2537:18;2526:30;;2523:50;;;2569:1;2566;2559:12;2523:50;2606:4;2598:6;2594:17;2582:29;;2666:3;2659:4;2649:6;2646:1;2642:14;2634:6;2630:27;2626:38;2623:47;2620:67;;;2683:1;2680;2673:12;2698:594;2807:6;2815;2823;2876:2;2864:9;2855:7;2851:23;2847:32;2844:52;;;2892:1;2889;2882:12;2844:52;2932:9;2919:23;2965:18;2957:6;2954:30;2951:50;;;2997:1;2994;2987:12;2951:50;3036:78;3106:7;3097:6;3086:9;3082:22;3036:78;:::i;:::-;3133:8;;-1:-1:-1;3010:104:17;-1:-1:-1;;3218:2:17;3203:18;;3190:32;3231:31;3190:32;3231:31;:::i;:::-;3281:5;3271:15;;;2698:594;;;;;:::o;3297:786::-;3416:6;3424;3432;3440;3493:2;3481:9;3472:7;3468:23;3464:32;3461:52;;;3509:1;3506;3499:12;3461:52;3549:9;3536:23;3578:18;3619:2;3611:6;3608:14;3605:34;;;3635:1;3632;3625:12;3605:34;3674:78;3744:7;3735:6;3724:9;3720:22;3674:78;:::i;:::-;3771:8;;-1:-1:-1;3648:104:17;-1:-1:-1;3859:2:17;3844:18;;3831:32;;-1:-1:-1;3875:16:17;;;3872:36;;;3904:1;3901;3894:12;3872:36;;3943:80;4015:7;4004:8;3993:9;3989:24;3943:80;:::i;:::-;3297:786;;;;-1:-1:-1;4042:8:17;-1:-1:-1;;;;3297:786:17:o;4088:247::-;4147:6;4200:2;4188:9;4179:7;4175:23;4171:32;4168:52;;;4216:1;4213;4206:12;4168:52;4255:9;4242:23;4274:31;4299:5;4274:31;:::i;4714:669::-;4827:6;4835;4843;4851;4904:3;4892:9;4883:7;4879:23;4875:33;4872:53;;;4921:1;4918;4911:12;4872:53;4944:52;4988:7;4977:9;4944:52;:::i;:::-;4934:62;;5046:3;5035:9;5031:19;5018:33;5060:31;5085:5;5060:31;:::i;:::-;5110:5;-1:-1:-1;5166:3:17;5151:19;;5138:33;5194:18;5183:30;;5180:50;;;5226:1;5223;5216:12;5180:50;5265:58;5315:7;5306:6;5295:9;5291:22;5265:58;:::i;5388:184::-;5440:77;5437:1;5430:88;5537:4;5534:1;5527:15;5561:4;5558:1;5551:15;5577:334;5648:2;5642:9;5704:2;5694:13;;5709:66;5690:86;5678:99;;5807:18;5792:34;;5828:22;;;5789:62;5786:88;;;5854:18;;:::i;:::-;5890:2;5883:22;5577:334;;-1:-1:-1;5577:334:17:o;5916:245::-;5964:4;5997:18;5989:6;5986:30;5983:56;;;6019:18;;:::i;:::-;-1:-1:-1;6076:2:17;6064:15;6081:66;6060:88;6150:4;6056:99;;5916:245::o;6166:671::-;6234:6;6287:2;6275:9;6266:7;6262:23;6258:32;6255:52;;;6303:1;6300;6293:12;6255:52;6343:9;6330:23;6376:18;6368:6;6365:30;6362:50;;;6408:1;6405;6398:12;6362:50;6431:22;;6484:4;6476:13;;6472:27;-1:-1:-1;6462:55:17;;6513:1;6510;6503:12;6462:55;6549:2;6536:16;6574:48;6590:31;6618:2;6590:31;:::i;:::-;6574:48;:::i;:::-;6645:2;6638:5;6631:17;6685:7;6680:2;6675;6671;6667:11;6663:20;6660:33;6657:53;;;6706:1;6703;6696:12;6657:53;6761:2;6756;6752;6748:11;6743:2;6736:5;6732:14;6719:45;6805:1;6784:14;;;6800:2;6780:23;6773:34;;;;6788:5;6166:671;-1:-1:-1;;;;6166:671:17:o;6842:954::-;6989:6;6997;7005;7013;7021;7074:3;7062:9;7053:7;7049:23;7045:33;7042:53;;;7091:1;7088;7081:12;7042:53;7114:52;7158:7;7147:9;7114:52;:::i;:::-;7104:62;;7217:3;7206:9;7202:19;7189:33;7241:18;7282:2;7274:6;7271:14;7268:34;;;7298:1;7295;7288:12;7268:34;7321:22;;;;7377:3;7359:16;;;7355:26;7352:46;;;7394:1;7391;7384:12;7352:46;7417:2;;-1:-1:-1;7469:3:17;7454:19;;7441:33;;7483:31;7441:33;7483:31;:::i;:::-;7533:5;;-1:-1:-1;7591:3:17;7576:19;;7563:33;;7608:16;;;7605:36;;;7637:1;7634;7627:12;7605:36;;7676:60;7728:7;7717:8;7706:9;7702:24;7676:60;:::i;9286:241::-;9342:6;9395:2;9383:9;9374:7;9370:23;9366:32;9363:52;;;9411:1;9408;9401:12;9363:52;9450:9;9437:23;9469:28;9491:5;9469:28;:::i;9532:184::-;9584:77;9581:1;9574:88;9681:4;9678:1;9671:15;9705:4;9702:1;9695:15;9721:128;9761:3;9792:1;9788:6;9785:1;9782:13;9779:39;;;9798:18;;:::i;:::-;-1:-1:-1;9834:9:17;;9721:128::o;9854:271::-;10037:6;10029;10024:3;10011:33;9993:3;10063:16;;10088:13;;;10063:16;9854:271;-1:-1:-1;9854:271:17:o;10130:125::-;10170:4;10198:1;10195;10192:8;10189:34;;;10203:18;;:::i;:::-;-1:-1:-1;10240:9:17;;10130:125::o;11007:184::-;11059:77;11056:1;11049:88;11156:4;11153:1;11146:15;11180:4;11177:1;11170:15;11196:184;11266:6;11319:2;11307:9;11298:7;11294:23;11290:32;11287:52;;;11335:1;11332;11325:12;11287:52;-1:-1:-1;11358:16:17;;11196:184;-1:-1:-1;11196:184:17:o;11385:195::-;11424:3;11455:66;11448:5;11445:77;11442:103;;11525:18;;:::i;:::-;-1:-1:-1;11572:1:17;11561:13;;11385:195::o;13721:580::-;13798:4;13804:6;13864:11;13851:25;13954:66;13943:8;13927:14;13923:29;13919:102;13899:18;13895:127;13885:155;;14036:1;14033;14026:12;13885:155;14063:33;;14115:20;;;-1:-1:-1;14158:18:17;14147:30;;14144:50;;;14190:1;14187;14180:12;14144:50;14223:4;14211:17;;-1:-1:-1;14254:14:17;14250:27;;;14240:38;;14237:58;;;14291:1;14288;14281:12;14306:258;14378:1;14388:113;14402:6;14399:1;14396:13;14388:113;;;14478:11;;;14472:18;14459:11;;;14452:39;14424:2;14417:10;14388:113;;;14519:6;14516:1;14513:13;14510:48;;;-1:-1:-1;;14554:1:17;14536:16;;14529:27;14306:258::o;14569:317::-;14611:3;14649:5;14643:12;14676:6;14671:3;14664:19;14692:63;14748:6;14741:4;14736:3;14732:14;14725:4;14718:5;14714:16;14692:63;:::i;:::-;14800:2;14788:15;14805:66;14784:88;14775:98;;;;14875:4;14771:109;;14569:317;-1:-1:-1;;14569:317:17:o;14891:220::-;15040:2;15029:9;15022:21;15003:4;15060:45;15101:2;15090:9;15086:18;15078:6;15060:45;:::i;15116:228::-;15156:7;15282:1;15214:66;15210:74;15207:1;15204:81;15199:1;15192:9;15185:17;15181:105;15178:131;;;15289:18;;:::i;:::-;-1:-1:-1;15329:9:17;;15116:228::o;15349:274::-;15389:1;15415;15405:189;;15450:77;15447:1;15440:88;15551:4;15548:1;15541:15;15579:4;15576:1;15569:15;15405:189;-1:-1:-1;15608:9:17;;15349:274::o;20198:184::-;20250:77;20247:1;20240:88;20347:4;20344:1;20337:15;20371:4;20368:1;20361:15;20387:289;20562:6;20551:9;20544:25;20605:2;20600;20589:9;20585:18;20578:30;20525:4;20625:45;20666:2;20655:9;20651:18;20643:6;20625:45;:::i;20681:274::-;20810:3;20848:6;20842:13;20864:53;20910:6;20905:3;20898:4;20890:6;20886:17;20864:53;:::i;:::-;20933:16;;;;;20681:274;-1:-1:-1;;20681:274:17:o;20960:336::-;21029:6;21082:2;21070:9;21061:7;21057:23;21053:32;21050:52;;;21098:1;21095;21088:12;21050:52;21130:9;21124:16;21180:66;21173:5;21169:78;21162:5;21159:89;21149:117;;21262:1;21259;21252:12;22481:635;22561:6;22614:2;22602:9;22593:7;22589:23;22585:32;22582:52;;;22630:1;22627;22620:12;22582:52;22663:9;22657:16;22696:18;22688:6;22685:30;22682:50;;;22728:1;22725;22718:12;22682:50;22751:22;;22804:4;22796:13;;22792:27;-1:-1:-1;22782:55:17;;22833:1;22830;22823:12;22782:55;22862:2;22856:9;22887:48;22903:31;22931:2;22903:31;:::i;22887:48::-;22958:2;22951:5;22944:17;22998:7;22993:2;22988;22984;22980:11;22976:20;22973:33;22970:53;;;23019:1;23016;23009:12;22970:53;23032:54;23083:2;23078;23071:5;23067:14;23062:2;23058;23054:11;23032:54;:::i;:::-;23105:5;22481:635;-1:-1:-1;;;;;22481:635:17:o;23121:245::-;23188:6;23241:2;23229:9;23220:7;23216:23;23212:32;23209:52;;;23257:1;23254;23247:12;23209:52;23289:9;23283:16;23308:28;23330:5;23308:28;:::i
Swarm Source
ipfs://0fc82f0a66b286168b80a232c756d90d474b72077ec7970f88b985c05ce55a68
Loading...
Loading
Loading...
Loading
Net Worth in USD
$1,003.07
Net Worth in ETH
0.516466
Token Allocations
USDC
47.03%
USDT
38.62%
WETH
14.35%
Multichain Portfolio | 34 Chains
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.