Token Attack
Overview ERC-20
Price
$0.00 @ 0.000000 MATIC
Fully Diluted Market Cap
Total Supply:
998,999,999.999999 ATK
Holders:
6,678 addresses
Transfers:
-
Contract:
Decimals:
18
Official Site:
[ Download CSV Export ]
[ Download CSV Export ]
OVERVIEW
Attack Wagon is a blockchain game studio that creates a unique world where stories and communities meet. Their vision is to bring blockchain to everyday gamers through ease of use and intriguing storylines. The ATK token is a utility and governance token used in the Attack Wagon ecosystem.Update? Click here to update the token ICO / general information
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Attack
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-12-07 */ // File @openzeppelin/contracts/token/ERC20/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) 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); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @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); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `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"); unchecked { _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"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `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"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(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: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @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"); unchecked { _approve(account, _msgSender(), currentAllowance - amount); } _burn(account, amount); } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/draft-IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol) pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } else if (error == RecoverError.InvalidSignatureV) { revert("ECDSA: invalid signature 'v' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { // Check the signature length // - case 65: r,s,v signature (standard) // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._ if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else if (signature.length == 64) { bytes32 r; bytes32 vs; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. assembly { r := mload(add(signature, 0x20)) vs := mload(add(signature, 0x40)) } return tryRecover(hash, r, vs); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address, RecoverError) { bytes32 s; uint8 v; assembly { s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) v := add(shr(255, vs), 27) } return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover( bytes32 hash, bytes32 r, bytes32 vs ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } if (v != 27 && v != 28) { return (address(0), RecoverError.InvalidSignatureV); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover( bytes32 hash, uint8 v, bytes32 r, bytes32 s ) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); } } // File @openzeppelin/contracts/utils/cryptography/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/cryptography/draft-EIP712.sol) pragma solidity ^0.8.0; /** * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data. * * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible, * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding * they need in their contracts using a combination of `abi.encode` and `keccak256`. * * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA * ({_hashTypedDataV4}). * * The implementation of the domain separator was designed to be as efficient as possible while still properly updating * the chain id to protect against replay attacks on an eventual fork of the chain. * * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask]. * * _Available since v3.4._ */ abstract contract EIP712 { /* solhint-disable var-name-mixedcase */ // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to // invalidate the cached domain separator if the chain id changes. bytes32 private immutable _CACHED_DOMAIN_SEPARATOR; uint256 private immutable _CACHED_CHAIN_ID; address private immutable _CACHED_THIS; bytes32 private immutable _HASHED_NAME; bytes32 private immutable _HASHED_VERSION; bytes32 private immutable _TYPE_HASH; /* solhint-enable var-name-mixedcase */ /** * @dev Initializes the domain separator and parameter caches. * * The meaning of `name` and `version` is specified in * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]: * * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol. * - `version`: the current major version of the signing domain. * * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart * contract upgrade]. */ constructor(string memory name, string memory version) { bytes32 hashedName = keccak256(bytes(name)); bytes32 hashedVersion = keccak256(bytes(version)); bytes32 typeHash = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); _HASHED_NAME = hashedName; _HASHED_VERSION = hashedVersion; _CACHED_CHAIN_ID = block.chainid; _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion); _CACHED_THIS = address(this); _TYPE_HASH = typeHash; } /** * @dev Returns the domain separator for the current chain. */ function _domainSeparatorV4() internal view returns (bytes32) { if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) { return _CACHED_DOMAIN_SEPARATOR; } else { return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION); } } function _buildDomainSeparator( bytes32 typeHash, bytes32 nameHash, bytes32 versionHash ) private view returns (bytes32) { return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this))); } /** * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this * function returns the hash of the fully encoded EIP712 message for this domain. * * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example: * * ```solidity * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode( * keccak256("Mail(address to,string contents)"), * mailTo, * keccak256(bytes(mailContents)) * ))); * address signer = ECDSA.recover(digest, signature); * ``` */ function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) { return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash); } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. 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; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/draft-ERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on `{IERC20-approve}`, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * _Available since v3.4._ */ abstract contract ERC20Permit is ERC20, IERC20Permit, EIP712 { using Counters for Counters.Counter; mapping(address => Counters.Counter) private _nonces; // solhint-disable-next-line var-name-mixedcase bytes32 private immutable _PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); /** * @dev Initializes the {EIP712} domain separator using the `name` parameter, and setting `version` to `"1"`. * * It's a good idea to use the same `name` that is defined as the ERC20 token name. */ constructor(string memory name) EIP712(name, "1") {} /** * @dev See {IERC20Permit-permit}. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) public virtual override { require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); bytes32 hash = _hashTypedDataV4(structHash); address signer = ECDSA.recover(hash, v, r, s); require(signer == owner, "ERC20Permit: invalid signature"); _approve(owner, spender, value); } /** * @dev See {IERC20Permit-nonces}. */ function nonces(address owner) public view virtual override returns (uint256) { return _nonces[owner].current(); } /** * @dev See {IERC20Permit-DOMAIN_SEPARATOR}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view override returns (bytes32) { return _domainSeparatorV4(); } /** * @dev "Consume a nonce": return the current value and increment. * * _Available since v4.1._ */ function _useNonce(address owner) internal virtual returns (uint256 current) { Counters.Counter storage nonce = _nonces[owner]; current = nonce.current(); nonce.increment(); } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() private onlyOwner { //Modify - revert(" Renounce Ownership not allwed."); //Not possible with this smart contract //Original Code //_transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.0 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @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()); } } // File contracts/ATK.sol // OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; contract Attack is ERC20, ERC20Burnable, ERC20Permit, Ownable, Pausable { string private _name; string private _symbol; string private _version; address private _multiSigAccount; uint256 public _MAX_ATK; bool public _burnToggle; /* - - */ constructor (address _multiSig) ERC20("Attack", "ATK") ERC20Permit("Attack") { _name = "Attack"; _symbol = "ATK"; _version = "V1.0"; _MAX_ATK = 1000000000 * 10 ** decimals(); _multiSigAccount = _multiSig; _burnToggle = false; } // # Minting _MAX_PACDOT - function mint(address account, uint256 amount) public multiSigReq { require(!paused(), "Contract is currently paused - ATK cannot be minted."); require(amount <= 1000000000, "Mint amount cannot exceed Max ATK distribution!"); require((totalSupply() + amount) <= _MAX_ATK, "Mint amount cannot exceed Max ATK distribution!"); uint256 total_ = amount * 10 ** 18; _mint(account, total_); } // # Permission Functions & and Contract State Management modifier multiSigReq() { require(msg.sender == _multiSigAccount, "Unauthorized call to contract"); _; } function burn(uint256 amount) public override(ERC20Burnable) { require(!paused(), "Contract is currently paused - ATK cannot be burned."); if (msg.sender != _multiSigAccount) { require(_burnToggle == true, "Burn functionality is not currently active"); } _burn(_msgSender(), amount); } function pause() public multiSigReq { _pause(); } function unpause() public multiSigReq { _unpause(); } function toggleBurn() public multiSigReq { if(_burnToggle == false) { _burnToggle = true;} else { _burnToggle = false;} } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_multiSig","type":"address"}],"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":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":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MAX_ATK","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_burnToggle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"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":"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":"account","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","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"}]
Contract Creation Code
6101606040527f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9610140523480156200003757600080fd5b5060405162001f2538038062001f258339810160408190526200005a9162000390565b6040518060400160405280600681526020016541747461636b60d01b81525080604051806040016040528060018152602001603160f81b8152506040518060400160405280600681526020016541747461636b60d01b8152506040518060400160405280600381526020016241544b60e81b8152508160039080519060200190620000e7929190620002ea565b508051620000fd906004906020840190620002ea565b5050825160208085019190912083518483012060e08290526101008190524660a0818152604080517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f81880181905281830187905260608201869052608082019490945230818401528151808203909301835260c0019052805194019390932091935091906080523060601b60c0526101205250620001ac9350620001a6925050620002949050565b62000298565b6006805460ff60a01b19168155604080518082019091528181526541747461636b60d01b6020909101908152620001e79160079190620002ea565b506040805180820190915260038082526241544b60e81b60209092019182526200021491600891620002ea565b5060408051808201909152600480825263056312e360e41b60209092019182526200024291600991620002ea565b50620002516012600a6200040b565b6200026190633b9aca00620004cc565b600b55600a80546001600160a01b0319166001600160a01b0392909216919091179055600c805460ff1916905562000541565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620002f890620004ee565b90600052602060002090601f0160209004810192826200031c576000855562000367565b82601f106200033757805160ff191683800117855562000367565b8280016001018555821562000367579182015b82811115620003675782518255916020019190600101906200034a565b506200037592915062000379565b5090565b5b808211156200037557600081556001016200037a565b600060208284031215620003a357600080fd5b81516001600160a01b0381168114620003bb57600080fd5b9392505050565b600181815b8085111562000403578160001904821115620003e757620003e76200052b565b80851615620003f557918102915b93841c9390800290620003c7565b509250929050565b6000620003bb60ff8416836000826200042757506001620004c6565b816200043657506000620004c6565b81600181146200044f57600281146200045a576200047a565b6001915050620004c6565b60ff8411156200046e576200046e6200052b565b50506001821b620004c6565b5060208310610133831016604e8410600b84101617156200049f575081810a620004c6565b620004ab8383620003c2565b8060001904821115620004c257620004c26200052b565b0290505b92915050565b6000816000190483118215151615620004e957620004e96200052b565b500290565b600181811c908216806200050357607f821691505b602082108114156200052557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60805160a05160c05160601c60e0516101005161012051610140516119866200059f600039600061098701526000610edc01526000610f2b01526000610f0601526000610e5f01526000610e8901526000610eb301526119866000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806370a08231116100de57806395d89b4111610097578063a9059cbb11610071578063a9059cbb146102f5578063d505accf14610308578063dd62ed3e1461031b578063f2fde38b1461035457600080fd5b806395d89b41146102cd578063a457c2d7146102d5578063a4cd61ee146102e857600080fd5b806370a0823114610253578063778a56ce1461027c57806379cc6790146102845780637ecebe00146102975780638456cb59146102aa5780638da5cb5b146102b257600080fd5b80633644e515116101305780633644e515146101f657806339509351146101fe5780633f4ba83a1461021157806340c10f191461021b57806342966c681461022e5780635c975abb1461024157600080fd5b806306fdde0314610178578063095ea7b31461019657806318160ddd146101b957806323b872dd146101cb5780632e434e70146101de578063313ce567146101e7575b600080fd5b610180610367565b60405161018d91906117c6565b60405180910390f35b6101a96101a4366004611783565b6103f9565b604051901515815260200161018d565b6002545b60405190815260200161018d565b6101a96101d93660046116d4565b61040f565b6101bd600b5481565b6040516012815260200161018d565b6101bd6104be565b6101a961020c366004611783565b6104cd565b610219610509565b005b610219610229366004611783565b61053d565b61021961023c3660046117ad565b61065c565b600654600160a01b900460ff166101a9565b6101bd61026136600461167f565b6001600160a01b031660009081526020819052604090205490565b61021961075c565b610219610292366004611783565b6107ab565b6101bd6102a536600461167f565b61082c565b61021961084c565b6006546040516001600160a01b03909116815260200161018d565b61018061087e565b6101a96102e3366004611783565b61088d565b600c546101a99060ff1681565b6101a9610303366004611783565b610926565b610219610316366004611710565b610933565b6101bd6103293660046116a1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61021961036236600461167f565b610a97565b606060038054610376906118ef565b80601f01602080910402602001604051908101604052809291908181526020018280546103a2906118ef565b80156103ef5780601f106103c4576101008083540402835291602001916103ef565b820191906000526020600020905b8154815290600101906020018083116103d257829003601f168201915b5050505050905090565b6000610406338484610b5f565b50600192915050565b600061041c848484610c83565b6001600160a01b0384166000908152600160209081526040808320338452909152902054828110156104a65760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b6104b38533858403610b5f565b506001949350505050565b60006104c8610e52565b905090565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916104069185906105049086906118a1565b610b5f565b600a546001600160a01b031633146105335760405162461bcd60e51b815260040161049d9061181b565b61053b610f79565b565b600a546001600160a01b031633146105675760405162461bcd60e51b815260040161049d9061181b565b600654600160a01b900460ff16156105de5760405162461bcd60e51b815260206004820152603460248201527f436f6e74726163742069732063757272656e746c7920706175736564202d20416044820152732a259031b0b73737ba1031329036b4b73a32b21760611b606482015260840161049d565b633b9aca008111156106025760405162461bcd60e51b815260040161049d90611852565b600b548161060f60025490565b61061991906118a1565b11156106375760405162461bcd60e51b815260040161049d90611852565b600061064b82670de0b6b3a76400006118b9565b90506106578382611016565b505050565b600654600160a01b900460ff16156106d35760405162461bcd60e51b815260206004820152603460248201527f436f6e74726163742069732063757272656e746c7920706175736564202d20416044820152732a259031b0b73737ba10313290313ab93732b21760611b606482015260840161049d565b600a546001600160a01b0316331461074f57600c5460ff16151560011461074f5760405162461bcd60e51b815260206004820152602a60248201527f4275726e2066756e6374696f6e616c697479206973206e6f742063757272656e604482015269746c792061637469766560b01b606482015260840161049d565b61075933826110f5565b50565b600a546001600160a01b031633146107865760405162461bcd60e51b815260040161049d9061181b565b600c5460ff1661079f57600c805460ff19166001179055565b600c805460ff19169055565b60006107b78333610329565b9050818110156108155760405162461bcd60e51b8152602060048201526024808201527f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f77604482015263616e636560e01b606482015260840161049d565b6108228333848403610b5f565b61065783836110f5565b6001600160a01b0381166000908152600560205260408120545b92915050565b600a546001600160a01b031633146108765760405162461bcd60e51b815260040161049d9061181b565b61053b611243565b606060048054610376906118ef565b3360009081526001602090815260408083206001600160a01b03861684529091528120548281101561090f5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161049d565b61091c3385858403610b5f565b5060019392505050565b6000610406338484610c83565b834211156109835760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e65000000604482015260640161049d565b60007f00000000000000000000000000000000000000000000000000000000000000008888886109b28c6112cb565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090506000610a0d826112f3565b90506000610a1d82878787611341565b9050896001600160a01b0316816001600160a01b031614610a805760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e61747572650000604482015260640161049d565b610a8b8a8a8a610b5f565b50505050505050505050565b6006546001600160a01b03163314610af15760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161049d565b6001600160a01b038116610b565760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161049d565b61075981611369565b6001600160a01b038316610bc15760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161049d565b6001600160a01b038216610c225760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161049d565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b038316610ce75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161049d565b6001600160a01b038216610d495760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161049d565b6001600160a01b03831660009081526020819052604090205481811015610dc15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161049d565b6001600160a01b03808516600090815260208190526040808220858503905591851681529081208054849290610df89084906118a1565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610e4491815260200190565b60405180910390a350505050565b6000306001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015610eab57507f000000000000000000000000000000000000000000000000000000000000000046145b15610ed557507f000000000000000000000000000000000000000000000000000000000000000090565b50604080517f00000000000000000000000000000000000000000000000000000000000000006020808301919091527f0000000000000000000000000000000000000000000000000000000000000000828401527f000000000000000000000000000000000000000000000000000000000000000060608301524660808301523060a0808401919091528351808403909101815260c0909201909252805191012090565b600654600160a01b900460ff16610fc95760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161049d565b6006805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03821661106c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161049d565b806002600082825461107e91906118a1565b90915550506001600160a01b038216600090815260208190526040812080548392906110ab9084906118a1565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6001600160a01b0382166111555760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161049d565b6001600160a01b038216600090815260208190526040902054818110156111c95760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161049d565b6001600160a01b03831660009081526020819052604081208383039055600280548492906111f89084906118d8565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3505050565b600654600160a01b900460ff16156112905760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640161049d565b6006805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610ff93390565b6001600160a01b03811660009081526005602052604090208054600181018255905b50919050565b6000610846611300610e52565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000611352878787876113bb565b9150915061135f816114a8565b5095945050505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156113f2575060009050600361149f565b8460ff16601b1415801561140a57508460ff16601c14155b1561141b575060009050600461149f565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561146f573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166114985760006001925092505061149f565b9150600090505b94509492505050565b60008160048111156114bc576114bc61193a565b14156114c55750565b60018160048111156114d9576114d961193a565b14156115275760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161049d565b600281600481111561153b5761153b61193a565b14156115895760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161049d565b600381600481111561159d5761159d61193a565b14156115f65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b606482015260840161049d565b600481600481111561160a5761160a61193a565b14156107595760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b606482015260840161049d565b80356001600160a01b038116811461167a57600080fd5b919050565b60006020828403121561169157600080fd5b61169a82611663565b9392505050565b600080604083850312156116b457600080fd5b6116bd83611663565b91506116cb60208401611663565b90509250929050565b6000806000606084860312156116e957600080fd5b6116f284611663565b925061170060208501611663565b9150604084013590509250925092565b600080600080600080600060e0888a03121561172b57600080fd5b61173488611663565b965061174260208901611663565b95506040880135945060608801359350608088013560ff8116811461176657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561179657600080fd5b61179f83611663565b946020939093013593505050565b6000602082840312156117bf57600080fd5b5035919050565b600060208083528351808285015260005b818110156117f3578581018301518582016040015282016117d7565b81811115611805576000604083870101525b50601f01601f1916929092016040019392505050565b6020808252601d908201527f556e617574686f72697a65642063616c6c20746f20636f6e7472616374000000604082015260600190565b6020808252602f908201527f4d696e7420616d6f756e742063616e6e6f7420657863656564204d617820415460408201526e4b20646973747269627574696f6e2160881b606082015260800190565b600082198211156118b4576118b4611924565b500190565b60008160001904831182151516156118d3576118d3611924565b500290565b6000828210156118ea576118ea611924565b500390565b600181811c9082168061190357607f821691505b602082108114156112ed57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fdfea26469706673582212202586dc65b83d8626d4c17713d7aba69739a5e5549cf049c45e2eaa48de03dceb64736f6c6343000806003300000000000000000000000031b4d06d5d18db1a4df111fadf1798bd3f04bac3
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000031b4d06d5d18db1a4df111fadf1798bd3f04bac3
-----Decoded View---------------
Arg [0] : _multiSig (address): 0x31b4d06d5d18db1a4df111fadf1798bd3f04bac3
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000031b4d06d5d18db1a4df111fadf1798bd3f04bac3
Deployed ByteCode Sourcemap
46214:2139:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6706:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8873:169;;;;;;:::i;:::-;;:::i;:::-;;;2893:14:1;;2886:22;2868:41;;2856:2;2841:18;8873:169:0;2823:92:1;7826:108:0;7914:12;;7826:108;;;3066:25:1;;;3054:2;3039:18;7826:108:0;3021:76:1;9524:492:0;;;;;;:::i;:::-;;:::i;46424:23::-;;;;;;7668:93;;;7751:2;15656:36:1;;15644:2;15629:18;7668:93:0;15611:87:1;40641:115:0;;;:::i;10425:215::-;;;;;;:::i;:::-;;:::i;48075:68::-;;;:::i;:::-;;46881:468;;;;;;:::i;:::-;;:::i;47578:415::-;;;;;;:::i;:::-;;:::i;44910:86::-;44981:7;;-1:-1:-1;;;44981:7:0;;;;44910:86;;7997:127;;;;;;:::i;:::-;-1:-1:-1;;;;;8098:18:0;8071:7;8098:18;;;;;;;;;;;;7997:127;48151:197;;;:::i;17649:368::-;;;;;;:::i;:::-;;:::i;40383:128::-;;;;;;:::i;:::-;;:::i;48003:64::-;;;:::i;42174:87::-;42247:6;;42174:87;;-1:-1:-1;;;;;42247:6:0;;;2666:51:1;;2654:2;2639:18;42174:87:0;2621:102:1;6925:104:0;;;:::i;11143:413::-;;;;;;:::i;:::-;;:::i;46456:23::-;;;;;;;;;8337:175;;;;;;:::i;:::-;;:::i;39672:645::-;;;;;;:::i;:::-;;:::i;8575:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;8691:18:0;;;8664:7;8691:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;8575:151;43215:201;;;;;;:::i;:::-;;:::i;6706:100::-;6760:13;6793:5;6786:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6706:100;:::o;8873:169::-;8956:4;8973:39;4437:10;8996:7;9005:6;8973:8;:39::i;:::-;-1:-1:-1;9030:4:0;8873:169;;;;:::o;9524:492::-;9664:4;9681:36;9691:6;9699:9;9710:6;9681:9;:36::i;:::-;-1:-1:-1;;;;;9757:19:0;;9730:24;9757:19;;;:11;:19;;;;;;;;4437:10;9757:33;;;;;;;;9809:26;;;;9801:79;;;;-1:-1:-1;;;9801:79:0;;11964:2:1;9801:79:0;;;11946:21:1;12003:2;11983:18;;;11976:30;12042:34;12022:18;;;12015:62;-1:-1:-1;;;12093:18:1;;;12086:38;12141:19;;9801:79:0;;;;;;;;;9916:57;9925:6;4437:10;9966:6;9947:16;:25;9916:8;:57::i;:::-;-1:-1:-1;10004:4:0;;9524:492;-1:-1:-1;;;;9524:492:0:o;40641:115::-;40701:7;40728:20;:18;:20::i;:::-;40721:27;;40641:115;:::o;10425:215::-;4437:10;10513:4;10562:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10562:34:0;;;;;;;;;;10513:4;;10530:80;;10553:7;;10562:47;;10599:10;;10562:47;:::i;:::-;10530:8;:80::i;48075:68::-;47491:16;;-1:-1:-1;;;;;47491:16:0;47477:10;:30;47469:72;;;;-1:-1:-1;;;47469:72:0;;;;;;;:::i;:::-;48125:10:::1;:8;:10::i;:::-;48075:68::o:0;46881:468::-;47491:16;;-1:-1:-1;;;;;47491:16:0;47477:10;:30;47469:72;;;;-1:-1:-1;;;47469:72:0;;;;;;;:::i;:::-;44981:7;;-1:-1:-1;;;44981:7:0;;;;46979:9:::1;46971:74;;;::::0;-1:-1:-1;;;46971:74:0;;10078:2:1;46971:74:0::1;::::0;::::1;10060:21:1::0;10117:2;10097:18;;;10090:30;10156:34;10136:18;;;10129:62;-1:-1:-1;;;10207:18:1;;;10200:50;10267:19;;46971:74:0::1;10050:242:1::0;46971:74:0::1;47078:10;47068:6;:20;;47060:80;;;;-1:-1:-1::0;;;47060:80:0::1;;;;;;;:::i;:::-;47191:8;;47180:6;47164:13;7914:12:::0;;;7826:108;47164:13:::1;:22;;;;:::i;:::-;47163:36;;47155:96;;;;-1:-1:-1::0;;;47155:96:0::1;;;;;;;:::i;:::-;47266:14;47283:17;:6:::0;47292:8:::1;47283:17;:::i;:::-;47266:34;;47315:22;47321:7;47330:6;47315:5;:22::i;:::-;46956:393;46881:468:::0;;:::o;47578:415::-;44981:7;;-1:-1:-1;;;44981:7:0;;;;47674:9;47666:74;;;;-1:-1:-1;;;47666:74:0;;8847:2:1;47666:74:0;;;8829:21:1;8886:2;8866:18;;;8859:30;8925:34;8905:18;;;8898:62;-1:-1:-1;;;8976:18:1;;;8969:50;9036:19;;47666:74:0;8819:242:1;47666:74:0;47773:16;;-1:-1:-1;;;;;47773:16:0;47759:10;:30;47755:182;;47847:11;;;;:19;;:11;:19;47839:74;;;;-1:-1:-1;;;47839:74:0;;7268:2:1;47839:74:0;;;7250:21:1;7307:2;7287:18;;;7280:30;7346:34;7326:18;;;7319:62;-1:-1:-1;;;7397:18:1;;;7390:40;7447:19;;47839:74:0;7240:232:1;47839:74:0;47953:27;4437:10;47973:6;47953:5;:27::i;:::-;47578:415;:::o;48151:197::-;47491:16;;-1:-1:-1;;;;;47491:16:0;47477:10;:30;47469:72;;;;-1:-1:-1;;;47469:72:0;;;;;;;:::i;:::-;48219:11:::1;::::0;::::1;;48216:119;;48258:11;:18:::0;;-1:-1:-1;;48258:18:0::1;48272:4;48258:18;::::0;;48075:68::o;48216:119::-:1;48314:11;:19:::0;;-1:-1:-1;;48314:19:0::1;::::0;;48151:197::o;17649:368::-;17726:24;17753:32;17763:7;4437:10;8575:151;:::i;17753:32::-;17726:59;;17824:6;17804:16;:26;;17796:75;;;;-1:-1:-1;;;17796:75:0;;12734:2:1;17796:75:0;;;12716:21:1;12773:2;12753:18;;;12746:30;12812:34;12792:18;;;12785:62;-1:-1:-1;;;12863:18:1;;;12856:34;12907:19;;17796:75:0;12706:226:1;17796:75:0;17907:58;17916:7;4437:10;17958:6;17939:16;:25;17907:8;:58::i;:::-;17987:22;17993:7;18002:6;17987:5;:22::i;40383:128::-;-1:-1:-1;;;;;40479:14:0;;40452:7;40479:14;;;:7;:14;;;;;37708;40479:24;40472:31;40383:128;-1:-1:-1;;40383:128:0:o;48003:64::-;47491:16;;-1:-1:-1;;;;;47491:16:0;47477:10;:30;47469:72;;;;-1:-1:-1;;;47469:72:0;;;;;;;:::i;:::-;48051:8:::1;:6;:8::i;6925:104::-:0;6981:13;7014:7;7007:14;;;;;:::i;11143:413::-;4437:10;11236:4;11280:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;11280:34:0;;;;;;;;;;11333:35;;;;11325:85;;;;-1:-1:-1;;;11325:85:0;;14352:2:1;11325:85:0;;;14334:21:1;14391:2;14371:18;;;14364:30;14430:34;14410:18;;;14403:62;-1:-1:-1;;;14481:18:1;;;14474:35;14526:19;;11325:85:0;14324:227:1;11325:85:0;11446:67;4437:10;11469:7;11497:15;11478:16;:34;11446:8;:67::i;:::-;-1:-1:-1;11544:4:0;;11143:413;-1:-1:-1;;;11143:413:0:o;8337:175::-;8423:4;8440:42;4437:10;8464:9;8475:6;8440:9;:42::i;39672:645::-;39916:8;39897:15;:27;;39889:69;;;;-1:-1:-1;;;39889:69:0;;8489:2:1;39889:69:0;;;8471:21:1;8528:2;8508:18;;;8501:30;8567:31;8547:18;;;8540:59;8616:18;;39889:69:0;8461:179:1;39889:69:0;39971:18;40013:16;40031:5;40038:7;40047:5;40054:16;40064:5;40054:9;:16::i;:::-;40002:79;;;;;;3389:25:1;;;;-1:-1:-1;;;;;3488:15:1;;;3468:18;;;3461:43;3540:15;;;;3520:18;;;3513:43;3572:18;;;3565:34;3615:19;;;3608:35;3659:19;;;3652:35;;;3361:19;;40002:79:0;;;;;;;;;;;;39992:90;;;;;;39971:111;;40095:12;40110:28;40127:10;40110:16;:28::i;:::-;40095:43;;40151:14;40168:28;40182:4;40188:1;40191;40194;40168:13;:28::i;:::-;40151:45;;40225:5;-1:-1:-1;;;;;40215:15:0;:6;-1:-1:-1;;;;;40215:15:0;;40207:58;;;;-1:-1:-1;;;40207:58:0;;11605:2:1;40207:58:0;;;11587:21:1;11644:2;11624:18;;;11617:30;11683:32;11663:18;;;11656:60;11733:18;;40207:58:0;11577:180:1;40207:58:0;40278:31;40287:5;40294:7;40303:5;40278:8;:31::i;:::-;39878:439;;;39672:645;;;;;;;:::o;43215:201::-;42247:6;;-1:-1:-1;;;;;42247:6:0;4437:10;42394:23;42386:68;;;;-1:-1:-1;;;42386:68:0;;12373:2:1;42386:68:0;;;12355:21:1;;;12392:18;;;12385:30;12451:34;12431:18;;;12424:62;12503:18;;42386:68:0;12345:182:1;42386:68:0;-1:-1:-1;;;;;43304:22:0;::::1;43296:73;;;::::0;-1:-1:-1;;;43296:73:0;;7679:2:1;43296:73:0::1;::::0;::::1;7661:21:1::0;7718:2;7698:18;;;7691:30;7757:34;7737:18;;;7730:62;-1:-1:-1;;;7808:18:1;;;7801:36;7854:19;;43296:73:0::1;7651:228:1::0;43296:73:0::1;43380:28;43399:8;43380:18;:28::i;14827:380::-:0;-1:-1:-1;;;;;14963:19:0;;14955:68;;;;-1:-1:-1;;;14955:68:0;;13947:2:1;14955:68:0;;;13929:21:1;13986:2;13966:18;;;13959:30;14025:34;14005:18;;;13998:62;-1:-1:-1;;;14076:18:1;;;14069:34;14120:19;;14955:68:0;13919:226:1;14955:68:0;-1:-1:-1;;;;;15042:21:0;;15034:68;;;;-1:-1:-1;;;15034:68:0;;8086:2:1;15034:68:0;;;8068:21:1;8125:2;8105:18;;;8098:30;8164:34;8144:18;;;8137:62;-1:-1:-1;;;8215:18:1;;;8208:32;8257:19;;15034:68:0;8058:224:1;15034:68:0;-1:-1:-1;;;;;15115:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;15167:32;;3066:25:1;;;15167:32:0;;3039:18:1;15167:32:0;;;;;;;14827:380;;;:::o;12046:733::-;-1:-1:-1;;;;;12186:20:0;;12178:70;;;;-1:-1:-1;;;12178:70:0;;13541:2:1;12178:70:0;;;13523:21:1;13580:2;13560:18;;;13553:30;13619:34;13599:18;;;13592:62;-1:-1:-1;;;13670:18:1;;;13663:35;13715:19;;12178:70:0;13513:227:1;12178:70:0;-1:-1:-1;;;;;12267:23:0;;12259:71;;;;-1:-1:-1;;;12259:71:0;;5752:2:1;12259:71:0;;;5734:21:1;5791:2;5771:18;;;5764:30;5830:34;5810:18;;;5803:62;-1:-1:-1;;;5881:18:1;;;5874:33;5924:19;;12259:71:0;5724:225:1;12259:71:0;-1:-1:-1;;;;;12427:17:0;;12403:21;12427:17;;;;;;;;;;;12463:23;;;;12455:74;;;;-1:-1:-1;;;12455:74:0;;9268:2:1;12455:74:0;;;9250:21:1;9307:2;9287:18;;;9280:30;9346:34;9326:18;;;9319:62;-1:-1:-1;;;9397:18:1;;;9390:36;9443:19;;12455:74:0;9240:228:1;12455:74:0;-1:-1:-1;;;;;12565:17:0;;;:9;:17;;;;;;;;;;;12585:22;;;12565:42;;12629:20;;;;;;;;:30;;12601:6;;12565:9;12629:30;;12601:6;;12629:30;:::i;:::-;;;;;;;;12694:9;-1:-1:-1;;;;;12677:35:0;12686:6;-1:-1:-1;;;;;12677:35:0;;12705:6;12677:35;;;;3066:25:1;;3054:2;3039:18;;3021:76;12677:35:0;;;;;;;;12167:612;12046:733;;;:::o;35335:314::-;35388:7;35420:4;-1:-1:-1;;;;;35429:12:0;35412:29;;:66;;;;;35462:16;35445:13;:33;35412:66;35408:234;;;-1:-1:-1;35502:24:0;;35335:314::o;35408:234::-;-1:-1:-1;35838:73:0;;;35588:10;35838:73;;;;3957:25:1;;;;35600:12:0;3998:18:1;;;3991:34;35614:15:0;4041:18:1;;;4034:34;35882:13:0;4084:18:1;;;4077:34;35905:4:0;4127:19:1;;;;4120:61;;;;35838:73:0;;;;;;;;;;3929:19:1;;;;35838:73:0;;;35828:84;;;;;;40641:115::o;45969:120::-;44981:7;;-1:-1:-1;;;44981:7:0;;;;45505:41;;;;-1:-1:-1;;;45505:41:0;;6156:2:1;45505:41:0;;;6138:21:1;6195:2;6175:18;;;6168:30;-1:-1:-1;;;6214:18:1;;;6207:50;6274:18;;45505:41:0;6128:170:1;45505:41:0;46028:7:::1;:15:::0;;-1:-1:-1;;;;46028:15:0::1;::::0;;46059:22:::1;4437:10:::0;46068:12:::1;46059:22;::::0;-1:-1:-1;;;;;2684:32:1;;;2666:51;;2654:2;2639:18;46059:22:0::1;;;;;;;45969:120::o:0;13066:399::-;-1:-1:-1;;;;;13150:21:0;;13142:65;;;;-1:-1:-1;;;13142:65:0;;14758:2:1;13142:65:0;;;14740:21:1;14797:2;14777:18;;;14770:30;14836:33;14816:18;;;14809:61;14887:18;;13142:65:0;14730:181:1;13142:65:0;13298:6;13282:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;13315:18:0;;:9;:18;;;;;;;;;;:28;;13337:6;;13315:9;:28;;13337:6;;13315:28;:::i;:::-;;;;-1:-1:-1;;13359:37:0;;3066:25:1;;;-1:-1:-1;;;;;13359:37:0;;;13376:1;;13359:37;;3054:2:1;3039:18;13359:37:0;;;;;;;13066:399;;:::o;13798:591::-;-1:-1:-1;;;;;13882:21:0;;13874:67;;;;-1:-1:-1;;;13874:67:0;;13139:2:1;13874:67:0;;;13121:21:1;13178:2;13158:18;;;13151:30;13217:34;13197:18;;;13190:62;-1:-1:-1;;;13268:18:1;;;13261:31;13309:19;;13874:67:0;13111:223:1;13874:67:0;-1:-1:-1;;;;;14041:18:0;;14016:22;14041:18;;;;;;;;;;;14078:24;;;;14070:71;;;;-1:-1:-1;;;14070:71:0;;6505:2:1;14070:71:0;;;6487:21:1;6544:2;6524:18;;;6517:30;6583:34;6563:18;;;6556:62;-1:-1:-1;;;6634:18:1;;;6627:32;6676:19;;14070:71:0;6477:224:1;14070:71:0;-1:-1:-1;;;;;14177:18:0;;:9;:18;;;;;;;;;;14198:23;;;14177:44;;14243:12;:22;;14215:6;;14177:9;14243:22;;14215:6;;14243:22;:::i;:::-;;;;-1:-1:-1;;14283:37:0;;3066:25:1;;;14309:1:0;;-1:-1:-1;;;;;14283:37:0;;;;;3054:2:1;3039:18;14283:37:0;;;;;;;46956:393:::1;46881:468:::0;;:::o;45710:118::-;44981:7;;-1:-1:-1;;;44981:7:0;;;;45235:9;45227:38;;;;-1:-1:-1;;;45227:38:0;;10857:2:1;45227:38:0;;;10839:21:1;10896:2;10876:18;;;10869:30;-1:-1:-1;;;10915:18:1;;;10908:46;10971:18;;45227:38:0;10829:166:1;45227:38:0;45770:7:::1;:14:::0;;-1:-1:-1;;;;45770:14:0::1;-1:-1:-1::0;;;45770:14:0::1;::::0;;45800:20:::1;45807:12;4437:10:::0;;4357:98;40894:207;-1:-1:-1;;;;;41015:14:0;;40954:15;41015:14;;;:7;:14;;;;;37708;;37845:1;37827:19;;;;37708:14;41076:17;40971:130;40894:207;;;:::o;36562:167::-;36639:7;36666:55;36688:20;:18;:20::i;:::-;36710:10;32026:57;;-1:-1:-1;;;32026:57:0;;;2381:27:1;2424:11;;;2417:27;;;2460:12;;;2453:28;;;31989:7:0;;2497:12:1;;32026:57:0;;;;;;;;;;;;32016:68;;;;;;32009:75;;31896:196;;;;;30205:279;30333:7;30354:17;30373:18;30395:25;30406:4;30412:1;30415;30418;30395:10;:25::i;:::-;30353:67;;;;30431:18;30443:5;30431:11;:18::i;:::-;-1:-1:-1;30467:9:0;30205:279;-1:-1:-1;;;;;30205:279:0:o;43576:191::-;43669:6;;;-1:-1:-1;;;;;43686:17:0;;;-1:-1:-1;;;;;;43686:17:0;;;;;;;43719:40;;43669:6;;;43686:17;43669:6;;43719:40;;43650:16;;43719:40;43639:128;43576:191;:::o;28434:1632::-;28565:7;;29499:66;29486:79;;29482:163;;;-1:-1:-1;29598:1:0;;-1:-1:-1;29602:30:0;29582:51;;29482:163;29659:1;:7;;29664:2;29659:7;;:18;;;;;29670:1;:7;;29675:2;29670:7;;29659:18;29655:102;;;-1:-1:-1;29710:1:0;;-1:-1:-1;29714:30:0;29694:51;;29655:102;29871:24;;;29854:14;29871:24;;;;;;;;;4419:25:1;;;4492:4;4480:17;;4460:18;;;4453:45;;;;4514:18;;;4507:34;;;4557:18;;;4550:34;;;29871:24:0;;4391:19:1;;29871:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29871:24:0;;-1:-1:-1;;29871:24:0;;;-1:-1:-1;;;;;;;29910:20:0;;29906:103;;29963:1;29967:29;29947:50;;;;;;;29906:103;30029:6;-1:-1:-1;30037:20:0;;-1:-1:-1;28434:1632:0;;;;;;;;:::o;23096:643::-;23174:20;23165:5;:29;;;;;;;;:::i;:::-;;23161:571;;;23096:643;:::o;23161:571::-;23272:29;23263:5;:38;;;;;;;;:::i;:::-;;23259:473;;;23318:34;;-1:-1:-1;;;23318:34:0;;5399:2:1;23318:34:0;;;5381:21:1;5438:2;5418:18;;;5411:30;5477:26;5457:18;;;5450:54;5521:18;;23318:34:0;5371:174:1;23259:473:0;23383:35;23374:5;:44;;;;;;;;:::i;:::-;;23370:362;;;23435:41;;-1:-1:-1;;;23435:41:0;;6908:2:1;23435:41:0;;;6890:21:1;6947:2;6927:18;;;6920:30;6986:33;6966:18;;;6959:61;7037:18;;23435:41:0;6880:181:1;23370:362:0;23507:30;23498:5;:39;;;;;;;;:::i;:::-;;23494:238;;;23554:44;;-1:-1:-1;;;23554:44:0;;9675:2:1;23554:44:0;;;9657:21:1;9714:2;9694:18;;;9687:30;9753:34;9733:18;;;9726:62;-1:-1:-1;;;9804:18:1;;;9797:32;9846:19;;23554:44:0;9647:224:1;23494:238:0;23629:30;23620:5;:39;;;;;;;;:::i;:::-;;23616:116;;;23676:44;;-1:-1:-1;;;23676:44:0;;11202:2:1;23676:44:0;;;11184:21:1;11241:2;11221:18;;;11214:30;11280:34;11260:18;;;11253:62;-1:-1:-1;;;11331:18:1;;;11324:32;11373:19;;23676:44:0;11174:224:1;14:173;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;111:2;63:124;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:2;;;320:1;317;310:12;272:2;343:29;362:9;343:29;:::i;:::-;333:39;262:116;-1:-1:-1;;;262:116:1:o;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:2;;;528:1;525;518:12;480:2;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;470:173;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:2;;;810:1;807;800:12;762:2;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;752:224;;;;;:::o;981:693::-;1092:6;1100;1108;1116;1124;1132;1140;1193:3;1181:9;1172:7;1168:23;1164:33;1161:2;;;1210:1;1207;1200:12;1161:2;1233:29;1252:9;1233:29;:::i;:::-;1223:39;;1281:38;1315:2;1304:9;1300:18;1281:38;:::i;:::-;1271:48;;1366:2;1355:9;1351:18;1338:32;1328:42;;1417:2;1406:9;1402:18;1389:32;1379:42;;1471:3;1460:9;1456:19;1443:33;1516:4;1509:5;1505:16;1498:5;1495:27;1485:2;;1536:1;1533;1526:12;1485:2;1151:523;;;;-1:-1:-1;1151:523:1;;;;1559:5;1611:3;1596:19;;1583:33;;-1:-1:-1;1663:3:1;1648:19;;;1635:33;;1151:523;-1:-1:-1;;1151:523:1:o;1679:254::-;1747:6;1755;1808:2;1796:9;1787:7;1783:23;1779:32;1776:2;;;1824:1;1821;1814:12;1776:2;1847:29;1866:9;1847:29;:::i;:::-;1837:39;1923:2;1908:18;;;;1895:32;;-1:-1:-1;;;1766:167:1:o;1938:180::-;1997:6;2050:2;2038:9;2029:7;2025:23;2021:32;2018:2;;;2066:1;2063;2056:12;2018:2;-1:-1:-1;2089:23:1;;2008:110;-1:-1:-1;2008:110:1:o;4595:597::-;4707:4;4736:2;4765;4754:9;4747:21;4797:6;4791:13;4840:6;4835:2;4824:9;4820:18;4813:34;4865:1;4875:140;4889:6;4886:1;4883:13;4875:140;;;4984:14;;;4980:23;;4974:30;4950:17;;;4969:2;4946:26;4939:66;4904:10;;4875:140;;;5033:6;5030:1;5027:13;5024:2;;;5103:1;5098:2;5089:6;5078:9;5074:22;5070:31;5063:42;5024:2;-1:-1:-1;5176:2:1;5155:15;-1:-1:-1;;5151:29:1;5136:45;;;;5183:2;5132:54;;4716:476;-1:-1:-1;;;4716:476:1:o;10297:353::-;10499:2;10481:21;;;10538:2;10518:18;;;10511:30;10577:31;10572:2;10557:18;;10550:59;10641:2;10626:18;;10471:179::o;14916:411::-;15118:2;15100:21;;;15157:2;15137:18;;;15130:30;15196:34;15191:2;15176:18;;15169:62;-1:-1:-1;;;15262:2:1;15247:18;;15240:45;15317:3;15302:19;;15090:237::o;15703:128::-;15743:3;15774:1;15770:6;15767:1;15764:13;15761:2;;;15780:18;;:::i;:::-;-1:-1:-1;15816:9:1;;15751:80::o;15836:168::-;15876:7;15942:1;15938;15934:6;15930:14;15927:1;15924:21;15919:1;15912:9;15905:17;15901:45;15898:2;;;15949:18;;:::i;:::-;-1:-1:-1;15989:9:1;;15888:116::o;16009:125::-;16049:4;16077:1;16074;16071:8;16068:2;;;16082:18;;:::i;:::-;-1:-1:-1;16119:9:1;;16058:76::o;16139:380::-;16218:1;16214:12;;;;16261;;;16282:2;;16336:4;16328:6;16324:17;16314:27;;16282:2;16389;16381:6;16378:14;16358:18;16355:38;16352:2;;;16435:10;16430:3;16426:20;16423:1;16416:31;16470:4;16467:1;16460:15;16498:4;16495:1;16488:15;16524:127;16585:10;16580:3;16576:20;16573:1;16566:31;16616:4;16613:1;16606:15;16640:4;16637:1;16630:15;16656:127;16717:10;16712:3;16708:20;16705:1;16698:31;16748:4;16745:1;16738:15;16772:4;16769:1;16762:15
Swarm Source
ipfs://2586dc65b83d8626d4c17713d7aba69739a5e5549cf049c45e2eaa48de03dceb