Source Code
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 6656118 | 578 days ago | Contract Creation | 0.0001 FRAX |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MemezFactory
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.0;
import "./MemeCoin.sol";
import "./MemezChat.sol";
import "./MemeCoinDeployer.sol";
contract MemezFactory is MemeCoinDeployer {
mapping(address => AccountInfo) public accounts;
mapping(string => address) public nicknamesToAccounts;
mapping(address => address[]) public memecoinsByCreators;
struct AccountInfo {
string nickname;
string profilePicture;
uint256 createdMemecoinsCount;
}
event AccountInfoUpdated(address indexed account, string indexed nickname, string profilePicture);
constructor(address formula_, address listingManager_) MemeCoinDeployer(formula_, listingManager_) { }
function updateAccountInfo(string memory nickname, string memory profilePicture) external virtual {
require(nicknamesToAccounts[nickname] == address(0) || nicknamesToAccounts[nickname] == msg.sender, "Nickname exists");
accounts[msg.sender].nickname = nickname;
accounts[msg.sender].profilePicture = profilePicture;
nicknamesToAccounts[nickname] = msg.sender;
emit AccountInfoUpdated(msg.sender, nickname, profilePicture);
}
function deploy(
uint96 cap,
uint16 powerN,
uint16 powerD,
uint16 factorN,
uint16 factorD,
string memory name,
string memory symbol,
string memory description,
string memory image
) public payable override returns (address memecoin) {
require((getAddress(symbol)).code.length == 0, "Symbol is already used");
memecoin = super.deploy(
cap,
powerN,
powerD,
factorN,
factorD,
name,
symbol,
description,
image
);
unchecked { accounts[msg.sender].createdMemecoinsCount++; }
memecoinsByCreators[msg.sender].push(memecoin);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;
/**
* @dev Standard ERC20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC5313.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface for the Light Contract Ownership Standard.
*
* A standardized minimal interface required to identify an account that controls a contract
*/
interface IERC5313 {
/**
* @dev Gets the address of the owner.
*/
function owner() external view returns (address);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.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}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* 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.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* 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 returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual 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 default value returned by this function, unless
* it's 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 returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual 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 `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` 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 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
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 `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* 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.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` 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.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
* ```
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner` s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance != type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*/
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 v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import '@openzeppelin/contracts/interfaces/IERC5313.sol';
import "./interfaces/IERC20ParametersPacker.sol";
abstract contract ERC20Plus is ERC20, IERC5313 {
constructor(IERC20ParametersPacker.ERC20Parameters memory parameters) ERC20(parameters.name, parameters.symbol) { }
function description() external view virtual returns (string memory);
function image() external view virtual returns (string memory);
}//SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.0;
import "./Power.sol";
contract Formula is Power {
uint32 private constant MAX_WEIGHT = 1000000;
/**
* @dev given a token supply, reserve balance, weight and an amount (in the main token),
* calculates the amount of reserve tokens required for purchasing the given amount of pool tokens
*
* Formula:
* return = _reserveBalance * ((_amount / _supply + 1) ^ (1000000 / _reserveWeight) - 1)
*
* @param _supply liquid token supply
* @param _reserveBalance reserve balance
* @param _reserveWeight reserve weight, represented in ppm (1-1000000)
* @param _amount requested amount of pool tokens
*
* @return reserve token amount
*/
function purchaseCost(
uint256 _supply,
uint256 _reserveBalance,
uint32 _reserveWeight,
uint256 _amount
) public view virtual returns (uint256) {
// validate input
require(_supply > 0, "ERR_INVALID_SUPPLY");
require(_reserveBalance > 0, "ERR_INVALID_RESERVE_BALANCE");
require(_reserveWeight > 0 && _reserveWeight <= MAX_WEIGHT, "ERR_INVALID_RESERVE_RATIO");
// special case for 0 amount
if (_amount == 0) return 0;
// special case if the reserve weight = 100%
if (_reserveWeight == MAX_WEIGHT) return (_amount * _reserveBalance - 1) / _supply + 1;
uint256 result;
uint8 precision;
uint256 baseN = _supply + _amount;
(result, precision) = power(baseN, _supply, MAX_WEIGHT, _reserveWeight);
uint256 temp = (_reserveBalance * result - 1) >> precision;
return temp - _reserveBalance;
}
/**
* @dev given a token supply, reserve balance, weight and a deposit amount (in the reserve token),
* calculates the target amount for a given conversion (in the main token)
*
* Formula:
* return = _supply * ((1 + _amount / _reserveBalance) ^ (_reserveWeight / 1000000) - 1)
*
* @param _supply liquid token supply
* @param _reserveBalance reserve balance
* @param _reserveWeight reserve weight, represented in ppm (1-1000000)
* @param _amount amount of reserve tokens to get the target amount for
*
* @return target
*/
function purchaseTargetAmount(
uint256 _supply,
uint256 _reserveBalance,
uint32 _reserveWeight,
uint256 _amount
) public view virtual returns (uint256) {
// validate input
require(_supply > 0, "ERR_INVALID_SUPPLY");
require(_reserveBalance > 0, "ERR_INVALID_RESERVE_BALANCE");
require(_reserveWeight > 0 && _reserveWeight <= MAX_WEIGHT, "ERR_INVALID_RESERVE_WEIGHT");
// special case for 0 deposit amount
if (_amount == 0) return 0;
// special case if the weight = 100%
if (_reserveWeight == MAX_WEIGHT) return _supply * _amount / _reserveBalance;
uint256 result;
uint8 precision;
uint256 baseN = _amount + _reserveBalance;
(result, precision) = power(baseN, _reserveBalance, _reserveWeight, MAX_WEIGHT);
uint256 temp = (_supply * result >> precision) + 1;
return temp - _supply;
}
/**
* @dev given a token supply, reserve balance, weight and a sell amount (in the main token),
* calculates the target amount for a given conversion (in the reserve token)
*
* Formula:
* return = _reserveBalance * (1 - (1 - _amount / _supply) ^ (1000000 / _reserveWeight))
*
* @param _supply liquid token supply
* @param _reserveBalance reserve balance
* @param _reserveWeight reserve weight, represented in ppm (1-1000000)
* @param _amount amount of liquid tokens to get the target amount for
*
* @return reserve token amount
*/
function saleTargetAmount(
uint256 _supply,
uint256 _reserveBalance,
uint32 _reserveWeight,
uint256 _amount
) public view virtual returns (uint256) {
// validate input
require(_supply > 0, "ERR_INVALID_SUPPLY");
require(_reserveBalance > 0, "ERR_INVALID_RESERVE_BALANCE");
require(_reserveWeight > 0 && _reserveWeight <= MAX_WEIGHT, "ERR_INVALID_RESERVE_WEIGHT");
require(_amount <= _supply, "ERR_INVALID_AMOUNT");
// special case for 0 sell amount
if (_amount == 0) return 0;
// special case for selling the entire supply
if (_amount == _supply) return _reserveBalance;
// special case if the weight = 100%
if (_reserveWeight == MAX_WEIGHT) return _reserveBalance * _amount / _supply;
uint256 result;
uint8 precision;
uint256 baseD = _supply - _amount;
(result, precision) = power(_supply, baseD, MAX_WEIGHT, _reserveWeight);
uint256 temp1 = _reserveBalance * result;
uint256 temp2 = _reserveBalance << precision;
return (temp1 - temp2) / result;
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.0;
interface IERC20ParametersPacker {
struct ERC20Parameters {
string name;
string symbol;
}
function erc20Parameters() external view returns (ERC20Parameters memory);
}// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.0;
import "./IERC20ParametersPacker.sol";
interface IMemeCoinDeployer is IERC20ParametersPacker {
function allMemecoinsCount() external view returns (uint32);
function parameters() external view returns (
address listingManager,
uint96 cap,
address formula,
uint16 powerN,
uint16 powerD,
uint16 factorN,
uint16 factorD,
uint32 coinIndex,
address owner,
string memory description,
string memory image
);
function isMemeCoinLegit(address memecoin) external view returns (bool);
}// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.0;
interface IMemeCoinListingManager {
function estimateMemeCoinListingWithTwamm(uint256 cap, uint256 price) external returns (uint256 amountTokenForListing, uint256 amountTokenForMemez);
function listMemeCoin(uint256 amountTokenForListing, uint256 amountTokenForMemez) external payable;
}// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.0;
import "./interfaces/IMemeCoinDeployer.sol";
import "./interfaces/IMemeCoinListingManager.sol";
import "./ERC20Plus.sol";
import "./Formula.sol";
import "hardhat/console.sol";
contract MemeCoin is ERC20Plus {
uint256 constant internal DECIMALS = 1e18;
address public immutable listingManager;
uint96 public cap;
address internal immutable formula;
uint16 internal immutable powerN;
uint16 internal immutable powerD;
uint16 internal immutable factorN;
uint16 internal immutable factorD;
uint32 public immutable coinIndex;
address public immutable owner;
string public override description;
string public override image;
event Mint(
address indexed by,
uint256 amount,
uint256 liquidity,
uint256 newSupply,
uint256 timestamp // debug only
);
event Retire(
address indexed by,
uint256 amount,
uint256 liquidity,
uint256 newSupply,
uint256 timestamp // debug only
);
constructor() payable ERC20Plus(IMemeCoinDeployer(_msgSender()).erc20Parameters()) {
IMemeCoinDeployer deployer = IMemeCoinDeployer(_msgSender());
(
listingManager,
cap,
formula,
powerN,
powerD,
factorN,
factorD,
coinIndex,
owner,
description,
image
) = deployer.parameters();
require(cap > 0, 'Positive cap expected');
if (msg.value > 0) _mintCoin(owner, 0);
}
modifier notListed() {
require(cap > 0, 'Already listed');
_;
}
function getCoefficients() external view returns (
uint256 powerNumerator, uint256 powerDenominator, uint256 factorNumerator, uint256 factorDenominator
) {
return (uint256(powerN), uint256(powerD), uint256(factorN), uint256(factorD));
}
function _listing() internal {
IMemeCoinListingManager _listingManager = IMemeCoinListingManager(listingManager);
(uint256 amountTokenForListing, uint256 amountTokenForMemez) = _listingManager.estimateMemeCoinListingWithTwamm(cap, price());
unchecked { _mint(address(_listingManager), amountTokenForListing + amountTokenForMemez); }
_listingManager.listMemeCoin{value: cap}(amountTokenForListing, amountTokenForMemez);
if (address(this).balance > 0) {
(bool success, ) = _msgSender().call{value: address(this).balance}('');
require(success, 'Leftover transfer failed');
}
delete cap;
}
/// @notice Returns reserve balance
function reserveBalance() public view virtual returns (uint256) {
return address(this).balance;
}
/// @notice Returns price at current supply
function price() public view returns (uint256) {
(uint256 result, uint8 precision) = Formula(formula).power(totalSupply(), DECIMALS, powerN, powerD);
return (result >> precision) * factorN / factorD;
}
/// @notice Mints tokens to address pertaining to the deposited amount of reserve tokens
function _mintCoin(address minter, uint256 minAmount) internal virtual {
uint256 value = msg.value;
uint256 _cap = cap;
uint256 _reserveBalance = address(this).balance;
if (_reserveBalance >= _cap) {
unchecked{
uint256 leftover = _reserveBalance - _cap;
value = value - leftover;
}
}
uint256 amount = _calculatePurchaseReturn(value, msg.value);
require(amount >= minAmount, "Insufficient output token amount");
_mint(minter, amount);
emit Mint(minter, amount, value, totalSupply(), block.timestamp);
if (address(this).balance >= _cap) _listing();
}
/// @notice Mints tokens pertaining to the deposited amount of reserve tokens
/// @param minAmount The minimum amount of tokens that user expects to receive
function mint(uint256 minAmount) external payable virtual notListed {
return _mintCoin(_msgSender(), minAmount);
}
/// @notice Retires tokens of given amount, and transfers pertaining reserve tokens to account
/// @param amount The amount of tokens being retired
/// @param minValue The minimum ETH value that user expects to receive
function retire(uint256 amount, uint256 minValue) external virtual notListed {
uint256 _totalSupply = totalSupply();
require(amount <= _totalSupply, "Retire Amount Exceeds Supply");
uint256 liquidity = calculateSaleReturn(amount);
require(liquidity >= minValue, "Insufficient output ETH amount");
address msgSender = _msgSender();
(bool success, ) = msgSender.call{value: liquidity}('');
require(success, 'ETH transfer failed');
_burn(msgSender, amount);
emit Retire(msgSender, amount, liquidity, totalSupply(), block.timestamp);
}
function _calculatePurchaseReturn(
uint256 _depositValue,
uint256 _msgValue
) internal view returns (uint256) {
unchecked {
uint32 powerNOfPowerPlus1 = powerN + powerD;
uint256 baseN = (address(this).balance - _msgValue + _depositValue) * powerNOfPowerPlus1 * factorD;
uint256 baseD = factorN * powerD;
(uint256 result, uint8 precision) = Formula(formula).power(baseN, baseD, powerD, powerNOfPowerPlus1);
return (result >> precision) * DECIMALS - totalSupply();
}
}
function calculatePurchaseReturn(
uint256 _depositValue
) external view returns (uint256) {
return _calculatePurchaseReturn(_depositValue, 0);
}
function calculateSaleReturn(
uint256 _saleAmount
) public view returns (uint256) {
unchecked {
uint32 powerNOfPowerPlus1 = powerN + powerD;
uint256 newSupply = totalSupply() - _saleAmount;
if (newSupply == 0) return address(this).balance;
(uint256 result, uint8 precision) = Formula(formula).power(newSupply, DECIMALS, powerNOfPowerPlus1, powerD);
return address(this).balance - (((result >> precision) * factorN * powerD) / factorD / powerNOfPowerPlus1);
}
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.0;
import "./interfaces/IMemeCoinDeployer.sol";
import "./MemeCoin.sol";
// inspired by UniswapV3PoolDeployer
contract MemeCoinDeployer is IMemeCoinDeployer {
struct MemeCoinParameters {
address listingManager;
uint96 cap;
address formula;
uint16 powerN;
uint16 powerD;
uint16 factorN;
uint16 factorD;
uint32 coinIndex;
address owner;
string description;
string image;
}
uint32 public override allMemecoinsCount;
address public immutable formula;
address public immutable listingManager;
ERC20Parameters internal _erc20Parameters;
MemeCoinParameters public override parameters;
address[] public allMemecoins;
event MemeCoinDeployed(address indexed creator, address indexed memecoin);
constructor(address formula_, address listingManager_) {
formula = formula_;
listingManager = listingManager_;
}
function erc20Parameters() external view returns (ERC20Parameters memory) {
return _erc20Parameters;
}
function deploy(
uint96 cap,
uint16 powerN,
uint16 powerD,
uint16 factorN,
uint16 factorD,
string memory name,
string memory symbol,
string memory description,
string memory image
) public payable virtual returns (address memecoin) {
parameters = MemeCoinParameters({
listingManager: listingManager,
cap: cap,
formula: formula,
powerN: powerN,
powerD: powerD,
factorN: factorN,
factorD: factorD,
coinIndex: allMemecoinsCount,
owner: msg.sender,
description: description,
image: image
});
_erc20Parameters = ERC20Parameters({
name: name,
symbol: symbol
});
memecoin = address(new MemeCoin{salt: keccak256(bytes(symbol)), value: msg.value}());
delete parameters;
delete _erc20Parameters;
emit MemeCoinDeployed(msg.sender, memecoin);
allMemecoins.push(memecoin);
unchecked { allMemecoinsCount++; }
}
function getAddress(string memory symbol) public view returns (address memecoin) {
bytes32 salt = keccak256(bytes(symbol));
return address(uint160(uint256(keccak256(abi.encodePacked(
bytes1(0xff),
address(this),
salt,
keccak256(abi.encodePacked(type(MemeCoin).creationCode))
)))));
}
function isMemeCoinLegit(address memecoin) public override view returns (bool) {
try MemeCoin(memecoin).coinIndex() returns (uint32 coinIndex) {
return allMemecoins[coinIndex] == memecoin;
} catch {
return false;
}
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.0;
import "./MemeCoin.sol";
abstract contract MemezChat { // only for demo
mapping(MemeCoin => Message[]) public threads;
mapping(MemeCoin => mapping(uint256 => mapping(address => bool))) public isThreadMessageLikedByUser;
struct Message {
string text;
address sender;
uint48 timestamp;
uint48 likes;
}
event MessageCreated(MemeCoin indexed memecoinThread, address indexed sender, uint256 messageIndex);
event MessageLiked(MemeCoin indexed memecoinThread, address indexed sender, uint256 messageIndex);
function isMemeCoinLegit(MemeCoin memecoin) public virtual view returns (bool);
function getThreadLength(MemeCoin memecoin) public view returns (uint256) {
return threads[memecoin].length;
}
function addMessage(MemeCoin memecoinThread, string memory text) external returns (uint256 messageIndex) {
require(isMemeCoinLegit(memecoinThread), "Memecoin is not legit");
Message memory message;
message.text = text;
message.sender = msg.sender;
message.timestamp = uint48(block.timestamp);
messageIndex = threads[memecoinThread].length;
threads[memecoinThread].push(message);
emit MessageCreated(memecoinThread, msg.sender, messageIndex);
}
function likeMessage(MemeCoin memecoinThread, uint256 messageIndex) external returns (uint48 likes) {
require(threads[memecoinThread][messageIndex].timestamp > 0, "Message does not exist");
require(!isThreadMessageLikedByUser[memecoinThread][messageIndex][msg.sender], "Message is already liked");
isThreadMessageLikedByUser[memecoinThread][messageIndex][msg.sender] = true;
likes = uint48(threads[memecoinThread][messageIndex].likes + 1);
threads[memecoinThread][messageIndex].likes = likes;
emit MessageLiked(memecoinThread, msg.sender, messageIndex);
}
}//SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.0;
/// @notice For calculating fractional exponents
contract Power {
uint256 private constant ONE = 1;
uint32 private constant MAX_WEIGHT = 1000000;
uint8 private constant MIN_PRECISION = 32;
uint8 private constant MAX_PRECISION = 127;
uint256 private constant FIXED_1 = 0x080000000000000000000000000000000;
uint256 private constant FIXED_2 = 0x100000000000000000000000000000000;
uint256 private constant MAX_NUM = 0x200000000000000000000000000000000;
uint256 private constant LN2_NUMERATOR = 0x3f80fe03f80fe03f80fe03f80fe03f8;
uint256 private constant LN2_DENOMINATOR = 0x5b9de1d10bf4103d647b0955897ba80;
uint256 private constant OPT_LOG_MAX_VAL = 0x15bf0a8b1457695355fb8ac404e7a79e3;
uint256 private constant OPT_EXP_MAX_VAL = 0x800000000000000000000000000000000;
uint256[128] private maxExpArray;
function initMaxExpArray() private {
// maxExpArray[ 0] = 0x6bffffffffffffffffffffffffffffffff;
// maxExpArray[ 1] = 0x67ffffffffffffffffffffffffffffffff;
// maxExpArray[ 2] = 0x637fffffffffffffffffffffffffffffff;
// maxExpArray[ 3] = 0x5f6fffffffffffffffffffffffffffffff;
// maxExpArray[ 4] = 0x5b77ffffffffffffffffffffffffffffff;
// maxExpArray[ 5] = 0x57b3ffffffffffffffffffffffffffffff;
// maxExpArray[ 6] = 0x5419ffffffffffffffffffffffffffffff;
// maxExpArray[ 7] = 0x50a2ffffffffffffffffffffffffffffff;
// maxExpArray[ 8] = 0x4d517fffffffffffffffffffffffffffff;
// maxExpArray[ 9] = 0x4a233fffffffffffffffffffffffffffff;
// maxExpArray[ 10] = 0x47165fffffffffffffffffffffffffffff;
// maxExpArray[ 11] = 0x4429afffffffffffffffffffffffffffff;
// maxExpArray[ 12] = 0x415bc7ffffffffffffffffffffffffffff;
// maxExpArray[ 13] = 0x3eab73ffffffffffffffffffffffffffff;
// maxExpArray[ 14] = 0x3c1771ffffffffffffffffffffffffffff;
// maxExpArray[ 15] = 0x399e96ffffffffffffffffffffffffffff;
// maxExpArray[ 16] = 0x373fc47fffffffffffffffffffffffffff;
// maxExpArray[ 17] = 0x34f9e8ffffffffffffffffffffffffffff;
// maxExpArray[ 18] = 0x32cbfd5fffffffffffffffffffffffffff;
// maxExpArray[ 19] = 0x30b5057fffffffffffffffffffffffffff;
// maxExpArray[ 20] = 0x2eb40f9fffffffffffffffffffffffffff;
// maxExpArray[ 21] = 0x2cc8340fffffffffffffffffffffffffff;
// maxExpArray[ 22] = 0x2af09481ffffffffffffffffffffffffff;
// maxExpArray[ 23] = 0x292c5bddffffffffffffffffffffffffff;
// maxExpArray[ 24] = 0x277abdcdffffffffffffffffffffffffff;
// maxExpArray[ 25] = 0x25daf6657fffffffffffffffffffffffff;
// maxExpArray[ 26] = 0x244c49c65fffffffffffffffffffffffff;
// maxExpArray[ 27] = 0x22ce03cd5fffffffffffffffffffffffff;
// maxExpArray[ 28] = 0x215f77c047ffffffffffffffffffffffff;
// maxExpArray[ 29] = 0x1fffffffffffffffffffffffffffffffff;
// maxExpArray[ 30] = 0x1eaefdbdabffffffffffffffffffffffff;
// maxExpArray[ 31] = 0x1d6bd8b2ebffffffffffffffffffffffff;
maxExpArray[ 32] = 0x1c35fedd14ffffffffffffffffffffffff;
maxExpArray[ 33] = 0x1b0ce43b323fffffffffffffffffffffff;
maxExpArray[ 34] = 0x19f0028ec1ffffffffffffffffffffffff;
maxExpArray[ 35] = 0x18ded91f0e7fffffffffffffffffffffff;
maxExpArray[ 36] = 0x17d8ec7f0417ffffffffffffffffffffff;
maxExpArray[ 37] = 0x16ddc6556cdbffffffffffffffffffffff;
maxExpArray[ 38] = 0x15ecf52776a1ffffffffffffffffffffff;
maxExpArray[ 39] = 0x15060c256cb2ffffffffffffffffffffff;
maxExpArray[ 40] = 0x1428a2f98d72ffffffffffffffffffffff;
maxExpArray[ 41] = 0x13545598e5c23fffffffffffffffffffff;
maxExpArray[ 42] = 0x1288c4161ce1dfffffffffffffffffffff;
maxExpArray[ 43] = 0x11c592761c666fffffffffffffffffffff;
maxExpArray[ 44] = 0x110a688680a757ffffffffffffffffffff;
maxExpArray[ 45] = 0x1056f1b5bedf77ffffffffffffffffffff;
maxExpArray[ 46] = 0x0faadceceeff8bffffffffffffffffffff;
maxExpArray[ 47] = 0x0f05dc6b27edadffffffffffffffffffff;
maxExpArray[ 48] = 0x0e67a5a25da4107fffffffffffffffffff;
maxExpArray[ 49] = 0x0dcff115b14eedffffffffffffffffffff;
maxExpArray[ 50] = 0x0d3e7a392431239fffffffffffffffffff;
maxExpArray[ 51] = 0x0cb2ff529eb71e4fffffffffffffffffff;
maxExpArray[ 52] = 0x0c2d415c3db974afffffffffffffffffff;
maxExpArray[ 53] = 0x0bad03e7d883f69bffffffffffffffffff;
maxExpArray[ 54] = 0x0b320d03b2c343d5ffffffffffffffffff;
maxExpArray[ 55] = 0x0abc25204e02828dffffffffffffffffff;
maxExpArray[ 56] = 0x0a4b16f74ee4bb207fffffffffffffffff;
maxExpArray[ 57] = 0x09deaf736ac1f569ffffffffffffffffff;
maxExpArray[ 58] = 0x0976bd9952c7aa957fffffffffffffffff;
maxExpArray[ 59] = 0x09131271922eaa606fffffffffffffffff;
maxExpArray[ 60] = 0x08b380f3558668c46fffffffffffffffff;
maxExpArray[ 61] = 0x0857ddf0117efa215bffffffffffffffff;
maxExpArray[ 62] = 0x07ffffffffffffffffffffffffffffffff;
maxExpArray[ 63] = 0x07abbf6f6abb9d087fffffffffffffffff;
maxExpArray[ 64] = 0x075af62cbac95f7dfa7fffffffffffffff;
maxExpArray[ 65] = 0x070d7fb7452e187ac13fffffffffffffff;
maxExpArray[ 66] = 0x06c3390ecc8af379295fffffffffffffff;
maxExpArray[ 67] = 0x067c00a3b07ffc01fd6fffffffffffffff;
maxExpArray[ 68] = 0x0637b647c39cbb9d3d27ffffffffffffff;
maxExpArray[ 69] = 0x05f63b1fc104dbd39587ffffffffffffff;
maxExpArray[ 70] = 0x05b771955b36e12f7235ffffffffffffff;
maxExpArray[ 71] = 0x057b3d49dda84556d6f6ffffffffffffff;
maxExpArray[ 72] = 0x054183095b2c8ececf30ffffffffffffff;
maxExpArray[ 73] = 0x050a28be635ca2b888f77fffffffffffff;
maxExpArray[ 74] = 0x04d5156639708c9db33c3fffffffffffff;
maxExpArray[ 75] = 0x04a23105873875bd52dfdfffffffffffff;
maxExpArray[ 76] = 0x0471649d87199aa990756fffffffffffff;
maxExpArray[ 77] = 0x04429a21a029d4c1457cfbffffffffffff;
maxExpArray[ 78] = 0x0415bc6d6fb7dd71af2cb3ffffffffffff;
maxExpArray[ 79] = 0x03eab73b3bbfe282243ce1ffffffffffff;
maxExpArray[ 80] = 0x03c1771ac9fb6b4c18e229ffffffffffff;
maxExpArray[ 81] = 0x0399e96897690418f785257fffffffffff;
maxExpArray[ 82] = 0x0373fc456c53bb779bf0ea9fffffffffff;
maxExpArray[ 83] = 0x034f9e8e490c48e67e6ab8bfffffffffff;
maxExpArray[ 84] = 0x032cbfd4a7adc790560b3337ffffffffff;
maxExpArray[ 85] = 0x030b50570f6e5d2acca94613ffffffffff;
maxExpArray[ 86] = 0x02eb40f9f620fda6b56c2861ffffffffff;
maxExpArray[ 87] = 0x02cc8340ecb0d0f520a6af58ffffffffff;
maxExpArray[ 88] = 0x02af09481380a0a35cf1ba02ffffffffff;
maxExpArray[ 89] = 0x0292c5bdd3b92ec810287b1b3fffffffff;
maxExpArray[ 90] = 0x0277abdcdab07d5a77ac6d6b9fffffffff;
maxExpArray[ 91] = 0x025daf6654b1eaa55fd64df5efffffffff;
maxExpArray[ 92] = 0x0244c49c648baa98192dce88b7ffffffff;
maxExpArray[ 93] = 0x022ce03cd5619a311b2471268bffffffff;
maxExpArray[ 94] = 0x0215f77c045fbe885654a44a0fffffffff;
maxExpArray[ 95] = 0x01ffffffffffffffffffffffffffffffff;
maxExpArray[ 96] = 0x01eaefdbdaaee7421fc4d3ede5ffffffff;
maxExpArray[ 97] = 0x01d6bd8b2eb257df7e8ca57b09bfffffff;
maxExpArray[ 98] = 0x01c35fedd14b861eb0443f7f133fffffff;
maxExpArray[ 99] = 0x01b0ce43b322bcde4a56e8ada5afffffff;
maxExpArray[100] = 0x019f0028ec1fff007f5a195a39dfffffff;
maxExpArray[101] = 0x018ded91f0e72ee74f49b15ba527ffffff;
maxExpArray[102] = 0x017d8ec7f04136f4e5615fd41a63ffffff;
maxExpArray[103] = 0x016ddc6556cdb84bdc8d12d22e6fffffff;
maxExpArray[104] = 0x015ecf52776a1155b5bd8395814f7fffff;
maxExpArray[105] = 0x015060c256cb23b3b3cc3754cf40ffffff;
maxExpArray[106] = 0x01428a2f98d728ae223ddab715be3fffff;
maxExpArray[107] = 0x013545598e5c23276ccf0ede68034fffff;
maxExpArray[108] = 0x01288c4161ce1d6f54b7f61081194fffff;
maxExpArray[109] = 0x011c592761c666aa641d5a01a40f17ffff;
maxExpArray[110] = 0x0110a688680a7530515f3e6e6cfdcdffff;
maxExpArray[111] = 0x01056f1b5bedf75c6bcb2ce8aed428ffff;
maxExpArray[112] = 0x00faadceceeff8a0890f3875f008277fff;
maxExpArray[113] = 0x00f05dc6b27edad306388a600f6ba0bfff;
maxExpArray[114] = 0x00e67a5a25da41063de1495d5b18cdbfff;
maxExpArray[115] = 0x00dcff115b14eedde6fc3aa5353f2e4fff;
maxExpArray[116] = 0x00d3e7a3924312399f9aae2e0f868f8fff;
maxExpArray[117] = 0x00cb2ff529eb71e41582cccd5a1ee26fff;
maxExpArray[118] = 0x00c2d415c3db974ab32a51840c0b67edff;
maxExpArray[119] = 0x00bad03e7d883f69ad5b0a186184e06bff;
maxExpArray[120] = 0x00b320d03b2c343d4829abd6075f0cc5ff;
maxExpArray[121] = 0x00abc25204e02828d73c6e80bcdb1a95bf;
maxExpArray[122] = 0x00a4b16f74ee4bb2040a1ec6c15fbbf2df;
maxExpArray[123] = 0x009deaf736ac1f569deb1b5ae3f36c130f;
maxExpArray[124] = 0x00976bd9952c7aa957f5937d790ef65037;
maxExpArray[125] = 0x009131271922eaa6064b73a22d0bd4f2bf;
maxExpArray[126] = 0x008b380f3558668c46c91c49a2f8e967b9;
maxExpArray[127] = 0x00857ddf0117efa215952912839f6473e6;
}
/**
* @dev should be executed after construction (too large for the constructor)
*/
function init() public virtual {
initMaxExpArray();
}
/**
* @dev General Description:
* Determine a value of precision.
* Calculate an integer approximation of (_baseN / _baseD) ^ (_expN / _expD) * 2 ^ precision.
* Return the result along with the precision used.
*
* Detailed Description:
* Instead of calculating "base ^ exp", we calculate "e ^ (log(base) * exp)".
* The value of "log(base)" is represented with an integer slightly smaller than "log(base) * 2 ^ precision".
* The larger "precision" is, the more accurately this value represents the real value.
* However, the larger "precision" is, the more bits are required in order to store this value.
* And the exponentiation function, which takes "x" and calculates "e ^ x", is limited to a maximum exponent (maximum value of "x").
* This maximum exponent depends on the "precision" used, and it is given by "maxExpArray[precision] >> (MAX_PRECISION - precision)".
* Hence we need to determine the highest precision which can be used for the given input, before calling the exponentiation function.
* This allows us to compute "base ^ exp" with maximum accuracy and without exceeding 256 bits in any of the intermediate computations.
* This functions assumes that "_expN < 2 ^ 256 / log(MAX_NUM - 1)", otherwise the multiplication should be replaced with a "safeMul".
* Since we rely on unsigned-integer arithmetic and "base < 1" ==> "log(base) < 0", this function does not support "_baseN < _baseD".
*/
function power(
uint256 _baseN,
uint256 _baseD,
uint32 _expN,
uint32 _expD
) public view returns (uint256, uint8) {
require(_baseN < MAX_NUM);
uint256 baseLog;
uint256 base = (_baseN * FIXED_1) / _baseD;
if (base < OPT_LOG_MAX_VAL) {
baseLog = optimalLog(base);
} else {
baseLog = generalLog(base);
}
uint256 baseLogTimesExp = (baseLog * _expN) / _expD;
if (baseLogTimesExp < OPT_EXP_MAX_VAL) {
return (optimalExp(baseLogTimesExp), MAX_PRECISION);
} else {
uint8 precision = findPositionInMaxExpArray(baseLogTimesExp);
return (generalExp(baseLogTimesExp >> (MAX_PRECISION - precision), precision), precision);
}
}
/**
* @dev computes log(x / FIXED_1) * FIXED_1.
* This functions assumes that "x >= FIXED_1", because the output would be negative otherwise.
*/
function generalLog(uint256 x) internal pure returns (uint256) {
uint256 res = 0;
// If x >= 2, then we compute the integer part of log2(x), which is larger than 0.
if (x >= FIXED_2) {
uint8 count = floorLog2(x / FIXED_1);
x >>= count; // now x < 2
res = count * FIXED_1;
}
// If x > 1, then we compute the fraction part of log2(x), which is larger than 0.
if (x > FIXED_1) {
for (uint8 i = MAX_PRECISION; i > 0; --i) {
x = (x * x) / FIXED_1; // now 1 < x < 4
if (x >= FIXED_2) {
x >>= 1; // now 1 < x < 2
res += ONE << (i - 1);
}
}
}
return (res * LN2_NUMERATOR) / LN2_DENOMINATOR;
}
/**
* @dev computes the largest integer smaller than or equal to the binary logarithm of the input.
*/
function floorLog2(uint256 _n) internal pure returns (uint8) {
uint8 res = 0;
if (_n < 256) {
// At most 8 iterations
while (_n > 1) {
_n >>= 1;
res += 1;
}
} else {
// Exactly 8 iterations
for (uint8 s = 128; s > 0; s >>= 1) {
if (_n >= (ONE << s)) {
_n >>= s;
res |= s;
}
}
}
return res;
}
/**
* @dev the global "maxExpArray" is sorted in descending order, and therefore the following statements are equivalent:
* - This function finds the position of [the smallest value in "maxExpArray" larger than or equal to "x"]
* - This function finds the highest position of [a value in "maxExpArray" larger than or equal to "x"]
*/
function findPositionInMaxExpArray(uint256 _x) internal view returns (uint8 result) {
uint8 lo = MIN_PRECISION;
uint8 hi = MAX_PRECISION;
while (lo + 1 < hi) {
uint8 mid = (lo + hi) / 2;
if (maxExpArray[mid] >= _x) lo = mid;
else hi = mid;
}
if (maxExpArray[hi] >= _x) return hi;
if (maxExpArray[lo] >= _x) return lo;
// revert if no return
require(false);
}
/**
* @dev this function can be auto-generated by the script 'PrintFunctionGeneralExp.py'.
* it approximates "e ^ x" via maclaurin summation: "(x^0)/0! + (x^1)/1! + ... + (x^n)/n!".
* it returns "e ^ (x / 2 ^ precision) * 2 ^ precision", that is, the result is upshifted for accuracy.
* the global "maxExpArray" maps each "precision" to "((maximumExponent + 1) << (MAX_PRECISION - precision)) - 1".
* the maximum permitted value for "x" is therefore given by "maxExpArray[precision] >> (MAX_PRECISION - precision)".
*/
function generalExp(uint256 _x, uint8 _precision) internal pure returns (uint256) {
uint256 xi = _x;
uint256 res = 0;
xi = (xi * _x) >> _precision;
res += xi * 0x3442c4e6074a82f1797f72ac0000000; // add x^02 * (33! / 02!)
xi = (xi * _x) >> _precision;
res += xi * 0x116b96f757c380fb287fd0e40000000; // add x^03 * (33! / 03!)
xi = (xi * _x) >> _precision;
res += xi * 0x045ae5bdd5f0e03eca1ff4390000000; // add x^04 * (33! / 04!)
xi = (xi * _x) >> _precision;
res += xi * 0x00defabf91302cd95b9ffda50000000; // add x^05 * (33! / 05!)
xi = (xi * _x) >> _precision;
res += xi * 0x002529ca9832b22439efff9b8000000; // add x^06 * (33! / 06!)
xi = (xi * _x) >> _precision;
res += xi * 0x00054f1cf12bd04e516b6da88000000; // add x^07 * (33! / 07!)
xi = (xi * _x) >> _precision;
res += xi * 0x0000a9e39e257a09ca2d6db51000000; // add x^08 * (33! / 08!)
xi = (xi * _x) >> _precision;
res += xi * 0x000012e066e7b839fa050c309000000; // add x^09 * (33! / 09!)
xi = (xi * _x) >> _precision;
res += xi * 0x000001e33d7d926c329a1ad1a800000; // add x^10 * (33! / 10!)
xi = (xi * _x) >> _precision;
res += xi * 0x0000002bee513bdb4a6b19b5f800000; // add x^11 * (33! / 11!)
xi = (xi * _x) >> _precision;
res += xi * 0x00000003a9316fa79b88eccf2a00000; // add x^12 * (33! / 12!)
xi = (xi * _x) >> _precision;
res += xi * 0x0000000048177ebe1fa812375200000; // add x^13 * (33! / 13!)
xi = (xi * _x) >> _precision;
res += xi * 0x0000000005263fe90242dcbacf00000; // add x^14 * (33! / 14!)
xi = (xi * _x) >> _precision;
res += xi * 0x000000000057e22099c030d94100000; // add x^15 * (33! / 15!)
xi = (xi * _x) >> _precision;
res += xi * 0x0000000000057e22099c030d9410000; // add x^16 * (33! / 16!)
xi = (xi * _x) >> _precision;
res += xi * 0x00000000000052b6b54569976310000; // add x^17 * (33! / 17!)
xi = (xi * _x) >> _precision;
res += xi * 0x00000000000004985f67696bf748000; // add x^18 * (33! / 18!)
xi = (xi * _x) >> _precision;
res += xi * 0x000000000000003dea12ea99e498000; // add x^19 * (33! / 19!)
xi = (xi * _x) >> _precision;
res += xi * 0x00000000000000031880f2214b6e000; // add x^20 * (33! / 20!)
xi = (xi * _x) >> _precision;
res += xi * 0x000000000000000025bcff56eb36000; // add x^21 * (33! / 21!)
xi = (xi * _x) >> _precision;
res += xi * 0x000000000000000001b722e10ab1000; // add x^22 * (33! / 22!)
xi = (xi * _x) >> _precision;
res += xi * 0x0000000000000000001317c70077000; // add x^23 * (33! / 23!)
xi = (xi * _x) >> _precision;
res += xi * 0x00000000000000000000cba84aafa00; // add x^24 * (33! / 24!)
xi = (xi * _x) >> _precision;
res += xi * 0x00000000000000000000082573a0a00; // add x^25 * (33! / 25!)
xi = (xi * _x) >> _precision;
res += xi * 0x00000000000000000000005035ad900; // add x^26 * (33! / 26!)
xi = (xi * _x) >> _precision;
res += xi * 0x000000000000000000000002f881b00; // add x^27 * (33! / 27!)
xi = (xi * _x) >> _precision;
res += xi * 0x0000000000000000000000001b29340; // add x^28 * (33! / 28!)
xi = (xi * _x) >> _precision;
res += xi * 0x00000000000000000000000000efc40; // add x^29 * (33! / 29!)
xi = (xi * _x) >> _precision;
res += xi * 0x0000000000000000000000000007fe0; // add x^30 * (33! / 30!)
xi = (xi * _x) >> _precision;
res += xi * 0x0000000000000000000000000000420; // add x^31 * (33! / 31!)
xi = (xi * _x) >> _precision;
res += xi * 0x0000000000000000000000000000021; // add x^32 * (33! / 32!)
xi = (xi * _x) >> _precision;
res += xi * 0x0000000000000000000000000000001; // add x^33 * (33! / 33!)
return res / 0x688589cc0e9505e2f2fee5580000000 + _x + (ONE << _precision); // divide by 33! and then add x^1 / 1! + x^0 / 0!
}
/**
* @dev computes log(x / FIXED_1) * FIXED_1
* Input range: FIXED_1 <= x <= OPT_LOG_MAX_VAL - 1
* Auto-generated via 'PrintFunctionOptimalLog.py'
* Detailed description:
* - Rewrite the input as a product of natural exponents and a single residual r, such that 1 < r < 2
* - The natural logarithm of each (pre-calculated) exponent is the degree of the exponent
* - The natural logarithm of r is calculated via Taylor series for log(1 + x), where x = r - 1
* - The natural logarithm of the input is calculated by summing up the intermediate results above
* - For example: log(250) = log(e^4 * e^1 * e^0.5 * 1.021692859) = 4 + 1 + 0.5 + log(1 + 0.021692859)
*/
function optimalLog(uint256 x) internal pure returns (uint256) {
uint256 res = 0;
uint256 y;
uint256 z;
uint256 w;
if (x >= 0xd3094c70f034de4b96ff7d5b6f99fcd8) {
res += 0x40000000000000000000000000000000;
x = (x * FIXED_1) / 0xd3094c70f034de4b96ff7d5b6f99fcd8;
} // add 1 / 2^1
if (x >= 0xa45af1e1f40c333b3de1db4dd55f29a7) {
res += 0x20000000000000000000000000000000;
x = (x * FIXED_1) / 0xa45af1e1f40c333b3de1db4dd55f29a7;
} // add 1 / 2^2
if (x >= 0x910b022db7ae67ce76b441c27035c6a1) {
res += 0x10000000000000000000000000000000;
x = (x * FIXED_1) / 0x910b022db7ae67ce76b441c27035c6a1;
} // add 1 / 2^3
if (x >= 0x88415abbe9a76bead8d00cf112e4d4a8) {
res += 0x08000000000000000000000000000000;
x = (x * FIXED_1) / 0x88415abbe9a76bead8d00cf112e4d4a8;
} // add 1 / 2^4
if (x >= 0x84102b00893f64c705e841d5d4064bd3) {
res += 0x04000000000000000000000000000000;
x = (x * FIXED_1) / 0x84102b00893f64c705e841d5d4064bd3;
} // add 1 / 2^5
if (x >= 0x8204055aaef1c8bd5c3259f4822735a2) {
res += 0x02000000000000000000000000000000;
x = (x * FIXED_1) / 0x8204055aaef1c8bd5c3259f4822735a2;
} // add 1 / 2^6
if (x >= 0x810100ab00222d861931c15e39b44e99) {
res += 0x01000000000000000000000000000000;
x = (x * FIXED_1) / 0x810100ab00222d861931c15e39b44e99;
} // add 1 / 2^7
if (x >= 0x808040155aabbbe9451521693554f733) {
res += 0x00800000000000000000000000000000;
x = (x * FIXED_1) / 0x808040155aabbbe9451521693554f733;
} // add 1 / 2^8
z = y = x - FIXED_1;
w = (y * y) / FIXED_1;
res += (z * (0x100000000000000000000000000000000 - y)) / 0x100000000000000000000000000000000;
z = (z * w) / FIXED_1; // add y^01 / 01 - y^02 / 02
res += (z * (0x0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - y)) / 0x200000000000000000000000000000000;
z = (z * w) / FIXED_1; // add y^03 / 03 - y^04 / 04
res += (z * (0x099999999999999999999999999999999 - y)) / 0x300000000000000000000000000000000;
z = (z * w) / FIXED_1; // add y^05 / 05 - y^06 / 06
res += (z * (0x092492492492492492492492492492492 - y)) / 0x400000000000000000000000000000000;
z = (z * w) / FIXED_1; // add y^07 / 07 - y^08 / 08
res += (z * (0x08e38e38e38e38e38e38e38e38e38e38e - y)) / 0x500000000000000000000000000000000;
z = (z * w) / FIXED_1; // add y^09 / 09 - y^10 / 10
res += (z * (0x08ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b - y)) / 0x600000000000000000000000000000000;
z = (z * w) / FIXED_1; // add y^11 / 11 - y^12 / 12
res += (z * (0x089d89d89d89d89d89d89d89d89d89d89 - y)) / 0x700000000000000000000000000000000;
z = (z * w) / FIXED_1; // add y^13 / 13 - y^14 / 14
res += (z * (0x088888888888888888888888888888888 - y)) / 0x800000000000000000000000000000000; // add y^15 / 15 - y^16 / 16
return res;
}
/**
* @dev computes e ^ (x / FIXED_1) * FIXED_1
* input range: 0 <= x <= OPT_EXP_MAX_VAL - 1
* auto-generated via 'PrintFunctionOptimalExp.py'
* Detailed description:
* - Rewrite the input as a sum of binary exponents and a single residual r, as small as possible
* - The exponentiation of each binary exponent is given (pre-calculated)
* - The exponentiation of r is calculated via Taylor series for e^x, where x = r
* - The exponentiation of the input is calculated by multiplying the intermediate results above
* - For example: e^5.521692859 = e^(4 + 1 + 0.5 + 0.021692859) = e^4 * e^1 * e^0.5 * e^0.021692859
*/
function optimalExp(uint256 x) internal pure returns (uint256) {
uint256 res = 0;
uint256 y;
uint256 z;
z = y = x % 0x10000000000000000000000000000000; // get the input modulo 2^(-3)
z = (z * y) / FIXED_1;
res += z * 0x10e1b3be415a0000; // add y^02 * (20! / 02!)
z = (z * y) / FIXED_1;
res += z * 0x05a0913f6b1e0000; // add y^03 * (20! / 03!)
z = (z * y) / FIXED_1;
res += z * 0x0168244fdac78000; // add y^04 * (20! / 04!)
z = (z * y) / FIXED_1;
res += z * 0x004807432bc18000; // add y^05 * (20! / 05!)
z = (z * y) / FIXED_1;
res += z * 0x000c0135dca04000; // add y^06 * (20! / 06!)
z = (z * y) / FIXED_1;
res += z * 0x0001b707b1cdc000; // add y^07 * (20! / 07!)
z = (z * y) / FIXED_1;
res += z * 0x000036e0f639b800; // add y^08 * (20! / 08!)
z = (z * y) / FIXED_1;
res += z * 0x00000618fee9f800; // add y^09 * (20! / 09!)
z = (z * y) / FIXED_1;
res += z * 0x0000009c197dcc00; // add y^10 * (20! / 10!)
z = (z * y) / FIXED_1;
res += z * 0x0000000e30dce400; // add y^11 * (20! / 11!)
z = (z * y) / FIXED_1;
res += z * 0x000000012ebd1300; // add y^12 * (20! / 12!)
z = (z * y) / FIXED_1;
res += z * 0x0000000017499f00; // add y^13 * (20! / 13!)
z = (z * y) / FIXED_1;
res += z * 0x0000000001a9d480; // add y^14 * (20! / 14!)
z = (z * y) / FIXED_1;
res += z * 0x00000000001c6380; // add y^15 * (20! / 15!)
z = (z * y) / FIXED_1;
res += z * 0x000000000001c638; // add y^16 * (20! / 16!)
z = (z * y) / FIXED_1;
res += z * 0x0000000000001ab8; // add y^17 * (20! / 17!)
z = (z * y) / FIXED_1;
res += z * 0x000000000000017c; // add y^18 * (20! / 18!)
z = (z * y) / FIXED_1;
res += z * 0x0000000000000014; // add y^19 * (20! / 19!)
z = (z * y) / FIXED_1;
res += z * 0x0000000000000001; // add y^20 * (20! / 20!)
res = res / 0x21c3677c82b40000 + y + FIXED_1; // divide by 20! and then add y^1 / 1! + y^0 / 0!
if ((x & 0x010000000000000000000000000000000) != 0)
res = (res * 0x1c3d6a24ed82218787d624d3e5eba95f9) / 0x18ebef9eac820ae8682b9793ac6d1e776; // multiply by e^2^(-3)
if ((x & 0x020000000000000000000000000000000) != 0)
res = (res * 0x18ebef9eac820ae8682b9793ac6d1e778) / 0x1368b2fc6f9609fe7aceb46aa619baed4; // multiply by e^2^(-2)
if ((x & 0x040000000000000000000000000000000) != 0)
res = (res * 0x1368b2fc6f9609fe7aceb46aa619baed5) / 0x0bc5ab1b16779be3575bd8f0520a9f21f; // multiply by e^2^(-1)
if ((x & 0x080000000000000000000000000000000) != 0)
res = (res * 0x0bc5ab1b16779be3575bd8f0520a9f21e) / 0x0454aaa8efe072e7f6ddbab84b40a55c9; // multiply by e^2^(+0)
if ((x & 0x100000000000000000000000000000000) != 0)
res = (res * 0x0454aaa8efe072e7f6ddbab84b40a55c5) / 0x00960aadc109e7a3bf4578099615711ea; // multiply by e^2^(+1)
if ((x & 0x200000000000000000000000000000000) != 0)
res = (res * 0x00960aadc109e7a3bf4578099615711d7) / 0x0002bf84208204f5977f9a8cf01fdce3d; // multiply by e^2^(+2)
if ((x & 0x400000000000000000000000000000000) != 0)
res = (res * 0x0002bf84208204f5977f9a8cf01fdc307) / 0x0000003c6ab775dd0b95b4cbee7e65d11; // multiply by e^2^(+3)
return res;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.4.22 <0.9.0;
library console {
address constant CONSOLE_ADDRESS =
0x000000000000000000636F6e736F6c652e6c6f67;
function _sendLogPayloadImplementation(bytes memory payload) internal view {
address consoleAddress = CONSOLE_ADDRESS;
/// @solidity memory-safe-assembly
assembly {
pop(
staticcall(
gas(),
consoleAddress,
add(payload, 32),
mload(payload),
0,
0
)
)
}
}
function _castToPure(
function(bytes memory) internal view fnIn
) internal pure returns (function(bytes memory) pure fnOut) {
assembly {
fnOut := fnIn
}
}
function _sendLogPayload(bytes memory payload) internal pure {
_castToPure(_sendLogPayloadImplementation)(payload);
}
function log() internal pure {
_sendLogPayload(abi.encodeWithSignature("log()"));
}
function logInt(int256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
}
function logUint(uint256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function logString(string memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function logBool(bool p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function logAddress(address p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function logBytes(bytes memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
}
function logBytes1(bytes1 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
}
function logBytes2(bytes2 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
}
function logBytes3(bytes3 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
}
function logBytes4(bytes4 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
}
function logBytes5(bytes5 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
}
function logBytes6(bytes6 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
}
function logBytes7(bytes7 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
}
function logBytes8(bytes8 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
}
function logBytes9(bytes9 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
}
function logBytes10(bytes10 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
}
function logBytes11(bytes11 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
}
function logBytes12(bytes12 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
}
function logBytes13(bytes13 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
}
function logBytes14(bytes14 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
}
function logBytes15(bytes15 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
}
function logBytes16(bytes16 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
}
function logBytes17(bytes17 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
}
function logBytes18(bytes18 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
}
function logBytes19(bytes19 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
}
function logBytes20(bytes20 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
}
function logBytes21(bytes21 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
}
function logBytes22(bytes22 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
}
function logBytes23(bytes23 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
}
function logBytes24(bytes24 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
}
function logBytes25(bytes25 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
}
function logBytes26(bytes26 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
}
function logBytes27(bytes27 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
}
function logBytes28(bytes28 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
}
function logBytes29(bytes29 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
}
function logBytes30(bytes30 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
}
function logBytes31(bytes31 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
}
function logBytes32(bytes32 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
}
function log(uint256 p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256)", p0));
}
function log(string memory p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
}
function log(bool p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
}
function log(address p0) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
}
function log(uint256 p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
}
function log(uint256 p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1));
}
function log(uint256 p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1));
}
function log(uint256 p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1));
}
function log(string memory p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1));
}
function log(string memory p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
}
function log(string memory p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
}
function log(string memory p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
}
function log(bool p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1));
}
function log(bool p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
}
function log(bool p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
}
function log(bool p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
}
function log(address p0, uint256 p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1));
}
function log(address p0, string memory p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
}
function log(address p0, bool p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
}
function log(address p0, address p1) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
}
function log(uint256 p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2));
}
function log(uint256 p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2));
}
function log(uint256 p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2));
}
function log(uint256 p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2));
}
function log(uint256 p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2));
}
function log(uint256 p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2));
}
function log(uint256 p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2));
}
function log(uint256 p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2));
}
function log(uint256 p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2));
}
function log(uint256 p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2));
}
function log(string memory p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2));
}
function log(string memory p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2));
}
function log(string memory p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
}
function log(string memory p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
}
function log(string memory p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
}
function log(string memory p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2));
}
function log(string memory p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
}
function log(string memory p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
}
function log(string memory p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
}
function log(string memory p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2));
}
function log(string memory p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
}
function log(string memory p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
}
function log(string memory p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
}
function log(bool p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
}
function log(bool p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2));
}
function log(bool p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2));
}
function log(bool p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2));
}
function log(bool p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2));
}
function log(bool p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
}
function log(bool p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
}
function log(bool p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
}
function log(bool p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2));
}
function log(bool p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
}
function log(bool p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
}
function log(bool p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
}
function log(bool p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2));
}
function log(bool p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
}
function log(bool p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
}
function log(bool p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
}
function log(address p0, uint256 p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
}
function log(address p0, uint256 p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2));
}
function log(address p0, uint256 p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2));
}
function log(address p0, uint256 p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2));
}
function log(address p0, string memory p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2));
}
function log(address p0, string memory p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
}
function log(address p0, string memory p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
}
function log(address p0, string memory p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
}
function log(address p0, bool p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2));
}
function log(address p0, bool p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
}
function log(address p0, bool p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
}
function log(address p0, bool p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
}
function log(address p0, address p1, uint256 p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2));
}
function log(address p0, address p1, string memory p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
}
function log(address p0, address p1, bool p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
}
function log(address p0, address p1, address p2) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
}
function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3));
}
function log(uint256 p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
}
function log(string memory p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
}
function log(bool p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3));
}
function log(address p0, uint256 p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
}
function log(address p0, string memory p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
}
function log(address p0, bool p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, uint256 p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, string memory p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, bool p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, uint256 p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, string memory p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, bool p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
}
function log(address p0, address p1, address p2, address p3) internal pure {
_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
}
}{
"optimizer": {
"enabled": true,
"runs": 1000000
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"formula_","type":"address"},{"internalType":"address","name":"listingManager_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"string","name":"nickname","type":"string"},{"indexed":false,"internalType":"string","name":"profilePicture","type":"string"}],"name":"AccountInfoUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":true,"internalType":"address","name":"memecoin","type":"address"}],"name":"MemeCoinDeployed","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accounts","outputs":[{"internalType":"string","name":"nickname","type":"string"},{"internalType":"string","name":"profilePicture","type":"string"},{"internalType":"uint256","name":"createdMemecoinsCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"allMemecoins","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allMemecoinsCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint96","name":"cap","type":"uint96"},{"internalType":"uint16","name":"powerN","type":"uint16"},{"internalType":"uint16","name":"powerD","type":"uint16"},{"internalType":"uint16","name":"factorN","type":"uint16"},{"internalType":"uint16","name":"factorD","type":"uint16"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"image","type":"string"}],"name":"deploy","outputs":[{"internalType":"address","name":"memecoin","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"erc20Parameters","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"internalType":"struct IERC20ParametersPacker.ERC20Parameters","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"formula","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"}],"name":"getAddress","outputs":[{"internalType":"address","name":"memecoin","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"memecoin","type":"address"}],"name":"isMemeCoinLegit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"listingManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"memecoinsByCreators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"nicknamesToAccounts","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"parameters","outputs":[{"internalType":"address","name":"listingManager","type":"address"},{"internalType":"uint96","name":"cap","type":"uint96"},{"internalType":"address","name":"formula","type":"address"},{"internalType":"uint16","name":"powerN","type":"uint16"},{"internalType":"uint16","name":"powerD","type":"uint16"},{"internalType":"uint16","name":"factorN","type":"uint16"},{"internalType":"uint16","name":"factorD","type":"uint16"},{"internalType":"uint32","name":"coinIndex","type":"uint32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"image","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nickname","type":"string"},{"internalType":"string","name":"profilePicture","type":"string"}],"name":"updateAccountInfo","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60c06040523480156200001157600080fd5b506040516200454838038062004548833981016040819052620000349162000069565b6001600160a01b039182166080521660a052620000a1565b80516001600160a01b03811681146200006457600080fd5b919050565b600080604083850312156200007d57600080fd5b62000088836200004c565b915062000098602084016200004c565b90509250929050565b60805160a051614473620000d5600039600081816103540152610e170152600081816101620152610e6901526144736000f3fe608060405260043610620000e35760003560e01c8063890357301162000089578063edd153331162000060578063edd153331462000294578063f9e59f6514620002c9578063fda20c32146200031b578063fdbddd56146200034057600080fd5b8063890357301462000217578063bf40fac11462000248578063c7f17525146200026d57600080fd5b80635e5c06e211620000be5780635e5c06e214620001845780636a94eb6514620001ba578063782d23e014620001f057600080fd5b806316a8864614620000e85780632617f22514620001375780634b75f54f146200014e575b600080fd5b348015620000f557600080fd5b506200010d620001073660046200130c565b62000376565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6200010d620001483660046200144b565b620003bc565b3480156200015b57600080fd5b506200010d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156200019157600080fd5b50620001a9620001a336600462001563565b620004de565b6040516200012e93929190620015fa565b348015620001c757600080fd5b50620001df620001d936600462001563565b62000620565b60405190151581526020016200012e565b348015620001fd57600080fd5b506200020862000719565b6040516200012e919062001634565b3480156200022457600080fd5b506200022f62000873565b6040516200012e9b9a9998979695949392919062001698565b3480156200025557600080fd5b506200010d620002673660046200175b565b62000a87565b3480156200027a57600080fd5b50620002926200028c3660046200179c565b62000bb5565b005b348015620002a157600080fd5b50600054620002b39063ffffffff1681565b60405163ffffffff90911681526020016200012e565b348015620002d657600080fd5b506200010d620002e83660046200175b565b8051602081830181018051600a8252928201919093012091525473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200032857600080fd5b506200010d6200033a36600462001807565b62000dd2565b3480156200034d57600080fd5b506200010d7f000000000000000000000000000000000000000000000000000000000000000081565b600b60205281600052604060002081815481106200039357600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b6000620003c98462000a87565b73ffffffffffffffffffffffffffffffffffffffff163b156200044d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f53796d626f6c20697320616c726561647920757365640000000000000000000060448201526064015b60405180910390fd5b620004608a8a8a8a8a8a8a8a8a62000e0a565b33600090815260096020908152604080832060020180546001908101909155600b835290832080549182018155835291200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559a9950505050505050505050565b600960205260009081526040902080548190620004fb9062001821565b80601f0160208091040260200160405190810160405280929190818152602001828054620005299062001821565b80156200057a5780601f106200054e576101008083540402835291602001916200057a565b820191906000526020600020905b8154815290600101906020018083116200055c57829003601f168201915b505050505090806001018054620005919062001821565b80601f0160208091040260200160405190810160405280929190818152602001828054620005bf9062001821565b8015620006105780601f10620005e45761010080835404028352916020019162000610565b820191906000526020600020905b815481529060010190602001808311620005f257829003601f168201915b5050505050908060020154905083565b60008173ffffffffffffffffffffffffffffffffffffffff16632604772c6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015620006aa575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252620006a79181019062001876565b60015b620006b757506000919050565b8273ffffffffffffffffffffffffffffffffffffffff1660088263ffffffff1681548110620006ea57620006ea6200189e565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16149392505050565b919050565b604080518082019091526060808252602082015260016040518060400160405290816000820180546200074c9062001821565b80601f01602080910402602001604051908101604052809291908181526020018280546200077a9062001821565b8015620007cb5780601f106200079f57610100808354040283529160200191620007cb565b820191906000526020600020905b815481529060010190602001808311620007ad57829003601f168201915b50505050508152602001600182018054620007e69062001821565b80601f0160208091040260200160405190810160405280929190818152602001828054620008149062001821565b8015620008655780601f10620008395761010080835404028352916020019162000865565b820191906000526020600020905b8154815290600101906020018083116200084757829003601f168201915b505050505081525050905090565b600380546004546005546006805473ffffffffffffffffffffffffffffffffffffffff8086169674010000000000000000000000000000000000000000968790046bffffffffffffffffffffffff16968287169690810461ffff908116967601000000000000000000000000000000000000000000008304821696780100000000000000000000000000000000000000000000000084048316967a0100000000000000000000000000000000000000000000000000008504909316957c010000000000000000000000000000000000000000000000000000000090940463ffffffff1694939091169291620009689062001821565b80601f0160208091040260200160405190810160405280929190818152602001828054620009969062001821565b8015620009e75780601f10620009bb57610100808354040283529160200191620009e7565b820191906000526020600020905b815481529060010190602001808311620009c957829003601f168201915b505050505090806004018054620009fe9062001821565b80601f016020809104026020016040519081016040528092919081815260200182805462000a2c9062001821565b801562000a7d5780601f1062000a515761010080835404028352916020019162000a7d565b820191906000526020600020905b81548152906001019060200180831162000a5f57829003601f168201915b505050505090508b565b6000808280519060200120905060ff60f81b30826040518060200162000aad906200127c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262000aef9190602001620018cd565b6040516020818303038152906040528051906020012060405160200162000b7894939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b600073ffffffffffffffffffffffffffffffffffffffff16600a8360405162000bdf9190620018cd565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff16148062000c5e57503373ffffffffffffffffffffffffffffffffffffffff16600a8360405162000c369190620018cd565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff16145b62000cc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e69636b6e616d65206578697374730000000000000000000000000000000000604482015260640162000444565b33600090815260096020526040902062000ce1838262001940565b5033600090815260096020526040902060010162000d00828262001940565b5033600a8360405162000d149190620018cd565b908152604051908190036020018120805473ffffffffffffffffffffffffffffffffffffffff939093167fffffffffffffffffffffffff00000000000000000000000000000000000000009093169290921790915562000d76908390620018cd565b60405180910390203373ffffffffffffffffffffffffffffffffffffffff167f4ef985a94267da3f7f443f08c8b91352196e51b6ff864b17a681bedd1d52727f8360405162000dc6919062001a67565b60405180910390a35050565b6008818154811062000de357600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60408051610160810182527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff9081168083526bffffffffffffffffffffffff8d16602084018190527f000000000000000000000000000000000000000000000000000000000000000090921693830184905261ffff8c8116606085018190528c8216608086018190528c831660a08701819052928c1660c087018190526000805463ffffffff1660e08901819052336101008a018190526101208a018d90526101408a018c9052740100000000000000000000000000000000000000009889029097176003908155600480547fffffffffffffffffffff0000000000000000000000000000000000000000000016909b1798909502979097177fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff167601000000000000000000000000000000000000000000009093027fffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffff169290921778010000000000000000000000000000000000000000000000009094029390931779ffffffffffffffffffffffffffffffffffffffffffffffffffff167a0100000000000000000000000000000000000000000000000000009093027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16929092177c010000000000000000000000000000000000000000000000000000000090940293909317909455600580547fffffffffffffffffffffffff000000000000000000000000000000000000000016909117905560066200107a868262001940565b50610140820151600482019062001092908262001940565b505060408051808201909152868152602081018690529050600180620010b9888262001940565b5060208201516001820190620010d0908262001940565b50905050838051906020012034604051620010eb906200127c565b82906040518091039083f5915050801580156200110c573d6000803e3d6000fd5b50600060038181556004829055600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055919250620011516006826200128a565b620011616004830160006200128a565b506001905060006200117482826200128a565b620011846001830160006200128a565b505060405173ffffffffffffffffffffffffffffffffffffffff82169033907fcceb4c64f280681aded6878f548bfcbdd7092772e58d94d18d40c23c3702e60c90600090a3600880546001808201835560009283527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee390910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851617905581547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000811663ffffffff918216909201161790559998505050505050505050565b6129c18062001a7d83390190565b508054620012989062001821565b6000825580601f10620012a9575050565b601f016020900490600052602060002090810190620012c99190620012cc565b50565b5b80821115620012e35760008155600101620012cd565b5090565b803573ffffffffffffffffffffffffffffffffffffffff811681146200071457600080fd5b600080604083850312156200132057600080fd5b6200132b83620012e7565b946020939093013593505050565b80356bffffffffffffffffffffffff811681146200071457600080fd5b803561ffff811681146200071457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112620013aa57600080fd5b813567ffffffffffffffff80821115620013c857620013c862001369565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171562001411576200141162001369565b816040528381528660208588010111156200142b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060008060006101208a8c0312156200146b57600080fd5b620014768a62001339565b98506200148660208b0162001356565b97506200149660408b0162001356565b9650620014a660608b0162001356565b9550620014b660808b0162001356565b945060a08a013567ffffffffffffffff80821115620014d457600080fd5b620014e28d838e0162001398565b955060c08c0135915080821115620014f957600080fd5b620015078d838e0162001398565b945060e08c01359150808211156200151e57600080fd5b6200152c8d838e0162001398565b93506101008c01359150808211156200154457600080fd5b50620015538c828d0162001398565b9150509295985092959850929598565b6000602082840312156200157657600080fd5b6200158182620012e7565b9392505050565b60005b83811015620015a55781810151838201526020016200158b565b50506000910152565b60008151808452620015c881602086016020860162001588565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6060815260006200160f6060830186620015ae565b8281036020840152620016238186620015ae565b915050826040830152949350505050565b602081526000825160406020840152620016526060840182620015ae565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526200168f8282620015ae565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8c811682526bffffffffffffffffffffffff8c1660208301528a16604082015261ffff8981166060830152888116608083015287811660a0830152861660c082015263ffffffff851660e0820152600061016073ffffffffffffffffffffffffffffffffffffffff8616610100840152806101208401526200173281840186620015ae565b9050828103610140840152620017498185620015ae565b9e9d5050505050505050505050505050565b6000602082840312156200176e57600080fd5b813567ffffffffffffffff8111156200178657600080fd5b620017948482850162001398565b949350505050565b60008060408385031215620017b057600080fd5b823567ffffffffffffffff80821115620017c957600080fd5b620017d78683870162001398565b93506020850135915080821115620017ee57600080fd5b50620017fd8582860162001398565b9150509250929050565b6000602082840312156200181a57600080fd5b5035919050565b600181811c908216806200183657607f821691505b60208210810362001870577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156200188957600080fd5b815163ffffffff811681146200158157600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008251620018e181846020870162001588565b9190910192915050565b601f8211156200193b576000816000526020600020601f850160051c81016020861015620019165750805b601f850160051c820191505b81811015620019375782815560010162001922565b5050505b505050565b815167ffffffffffffffff8111156200195d576200195d62001369565b62001975816200196e845462001821565b84620018eb565b602080601f831160018114620019cb5760008415620019945750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855562001937565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101562001a1a57888601518255948401946001909101908401620019f9565b508582101562001a5757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000620015816020830184620015ae56fe61018060408190526303c1691f60e51b8152339063782d23e09061018490600090600481865afa15801562000038573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000062919081019062000906565b80516020820151600362000077838262000a45565b50600462000086828262000a45565b5050505060006200009c6200020a60201b60201c565b9050806001600160a01b031663890357306040518163ffffffff1660e01b8152600401600060405180830381865afa158015620000dd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000107919081019062000b6e565b6005600060068160076200011c868262000a45565b506200012b9050858262000a45565b506001600160a01b039485166101605263ffffffff959095166101405261ffff9586166101205295851661010090815296851660e05250509490911660c05293831660a05280549390910a6001600160601b03818102199094169484160293909317909255911660805260055416620001eb5760405162461bcd60e51b815260206004820152601560248201527f506f73697469766520636170206578706563746564000000000000000000000060448201526064015b60405180910390fd5b3415620002035761016051620002039060006200020e565b5062000d50565b3390565b60055434906001600160601b0316478181106200022d57818103909203915b60006200023b843462000310565b9050848110156200028f5760405162461bcd60e51b815260206004820181905260248201527f496e73756666696369656e74206f757470757420746f6b656e20616d6f756e746044820152606401620001e2565b6200029b8682620003ef565b6001600160a01b0386167f94c792774c59479f7bd68442f3af3691c02123a5aabee8b6f9116d8af8aa66698286620002d260025490565b6040805193845260208401929092529082015242606082015260800160405180910390a282471062000308576200030862000433565b505050505050565b60e05160c051610120516101005160a0516040516332833d5160e01b815261ffff93841694860184164788900389018102959095026004820181905292860284166024820181905293909516604486015260648501849052600094919291859182916001600160a01b03909116906332833d51906084016040805180830381865afa158015620003a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ca919062000c8a565b60025460ff9091169190911c670de0b6b3a76400000203955050505050505b92915050565b6001600160a01b0382166200041b5760405163ec442f0560e01b815260006004820152602401620001e2565b620004296000838362000615565b5050565b60025490565b60805160055460009081906001600160a01b0384169063bac95fff906001600160601b03166200046262000748565b6040516001600160e01b031960e085901b1681526001600160601b039092166004830152602482015260440160408051808303816000875af1158015620004ad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004d3919062000cc2565b9092509050620004e683838301620003ef565b60055460405163a226f27960e01b815260048101849052602481018390526001600160a01b0385169163a226f279916001600160601b03909116906044016000604051808303818588803b1580156200053e57600080fd5b505af115801562000553573d6000803e3d6000fd5b505050505060004711156200060057604051600090339047908381818185875af1925050503d8060008114620005a6576040519150601f19603f3d011682016040523d82523d6000602084013e620005ab565b606091505b5050905080620005fe5760405162461bcd60e51b815260206004820152601860248201527f4c6566746f766572207472616e73666572206661696c656400000000000000006044820152606401620001e2565b505b5050600580546001600160601b031916905550565b6001600160a01b0383166200064457806002600082825462000638919062000cfd565b90915550620006b89050565b6001600160a01b03831660009081526020819052604090205481811015620006995760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620001e2565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620006d657600280548290039055620006f5565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200073b91815260200190565b60405180910390a3505050565b600080600060a0516001600160a01b03166332833d516200076e6200042d60201b60201c565b60c05160e080516040519185901b6001600160e01b03191682526004820193909352670de0b6b3a7640000602482015261ffff9182166044820152911660648201526084016040805180830381865afa158015620007d0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007f6919062000c8a565b915091506101205161ffff166101005161ffff168260ff1684901c6200081d919062000d13565b62000829919062000d2d565b9250505090565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000871576200087162000830565b604052919050565b600082601f8301126200088b57600080fd5b81516001600160401b03811115620008a757620008a762000830565b6020620008bd601f8301601f1916820162000846565b8281528582848701011115620008d257600080fd5b60005b83811015620008f2578581018301518282018401528201620008d5565b506000928101909101919091529392505050565b6000602082840312156200091957600080fd5b81516001600160401b03808211156200093157600080fd5b90830190604082860312156200094657600080fd5b60405160408101818110838211171562000964576200096462000830565b6040528251828111156200097757600080fd5b620009858782860162000879565b8252506020830151828111156200099b57600080fd5b620009a98782860162000879565b60208301525095945050505050565b600181811c90821680620009cd57607f821691505b602082108103620009ee57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a40576000816000526020600020601f850160051c8101602086101562000a1f5750805b601f850160051c820191505b81811015620003085782815560010162000a2b565b505050565b81516001600160401b0381111562000a615762000a6162000830565b62000a798162000a728454620009b8565b84620009f4565b602080601f83116001811462000ab1576000841562000a985750858301515b600019600386901b1c1916600185901b17855562000308565b600085815260208120601f198616915b8281101562000ae25788860151825594840194600190910190840162000ac1565b508582101562000b015787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80516001600160a01b038116811462000b2957600080fd5b919050565b80516001600160601b038116811462000b2957600080fd5b805161ffff8116811462000b2957600080fd5b805163ffffffff8116811462000b2957600080fd5b60008060008060008060008060008060006101608c8e03121562000b9157600080fd5b62000b9c8c62000b11565b9a5062000bac60208d0162000b2e565b995062000bbc60408d0162000b11565b985062000bcc60608d0162000b46565b975062000bdc60808d0162000b46565b965062000bec60a08d0162000b46565b955062000bfc60c08d0162000b46565b945062000c0c60e08d0162000b59565b935062000c1d6101008d0162000b11565b6101208d01519093506001600160401b0381111562000c3b57600080fd5b62000c498e828f0162000879565b6101408e015190935090506001600160401b0381111562000c6957600080fd5b62000c778e828f0162000879565b9150509295989b509295989b9093969950565b6000806040838503121562000c9e57600080fd5b82519150602083015160ff8116811462000cb757600080fd5b809150509250929050565b6000806040838503121562000cd657600080fd5b505080516020909101519092909150565b634e487b7160e01b600052601160045260246000fd5b80820180821115620003e957620003e962000ce7565b8082028115828204841417620003e957620003e962000ce7565b60008262000d4b57634e487b7160e01b600052601260045260246000fd5b500490565b60805160a05160c05160e05161010051610120516101405161016051611b9462000e2d6000396000610387015260006102260152600081816104cb01528181610a7601528181610cd8015261104b0152600081816104a101528181610ac001528181610cfd015261107001526000818161047901528181610932015281816109be01528181610a9b01528181610c6a015261101c0152600081816104540152818161091101528181610c420152610ffb0152600081816109ff01528181610bb801526110ae01526000818161057401526115e90152611b946000f3fe6080604052600436106101755760003560e01c80637284e416116100cb578063a10954fe1161007f578063dd62ed3e11610059578063dd62ed3e146104fa578063f3ccaac01461054d578063fdbddd561461056257600080fd5b8063a10954fe1461040b578063a9059cbb1461041e578063afd4c8d61461043e57600080fd5b806395d89b41116100b057806395d89b41146103ce578063a035b1fe146103e3578063a0712d68146103f857600080fd5b80637284e416146103605780638da5cb5b1461037557600080fd5b8063293a7f2e1161012d578063355274ea11610107578063355274ea146102bb57806369fcd4ac146102fd57806370a082311461031d57600080fd5b8063293a7f2e1461025d578063313ce5671461027f578063322d21001461029b57600080fd5b806318160ddd1161015e57806318160ddd146101d557806323b872dd146101f45780632604772c1461021457600080fd5b806306fdde031461017a578063095ea7b3146101a5575b600080fd5b34801561018657600080fd5b5061018f610596565b60405161019c9190611862565b60405180910390f35b3480156101b157600080fd5b506101c56101c03660046118f8565b610628565b604051901515815260200161019c565b3480156101e157600080fd5b506002545b60405190815260200161019c565b34801561020057600080fd5b506101c561020f366004611922565b610642565b34801561022057600080fd5b506102487f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff909116815260200161019c565b34801561026957600080fd5b5061027d61027836600461195e565b610666565b005b34801561028b57600080fd5b506040516012815260200161019c565b3480156102a757600080fd5b506101e66102b6366004611980565b6108fd565b3480156102c757600080fd5b506005546102e0906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff909116815260200161019c565b34801561030957600080fd5b506101e6610318366004611980565b61090a565b34801561032957600080fd5b506101e6610338366004611999565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b34801561036c57600080fd5b5061018f610b14565b34801561038157600080fd5b506103a97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019c565b3480156103da57600080fd5b5061018f610ba2565b3480156103ef57600080fd5b506101e6610bb1565b61027d610406366004611980565b610d42565b34801561041757600080fd5b50476101e6565b34801561042a57600080fd5b506101c56104393660046118f8565b610dc6565b34801561044a57600080fd5b506040805161ffff7f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301527f00000000000000000000000000000000000000000000000000000000000000008116928201929092527f0000000000000000000000000000000000000000000000000000000000000000909116606082015260800161019c565b34801561050657600080fd5b506101e66105153660046119bb565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b34801561055957600080fd5b5061018f610dd4565b34801561056e57600080fd5b506103a97f000000000000000000000000000000000000000000000000000000000000000081565b6060600380546105a5906119ee565b80601f01602080910402602001604051908101604052809291908181526020018280546105d1906119ee565b801561061e5780601f106105f35761010080835404028352916020019161061e565b820191906000526020600020905b81548152906001019060200180831161060157829003601f168201915b5050505050905090565b600033610636818585610de1565b60019150505b92915050565b600033610650858285610df3565b61065b858585610ec2565b506001949350505050565b6005546bffffffffffffffffffffffff166106e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416c7265616479206c697374656400000000000000000000000000000000000060448201526064015b60405180910390fd5b60006106ed60025490565b905080831115610759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f52657469726520416d6f756e74204578636565647320537570706c790000000060448201526064016106d9565b60006107648461090a565b9050828110156107d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e73756666696369656e74206f75747075742045544820616d6f756e74000060448201526064016106d9565b6040513390600090829084908381818185875af1925050503d8060008114610814576040519150601f19603f3d011682016040523d82523d6000602084013e610819565b606091505b5050905080610884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f455448207472616e73666572206661696c65640000000000000000000000000060448201526064016106d9565b61088e8287610f6d565b8173ffffffffffffffffffffffffffffffffffffffff167fb7beb3c4e3f9672320080f6d4256a20ee1ab9dd0c3f763ab3266c4e8b86bb69287856108d160025490565b6040805193845260208401929092529082015242606082015260800160405180910390a2505050505050565b600061063c826000610fcd565b600061ffff7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000000116818361095e60025490565b039050806000036109725750479392505050565b6040517f32833d5100000000000000000000000000000000000000000000000000000000815260048101829052670de0b6b3a7640000602482015263ffffffff8316604482015261ffff7f0000000000000000000000000000000000000000000000000000000000000000166064820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906332833d51906084016040805180830381865afa158015610a45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a699190611a41565b915091508363ffffffff167f000000000000000000000000000000000000000000000000000000000000000061ffff167f000000000000000000000000000000000000000000000000000000000000000061ffff167f000000000000000000000000000000000000000000000000000000000000000061ffff168460ff1686901c020281610af957610af9611a77565b0481610b0757610b07611a77565b0447039695505050505050565b60068054610b21906119ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4d906119ee565b8015610b9a5780601f10610b6f57610100808354040283529160200191610b9a565b820191906000526020600020905b815481529060010190602001808311610b7d57829003601f168201915b505050505081565b6060600480546105a5906119ee565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332833d51610bfb60025490565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526004810191909152670de0b6b3a7640000602482015261ffff7f0000000000000000000000000000000000000000000000000000000000000000811660448301527f00000000000000000000000000000000000000000000000000000000000000001660648201526084016040805180830381865afa158015610cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd29190611a41565b915091507f000000000000000000000000000000000000000000000000000000000000000061ffff167f000000000000000000000000000000000000000000000000000000000000000061ffff168260ff1684901c610d319190611ad5565b610d3b9190611aec565b9250505090565b6005546bffffffffffffffffffffffff16610db9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416c7265616479206c697374656400000000000000000000000000000000000060448201526064016106d9565b610dc33382611172565b50565b600033610636818585610ec2565b60078054610b21906119ee565b610dee8383836001611295565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ebc5781811015610ead576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064016106d9565b610ebc84848484036000611295565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610f12576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016106d9565b73ffffffffffffffffffffffffffffffffffffffff8216610f62576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016106d9565b610dee8383836113dd565b73ffffffffffffffffffffffffffffffffffffffff8216610fbd576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016106d9565b610fc9826000836113dd565b5050565b6040517f32833d5100000000000000000000000000000000000000000000000000000000815260009061ffff7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000090810182169247869003870184027f0000000000000000000000000000000000000000000000000000000000000000841602927f0000000000000000000000000000000000000000000000000000000000000000830216918591829173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916332833d519161110791889188918b90600401938452602084019290925261ffff16604083015263ffffffff16606082015260800190565b6040805180830381865afa158015611123573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111479190611a41565b9150915061115460025490565b60ff9091169190911c670de0b6b3a764000002039695505050505050565b60055434906bffffffffffffffffffffffff164781811061119557818103909203915b60006111a18434610fcd565b90508481101561120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f496e73756666696369656e74206f757470757420746f6b656e20616d6f756e7460448201526064016106d9565b6112178682611588565b8573ffffffffffffffffffffffffffffffffffffffff167f94c792774c59479f7bd68442f3af3691c02123a5aabee8b6f9116d8af8aa6669828661125a60025490565b6040805193845260208401929092529082015242606082015260800160405180910390a282471061128d5761128d6115e4565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff84166112e5576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016106d9565b73ffffffffffffffffffffffffffffffffffffffff8316611335576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016106d9565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602090815260408083209387168352929052208290558015610ebc578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516113cf91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661141557806002600082825461140a9190611b27565b909155506114c79050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020548181101561149b576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016106d9565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff82166114f05760028054829003905561151c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161157b91815260200190565b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff82166115d8576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016106d9565b610fc9600083836113dd565b6005547f000000000000000000000000000000000000000000000000000000000000000090600090819073ffffffffffffffffffffffffffffffffffffffff84169063bac95fff906bffffffffffffffffffffffff16611642610bb1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526bffffffffffffffffffffffff9092166004830152602482015260440160408051808303816000875af11580156116a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cd9190611b3a565b915091506116dd83828401611588565b6005546040517fa226f279000000000000000000000000000000000000000000000000000000008152600481018490526024810183905273ffffffffffffffffffffffffffffffffffffffff85169163a226f279916bffffffffffffffffffffffff909116906044016000604051808303818588803b15801561175f57600080fd5b505af1158015611773573d6000803e3d6000fd5b5050505050600047111561183557604051600090339047908381818185875af1925050503d80600081146117c3576040519150601f19603f3d011682016040523d82523d6000602084013e6117c8565b606091505b5050905080611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4c6566746f766572207472616e73666572206661696c6564000000000000000060448201526064016106d9565b505b5050600580547fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016905550565b60006020808352835180602085015260005b8181101561189057858101830151858201604001528201611874565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146118f357600080fd5b919050565b6000806040838503121561190b57600080fd5b611914836118cf565b946020939093013593505050565b60008060006060848603121561193757600080fd5b611940846118cf565b925061194e602085016118cf565b9150604084013590509250925092565b6000806040838503121561197157600080fd5b50508035926020909101359150565b60006020828403121561199257600080fd5b5035919050565b6000602082840312156119ab57600080fd5b6119b4826118cf565b9392505050565b600080604083850312156119ce57600080fd5b6119d7836118cf565b91506119e5602084016118cf565b90509250929050565b600181811c90821680611a0257607f821691505b602082108103611a3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008060408385031215611a5457600080fd5b82519150602083015160ff81168114611a6c57600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761063c5761063c611aa6565b600082611b22577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082018082111561063c5761063c611aa6565b60008060408385031215611b4d57600080fd5b50508051602090910151909290915056fea264697066735822122001c6dbf9caa22f255b4962a5b332e449495e0688803c7be1cf67cc03acbb871664736f6c63430008180033a2646970667358221220e70512bbc0c74e721eea1a6457791639034031ef604d226081593c6761b8556264736f6c63430008180033000000000000000000000000465e8d95d1b8c70bfffc74e2b04ec1bf640e4dcb0000000000000000000000000a0b696da96b52dca9a85bb38074602d496966ac
Deployed Bytecode
0x608060405260043610620000e35760003560e01c8063890357301162000089578063edd153331162000060578063edd153331462000294578063f9e59f6514620002c9578063fda20c32146200031b578063fdbddd56146200034057600080fd5b8063890357301462000217578063bf40fac11462000248578063c7f17525146200026d57600080fd5b80635e5c06e211620000be5780635e5c06e214620001845780636a94eb6514620001ba578063782d23e014620001f057600080fd5b806316a8864614620000e85780632617f22514620001375780634b75f54f146200014e575b600080fd5b348015620000f557600080fd5b506200010d620001073660046200130c565b62000376565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6200010d620001483660046200144b565b620003bc565b3480156200015b57600080fd5b506200010d7f000000000000000000000000465e8d95d1b8c70bfffc74e2b04ec1bf640e4dcb81565b3480156200019157600080fd5b50620001a9620001a336600462001563565b620004de565b6040516200012e93929190620015fa565b348015620001c757600080fd5b50620001df620001d936600462001563565b62000620565b60405190151581526020016200012e565b348015620001fd57600080fd5b506200020862000719565b6040516200012e919062001634565b3480156200022457600080fd5b506200022f62000873565b6040516200012e9b9a9998979695949392919062001698565b3480156200025557600080fd5b506200010d620002673660046200175b565b62000a87565b3480156200027a57600080fd5b50620002926200028c3660046200179c565b62000bb5565b005b348015620002a157600080fd5b50600054620002b39063ffffffff1681565b60405163ffffffff90911681526020016200012e565b348015620002d657600080fd5b506200010d620002e83660046200175b565b8051602081830181018051600a8252928201919093012091525473ffffffffffffffffffffffffffffffffffffffff1681565b3480156200032857600080fd5b506200010d6200033a36600462001807565b62000dd2565b3480156200034d57600080fd5b506200010d7f0000000000000000000000000a0b696da96b52dca9a85bb38074602d496966ac81565b600b60205281600052604060002081815481106200039357600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff169150829050565b6000620003c98462000a87565b73ffffffffffffffffffffffffffffffffffffffff163b156200044d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f53796d626f6c20697320616c726561647920757365640000000000000000000060448201526064015b60405180910390fd5b620004608a8a8a8a8a8a8a8a8a62000e0a565b33600090815260096020908152604080832060020180546001908101909155600b835290832080549182018155835291200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790559a9950505050505050505050565b600960205260009081526040902080548190620004fb9062001821565b80601f0160208091040260200160405190810160405280929190818152602001828054620005299062001821565b80156200057a5780601f106200054e576101008083540402835291602001916200057a565b820191906000526020600020905b8154815290600101906020018083116200055c57829003601f168201915b505050505090806001018054620005919062001821565b80601f0160208091040260200160405190810160405280929190818152602001828054620005bf9062001821565b8015620006105780601f10620005e45761010080835404028352916020019162000610565b820191906000526020600020905b815481529060010190602001808311620005f257829003601f168201915b5050505050908060020154905083565b60008173ffffffffffffffffffffffffffffffffffffffff16632604772c6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015620006aa575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252620006a79181019062001876565b60015b620006b757506000919050565b8273ffffffffffffffffffffffffffffffffffffffff1660088263ffffffff1681548110620006ea57620006ea6200189e565b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16149392505050565b919050565b604080518082019091526060808252602082015260016040518060400160405290816000820180546200074c9062001821565b80601f01602080910402602001604051908101604052809291908181526020018280546200077a9062001821565b8015620007cb5780601f106200079f57610100808354040283529160200191620007cb565b820191906000526020600020905b815481529060010190602001808311620007ad57829003601f168201915b50505050508152602001600182018054620007e69062001821565b80601f0160208091040260200160405190810160405280929190818152602001828054620008149062001821565b8015620008655780601f10620008395761010080835404028352916020019162000865565b820191906000526020600020905b8154815290600101906020018083116200084757829003601f168201915b505050505081525050905090565b600380546004546005546006805473ffffffffffffffffffffffffffffffffffffffff8086169674010000000000000000000000000000000000000000968790046bffffffffffffffffffffffff16968287169690810461ffff908116967601000000000000000000000000000000000000000000008304821696780100000000000000000000000000000000000000000000000084048316967a0100000000000000000000000000000000000000000000000000008504909316957c010000000000000000000000000000000000000000000000000000000090940463ffffffff1694939091169291620009689062001821565b80601f0160208091040260200160405190810160405280929190818152602001828054620009969062001821565b8015620009e75780601f10620009bb57610100808354040283529160200191620009e7565b820191906000526020600020905b815481529060010190602001808311620009c957829003601f168201915b505050505090806004018054620009fe9062001821565b80601f016020809104026020016040519081016040528092919081815260200182805462000a2c9062001821565b801562000a7d5780601f1062000a515761010080835404028352916020019162000a7d565b820191906000526020600020905b81548152906001019060200180831162000a5f57829003601f168201915b505050505090508b565b6000808280519060200120905060ff60f81b30826040518060200162000aad906200127c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe082820381018352601f90910116604081905262000aef9190602001620018cd565b6040516020818303038152906040528051906020012060405160200162000b7894939291907fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209392505050565b600073ffffffffffffffffffffffffffffffffffffffff16600a8360405162000bdf9190620018cd565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff16148062000c5e57503373ffffffffffffffffffffffffffffffffffffffff16600a8360405162000c369190620018cd565b9081526040519081900360200190205473ffffffffffffffffffffffffffffffffffffffff16145b62000cc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f4e69636b6e616d65206578697374730000000000000000000000000000000000604482015260640162000444565b33600090815260096020526040902062000ce1838262001940565b5033600090815260096020526040902060010162000d00828262001940565b5033600a8360405162000d149190620018cd565b908152604051908190036020018120805473ffffffffffffffffffffffffffffffffffffffff939093167fffffffffffffffffffffffff00000000000000000000000000000000000000009093169290921790915562000d76908390620018cd565b60405180910390203373ffffffffffffffffffffffffffffffffffffffff167f4ef985a94267da3f7f443f08c8b91352196e51b6ff864b17a681bedd1d52727f8360405162000dc6919062001a67565b60405180910390a35050565b6008818154811062000de357600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60408051610160810182527f0000000000000000000000000a0b696da96b52dca9a85bb38074602d496966ac73ffffffffffffffffffffffffffffffffffffffff9081168083526bffffffffffffffffffffffff8d16602084018190527f000000000000000000000000465e8d95d1b8c70bfffc74e2b04ec1bf640e4dcb90921693830184905261ffff8c8116606085018190528c8216608086018190528c831660a08701819052928c1660c087018190526000805463ffffffff1660e08901819052336101008a018190526101208a018d90526101408a018c9052740100000000000000000000000000000000000000009889029097176003908155600480547fffffffffffffffffffff0000000000000000000000000000000000000000000016909b1798909502979097177fffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffffff167601000000000000000000000000000000000000000000009093027fffffffffffff0000ffffffffffffffffffffffffffffffffffffffffffffffff169290921778010000000000000000000000000000000000000000000000009094029390931779ffffffffffffffffffffffffffffffffffffffffffffffffffff167a0100000000000000000000000000000000000000000000000000009093027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16929092177c010000000000000000000000000000000000000000000000000000000090940293909317909455600580547fffffffffffffffffffffffff000000000000000000000000000000000000000016909117905560066200107a868262001940565b50610140820151600482019062001092908262001940565b505060408051808201909152868152602081018690529050600180620010b9888262001940565b5060208201516001820190620010d0908262001940565b50905050838051906020012034604051620010eb906200127c565b82906040518091039083f5915050801580156200110c573d6000803e3d6000fd5b50600060038181556004829055600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055919250620011516006826200128a565b620011616004830160006200128a565b506001905060006200117482826200128a565b620011846001830160006200128a565b505060405173ffffffffffffffffffffffffffffffffffffffff82169033907fcceb4c64f280681aded6878f548bfcbdd7092772e58d94d18d40c23c3702e60c90600090a3600880546001808201835560009283527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee390910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff851617905581547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000811663ffffffff918216909201161790559998505050505050505050565b6129c18062001a7d83390190565b508054620012989062001821565b6000825580601f10620012a9575050565b601f016020900490600052602060002090810190620012c99190620012cc565b50565b5b80821115620012e35760008155600101620012cd565b5090565b803573ffffffffffffffffffffffffffffffffffffffff811681146200071457600080fd5b600080604083850312156200132057600080fd5b6200132b83620012e7565b946020939093013593505050565b80356bffffffffffffffffffffffff811681146200071457600080fd5b803561ffff811681146200071457600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600082601f830112620013aa57600080fd5b813567ffffffffffffffff80821115620013c857620013c862001369565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171562001411576200141162001369565b816040528381528660208588010111156200142b57600080fd5b836020870160208301376000602085830101528094505050505092915050565b60008060008060008060008060006101208a8c0312156200146b57600080fd5b620014768a62001339565b98506200148660208b0162001356565b97506200149660408b0162001356565b9650620014a660608b0162001356565b9550620014b660808b0162001356565b945060a08a013567ffffffffffffffff80821115620014d457600080fd5b620014e28d838e0162001398565b955060c08c0135915080821115620014f957600080fd5b620015078d838e0162001398565b945060e08c01359150808211156200151e57600080fd5b6200152c8d838e0162001398565b93506101008c01359150808211156200154457600080fd5b50620015538c828d0162001398565b9150509295985092959850929598565b6000602082840312156200157657600080fd5b6200158182620012e7565b9392505050565b60005b83811015620015a55781810151838201526020016200158b565b50506000910152565b60008151808452620015c881602086016020860162001588565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6060815260006200160f6060830186620015ae565b8281036020840152620016238186620015ae565b915050826040830152949350505050565b602081526000825160406020840152620016526060840182620015ae565b905060208401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08483030160408501526200168f8282620015ae565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff8c811682526bffffffffffffffffffffffff8c1660208301528a16604082015261ffff8981166060830152888116608083015287811660a0830152861660c082015263ffffffff851660e0820152600061016073ffffffffffffffffffffffffffffffffffffffff8616610100840152806101208401526200173281840186620015ae565b9050828103610140840152620017498185620015ae565b9e9d5050505050505050505050505050565b6000602082840312156200176e57600080fd5b813567ffffffffffffffff8111156200178657600080fd5b620017948482850162001398565b949350505050565b60008060408385031215620017b057600080fd5b823567ffffffffffffffff80821115620017c957600080fd5b620017d78683870162001398565b93506020850135915080821115620017ee57600080fd5b50620017fd8582860162001398565b9150509250929050565b6000602082840312156200181a57600080fd5b5035919050565b600181811c908216806200183657607f821691505b60208210810362001870577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b6000602082840312156200188957600080fd5b815163ffffffff811681146200158157600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008251620018e181846020870162001588565b9190910192915050565b601f8211156200193b576000816000526020600020601f850160051c81016020861015620019165750805b601f850160051c820191505b81811015620019375782815560010162001922565b5050505b505050565b815167ffffffffffffffff8111156200195d576200195d62001369565b62001975816200196e845462001821565b84620018eb565b602080601f831160018114620019cb5760008415620019945750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b17855562001937565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101562001a1a57888601518255948401946001909101908401620019f9565b508582101562001a5757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b602081526000620015816020830184620015ae56fe61018060408190526303c1691f60e51b8152339063782d23e09061018490600090600481865afa15801562000038573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000062919081019062000906565b80516020820151600362000077838262000a45565b50600462000086828262000a45565b5050505060006200009c6200020a60201b60201c565b9050806001600160a01b031663890357306040518163ffffffff1660e01b8152600401600060405180830381865afa158015620000dd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000107919081019062000b6e565b6005600060068160076200011c868262000a45565b506200012b9050858262000a45565b506001600160a01b039485166101605263ffffffff959095166101405261ffff9586166101205295851661010090815296851660e05250509490911660c05293831660a05280549390910a6001600160601b03818102199094169484160293909317909255911660805260055416620001eb5760405162461bcd60e51b815260206004820152601560248201527f506f73697469766520636170206578706563746564000000000000000000000060448201526064015b60405180910390fd5b3415620002035761016051620002039060006200020e565b5062000d50565b3390565b60055434906001600160601b0316478181106200022d57818103909203915b60006200023b843462000310565b9050848110156200028f5760405162461bcd60e51b815260206004820181905260248201527f496e73756666696369656e74206f757470757420746f6b656e20616d6f756e746044820152606401620001e2565b6200029b8682620003ef565b6001600160a01b0386167f94c792774c59479f7bd68442f3af3691c02123a5aabee8b6f9116d8af8aa66698286620002d260025490565b6040805193845260208401929092529082015242606082015260800160405180910390a282471062000308576200030862000433565b505050505050565b60e05160c051610120516101005160a0516040516332833d5160e01b815261ffff93841694860184164788900389018102959095026004820181905292860284166024820181905293909516604486015260648501849052600094919291859182916001600160a01b03909116906332833d51906084016040805180830381865afa158015620003a4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ca919062000c8a565b60025460ff9091169190911c670de0b6b3a76400000203955050505050505b92915050565b6001600160a01b0382166200041b5760405163ec442f0560e01b815260006004820152602401620001e2565b620004296000838362000615565b5050565b60025490565b60805160055460009081906001600160a01b0384169063bac95fff906001600160601b03166200046262000748565b6040516001600160e01b031960e085901b1681526001600160601b039092166004830152602482015260440160408051808303816000875af1158015620004ad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620004d3919062000cc2565b9092509050620004e683838301620003ef565b60055460405163a226f27960e01b815260048101849052602481018390526001600160a01b0385169163a226f279916001600160601b03909116906044016000604051808303818588803b1580156200053e57600080fd5b505af115801562000553573d6000803e3d6000fd5b505050505060004711156200060057604051600090339047908381818185875af1925050503d8060008114620005a6576040519150601f19603f3d011682016040523d82523d6000602084013e620005ab565b606091505b5050905080620005fe5760405162461bcd60e51b815260206004820152601860248201527f4c6566746f766572207472616e73666572206661696c656400000000000000006044820152606401620001e2565b505b5050600580546001600160601b031916905550565b6001600160a01b0383166200064457806002600082825462000638919062000cfd565b90915550620006b89050565b6001600160a01b03831660009081526020819052604090205481811015620006995760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401620001e2565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216620006d657600280548290039055620006f5565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200073b91815260200190565b60405180910390a3505050565b600080600060a0516001600160a01b03166332833d516200076e6200042d60201b60201c565b60c05160e080516040519185901b6001600160e01b03191682526004820193909352670de0b6b3a7640000602482015261ffff9182166044820152911660648201526084016040805180830381865afa158015620007d0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007f6919062000c8a565b915091506101205161ffff166101005161ffff168260ff1684901c6200081d919062000d13565b62000829919062000d2d565b9250505090565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000871576200087162000830565b604052919050565b600082601f8301126200088b57600080fd5b81516001600160401b03811115620008a757620008a762000830565b6020620008bd601f8301601f1916820162000846565b8281528582848701011115620008d257600080fd5b60005b83811015620008f2578581018301518282018401528201620008d5565b506000928101909101919091529392505050565b6000602082840312156200091957600080fd5b81516001600160401b03808211156200093157600080fd5b90830190604082860312156200094657600080fd5b60405160408101818110838211171562000964576200096462000830565b6040528251828111156200097757600080fd5b620009858782860162000879565b8252506020830151828111156200099b57600080fd5b620009a98782860162000879565b60208301525095945050505050565b600181811c90821680620009cd57607f821691505b602082108103620009ee57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a40576000816000526020600020601f850160051c8101602086101562000a1f5750805b601f850160051c820191505b81811015620003085782815560010162000a2b565b505050565b81516001600160401b0381111562000a615762000a6162000830565b62000a798162000a728454620009b8565b84620009f4565b602080601f83116001811462000ab1576000841562000a985750858301515b600019600386901b1c1916600185901b17855562000308565b600085815260208120601f198616915b8281101562000ae25788860151825594840194600190910190840162000ac1565b508582101562000b015787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80516001600160a01b038116811462000b2957600080fd5b919050565b80516001600160601b038116811462000b2957600080fd5b805161ffff8116811462000b2957600080fd5b805163ffffffff8116811462000b2957600080fd5b60008060008060008060008060008060006101608c8e03121562000b9157600080fd5b62000b9c8c62000b11565b9a5062000bac60208d0162000b2e565b995062000bbc60408d0162000b11565b985062000bcc60608d0162000b46565b975062000bdc60808d0162000b46565b965062000bec60a08d0162000b46565b955062000bfc60c08d0162000b46565b945062000c0c60e08d0162000b59565b935062000c1d6101008d0162000b11565b6101208d01519093506001600160401b0381111562000c3b57600080fd5b62000c498e828f0162000879565b6101408e015190935090506001600160401b0381111562000c6957600080fd5b62000c778e828f0162000879565b9150509295989b509295989b9093969950565b6000806040838503121562000c9e57600080fd5b82519150602083015160ff8116811462000cb757600080fd5b809150509250929050565b6000806040838503121562000cd657600080fd5b505080516020909101519092909150565b634e487b7160e01b600052601160045260246000fd5b80820180821115620003e957620003e962000ce7565b8082028115828204841417620003e957620003e962000ce7565b60008262000d4b57634e487b7160e01b600052601260045260246000fd5b500490565b60805160a05160c05160e05161010051610120516101405161016051611b9462000e2d6000396000610387015260006102260152600081816104cb01528181610a7601528181610cd8015261104b0152600081816104a101528181610ac001528181610cfd015261107001526000818161047901528181610932015281816109be01528181610a9b01528181610c6a015261101c0152600081816104540152818161091101528181610c420152610ffb0152600081816109ff01528181610bb801526110ae01526000818161057401526115e90152611b946000f3fe6080604052600436106101755760003560e01c80637284e416116100cb578063a10954fe1161007f578063dd62ed3e11610059578063dd62ed3e146104fa578063f3ccaac01461054d578063fdbddd561461056257600080fd5b8063a10954fe1461040b578063a9059cbb1461041e578063afd4c8d61461043e57600080fd5b806395d89b41116100b057806395d89b41146103ce578063a035b1fe146103e3578063a0712d68146103f857600080fd5b80637284e416146103605780638da5cb5b1461037557600080fd5b8063293a7f2e1161012d578063355274ea11610107578063355274ea146102bb57806369fcd4ac146102fd57806370a082311461031d57600080fd5b8063293a7f2e1461025d578063313ce5671461027f578063322d21001461029b57600080fd5b806318160ddd1161015e57806318160ddd146101d557806323b872dd146101f45780632604772c1461021457600080fd5b806306fdde031461017a578063095ea7b3146101a5575b600080fd5b34801561018657600080fd5b5061018f610596565b60405161019c9190611862565b60405180910390f35b3480156101b157600080fd5b506101c56101c03660046118f8565b610628565b604051901515815260200161019c565b3480156101e157600080fd5b506002545b60405190815260200161019c565b34801561020057600080fd5b506101c561020f366004611922565b610642565b34801561022057600080fd5b506102487f000000000000000000000000000000000000000000000000000000000000000081565b60405163ffffffff909116815260200161019c565b34801561026957600080fd5b5061027d61027836600461195e565b610666565b005b34801561028b57600080fd5b506040516012815260200161019c565b3480156102a757600080fd5b506101e66102b6366004611980565b6108fd565b3480156102c757600080fd5b506005546102e0906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff909116815260200161019c565b34801561030957600080fd5b506101e6610318366004611980565b61090a565b34801561032957600080fd5b506101e6610338366004611999565b73ffffffffffffffffffffffffffffffffffffffff1660009081526020819052604090205490565b34801561036c57600080fd5b5061018f610b14565b34801561038157600080fd5b506103a97f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161019c565b3480156103da57600080fd5b5061018f610ba2565b3480156103ef57600080fd5b506101e6610bb1565b61027d610406366004611980565b610d42565b34801561041757600080fd5b50476101e6565b34801561042a57600080fd5b506101c56104393660046118f8565b610dc6565b34801561044a57600080fd5b506040805161ffff7f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000811660208301527f00000000000000000000000000000000000000000000000000000000000000008116928201929092527f0000000000000000000000000000000000000000000000000000000000000000909116606082015260800161019c565b34801561050657600080fd5b506101e66105153660046119bb565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260016020908152604080832093909416825291909152205490565b34801561055957600080fd5b5061018f610dd4565b34801561056e57600080fd5b506103a97f000000000000000000000000000000000000000000000000000000000000000081565b6060600380546105a5906119ee565b80601f01602080910402602001604051908101604052809291908181526020018280546105d1906119ee565b801561061e5780601f106105f35761010080835404028352916020019161061e565b820191906000526020600020905b81548152906001019060200180831161060157829003601f168201915b5050505050905090565b600033610636818585610de1565b60019150505b92915050565b600033610650858285610df3565b61065b858585610ec2565b506001949350505050565b6005546bffffffffffffffffffffffff166106e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416c7265616479206c697374656400000000000000000000000000000000000060448201526064015b60405180910390fd5b60006106ed60025490565b905080831115610759576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f52657469726520416d6f756e74204578636565647320537570706c790000000060448201526064016106d9565b60006107648461090a565b9050828110156107d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e73756666696369656e74206f75747075742045544820616d6f756e74000060448201526064016106d9565b6040513390600090829084908381818185875af1925050503d8060008114610814576040519150601f19603f3d011682016040523d82523d6000602084013e610819565b606091505b5050905080610884576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f455448207472616e73666572206661696c65640000000000000000000000000060448201526064016106d9565b61088e8287610f6d565b8173ffffffffffffffffffffffffffffffffffffffff167fb7beb3c4e3f9672320080f6d4256a20ee1ab9dd0c3f763ab3266c4e8b86bb69287856108d160025490565b6040805193845260208401929092529082015242606082015260800160405180910390a2505050505050565b600061063c826000610fcd565b600061ffff7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000000116818361095e60025490565b039050806000036109725750479392505050565b6040517f32833d5100000000000000000000000000000000000000000000000000000000815260048101829052670de0b6b3a7640000602482015263ffffffff8316604482015261ffff7f0000000000000000000000000000000000000000000000000000000000000000166064820152600090819073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906332833d51906084016040805180830381865afa158015610a45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a699190611a41565b915091508363ffffffff167f000000000000000000000000000000000000000000000000000000000000000061ffff167f000000000000000000000000000000000000000000000000000000000000000061ffff167f000000000000000000000000000000000000000000000000000000000000000061ffff168460ff1686901c020281610af957610af9611a77565b0481610b0757610b07611a77565b0447039695505050505050565b60068054610b21906119ee565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4d906119ee565b8015610b9a5780601f10610b6f57610100808354040283529160200191610b9a565b820191906000526020600020905b815481529060010190602001808311610b7d57829003601f168201915b505050505081565b6060600480546105a5906119ee565b60008060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166332833d51610bfb60025490565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526004810191909152670de0b6b3a7640000602482015261ffff7f0000000000000000000000000000000000000000000000000000000000000000811660448301527f00000000000000000000000000000000000000000000000000000000000000001660648201526084016040805180830381865afa158015610cae573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd29190611a41565b915091507f000000000000000000000000000000000000000000000000000000000000000061ffff167f000000000000000000000000000000000000000000000000000000000000000061ffff168260ff1684901c610d319190611ad5565b610d3b9190611aec565b9250505090565b6005546bffffffffffffffffffffffff16610db9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f416c7265616479206c697374656400000000000000000000000000000000000060448201526064016106d9565b610dc33382611172565b50565b600033610636818585610ec2565b60078054610b21906119ee565b610dee8383836001611295565b505050565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600160209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ebc5781811015610ead576040517ffb8f41b200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8416600482015260248101829052604481018390526064016106d9565b610ebc84848484036000611295565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610f12576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016106d9565b73ffffffffffffffffffffffffffffffffffffffff8216610f62576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016106d9565b610dee8383836113dd565b73ffffffffffffffffffffffffffffffffffffffff8216610fbd576040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600060048201526024016106d9565b610fc9826000836113dd565b5050565b6040517f32833d5100000000000000000000000000000000000000000000000000000000815260009061ffff7f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000090810182169247869003870184027f0000000000000000000000000000000000000000000000000000000000000000841602927f0000000000000000000000000000000000000000000000000000000000000000830216918591829173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916332833d519161110791889188918b90600401938452602084019290925261ffff16604083015263ffffffff16606082015260800190565b6040805180830381865afa158015611123573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111479190611a41565b9150915061115460025490565b60ff9091169190911c670de0b6b3a764000002039695505050505050565b60055434906bffffffffffffffffffffffff164781811061119557818103909203915b60006111a18434610fcd565b90508481101561120d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f496e73756666696369656e74206f757470757420746f6b656e20616d6f756e7460448201526064016106d9565b6112178682611588565b8573ffffffffffffffffffffffffffffffffffffffff167f94c792774c59479f7bd68442f3af3691c02123a5aabee8b6f9116d8af8aa6669828661125a60025490565b6040805193845260208401929092529082015242606082015260800160405180910390a282471061128d5761128d6115e4565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff84166112e5576040517fe602df05000000000000000000000000000000000000000000000000000000008152600060048201526024016106d9565b73ffffffffffffffffffffffffffffffffffffffff8316611335576040517f94280d62000000000000000000000000000000000000000000000000000000008152600060048201526024016106d9565b73ffffffffffffffffffffffffffffffffffffffff80851660009081526001602090815260408083209387168352929052208290558015610ebc578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516113cf91815260200190565b60405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831661141557806002600082825461140a9190611b27565b909155506114c79050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152602081905260409020548181101561149b576040517fe450d38c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8516600482015260248101829052604481018390526064016106d9565b73ffffffffffffffffffffffffffffffffffffffff841660009081526020819052604090209082900390555b73ffffffffffffffffffffffffffffffffffffffff82166114f05760028054829003905561151c565b73ffffffffffffffffffffffffffffffffffffffff821660009081526020819052604090208054820190555b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161157b91815260200190565b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff82166115d8576040517fec442f05000000000000000000000000000000000000000000000000000000008152600060048201526024016106d9565b610fc9600083836113dd565b6005547f000000000000000000000000000000000000000000000000000000000000000090600090819073ffffffffffffffffffffffffffffffffffffffff84169063bac95fff906bffffffffffffffffffffffff16611642610bb1565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526bffffffffffffffffffffffff9092166004830152602482015260440160408051808303816000875af11580156116a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116cd9190611b3a565b915091506116dd83828401611588565b6005546040517fa226f279000000000000000000000000000000000000000000000000000000008152600481018490526024810183905273ffffffffffffffffffffffffffffffffffffffff85169163a226f279916bffffffffffffffffffffffff909116906044016000604051808303818588803b15801561175f57600080fd5b505af1158015611773573d6000803e3d6000fd5b5050505050600047111561183557604051600090339047908381818185875af1925050503d80600081146117c3576040519150601f19603f3d011682016040523d82523d6000602084013e6117c8565b606091505b5050905080611833576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4c6566746f766572207472616e73666572206661696c6564000000000000000060448201526064016106d9565b505b5050600580547fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016905550565b60006020808352835180602085015260005b8181101561189057858101830151858201604001528201611874565b5060006040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff811681146118f357600080fd5b919050565b6000806040838503121561190b57600080fd5b611914836118cf565b946020939093013593505050565b60008060006060848603121561193757600080fd5b611940846118cf565b925061194e602085016118cf565b9150604084013590509250925092565b6000806040838503121561197157600080fd5b50508035926020909101359150565b60006020828403121561199257600080fd5b5035919050565b6000602082840312156119ab57600080fd5b6119b4826118cf565b9392505050565b600080604083850312156119ce57600080fd5b6119d7836118cf565b91506119e5602084016118cf565b90509250929050565b600181811c90821680611a0257607f821691505b602082108103611a3b577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008060408385031215611a5457600080fd5b82519150602083015160ff81168114611a6c57600080fd5b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b808202811582820484141761063c5761063c611aa6565b600082611b22577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b8082018082111561063c5761063c611aa6565b60008060408385031215611b4d57600080fd5b50508051602090910151909290915056fea264697066735822122001c6dbf9caa22f255b4962a5b332e449495e0688803c7be1cf67cc03acbb871664736f6c63430008180033a2646970667358221220e70512bbc0c74e721eea1a6457791639034031ef604d226081593c6761b8556264736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000465e8d95d1b8c70bfffc74e2b04ec1bf640e4dcb0000000000000000000000000a0b696da96b52dca9a85bb38074602d496966ac
-----Decoded View---------------
Arg [0] : formula_ (address): 0x465e8d95D1B8c70BFFFC74e2B04eC1BF640e4DcB
Arg [1] : listingManager_ (address): 0x0A0b696Da96B52dCa9a85bb38074602d496966aC
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000465e8d95d1b8c70bfffc74e2b04ec1bf640e4dcb
Arg [1] : 0000000000000000000000000a0b696da96b52dca9a85bb38074602d496966ac
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.