Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sanjibnarzary/5dcc64da8b3ad0fd8847fe08d5612d21 to your computer and use it in GitHub Desktop.
Save sanjibnarzary/5dcc64da8b3ad0fd8847fe08d5612d21 to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.8.0+commit.c7dfd78e.js&optimize=true&runs=200&gist=
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
function hasRole(bytes32 role, address account) external view returns (bool);
function getRoleAdmin(bytes32 role) external view returns (bytes32);
function grantRole(bytes32 role, address account) external;
function revokeRole(bytes32 role, address account) external;
function renounceRole(bytes32 role, address account) external;
}
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping (address => bool) members;
bytes32 adminRole;
}
mapping (bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role, _msgSender());
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId
|| super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/
*/
function _checkRole(bytes32 role, address account) internal view {
if(!hasRole(role, account)) {
revert(string(abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(uint160(account), 20),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)));
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
emit RoleAdminChanged(role, getRoleAdmin(role), adminRole);
_roles[role].adminRole = adminRole;
}
function _grantRole(bytes32 role, address account) private {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor () {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The defaut value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
_approve(sender, _msgSender(), currentAllowance - amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
_balances[sender] = senderBalance - amount;
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
_balances[account] = accountBalance - amount;
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../ERC20.sol";
import "../../../utils/Context.sol";
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/
abstract contract ERC20Burnable is Context, ERC20 {
/**
* @dev Destroys `amount` tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 amount) public virtual {
_burn(_msgSender(), amount);
}
/**
* @dev Destroys `amount` tokens from `account`, deducting from the caller's
* allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `amount`.
*/
function burnFrom(address account, uint256 amount) public virtual {
uint256 currentAllowance = allowance(account, _msgSender());
require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
_approve(account, _msgSender(), currentAllowance - amount);
_burn(account, amount);
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../ERC20.sol";
import "../../../utils/Arrays.sol";
import "../../../utils/Counters.sol";
/**
* @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and
* total supply at the time are recorded for later access.
*
* This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting.
* In naive implementations it's possible to perform a "double spend" attack by reusing the same balance from different
* accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be
* used to create an efficient ERC20 forking mechanism.
*
* Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a
* snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot
* id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id
* and the account address.
*
* ==== Gas Costs
*
* Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log
* n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much
* smaller since identical balances in subsequent snapshots are stored as a single entry.
*
* There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is
* only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent
* transfers will have normal cost until the next snapshot, and so on.
*/
abstract contract ERC20Snapshot is ERC20 {
// Inspired by Jordi Baylina's MiniMeToken to record historical balances:
// https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol
using Arrays for uint256[];
using Counters for Counters.Counter;
// Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a
// Snapshot struct, but that would impede usage of functions that work on an array.
struct Snapshots {
uint256[] ids;
uint256[] values;
}
mapping (address => Snapshots) private _accountBalanceSnapshots;
Snapshots private _totalSupplySnapshots;
// Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid.
Counters.Counter private _currentSnapshotId;
/**
* @dev Emitted by {_snapshot} when a snapshot identified by `id` is created.
*/
event Snapshot(uint256 id);
/**
* @dev Creates a new snapshot and returns its snapshot id.
*
* Emits a {Snapshot} event that contains the same id.
*
* {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a
* set of accounts, for example using {AccessControl}, or it may be open to the public.
*
* [WARNING]
* ====
* While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking,
* you must consider that it can potentially be used by attackers in two ways.
*
* First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow
* logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target
* specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs
* section above.
*
* We haven't measured the actual numbers; if this is something you're interested in please reach out to us.
* ====
*/
function _snapshot() internal virtual returns (uint256) {
_currentSnapshotId.increment();
uint256 currentId = _currentSnapshotId.current();
emit Snapshot(currentId);
return currentId;
}
/**
* @dev Retrieves the balance of `account` at the time `snapshotId` was created.
*/
function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) {
(bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]);
return snapshotted ? value : balanceOf(account);
}
/**
* @dev Retrieves the total supply at the time `snapshotId` was created.
*/
function totalSupplyAt(uint256 snapshotId) public view virtual returns(uint256) {
(bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots);
return snapshotted ? value : totalSupply();
}
// Update balance and/or total supply snapshots before the values are modified. This is implemented
// in the _beforeTokenTransfer hook, which is executed for _mint, _burn, and _transfer operations.
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {
super._beforeTokenTransfer(from, to, amount);
if (from == address(0)) {
// mint
_updateAccountSnapshot(to);
_updateTotalSupplySnapshot();
} else if (to == address(0)) {
// burn
_updateAccountSnapshot(from);
_updateTotalSupplySnapshot();
} else {
// transfer
_updateAccountSnapshot(from);
_updateAccountSnapshot(to);
}
}
function _valueAt(uint256 snapshotId, Snapshots storage snapshots)
private view returns (bool, uint256)
{
require(snapshotId > 0, "ERC20Snapshot: id is 0");
// solhint-disable-next-line max-line-length
require(snapshotId <= _currentSnapshotId.current(), "ERC20Snapshot: nonexistent id");
// When a valid snapshot is queried, there are three possibilities:
// a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never
// created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds
// to this id is the current one.
// b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the
// requested id, and its value is the one to return.
// c) More snapshots were created after the requested one, and the queried value was later modified. There will be
// no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is
// larger than the requested one.
//
// In summary, we need to find an element in an array, returning the index of the smallest value that is larger if
// it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does
// exactly this.
uint256 index = snapshots.ids.findUpperBound(snapshotId);
if (index == snapshots.ids.length) {
return (false, 0);
} else {
return (true, snapshots.values[index]);
}
}
function _updateAccountSnapshot(address account) private {
_updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account));
}
function _updateTotalSupplySnapshot() private {
_updateSnapshot(_totalSupplySnapshots, totalSupply());
}
function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private {
uint256 currentId = _currentSnapshotId.current();
if (_lastSnapshotId(snapshots.ids) < currentId) {
snapshots.ids.push(currentId);
snapshots.values.push(currentValue);
}
}
function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) {
if (ids.length == 0) {
return 0;
} else {
return ids[ids.length - 1];
}
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @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);
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./math/Math.sol";
/**
* @dev Collection of functions related to array types.
*/
library Arrays {
/**
* @dev Searches a sorted `array` and returns the first index that contains
* a value greater or equal to `element`. If no such index exists (i.e. all
* values in the array are strictly less than `element`), the array length is
* returned. Time complexity O(log n).
*
* `array` is expected to be sorted in ascending order, and to contain no
* repeated elements.
*/
function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
if (array.length == 0) {
return 0;
}
uint256 low = 0;
uint256 high = array.length;
while (low < high) {
uint256 mid = Math.average(low, high);
// Note that mid will always be strictly less than high (i.e. it will be a valid array index)
// because Math.average rounds down (it does integer division with truncation).
if (array[mid] > element) {
high = mid;
} else {
low = mid + 1;
}
}
// At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.
if (low > 0 && array[low - 1] == element) {
return low - 1;
} else {
return low;
}
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow, so we distribute
return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant alphabet = "0123456789abcdef";
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
// Inspired by OraclizeAPI's implementation - MIT licence
// https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol
if (value == 0) {
return "0";
}
uint256 temp = value;
uint256 digits;
while (temp != 0) {
digits++;
temp /= 10;
}
bytes memory buffer = new bytes(digits);
while (value != 0) {
digits -= 1;
buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
value /= 10;
}
return string(buffer);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
if (value == 0) {
return "0x00";
}
uint256 temp = value;
uint256 length = 0;
while (temp != 0) {
length++;
temp >>= 8;
}
return toHexString(value, length);
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = alphabet[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor () {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor () {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {ERC20PresetMinterPauser}.
*
* TIP: For a detailed writeup see our guide
* https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* We have followed general OpenZeppelin guidelines: functions revert instead
* of returning `false` on failure. This behavior is nonetheless conventional
* and does not conflict with the expectations of ERC20 applications.
*
* Additionally, an {Approval} event is emitted on calls to {transferFrom}.
* This allows applications to reconstruct the allowance for all accounts just
* by listening to said events. Other implementations of the EIP may not emit
* these events, as it isn't required by the specification.
*
* Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
* functions have been added to mitigate the well-known issues around setting
* allowances. See {IERC20-approve}.
*/
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* The defaut value of {decimals} is 18. To select a different value for
* {decimals} you should overload it.
*
* All two of these values are immutable: they can only be set once during
* construction.
*/
constructor (string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual override returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5,05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the value {ERC20} uses, unless this function is
* overridden;
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual override returns (uint8) {
return 18;
}
/**
* @dev See {IERC20-totalSupply}.
*/
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
/**
* @dev See {IERC20-balanceOf}.
*/
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `recipient` cannot be the zero address.
* - the caller must have a balance of at least `amount`.
*/
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
/**
* @dev See {IERC20-allowance}.
*/
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Emits an {Approval} event indicating the updated allowance. This is not
* required by the EIP. See the note at the beginning of {ERC20}.
*
* Requirements:
*
* - `sender` and `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
* - the caller must have allowance for ``sender``'s tokens of at least
* `amount`.
*/
function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
_approve(sender, _msgSender(), currentAllowance - amount);
return true;
}
/**
* @dev Atomically increases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
/**
* @dev Atomically decreases the allowance granted to `spender` by the caller.
*
* This is an alternative to {approve} that can be used as a mitigation for
* problems described in {IERC20-approve}.
*
* Emits an {Approval} event indicating the updated allowance.
*
* Requirements:
*
* - `spender` cannot be the zero address.
* - `spender` must have allowance for the caller of at least
* `subtractedValue`.
*/
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
return true;
}
/**
* @dev Moves tokens `amount` from `sender` to `recipient`.
*
* This is internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* Requirements:
*
* - `sender` cannot be the zero address.
* - `recipient` cannot be the zero address.
* - `sender` must have a balance of at least `amount`.
*/
function _transfer(address sender, address recipient, uint256 amount) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
_balances[sender] = senderBalance - amount;
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
/** @dev Creates `amount` tokens and assigns them to `account`, increasing
* the total supply.
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* Requirements:
*
* - `to` cannot be the zero address.
*/
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
/**
* @dev Destroys `amount` tokens from `account`, reducing the
* total supply.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* Requirements:
*
* - `account` cannot be the zero address.
* - `account` must have at least `amount` tokens.
*/
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
_balances[account] = accountBalance - amount;
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
}
/**
* @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*/
function _approve(address owner, address spender, uint256 amount) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
/**
* @dev Hook that is called before any transfer of tokens. This includes
* minting and burning.
*
* Calling conditions:
*
* - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
* will be to transferred to `to`.
* - when `from` is zero, `amount` tokens will be minted for `to`.
* - when `to` is zero, `amount` of ``from``'s tokens will be burned.
* - `from` and `to` are never both zero.
*
* To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
*/
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../ERC20.sol";
import "../../../utils/Context.sol";
/**
* @dev Extension of {ERC20} that allows token holders to destroy both their own
* tokens and those that they have an allowance for, in a way that can be
* recognized off-chain (via event analysis).
*/
abstract contract ERC20Burnable is Context, ERC20 {
/**
* @dev Destroys `amount` tokens from the caller.
*
* See {ERC20-_burn}.
*/
function burn(uint256 amount) public virtual {
_burn(_msgSender(), amount);
}
/**
* @dev Destroys `amount` tokens from `account`, deducting from the caller's
* allowance.
*
* See {ERC20-_burn} and {ERC20-allowance}.
*
* Requirements:
*
* - the caller must have allowance for ``accounts``'s tokens of at least
* `amount`.
*/
function burnFrom(address account, uint256 amount) public virtual {
uint256 currentAllowance = allowance(account, _msgSender());
require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
_approve(account, _msgSender(), currentAllowance - amount);
_burn(account, amount);
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../ERC20.sol";
import "../../../utils/Arrays.sol";
import "../../../utils/Counters.sol";
/**
* @dev This contract extends an ERC20 token with a snapshot mechanism. When a snapshot is created, the balances and
* total supply at the time are recorded for later access.
*
* This can be used to safely create mechanisms based on token balances such as trustless dividends or weighted voting.
* In naive implementations it's possible to perform a "double spend" attack by reusing the same balance from different
* accounts. By using snapshots to calculate dividends or voting power, those attacks no longer apply. It can also be
* used to create an efficient ERC20 forking mechanism.
*
* Snapshots are created by the internal {_snapshot} function, which will emit the {Snapshot} event and return a
* snapshot id. To get the total supply at the time of a snapshot, call the function {totalSupplyAt} with the snapshot
* id. To get the balance of an account at the time of a snapshot, call the {balanceOfAt} function with the snapshot id
* and the account address.
*
* ==== Gas Costs
*
* Snapshots are efficient. Snapshot creation is _O(1)_. Retrieval of balances or total supply from a snapshot is _O(log
* n)_ in the number of snapshots that have been created, although _n_ for a specific account will generally be much
* smaller since identical balances in subsequent snapshots are stored as a single entry.
*
* There is a constant overhead for normal ERC20 transfers due to the additional snapshot bookkeeping. This overhead is
* only significant for the first transfer that immediately follows a snapshot for a particular account. Subsequent
* transfers will have normal cost until the next snapshot, and so on.
*/
abstract contract ERC20Snapshot is ERC20 {
// Inspired by Jordi Baylina's MiniMeToken to record historical balances:
// https://github.com/Giveth/minimd/blob/ea04d950eea153a04c51fa510b068b9dded390cb/contracts/MiniMeToken.sol
using Arrays for uint256[];
using Counters for Counters.Counter;
// Snapshotted values have arrays of ids and the value corresponding to that id. These could be an array of a
// Snapshot struct, but that would impede usage of functions that work on an array.
struct Snapshots {
uint256[] ids;
uint256[] values;
}
mapping (address => Snapshots) private _accountBalanceSnapshots;
Snapshots private _totalSupplySnapshots;
// Snapshot ids increase monotonically, with the first value being 1. An id of 0 is invalid.
Counters.Counter private _currentSnapshotId;
/**
* @dev Emitted by {_snapshot} when a snapshot identified by `id` is created.
*/
event Snapshot(uint256 id);
/**
* @dev Creates a new snapshot and returns its snapshot id.
*
* Emits a {Snapshot} event that contains the same id.
*
* {_snapshot} is `internal` and you have to decide how to expose it externally. Its usage may be restricted to a
* set of accounts, for example using {AccessControl}, or it may be open to the public.
*
* [WARNING]
* ====
* While an open way of calling {_snapshot} is required for certain trust minimization mechanisms such as forking,
* you must consider that it can potentially be used by attackers in two ways.
*
* First, it can be used to increase the cost of retrieval of values from snapshots, although it will grow
* logarithmically thus rendering this attack ineffective in the long term. Second, it can be used to target
* specific accounts and increase the cost of ERC20 transfers for them, in the ways specified in the Gas Costs
* section above.
*
* We haven't measured the actual numbers; if this is something you're interested in please reach out to us.
* ====
*/
function _snapshot() internal virtual returns (uint256) {
_currentSnapshotId.increment();
uint256 currentId = _currentSnapshotId.current();
emit Snapshot(currentId);
return currentId;
}
/**
* @dev Retrieves the balance of `account` at the time `snapshotId` was created.
*/
function balanceOfAt(address account, uint256 snapshotId) public view virtual returns (uint256) {
(bool snapshotted, uint256 value) = _valueAt(snapshotId, _accountBalanceSnapshots[account]);
return snapshotted ? value : balanceOf(account);
}
/**
* @dev Retrieves the total supply at the time `snapshotId` was created.
*/
function totalSupplyAt(uint256 snapshotId) public view virtual returns(uint256) {
(bool snapshotted, uint256 value) = _valueAt(snapshotId, _totalSupplySnapshots);
return snapshotted ? value : totalSupply();
}
// Update balance and/or total supply snapshots before the values are modified. This is implemented
// in the _beforeTokenTransfer hook, which is executed for _mint, _burn, and _transfer operations.
function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override {
super._beforeTokenTransfer(from, to, amount);
if (from == address(0)) {
// mint
_updateAccountSnapshot(to);
_updateTotalSupplySnapshot();
} else if (to == address(0)) {
// burn
_updateAccountSnapshot(from);
_updateTotalSupplySnapshot();
} else {
// transfer
_updateAccountSnapshot(from);
_updateAccountSnapshot(to);
}
}
function _valueAt(uint256 snapshotId, Snapshots storage snapshots)
private view returns (bool, uint256)
{
require(snapshotId > 0, "ERC20Snapshot: id is 0");
// solhint-disable-next-line max-line-length
require(snapshotId <= _currentSnapshotId.current(), "ERC20Snapshot: nonexistent id");
// When a valid snapshot is queried, there are three possibilities:
// a) The queried value was not modified after the snapshot was taken. Therefore, a snapshot entry was never
// created for this id, and all stored snapshot ids are smaller than the requested one. The value that corresponds
// to this id is the current one.
// b) The queried value was modified after the snapshot was taken. Therefore, there will be an entry with the
// requested id, and its value is the one to return.
// c) More snapshots were created after the requested one, and the queried value was later modified. There will be
// no entry for the requested id: the value that corresponds to it is that of the smallest snapshot id that is
// larger than the requested one.
//
// In summary, we need to find an element in an array, returning the index of the smallest value that is larger if
// it is not found, unless said value doesn't exist (e.g. when all values are smaller). Arrays.findUpperBound does
// exactly this.
uint256 index = snapshots.ids.findUpperBound(snapshotId);
if (index == snapshots.ids.length) {
return (false, 0);
} else {
return (true, snapshots.values[index]);
}
}
function _updateAccountSnapshot(address account) private {
_updateSnapshot(_accountBalanceSnapshots[account], balanceOf(account));
}
function _updateTotalSupplySnapshot() private {
_updateSnapshot(_totalSupplySnapshots, totalSupply());
}
function _updateSnapshot(Snapshots storage snapshots, uint256 currentValue) private {
uint256 currentId = _currentSnapshotId.current();
if (_lastSnapshotId(snapshots.ids) < currentId) {
snapshots.ids.push(currentId);
snapshots.values.push(currentValue);
}
}
function _lastSnapshotId(uint256[] storage ids) private view returns (uint256) {
if (ids.length == 0) {
return 0;
} else {
return ids[ids.length - 1];
}
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC20 standard.
*
* _Available since v4.1._
*/
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @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);
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./math/Math.sol";
/**
* @dev Collection of functions related to array types.
*/
library Arrays {
/**
* @dev Searches a sorted `array` and returns the first index that contains
* a value greater or equal to `element`. If no such index exists (i.e. all
* values in the array are strictly less than `element`), the array length is
* returned. Time complexity O(log n).
*
* `array` is expected to be sorted in ascending order, and to contain no
* repeated elements.
*/
function findUpperBound(uint256[] storage array, uint256 element) internal view returns (uint256) {
if (array.length == 0) {
return 0;
}
uint256 low = 0;
uint256 high = array.length;
while (low < high) {
uint256 mid = Math.average(low, high);
// Note that mid will always be strictly less than high (i.e. it will be a valid array index)
// because Math.average rounds down (it does integer division with truncation).
if (array[mid] > element) {
high = mid;
} else {
low = mid + 1;
}
}
// At this point `low` is the exclusive upper bound. We will return the inclusive upper bound.
if (low > 0 && array[low - 1] == element) {
return low - 1;
} else {
return low;
}
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @title Counters
* @author Matt Condon (@shrugs)
* @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number
* of elements in a mapping, issuing ERC721 ids, or counting request ids.
*
* Include with `using Counters for Counters.Counter;`
*/
library Counters {
struct Counter {
// This variable should never be directly accessed by users of the library: interactions must be restricted to
// the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
// this feature: see https://github.com/ethereum/solidity/issues/4637
uint256 _value; // default: 0
}
function current(Counter storage counter) internal view returns (uint256) {
return counter._value;
}
function increment(Counter storage counter) internal {
unchecked {
counter._value += 1;
}
}
function decrement(Counter storage counter) internal {
uint256 value = counter._value;
require(value > 0, "Counter: decrement overflow");
unchecked {
counter._value = value - 1;
}
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow, so we distribute
return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
}
}
{
"deploy": {
"VM:-": {
"linkReferences": {},
"autoDeployLib": true
},
"main:1": {
"linkReferences": {},
"autoDeployLib": true
},
"ropsten:3": {
"linkReferences": {},
"autoDeployLib": true
},
"rinkeby:4": {
"linkReferences": {},
"autoDeployLib": true
},
"kovan:42": {
"linkReferences": {},
"autoDeployLib": true
},
"görli:5": {
"linkReferences": {},
"autoDeployLib": true
},
"Custom": {
"linkReferences": {},
"autoDeployLib": true
}
},
"data": {
"bytecode": {
"generatedSources": [
{
"ast": {
"nodeType": "YulBlock",
"src": "0:3389:12",
"statements": [
{
"nodeType": "YulBlock",
"src": "6:3:12",
"statements": []
},
{
"body": {
"nodeType": "YulBlock",
"src": "188:166:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "205:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "216:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "198:6:12"
},
"nodeType": "YulFunctionCall",
"src": "198:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "198:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "239:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "250:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "235:3:12"
},
"nodeType": "YulFunctionCall",
"src": "235:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "255:2:12",
"type": "",
"value": "16"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "228:6:12"
},
"nodeType": "YulFunctionCall",
"src": "228:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "228:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "278:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "289:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "274:3:12"
},
"nodeType": "YulFunctionCall",
"src": "274:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "294:18:12",
"type": "",
"value": "Pausable: paused"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "267:6:12"
},
"nodeType": "YulFunctionCall",
"src": "267:46:12"
},
"nodeType": "YulExpressionStatement",
"src": "267:46:12"
},
{
"nodeType": "YulAssignment",
"src": "322:26:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "334:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "345:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "330:3:12"
},
"nodeType": "YulFunctionCall",
"src": "330:18:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "322:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_68571e1369f7a6dcdcd736cb0343b35a58ed0f64d245c2ed839c98d412744f8a__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "165:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "179:4:12",
"type": ""
}
],
"src": "14:340:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "533:181:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "550:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "561:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "543:6:12"
},
"nodeType": "YulFunctionCall",
"src": "543:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "543:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "584:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "595:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "580:3:12"
},
"nodeType": "YulFunctionCall",
"src": "580:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "600:2:12",
"type": "",
"value": "31"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "573:6:12"
},
"nodeType": "YulFunctionCall",
"src": "573:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "573:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "623:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "634:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "619:3:12"
},
"nodeType": "YulFunctionCall",
"src": "619:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "639:33:12",
"type": "",
"value": "ERC20: mint to the zero address"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "612:6:12"
},
"nodeType": "YulFunctionCall",
"src": "612:61:12"
},
"nodeType": "YulExpressionStatement",
"src": "612:61:12"
},
{
"nodeType": "YulAssignment",
"src": "682:26:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "694:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "705:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "690:3:12"
},
"nodeType": "YulFunctionCall",
"src": "690:18:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "682:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "510:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "524:4:12",
"type": ""
}
],
"src": "359:355:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "820:76:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "830:26:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "842:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "853:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "838:3:12"
},
"nodeType": "YulFunctionCall",
"src": "838:18:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "830:4:12"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "872:9:12"
},
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "883:6:12"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "865:6:12"
},
"nodeType": "YulFunctionCall",
"src": "865:25:12"
},
"nodeType": "YulExpressionStatement",
"src": "865:25:12"
}
]
},
"name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "789:9:12",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "800:6:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "811:4:12",
"type": ""
}
],
"src": "719:177:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "949:80:12",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "976:22:12",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x11",
"nodeType": "YulIdentifier",
"src": "978:16:12"
},
"nodeType": "YulFunctionCall",
"src": "978:18:12"
},
"nodeType": "YulExpressionStatement",
"src": "978:18:12"
}
]
},
"condition": {
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "965:1:12"
},
{
"arguments": [
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "972:1:12"
}
],
"functionName": {
"name": "not",
"nodeType": "YulIdentifier",
"src": "968:3:12"
},
"nodeType": "YulFunctionCall",
"src": "968:6:12"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "962:2:12"
},
"nodeType": "YulFunctionCall",
"src": "962:13:12"
},
"nodeType": "YulIf",
"src": "959:2:12"
},
{
"nodeType": "YulAssignment",
"src": "1007:16:12",
"value": {
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "1018:1:12"
},
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "1021:1:12"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1014:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1014:9:12"
},
"variableNames": [
{
"name": "sum",
"nodeType": "YulIdentifier",
"src": "1007:3:12"
}
]
}
]
},
"name": "checked_add_t_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "x",
"nodeType": "YulTypedName",
"src": "932:1:12",
"type": ""
},
{
"name": "y",
"nodeType": "YulTypedName",
"src": "935:1:12",
"type": ""
}
],
"returnVariables": [
{
"name": "sum",
"nodeType": "YulTypedName",
"src": "941:3:12",
"type": ""
}
],
"src": "901:128:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1111:376:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1121:15:12",
"value": {
"name": "_power",
"nodeType": "YulIdentifier",
"src": "1130:6:12"
},
"variableNames": [
{
"name": "power",
"nodeType": "YulIdentifier",
"src": "1121:5:12"
}
]
},
{
"nodeType": "YulAssignment",
"src": "1145:13:12",
"value": {
"name": "_base",
"nodeType": "YulIdentifier",
"src": "1153:5:12"
},
"variableNames": [
{
"name": "base",
"nodeType": "YulIdentifier",
"src": "1145:4:12"
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "1192:289:12",
"statements": [
{
"nodeType": "YulVariableDeclaration",
"src": "1206:11:12",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "1216:1:12",
"type": "",
"value": "1"
},
"variables": [
{
"name": "_1",
"nodeType": "YulTypedName",
"src": "1210:2:12",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "1258:9:12",
"statements": [
{
"nodeType": "YulBreak",
"src": "1260:5:12"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "exponent",
"nodeType": "YulIdentifier",
"src": "1243:8:12"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "1253:2:12"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "1240:2:12"
},
"nodeType": "YulFunctionCall",
"src": "1240:16:12"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "1233:6:12"
},
"nodeType": "YulFunctionCall",
"src": "1233:24:12"
},
"nodeType": "YulIf",
"src": "1230:2:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1308:22:12",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x11",
"nodeType": "YulIdentifier",
"src": "1310:16:12"
},
"nodeType": "YulFunctionCall",
"src": "1310:18:12"
},
"nodeType": "YulExpressionStatement",
"src": "1310:18:12"
}
]
},
"condition": {
"arguments": [
{
"name": "base",
"nodeType": "YulIdentifier",
"src": "1286:4:12"
},
{
"arguments": [
{
"name": "max",
"nodeType": "YulIdentifier",
"src": "1296:3:12"
},
{
"name": "base",
"nodeType": "YulIdentifier",
"src": "1301:4:12"
}
],
"functionName": {
"name": "div",
"nodeType": "YulIdentifier",
"src": "1292:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1292:14:12"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "1283:2:12"
},
"nodeType": "YulFunctionCall",
"src": "1283:24:12"
},
"nodeType": "YulIf",
"src": "1280:2:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1364:29:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1366:25:12",
"value": {
"arguments": [
{
"name": "power",
"nodeType": "YulIdentifier",
"src": "1379:5:12"
},
{
"name": "base",
"nodeType": "YulIdentifier",
"src": "1386:4:12"
}
],
"functionName": {
"name": "mul",
"nodeType": "YulIdentifier",
"src": "1375:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1375:16:12"
},
"variableNames": [
{
"name": "power",
"nodeType": "YulIdentifier",
"src": "1366:5:12"
}
]
}
]
},
"condition": {
"arguments": [
{
"name": "exponent",
"nodeType": "YulIdentifier",
"src": "1350:8:12"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "1360:2:12"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "1346:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1346:17:12"
},
"nodeType": "YulIf",
"src": "1343:2:12"
},
{
"nodeType": "YulAssignment",
"src": "1406:23:12",
"value": {
"arguments": [
{
"name": "base",
"nodeType": "YulIdentifier",
"src": "1418:4:12"
},
{
"name": "base",
"nodeType": "YulIdentifier",
"src": "1424:4:12"
}
],
"functionName": {
"name": "mul",
"nodeType": "YulIdentifier",
"src": "1414:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1414:15:12"
},
"variableNames": [
{
"name": "base",
"nodeType": "YulIdentifier",
"src": "1406:4:12"
}
]
},
{
"nodeType": "YulAssignment",
"src": "1442:29:12",
"value": {
"arguments": [
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "1458:2:12"
},
{
"name": "exponent",
"nodeType": "YulIdentifier",
"src": "1462:8:12"
}
],
"functionName": {
"name": "shr",
"nodeType": "YulIdentifier",
"src": "1454:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1454:17:12"
},
"variableNames": [
{
"name": "exponent",
"nodeType": "YulIdentifier",
"src": "1442:8:12"
}
]
}
]
},
"condition": {
"kind": "bool",
"nodeType": "YulLiteral",
"src": "1175:4:12",
"type": "",
"value": "true"
},
"nodeType": "YulForLoop",
"post": {
"nodeType": "YulBlock",
"src": "1180:3:12",
"statements": []
},
"pre": {
"nodeType": "YulBlock",
"src": "1171:3:12",
"statements": []
},
"src": "1167:314:12"
}
]
},
"name": "checked_exp_helper",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "_power",
"nodeType": "YulTypedName",
"src": "1062:6:12",
"type": ""
},
{
"name": "_base",
"nodeType": "YulTypedName",
"src": "1070:5:12",
"type": ""
},
{
"name": "exponent",
"nodeType": "YulTypedName",
"src": "1077:8:12",
"type": ""
},
{
"name": "max",
"nodeType": "YulTypedName",
"src": "1087:3:12",
"type": ""
}
],
"returnVariables": [
{
"name": "power",
"nodeType": "YulTypedName",
"src": "1095:5:12",
"type": ""
},
{
"name": "base",
"nodeType": "YulTypedName",
"src": "1102:4:12",
"type": ""
}
],
"src": "1034:453:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1560:80:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1570:64:12",
"value": {
"arguments": [
{
"name": "base",
"nodeType": "YulIdentifier",
"src": "1600:4:12"
},
{
"arguments": [
{
"name": "exponent",
"nodeType": "YulIdentifier",
"src": "1610:8:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1620:4:12",
"type": "",
"value": "0xff"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "1606:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1606:19:12"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1631:1:12",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "not",
"nodeType": "YulIdentifier",
"src": "1627:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1627:6:12"
}
],
"functionName": {
"name": "checked_exp_unsigned",
"nodeType": "YulIdentifier",
"src": "1579:20:12"
},
"nodeType": "YulFunctionCall",
"src": "1579:55:12"
},
"variableNames": [
{
"name": "power",
"nodeType": "YulIdentifier",
"src": "1570:5:12"
}
]
}
]
},
"name": "checked_exp_t_uint256_t_uint8",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "base",
"nodeType": "YulTypedName",
"src": "1531:4:12",
"type": ""
},
{
"name": "exponent",
"nodeType": "YulTypedName",
"src": "1537:8:12",
"type": ""
}
],
"returnVariables": [
{
"name": "power",
"nodeType": "YulTypedName",
"src": "1550:5:12",
"type": ""
}
],
"src": "1492:148:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1709:858:12",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "1747:52:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1761:10:12",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "1770:1:12",
"type": "",
"value": "1"
},
"variableNames": [
{
"name": "power",
"nodeType": "YulIdentifier",
"src": "1761:5:12"
}
]
},
{
"nodeType": "YulLeave",
"src": "1784:5:12"
}
]
},
"condition": {
"arguments": [
{
"name": "exponent",
"nodeType": "YulIdentifier",
"src": "1729:8:12"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "1722:6:12"
},
"nodeType": "YulFunctionCall",
"src": "1722:16:12"
},
"nodeType": "YulIf",
"src": "1719:2:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1832:52:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1846:10:12",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "1855:1:12",
"type": "",
"value": "0"
},
"variableNames": [
{
"name": "power",
"nodeType": "YulIdentifier",
"src": "1846:5:12"
}
]
},
{
"nodeType": "YulLeave",
"src": "1869:5:12"
}
]
},
"condition": {
"arguments": [
{
"name": "base",
"nodeType": "YulIdentifier",
"src": "1818:4:12"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "1811:6:12"
},
"nodeType": "YulFunctionCall",
"src": "1811:12:12"
},
"nodeType": "YulIf",
"src": "1808:2:12"
},
{
"cases": [
{
"body": {
"nodeType": "YulBlock",
"src": "1920:52:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1934:10:12",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "1943:1:12",
"type": "",
"value": "1"
},
"variableNames": [
{
"name": "power",
"nodeType": "YulIdentifier",
"src": "1934:5:12"
}
]
},
{
"nodeType": "YulLeave",
"src": "1957:5:12"
}
]
},
"nodeType": "YulCase",
"src": "1913:59:12",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "1918:1:12",
"type": "",
"value": "1"
}
},
{
"body": {
"nodeType": "YulBlock",
"src": "1988:176:12",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "2023:22:12",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x11",
"nodeType": "YulIdentifier",
"src": "2025:16:12"
},
"nodeType": "YulFunctionCall",
"src": "2025:18:12"
},
"nodeType": "YulExpressionStatement",
"src": "2025:18:12"
}
]
},
"condition": {
"arguments": [
{
"name": "exponent",
"nodeType": "YulIdentifier",
"src": "2008:8:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2018:3:12",
"type": "",
"value": "255"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "2005:2:12"
},
"nodeType": "YulFunctionCall",
"src": "2005:17:12"
},
"nodeType": "YulIf",
"src": "2002:2:12"
},
{
"nodeType": "YulAssignment",
"src": "2058:25:12",
"value": {
"arguments": [
{
"name": "exponent",
"nodeType": "YulIdentifier",
"src": "2071:8:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2081:1:12",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "2067:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2067:16:12"
},
"variableNames": [
{
"name": "power",
"nodeType": "YulIdentifier",
"src": "2058:5:12"
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "2114:22:12",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x11",
"nodeType": "YulIdentifier",
"src": "2116:16:12"
},
"nodeType": "YulFunctionCall",
"src": "2116:18:12"
},
"nodeType": "YulExpressionStatement",
"src": "2116:18:12"
}
]
},
"condition": {
"arguments": [
{
"name": "power",
"nodeType": "YulIdentifier",
"src": "2102:5:12"
},
{
"name": "max",
"nodeType": "YulIdentifier",
"src": "2109:3:12"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "2099:2:12"
},
"nodeType": "YulFunctionCall",
"src": "2099:14:12"
},
"nodeType": "YulIf",
"src": "2096:2:12"
},
{
"nodeType": "YulLeave",
"src": "2149:5:12"
}
]
},
"nodeType": "YulCase",
"src": "1981:183:12",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "1986:1:12",
"type": "",
"value": "2"
}
}
],
"expression": {
"name": "base",
"nodeType": "YulIdentifier",
"src": "1900:4:12"
},
"nodeType": "YulSwitch",
"src": "1893:271:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2262:123:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "2276:28:12",
"value": {
"arguments": [
{
"name": "base",
"nodeType": "YulIdentifier",
"src": "2289:4:12"
},
{
"name": "exponent",
"nodeType": "YulIdentifier",
"src": "2295:8:12"
}
],
"functionName": {
"name": "exp",
"nodeType": "YulIdentifier",
"src": "2285:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2285:19:12"
},
"variableNames": [
{
"name": "power",
"nodeType": "YulIdentifier",
"src": "2276:5:12"
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "2335:22:12",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x11",
"nodeType": "YulIdentifier",
"src": "2337:16:12"
},
"nodeType": "YulFunctionCall",
"src": "2337:18:12"
},
"nodeType": "YulExpressionStatement",
"src": "2337:18:12"
}
]
},
"condition": {
"arguments": [
{
"name": "power",
"nodeType": "YulIdentifier",
"src": "2323:5:12"
},
{
"name": "max",
"nodeType": "YulIdentifier",
"src": "2330:3:12"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "2320:2:12"
},
"nodeType": "YulFunctionCall",
"src": "2320:14:12"
},
"nodeType": "YulIf",
"src": "2317:2:12"
},
{
"nodeType": "YulLeave",
"src": "2370:5:12"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "base",
"nodeType": "YulIdentifier",
"src": "2186:4:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2192:2:12",
"type": "",
"value": "11"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "2183:2:12"
},
"nodeType": "YulFunctionCall",
"src": "2183:12:12"
},
{
"arguments": [
{
"name": "exponent",
"nodeType": "YulIdentifier",
"src": "2200:8:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2210:2:12",
"type": "",
"value": "78"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "2197:2:12"
},
"nodeType": "YulFunctionCall",
"src": "2197:16:12"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "2179:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2179:35:12"
},
{
"arguments": [
{
"arguments": [
{
"name": "base",
"nodeType": "YulIdentifier",
"src": "2223:4:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2229:3:12",
"type": "",
"value": "307"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "2220:2:12"
},
"nodeType": "YulFunctionCall",
"src": "2220:13:12"
},
{
"arguments": [
{
"name": "exponent",
"nodeType": "YulIdentifier",
"src": "2238:8:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2248:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "2235:2:12"
},
"nodeType": "YulFunctionCall",
"src": "2235:16:12"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "2216:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2216:36:12"
}
],
"functionName": {
"name": "or",
"nodeType": "YulIdentifier",
"src": "2176:2:12"
},
"nodeType": "YulFunctionCall",
"src": "2176:77:12"
},
"nodeType": "YulIf",
"src": "2173:2:12"
},
{
"nodeType": "YulVariableDeclaration",
"src": "2394:65:12",
"value": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2436:1:12",
"type": "",
"value": "1"
},
{
"name": "base",
"nodeType": "YulIdentifier",
"src": "2439:4:12"
},
{
"name": "exponent",
"nodeType": "YulIdentifier",
"src": "2445:8:12"
},
{
"name": "max",
"nodeType": "YulIdentifier",
"src": "2455:3:12"
}
],
"functionName": {
"name": "checked_exp_helper",
"nodeType": "YulIdentifier",
"src": "2417:18:12"
},
"nodeType": "YulFunctionCall",
"src": "2417:42:12"
},
"variables": [
{
"name": "power_1",
"nodeType": "YulTypedName",
"src": "2398:7:12",
"type": ""
},
{
"name": "base_1",
"nodeType": "YulTypedName",
"src": "2407:6:12",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "2501:22:12",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x11",
"nodeType": "YulIdentifier",
"src": "2503:16:12"
},
"nodeType": "YulFunctionCall",
"src": "2503:18:12"
},
"nodeType": "YulExpressionStatement",
"src": "2503:18:12"
}
]
},
"condition": {
"arguments": [
{
"name": "power_1",
"nodeType": "YulIdentifier",
"src": "2474:7:12"
},
{
"arguments": [
{
"name": "max",
"nodeType": "YulIdentifier",
"src": "2487:3:12"
},
{
"name": "base_1",
"nodeType": "YulIdentifier",
"src": "2492:6:12"
}
],
"functionName": {
"name": "div",
"nodeType": "YulIdentifier",
"src": "2483:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2483:16:12"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "2471:2:12"
},
"nodeType": "YulFunctionCall",
"src": "2471:29:12"
},
"nodeType": "YulIf",
"src": "2468:2:12"
},
{
"nodeType": "YulAssignment",
"src": "2532:29:12",
"value": {
"arguments": [
{
"name": "power_1",
"nodeType": "YulIdentifier",
"src": "2545:7:12"
},
{
"name": "base_1",
"nodeType": "YulIdentifier",
"src": "2554:6:12"
}
],
"functionName": {
"name": "mul",
"nodeType": "YulIdentifier",
"src": "2541:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2541:20:12"
},
"variableNames": [
{
"name": "power",
"nodeType": "YulIdentifier",
"src": "2532:5:12"
}
]
}
]
},
"name": "checked_exp_unsigned",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "base",
"nodeType": "YulTypedName",
"src": "1675:4:12",
"type": ""
},
{
"name": "exponent",
"nodeType": "YulTypedName",
"src": "1681:8:12",
"type": ""
},
{
"name": "max",
"nodeType": "YulTypedName",
"src": "1691:3:12",
"type": ""
}
],
"returnVariables": [
{
"name": "power",
"nodeType": "YulTypedName",
"src": "1699:5:12",
"type": ""
}
],
"src": "1645:922:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2624:116:12",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "2683:22:12",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x11",
"nodeType": "YulIdentifier",
"src": "2685:16:12"
},
"nodeType": "YulFunctionCall",
"src": "2685:18:12"
},
"nodeType": "YulExpressionStatement",
"src": "2685:18:12"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "2655:1:12"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "2648:6:12"
},
"nodeType": "YulFunctionCall",
"src": "2648:9:12"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "2641:6:12"
},
"nodeType": "YulFunctionCall",
"src": "2641:17:12"
},
{
"arguments": [
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "2663:1:12"
},
{
"arguments": [
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2674:1:12",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "not",
"nodeType": "YulIdentifier",
"src": "2670:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2670:6:12"
},
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "2678:1:12"
}
],
"functionName": {
"name": "div",
"nodeType": "YulIdentifier",
"src": "2666:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2666:14:12"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "2660:2:12"
},
"nodeType": "YulFunctionCall",
"src": "2660:21:12"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "2637:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2637:45:12"
},
"nodeType": "YulIf",
"src": "2634:2:12"
},
{
"nodeType": "YulAssignment",
"src": "2714:20:12",
"value": {
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "2729:1:12"
},
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "2732:1:12"
}
],
"functionName": {
"name": "mul",
"nodeType": "YulIdentifier",
"src": "2725:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2725:9:12"
},
"variableNames": [
{
"name": "product",
"nodeType": "YulIdentifier",
"src": "2714:7:12"
}
]
}
]
},
"name": "checked_mul_t_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "x",
"nodeType": "YulTypedName",
"src": "2603:1:12",
"type": ""
},
{
"name": "y",
"nodeType": "YulTypedName",
"src": "2606:1:12",
"type": ""
}
],
"returnVariables": [
{
"name": "product",
"nodeType": "YulTypedName",
"src": "2612:7:12",
"type": ""
}
],
"src": "2572:168:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2794:76:12",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "2816:22:12",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x11",
"nodeType": "YulIdentifier",
"src": "2818:16:12"
},
"nodeType": "YulFunctionCall",
"src": "2818:18:12"
},
"nodeType": "YulExpressionStatement",
"src": "2818:18:12"
}
]
},
"condition": {
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "2810:1:12"
},
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "2813:1:12"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "2807:2:12"
},
"nodeType": "YulFunctionCall",
"src": "2807:8:12"
},
"nodeType": "YulIf",
"src": "2804:2:12"
},
{
"nodeType": "YulAssignment",
"src": "2847:17:12",
"value": {
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "2859:1:12"
},
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "2862:1:12"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "2855:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2855:9:12"
},
"variableNames": [
{
"name": "diff",
"nodeType": "YulIdentifier",
"src": "2847:4:12"
}
]
}
]
},
"name": "checked_sub_t_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "x",
"nodeType": "YulTypedName",
"src": "2776:1:12",
"type": ""
},
{
"name": "y",
"nodeType": "YulTypedName",
"src": "2779:1:12",
"type": ""
}
],
"returnVariables": [
{
"name": "diff",
"nodeType": "YulTypedName",
"src": "2785:4:12",
"type": ""
}
],
"src": "2745:125:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2930:325:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "2940:22:12",
"value": {
"arguments": [
{
"name": "data",
"nodeType": "YulIdentifier",
"src": "2954:4:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2960:1:12",
"type": "",
"value": "2"
}
],
"functionName": {
"name": "div",
"nodeType": "YulIdentifier",
"src": "2950:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2950:12:12"
},
"variableNames": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "2940:6:12"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "2971:38:12",
"value": {
"arguments": [
{
"name": "data",
"nodeType": "YulIdentifier",
"src": "3001:4:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3007:1:12",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "2997:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2997:12:12"
},
"variables": [
{
"name": "outOfPlaceEncoding",
"nodeType": "YulTypedName",
"src": "2975:18:12",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "3048:31:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "3050:27:12",
"value": {
"arguments": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "3064:6:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3072:4:12",
"type": "",
"value": "0x7f"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "3060:3:12"
},
"nodeType": "YulFunctionCall",
"src": "3060:17:12"
},
"variableNames": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "3050:6:12"
}
]
}
]
},
"condition": {
"arguments": [
{
"name": "outOfPlaceEncoding",
"nodeType": "YulIdentifier",
"src": "3028:18:12"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "3021:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3021:26:12"
},
"nodeType": "YulIf",
"src": "3018:2:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "3138:111:12",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3159:1:12",
"type": "",
"value": "0"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3166:3:12",
"type": "",
"value": "224"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3171:10:12",
"type": "",
"value": "0x4e487b71"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "3162:3:12"
},
"nodeType": "YulFunctionCall",
"src": "3162:20:12"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3152:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3152:31:12"
},
"nodeType": "YulExpressionStatement",
"src": "3152:31:12"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3203:1:12",
"type": "",
"value": "4"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3206:4:12",
"type": "",
"value": "0x22"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3196:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3196:15:12"
},
"nodeType": "YulExpressionStatement",
"src": "3196:15:12"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3231:1:12",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3234:4:12",
"type": "",
"value": "0x24"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "3224:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3224:15:12"
},
"nodeType": "YulExpressionStatement",
"src": "3224:15:12"
}
]
},
"condition": {
"arguments": [
{
"name": "outOfPlaceEncoding",
"nodeType": "YulIdentifier",
"src": "3094:18:12"
},
{
"arguments": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "3117:6:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3125:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "3114:2:12"
},
"nodeType": "YulFunctionCall",
"src": "3114:14:12"
}
],
"functionName": {
"name": "eq",
"nodeType": "YulIdentifier",
"src": "3091:2:12"
},
"nodeType": "YulFunctionCall",
"src": "3091:38:12"
},
"nodeType": "YulIf",
"src": "3088:2:12"
}
]
},
"name": "extract_byte_array_length",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "data",
"nodeType": "YulTypedName",
"src": "2910:4:12",
"type": ""
}
],
"returnVariables": [
{
"name": "length",
"nodeType": "YulTypedName",
"src": "2919:6:12",
"type": ""
}
],
"src": "2875:380:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "3292:95:12",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3309:1:12",
"type": "",
"value": "0"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3316:3:12",
"type": "",
"value": "224"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3321:10:12",
"type": "",
"value": "0x4e487b71"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "3312:3:12"
},
"nodeType": "YulFunctionCall",
"src": "3312:20:12"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3302:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3302:31:12"
},
"nodeType": "YulExpressionStatement",
"src": "3302:31:12"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3349:1:12",
"type": "",
"value": "4"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3352:4:12",
"type": "",
"value": "0x11"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3342:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3342:15:12"
},
"nodeType": "YulExpressionStatement",
"src": "3342:15:12"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3373:1:12",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3376:4:12",
"type": "",
"value": "0x24"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "3366:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3366:15:12"
},
"nodeType": "YulExpressionStatement",
"src": "3366:15:12"
}
]
},
"name": "panic_error_0x11",
"nodeType": "YulFunctionDefinition",
"src": "3260:127:12"
}
]
},
"contents": "{\n { }\n function abi_encode_tuple_t_stringliteral_68571e1369f7a6dcdcd736cb0343b35a58ed0f64d245c2ed839c98d412744f8a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 16)\n mstore(add(headStart, 64), \"Pausable: paused\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ERC20: mint to the zero address\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function checked_exp_helper(_power, _base, exponent, max) -> power, base\n {\n power := _power\n base := _base\n for { } true { }\n {\n let _1 := 1\n if iszero(gt(exponent, _1)) { break }\n if gt(base, div(max, base)) { panic_error_0x11() }\n if and(exponent, _1) { power := mul(power, base) }\n base := mul(base, base)\n exponent := shr(_1, exponent)\n }\n }\n function checked_exp_t_uint256_t_uint8(base, exponent) -> power\n {\n power := checked_exp_unsigned(base, and(exponent, 0xff), not(0))\n }\n function checked_exp_unsigned(base, exponent, max) -> power\n {\n if iszero(exponent)\n {\n power := 1\n leave\n }\n if iszero(base)\n {\n power := 0\n leave\n }\n switch base\n case 1 {\n power := 1\n leave\n }\n case 2 {\n if gt(exponent, 255) { panic_error_0x11() }\n power := shl(exponent, 1)\n if gt(power, max) { panic_error_0x11() }\n leave\n }\n if or(and(lt(base, 11), lt(exponent, 78)), and(lt(base, 307), lt(exponent, 32)))\n {\n power := exp(base, exponent)\n if gt(power, max) { panic_error_0x11() }\n leave\n }\n let power_1, base_1 := checked_exp_helper(1, base, exponent, max)\n if gt(power_1, div(max, base_1)) { panic_error_0x11() }\n power := mul(power_1, base_1)\n }\n function checked_mul_t_uint256(x, y) -> product\n {\n if and(iszero(iszero(x)), gt(y, div(not(0), x))) { panic_error_0x11() }\n product := mul(x, y)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function extract_byte_array_length(data) -> length\n {\n length := div(data, 2)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n function panic_error_0x11()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n}",
"id": 12,
"language": "Yul",
"name": "#utility.yul"
}
],
"linkReferences": {},
"object": "60806040523480156200001157600080fd5b50604080518082018252601581527f596574416e6f7468657243727970746f546f6b656e0000000000000000000000602080830191825283518085019094526004845263165050d560e21b9084015281519192916200007391600391620003f3565b50805162000089906004906020840190620003f3565b50505060006200009e6200013360201b60201c565b600980546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506009805460ff60a01b191690556200012d336200010862000137565b6200011590600a6200056b565b6200012790655af3107a400062000663565b6200013c565b620006f2565b3390565b601290565b6001600160a01b0382166200016e5760405162461bcd60e51b81526004016200016590620004c3565b60405180910390fd5b6200017c6000838362000210565b806002600082825462000190919062000503565b90915550506001600160a01b03821660009081526020819052604081208054839290620001bf90849062000503565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9062000204908590620004fa565b60405180910390a35050565b6200021a62000257565b156200023a5760405162461bcd60e51b8152600401620001659062000499565b620002528383836200026760201b620008e61760201c565b505050565b600954600160a01b900460ff1690565b6200027f8383836200025260201b6200068a1760201c565b6001600160a01b038316620002a9576200029982620002d4565b620002a362000305565b62000252565b6001600160a01b038216620002c3576200029983620002d4565b620002ce83620002d4565b62000252825b6001600160a01b03811660009081526005602052604090206200030290620002fc8362000317565b62000336565b50565b620003156006620002fc62000392565b565b6001600160a01b0381166000908152602081905260409020545b919050565b60006200034f60086200039860201b6200093e1760201c565b9050806200035d846200039c565b101562000252578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b60025490565b5490565b8054600090620003af5750600062000331565b81548290620003c19060019062000685565b81548110620003e057634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905062000331565b82805462000401906200069f565b90600052602060002090601f01602090048101928262000425576000855562000470565b82601f106200044057805160ff191683800117855562000470565b8280016001018555821562000470579182015b828111156200047057825182559160200191906001019062000453565b506200047e92915062000482565b5090565b5b808211156200047e576000815560010162000483565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60008219821115620005195762000519620006dc565b500190565b80825b600180861162000532575062000562565b818704821115620005475762000547620006dc565b808616156200055557918102915b9490941c93800262000521565b94509492505050565b60006200057f60001960ff85168462000586565b9392505050565b60008262000597575060016200057f565b81620005a6575060006200057f565b8160018114620005bf5760028114620005ca57620005fe565b60019150506200057f565b60ff841115620005de57620005de620006dc565b6001841b915084821115620005f757620005f7620006dc565b506200057f565b5060208310610133831016604e8410600b841016171562000636575081810a83811115620006305762000630620006dc565b6200057f565b6200064584848460016200051e565b8086048211156200065a576200065a620006dc565b02949350505050565b6000816000190483118215151615620006805762000680620006dc565b500290565b6000828210156200069a576200069a620006dc565b500390565b600281046001821680620006b457607f821691505b60208210811415620006d657634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b61175d80620007026000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c806370a08231116100c35780639711715a1161007c5780639711715a1461027e578063981b24d014610286578063a457c2d714610299578063a9059cbb146102ac578063dd62ed3e146102bf578063f2fde38b146102d25761014d565b806370a082311461022b578063715018a61461023e57806379cc6790146102465780638456cb59146102595780638da5cb5b1461026157806395d89b41146102765761014d565b8063395093511161011557806339509351146101cd5780633f4ba83a146101e057806340c10f19146101ea57806342966c68146101fd5780634ee2cd7e146102105780635c975abb146102235761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd1461019057806323b872dd146101a5578063313ce567146101b8575b600080fd5b61015a6102e5565b60405161016791906111e6565b60405180910390f35b61018361017e366004611186565b610377565b60405161016791906111db565b610198610395565b6040516101679190611652565b6101836101b336600461114b565b61039b565b6101c061043b565b604051610167919061165b565b6101836101db366004611186565b610440565b6101e861048f565b005b6101e86101f8366004611186565b6104d8565b6101e861020b3660046111af565b610525565b61019861021e366004611186565b610539565b610183610582565b6101986102393660046110ff565b610592565b6101e86105b1565b6101e8610254366004611186565b61063a565b6101e861068f565b6102696106d6565b60405161016791906111c7565b61015a6106e5565b6101e86106f4565b6101986102943660046111af565b61073b565b6101836102a7366004611186565b61076b565b6101836102ba366004611186565b6107e6565b6101986102cd366004611119565b6107fa565b6101e86102e03660046110ff565b610825565b6060600380546102f4906116ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610320906116ac565b801561036d5780601f106103425761010080835404028352916020019161036d565b820191906000526020600020905b81548152906001019060200180831161035057829003601f168201915b5050505050905090565b600061038b610384610942565b8484610946565b5060015b92915050565b60025490565b60006103a88484846109fa565b6001600160a01b0384166000908152600160205260408120816103c9610942565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156104155760405162461bcd60e51b815260040161040c9061141b565b60405180910390fd5b61043085610421610942565b61042b8685611695565b610946565b506001949350505050565b601290565b600061038b61044d610942565b84846001600061045b610942565b6001600160a01b03908116825260208083019390935260409182016000908120918b168152925290205461042b9190611669565b610497610942565b6001600160a01b03166104a86106d6565b6001600160a01b0316146104ce5760405162461bcd60e51b815260040161040c90611463565b6104d6610b22565b565b6104e0610942565b6001600160a01b03166104f16106d6565b6001600160a01b0316146105175760405162461bcd60e51b815260040161040c90611463565b6105218282610b93565b5050565b610536610530610942565b82610c53565b50565b6001600160a01b038216600090815260056020526040812081908190610560908590610d39565b91509150816105775761057285610592565b610579565b805b95945050505050565b600954600160a01b900460ff1690565b6001600160a01b0381166000908152602081905260409020545b919050565b6105b9610942565b6001600160a01b03166105ca6106d6565b6001600160a01b0316146105f05760405162461bcd60e51b815260040161040c90611463565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6000610648836102cd610942565b90508181101561066a5760405162461bcd60e51b815260040161040c90611498565b61068083610676610942565b61042b8585611695565b61068a8383610c53565b505050565b610697610942565b6001600160a01b03166106a86106d6565b6001600160a01b0316146106ce5760405162461bcd60e51b815260040161040c90611463565b6104d6610de7565b6009546001600160a01b031690565b6060600480546102f4906116ac565b6106fc610942565b6001600160a01b031661070d6106d6565b6001600160a01b0316146107335760405162461bcd60e51b815260040161040c90611463565b610536610e48565b600080600061074b846006610d39565b91509150816107615761075c610395565b610763565b805b949350505050565b6000806001600061077a610942565b6001600160a01b03908116825260208083019390935260409182016000908120918816815292529020549050828110156107c65760405162461bcd60e51b815260040161040c906115d6565b6107dc6107d1610942565b8561042b8685611695565b5060019392505050565b600061038b6107f3610942565b84846109fa565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61082d610942565b6001600160a01b031661083e6106d6565b6001600160a01b0316146108645760405162461bcd60e51b815260040161040c90611463565b6001600160a01b03811661088a5760405162461bcd60e51b815260040161040c90611323565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6108f183838361068a565b6001600160a01b0383166109155761090882610e9e565b610910610ec8565b61068a565b6001600160a01b03821661092c5761090883610e9e565b61093583610e9e565b61068a82610e9e565b5490565b3390565b6001600160a01b03831661096c5760405162461bcd60e51b815260040161040c90611562565b6001600160a01b0382166109925760405162461bcd60e51b815260040161040c90611369565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906109ed908590611652565b60405180910390a3505050565b6001600160a01b038316610a205760405162461bcd60e51b815260040161040c9061151d565b6001600160a01b038216610a465760405162461bcd60e51b815260040161040c90611270565b610a51838383610ed5565b6001600160a01b03831660009081526020819052604090205481811015610a8a5760405162461bcd60e51b815260040161040c906113ab565b610a948282611695565b6001600160a01b038086166000908152602081905260408082209390935590851681529081208054849290610aca908490611669565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610b149190611652565b60405180910390a350505050565b610b2a610582565b610b465760405162461bcd60e51b815260040161040c906112b3565b6009805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610b7c610942565b604051610b8991906111c7565b60405180910390a1565b6001600160a01b038216610bb95760405162461bcd60e51b815260040161040c9061161b565b610bc560008383610ed5565b8060026000828254610bd79190611669565b90915550506001600160a01b03821660009081526020819052604081208054839290610c04908490611669565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610c47908590611652565b60405180910390a35050565b6001600160a01b038216610c795760405162461bcd60e51b815260040161040c906114dc565b610c8582600083610ed5565b6001600160a01b03821660009081526020819052604090205481811015610cbe5760405162461bcd60e51b815260040161040c906112e1565b610cc88282611695565b6001600160a01b03841660009081526020819052604081209190915560028054849290610cf6908490611695565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109ed908690611652565b60008060008411610d5c5760405162461bcd60e51b815260040161040c906115a6565b610d66600861093e565b841115610d855760405162461bcd60e51b815260040161040c90611239565b6000610d918486610f05565b8454909150811415610daa576000809250925050610de0565b6001846001018281548110610dcf57634e487b7160e01b600052603260045260246000fd5b906000526020600020015492509250505b9250929050565b610def610582565b15610e0c5760405162461bcd60e51b815260040161040c906113f1565b6009805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610b7c610942565b6000610e546008610fe4565b6000610e60600861093e565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051610e919190611652565b60405180910390a1905090565b6001600160a01b038116600090815260056020526040902061053690610ec383610592565b610fed565b6104d66006610ec3610395565b610edd610582565b15610efa5760405162461bcd60e51b815260040161040c906113f1565b61068a8383836108e6565b8154600090610f165750600061038f565b82546000905b80821015610f80576000610f308383611039565b905084868281548110610f5357634e487b7160e01b600052603260045260246000fd5b90600052602060002001541115610f6c57809150610f7a565b610f77816001611669565b92505b50610f1c565b600082118015610fc357508385610f98600185611695565b81548110610fb657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154145b15610fdc57610fd3600183611695565b9250505061038f565b50905061038f565b80546001019055565b6000610ff9600861093e565b90508061100584611097565b101561068a578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b6000600261104781846116e7565b6110526002866116e7565b61105c9190611669565b6110669190611681565b611071600284611681565b61107c600286611681565b6110869190611669565b6110909190611669565b9392505050565b80546000906110a8575060006105ac565b815482906110b890600190611695565b815481106110d657634e487b7160e01b600052603260045260246000fd5b906000526020600020015490506105ac565b80356001600160a01b03811681146105ac57600080fd5b600060208284031215611110578081fd5b611090826110e8565b6000806040838503121561112b578081fd5b611134836110e8565b9150611142602084016110e8565b90509250929050565b60008060006060848603121561115f578081fd5b611168846110e8565b9250611176602085016110e8565b9150604084013590509250925092565b60008060408385031215611198578182fd5b6111a1836110e8565b946020939093013593505050565b6000602082840312156111c0578081fd5b5035919050565b6001600160a01b0391909116815260200190565b901515815260200190565b6000602080835283518082850152825b81811015611212578581018301518582016040015282016111f6565b818111156112235783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601d908201527f4552433230536e617073686f743a206e6f6e6578697374656e74206964000000604082015260600190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604082015263616e636560e01b606082015260800190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526016908201527504552433230536e617073686f743a20696420697320360541b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60ff91909116815260200190565b6000821982111561167c5761167c6116fb565b500190565b60008261169057611690611711565b500490565b6000828210156116a7576116a76116fb565b500390565b6002810460018216806116c057607f821691505b602082108114156116e157634e487b7160e01b600052602260045260246000fd5b50919050565b6000826116f6576116f6611711565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fdfea2646970667358221220d0c675e9e46f528f7f66b91a0da61ee05aba44fb87015dc8a15680fa2fc9ae6764736f6c63430008000033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH3 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 DUP1 MLOAD DUP1 DUP3 ADD DUP3 MSTORE PUSH1 0x15 DUP2 MSTORE PUSH32 0x596574416E6F7468657243727970746F546F6B656E0000000000000000000000 PUSH1 0x20 DUP1 DUP4 ADD SWAP2 DUP3 MSTORE DUP4 MLOAD DUP1 DUP6 ADD SWAP1 SWAP5 MSTORE PUSH1 0x4 DUP5 MSTORE PUSH4 0x165050D5 PUSH1 0xE2 SHL SWAP1 DUP5 ADD MSTORE DUP2 MLOAD SWAP2 SWAP3 SWAP2 PUSH3 0x73 SWAP2 PUSH1 0x3 SWAP2 PUSH3 0x3F3 JUMP JUMPDEST POP DUP1 MLOAD PUSH3 0x89 SWAP1 PUSH1 0x4 SWAP1 PUSH1 0x20 DUP5 ADD SWAP1 PUSH3 0x3F3 JUMP JUMPDEST POP POP POP PUSH1 0x0 PUSH3 0x9E PUSH3 0x133 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 DUP2 OR SWAP1 SWAP2 SSTORE PUSH1 0x40 MLOAD SWAP2 SWAP3 POP SWAP1 PUSH1 0x0 SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP3 SWAP1 LOG3 POP PUSH1 0x9 DUP1 SLOAD PUSH1 0xFF PUSH1 0xA0 SHL NOT AND SWAP1 SSTORE PUSH3 0x12D CALLER PUSH3 0x108 PUSH3 0x137 JUMP JUMPDEST PUSH3 0x115 SWAP1 PUSH1 0xA PUSH3 0x56B JUMP JUMPDEST PUSH3 0x127 SWAP1 PUSH6 0x5AF3107A4000 PUSH3 0x663 JUMP JUMPDEST PUSH3 0x13C JUMP JUMPDEST PUSH3 0x6F2 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x12 SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH3 0x16E JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x165 SWAP1 PUSH3 0x4C3 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH3 0x17C PUSH1 0x0 DUP4 DUP4 PUSH3 0x210 JUMP JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH3 0x190 SWAP2 SWAP1 PUSH3 0x503 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH3 0x1BF SWAP1 DUP5 SWAP1 PUSH3 0x503 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH1 0x0 SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 PUSH3 0x204 SWAP1 DUP6 SWAP1 PUSH3 0x4FA JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH3 0x21A PUSH3 0x257 JUMP JUMPDEST ISZERO PUSH3 0x23A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH3 0x165 SWAP1 PUSH3 0x499 JUMP JUMPDEST PUSH3 0x252 DUP4 DUP4 DUP4 PUSH3 0x267 PUSH1 0x20 SHL PUSH3 0x8E6 OR PUSH1 0x20 SHR JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH3 0x27F DUP4 DUP4 DUP4 PUSH3 0x252 PUSH1 0x20 SHL PUSH3 0x68A OR PUSH1 0x20 SHR JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH3 0x2A9 JUMPI PUSH3 0x299 DUP3 PUSH3 0x2D4 JUMP JUMPDEST PUSH3 0x2A3 PUSH3 0x305 JUMP JUMPDEST PUSH3 0x252 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH3 0x2C3 JUMPI PUSH3 0x299 DUP4 PUSH3 0x2D4 JUMP JUMPDEST PUSH3 0x2CE DUP4 PUSH3 0x2D4 JUMP JUMPDEST PUSH3 0x252 DUP3 JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH3 0x302 SWAP1 PUSH3 0x2FC DUP4 PUSH3 0x317 JUMP JUMPDEST PUSH3 0x336 JUMP JUMPDEST POP JUMP JUMPDEST PUSH3 0x315 PUSH1 0x6 PUSH3 0x2FC PUSH3 0x392 JUMP JUMPDEST JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x34F PUSH1 0x8 PUSH3 0x398 PUSH1 0x20 SHL PUSH3 0x93E OR PUSH1 0x20 SHR JUMP JUMPDEST SWAP1 POP DUP1 PUSH3 0x35D DUP5 PUSH3 0x39C JUMP JUMPDEST LT ISZERO PUSH3 0x252 JUMPI DUP3 SLOAD PUSH1 0x1 DUP1 DUP3 ADD DUP6 SSTORE PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 ADD SWAP4 SWAP1 SWAP4 SSTORE SWAP4 DUP5 ADD DUP1 SLOAD SWAP5 DUP6 ADD DUP2 SSTORE DUP3 MSTORE SWAP1 KECCAK256 SWAP1 SWAP2 ADD SSTORE JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST DUP1 SLOAD PUSH1 0x0 SWAP1 PUSH3 0x3AF JUMPI POP PUSH1 0x0 PUSH3 0x331 JUMP JUMPDEST DUP2 SLOAD DUP3 SWAP1 PUSH3 0x3C1 SWAP1 PUSH1 0x1 SWAP1 PUSH3 0x685 JUMP JUMPDEST DUP2 SLOAD DUP2 LT PUSH3 0x3E0 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP PUSH3 0x331 JUMP JUMPDEST DUP3 DUP1 SLOAD PUSH3 0x401 SWAP1 PUSH3 0x69F JUMP JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 PUSH1 0x1F ADD PUSH1 0x20 SWAP1 DIV DUP2 ADD SWAP3 DUP3 PUSH3 0x425 JUMPI PUSH1 0x0 DUP6 SSTORE PUSH3 0x470 JUMP JUMPDEST DUP3 PUSH1 0x1F LT PUSH3 0x440 JUMPI DUP1 MLOAD PUSH1 0xFF NOT AND DUP4 DUP1 ADD OR DUP6 SSTORE PUSH3 0x470 JUMP JUMPDEST DUP3 DUP1 ADD PUSH1 0x1 ADD DUP6 SSTORE DUP3 ISZERO PUSH3 0x470 JUMPI SWAP2 DUP3 ADD JUMPDEST DUP3 DUP2 GT ISZERO PUSH3 0x470 JUMPI DUP3 MLOAD DUP3 SSTORE SWAP2 PUSH1 0x20 ADD SWAP2 SWAP1 PUSH1 0x1 ADD SWAP1 PUSH3 0x453 JUMP JUMPDEST POP PUSH3 0x47E SWAP3 SWAP2 POP PUSH3 0x482 JUMP JUMPDEST POP SWAP1 JUMP JUMPDEST JUMPDEST DUP1 DUP3 GT ISZERO PUSH3 0x47E JUMPI PUSH1 0x0 DUP2 SSTORE PUSH1 0x1 ADD PUSH3 0x483 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x10 SWAP1 DUP3 ADD MSTORE PUSH16 0x14185D5CD8589B194E881C185D5CD959 PUSH1 0x82 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1F SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH3 0x519 JUMPI PUSH3 0x519 PUSH3 0x6DC JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST DUP1 DUP3 JUMPDEST PUSH1 0x1 DUP1 DUP7 GT PUSH3 0x532 JUMPI POP PUSH3 0x562 JUMP JUMPDEST DUP2 DUP8 DIV DUP3 GT ISZERO PUSH3 0x547 JUMPI PUSH3 0x547 PUSH3 0x6DC JUMP JUMPDEST DUP1 DUP7 AND ISZERO PUSH3 0x555 JUMPI SWAP2 DUP2 MUL SWAP2 JUMPDEST SWAP5 SWAP1 SWAP5 SHR SWAP4 DUP1 MUL PUSH3 0x521 JUMP JUMPDEST SWAP5 POP SWAP5 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH3 0x57F PUSH1 0x0 NOT PUSH1 0xFF DUP6 AND DUP5 PUSH3 0x586 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH3 0x597 JUMPI POP PUSH1 0x1 PUSH3 0x57F JUMP JUMPDEST DUP2 PUSH3 0x5A6 JUMPI POP PUSH1 0x0 PUSH3 0x57F JUMP JUMPDEST DUP2 PUSH1 0x1 DUP2 EQ PUSH3 0x5BF JUMPI PUSH1 0x2 DUP2 EQ PUSH3 0x5CA JUMPI PUSH3 0x5FE JUMP JUMPDEST PUSH1 0x1 SWAP2 POP POP PUSH3 0x57F JUMP JUMPDEST PUSH1 0xFF DUP5 GT ISZERO PUSH3 0x5DE JUMPI PUSH3 0x5DE PUSH3 0x6DC JUMP JUMPDEST PUSH1 0x1 DUP5 SHL SWAP2 POP DUP5 DUP3 GT ISZERO PUSH3 0x5F7 JUMPI PUSH3 0x5F7 PUSH3 0x6DC JUMP JUMPDEST POP PUSH3 0x57F JUMP JUMPDEST POP PUSH1 0x20 DUP4 LT PUSH2 0x133 DUP4 LT AND PUSH1 0x4E DUP5 LT PUSH1 0xB DUP5 LT AND OR ISZERO PUSH3 0x636 JUMPI POP DUP2 DUP2 EXP DUP4 DUP2 GT ISZERO PUSH3 0x630 JUMPI PUSH3 0x630 PUSH3 0x6DC JUMP JUMPDEST PUSH3 0x57F JUMP JUMPDEST PUSH3 0x645 DUP5 DUP5 DUP5 PUSH1 0x1 PUSH3 0x51E JUMP JUMPDEST DUP1 DUP7 DIV DUP3 GT ISZERO PUSH3 0x65A JUMPI PUSH3 0x65A PUSH3 0x6DC JUMP JUMPDEST MUL SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP2 PUSH1 0x0 NOT DIV DUP4 GT DUP3 ISZERO ISZERO AND ISZERO PUSH3 0x680 JUMPI PUSH3 0x680 PUSH3 0x6DC JUMP JUMPDEST POP MUL SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH3 0x69A JUMPI PUSH3 0x69A PUSH3 0x6DC JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x2 DUP2 DIV PUSH1 0x1 DUP3 AND DUP1 PUSH3 0x6B4 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 EQ ISZERO PUSH3 0x6D6 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH2 0x175D DUP1 PUSH3 0x702 PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x14D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0x9711715A GT PUSH2 0x7C JUMPI DUP1 PUSH4 0x9711715A EQ PUSH2 0x27E JUMPI DUP1 PUSH4 0x981B24D0 EQ PUSH2 0x286 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x299 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x2AC JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x2BF JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x2D2 JUMPI PUSH2 0x14D JUMP JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x22B JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x23E JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x246 JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x259 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x261 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x276 JUMPI PUSH2 0x14D JUMP JUMPDEST DUP1 PUSH4 0x39509351 GT PUSH2 0x115 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x1CD JUMPI DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x1E0 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x1EA JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x1FD JUMPI DUP1 PUSH4 0x4EE2CD7E EQ PUSH2 0x210 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x223 JUMPI PUSH2 0x14D JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x152 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x170 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x190 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1A5 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1B8 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x15A PUSH2 0x2E5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x167 SWAP2 SWAP1 PUSH2 0x11E6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x183 PUSH2 0x17E CALLDATASIZE PUSH1 0x4 PUSH2 0x1186 JUMP JUMPDEST PUSH2 0x377 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x167 SWAP2 SWAP1 PUSH2 0x11DB JUMP JUMPDEST PUSH2 0x198 PUSH2 0x395 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x167 SWAP2 SWAP1 PUSH2 0x1652 JUMP JUMPDEST PUSH2 0x183 PUSH2 0x1B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x114B JUMP JUMPDEST PUSH2 0x39B JUMP JUMPDEST PUSH2 0x1C0 PUSH2 0x43B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x167 SWAP2 SWAP1 PUSH2 0x165B JUMP JUMPDEST PUSH2 0x183 PUSH2 0x1DB CALLDATASIZE PUSH1 0x4 PUSH2 0x1186 JUMP JUMPDEST PUSH2 0x440 JUMP JUMPDEST PUSH2 0x1E8 PUSH2 0x48F JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1E8 PUSH2 0x1F8 CALLDATASIZE PUSH1 0x4 PUSH2 0x1186 JUMP JUMPDEST PUSH2 0x4D8 JUMP JUMPDEST PUSH2 0x1E8 PUSH2 0x20B CALLDATASIZE PUSH1 0x4 PUSH2 0x11AF JUMP JUMPDEST PUSH2 0x525 JUMP JUMPDEST PUSH2 0x198 PUSH2 0x21E CALLDATASIZE PUSH1 0x4 PUSH2 0x1186 JUMP JUMPDEST PUSH2 0x539 JUMP JUMPDEST PUSH2 0x183 PUSH2 0x582 JUMP JUMPDEST PUSH2 0x198 PUSH2 0x239 CALLDATASIZE PUSH1 0x4 PUSH2 0x10FF JUMP JUMPDEST PUSH2 0x592 JUMP JUMPDEST PUSH2 0x1E8 PUSH2 0x5B1 JUMP JUMPDEST PUSH2 0x1E8 PUSH2 0x254 CALLDATASIZE PUSH1 0x4 PUSH2 0x1186 JUMP JUMPDEST PUSH2 0x63A JUMP JUMPDEST PUSH2 0x1E8 PUSH2 0x68F JUMP JUMPDEST PUSH2 0x269 PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x167 SWAP2 SWAP1 PUSH2 0x11C7 JUMP JUMPDEST PUSH2 0x15A PUSH2 0x6E5 JUMP JUMPDEST PUSH2 0x1E8 PUSH2 0x6F4 JUMP JUMPDEST PUSH2 0x198 PUSH2 0x294 CALLDATASIZE PUSH1 0x4 PUSH2 0x11AF JUMP JUMPDEST PUSH2 0x73B JUMP JUMPDEST PUSH2 0x183 PUSH2 0x2A7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1186 JUMP JUMPDEST PUSH2 0x76B JUMP JUMPDEST PUSH2 0x183 PUSH2 0x2BA CALLDATASIZE PUSH1 0x4 PUSH2 0x1186 JUMP JUMPDEST PUSH2 0x7E6 JUMP JUMPDEST PUSH2 0x198 PUSH2 0x2CD CALLDATASIZE PUSH1 0x4 PUSH2 0x1119 JUMP JUMPDEST PUSH2 0x7FA JUMP JUMPDEST PUSH2 0x1E8 PUSH2 0x2E0 CALLDATASIZE PUSH1 0x4 PUSH2 0x10FF JUMP JUMPDEST PUSH2 0x825 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD PUSH2 0x2F4 SWAP1 PUSH2 0x16AC JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x320 SWAP1 PUSH2 0x16AC JUMP JUMPDEST DUP1 ISZERO PUSH2 0x36D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x342 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x36D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x350 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38B PUSH2 0x384 PUSH2 0x942 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x946 JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A8 DUP5 DUP5 DUP5 PUSH2 0x9FA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP2 PUSH2 0x3C9 PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP DUP3 DUP2 LT ISZERO PUSH2 0x415 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x141B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x430 DUP6 PUSH2 0x421 PUSH2 0x942 JUMP JUMPDEST PUSH2 0x42B DUP7 DUP6 PUSH2 0x1695 JUMP JUMPDEST PUSH2 0x946 JUMP JUMPDEST POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x12 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38B PUSH2 0x44D PUSH2 0x942 JUMP JUMPDEST DUP5 DUP5 PUSH1 0x1 PUSH1 0x0 PUSH2 0x45B PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP12 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH2 0x42B SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST PUSH2 0x497 PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x4A8 PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x4CE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1463 JUMP JUMPDEST PUSH2 0x4D6 PUSH2 0xB22 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x4E0 PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x4F1 PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x517 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1463 JUMP JUMPDEST PUSH2 0x521 DUP3 DUP3 PUSH2 0xB93 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x536 PUSH2 0x530 PUSH2 0x942 JUMP JUMPDEST DUP3 PUSH2 0xC53 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP2 SWAP1 DUP2 SWAP1 PUSH2 0x560 SWAP1 DUP6 SWAP1 PUSH2 0xD39 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 PUSH2 0x577 JUMPI PUSH2 0x572 DUP6 PUSH2 0x592 JUMP JUMPDEST PUSH2 0x579 JUMP JUMPDEST DUP1 JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x5B9 PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x5CA PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x5F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1463 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x9 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x648 DUP4 PUSH2 0x2CD PUSH2 0x942 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 LT ISZERO PUSH2 0x66A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1498 JUMP JUMPDEST PUSH2 0x680 DUP4 PUSH2 0x676 PUSH2 0x942 JUMP JUMPDEST PUSH2 0x42B DUP6 DUP6 PUSH2 0x1695 JUMP JUMPDEST PUSH2 0x68A DUP4 DUP4 PUSH2 0xC53 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x697 PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x6A8 PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x6CE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1463 JUMP JUMPDEST PUSH2 0x4D6 PUSH2 0xDE7 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD PUSH2 0x2F4 SWAP1 PUSH2 0x16AC JUMP JUMPDEST PUSH2 0x6FC PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x70D PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x733 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1463 JUMP JUMPDEST PUSH2 0x536 PUSH2 0xE48 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x74B DUP5 PUSH1 0x6 PUSH2 0xD39 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 PUSH2 0x761 JUMPI PUSH2 0x75C PUSH2 0x395 JUMP JUMPDEST PUSH2 0x763 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 PUSH2 0x77A PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP9 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 POP DUP3 DUP2 LT ISZERO PUSH2 0x7C6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x15D6 JUMP JUMPDEST PUSH2 0x7DC PUSH2 0x7D1 PUSH2 0x942 JUMP JUMPDEST DUP6 PUSH2 0x42B DUP7 DUP6 PUSH2 0x1695 JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38B PUSH2 0x7F3 PUSH2 0x942 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x9FA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x82D PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x83E PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x864 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1463 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x88A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1323 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x9 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x8F1 DUP4 DUP4 DUP4 PUSH2 0x68A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x915 JUMPI PUSH2 0x908 DUP3 PUSH2 0xE9E JUMP JUMPDEST PUSH2 0x910 PUSH2 0xEC8 JUMP JUMPDEST PUSH2 0x68A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x92C JUMPI PUSH2 0x908 DUP4 PUSH2 0xE9E JUMP JUMPDEST PUSH2 0x935 DUP4 PUSH2 0xE9E JUMP JUMPDEST PUSH2 0x68A DUP3 PUSH2 0xE9E JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x96C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1562 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x992 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1369 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP5 SWAP1 SSTORE MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP1 PUSH2 0x9ED SWAP1 DUP6 SWAP1 PUSH2 0x1652 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xA20 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x151D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xA46 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1270 JUMP JUMPDEST PUSH2 0xA51 DUP4 DUP4 DUP4 PUSH2 0xED5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP2 LT ISZERO PUSH2 0xA8A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x13AB JUMP JUMPDEST PUSH2 0xA94 DUP3 DUP3 PUSH2 0x1695 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP6 AND DUP2 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP5 SWAP3 SWAP1 PUSH2 0xACA SWAP1 DUP5 SWAP1 PUSH2 0x1669 JUMP JUMPDEST SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0xB14 SWAP2 SWAP1 PUSH2 0x1652 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH2 0xB2A PUSH2 0x582 JUMP JUMPDEST PUSH2 0xB46 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x12B3 JUMP JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH1 0xFF PUSH1 0xA0 SHL NOT AND SWAP1 SSTORE PUSH32 0x5DB9EE0A495BF2E6FF9C91A7834C1BA4FDD244A5E8AA4E537BD38AEAE4B073AA PUSH2 0xB7C PUSH2 0x942 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xB89 SWAP2 SWAP1 PUSH2 0x11C7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xBB9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x161B JUMP JUMPDEST PUSH2 0xBC5 PUSH1 0x0 DUP4 DUP4 PUSH2 0xED5 JUMP JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0xBD7 SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xC04 SWAP1 DUP5 SWAP1 PUSH2 0x1669 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH1 0x0 SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 PUSH2 0xC47 SWAP1 DUP6 SWAP1 PUSH2 0x1652 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xC79 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x14DC JUMP JUMPDEST PUSH2 0xC85 DUP3 PUSH1 0x0 DUP4 PUSH2 0xED5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP2 LT ISZERO PUSH2 0xCBE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x12E1 JUMP JUMPDEST PUSH2 0xCC8 DUP3 DUP3 PUSH2 0x1695 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x2 DUP1 SLOAD DUP5 SWAP3 SWAP1 PUSH2 0xCF6 SWAP1 DUP5 SWAP1 PUSH2 0x1695 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 PUSH2 0x9ED SWAP1 DUP7 SWAP1 PUSH2 0x1652 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 GT PUSH2 0xD5C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x15A6 JUMP JUMPDEST PUSH2 0xD66 PUSH1 0x8 PUSH2 0x93E JUMP JUMPDEST DUP5 GT ISZERO PUSH2 0xD85 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1239 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD91 DUP5 DUP7 PUSH2 0xF05 JUMP JUMPDEST DUP5 SLOAD SWAP1 SWAP2 POP DUP2 EQ ISZERO PUSH2 0xDAA JUMPI PUSH1 0x0 DUP1 SWAP3 POP SWAP3 POP POP PUSH2 0xDE0 JUMP JUMPDEST PUSH1 0x1 DUP5 PUSH1 0x1 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0xDCF JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP3 POP SWAP3 POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0xDEF PUSH2 0x582 JUMP JUMPDEST ISZERO PUSH2 0xE0C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x13F1 JUMP JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH1 0xFF PUSH1 0xA0 SHL NOT AND PUSH1 0x1 PUSH1 0xA0 SHL OR SWAP1 SSTORE PUSH32 0x62E78CEA01BEE320CD4E420270B5EA74000D11B0C9F74754EBDBFC544B05A258 PUSH2 0xB7C PUSH2 0x942 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE54 PUSH1 0x8 PUSH2 0xFE4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE60 PUSH1 0x8 PUSH2 0x93E JUMP JUMPDEST SWAP1 POP PUSH32 0x8030E83B04D87BEF53480E26263266D6CA66863AA8506ACA6F2559D18AA1CB67 DUP2 PUSH1 0x40 MLOAD PUSH2 0xE91 SWAP2 SWAP1 PUSH2 0x1652 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x536 SWAP1 PUSH2 0xEC3 DUP4 PUSH2 0x592 JUMP JUMPDEST PUSH2 0xFED JUMP JUMPDEST PUSH2 0x4D6 PUSH1 0x6 PUSH2 0xEC3 PUSH2 0x395 JUMP JUMPDEST PUSH2 0xEDD PUSH2 0x582 JUMP JUMPDEST ISZERO PUSH2 0xEFA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x13F1 JUMP JUMPDEST PUSH2 0x68A DUP4 DUP4 DUP4 PUSH2 0x8E6 JUMP JUMPDEST DUP2 SLOAD PUSH1 0x0 SWAP1 PUSH2 0xF16 JUMPI POP PUSH1 0x0 PUSH2 0x38F JUMP JUMPDEST DUP3 SLOAD PUSH1 0x0 SWAP1 JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xF80 JUMPI PUSH1 0x0 PUSH2 0xF30 DUP4 DUP4 PUSH2 0x1039 JUMP JUMPDEST SWAP1 POP DUP5 DUP7 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0xF53 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD GT ISZERO PUSH2 0xF6C JUMPI DUP1 SWAP2 POP PUSH2 0xF7A JUMP JUMPDEST PUSH2 0xF77 DUP2 PUSH1 0x1 PUSH2 0x1669 JUMP JUMPDEST SWAP3 POP JUMPDEST POP PUSH2 0xF1C JUMP JUMPDEST PUSH1 0x0 DUP3 GT DUP1 ISZERO PUSH2 0xFC3 JUMPI POP DUP4 DUP6 PUSH2 0xF98 PUSH1 0x1 DUP6 PUSH2 0x1695 JUMP JUMPDEST DUP2 SLOAD DUP2 LT PUSH2 0xFB6 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD EQ JUMPDEST ISZERO PUSH2 0xFDC JUMPI PUSH2 0xFD3 PUSH1 0x1 DUP4 PUSH2 0x1695 JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x38F JUMP JUMPDEST POP SWAP1 POP PUSH2 0x38F JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFF9 PUSH1 0x8 PUSH2 0x93E JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x1005 DUP5 PUSH2 0x1097 JUMP JUMPDEST LT ISZERO PUSH2 0x68A JUMPI DUP3 SLOAD PUSH1 0x1 DUP1 DUP3 ADD DUP6 SSTORE PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 ADD SWAP4 SWAP1 SWAP4 SSTORE SWAP4 DUP5 ADD DUP1 SLOAD SWAP5 DUP6 ADD DUP2 SSTORE DUP3 MSTORE SWAP1 KECCAK256 SWAP1 SWAP2 ADD SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH2 0x1047 DUP2 DUP5 PUSH2 0x16E7 JUMP JUMPDEST PUSH2 0x1052 PUSH1 0x2 DUP7 PUSH2 0x16E7 JUMP JUMPDEST PUSH2 0x105C SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST PUSH2 0x1066 SWAP2 SWAP1 PUSH2 0x1681 JUMP JUMPDEST PUSH2 0x1071 PUSH1 0x2 DUP5 PUSH2 0x1681 JUMP JUMPDEST PUSH2 0x107C PUSH1 0x2 DUP7 PUSH2 0x1681 JUMP JUMPDEST PUSH2 0x1086 SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST PUSH2 0x1090 SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x10A8 JUMPI POP PUSH1 0x0 PUSH2 0x5AC JUMP JUMPDEST DUP2 SLOAD DUP3 SWAP1 PUSH2 0x10B8 SWAP1 PUSH1 0x1 SWAP1 PUSH2 0x1695 JUMP JUMPDEST DUP2 SLOAD DUP2 LT PUSH2 0x10D6 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP PUSH2 0x5AC JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x5AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1110 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1090 DUP3 PUSH2 0x10E8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x112B JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1134 DUP4 PUSH2 0x10E8 JUMP JUMPDEST SWAP2 POP PUSH2 0x1142 PUSH1 0x20 DUP5 ADD PUSH2 0x10E8 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x115F JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1168 DUP5 PUSH2 0x10E8 JUMP JUMPDEST SWAP3 POP PUSH2 0x1176 PUSH1 0x20 DUP6 ADD PUSH2 0x10E8 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1198 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x11A1 DUP4 PUSH2 0x10E8 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x11C0 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE DUP3 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1212 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x11F6 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1223 JUMPI DUP4 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4552433230536E617073686F743A206E6F6E6578697374656E74206964000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220746F20746865207A65726F2061646472 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x657373 PUSH1 0xE8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH20 0x14185D5CD8589B194E881B9BDD081C185D5CD959 PUSH1 0x62 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x22 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A206275726E20616D6F756E7420657863656564732062616C616E PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x6365 PUSH1 0xF0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x646472657373 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x22 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F766520746F20746865207A65726F206164647265 PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x7373 PUSH1 0xF0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220616D6F756E7420657863656564732062 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x616C616E6365 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x10 SWAP1 DUP3 ADD MSTORE PUSH16 0x14185D5CD8589B194E881C185D5CD959 PUSH1 0x82 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x28 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220616D6F756E7420657863656564732061 PUSH1 0x40 DUP3 ADD MSTORE PUSH8 0x6C6C6F77616E6365 PUSH1 0xC0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x24 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A206275726E20616D6F756E74206578636565647320616C6C6F77 PUSH1 0x40 DUP3 ADD MSTORE PUSH4 0x616E6365 PUSH1 0xE0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A206275726E2066726F6D20746865207A65726F20616464726573 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x73 PUSH1 0xF8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E736665722066726F6D20746865207A65726F206164 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0x6472657373 PUSH1 0xD8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x24 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F76652066726F6D20746865207A65726F20616464 PUSH1 0x40 DUP3 ADD MSTORE PUSH4 0x72657373 PUSH1 0xE0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x4552433230536E617073686F743A206964206973203 PUSH1 0x54 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A2064656372656173656420616C6C6F77616E63652062656C6F77 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0x207A65726F PUSH1 0xD8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1F SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x167C JUMPI PUSH2 0x167C PUSH2 0x16FB JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1690 JUMPI PUSH2 0x1690 PUSH2 0x1711 JUMP JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x16A7 JUMPI PUSH2 0x16A7 PUSH2 0x16FB JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x2 DUP2 DIV PUSH1 0x1 DUP3 AND DUP1 PUSH2 0x16C0 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 EQ ISZERO PUSH2 0x16E1 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x16F6 JUMPI PUSH2 0x16F6 PUSH2 0x1711 JUMP JUMPDEST POP MOD SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD0 0xC6 PUSH22 0xE9E46F528F7F66B91A0DA61EE05ABA44FB87015DC8A1 JUMP DUP1 STATICCALL 0x2F 0xC9 0xAE PUSH8 0x64736F6C63430008 STOP STOP CALLER ",
"sourceMap": "403:745:11:-:0;;;498:123;;;;;;;;;-1:-1:-1;1898:114:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1898:114:2;;;;1965:13;;1898:114;;;1965:13;;:5;;:13;:::i;:::-;-1:-1:-1;1988:17:2;;;;:7;;:17;;;;;:::i;:::-;;1898:114;;867:17:0;887:12;:10;;;:12;;:::i;:::-;909:6;:18;;-1:-1:-1;;;;;;909:18:0;-1:-1:-1;;;;;909:18:0;;;;;;;;942:43;;909:18;;-1:-1:-1;909:18:0;-1:-1:-1;;942:43:0;;-1:-1:-1;;942:43:0;-1:-1:-1;925:7:1;:15;;-1:-1:-1;;;;925:15:1;;;561:53:11::1;567:10;603;:8;:10::i;:::-;597:16;::::0;:2:::1;:16;:::i;:::-;579:34;::::0;:15:::1;:34;:::i;:::-;561:5;:53::i;:::-;403:745:::0;;586:96:8;665:10;586:96;:::o;3014:91:2:-;3096:2;3014:91;:::o;8023:330::-;-1:-1:-1;;;;;8106:21:2;;8098:65;;;;-1:-1:-1;;;8098:65:2;;;;;;;:::i;:::-;;;;;;;;;8174:49;8203:1;8207:7;8216:6;8174:20;:49::i;:::-;8250:6;8234:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;8266:18:2;;:9;:18;;;;;;;;;;:28;;8288:6;;8266:9;:28;;8288:6;;8266:28;:::i;:::-;;;;-1:-1:-1;;8309:37:2;;-1:-1:-1;;;;;8309:37:2;;;8326:1;;8309:37;;;;8339:6;;8309:37;:::i;:::-;;;;;;;;8023:330;;:::o;931:215:11:-;1356:8:1;:6;:8::i;:::-;1355:9;1347:38;;;;-1:-1:-1;;;1347:38:1;;;;;;;:::i;:::-;1095:44:11::1;1122:4;1128:2;1132:6;1095:26;;;;;:44;;:::i;:::-;931:215:::0;;;:::o;1042:84:1:-;1112:7;;-1:-1:-1;;;1112:7:1;;;;;1042:84::o;5022:526:5:-;5128:44;5155:4;5161:2;5165:6;5128:26;;;;;:44;;:::i;:::-;-1:-1:-1;;;;;5185:18:5;;5181:361;;5231:26;5254:2;5231:22;:26::i;:::-;5267:28;:26;:28::i;:::-;5181:361;;;-1:-1:-1;;;;;5314:16:5;;5310:232;;5358:28;5381:4;5358:22;:28::i;5310:232::-;5469:28;5492:4;5469:22;:28::i;:::-;5507:26;5530:2;7224:144;-1:-1:-1;;;;;7307:33:5;;;;;;:24;:33;;;;;7291:70;;7342:18;7332:7;7342:9;:18::i;:::-;7291:15;:70::i;:::-;7224:144;:::o;7374:116::-;7430:53;7446:21;7469:13;:11;:13::i;7430:53::-;7374:116::o;3329:125:2:-;-1:-1:-1;;;;;3429:18:2;;3403:7;3429:18;;;;;;;;;;;3329:125;;;;:::o;7496:309:5:-;7590:17;7610:28;:18;:26;;;;;:28;;:::i;:::-;7590:48;-1:-1:-1;7590:48:5;7652:30;7668:9;7652:15;:30::i;:::-;:42;7648:151;;;7710:29;;;;;;;;-1:-1:-1;7710:29:5;;;;;;;;;;;;;;7753:16;;;:35;;;;;;;;;;;;;;;7496:309::o;3165:106:2:-;3252:12;;3165:106;:::o;773:112:9:-;864:14;;773:112::o;7811:206:5:-;7904:10;;7881:7;;7900:111;;-1:-1:-1;7942:1:5;7935:8;;7900:111;7985:10;;7981:3;;7985:14;;7998:1;;7985:14;:::i;:::-;7981:19;;;;;;-1:-1:-1;;;7981:19:5;;;;;;;;;;;;;;;;;7974:26;;;;403:745:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;403:745:11;;;-1:-1:-1;403:745:11;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:340:12;216:2;198:21;;;255:2;235:18;;;228:30;-1:-1:-1;;;289:2:12;274:18;;267:46;345:2;330:18;;188:166::o;359:355::-;561:2;543:21;;;600:2;580:18;;;573:30;639:33;634:2;619:18;;612:61;705:2;690:18;;533:181::o;719:177::-;865:25;;;853:2;838:18;;820:76::o;901:128::-;;972:1;968:6;965:1;962:13;959:2;;;978:18;;:::i;:::-;-1:-1:-1;1014:9:12;;949:80::o;1034:453::-;1130:6;1153:5;1167:314;1216:1;1253:2;1243:8;1240:16;1230:2;;1260:5;;;1230:2;1301:4;1296:3;1292:14;1286:4;1283:24;1280:2;;;1310:18;;:::i;:::-;1360:2;1350:8;1346:17;1343:2;;;1375:16;;;;1343:2;1454:17;;;;;1414:15;;1167:314;;;1111:376;;;;;;;:::o;1492:148::-;;1579:55;-1:-1:-1;;1620:4:12;1606:19;;1600:4;1579:55;:::i;:::-;1570:64;1560:80;-1:-1:-1;;;1560:80:12:o;1645:922::-;;1729:8;1719:2;;-1:-1:-1;1770:1:12;1784:5;;1719:2;1818:4;1808:2;;-1:-1:-1;1855:1:12;1869:5;;1808:2;1900:4;1918:1;1913:59;;;;1986:1;1981:183;;;;1893:271;;1913:59;1943:1;1934:10;;1957:5;;;1981:183;2018:3;2008:8;2005:17;2002:2;;;2025:18;;:::i;:::-;2081:1;2071:8;2067:16;2058:25;;2109:3;2102:5;2099:14;2096:2;;;2116:18;;:::i;:::-;2149:5;;;1893:271;;2248:2;2238:8;2235:16;2229:3;2223:4;2220:13;2216:36;2210:2;2200:8;2197:16;2192:2;2186:4;2183:12;2179:35;2176:77;2173:2;;;-1:-1:-1;2285:19:12;;;2320:14;;;2317:2;;;2337:18;;:::i;:::-;2370:5;;2173:2;2417:42;2455:3;2445:8;2439:4;2436:1;2417:42;:::i;:::-;2492:6;2487:3;2483:16;2474:7;2471:29;2468:2;;;2503:18;;:::i;:::-;2541:20;;1709:858;-1:-1:-1;;;;1709:858:12:o;2572:168::-;;2678:1;2674;2670:6;2666:14;2663:1;2660:21;2655:1;2648:9;2641:17;2637:45;2634:2;;;2685:18;;:::i;:::-;-1:-1:-1;2725:9:12;;2624:116::o;2745:125::-;;2813:1;2810;2807:8;2804:2;;;2818:18;;:::i;:::-;-1:-1:-1;2855:9:12;;2794:76::o;2875:380::-;2960:1;2950:12;;3007:1;2997:12;;;3018:2;;3072:4;3064:6;3060:17;3050:27;;3018:2;3125;3117:6;3114:14;3094:18;3091:38;3088:2;;;3171:10;3166:3;3162:20;3159:1;3152:31;3206:4;3203:1;3196:15;3234:4;3231:1;3224:15;3088:2;;2930:325;;;:::o;3260:127::-;3321:10;3316:3;3312:20;3309:1;3302:31;3352:4;3349:1;3342:15;3376:4;3373:1;3366:15;3292:95;403:745:11;;;;;;"
},
"deployedBytecode": {
"generatedSources": [
{
"ast": {
"nodeType": "YulBlock",
"src": "0:10600:12",
"statements": [
{
"nodeType": "YulBlock",
"src": "6:3:12",
"statements": []
},
{
"body": {
"nodeType": "YulBlock",
"src": "65:124:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "75:29:12",
"value": {
"arguments": [
{
"name": "offset",
"nodeType": "YulIdentifier",
"src": "97:6:12"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "84:12:12"
},
"nodeType": "YulFunctionCall",
"src": "84:20:12"
},
"variableNames": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "75:5:12"
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "167:16:12",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "176:1:12",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "179:1:12",
"type": "",
"value": "0"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "169:6:12"
},
"nodeType": "YulFunctionCall",
"src": "169:12:12"
},
"nodeType": "YulExpressionStatement",
"src": "169:12:12"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "126:5:12"
},
{
"arguments": [
{
"name": "value",
"nodeType": "YulIdentifier",
"src": "137:5:12"
},
{
"arguments": [
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "152:3:12",
"type": "",
"value": "160"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "157:1:12",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "148:3:12"
},
"nodeType": "YulFunctionCall",
"src": "148:11:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "161:1:12",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "144:3:12"
},
"nodeType": "YulFunctionCall",
"src": "144:19:12"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "133:3:12"
},
"nodeType": "YulFunctionCall",
"src": "133:31:12"
}
],
"functionName": {
"name": "eq",
"nodeType": "YulIdentifier",
"src": "123:2:12"
},
"nodeType": "YulFunctionCall",
"src": "123:42:12"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "116:6:12"
},
"nodeType": "YulFunctionCall",
"src": "116:50:12"
},
"nodeType": "YulIf",
"src": "113:2:12"
}
]
},
"name": "abi_decode_t_address",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "offset",
"nodeType": "YulTypedName",
"src": "44:6:12",
"type": ""
}
],
"returnVariables": [
{
"name": "value",
"nodeType": "YulTypedName",
"src": "55:5:12",
"type": ""
}
],
"src": "14:175:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "264:128:12",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "310:26:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "319:6:12"
},
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "327:6:12"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "312:6:12"
},
"nodeType": "YulFunctionCall",
"src": "312:22:12"
},
"nodeType": "YulExpressionStatement",
"src": "312:22:12"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "285:7:12"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "294:9:12"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "281:3:12"
},
"nodeType": "YulFunctionCall",
"src": "281:23:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "306:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "277:3:12"
},
"nodeType": "YulFunctionCall",
"src": "277:32:12"
},
"nodeType": "YulIf",
"src": "274:2:12"
},
{
"nodeType": "YulAssignment",
"src": "345:41:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "376:9:12"
}
],
"functionName": {
"name": "abi_decode_t_address",
"nodeType": "YulIdentifier",
"src": "355:20:12"
},
"nodeType": "YulFunctionCall",
"src": "355:31:12"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "345:6:12"
}
]
}
]
},
"name": "abi_decode_tuple_t_address",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "230:9:12",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "241:7:12",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "253:6:12",
"type": ""
}
],
"src": "194:198:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "484:187:12",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "530:26:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "539:6:12"
},
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "547:6:12"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "532:6:12"
},
"nodeType": "YulFunctionCall",
"src": "532:22:12"
},
"nodeType": "YulExpressionStatement",
"src": "532:22:12"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "505:7:12"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "514:9:12"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "501:3:12"
},
"nodeType": "YulFunctionCall",
"src": "501:23:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "526:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "497:3:12"
},
"nodeType": "YulFunctionCall",
"src": "497:32:12"
},
"nodeType": "YulIf",
"src": "494:2:12"
},
{
"nodeType": "YulAssignment",
"src": "565:41:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "596:9:12"
}
],
"functionName": {
"name": "abi_decode_t_address",
"nodeType": "YulIdentifier",
"src": "575:20:12"
},
"nodeType": "YulFunctionCall",
"src": "575:31:12"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "565:6:12"
}
]
},
{
"nodeType": "YulAssignment",
"src": "615:50:12",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "650:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "661:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "646:3:12"
},
"nodeType": "YulFunctionCall",
"src": "646:18:12"
}
],
"functionName": {
"name": "abi_decode_t_address",
"nodeType": "YulIdentifier",
"src": "625:20:12"
},
"nodeType": "YulFunctionCall",
"src": "625:40:12"
},
"variableNames": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "615:6:12"
}
]
}
]
},
"name": "abi_decode_tuple_t_addresst_address",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "442:9:12",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "453:7:12",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "465:6:12",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "473:6:12",
"type": ""
}
],
"src": "397:274:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "780:238:12",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "826:26:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "value2",
"nodeType": "YulIdentifier",
"src": "835:6:12"
},
{
"name": "value2",
"nodeType": "YulIdentifier",
"src": "843:6:12"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "828:6:12"
},
"nodeType": "YulFunctionCall",
"src": "828:22:12"
},
"nodeType": "YulExpressionStatement",
"src": "828:22:12"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "801:7:12"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "810:9:12"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "797:3:12"
},
"nodeType": "YulFunctionCall",
"src": "797:23:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "822:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "793:3:12"
},
"nodeType": "YulFunctionCall",
"src": "793:32:12"
},
"nodeType": "YulIf",
"src": "790:2:12"
},
{
"nodeType": "YulAssignment",
"src": "861:41:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "892:9:12"
}
],
"functionName": {
"name": "abi_decode_t_address",
"nodeType": "YulIdentifier",
"src": "871:20:12"
},
"nodeType": "YulFunctionCall",
"src": "871:31:12"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "861:6:12"
}
]
},
{
"nodeType": "YulAssignment",
"src": "911:50:12",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "946:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "957:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "942:3:12"
},
"nodeType": "YulFunctionCall",
"src": "942:18:12"
}
],
"functionName": {
"name": "abi_decode_t_address",
"nodeType": "YulIdentifier",
"src": "921:20:12"
},
"nodeType": "YulFunctionCall",
"src": "921:40:12"
},
"variableNames": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "911:6:12"
}
]
},
{
"nodeType": "YulAssignment",
"src": "970:42:12",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "997:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1008:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "993:3:12"
},
"nodeType": "YulFunctionCall",
"src": "993:18:12"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "980:12:12"
},
"nodeType": "YulFunctionCall",
"src": "980:32:12"
},
"variableNames": [
{
"name": "value2",
"nodeType": "YulIdentifier",
"src": "970:6:12"
}
]
}
]
},
"name": "abi_decode_tuple_t_addresst_addresst_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "730:9:12",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "741:7:12",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "753:6:12",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "761:6:12",
"type": ""
},
{
"name": "value2",
"nodeType": "YulTypedName",
"src": "769:6:12",
"type": ""
}
],
"src": "676:342:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1110:179:12",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "1156:26:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "1165:6:12"
},
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "1173:6:12"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "1158:6:12"
},
"nodeType": "YulFunctionCall",
"src": "1158:22:12"
},
"nodeType": "YulExpressionStatement",
"src": "1158:22:12"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "1131:7:12"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1140:9:12"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "1127:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1127:23:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1152:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "1123:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1123:32:12"
},
"nodeType": "YulIf",
"src": "1120:2:12"
},
{
"nodeType": "YulAssignment",
"src": "1191:41:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1222:9:12"
}
],
"functionName": {
"name": "abi_decode_t_address",
"nodeType": "YulIdentifier",
"src": "1201:20:12"
},
"nodeType": "YulFunctionCall",
"src": "1201:31:12"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "1191:6:12"
}
]
},
{
"nodeType": "YulAssignment",
"src": "1241:42:12",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1268:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1279:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1264:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1264:18:12"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "1251:12:12"
},
"nodeType": "YulFunctionCall",
"src": "1251:32:12"
},
"variableNames": [
{
"name": "value1",
"nodeType": "YulIdentifier",
"src": "1241:6:12"
}
]
}
]
},
"name": "abi_decode_tuple_t_addresst_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "1068:9:12",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "1079:7:12",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "1091:6:12",
"type": ""
},
{
"name": "value1",
"nodeType": "YulTypedName",
"src": "1099:6:12",
"type": ""
}
],
"src": "1023:266:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1364:120:12",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "1410:26:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "1419:6:12"
},
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "1427:6:12"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "1412:6:12"
},
"nodeType": "YulFunctionCall",
"src": "1412:22:12"
},
"nodeType": "YulExpressionStatement",
"src": "1412:22:12"
}
]
},
"condition": {
"arguments": [
{
"arguments": [
{
"name": "dataEnd",
"nodeType": "YulIdentifier",
"src": "1385:7:12"
},
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1394:9:12"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "1381:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1381:23:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1406:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "slt",
"nodeType": "YulIdentifier",
"src": "1377:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1377:32:12"
},
"nodeType": "YulIf",
"src": "1374:2:12"
},
{
"nodeType": "YulAssignment",
"src": "1445:33:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1468:9:12"
}
],
"functionName": {
"name": "calldataload",
"nodeType": "YulIdentifier",
"src": "1455:12:12"
},
"nodeType": "YulFunctionCall",
"src": "1455:23:12"
},
"variableNames": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "1445:6:12"
}
]
}
]
},
"name": "abi_decode_tuple_t_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "1330:9:12",
"type": ""
},
{
"name": "dataEnd",
"nodeType": "YulTypedName",
"src": "1341:7:12",
"type": ""
}
],
"returnVariables": [
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "1353:6:12",
"type": ""
}
],
"src": "1294:190:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1590:102:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1600:26:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1612:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1623:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1608:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1608:18:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "1600:4:12"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1642:9:12"
},
{
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "1657:6:12"
},
{
"arguments": [
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1673:3:12",
"type": "",
"value": "160"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1678:1:12",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "1669:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1669:11:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1682:1:12",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "1665:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1665:19:12"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "1653:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1653:32:12"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1635:6:12"
},
"nodeType": "YulFunctionCall",
"src": "1635:51:12"
},
"nodeType": "YulExpressionStatement",
"src": "1635:51:12"
}
]
},
"name": "abi_encode_tuple_t_address__to_t_address__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "1559:9:12",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "1570:6:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "1581:4:12",
"type": ""
}
],
"src": "1489:203:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "1792:92:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "1802:26:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1814:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "1825:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "1810:3:12"
},
"nodeType": "YulFunctionCall",
"src": "1810:18:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "1802:4:12"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "1844:9:12"
},
{
"arguments": [
{
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "1869:6:12"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "1862:6:12"
},
"nodeType": "YulFunctionCall",
"src": "1862:14:12"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "1855:6:12"
},
"nodeType": "YulFunctionCall",
"src": "1855:22:12"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "1837:6:12"
},
"nodeType": "YulFunctionCall",
"src": "1837:41:12"
},
"nodeType": "YulExpressionStatement",
"src": "1837:41:12"
}
]
},
"name": "abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "1761:9:12",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "1772:6:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "1783:4:12",
"type": ""
}
],
"src": "1697:187:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2010:482:12",
"statements": [
{
"nodeType": "YulVariableDeclaration",
"src": "2020:12:12",
"value": {
"kind": "number",
"nodeType": "YulLiteral",
"src": "2030:2:12",
"type": "",
"value": "32"
},
"variables": [
{
"name": "_1",
"nodeType": "YulTypedName",
"src": "2024:2:12",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "2048:9:12"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "2059:2:12"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "2041:6:12"
},
"nodeType": "YulFunctionCall",
"src": "2041:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "2041:21:12"
},
{
"nodeType": "YulVariableDeclaration",
"src": "2071:27:12",
"value": {
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "2091:6:12"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "2085:5:12"
},
"nodeType": "YulFunctionCall",
"src": "2085:13:12"
},
"variables": [
{
"name": "length",
"nodeType": "YulTypedName",
"src": "2075:6:12",
"type": ""
}
]
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "2118:9:12"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "2129:2:12"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2114:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2114:18:12"
},
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "2134:6:12"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "2107:6:12"
},
"nodeType": "YulFunctionCall",
"src": "2107:34:12"
},
"nodeType": "YulExpressionStatement",
"src": "2107:34:12"
},
{
"nodeType": "YulVariableDeclaration",
"src": "2150:13:12",
"value": {
"name": "tail",
"nodeType": "YulIdentifier",
"src": "2159:4:12"
},
"variables": [
{
"name": "i",
"nodeType": "YulTypedName",
"src": "2154:1:12",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "2222:90:12",
"statements": [
{
"expression": {
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "2251:9:12"
},
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "2262:1:12"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2247:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2247:17:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2266:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2243:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2243:26:12"
},
{
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "2285:6:12"
},
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "2293:1:12"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2281:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2281:14:12"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "2297:2:12"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2277:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2277:23:12"
}
],
"functionName": {
"name": "mload",
"nodeType": "YulIdentifier",
"src": "2271:5:12"
},
"nodeType": "YulFunctionCall",
"src": "2271:30:12"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "2236:6:12"
},
"nodeType": "YulFunctionCall",
"src": "2236:66:12"
},
"nodeType": "YulExpressionStatement",
"src": "2236:66:12"
}
]
},
"condition": {
"arguments": [
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "2183:1:12"
},
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "2186:6:12"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "2180:2:12"
},
"nodeType": "YulFunctionCall",
"src": "2180:13:12"
},
"nodeType": "YulForLoop",
"post": {
"nodeType": "YulBlock",
"src": "2194:19:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "2196:15:12",
"value": {
"arguments": [
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "2205:1:12"
},
{
"name": "_1",
"nodeType": "YulIdentifier",
"src": "2208:2:12"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2201:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2201:10:12"
},
"variableNames": [
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "2196:1:12"
}
]
}
]
},
"pre": {
"nodeType": "YulBlock",
"src": "2176:3:12",
"statements": []
},
"src": "2172:140:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2346:69:12",
"statements": [
{
"expression": {
"arguments": [
{
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "2375:9:12"
},
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "2386:6:12"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2371:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2371:22:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2395:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2367:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2367:31:12"
},
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "2400:4:12"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "2360:6:12"
},
"nodeType": "YulFunctionCall",
"src": "2360:45:12"
},
"nodeType": "YulExpressionStatement",
"src": "2360:45:12"
}
]
},
"condition": {
"arguments": [
{
"name": "i",
"nodeType": "YulIdentifier",
"src": "2327:1:12"
},
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "2330:6:12"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "2324:2:12"
},
"nodeType": "YulFunctionCall",
"src": "2324:13:12"
},
"nodeType": "YulIf",
"src": "2321:2:12"
},
{
"nodeType": "YulAssignment",
"src": "2424:62:12",
"value": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "2440:9:12"
},
{
"arguments": [
{
"arguments": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "2459:6:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2467:2:12",
"type": "",
"value": "31"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2455:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2455:15:12"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2476:2:12",
"type": "",
"value": "31"
}
],
"functionName": {
"name": "not",
"nodeType": "YulIdentifier",
"src": "2472:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2472:7:12"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "2451:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2451:29:12"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2436:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2436:45:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2483:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2432:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2432:54:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "2424:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "1979:9:12",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "1990:6:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "2001:4:12",
"type": ""
}
],
"src": "1889:603:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "2671:179:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "2688:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2699:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "2681:6:12"
},
"nodeType": "YulFunctionCall",
"src": "2681:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "2681:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "2722:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2733:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2718:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2718:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2738:2:12",
"type": "",
"value": "29"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "2711:6:12"
},
"nodeType": "YulFunctionCall",
"src": "2711:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "2711:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "2761:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2772:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2757:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2757:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "2777:31:12",
"type": "",
"value": "ERC20Snapshot: nonexistent id"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "2750:6:12"
},
"nodeType": "YulFunctionCall",
"src": "2750:59:12"
},
"nodeType": "YulExpressionStatement",
"src": "2750:59:12"
},
{
"nodeType": "YulAssignment",
"src": "2818:26:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "2830:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "2841:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "2826:3:12"
},
"nodeType": "YulFunctionCall",
"src": "2826:18:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "2818:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_031e0835d070e7bbd2c8dcce466eadb8c6b9fd22432b0357ab8c37bd9a385940__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "2648:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "2662:4:12",
"type": ""
}
],
"src": "2497:353:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "3029:225:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3046:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3057:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3039:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3039:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "3039:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3080:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3091:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3076:3:12"
},
"nodeType": "YulFunctionCall",
"src": "3076:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3096:2:12",
"type": "",
"value": "35"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3069:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3069:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "3069:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3119:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3130:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3115:3:12"
},
"nodeType": "YulFunctionCall",
"src": "3115:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "3135:34:12",
"type": "",
"value": "ERC20: transfer to the zero addr"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3108:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3108:62:12"
},
"nodeType": "YulExpressionStatement",
"src": "3108:62:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3190:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3201:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3186:3:12"
},
"nodeType": "YulFunctionCall",
"src": "3186:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "3206:5:12",
"type": "",
"value": "ess"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3179:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3179:33:12"
},
"nodeType": "YulExpressionStatement",
"src": "3179:33:12"
},
{
"nodeType": "YulAssignment",
"src": "3221:27:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3233:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3244:3:12",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3229:3:12"
},
"nodeType": "YulFunctionCall",
"src": "3229:19:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "3221:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "3006:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "3020:4:12",
"type": ""
}
],
"src": "2855:399:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "3433:170:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3450:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3461:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3443:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3443:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "3443:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3484:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3495:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3480:3:12"
},
"nodeType": "YulFunctionCall",
"src": "3480:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3500:2:12",
"type": "",
"value": "20"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3473:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3473:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "3473:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3523:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3534:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3519:3:12"
},
"nodeType": "YulFunctionCall",
"src": "3519:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "3539:22:12",
"type": "",
"value": "Pausable: not paused"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3512:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3512:50:12"
},
"nodeType": "YulExpressionStatement",
"src": "3512:50:12"
},
{
"nodeType": "YulAssignment",
"src": "3571:26:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3583:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3594:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3579:3:12"
},
"nodeType": "YulFunctionCall",
"src": "3579:18:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "3571:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_0d1d997348c4b502650619e51f7d09f80514d98b6993be5051d07f703984619a__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "3410:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "3424:4:12",
"type": ""
}
],
"src": "3259:344:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "3782:224:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3799:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3810:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3792:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3792:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "3792:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3833:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3844:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3829:3:12"
},
"nodeType": "YulFunctionCall",
"src": "3829:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3849:2:12",
"type": "",
"value": "34"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3822:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3822:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "3822:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3872:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3883:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3868:3:12"
},
"nodeType": "YulFunctionCall",
"src": "3868:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "3888:34:12",
"type": "",
"value": "ERC20: burn amount exceeds balan"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3861:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3861:62:12"
},
"nodeType": "YulExpressionStatement",
"src": "3861:62:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3943:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3954:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3939:3:12"
},
"nodeType": "YulFunctionCall",
"src": "3939:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "3959:4:12",
"type": "",
"value": "ce"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "3932:6:12"
},
"nodeType": "YulFunctionCall",
"src": "3932:32:12"
},
"nodeType": "YulExpressionStatement",
"src": "3932:32:12"
},
{
"nodeType": "YulAssignment",
"src": "3973:27:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "3985:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "3996:3:12",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "3981:3:12"
},
"nodeType": "YulFunctionCall",
"src": "3981:19:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "3973:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_149b126e7125232b4200af45303d04fba8b74653b1a295a6a561a528c33fefdd__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "3759:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "3773:4:12",
"type": ""
}
],
"src": "3608:398:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "4185:228:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4202:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4213:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4195:6:12"
},
"nodeType": "YulFunctionCall",
"src": "4195:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "4195:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4236:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4247:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4232:3:12"
},
"nodeType": "YulFunctionCall",
"src": "4232:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4252:2:12",
"type": "",
"value": "38"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4225:6:12"
},
"nodeType": "YulFunctionCall",
"src": "4225:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "4225:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4275:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4286:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4271:3:12"
},
"nodeType": "YulFunctionCall",
"src": "4271:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "4291:34:12",
"type": "",
"value": "Ownable: new owner is the zero a"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4264:6:12"
},
"nodeType": "YulFunctionCall",
"src": "4264:62:12"
},
"nodeType": "YulExpressionStatement",
"src": "4264:62:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4346:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4357:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4342:3:12"
},
"nodeType": "YulFunctionCall",
"src": "4342:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "4362:8:12",
"type": "",
"value": "ddress"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4335:6:12"
},
"nodeType": "YulFunctionCall",
"src": "4335:36:12"
},
"nodeType": "YulExpressionStatement",
"src": "4335:36:12"
},
{
"nodeType": "YulAssignment",
"src": "4380:27:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4392:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4403:3:12",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4388:3:12"
},
"nodeType": "YulFunctionCall",
"src": "4388:19:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "4380:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "4162:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "4176:4:12",
"type": ""
}
],
"src": "4011:402:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "4592:224:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4609:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4620:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4602:6:12"
},
"nodeType": "YulFunctionCall",
"src": "4602:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "4602:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4643:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4654:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4639:3:12"
},
"nodeType": "YulFunctionCall",
"src": "4639:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4659:2:12",
"type": "",
"value": "34"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4632:6:12"
},
"nodeType": "YulFunctionCall",
"src": "4632:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "4632:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4682:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4693:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4678:3:12"
},
"nodeType": "YulFunctionCall",
"src": "4678:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "4698:34:12",
"type": "",
"value": "ERC20: approve to the zero addre"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4671:6:12"
},
"nodeType": "YulFunctionCall",
"src": "4671:62:12"
},
"nodeType": "YulExpressionStatement",
"src": "4671:62:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4753:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4764:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4749:3:12"
},
"nodeType": "YulFunctionCall",
"src": "4749:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "4769:4:12",
"type": "",
"value": "ss"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "4742:6:12"
},
"nodeType": "YulFunctionCall",
"src": "4742:32:12"
},
"nodeType": "YulExpressionStatement",
"src": "4742:32:12"
},
{
"nodeType": "YulAssignment",
"src": "4783:27:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "4795:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "4806:3:12",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "4791:3:12"
},
"nodeType": "YulFunctionCall",
"src": "4791:19:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "4783:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "4569:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "4583:4:12",
"type": ""
}
],
"src": "4418:398:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "4995:228:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5012:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5023:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5005:6:12"
},
"nodeType": "YulFunctionCall",
"src": "5005:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "5005:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5046:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5057:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5042:3:12"
},
"nodeType": "YulFunctionCall",
"src": "5042:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5062:2:12",
"type": "",
"value": "38"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5035:6:12"
},
"nodeType": "YulFunctionCall",
"src": "5035:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "5035:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5085:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5096:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5081:3:12"
},
"nodeType": "YulFunctionCall",
"src": "5081:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "5101:34:12",
"type": "",
"value": "ERC20: transfer amount exceeds b"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5074:6:12"
},
"nodeType": "YulFunctionCall",
"src": "5074:62:12"
},
"nodeType": "YulExpressionStatement",
"src": "5074:62:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5156:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5167:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5152:3:12"
},
"nodeType": "YulFunctionCall",
"src": "5152:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "5172:8:12",
"type": "",
"value": "alance"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5145:6:12"
},
"nodeType": "YulFunctionCall",
"src": "5145:36:12"
},
"nodeType": "YulExpressionStatement",
"src": "5145:36:12"
},
{
"nodeType": "YulAssignment",
"src": "5190:27:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5202:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5213:3:12",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5198:3:12"
},
"nodeType": "YulFunctionCall",
"src": "5198:19:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "5190:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "4972:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "4986:4:12",
"type": ""
}
],
"src": "4821:402:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "5402:166:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5419:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5430:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5412:6:12"
},
"nodeType": "YulFunctionCall",
"src": "5412:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "5412:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5453:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5464:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5449:3:12"
},
"nodeType": "YulFunctionCall",
"src": "5449:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5469:2:12",
"type": "",
"value": "16"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5442:6:12"
},
"nodeType": "YulFunctionCall",
"src": "5442:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "5442:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5492:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5503:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5488:3:12"
},
"nodeType": "YulFunctionCall",
"src": "5488:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "5508:18:12",
"type": "",
"value": "Pausable: paused"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5481:6:12"
},
"nodeType": "YulFunctionCall",
"src": "5481:46:12"
},
"nodeType": "YulExpressionStatement",
"src": "5481:46:12"
},
{
"nodeType": "YulAssignment",
"src": "5536:26:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5548:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5559:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5544:3:12"
},
"nodeType": "YulFunctionCall",
"src": "5544:18:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "5536:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_68571e1369f7a6dcdcd736cb0343b35a58ed0f64d245c2ed839c98d412744f8a__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "5379:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "5393:4:12",
"type": ""
}
],
"src": "5228:340:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "5747:230:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5764:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5775:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5757:6:12"
},
"nodeType": "YulFunctionCall",
"src": "5757:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "5757:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5798:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5809:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5794:3:12"
},
"nodeType": "YulFunctionCall",
"src": "5794:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5814:2:12",
"type": "",
"value": "40"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5787:6:12"
},
"nodeType": "YulFunctionCall",
"src": "5787:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "5787:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5837:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5848:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5833:3:12"
},
"nodeType": "YulFunctionCall",
"src": "5833:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "5853:34:12",
"type": "",
"value": "ERC20: transfer amount exceeds a"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5826:6:12"
},
"nodeType": "YulFunctionCall",
"src": "5826:62:12"
},
"nodeType": "YulExpressionStatement",
"src": "5826:62:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5908:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5919:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5904:3:12"
},
"nodeType": "YulFunctionCall",
"src": "5904:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "5924:10:12",
"type": "",
"value": "llowance"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "5897:6:12"
},
"nodeType": "YulFunctionCall",
"src": "5897:38:12"
},
"nodeType": "YulExpressionStatement",
"src": "5897:38:12"
},
{
"nodeType": "YulAssignment",
"src": "5944:27:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "5956:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "5967:3:12",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "5952:3:12"
},
"nodeType": "YulFunctionCall",
"src": "5952:19:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "5944:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_974d1b4421da69cc60b481194f0dad36a5bb4e23da810da7a7fb30cdba178330__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "5724:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "5738:4:12",
"type": ""
}
],
"src": "5573:404:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "6156:182:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6173:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6184:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "6166:6:12"
},
"nodeType": "YulFunctionCall",
"src": "6166:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "6166:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6207:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6218:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "6203:3:12"
},
"nodeType": "YulFunctionCall",
"src": "6203:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6223:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "6196:6:12"
},
"nodeType": "YulFunctionCall",
"src": "6196:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "6196:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6246:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6257:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "6242:3:12"
},
"nodeType": "YulFunctionCall",
"src": "6242:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "6262:34:12",
"type": "",
"value": "Ownable: caller is not the owner"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "6235:6:12"
},
"nodeType": "YulFunctionCall",
"src": "6235:62:12"
},
"nodeType": "YulExpressionStatement",
"src": "6235:62:12"
},
{
"nodeType": "YulAssignment",
"src": "6306:26:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6318:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6329:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "6314:3:12"
},
"nodeType": "YulFunctionCall",
"src": "6314:18:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "6306:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "6133:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "6147:4:12",
"type": ""
}
],
"src": "5982:356:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "6517:226:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6534:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6545:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "6527:6:12"
},
"nodeType": "YulFunctionCall",
"src": "6527:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "6527:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6568:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6579:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "6564:3:12"
},
"nodeType": "YulFunctionCall",
"src": "6564:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6584:2:12",
"type": "",
"value": "36"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "6557:6:12"
},
"nodeType": "YulFunctionCall",
"src": "6557:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "6557:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6607:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6618:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "6603:3:12"
},
"nodeType": "YulFunctionCall",
"src": "6603:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "6623:34:12",
"type": "",
"value": "ERC20: burn amount exceeds allow"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "6596:6:12"
},
"nodeType": "YulFunctionCall",
"src": "6596:62:12"
},
"nodeType": "YulExpressionStatement",
"src": "6596:62:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6678:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6689:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "6674:3:12"
},
"nodeType": "YulFunctionCall",
"src": "6674:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "6694:6:12",
"type": "",
"value": "ance"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "6667:6:12"
},
"nodeType": "YulFunctionCall",
"src": "6667:34:12"
},
"nodeType": "YulExpressionStatement",
"src": "6667:34:12"
},
{
"nodeType": "YulAssignment",
"src": "6710:27:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6722:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6733:3:12",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "6718:3:12"
},
"nodeType": "YulFunctionCall",
"src": "6718:19:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "6710:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_a287c363786607a1457a2d9d12fa61c0073358e02d76b4035fc2c2d86a19c0db__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "6494:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "6508:4:12",
"type": ""
}
],
"src": "6343:400:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "6922:223:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6939:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6950:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "6932:6:12"
},
"nodeType": "YulFunctionCall",
"src": "6932:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "6932:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "6973:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6984:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "6969:3:12"
},
"nodeType": "YulFunctionCall",
"src": "6969:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "6989:2:12",
"type": "",
"value": "33"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "6962:6:12"
},
"nodeType": "YulFunctionCall",
"src": "6962:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "6962:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7012:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7023:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7008:3:12"
},
"nodeType": "YulFunctionCall",
"src": "7008:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "7028:34:12",
"type": "",
"value": "ERC20: burn from the zero addres"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "7001:6:12"
},
"nodeType": "YulFunctionCall",
"src": "7001:62:12"
},
"nodeType": "YulExpressionStatement",
"src": "7001:62:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7083:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7094:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7079:3:12"
},
"nodeType": "YulFunctionCall",
"src": "7079:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "7099:3:12",
"type": "",
"value": "s"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "7072:6:12"
},
"nodeType": "YulFunctionCall",
"src": "7072:31:12"
},
"nodeType": "YulExpressionStatement",
"src": "7072:31:12"
},
{
"nodeType": "YulAssignment",
"src": "7112:27:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7124:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7135:3:12",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7120:3:12"
},
"nodeType": "YulFunctionCall",
"src": "7120:19:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "7112:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_b16788493b576042bb52c50ed56189e0b250db113c7bfb1c3897d25cf9632d7f__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "6899:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "6913:4:12",
"type": ""
}
],
"src": "6748:397:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "7324:227:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7341:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7352:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "7334:6:12"
},
"nodeType": "YulFunctionCall",
"src": "7334:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "7334:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7375:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7386:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7371:3:12"
},
"nodeType": "YulFunctionCall",
"src": "7371:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7391:2:12",
"type": "",
"value": "37"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "7364:6:12"
},
"nodeType": "YulFunctionCall",
"src": "7364:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "7364:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7414:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7425:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7410:3:12"
},
"nodeType": "YulFunctionCall",
"src": "7410:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "7430:34:12",
"type": "",
"value": "ERC20: transfer from the zero ad"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "7403:6:12"
},
"nodeType": "YulFunctionCall",
"src": "7403:62:12"
},
"nodeType": "YulExpressionStatement",
"src": "7403:62:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7485:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7496:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7481:3:12"
},
"nodeType": "YulFunctionCall",
"src": "7481:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "7501:7:12",
"type": "",
"value": "dress"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "7474:6:12"
},
"nodeType": "YulFunctionCall",
"src": "7474:35:12"
},
"nodeType": "YulExpressionStatement",
"src": "7474:35:12"
},
{
"nodeType": "YulAssignment",
"src": "7518:27:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7530:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7541:3:12",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7526:3:12"
},
"nodeType": "YulFunctionCall",
"src": "7526:19:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "7518:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "7301:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "7315:4:12",
"type": ""
}
],
"src": "7150:401:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "7730:226:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7747:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7758:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "7740:6:12"
},
"nodeType": "YulFunctionCall",
"src": "7740:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "7740:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7781:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7792:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7777:3:12"
},
"nodeType": "YulFunctionCall",
"src": "7777:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7797:2:12",
"type": "",
"value": "36"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "7770:6:12"
},
"nodeType": "YulFunctionCall",
"src": "7770:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "7770:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7820:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7831:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7816:3:12"
},
"nodeType": "YulFunctionCall",
"src": "7816:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "7836:34:12",
"type": "",
"value": "ERC20: approve from the zero add"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "7809:6:12"
},
"nodeType": "YulFunctionCall",
"src": "7809:62:12"
},
"nodeType": "YulExpressionStatement",
"src": "7809:62:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7891:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7902:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7887:3:12"
},
"nodeType": "YulFunctionCall",
"src": "7887:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "7907:6:12",
"type": "",
"value": "ress"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "7880:6:12"
},
"nodeType": "YulFunctionCall",
"src": "7880:34:12"
},
"nodeType": "YulExpressionStatement",
"src": "7880:34:12"
},
{
"nodeType": "YulAssignment",
"src": "7923:27:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "7935:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "7946:3:12",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "7931:3:12"
},
"nodeType": "YulFunctionCall",
"src": "7931:19:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "7923:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "7707:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "7721:4:12",
"type": ""
}
],
"src": "7556:400:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "8135:172:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8152:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8163:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8145:6:12"
},
"nodeType": "YulFunctionCall",
"src": "8145:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "8145:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8186:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8197:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8182:3:12"
},
"nodeType": "YulFunctionCall",
"src": "8182:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8202:2:12",
"type": "",
"value": "22"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8175:6:12"
},
"nodeType": "YulFunctionCall",
"src": "8175:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "8175:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8225:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8236:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8221:3:12"
},
"nodeType": "YulFunctionCall",
"src": "8221:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "8241:24:12",
"type": "",
"value": "ERC20Snapshot: id is 0"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8214:6:12"
},
"nodeType": "YulFunctionCall",
"src": "8214:52:12"
},
"nodeType": "YulExpressionStatement",
"src": "8214:52:12"
},
{
"nodeType": "YulAssignment",
"src": "8275:26:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8287:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8298:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8283:3:12"
},
"nodeType": "YulFunctionCall",
"src": "8283:18:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "8275:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_d85a3cdc203c5cdc6dda93c12cd017145671a0ed9058a16c7aa00b8398a4a8e6__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "8112:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "8126:4:12",
"type": ""
}
],
"src": "7961:346:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "8486:227:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8503:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8514:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8496:6:12"
},
"nodeType": "YulFunctionCall",
"src": "8496:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "8496:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8537:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8548:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8533:3:12"
},
"nodeType": "YulFunctionCall",
"src": "8533:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8553:2:12",
"type": "",
"value": "37"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8526:6:12"
},
"nodeType": "YulFunctionCall",
"src": "8526:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "8526:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8576:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8587:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8572:3:12"
},
"nodeType": "YulFunctionCall",
"src": "8572:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "8592:34:12",
"type": "",
"value": "ERC20: decreased allowance below"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8565:6:12"
},
"nodeType": "YulFunctionCall",
"src": "8565:62:12"
},
"nodeType": "YulExpressionStatement",
"src": "8565:62:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8647:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8658:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8643:3:12"
},
"nodeType": "YulFunctionCall",
"src": "8643:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "8663:7:12",
"type": "",
"value": " zero"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8636:6:12"
},
"nodeType": "YulFunctionCall",
"src": "8636:35:12"
},
"nodeType": "YulExpressionStatement",
"src": "8636:35:12"
},
{
"nodeType": "YulAssignment",
"src": "8680:27:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8692:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8703:3:12",
"type": "",
"value": "128"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8688:3:12"
},
"nodeType": "YulFunctionCall",
"src": "8688:19:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "8680:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "8463:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "8477:4:12",
"type": ""
}
],
"src": "8312:401:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "8892:181:12",
"statements": [
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8909:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8920:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8902:6:12"
},
"nodeType": "YulFunctionCall",
"src": "8902:21:12"
},
"nodeType": "YulExpressionStatement",
"src": "8902:21:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8943:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8954:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8939:3:12"
},
"nodeType": "YulFunctionCall",
"src": "8939:18:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8959:2:12",
"type": "",
"value": "31"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8932:6:12"
},
"nodeType": "YulFunctionCall",
"src": "8932:30:12"
},
"nodeType": "YulExpressionStatement",
"src": "8932:30:12"
},
{
"expression": {
"arguments": [
{
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "8982:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "8993:2:12",
"type": "",
"value": "64"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "8978:3:12"
},
"nodeType": "YulFunctionCall",
"src": "8978:18:12"
},
{
"kind": "string",
"nodeType": "YulLiteral",
"src": "8998:33:12",
"type": "",
"value": "ERC20: mint to the zero address"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "8971:6:12"
},
"nodeType": "YulFunctionCall",
"src": "8971:61:12"
},
"nodeType": "YulExpressionStatement",
"src": "8971:61:12"
},
{
"nodeType": "YulAssignment",
"src": "9041:26:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9053:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9064:2:12",
"type": "",
"value": "96"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "9049:3:12"
},
"nodeType": "YulFunctionCall",
"src": "9049:18:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "9041:4:12"
}
]
}
]
},
"name": "abi_encode_tuple_t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e__to_t_string_memory_ptr__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "8869:9:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "8883:4:12",
"type": ""
}
],
"src": "8718:355:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "9179:76:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "9189:26:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9201:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9212:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "9197:3:12"
},
"nodeType": "YulFunctionCall",
"src": "9197:18:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "9189:4:12"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9231:9:12"
},
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "9242:6:12"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "9224:6:12"
},
"nodeType": "YulFunctionCall",
"src": "9224:25:12"
},
"nodeType": "YulExpressionStatement",
"src": "9224:25:12"
}
]
},
"name": "abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "9148:9:12",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "9159:6:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "9170:4:12",
"type": ""
}
],
"src": "9078:177:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "9357:87:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "9367:26:12",
"value": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9379:9:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9390:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "9375:3:12"
},
"nodeType": "YulFunctionCall",
"src": "9375:18:12"
},
"variableNames": [
{
"name": "tail",
"nodeType": "YulIdentifier",
"src": "9367:4:12"
}
]
},
{
"expression": {
"arguments": [
{
"name": "headStart",
"nodeType": "YulIdentifier",
"src": "9409:9:12"
},
{
"arguments": [
{
"name": "value0",
"nodeType": "YulIdentifier",
"src": "9424:6:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9432:4:12",
"type": "",
"value": "0xff"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "9420:3:12"
},
"nodeType": "YulFunctionCall",
"src": "9420:17:12"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "9402:6:12"
},
"nodeType": "YulFunctionCall",
"src": "9402:36:12"
},
"nodeType": "YulExpressionStatement",
"src": "9402:36:12"
}
]
},
"name": "abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "headStart",
"nodeType": "YulTypedName",
"src": "9326:9:12",
"type": ""
},
{
"name": "value0",
"nodeType": "YulTypedName",
"src": "9337:6:12",
"type": ""
}
],
"returnVariables": [
{
"name": "tail",
"nodeType": "YulTypedName",
"src": "9348:4:12",
"type": ""
}
],
"src": "9260:184:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "9497:80:12",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "9524:22:12",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x11",
"nodeType": "YulIdentifier",
"src": "9526:16:12"
},
"nodeType": "YulFunctionCall",
"src": "9526:18:12"
},
"nodeType": "YulExpressionStatement",
"src": "9526:18:12"
}
]
},
"condition": {
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "9513:1:12"
},
{
"arguments": [
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "9520:1:12"
}
],
"functionName": {
"name": "not",
"nodeType": "YulIdentifier",
"src": "9516:3:12"
},
"nodeType": "YulFunctionCall",
"src": "9516:6:12"
}
],
"functionName": {
"name": "gt",
"nodeType": "YulIdentifier",
"src": "9510:2:12"
},
"nodeType": "YulFunctionCall",
"src": "9510:13:12"
},
"nodeType": "YulIf",
"src": "9507:2:12"
},
{
"nodeType": "YulAssignment",
"src": "9555:16:12",
"value": {
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "9566:1:12"
},
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "9569:1:12"
}
],
"functionName": {
"name": "add",
"nodeType": "YulIdentifier",
"src": "9562:3:12"
},
"nodeType": "YulFunctionCall",
"src": "9562:9:12"
},
"variableNames": [
{
"name": "sum",
"nodeType": "YulIdentifier",
"src": "9555:3:12"
}
]
}
]
},
"name": "checked_add_t_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "x",
"nodeType": "YulTypedName",
"src": "9480:1:12",
"type": ""
},
{
"name": "y",
"nodeType": "YulTypedName",
"src": "9483:1:12",
"type": ""
}
],
"returnVariables": [
{
"name": "sum",
"nodeType": "YulTypedName",
"src": "9489:3:12",
"type": ""
}
],
"src": "9449:128:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "9628:74:12",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "9651:22:12",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x12",
"nodeType": "YulIdentifier",
"src": "9653:16:12"
},
"nodeType": "YulFunctionCall",
"src": "9653:18:12"
},
"nodeType": "YulExpressionStatement",
"src": "9653:18:12"
}
]
},
"condition": {
"arguments": [
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "9648:1:12"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "9641:6:12"
},
"nodeType": "YulFunctionCall",
"src": "9641:9:12"
},
"nodeType": "YulIf",
"src": "9638:2:12"
},
{
"nodeType": "YulAssignment",
"src": "9682:14:12",
"value": {
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "9691:1:12"
},
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "9694:1:12"
}
],
"functionName": {
"name": "div",
"nodeType": "YulIdentifier",
"src": "9687:3:12"
},
"nodeType": "YulFunctionCall",
"src": "9687:9:12"
},
"variableNames": [
{
"name": "r",
"nodeType": "YulIdentifier",
"src": "9682:1:12"
}
]
}
]
},
"name": "checked_div_t_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "x",
"nodeType": "YulTypedName",
"src": "9613:1:12",
"type": ""
},
{
"name": "y",
"nodeType": "YulTypedName",
"src": "9616:1:12",
"type": ""
}
],
"returnVariables": [
{
"name": "r",
"nodeType": "YulTypedName",
"src": "9622:1:12",
"type": ""
}
],
"src": "9582:120:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "9756:76:12",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "9778:22:12",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x11",
"nodeType": "YulIdentifier",
"src": "9780:16:12"
},
"nodeType": "YulFunctionCall",
"src": "9780:18:12"
},
"nodeType": "YulExpressionStatement",
"src": "9780:18:12"
}
]
},
"condition": {
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "9772:1:12"
},
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "9775:1:12"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "9769:2:12"
},
"nodeType": "YulFunctionCall",
"src": "9769:8:12"
},
"nodeType": "YulIf",
"src": "9766:2:12"
},
{
"nodeType": "YulAssignment",
"src": "9809:17:12",
"value": {
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "9821:1:12"
},
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "9824:1:12"
}
],
"functionName": {
"name": "sub",
"nodeType": "YulIdentifier",
"src": "9817:3:12"
},
"nodeType": "YulFunctionCall",
"src": "9817:9:12"
},
"variableNames": [
{
"name": "diff",
"nodeType": "YulIdentifier",
"src": "9809:4:12"
}
]
}
]
},
"name": "checked_sub_t_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "x",
"nodeType": "YulTypedName",
"src": "9738:1:12",
"type": ""
},
{
"name": "y",
"nodeType": "YulTypedName",
"src": "9741:1:12",
"type": ""
}
],
"returnVariables": [
{
"name": "diff",
"nodeType": "YulTypedName",
"src": "9747:4:12",
"type": ""
}
],
"src": "9707:125:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "9892:325:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "9902:22:12",
"value": {
"arguments": [
{
"name": "data",
"nodeType": "YulIdentifier",
"src": "9916:4:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9922:1:12",
"type": "",
"value": "2"
}
],
"functionName": {
"name": "div",
"nodeType": "YulIdentifier",
"src": "9912:3:12"
},
"nodeType": "YulFunctionCall",
"src": "9912:12:12"
},
"variableNames": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "9902:6:12"
}
]
},
{
"nodeType": "YulVariableDeclaration",
"src": "9933:38:12",
"value": {
"arguments": [
{
"name": "data",
"nodeType": "YulIdentifier",
"src": "9963:4:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "9969:1:12",
"type": "",
"value": "1"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "9959:3:12"
},
"nodeType": "YulFunctionCall",
"src": "9959:12:12"
},
"variables": [
{
"name": "outOfPlaceEncoding",
"nodeType": "YulTypedName",
"src": "9937:18:12",
"type": ""
}
]
},
{
"body": {
"nodeType": "YulBlock",
"src": "10010:31:12",
"statements": [
{
"nodeType": "YulAssignment",
"src": "10012:27:12",
"value": {
"arguments": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "10026:6:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10034:4:12",
"type": "",
"value": "0x7f"
}
],
"functionName": {
"name": "and",
"nodeType": "YulIdentifier",
"src": "10022:3:12"
},
"nodeType": "YulFunctionCall",
"src": "10022:17:12"
},
"variableNames": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "10012:6:12"
}
]
}
]
},
"condition": {
"arguments": [
{
"name": "outOfPlaceEncoding",
"nodeType": "YulIdentifier",
"src": "9990:18:12"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "9983:6:12"
},
"nodeType": "YulFunctionCall",
"src": "9983:26:12"
},
"nodeType": "YulIf",
"src": "9980:2:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "10100:111:12",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10121:1:12",
"type": "",
"value": "0"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10128:3:12",
"type": "",
"value": "224"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10133:10:12",
"type": "",
"value": "0x4e487b71"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "10124:3:12"
},
"nodeType": "YulFunctionCall",
"src": "10124:20:12"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "10114:6:12"
},
"nodeType": "YulFunctionCall",
"src": "10114:31:12"
},
"nodeType": "YulExpressionStatement",
"src": "10114:31:12"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10165:1:12",
"type": "",
"value": "4"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10168:4:12",
"type": "",
"value": "0x22"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "10158:6:12"
},
"nodeType": "YulFunctionCall",
"src": "10158:15:12"
},
"nodeType": "YulExpressionStatement",
"src": "10158:15:12"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10193:1:12",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10196:4:12",
"type": "",
"value": "0x24"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "10186:6:12"
},
"nodeType": "YulFunctionCall",
"src": "10186:15:12"
},
"nodeType": "YulExpressionStatement",
"src": "10186:15:12"
}
]
},
"condition": {
"arguments": [
{
"name": "outOfPlaceEncoding",
"nodeType": "YulIdentifier",
"src": "10056:18:12"
},
{
"arguments": [
{
"name": "length",
"nodeType": "YulIdentifier",
"src": "10079:6:12"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10087:2:12",
"type": "",
"value": "32"
}
],
"functionName": {
"name": "lt",
"nodeType": "YulIdentifier",
"src": "10076:2:12"
},
"nodeType": "YulFunctionCall",
"src": "10076:14:12"
}
],
"functionName": {
"name": "eq",
"nodeType": "YulIdentifier",
"src": "10053:2:12"
},
"nodeType": "YulFunctionCall",
"src": "10053:38:12"
},
"nodeType": "YulIf",
"src": "10050:2:12"
}
]
},
"name": "extract_byte_array_length",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "data",
"nodeType": "YulTypedName",
"src": "9872:4:12",
"type": ""
}
],
"returnVariables": [
{
"name": "length",
"nodeType": "YulTypedName",
"src": "9881:6:12",
"type": ""
}
],
"src": "9837:380:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "10260:74:12",
"statements": [
{
"body": {
"nodeType": "YulBlock",
"src": "10283:22:12",
"statements": [
{
"expression": {
"arguments": [],
"functionName": {
"name": "panic_error_0x12",
"nodeType": "YulIdentifier",
"src": "10285:16:12"
},
"nodeType": "YulFunctionCall",
"src": "10285:18:12"
},
"nodeType": "YulExpressionStatement",
"src": "10285:18:12"
}
]
},
"condition": {
"arguments": [
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "10280:1:12"
}
],
"functionName": {
"name": "iszero",
"nodeType": "YulIdentifier",
"src": "10273:6:12"
},
"nodeType": "YulFunctionCall",
"src": "10273:9:12"
},
"nodeType": "YulIf",
"src": "10270:2:12"
},
{
"nodeType": "YulAssignment",
"src": "10314:14:12",
"value": {
"arguments": [
{
"name": "x",
"nodeType": "YulIdentifier",
"src": "10323:1:12"
},
{
"name": "y",
"nodeType": "YulIdentifier",
"src": "10326:1:12"
}
],
"functionName": {
"name": "mod",
"nodeType": "YulIdentifier",
"src": "10319:3:12"
},
"nodeType": "YulFunctionCall",
"src": "10319:9:12"
},
"variableNames": [
{
"name": "r",
"nodeType": "YulIdentifier",
"src": "10314:1:12"
}
]
}
]
},
"name": "mod_t_uint256",
"nodeType": "YulFunctionDefinition",
"parameters": [
{
"name": "x",
"nodeType": "YulTypedName",
"src": "10245:1:12",
"type": ""
},
{
"name": "y",
"nodeType": "YulTypedName",
"src": "10248:1:12",
"type": ""
}
],
"returnVariables": [
{
"name": "r",
"nodeType": "YulTypedName",
"src": "10254:1:12",
"type": ""
}
],
"src": "10222:112:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "10371:95:12",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10388:1:12",
"type": "",
"value": "0"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10395:3:12",
"type": "",
"value": "224"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10400:10:12",
"type": "",
"value": "0x4e487b71"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "10391:3:12"
},
"nodeType": "YulFunctionCall",
"src": "10391:20:12"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "10381:6:12"
},
"nodeType": "YulFunctionCall",
"src": "10381:31:12"
},
"nodeType": "YulExpressionStatement",
"src": "10381:31:12"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10428:1:12",
"type": "",
"value": "4"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10431:4:12",
"type": "",
"value": "0x11"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "10421:6:12"
},
"nodeType": "YulFunctionCall",
"src": "10421:15:12"
},
"nodeType": "YulExpressionStatement",
"src": "10421:15:12"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10452:1:12",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10455:4:12",
"type": "",
"value": "0x24"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "10445:6:12"
},
"nodeType": "YulFunctionCall",
"src": "10445:15:12"
},
"nodeType": "YulExpressionStatement",
"src": "10445:15:12"
}
]
},
"name": "panic_error_0x11",
"nodeType": "YulFunctionDefinition",
"src": "10339:127:12"
},
{
"body": {
"nodeType": "YulBlock",
"src": "10503:95:12",
"statements": [
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10520:1:12",
"type": "",
"value": "0"
},
{
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10527:3:12",
"type": "",
"value": "224"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10532:10:12",
"type": "",
"value": "0x4e487b71"
}
],
"functionName": {
"name": "shl",
"nodeType": "YulIdentifier",
"src": "10523:3:12"
},
"nodeType": "YulFunctionCall",
"src": "10523:20:12"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "10513:6:12"
},
"nodeType": "YulFunctionCall",
"src": "10513:31:12"
},
"nodeType": "YulExpressionStatement",
"src": "10513:31:12"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10560:1:12",
"type": "",
"value": "4"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10563:4:12",
"type": "",
"value": "0x12"
}
],
"functionName": {
"name": "mstore",
"nodeType": "YulIdentifier",
"src": "10553:6:12"
},
"nodeType": "YulFunctionCall",
"src": "10553:15:12"
},
"nodeType": "YulExpressionStatement",
"src": "10553:15:12"
},
{
"expression": {
"arguments": [
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10584:1:12",
"type": "",
"value": "0"
},
{
"kind": "number",
"nodeType": "YulLiteral",
"src": "10587:4:12",
"type": "",
"value": "0x24"
}
],
"functionName": {
"name": "revert",
"nodeType": "YulIdentifier",
"src": "10577:6:12"
},
"nodeType": "YulFunctionCall",
"src": "10577:15:12"
},
"nodeType": "YulExpressionStatement",
"src": "10577:15:12"
}
]
},
"name": "panic_error_0x12",
"nodeType": "YulFunctionDefinition",
"src": "10471:127:12"
}
]
},
"contents": "{\n { }\n function abi_decode_t_address(offset) -> value\n {\n value := calldataload(offset)\n if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n }\n function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(value0, value0) }\n value0 := abi_decode_t_address(headStart)\n }\n function abi_decode_tuple_t_addresst_address(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(value1, value1) }\n value0 := abi_decode_t_address(headStart)\n value1 := abi_decode_t_address(add(headStart, 32))\n }\n function abi_decode_tuple_t_addresst_addresst_uint256(headStart, dataEnd) -> value0, value1, value2\n {\n if slt(sub(dataEnd, headStart), 96) { revert(value2, value2) }\n value0 := abi_decode_t_address(headStart)\n value1 := abi_decode_t_address(add(headStart, 32))\n value2 := calldataload(add(headStart, 64))\n }\n function abi_decode_tuple_t_addresst_uint256(headStart, dataEnd) -> value0, value1\n {\n if slt(sub(dataEnd, headStart), 64) { revert(value0, value0) }\n value0 := abi_decode_t_address(headStart)\n value1 := calldataload(add(headStart, 32))\n }\n function abi_decode_tuple_t_uint256(headStart, dataEnd) -> value0\n {\n if slt(sub(dataEnd, headStart), 32) { revert(value0, value0) }\n value0 := calldataload(headStart)\n }\n function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n }\n function abi_encode_tuple_t_bool__to_t_bool__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, iszero(iszero(value0)))\n }\n function abi_encode_tuple_t_string_memory_ptr__to_t_string_memory_ptr__fromStack_reversed(headStart, value0) -> tail\n {\n let _1 := 32\n mstore(headStart, _1)\n let length := mload(value0)\n mstore(add(headStart, _1), length)\n let i := tail\n for { } lt(i, length) { i := add(i, _1) }\n {\n mstore(add(add(headStart, i), 64), mload(add(add(value0, i), _1)))\n }\n if gt(i, length)\n {\n mstore(add(add(headStart, length), 64), tail)\n }\n tail := add(add(headStart, and(add(length, 31), not(31))), 64)\n }\n function abi_encode_tuple_t_stringliteral_031e0835d070e7bbd2c8dcce466eadb8c6b9fd22432b0357ab8c37bd9a385940__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 29)\n mstore(add(headStart, 64), \"ERC20Snapshot: nonexistent id\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_0557e210f7a69a685100a7e4e3d0a7024c546085cee28910fd17d0b081d9516f__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 35)\n mstore(add(headStart, 64), \"ERC20: transfer to the zero addr\")\n mstore(add(headStart, 96), \"ess\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_0d1d997348c4b502650619e51f7d09f80514d98b6993be5051d07f703984619a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 20)\n mstore(add(headStart, 64), \"Pausable: not paused\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_149b126e7125232b4200af45303d04fba8b74653b1a295a6a561a528c33fefdd__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ERC20: burn amount exceeds balan\")\n mstore(add(headStart, 96), \"ce\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n mstore(add(headStart, 96), \"ddress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_24883cc5fe64ace9d0df1893501ecb93c77180f0ff69cca79affb3c316dc8029__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 34)\n mstore(add(headStart, 64), \"ERC20: approve to the zero addre\")\n mstore(add(headStart, 96), \"ss\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_4107e8a8b9e94bf8ff83080ddec1c0bffe897ebc2241b89d44f66b3d274088b6__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 38)\n mstore(add(headStart, 64), \"ERC20: transfer amount exceeds b\")\n mstore(add(headStart, 96), \"alance\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_68571e1369f7a6dcdcd736cb0343b35a58ed0f64d245c2ed839c98d412744f8a__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 16)\n mstore(add(headStart, 64), \"Pausable: paused\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_974d1b4421da69cc60b481194f0dad36a5bb4e23da810da7a7fb30cdba178330__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 40)\n mstore(add(headStart, 64), \"ERC20: transfer amount exceeds a\")\n mstore(add(headStart, 96), \"llowance\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 32)\n mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_a287c363786607a1457a2d9d12fa61c0073358e02d76b4035fc2c2d86a19c0db__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 36)\n mstore(add(headStart, 64), \"ERC20: burn amount exceeds allow\")\n mstore(add(headStart, 96), \"ance\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_b16788493b576042bb52c50ed56189e0b250db113c7bfb1c3897d25cf9632d7f__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 33)\n mstore(add(headStart, 64), \"ERC20: burn from the zero addres\")\n mstore(add(headStart, 96), \"s\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_baecc556b46f4ed0f2b4cb599d60785ac8563dd2dc0a5bf12edea1c39e5e1fea__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 37)\n mstore(add(headStart, 64), \"ERC20: transfer from the zero ad\")\n mstore(add(headStart, 96), \"dress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_c953f4879035ed60e766b34720f656aab5c697b141d924c283124ecedb91c208__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 36)\n mstore(add(headStart, 64), \"ERC20: approve from the zero add\")\n mstore(add(headStart, 96), \"ress\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_d85a3cdc203c5cdc6dda93c12cd017145671a0ed9058a16c7aa00b8398a4a8e6__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 22)\n mstore(add(headStart, 64), \"ERC20Snapshot: id is 0\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_stringliteral_f8b476f7d28209d77d4a4ac1fe36b9f8259aa1bb6bddfa6e89de7e51615cf8a8__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 37)\n mstore(add(headStart, 64), \"ERC20: decreased allowance below\")\n mstore(add(headStart, 96), \" zero\")\n tail := add(headStart, 128)\n }\n function abi_encode_tuple_t_stringliteral_fc0b381caf0a47702017f3c4b358ebe3d3aff6c60ce819a8bf3ef5a95d4f202e__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n {\n mstore(headStart, 32)\n mstore(add(headStart, 32), 31)\n mstore(add(headStart, 64), \"ERC20: mint to the zero address\")\n tail := add(headStart, 96)\n }\n function abi_encode_tuple_t_uint256__to_t_uint256__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, value0)\n }\n function abi_encode_tuple_t_uint8__to_t_uint8__fromStack_reversed(headStart, value0) -> tail\n {\n tail := add(headStart, 32)\n mstore(headStart, and(value0, 0xff))\n }\n function checked_add_t_uint256(x, y) -> sum\n {\n if gt(x, not(y)) { panic_error_0x11() }\n sum := add(x, y)\n }\n function checked_div_t_uint256(x, y) -> r\n {\n if iszero(y) { panic_error_0x12() }\n r := div(x, y)\n }\n function checked_sub_t_uint256(x, y) -> diff\n {\n if lt(x, y) { panic_error_0x11() }\n diff := sub(x, y)\n }\n function extract_byte_array_length(data) -> length\n {\n length := div(data, 2)\n let outOfPlaceEncoding := and(data, 1)\n if iszero(outOfPlaceEncoding) { length := and(length, 0x7f) }\n if eq(outOfPlaceEncoding, lt(length, 32))\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x22)\n revert(0, 0x24)\n }\n }\n function mod_t_uint256(x, y) -> r\n {\n if iszero(y) { panic_error_0x12() }\n r := mod(x, y)\n }\n function panic_error_0x11()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x11)\n revert(0, 0x24)\n }\n function panic_error_0x12()\n {\n mstore(0, shl(224, 0x4e487b71))\n mstore(4, 0x12)\n revert(0, 0x24)\n }\n}",
"id": 12,
"language": "Yul",
"name": "#utility.yul"
}
],
"immutableReferences": {},
"linkReferences": {},
"object": "608060405234801561001057600080fd5b506004361061014d5760003560e01c806370a08231116100c35780639711715a1161007c5780639711715a1461027e578063981b24d014610286578063a457c2d714610299578063a9059cbb146102ac578063dd62ed3e146102bf578063f2fde38b146102d25761014d565b806370a082311461022b578063715018a61461023e57806379cc6790146102465780638456cb59146102595780638da5cb5b1461026157806395d89b41146102765761014d565b8063395093511161011557806339509351146101cd5780633f4ba83a146101e057806340c10f19146101ea57806342966c68146101fd5780634ee2cd7e146102105780635c975abb146102235761014d565b806306fdde0314610152578063095ea7b31461017057806318160ddd1461019057806323b872dd146101a5578063313ce567146101b8575b600080fd5b61015a6102e5565b60405161016791906111e6565b60405180910390f35b61018361017e366004611186565b610377565b60405161016791906111db565b610198610395565b6040516101679190611652565b6101836101b336600461114b565b61039b565b6101c061043b565b604051610167919061165b565b6101836101db366004611186565b610440565b6101e861048f565b005b6101e86101f8366004611186565b6104d8565b6101e861020b3660046111af565b610525565b61019861021e366004611186565b610539565b610183610582565b6101986102393660046110ff565b610592565b6101e86105b1565b6101e8610254366004611186565b61063a565b6101e861068f565b6102696106d6565b60405161016791906111c7565b61015a6106e5565b6101e86106f4565b6101986102943660046111af565b61073b565b6101836102a7366004611186565b61076b565b6101836102ba366004611186565b6107e6565b6101986102cd366004611119565b6107fa565b6101e86102e03660046110ff565b610825565b6060600380546102f4906116ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610320906116ac565b801561036d5780601f106103425761010080835404028352916020019161036d565b820191906000526020600020905b81548152906001019060200180831161035057829003601f168201915b5050505050905090565b600061038b610384610942565b8484610946565b5060015b92915050565b60025490565b60006103a88484846109fa565b6001600160a01b0384166000908152600160205260408120816103c9610942565b6001600160a01b03166001600160a01b03168152602001908152602001600020549050828110156104155760405162461bcd60e51b815260040161040c9061141b565b60405180910390fd5b61043085610421610942565b61042b8685611695565b610946565b506001949350505050565b601290565b600061038b61044d610942565b84846001600061045b610942565b6001600160a01b03908116825260208083019390935260409182016000908120918b168152925290205461042b9190611669565b610497610942565b6001600160a01b03166104a86106d6565b6001600160a01b0316146104ce5760405162461bcd60e51b815260040161040c90611463565b6104d6610b22565b565b6104e0610942565b6001600160a01b03166104f16106d6565b6001600160a01b0316146105175760405162461bcd60e51b815260040161040c90611463565b6105218282610b93565b5050565b610536610530610942565b82610c53565b50565b6001600160a01b038216600090815260056020526040812081908190610560908590610d39565b91509150816105775761057285610592565b610579565b805b95945050505050565b600954600160a01b900460ff1690565b6001600160a01b0381166000908152602081905260409020545b919050565b6105b9610942565b6001600160a01b03166105ca6106d6565b6001600160a01b0316146105f05760405162461bcd60e51b815260040161040c90611463565b6009546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600980546001600160a01b0319169055565b6000610648836102cd610942565b90508181101561066a5760405162461bcd60e51b815260040161040c90611498565b61068083610676610942565b61042b8585611695565b61068a8383610c53565b505050565b610697610942565b6001600160a01b03166106a86106d6565b6001600160a01b0316146106ce5760405162461bcd60e51b815260040161040c90611463565b6104d6610de7565b6009546001600160a01b031690565b6060600480546102f4906116ac565b6106fc610942565b6001600160a01b031661070d6106d6565b6001600160a01b0316146107335760405162461bcd60e51b815260040161040c90611463565b610536610e48565b600080600061074b846006610d39565b91509150816107615761075c610395565b610763565b805b949350505050565b6000806001600061077a610942565b6001600160a01b03908116825260208083019390935260409182016000908120918816815292529020549050828110156107c65760405162461bcd60e51b815260040161040c906115d6565b6107dc6107d1610942565b8561042b8685611695565b5060019392505050565b600061038b6107f3610942565b84846109fa565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61082d610942565b6001600160a01b031661083e6106d6565b6001600160a01b0316146108645760405162461bcd60e51b815260040161040c90611463565b6001600160a01b03811661088a5760405162461bcd60e51b815260040161040c90611323565b6009546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600980546001600160a01b0319166001600160a01b0392909216919091179055565b6108f183838361068a565b6001600160a01b0383166109155761090882610e9e565b610910610ec8565b61068a565b6001600160a01b03821661092c5761090883610e9e565b61093583610e9e565b61068a82610e9e565b5490565b3390565b6001600160a01b03831661096c5760405162461bcd60e51b815260040161040c90611562565b6001600160a01b0382166109925760405162461bcd60e51b815260040161040c90611369565b6001600160a01b0380841660008181526001602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906109ed908590611652565b60405180910390a3505050565b6001600160a01b038316610a205760405162461bcd60e51b815260040161040c9061151d565b6001600160a01b038216610a465760405162461bcd60e51b815260040161040c90611270565b610a51838383610ed5565b6001600160a01b03831660009081526020819052604090205481811015610a8a5760405162461bcd60e51b815260040161040c906113ab565b610a948282611695565b6001600160a01b038086166000908152602081905260408082209390935590851681529081208054849290610aca908490611669565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610b149190611652565b60405180910390a350505050565b610b2a610582565b610b465760405162461bcd60e51b815260040161040c906112b3565b6009805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610b7c610942565b604051610b8991906111c7565b60405180910390a1565b6001600160a01b038216610bb95760405162461bcd60e51b815260040161040c9061161b565b610bc560008383610ed5565b8060026000828254610bd79190611669565b90915550506001600160a01b03821660009081526020819052604081208054839290610c04908490611669565b90915550506040516001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610c47908590611652565b60405180910390a35050565b6001600160a01b038216610c795760405162461bcd60e51b815260040161040c906114dc565b610c8582600083610ed5565b6001600160a01b03821660009081526020819052604090205481811015610cbe5760405162461bcd60e51b815260040161040c906112e1565b610cc88282611695565b6001600160a01b03841660009081526020819052604081209190915560028054849290610cf6908490611695565b90915550506040516000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109ed908690611652565b60008060008411610d5c5760405162461bcd60e51b815260040161040c906115a6565b610d66600861093e565b841115610d855760405162461bcd60e51b815260040161040c90611239565b6000610d918486610f05565b8454909150811415610daa576000809250925050610de0565b6001846001018281548110610dcf57634e487b7160e01b600052603260045260246000fd5b906000526020600020015492509250505b9250929050565b610def610582565b15610e0c5760405162461bcd60e51b815260040161040c906113f1565b6009805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610b7c610942565b6000610e546008610fe4565b6000610e60600861093e565b90507f8030e83b04d87bef53480e26263266d6ca66863aa8506aca6f2559d18aa1cb6781604051610e919190611652565b60405180910390a1905090565b6001600160a01b038116600090815260056020526040902061053690610ec383610592565b610fed565b6104d66006610ec3610395565b610edd610582565b15610efa5760405162461bcd60e51b815260040161040c906113f1565b61068a8383836108e6565b8154600090610f165750600061038f565b82546000905b80821015610f80576000610f308383611039565b905084868281548110610f5357634e487b7160e01b600052603260045260246000fd5b90600052602060002001541115610f6c57809150610f7a565b610f77816001611669565b92505b50610f1c565b600082118015610fc357508385610f98600185611695565b81548110610fb657634e487b7160e01b600052603260045260246000fd5b9060005260206000200154145b15610fdc57610fd3600183611695565b9250505061038f565b50905061038f565b80546001019055565b6000610ff9600861093e565b90508061100584611097565b101561068a578254600180820185556000858152602080822090930193909355938401805494850181558252902090910155565b6000600261104781846116e7565b6110526002866116e7565b61105c9190611669565b6110669190611681565b611071600284611681565b61107c600286611681565b6110869190611669565b6110909190611669565b9392505050565b80546000906110a8575060006105ac565b815482906110b890600190611695565b815481106110d657634e487b7160e01b600052603260045260246000fd5b906000526020600020015490506105ac565b80356001600160a01b03811681146105ac57600080fd5b600060208284031215611110578081fd5b611090826110e8565b6000806040838503121561112b578081fd5b611134836110e8565b9150611142602084016110e8565b90509250929050565b60008060006060848603121561115f578081fd5b611168846110e8565b9250611176602085016110e8565b9150604084013590509250925092565b60008060408385031215611198578182fd5b6111a1836110e8565b946020939093013593505050565b6000602082840312156111c0578081fd5b5035919050565b6001600160a01b0391909116815260200190565b901515815260200190565b6000602080835283518082850152825b81811015611212578581018301518582016040015282016111f6565b818111156112235783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601d908201527f4552433230536e617073686f743a206e6f6e6578697374656e74206964000000604082015260600190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526022908201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604082015261636560f01b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526022908201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604082015261737360f01b606082015260800190565b60208082526026908201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604082015265616c616e636560d01b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526028908201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616040820152676c6c6f77616e636560c01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604082015263616e636560e01b606082015260800190565b60208082526021908201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736040820152607360f81b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526024908201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526016908201527504552433230536e617073686f743a20696420697320360541b604082015260600190565b60208082526025908201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604082015264207a65726f60d81b606082015260800190565b6020808252601f908201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604082015260600190565b90815260200190565b60ff91909116815260200190565b6000821982111561167c5761167c6116fb565b500190565b60008261169057611690611711565b500490565b6000828210156116a7576116a76116fb565b500390565b6002810460018216806116c057607f821691505b602082108114156116e157634e487b7160e01b600052602260045260246000fd5b50919050565b6000826116f6576116f6611711565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fdfea2646970667358221220d0c675e9e46f528f7f66b91a0da61ee05aba44fb87015dc8a15680fa2fc9ae6764736f6c63430008000033",
"opcodes": "PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x14D JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x70A08231 GT PUSH2 0xC3 JUMPI DUP1 PUSH4 0x9711715A GT PUSH2 0x7C JUMPI DUP1 PUSH4 0x9711715A EQ PUSH2 0x27E JUMPI DUP1 PUSH4 0x981B24D0 EQ PUSH2 0x286 JUMPI DUP1 PUSH4 0xA457C2D7 EQ PUSH2 0x299 JUMPI DUP1 PUSH4 0xA9059CBB EQ PUSH2 0x2AC JUMPI DUP1 PUSH4 0xDD62ED3E EQ PUSH2 0x2BF JUMPI DUP1 PUSH4 0xF2FDE38B EQ PUSH2 0x2D2 JUMPI PUSH2 0x14D JUMP JUMPDEST DUP1 PUSH4 0x70A08231 EQ PUSH2 0x22B JUMPI DUP1 PUSH4 0x715018A6 EQ PUSH2 0x23E JUMPI DUP1 PUSH4 0x79CC6790 EQ PUSH2 0x246 JUMPI DUP1 PUSH4 0x8456CB59 EQ PUSH2 0x259 JUMPI DUP1 PUSH4 0x8DA5CB5B EQ PUSH2 0x261 JUMPI DUP1 PUSH4 0x95D89B41 EQ PUSH2 0x276 JUMPI PUSH2 0x14D JUMP JUMPDEST DUP1 PUSH4 0x39509351 GT PUSH2 0x115 JUMPI DUP1 PUSH4 0x39509351 EQ PUSH2 0x1CD JUMPI DUP1 PUSH4 0x3F4BA83A EQ PUSH2 0x1E0 JUMPI DUP1 PUSH4 0x40C10F19 EQ PUSH2 0x1EA JUMPI DUP1 PUSH4 0x42966C68 EQ PUSH2 0x1FD JUMPI DUP1 PUSH4 0x4EE2CD7E EQ PUSH2 0x210 JUMPI DUP1 PUSH4 0x5C975ABB EQ PUSH2 0x223 JUMPI PUSH2 0x14D JUMP JUMPDEST DUP1 PUSH4 0x6FDDE03 EQ PUSH2 0x152 JUMPI DUP1 PUSH4 0x95EA7B3 EQ PUSH2 0x170 JUMPI DUP1 PUSH4 0x18160DDD EQ PUSH2 0x190 JUMPI DUP1 PUSH4 0x23B872DD EQ PUSH2 0x1A5 JUMPI DUP1 PUSH4 0x313CE567 EQ PUSH2 0x1B8 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x15A PUSH2 0x2E5 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x167 SWAP2 SWAP1 PUSH2 0x11E6 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x183 PUSH2 0x17E CALLDATASIZE PUSH1 0x4 PUSH2 0x1186 JUMP JUMPDEST PUSH2 0x377 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x167 SWAP2 SWAP1 PUSH2 0x11DB JUMP JUMPDEST PUSH2 0x198 PUSH2 0x395 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x167 SWAP2 SWAP1 PUSH2 0x1652 JUMP JUMPDEST PUSH2 0x183 PUSH2 0x1B3 CALLDATASIZE PUSH1 0x4 PUSH2 0x114B JUMP JUMPDEST PUSH2 0x39B JUMP JUMPDEST PUSH2 0x1C0 PUSH2 0x43B JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x167 SWAP2 SWAP1 PUSH2 0x165B JUMP JUMPDEST PUSH2 0x183 PUSH2 0x1DB CALLDATASIZE PUSH1 0x4 PUSH2 0x1186 JUMP JUMPDEST PUSH2 0x440 JUMP JUMPDEST PUSH2 0x1E8 PUSH2 0x48F JUMP JUMPDEST STOP JUMPDEST PUSH2 0x1E8 PUSH2 0x1F8 CALLDATASIZE PUSH1 0x4 PUSH2 0x1186 JUMP JUMPDEST PUSH2 0x4D8 JUMP JUMPDEST PUSH2 0x1E8 PUSH2 0x20B CALLDATASIZE PUSH1 0x4 PUSH2 0x11AF JUMP JUMPDEST PUSH2 0x525 JUMP JUMPDEST PUSH2 0x198 PUSH2 0x21E CALLDATASIZE PUSH1 0x4 PUSH2 0x1186 JUMP JUMPDEST PUSH2 0x539 JUMP JUMPDEST PUSH2 0x183 PUSH2 0x582 JUMP JUMPDEST PUSH2 0x198 PUSH2 0x239 CALLDATASIZE PUSH1 0x4 PUSH2 0x10FF JUMP JUMPDEST PUSH2 0x592 JUMP JUMPDEST PUSH2 0x1E8 PUSH2 0x5B1 JUMP JUMPDEST PUSH2 0x1E8 PUSH2 0x254 CALLDATASIZE PUSH1 0x4 PUSH2 0x1186 JUMP JUMPDEST PUSH2 0x63A JUMP JUMPDEST PUSH2 0x1E8 PUSH2 0x68F JUMP JUMPDEST PUSH2 0x269 PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0x167 SWAP2 SWAP1 PUSH2 0x11C7 JUMP JUMPDEST PUSH2 0x15A PUSH2 0x6E5 JUMP JUMPDEST PUSH2 0x1E8 PUSH2 0x6F4 JUMP JUMPDEST PUSH2 0x198 PUSH2 0x294 CALLDATASIZE PUSH1 0x4 PUSH2 0x11AF JUMP JUMPDEST PUSH2 0x73B JUMP JUMPDEST PUSH2 0x183 PUSH2 0x2A7 CALLDATASIZE PUSH1 0x4 PUSH2 0x1186 JUMP JUMPDEST PUSH2 0x76B JUMP JUMPDEST PUSH2 0x183 PUSH2 0x2BA CALLDATASIZE PUSH1 0x4 PUSH2 0x1186 JUMP JUMPDEST PUSH2 0x7E6 JUMP JUMPDEST PUSH2 0x198 PUSH2 0x2CD CALLDATASIZE PUSH1 0x4 PUSH2 0x1119 JUMP JUMPDEST PUSH2 0x7FA JUMP JUMPDEST PUSH2 0x1E8 PUSH2 0x2E0 CALLDATASIZE PUSH1 0x4 PUSH2 0x10FF JUMP JUMPDEST PUSH2 0x825 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x3 DUP1 SLOAD PUSH2 0x2F4 SWAP1 PUSH2 0x16AC JUMP JUMPDEST DUP1 PUSH1 0x1F ADD PUSH1 0x20 DUP1 SWAP2 DIV MUL PUSH1 0x20 ADD PUSH1 0x40 MLOAD SWAP1 DUP2 ADD PUSH1 0x40 MSTORE DUP1 SWAP3 SWAP2 SWAP1 DUP2 DUP2 MSTORE PUSH1 0x20 ADD DUP3 DUP1 SLOAD PUSH2 0x320 SWAP1 PUSH2 0x16AC JUMP JUMPDEST DUP1 ISZERO PUSH2 0x36D JUMPI DUP1 PUSH1 0x1F LT PUSH2 0x342 JUMPI PUSH2 0x100 DUP1 DUP4 SLOAD DIV MUL DUP4 MSTORE SWAP2 PUSH1 0x20 ADD SWAP2 PUSH2 0x36D JUMP JUMPDEST DUP3 ADD SWAP2 SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 SWAP1 JUMPDEST DUP2 SLOAD DUP2 MSTORE SWAP1 PUSH1 0x1 ADD SWAP1 PUSH1 0x20 ADD DUP1 DUP4 GT PUSH2 0x350 JUMPI DUP3 SWAP1 SUB PUSH1 0x1F AND DUP3 ADD SWAP2 JUMPDEST POP POP POP POP POP SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38B PUSH2 0x384 PUSH2 0x942 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x946 JUMP JUMPDEST POP PUSH1 0x1 JUMPDEST SWAP3 SWAP2 POP POP JUMP JUMPDEST PUSH1 0x2 SLOAD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x3A8 DUP5 DUP5 DUP5 PUSH2 0x9FA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP2 PUSH2 0x3C9 PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 DUP2 MSTORE PUSH1 0x20 ADD PUSH1 0x0 KECCAK256 SLOAD SWAP1 POP DUP3 DUP2 LT ISZERO PUSH2 0x415 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x141B JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x430 DUP6 PUSH2 0x421 PUSH2 0x942 JUMP JUMPDEST PUSH2 0x42B DUP7 DUP6 PUSH2 0x1695 JUMP JUMPDEST PUSH2 0x946 JUMP JUMPDEST POP PUSH1 0x1 SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x12 SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38B PUSH2 0x44D PUSH2 0x942 JUMP JUMPDEST DUP5 DUP5 PUSH1 0x1 PUSH1 0x0 PUSH2 0x45B PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP12 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD PUSH2 0x42B SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST PUSH2 0x497 PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x4A8 PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x4CE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1463 JUMP JUMPDEST PUSH2 0x4D6 PUSH2 0xB22 JUMP JUMPDEST JUMP JUMPDEST PUSH2 0x4E0 PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x4F1 PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x517 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1463 JUMP JUMPDEST PUSH2 0x521 DUP3 DUP3 PUSH2 0xB93 JUMP JUMPDEST POP POP JUMP JUMPDEST PUSH2 0x536 PUSH2 0x530 PUSH2 0x942 JUMP JUMPDEST DUP3 PUSH2 0xC53 JUMP JUMPDEST POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP2 SWAP1 DUP2 SWAP1 PUSH2 0x560 SWAP1 DUP6 SWAP1 PUSH2 0xD39 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 PUSH2 0x577 JUMPI PUSH2 0x572 DUP6 PUSH2 0x592 JUMP JUMPDEST PUSH2 0x579 JUMP JUMPDEST DUP1 JUMPDEST SWAP6 SWAP5 POP POP POP POP POP JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0xA0 SHL SWAP1 DIV PUSH1 0xFF AND SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD JUMPDEST SWAP2 SWAP1 POP JUMP JUMPDEST PUSH2 0x5B9 PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x5CA PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x5F0 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1463 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH1 0x0 SWAP2 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 DUP4 SWAP1 LOG3 PUSH1 0x9 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0x648 DUP4 PUSH2 0x2CD PUSH2 0x942 JUMP JUMPDEST SWAP1 POP DUP2 DUP2 LT ISZERO PUSH2 0x66A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1498 JUMP JUMPDEST PUSH2 0x680 DUP4 PUSH2 0x676 PUSH2 0x942 JUMP JUMPDEST PUSH2 0x42B DUP6 DUP6 PUSH2 0x1695 JUMP JUMPDEST PUSH2 0x68A DUP4 DUP4 PUSH2 0xC53 JUMP JUMPDEST POP POP POP JUMP JUMPDEST PUSH2 0x697 PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x6A8 PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x6CE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1463 JUMP JUMPDEST PUSH2 0x4D6 PUSH2 0xDE7 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND SWAP1 JUMP JUMPDEST PUSH1 0x60 PUSH1 0x4 DUP1 SLOAD PUSH2 0x2F4 SWAP1 PUSH2 0x16AC JUMP JUMPDEST PUSH2 0x6FC PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x70D PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x733 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1463 JUMP JUMPDEST PUSH2 0x536 PUSH2 0xE48 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH2 0x74B DUP5 PUSH1 0x6 PUSH2 0xD39 JUMP JUMPDEST SWAP2 POP SWAP2 POP DUP2 PUSH2 0x761 JUMPI PUSH2 0x75C PUSH2 0x395 JUMP JUMPDEST PUSH2 0x763 JUMP JUMPDEST DUP1 JUMPDEST SWAP5 SWAP4 POP POP POP POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x1 PUSH1 0x0 PUSH2 0x77A PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP1 DUP2 AND DUP3 MSTORE PUSH1 0x20 DUP1 DUP4 ADD SWAP4 SWAP1 SWAP4 MSTORE PUSH1 0x40 SWAP2 DUP3 ADD PUSH1 0x0 SWAP1 DUP2 KECCAK256 SWAP2 DUP9 AND DUP2 MSTORE SWAP3 MSTORE SWAP1 KECCAK256 SLOAD SWAP1 POP DUP3 DUP2 LT ISZERO PUSH2 0x7C6 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x15D6 JUMP JUMPDEST PUSH2 0x7DC PUSH2 0x7D1 PUSH2 0x942 JUMP JUMPDEST DUP6 PUSH2 0x42B DUP7 DUP6 PUSH2 0x1695 JUMP JUMPDEST POP PUSH1 0x1 SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH2 0x38B PUSH2 0x7F3 PUSH2 0x942 JUMP JUMPDEST DUP5 DUP5 PUSH2 0x9FA JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP4 SWAP1 SWAP5 AND DUP3 MSTORE SWAP2 SWAP1 SWAP2 MSTORE KECCAK256 SLOAD SWAP1 JUMP JUMPDEST PUSH2 0x82D PUSH2 0x942 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH2 0x83E PUSH2 0x6D6 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND EQ PUSH2 0x864 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1463 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH2 0x88A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1323 JUMP JUMPDEST PUSH1 0x9 SLOAD PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND SWAP3 AND SWAP1 PUSH32 0x8BE0079C531659141344CD1FD0A4F28419497F9722A3DAAFE3B4186F6B6457E0 SWAP1 PUSH1 0x0 SWAP1 LOG3 PUSH1 0x9 DUP1 SLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB NOT AND PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP3 SWAP1 SWAP3 AND SWAP2 SWAP1 SWAP2 OR SWAP1 SSTORE JUMP JUMPDEST PUSH2 0x8F1 DUP4 DUP4 DUP4 PUSH2 0x68A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x915 JUMPI PUSH2 0x908 DUP3 PUSH2 0xE9E JUMP JUMPDEST PUSH2 0x910 PUSH2 0xEC8 JUMP JUMPDEST PUSH2 0x68A JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x92C JUMPI PUSH2 0x908 DUP4 PUSH2 0xE9E JUMP JUMPDEST PUSH2 0x935 DUP4 PUSH2 0xE9E JUMP JUMPDEST PUSH2 0x68A DUP3 PUSH2 0xE9E JUMP JUMPDEST SLOAD SWAP1 JUMP JUMPDEST CALLER SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0x96C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1562 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0x992 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1369 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP5 AND PUSH1 0x0 DUP2 DUP2 MSTORE PUSH1 0x1 PUSH1 0x20 SWAP1 DUP2 MSTORE PUSH1 0x40 DUP1 DUP4 KECCAK256 SWAP5 DUP8 AND DUP1 DUP5 MSTORE SWAP5 SWAP1 SWAP2 MSTORE SWAP1 DUP2 SWAP1 KECCAK256 DUP5 SWAP1 SSTORE MLOAD PUSH32 0x8C5BE1E5EBEC7D5BD14F71427D1E84F3DD0314C0F7B2291E5B200AC8C7C3B925 SWAP1 PUSH2 0x9ED SWAP1 DUP6 SWAP1 PUSH2 0x1652 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH2 0xA20 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x151D JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xA46 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1270 JUMP JUMPDEST PUSH2 0xA51 DUP4 DUP4 DUP4 PUSH2 0xED5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP2 LT ISZERO PUSH2 0xA8A JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x13AB JUMP JUMPDEST PUSH2 0xA94 DUP3 DUP3 PUSH2 0x1695 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP1 DUP7 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP1 DUP3 KECCAK256 SWAP4 SWAP1 SWAP4 SSTORE SWAP1 DUP6 AND DUP2 MSTORE SWAP1 DUP2 KECCAK256 DUP1 SLOAD DUP5 SWAP3 SWAP1 PUSH2 0xACA SWAP1 DUP5 SWAP1 PUSH2 0x1669 JUMP JUMPDEST SWAP3 POP POP DUP2 SWAP1 SSTORE POP DUP3 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND DUP5 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB AND PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF DUP5 PUSH1 0x40 MLOAD PUSH2 0xB14 SWAP2 SWAP1 PUSH2 0x1652 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP POP POP JUMP JUMPDEST PUSH2 0xB2A PUSH2 0x582 JUMP JUMPDEST PUSH2 0xB46 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x12B3 JUMP JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH1 0xFF PUSH1 0xA0 SHL NOT AND SWAP1 SSTORE PUSH32 0x5DB9EE0A495BF2E6FF9C91A7834C1BA4FDD244A5E8AA4E537BD38AEAE4B073AA PUSH2 0xB7C PUSH2 0x942 JUMP JUMPDEST PUSH1 0x40 MLOAD PUSH2 0xB89 SWAP2 SWAP1 PUSH2 0x11C7 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xBB9 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x161B JUMP JUMPDEST PUSH2 0xBC5 PUSH1 0x0 DUP4 DUP4 PUSH2 0xED5 JUMP JUMPDEST DUP1 PUSH1 0x2 PUSH1 0x0 DUP3 DUP3 SLOAD PUSH2 0xBD7 SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 DUP1 SLOAD DUP4 SWAP3 SWAP1 PUSH2 0xC04 SWAP1 DUP5 SWAP1 PUSH2 0x1669 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x40 MLOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP4 AND SWAP1 PUSH1 0x0 SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 PUSH2 0xC47 SWAP1 DUP6 SWAP1 PUSH2 0x1652 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG3 POP POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH2 0xC79 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x14DC JUMP JUMPDEST PUSH2 0xC85 DUP3 PUSH1 0x0 DUP4 PUSH2 0xED5 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP3 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 SWAP1 KECCAK256 SLOAD DUP2 DUP2 LT ISZERO PUSH2 0xCBE JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x12E1 JUMP JUMPDEST PUSH2 0xCC8 DUP3 DUP3 PUSH2 0x1695 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP5 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x20 DUP2 SWAP1 MSTORE PUSH1 0x40 DUP2 KECCAK256 SWAP2 SWAP1 SWAP2 SSTORE PUSH1 0x2 DUP1 SLOAD DUP5 SWAP3 SWAP1 PUSH2 0xCF6 SWAP1 DUP5 SWAP1 PUSH2 0x1695 JUMP JUMPDEST SWAP1 SWAP2 SSTORE POP POP PUSH1 0x40 MLOAD PUSH1 0x0 SWAP1 PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP6 AND SWAP1 PUSH32 0xDDF252AD1BE2C89B69C2B068FC378DAA952BA7F163C4A11628F55A4DF523B3EF SWAP1 PUSH2 0x9ED SWAP1 DUP7 SWAP1 PUSH2 0x1652 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 DUP5 GT PUSH2 0xD5C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x15A6 JUMP JUMPDEST PUSH2 0xD66 PUSH1 0x8 PUSH2 0x93E JUMP JUMPDEST DUP5 GT ISZERO PUSH2 0xD85 JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x1239 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xD91 DUP5 DUP7 PUSH2 0xF05 JUMP JUMPDEST DUP5 SLOAD SWAP1 SWAP2 POP DUP2 EQ ISZERO PUSH2 0xDAA JUMPI PUSH1 0x0 DUP1 SWAP3 POP SWAP3 POP POP PUSH2 0xDE0 JUMP JUMPDEST PUSH1 0x1 DUP5 PUSH1 0x1 ADD DUP3 DUP2 SLOAD DUP2 LT PUSH2 0xDCF JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP3 POP SWAP3 POP POP JUMPDEST SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH2 0xDEF PUSH2 0x582 JUMP JUMPDEST ISZERO PUSH2 0xE0C JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x13F1 JUMP JUMPDEST PUSH1 0x9 DUP1 SLOAD PUSH1 0xFF PUSH1 0xA0 SHL NOT AND PUSH1 0x1 PUSH1 0xA0 SHL OR SWAP1 SSTORE PUSH32 0x62E78CEA01BEE320CD4E420270B5EA74000D11B0C9F74754EBDBFC544B05A258 PUSH2 0xB7C PUSH2 0x942 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE54 PUSH1 0x8 PUSH2 0xFE4 JUMP JUMPDEST PUSH1 0x0 PUSH2 0xE60 PUSH1 0x8 PUSH2 0x93E JUMP JUMPDEST SWAP1 POP PUSH32 0x8030E83B04D87BEF53480E26263266D6CA66863AA8506ACA6F2559D18AA1CB67 DUP2 PUSH1 0x40 MLOAD PUSH2 0xE91 SWAP2 SWAP1 PUSH2 0x1652 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 SWAP1 POP SWAP1 JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND PUSH1 0x0 SWAP1 DUP2 MSTORE PUSH1 0x5 PUSH1 0x20 MSTORE PUSH1 0x40 SWAP1 KECCAK256 PUSH2 0x536 SWAP1 PUSH2 0xEC3 DUP4 PUSH2 0x592 JUMP JUMPDEST PUSH2 0xFED JUMP JUMPDEST PUSH2 0x4D6 PUSH1 0x6 PUSH2 0xEC3 PUSH2 0x395 JUMP JUMPDEST PUSH2 0xEDD PUSH2 0x582 JUMP JUMPDEST ISZERO PUSH2 0xEFA JUMPI PUSH1 0x40 MLOAD PUSH3 0x461BCD PUSH1 0xE5 SHL DUP2 MSTORE PUSH1 0x4 ADD PUSH2 0x40C SWAP1 PUSH2 0x13F1 JUMP JUMPDEST PUSH2 0x68A DUP4 DUP4 DUP4 PUSH2 0x8E6 JUMP JUMPDEST DUP2 SLOAD PUSH1 0x0 SWAP1 PUSH2 0xF16 JUMPI POP PUSH1 0x0 PUSH2 0x38F JUMP JUMPDEST DUP3 SLOAD PUSH1 0x0 SWAP1 JUMPDEST DUP1 DUP3 LT ISZERO PUSH2 0xF80 JUMPI PUSH1 0x0 PUSH2 0xF30 DUP4 DUP4 PUSH2 0x1039 JUMP JUMPDEST SWAP1 POP DUP5 DUP7 DUP3 DUP2 SLOAD DUP2 LT PUSH2 0xF53 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD GT ISZERO PUSH2 0xF6C JUMPI DUP1 SWAP2 POP PUSH2 0xF7A JUMP JUMPDEST PUSH2 0xF77 DUP2 PUSH1 0x1 PUSH2 0x1669 JUMP JUMPDEST SWAP3 POP JUMPDEST POP PUSH2 0xF1C JUMP JUMPDEST PUSH1 0x0 DUP3 GT DUP1 ISZERO PUSH2 0xFC3 JUMPI POP DUP4 DUP6 PUSH2 0xF98 PUSH1 0x1 DUP6 PUSH2 0x1695 JUMP JUMPDEST DUP2 SLOAD DUP2 LT PUSH2 0xFB6 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD EQ JUMPDEST ISZERO PUSH2 0xFDC JUMPI PUSH2 0xFD3 PUSH1 0x1 DUP4 PUSH2 0x1695 JUMP JUMPDEST SWAP3 POP POP POP PUSH2 0x38F JUMP JUMPDEST POP SWAP1 POP PUSH2 0x38F JUMP JUMPDEST DUP1 SLOAD PUSH1 0x1 ADD SWAP1 SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH2 0xFF9 PUSH1 0x8 PUSH2 0x93E JUMP JUMPDEST SWAP1 POP DUP1 PUSH2 0x1005 DUP5 PUSH2 0x1097 JUMP JUMPDEST LT ISZERO PUSH2 0x68A JUMPI DUP3 SLOAD PUSH1 0x1 DUP1 DUP3 ADD DUP6 SSTORE PUSH1 0x0 DUP6 DUP2 MSTORE PUSH1 0x20 DUP1 DUP3 KECCAK256 SWAP1 SWAP4 ADD SWAP4 SWAP1 SWAP4 SSTORE SWAP4 DUP5 ADD DUP1 SLOAD SWAP5 DUP6 ADD DUP2 SSTORE DUP3 MSTORE SWAP1 KECCAK256 SWAP1 SWAP2 ADD SSTORE JUMP JUMPDEST PUSH1 0x0 PUSH1 0x2 PUSH2 0x1047 DUP2 DUP5 PUSH2 0x16E7 JUMP JUMPDEST PUSH2 0x1052 PUSH1 0x2 DUP7 PUSH2 0x16E7 JUMP JUMPDEST PUSH2 0x105C SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST PUSH2 0x1066 SWAP2 SWAP1 PUSH2 0x1681 JUMP JUMPDEST PUSH2 0x1071 PUSH1 0x2 DUP5 PUSH2 0x1681 JUMP JUMPDEST PUSH2 0x107C PUSH1 0x2 DUP7 PUSH2 0x1681 JUMP JUMPDEST PUSH2 0x1086 SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST PUSH2 0x1090 SWAP2 SWAP1 PUSH2 0x1669 JUMP JUMPDEST SWAP4 SWAP3 POP POP POP JUMP JUMPDEST DUP1 SLOAD PUSH1 0x0 SWAP1 PUSH2 0x10A8 JUMPI POP PUSH1 0x0 PUSH2 0x5AC JUMP JUMPDEST DUP2 SLOAD DUP3 SWAP1 PUSH2 0x10B8 SWAP1 PUSH1 0x1 SWAP1 PUSH2 0x1695 JUMP JUMPDEST DUP2 SLOAD DUP2 LT PUSH2 0x10D6 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x32 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST SWAP1 PUSH1 0x0 MSTORE PUSH1 0x20 PUSH1 0x0 KECCAK256 ADD SLOAD SWAP1 POP PUSH2 0x5AC JUMP JUMPDEST DUP1 CALLDATALOAD PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB DUP2 AND DUP2 EQ PUSH2 0x5AC JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x1110 JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1090 DUP3 PUSH2 0x10E8 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x112B JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1134 DUP4 PUSH2 0x10E8 JUMP JUMPDEST SWAP2 POP PUSH2 0x1142 PUSH1 0x20 DUP5 ADD PUSH2 0x10E8 JUMP JUMPDEST SWAP1 POP SWAP3 POP SWAP3 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x0 PUSH1 0x60 DUP5 DUP7 SUB SLT ISZERO PUSH2 0x115F JUMPI DUP1 DUP2 REVERT JUMPDEST PUSH2 0x1168 DUP5 PUSH2 0x10E8 JUMP JUMPDEST SWAP3 POP PUSH2 0x1176 PUSH1 0x20 DUP6 ADD PUSH2 0x10E8 JUMP JUMPDEST SWAP2 POP PUSH1 0x40 DUP5 ADD CALLDATALOAD SWAP1 POP SWAP3 POP SWAP3 POP SWAP3 JUMP JUMPDEST PUSH1 0x0 DUP1 PUSH1 0x40 DUP4 DUP6 SUB SLT ISZERO PUSH2 0x1198 JUMPI DUP2 DUP3 REVERT JUMPDEST PUSH2 0x11A1 DUP4 PUSH2 0x10E8 JUMP JUMPDEST SWAP5 PUSH1 0x20 SWAP4 SWAP1 SWAP4 ADD CALLDATALOAD SWAP4 POP POP POP JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP3 DUP5 SUB SLT ISZERO PUSH2 0x11C0 JUMPI DUP1 DUP2 REVERT JUMPDEST POP CALLDATALOAD SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x1 PUSH1 0x1 PUSH1 0xA0 SHL SUB SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST SWAP1 ISZERO ISZERO DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 PUSH1 0x20 DUP1 DUP4 MSTORE DUP4 MLOAD DUP1 DUP3 DUP6 ADD MSTORE DUP3 JUMPDEST DUP2 DUP2 LT ISZERO PUSH2 0x1212 JUMPI DUP6 DUP2 ADD DUP4 ADD MLOAD DUP6 DUP3 ADD PUSH1 0x40 ADD MSTORE DUP3 ADD PUSH2 0x11F6 JUMP JUMPDEST DUP2 DUP2 GT ISZERO PUSH2 0x1223 JUMPI DUP4 PUSH1 0x40 DUP4 DUP8 ADD ADD MSTORE JUMPDEST POP PUSH1 0x1F ADD PUSH1 0x1F NOT AND SWAP3 SWAP1 SWAP3 ADD PUSH1 0x40 ADD SWAP4 SWAP3 POP POP POP JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1D SWAP1 DUP3 ADD MSTORE PUSH32 0x4552433230536E617073686F743A206E6F6E6578697374656E74206964000000 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x23 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220746F20746865207A65726F2061646472 PUSH1 0x40 DUP3 ADD MSTORE PUSH3 0x657373 PUSH1 0xE8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x14 SWAP1 DUP3 ADD MSTORE PUSH20 0x14185D5CD8589B194E881B9BDD081C185D5CD959 PUSH1 0x62 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x22 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A206275726E20616D6F756E7420657863656564732062616C616E PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x6365 PUSH1 0xF0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x4F776E61626C653A206E6577206F776E657220697320746865207A65726F2061 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x646472657373 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x22 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F766520746F20746865207A65726F206164647265 PUSH1 0x40 DUP3 ADD MSTORE PUSH2 0x7373 PUSH1 0xF0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x26 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220616D6F756E7420657863656564732062 PUSH1 0x40 DUP3 ADD MSTORE PUSH6 0x616C616E6365 PUSH1 0xD0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x10 SWAP1 DUP3 ADD MSTORE PUSH16 0x14185D5CD8589B194E881C185D5CD959 PUSH1 0x82 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x28 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E7366657220616D6F756E7420657863656564732061 PUSH1 0x40 DUP3 ADD MSTORE PUSH8 0x6C6C6F77616E6365 PUSH1 0xC0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE DUP2 DUP2 ADD MSTORE PUSH32 0x4F776E61626C653A2063616C6C6572206973206E6F7420746865206F776E6572 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x24 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A206275726E20616D6F756E74206578636565647320616C6C6F77 PUSH1 0x40 DUP3 ADD MSTORE PUSH4 0x616E6365 PUSH1 0xE0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x21 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A206275726E2066726F6D20746865207A65726F20616464726573 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x73 PUSH1 0xF8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A207472616E736665722066726F6D20746865207A65726F206164 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0x6472657373 PUSH1 0xD8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x24 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A20617070726F76652066726F6D20746865207A65726F20616464 PUSH1 0x40 DUP3 ADD MSTORE PUSH4 0x72657373 PUSH1 0xE0 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x16 SWAP1 DUP3 ADD MSTORE PUSH22 0x4552433230536E617073686F743A206964206973203 PUSH1 0x54 SHL PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x25 SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A2064656372656173656420616C6C6F77616E63652062656C6F77 PUSH1 0x40 DUP3 ADD MSTORE PUSH5 0x207A65726F PUSH1 0xD8 SHL PUSH1 0x60 DUP3 ADD MSTORE PUSH1 0x80 ADD SWAP1 JUMP JUMPDEST PUSH1 0x20 DUP1 DUP3 MSTORE PUSH1 0x1F SWAP1 DUP3 ADD MSTORE PUSH32 0x45524332303A206D696E7420746F20746865207A65726F206164647265737300 PUSH1 0x40 DUP3 ADD MSTORE PUSH1 0x60 ADD SWAP1 JUMP JUMPDEST SWAP1 DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0xFF SWAP2 SWAP1 SWAP2 AND DUP2 MSTORE PUSH1 0x20 ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 NOT DUP3 GT ISZERO PUSH2 0x167C JUMPI PUSH2 0x167C PUSH2 0x16FB JUMP JUMPDEST POP ADD SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x1690 JUMPI PUSH2 0x1690 PUSH2 0x1711 JUMP JUMPDEST POP DIV SWAP1 JUMP JUMPDEST PUSH1 0x0 DUP3 DUP3 LT ISZERO PUSH2 0x16A7 JUMPI PUSH2 0x16A7 PUSH2 0x16FB JUMP JUMPDEST POP SUB SWAP1 JUMP JUMPDEST PUSH1 0x2 DUP2 DIV PUSH1 0x1 DUP3 AND DUP1 PUSH2 0x16C0 JUMPI PUSH1 0x7F DUP3 AND SWAP2 POP JUMPDEST PUSH1 0x20 DUP3 LT DUP2 EQ ISZERO PUSH2 0x16E1 JUMPI PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x22 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x0 DUP3 PUSH2 0x16F6 JUMPI PUSH2 0x16F6 PUSH2 0x1711 JUMP JUMPDEST POP MOD SWAP1 JUMP JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x11 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT JUMPDEST PUSH4 0x4E487B71 PUSH1 0xE0 SHL PUSH1 0x0 MSTORE PUSH1 0x12 PUSH1 0x4 MSTORE PUSH1 0x24 PUSH1 0x0 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 0xD0 0xC6 PUSH22 0xE9E46F528F7F66B91A0DA61EE05ABA44FB87015DC8A1 JUMP DUP1 STATICCALL 0x2F 0xC9 0xAE PUSH8 0x64736F6C63430008 STOP STOP CALLER ",
"sourceMap": "403:745:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2077:98:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4174:166;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3165:106::-;;;:::i;:::-;;;;;;;:::i;4807:414::-;;;;;;:::i;:::-;;:::i;3014:91::-;;;:::i;:::-;;;;;;;:::i;5616:212::-;;;;;;:::i;:::-;;:::i;763:63:11:-;;;:::i;:::-;;832:93;;;;;;:::i;:::-;;:::i;487:89:4:-;;;;;;:::i;:::-;;:::i;4218:262:5:-;;;;;;:::i;:::-;;:::i;1042:84:1:-;;;:::i;3329:125:2:-;;;;;;:::i;:::-;;:::i;1700:145:0:-;;;:::i;882:327:4:-;;;;;;:::i;:::-;;:::i;698:59:11:-;;;:::i;1068:85:0:-;;;:::i;:::-;;;;;;;:::i;2288:102:2:-;;;:::i;627:65:11:-;;;:::i;4579:229:5:-;;;;;;:::i;:::-;;:::i;6315:371:2:-;;;;;;:::i;:::-;;:::i;3657:172::-;;;;;;:::i;:::-;;:::i;3887:149::-;;;;;;:::i;:::-;;:::i;1994:240:0:-;;;;;;:::i;:::-;;:::i;2077:98:2:-;2131:13;2163:5;2156:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2077:98;:::o;4174:166::-;4257:4;4273:39;4282:12;:10;:12::i;:::-;4296:7;4305:6;4273:8;:39::i;:::-;-1:-1:-1;4329:4:2;4174:166;;;;;:::o;3165:106::-;3252:12;;3165:106;:::o;4807:414::-;4913:4;4929:36;4939:6;4947:9;4958:6;4929:9;:36::i;:::-;-1:-1:-1;;;;;5003:19:2;;4976:24;5003:19;;;:11;:19;;;;;4976:24;5023:12;:10;:12::i;:::-;-1:-1:-1;;;;;5003:33:2;-1:-1:-1;;;;;5003:33:2;;;;;;;;;;;;;4976:60;;5074:6;5054:16;:26;;5046:79;;;;-1:-1:-1;;;5046:79:2;;;;;;;:::i;:::-;;;;;;;;;5135:57;5144:6;5152:12;:10;:12::i;:::-;5166:25;5185:6;5166:16;:25;:::i;:::-;5135:8;:57::i;:::-;-1:-1:-1;5210:4:2;;4807:414;-1:-1:-1;;;;4807:414:2:o;3014:91::-;3096:2;3014:91;:::o;5616:212::-;5704:4;5720:80;5729:12;:10;:12::i;:::-;5743:7;5789:10;5752:11;:25;5764:12;:10;:12::i;:::-;-1:-1:-1;;;;;5752:25:2;;;;;;;;;;;;;;;;;-1:-1:-1;5752:25:2;;;:34;;;;;;;;;;:47;;;;:::i;763:63:11:-;1291:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1280:23:0;;1272:68;;;;-1:-1:-1;;;1272:68:0;;;;;;;:::i;:::-;809:10:11::1;:8;:10::i;:::-;763:63::o:0;832:93::-;1291:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1280:23:0;;1272:68;;;;-1:-1:-1;;;1272:68:0;;;;;;;:::i;:::-;901:17:11::1;907:2;911:6;901:5;:17::i;:::-;832:93:::0;;:::o;487:89:4:-;542:27;548:12;:10;:12::i;:::-;562:6;542:5;:27::i;:::-;487:89;:::o;4218:262:5:-;-1:-1:-1;;;;;4381:33:5;;4305:7;4381:33;;;:24;:33;;;;;4305:7;;;;4360:55;;4369:10;;4360:8;:55::i;:::-;4324:91;;;;4433:11;:40;;4455:18;4465:7;4455:9;:18::i;:::-;4433:40;;;4447:5;4433:40;4426:47;4218:262;-1:-1:-1;;;;;4218:262:5:o;1042:84:1:-;1112:7;;-1:-1:-1;;;1112:7:1;;;;;1042:84::o;3329:125:2:-;-1:-1:-1;;;;;3429:18:2;;3403:7;3429:18;;;;;;;;;;;3329:125;;;;:::o;1700:145:0:-;1291:12;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1280:23:0;;1272:68;;;;-1:-1:-1;;;1272:68:0;;;;;;;:::i;:::-;1790:6:::1;::::0;1769:40:::1;::::0;1806:1:::1;::::0;-1:-1:-1;;;;;1790:6:0::1;::::0;1769:40:::1;::::0;1806:1;;1769:40:::1;1819:6;:19:::0;;-1:-1:-1;;;;;;1819:19:0::1;::::0;;1700:145::o;882:327:4:-;958:24;985:32;995:7;1004:12;:10;:12::i;985:32::-;958:59;;1055:6;1035:16;:26;;1027:75;;;;-1:-1:-1;;;1027:75:4;;;;;;;:::i;:::-;1112:58;1121:7;1130:12;:10;:12::i;:::-;1144:25;1163:6;1144:16;:25;:::i;1112:58::-;1180:22;1186:7;1195:6;1180:5;:22::i;:::-;882:327;;;:::o;698:59:11:-;1291:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1280:23:0;;1272:68;;;;-1:-1:-1;;;1272:68:0;;;;;;;:::i;:::-;742:8:11::1;:6;:8::i;1068:85:0:-:0;1140:6;;-1:-1:-1;;;;;1140:6:0;1068:85;:::o;2288:102:2:-;2344:13;2376:7;2369:14;;;;;:::i;627:65:11:-;1291:12:0;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1280:23:0;;1272:68;;;;-1:-1:-1;;;1272:68:0;;;;;;;:::i;:::-;674:11:11::1;:9;:11::i;4579:229:5:-:0;4650:7;4670:16;4688:13;4705:43;4714:10;4726:21;4705:8;:43::i;:::-;4669:79;;;;4766:11;:35;;4788:13;:11;:13::i;:::-;4766:35;;;4780:5;4766:35;4759:42;4579:229;-1:-1:-1;;;;4579:229:5:o;6315:371:2:-;6408:4;6424:24;6451:11;:25;6463:12;:10;:12::i;:::-;-1:-1:-1;;;;;6451:25:2;;;;;;;;;;;;;;;;;-1:-1:-1;6451:25:2;;;:34;;;;;;;;;;;-1:-1:-1;6503:35:2;;;;6495:85;;;;-1:-1:-1;;;6495:85:2;;;;;;;:::i;:::-;6590:67;6599:12;:10;:12::i;:::-;6613:7;6622:34;6641:15;6622:16;:34;:::i;6590:67::-;-1:-1:-1;6675:4:2;;6315:371;-1:-1:-1;;;6315:371:2:o;3657:172::-;3743:4;3759:42;3769:12;:10;:12::i;:::-;3783:9;3794:6;3759:9;:42::i;3887:149::-;-1:-1:-1;;;;;4002:18:2;;;3976:7;4002:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3887:149::o;1994:240:0:-;1291:12;:10;:12::i;:::-;-1:-1:-1;;;;;1280:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1280:23:0;;1272:68;;;;-1:-1:-1;;;1272:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2082:22:0;::::1;2074:73;;;;-1:-1:-1::0;;;2074:73:0::1;;;;;;;:::i;:::-;2183:6;::::0;2162:38:::1;::::0;-1:-1:-1;;;;;2162:38:0;;::::1;::::0;2183:6:::1;::::0;2162:38:::1;::::0;2183:6:::1;::::0;2162:38:::1;2210:6;:17:::0;;-1:-1:-1;;;;;;2210:17:0::1;-1:-1:-1::0;;;;;2210:17:0;;;::::1;::::0;;;::::1;::::0;;1994:240::o;5022:526:5:-;5128:44;5155:4;5161:2;5165:6;5128:26;:44::i;:::-;-1:-1:-1;;;;;5185:18:5;;5181:361;;5231:26;5254:2;5231:22;:26::i;:::-;5267:28;:26;:28::i;:::-;5181:361;;;-1:-1:-1;;;;;5314:16:5;;5310:232;;5358:28;5381:4;5358:22;:28::i;5310:232::-;5469:28;5492:4;5469:22;:28::i;:::-;5507:26;5530:2;5507:22;:26::i;773:112:9:-;864:14;;773:112::o;586:96:8:-;665:10;586:96;:::o;9579:340:2:-;-1:-1:-1;;;;;9680:19:2;;9672:68;;;;-1:-1:-1;;;9672:68:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;9758:21:2;;9750:68;;;;-1:-1:-1;;;9750:68:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;9829:18:2;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;;:36;;;9880:32;;;;;9859:6;;9880:32;:::i;:::-;;;;;;;;9579:340;;;:::o;7160:592::-;-1:-1:-1;;;;;7265:20:2;;7257:70;;;;-1:-1:-1;;;7257:70:2;;;;;;;:::i;:::-;-1:-1:-1;;;;;7345:23:2;;7337:71;;;;-1:-1:-1;;;7337:71:2;;;;;;;:::i;:::-;7419:47;7440:6;7448:9;7459:6;7419:20;:47::i;:::-;-1:-1:-1;;;;;7501:17:2;;7477:21;7501:17;;;;;;;;;;;7536:23;;;;7528:74;;;;-1:-1:-1;;;7528:74:2;;;;;;;:::i;:::-;7632:22;7648:6;7632:13;:22;:::i;:::-;-1:-1:-1;;;;;7612:17:2;;;:9;:17;;;;;;;;;;;:42;;;;7664:20;;;;;;;;:30;;7688:6;;7612:9;7664:30;;7688:6;;7664:30;:::i;:::-;;;;;;;;7727:9;-1:-1:-1;;;;;7710:35:2;7719:6;-1:-1:-1;;;;;7710:35:2;;7738:6;7710:35;;;;;;:::i;:::-;;;;;;;;7160:592;;;;:::o;2054:117:1:-;1621:8;:6;:8::i;:::-;1613:41;;;;-1:-1:-1;;;1613:41:1;;;;;;;:::i;:::-;2112:7:::1;:15:::0;;-1:-1:-1;;;;2112:15:1::1;::::0;;2142:22:::1;2151:12;:10;:12::i;:::-;2142:22;;;;;;:::i;:::-;;;;;;;;2054:117::o:0;8023:330:2:-;-1:-1:-1;;;;;8106:21:2;;8098:65;;;;-1:-1:-1;;;8098:65:2;;;;;;;:::i;:::-;8174:49;8203:1;8207:7;8216:6;8174:20;:49::i;:::-;8250:6;8234:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;8266:18:2;;:9;:18;;;;;;;;;;:28;;8288:6;;8266:9;:28;;8288:6;;8266:28;:::i;:::-;;;;-1:-1:-1;;8309:37:2;;-1:-1:-1;;;;;8309:37:2;;;8326:1;;8309:37;;;;8339:6;;8309:37;:::i;:::-;;;;;;;;8023:330;;:::o;8673:483::-;-1:-1:-1;;;;;8756:21:2;;8748:67;;;;-1:-1:-1;;;8748:67:2;;;;;;;:::i;:::-;8826:49;8847:7;8864:1;8868:6;8826:20;:49::i;:::-;-1:-1:-1;;;;;8911:18:2;;8886:22;8911:18;;;;;;;;;;;8947:24;;;;8939:71;;;;-1:-1:-1;;;8939:71:2;;;;;;;:::i;:::-;9041:23;9058:6;9041:14;:23;:::i;:::-;-1:-1:-1;;;;;9020:18:2;;:9;:18;;;;;;;;;;:44;;;;9074:12;:22;;9090:6;;9020:9;9074:22;;9090:6;;9074:22;:::i;:::-;;;;-1:-1:-1;;9112:37:2;;9138:1;;-1:-1:-1;;;;;9112:37:2;;;;;;;9142:6;;9112:37;:::i;5554:1664:5:-;5651:4;5657:7;5701:1;5688:10;:14;5680:49;;;;-1:-1:-1;;;5680:49:5;;;;;;;:::i;:::-;5814:28;:18;:26;:28::i;:::-;5800:10;:42;;5792:84;;;;-1:-1:-1;;;5792:84:5;;;;;;;:::i;:::-;6999:13;7015:40;:9;7044:10;7015:28;:40::i;:::-;7079:20;;6999:56;;-1:-1:-1;7070:29:5;;7066:146;;;7123:5;7130:1;7115:17;;;;;;;7066:146;7171:4;7177:9;:16;;7194:5;7177:23;;;;;;-1:-1:-1;;;7177:23:5;;;;;;;;;;;;;;;;;7163:38;;;;;5554:1664;;;;;;:::o;1807:115:1:-;1356:8;:6;:8::i;:::-;1355:9;1347:38;;;;-1:-1:-1;;;1347:38:1;;;;;;;:::i;:::-;1866:7:::1;:14:::0;;-1:-1:-1;;;;1866:14:1::1;-1:-1:-1::0;;;1866:14:1::1;::::0;;1895:20:::1;1902:12;:10;:12::i;3889:222:5:-:0;3936:7;3955:30;:18;:28;:30::i;:::-;3996:17;4016:28;:18;:26;:28::i;:::-;3996:48;;4059:19;4068:9;4059:19;;;;;;:::i;:::-;;;;;;;;4095:9;-1:-1:-1;3889:222:5;:::o;7224:144::-;-1:-1:-1;;;;;7307:33:5;;;;;;:24;:33;;;;;7291:70;;7342:18;7332:7;7342:9;:18::i;:::-;7291:15;:70::i;7374:116::-;7430:53;7446:21;7469:13;:11;:13::i;931:215:11:-;1356:8:1;:6;:8::i;:::-;1355:9;1347:38;;;;-1:-1:-1;;;1347:38:1;;;;;;;:::i;:::-;1095:44:11::1;1122:4;1128:2;1132:6;1095:26;:44::i;581:892:7:-:0;693:12;;670:7;;689:56;;-1:-1:-1;733:1:7;726:8;;689:56;795:12;;755:11;;818:414;831:4;825:3;:10;818:414;;;851:11;865:23;878:3;883:4;865:12;:23::i;:::-;851:37;;1118:7;1105:5;1111:3;1105:10;;;;;;-1:-1:-1;;;1105:10:7;;;;;;;;;;;;;;;;;:20;1101:121;;;1152:3;1145:10;;1101:121;;;1200:7;:3;1206:1;1200:7;:::i;:::-;1194:13;;1101:121;818:414;;;;1355:1;1349:3;:7;:36;;;;-1:-1:-1;1378:7:7;1360:5;1366:7;1372:1;1366:3;:7;:::i;:::-;1360:14;;;;;;-1:-1:-1;;;1360:14:7;;;;;;;;;;;;;;;;;:25;1349:36;1345:122;;;1408:7;1414:1;1408:3;:7;:::i;:::-;1401:14;;;;;;1345:122;-1:-1:-1;1453:3:7;-1:-1:-1;1446:10:7;;891:123:9;978:19;;996:1;978:19;;;891:123::o;7496:309:5:-;7590:17;7610:28;:18;:26;:28::i;:::-;7590:48;-1:-1:-1;7590:48:5;7652:30;7668:9;7652:15;:30::i;:::-;:42;7648:151;;;7710:29;;;;;;;;-1:-1:-1;7710:29:5;;;;;;;;;;;;;;7753:16;;;:35;;;;;;;;;;;;;;;7496:309::o;608:190:10:-;670:7;789:1;780:5;789:1;780;:5;:::i;:::-;772;776:1;772;:5;:::i;:::-;:13;;;;:::i;:::-;771:19;;;;:::i;:::-;761:5;765:1;761;:5;:::i;:::-;751;755:1;751;:5;:::i;:::-;750:17;;;;:::i;:::-;:41;;;;:::i;:::-;743:48;608:190;-1:-1:-1;;;608:190:10:o;7811:206:5:-;7904:10;;7881:7;;7900:111;;-1:-1:-1;7942:1:5;7935:8;;7900:111;7985:10;;7981:3;;7985:14;;7998:1;;7985:14;:::i;:::-;7981:19;;;;;;-1:-1:-1;;;7981:19:5;;;;;;;;;;;;;;;;;7974:26;;;;14:175:12;84:20;;-1:-1:-1;;;;;133:31:12;;123:42;;113:2;;179:1;176;169:12;194:198;;306:2;294:9;285:7;281:23;277:32;274:2;;;327:6;319;312:22;274:2;355:31;376:9;355:31;:::i;397:274::-;;;526:2;514:9;505:7;501:23;497:32;494:2;;;547:6;539;532:22;494:2;575:31;596:9;575:31;:::i;:::-;565:41;;625:40;661:2;650:9;646:18;625:40;:::i;:::-;615:50;;484:187;;;;;:::o;676:342::-;;;;822:2;810:9;801:7;797:23;793:32;790:2;;;843:6;835;828:22;790:2;871:31;892:9;871:31;:::i;:::-;861:41;;921:40;957:2;946:9;942:18;921:40;:::i;:::-;911:50;;1008:2;997:9;993:18;980:32;970:42;;780:238;;;;;:::o;1023:266::-;;;1152:2;1140:9;1131:7;1127:23;1123:32;1120:2;;;1173:6;1165;1158:22;1120:2;1201:31;1222:9;1201:31;:::i;:::-;1191:41;1279:2;1264:18;;;;1251:32;;-1:-1:-1;;;1110:179:12:o;1294:190::-;;1406:2;1394:9;1385:7;1381:23;1377:32;1374:2;;;1427:6;1419;1412:22;1374:2;-1:-1:-1;1455:23:12;;1364:120;-1:-1:-1;1364:120:12:o;1489:203::-;-1:-1:-1;;;;;1653:32:12;;;;1635:51;;1623:2;1608:18;;1590:102::o;1697:187::-;1862:14;;1855:22;1837:41;;1825:2;1810:18;;1792:92::o;1889:603::-;;2030:2;2059;2048:9;2041:21;2091:6;2085:13;2134:6;2129:2;2118:9;2114:18;2107:34;2159:4;2172:140;2186:6;2183:1;2180:13;2172:140;;;2281:14;;;2277:23;;2271:30;2247:17;;;2266:2;2243:26;2236:66;2201:10;;2172:140;;;2330:6;2327:1;2324:13;2321:2;;;2400:4;2395:2;2386:6;2375:9;2371:22;2367:31;2360:45;2321:2;-1:-1:-1;2476:2:12;2455:15;-1:-1:-1;;2451:29:12;2436:45;;;;2483:2;2432:54;;2010:482;-1:-1:-1;;;2010:482:12:o;2497:353::-;2699:2;2681:21;;;2738:2;2718:18;;;2711:30;2777:31;2772:2;2757:18;;2750:59;2841:2;2826:18;;2671:179::o;2855:399::-;3057:2;3039:21;;;3096:2;3076:18;;;3069:30;3135:34;3130:2;3115:18;;3108:62;-1:-1:-1;;;3201:2:12;3186:18;;3179:33;3244:3;3229:19;;3029:225::o;3259:344::-;3461:2;3443:21;;;3500:2;3480:18;;;3473:30;-1:-1:-1;;;3534:2:12;3519:18;;3512:50;3594:2;3579:18;;3433:170::o;3608:398::-;3810:2;3792:21;;;3849:2;3829:18;;;3822:30;3888:34;3883:2;3868:18;;3861:62;-1:-1:-1;;;3954:2:12;3939:18;;3932:32;3996:3;3981:19;;3782:224::o;4011:402::-;4213:2;4195:21;;;4252:2;4232:18;;;4225:30;4291:34;4286:2;4271:18;;4264:62;-1:-1:-1;;;4357:2:12;4342:18;;4335:36;4403:3;4388:19;;4185:228::o;4418:398::-;4620:2;4602:21;;;4659:2;4639:18;;;4632:30;4698:34;4693:2;4678:18;;4671:62;-1:-1:-1;;;4764:2:12;4749:18;;4742:32;4806:3;4791:19;;4592:224::o;4821:402::-;5023:2;5005:21;;;5062:2;5042:18;;;5035:30;5101:34;5096:2;5081:18;;5074:62;-1:-1:-1;;;5167:2:12;5152:18;;5145:36;5213:3;5198:19;;4995:228::o;5228:340::-;5430:2;5412:21;;;5469:2;5449:18;;;5442:30;-1:-1:-1;;;5503:2:12;5488:18;;5481:46;5559:2;5544:18;;5402:166::o;5573:404::-;5775:2;5757:21;;;5814:2;5794:18;;;5787:30;5853:34;5848:2;5833:18;;5826:62;-1:-1:-1;;;5919:2:12;5904:18;;5897:38;5967:3;5952:19;;5747:230::o;5982:356::-;6184:2;6166:21;;;6203:18;;;6196:30;6262:34;6257:2;6242:18;;6235:62;6329:2;6314:18;;6156:182::o;6343:400::-;6545:2;6527:21;;;6584:2;6564:18;;;6557:30;6623:34;6618:2;6603:18;;6596:62;-1:-1:-1;;;6689:2:12;6674:18;;6667:34;6733:3;6718:19;;6517:226::o;6748:397::-;6950:2;6932:21;;;6989:2;6969:18;;;6962:30;7028:34;7023:2;7008:18;;7001:62;-1:-1:-1;;;7094:2:12;7079:18;;7072:31;7135:3;7120:19;;6922:223::o;7150:401::-;7352:2;7334:21;;;7391:2;7371:18;;;7364:30;7430:34;7425:2;7410:18;;7403:62;-1:-1:-1;;;7496:2:12;7481:18;;7474:35;7541:3;7526:19;;7324:227::o;7556:400::-;7758:2;7740:21;;;7797:2;7777:18;;;7770:30;7836:34;7831:2;7816:18;;7809:62;-1:-1:-1;;;7902:2:12;7887:18;;7880:34;7946:3;7931:19;;7730:226::o;7961:346::-;8163:2;8145:21;;;8202:2;8182:18;;;8175:30;-1:-1:-1;;;8236:2:12;8221:18;;8214:52;8298:2;8283:18;;8135:172::o;8312:401::-;8514:2;8496:21;;;8553:2;8533:18;;;8526:30;8592:34;8587:2;8572:18;;8565:62;-1:-1:-1;;;8658:2:12;8643:18;;8636:35;8703:3;8688:19;;8486:227::o;8718:355::-;8920:2;8902:21;;;8959:2;8939:18;;;8932:30;8998:33;8993:2;8978:18;;8971:61;9064:2;9049:18;;8892:181::o;9078:177::-;9224:25;;;9212:2;9197:18;;9179:76::o;9260:184::-;9432:4;9420:17;;;;9402:36;;9390:2;9375:18;;9357:87::o;9449:128::-;;9520:1;9516:6;9513:1;9510:13;9507:2;;;9526:18;;:::i;:::-;-1:-1:-1;9562:9:12;;9497:80::o;9582:120::-;;9648:1;9638:2;;9653:18;;:::i;:::-;-1:-1:-1;9687:9:12;;9628:74::o;9707:125::-;;9775:1;9772;9769:8;9766:2;;;9780:18;;:::i;:::-;-1:-1:-1;9817:9:12;;9756:76::o;9837:380::-;9922:1;9912:12;;9969:1;9959:12;;;9980:2;;10034:4;10026:6;10022:17;10012:27;;9980:2;10087;10079:6;10076:14;10056:18;10053:38;10050:2;;;10133:10;10128:3;10124:20;10121:1;10114:31;10168:4;10165:1;10158:15;10196:4;10193:1;10186:15;10050:2;;9892:325;;;:::o;10222:112::-;;10280:1;10270:2;;10285:18;;:::i;:::-;-1:-1:-1;10319:9:12;;10260:74::o;10339:127::-;10400:10;10395:3;10391:20;10388:1;10381:31;10431:4;10428:1;10421:15;10455:4;10452:1;10445:15;10471:127;10532:10;10527:3;10523:20;10520:1;10513:31;10563:4;10560:1;10553:15;10587:4;10584:1;10577:15"
},
"gasEstimates": {
"creation": {
"codeDepositCost": "1196200",
"executionCost": "infinite",
"totalCost": "infinite"
},
"external": {
"allowance(address,address)": "infinite",
"approve(address,uint256)": "22630",
"balanceOf(address)": "infinite",
"balanceOfAt(address,uint256)": "infinite",
"burn(uint256)": "infinite",
"burnFrom(address,uint256)": "infinite",
"decimals()": "352",
"decreaseAllowance(address,uint256)": "infinite",
"increaseAllowance(address,uint256)": "infinite",
"mint(address,uint256)": "infinite",
"name()": "infinite",
"owner()": "1181",
"pause()": "infinite",
"paused()": "1190",
"renounceOwnership()": "24297",
"snapshot()": "23900",
"symbol()": "infinite",
"totalSupply()": "1096",
"totalSupplyAt(uint256)": "infinite",
"transfer(address,uint256)": "infinite",
"transferFrom(address,address,uint256)": "infinite",
"transferOwnership(address)": "24622",
"unpause()": "infinite"
},
"internal": {
"_beforeTokenTransfer(address,address,uint256)": "infinite"
}
},
"methodIdentifiers": {
"allowance(address,address)": "dd62ed3e",
"approve(address,uint256)": "095ea7b3",
"balanceOf(address)": "70a08231",
"balanceOfAt(address,uint256)": "4ee2cd7e",
"burn(uint256)": "42966c68",
"burnFrom(address,uint256)": "79cc6790",
"decimals()": "313ce567",
"decreaseAllowance(address,uint256)": "a457c2d7",
"increaseAllowance(address,uint256)": "39509351",
"mint(address,uint256)": "40c10f19",
"name()": "06fdde03",
"owner()": "8da5cb5b",
"pause()": "8456cb59",
"paused()": "5c975abb",
"renounceOwnership()": "715018a6",
"snapshot()": "9711715a",
"symbol()": "95d89b41",
"totalSupply()": "18160ddd",
"totalSupplyAt(uint256)": "981b24d0",
"transfer(address,uint256)": "a9059cbb",
"transferFrom(address,address,uint256)": "23b872dd",
"transferOwnership(address)": "f2fde38b",
"unpause()": "3f4ba83a"
}
},
"abi": [
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Paused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "id",
"type": "uint256"
}
],
"name": "Snapshot",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Unpaused",
"type": "event"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "snapshotId",
"type": "uint256"
}
],
"name": "balanceOfAt",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "burn",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "burnFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "subtractedValue",
"type": "uint256"
}
],
"name": "decreaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "addedValue",
"type": "uint256"
}
],
"name": "increaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "mint",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "paused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "snapshot",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "snapshotId",
"type": "uint256"
}
],
"name": "totalSupplyAt",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "unpause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
]
}
{
"compiler": {
"version": "0.8.0+commit.c7dfd78e"
},
"language": "Solidity",
"output": {
"abi": [
{
"inputs": [],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "previousOwner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnershipTransferred",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Paused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "id",
"type": "uint256"
}
],
"name": "Snapshot",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Unpaused",
"type": "event"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "snapshotId",
"type": "uint256"
}
],
"name": "balanceOfAt",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "burn",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "burnFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "subtractedValue",
"type": "uint256"
}
],
"name": "decreaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "addedValue",
"type": "uint256"
}
],
"name": "increaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "mint",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "paused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "snapshot",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "snapshotId",
"type": "uint256"
}
],
"name": "totalSupplyAt",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "unpause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"devdoc": {
"kind": "dev",
"methods": {
"allowance(address,address)": {
"details": "See {IERC20-allowance}."
},
"approve(address,uint256)": {
"details": "See {IERC20-approve}. Requirements: - `spender` cannot be the zero address."
},
"balanceOf(address)": {
"details": "See {IERC20-balanceOf}."
},
"balanceOfAt(address,uint256)": {
"details": "Retrieves the balance of `account` at the time `snapshotId` was created."
},
"burn(uint256)": {
"details": "Destroys `amount` tokens from the caller. See {ERC20-_burn}."
},
"burnFrom(address,uint256)": {
"details": "Destroys `amount` tokens from `account`, deducting from the caller's allowance. See {ERC20-_burn} and {ERC20-allowance}. Requirements: - the caller must have allowance for ``accounts``'s tokens of at least `amount`."
},
"decimals()": {
"details": "Returns the number of decimals used to get its user representation. For example, if `decimals` equals `2`, a balance of `505` tokens should be displayed to a user as `5,05` (`505 / 10 ** 2`). Tokens usually opt for a value of 18, imitating the relationship between Ether and Wei. This is the value {ERC20} uses, unless this function is overridden; NOTE: This information is only used for _display_ purposes: it in no way affects any of the arithmetic of the contract, including {IERC20-balanceOf} and {IERC20-transfer}."
},
"decreaseAllowance(address,uint256)": {
"details": "Atomically decreases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address. - `spender` must have allowance for the caller of at least `subtractedValue`."
},
"increaseAllowance(address,uint256)": {
"details": "Atomically increases the allowance granted to `spender` by the caller. This is an alternative to {approve} that can be used as a mitigation for problems described in {IERC20-approve}. Emits an {Approval} event indicating the updated allowance. Requirements: - `spender` cannot be the zero address."
},
"name()": {
"details": "Returns the name of the token."
},
"owner()": {
"details": "Returns the address of the current owner."
},
"paused()": {
"details": "Returns true if the contract is paused, and false otherwise."
},
"renounceOwnership()": {
"details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
},
"symbol()": {
"details": "Returns the symbol of the token, usually a shorter version of the name."
},
"totalSupply()": {
"details": "See {IERC20-totalSupply}."
},
"totalSupplyAt(uint256)": {
"details": "Retrieves the total supply at the time `snapshotId` was created."
},
"transfer(address,uint256)": {
"details": "See {IERC20-transfer}. Requirements: - `recipient` cannot be the zero address. - the caller must have a balance of at least `amount`."
},
"transferFrom(address,address,uint256)": {
"details": "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}. Requirements: - `sender` and `recipient` cannot be the zero address. - `sender` must have a balance of at least `amount`. - the caller must have allowance for ``sender``'s tokens of at least `amount`."
},
"transferOwnership(address)": {
"details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
}
},
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {},
"version": 1
}
},
"settings": {
"compilationTarget": {
"contract-b66ea9b998.sol": "YetAnotherCryptoToken"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
},
"sources": {
"@openzeppelin/contracts@4.1.0/access/Ownable.sol": {
"keccak256": "0x1cae4f85f114ff17b90414f5da67365b1d00337abb5bce9bf944eb78a2c0673c",
"license": "MIT",
"urls": [
"bzz-raw://d5ff16b336ce8f906478d5f2eecc6435e00833bdc0b92f6b209cf9e92cb5b2b7",
"dweb:/ipfs/QmRD1rAZEqQ73C33cdA3QoUyBDMEWnNKNMc6PNkAZWHeQQ"
]
},
"@openzeppelin/contracts@4.1.0/security/Pausable.sol": {
"keccak256": "0xab1f67e4c96dfe0e3875d22883c3dee5411914f40ce0c54ef407f030d803512e",
"license": "MIT",
"urls": [
"bzz-raw://b651c0571e3ecc124b3af7a598357a19406969b21b8a3fa06eeaf5e5c9150d6c",
"dweb:/ipfs/QmPfcAhbGVfsSd7VKet77fuST397b7XSFU2myXxLdok79v"
]
},
"@openzeppelin/contracts@4.1.0/token/ERC20/ERC20.sol": {
"keccak256": "0xfeccdcbf67b2006a715e5af1a4c7556004d95b2806552b5cc54e46e8eb7e887b",
"license": "MIT",
"urls": [
"bzz-raw://45b1f9043c0fb450272f20ed19ef633fcba1b129d602651a856dfae1a2243a2c",
"dweb:/ipfs/QmUTSQiDikkcNtTtyDpkEwCM5ztVUUh9c1inBukn6HC5Vr"
]
},
"@openzeppelin/contracts@4.1.0/token/ERC20/IERC20.sol": {
"keccak256": "0xf8e8d118a7a8b2e134181f7da655f6266aa3a0f9134b2605747139fcb0c5d835",
"license": "MIT",
"urls": [
"bzz-raw://9ec48567e7ad06acb670980d5cdf3fd7f3949bf12894f02d68c3bb43e75aa84f",
"dweb:/ipfs/QmaG3R2J9cz92YT77vFjYrjMNU2wHp4ypwYD62HqDUqS5U"
]
},
"@openzeppelin/contracts@4.1.0/token/ERC20/extensions/ERC20Burnable.sol": {
"keccak256": "0xb8cc16fa5514ccbff1123c566ec0a21682f1ded0ca7e5df719c6bd0b7429390a",
"license": "MIT",
"urls": [
"bzz-raw://80a57501e3b11616e3e252ee40b4479dc09f831a9aaf83224179eb1ccd54b7eb",
"dweb:/ipfs/QmZcREGkEbu9NoMiYXrXdJBAWNfeC41uM13rFaVL9VQafS"
]
},
"@openzeppelin/contracts@4.1.0/token/ERC20/extensions/ERC20Snapshot.sol": {
"keccak256": "0x0aa584894b926e99e9bbb20c9d240371b36089ad704d73ac012c4d855c7a9c72",
"license": "MIT",
"urls": [
"bzz-raw://025d13d1a7690ce76e87eae363ce1f1e9f0d25589a3aef3a6b59bb3333dccf43",
"dweb:/ipfs/Qmd7H8P6AUUWARQ22Jnt4sHQvdyhuRy8W7yjtY2iTWJnqi"
]
},
"@openzeppelin/contracts@4.1.0/token/ERC20/extensions/IERC20Metadata.sol": {
"keccak256": "0x83fe24f5c04a56091e50f4a345ff504c8bff658a76d4c43b16878c8f940c53b2",
"license": "MIT",
"urls": [
"bzz-raw://d4c3df1a7ca104b633a7d81c6c6f5192367d150cd5a32cba81f7f27012729013",
"dweb:/ipfs/QmSim72e3ZVsfgZt8UceCvbiSuMRHR6WDsiamqNzZahGSY"
]
},
"@openzeppelin/contracts@4.1.0/utils/Arrays.sol": {
"keccak256": "0x415faff3ea57601e0d5ebb1f02b0b808a302f8b661ff08d6b4a00c0ee00fa57e",
"license": "MIT",
"urls": [
"bzz-raw://0520bd87d3e82f9761054220cc1c58b92598852d99e5ec090b427f3ae9d67a2c",
"dweb:/ipfs/QmYTbyVy45dzkWnjvb9jhgVCfycEiefbATvusxk1Wepz32"
]
},
"@openzeppelin/contracts@4.1.0/utils/Context.sol": {
"keccak256": "0xf930d2df426bfcfc1f7415be724f04081c96f4fb9ec8d0e3a521c07692dface0",
"license": "MIT",
"urls": [
"bzz-raw://fc2bfdea0d2562c76fb3c4cf70a86c6ba25c5a30e8f8515c95aafdf8383f8395",
"dweb:/ipfs/QmTbFya18786ckJfLYUoWau9jBTKfmWnWm5XSViWvB7PXN"
]
},
"@openzeppelin/contracts@4.1.0/utils/Counters.sol": {
"keccak256": "0x62d306ff0499a11913bc60b5939eec619509b5c67b30e86ebf8b8bda0b7a7fee",
"license": "MIT",
"urls": [
"bzz-raw://6712ca27a06062db31465b1470e6207553553a9bb0b4358d918b35bdae5b4ffe",
"dweb:/ipfs/QmZ92pU9DJ3h1qREMFvDQhArSy6fh6zA983NeLFHRs1qKJ"
]
},
"@openzeppelin/contracts@4.1.0/utils/math/Math.sol": {
"keccak256": "0xa1477864def7febd9826918e50482a1ee7068b337b03804a7e0e98c674ac57c2",
"license": "MIT",
"urls": [
"bzz-raw://5bdd8ea2ace1bf716007318f8aca21d32384f0b8b295adac55147270767441fa",
"dweb:/ipfs/QmSv235N45Ub3wFXdTLNiS3k4b7FAudtEL8s6g1PwcsCcS"
]
},
"contract-b66ea9b998.sol": {
"keccak256": "0x763ab2896bd4958405bcbce4bf4b6696039ccf3a811a1f0cf63cf1adc06df44f",
"license": "MIT",
"urls": [
"bzz-raw://ff780d8ba052887ffe833eb46c13225c25cade87d85e35d933e3b3ca1144f633",
"dweb:/ipfs/QmQVXU43VtqDznXEEtEC8zkc6RMhwHFabVNbtHHuM6aMkK"
]
}
},
"version": 1
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts@4.1.0/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts@4.1.0/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts@4.1.0/token/ERC20/extensions/ERC20Snapshot.sol";
import "@openzeppelin/contracts@4.1.0/access/Ownable.sol";
import "@openzeppelin/contracts@4.1.0/security/Pausable.sol";
contract YetAnotherCryptoToken is ERC20, ERC20Burnable, ERC20Snapshot, Ownable, Pausable {
constructor() ERC20("YetAnotherCryptoToken", "YACT") {
_mint(msg.sender, 100000000000000 * 10 ** decimals());
}
function snapshot() public onlyOwner {
_snapshot();
}
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
function _beforeTokenTransfer(address from, address to, uint256 amount)
internal
whenNotPaused
override(ERC20, ERC20Snapshot)
{
super._beforeTokenTransfer(from, to, amount);
}
}
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol";
import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Snapshot.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
contract YetAnotherCryptoToken is ERC20, ERC20Burnable, ERC20Snapshot, Ownable, Pausable {
constructor() ERC20("YetAnotherCryptoToken", "YACT") {
_mint(msg.sender, 250000000000000 * 10 ** decimals());
}
function snapshot() public onlyOwner {
_snapshot();
}
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
function burn(address account, uint256 amount) public onlyOwner{
_burn(account, amount);
}
function _beforeTokenTransfer(address from, address to, uint256 amount)
internal
whenNotPaused
override(ERC20, ERC20Snapshot)
{
super._beforeTokenTransfer(from, to, amount);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment