Cryo Explorer Ethereum Mainnet

Address Contract Partially Verified

Address 0x3c87AAff27f1085B67cd742302939a50E2F2d406
Balance 0 ETH
Nonce 1
Code Size 9324 bytes
Indexed Transactions 0
External Etherscan · Sourcify

Contract Bytecode

9324 bytes
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80638da5cb5b116100c3578063b9a45aac1161007c578063b9a45aac146103b8578063bf16257a146103d4578063dd62ed3e146103f2578063f01f20df14610422578063f2fde38b14610440578063fb5f2bf01461045c5761014d565b80638da5cb5b146102e057806395d89b41146102fe578063a457c2d71461031c578063a9059cbb1461034c578063b61d43b11461037c578063b753bfe91461039a5761014d565b8063313ce56711610115578063313ce5671461020c578063395093511461022a5780633af32abf1461025a57806342966c681461028a57806370a08231146102a6578063715018a6146102d65761014d565b806306fdde0314610152578063095ea7b3146101705780630c900e90146101a057806318160ddd146101be57806323b872dd146101dc575b600080fd5b61015a610478565b604051610167919061160e565b60405180910390f35b61018a600480360381019061018591906116c9565b61050a565b6040516101979190611724565b60405180910390f35b6101a8610528565b6040516101b5919061174e565b60405180910390f35b6101c6610548565b6040516101d3919061174e565b60405180910390f35b6101f660048036038101906101f19190611769565b610552565b6040516102039190611724565b60405180910390f35b610214610734565b60405161022191906117d8565b60405180910390f35b610244600480360381019061023f91906116c9565b61073d565b6040516102519190611724565b60405180910390f35b610274600480360381019061026f91906117f3565b6107e9565b6040516102819190611724565b60405180910390f35b6102a4600480360381019061029f9190611820565b610809565b005b6102c060048036038101906102bb91906117f3565b61081d565b6040516102cd919061174e565b60405180910390f35b6102de610866565b005b6102e861087a565b6040516102f5919061185c565b60405180910390f35b6103066108a3565b604051610313919061160e565b60405180910390f35b610336600480360381019061033191906116c9565b610935565b6040516103439190611724565b60405180910390f35b610366600480360381019061036191906116c9565b610a20565b6040516103739190611724565b60405180910390f35b610384610b36565b604051610391919061174e565b60405180910390f35b6103a2610b56565b6040516103af919061174e565b60405180910390f35b6103d260048036038101906103cd91906118a3565b610b76565b005b6103dc610bd9565b6040516103e9919061174e565b60405180910390f35b61040c600480360381019061040791906118e3565b610bf9565b604051610419919061174e565b60405180910390f35b61042a610c80565b604051610437919061174e565b60405180910390f35b61045a600480360381019061045591906117f3565b610c86565b005b61047660048036038101906104719190611820565b610d0a565b005b60606004805461048790611952565b80601f01602080910402602001604051908101604052809291908181526020018280546104b390611952565b80156105005780601f106104d557610100808354040283529160200191610500565b820191906000526020600020905b8154815290600101906020018083116104e357829003601f168201915b5050505050905090565b600061051e610517610dee565b8484610df6565b6001905092915050565b6012600a6105369190611ae6565b63321162006105459190611b31565b81565b6000600354905090565b600080600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806105f65750600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b6106195760646006548461060a9190611b31565b6106149190611bba565b61061c565b60005b90506000811115610632576106318582610fc1565b5b610648858583866106439190611beb565b611182565b6000600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000610693610dee565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905083811015610713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070a90611c91565b60405180910390fd5b6107278661071f610dee565b868403610df6565b6001925050509392505050565b60006012905090565b60006107df61074a610dee565b848460026000610758610dee565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546107da9190611cb1565b610df6565b6001905092915050565b60076020528060005260406000206000915054906101000a900460ff1681565b61081a610814610dee565b82610fc1565b50565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61086e611433565b61087860006114b1565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600580546108b290611952565b80601f01602080910402602001604051908101604052809291908181526020018280546108de90611952565b801561092b5780601f106109005761010080835404028352916020019161092b565b820191906000526020600020905b81548152906001019060200180831161090e57829003601f168201915b5050505050905090565b60008060026000610944610dee565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610a01576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f890611d79565b60405180910390fd5b610a15610a0c610dee565b85858403610df6565b600191505092915050565b60008060076000610a2f610dee565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680610acb5750600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610aee57606460065484610adf9190611b31565b610ae99190611bba565b610af1565b60005b90506000811115610b0e57610b0d610b07610dee565b82610fc1565b5b610b2b610b19610dee565b858386610b269190611beb565b611182565b600191505092915050565b6012600a610b449190611ae6565b631f4add40610b539190611b31565b81565b6012600a610b649190611ae6565b630c845880610b739190611b31565b81565b610b7e611433565b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6012600a610be79190611ae6565b631f4add40610bf69190611b31565b81565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60065481565b610c8e611433565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590611e0b565b60405180910390fd5b610d07816114b1565b50565b610d12611433565b60008110158015610d24575060058111155b610d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5a90611e77565b60405180910390fd5b6006548110610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90611f09565b60405180910390fd5b7fafd4c5968eb4c4f41c197f7b04631da32443712b604999d828a71e36a26731fc6006548242604051610ddc93929190611f29565b60405180910390a18060068190555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5d90611fd2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd90612064565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610fb4919061174e565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611031576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611028906120f6565b60405180910390fd5b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156110b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110af90612188565b60405180910390fd5b818103600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600360008282546111109190611beb565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611175919061174e565b60405180910390a3505050565b600081116111c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bc906121f4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611235576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122c90612286565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129c90612318565b60405180910390fd5b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561132c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611323906123aa565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546113c19190611cb1565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611425919061174e565b60405180910390a350505050565b61143b610dee565b73ffffffffffffffffffffffffffffffffffffffff1661145961087a565b73ffffffffffffffffffffffffffffffffffffffff16146114af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a690612416565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b600082825260208201905092915050565b60005b838110156115af578082015181840152602081019050611594565b838111156115be576000848401525b50505050565b6000601f19601f8301169050919050565b60006115e082611575565b6115ea8185611580565b93506115fa818560208601611591565b611603816115c4565b840191505092915050565b6000602082019050818103600083015261162881846115d5565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061166082611635565b9050919050565b61167081611655565b811461167b57600080fd5b50565b60008135905061168d81611667565b92915050565b6000819050919050565b6116a681611693565b81146116b157600080fd5b50565b6000813590506116c38161169d565b92915050565b600080604083850312156116e0576116df611630565b5b60006116ee8582860161167e565b92505060206116ff858286016116b4565b9150509250929050565b60008115159050919050565b61171e81611709565b82525050565b60006020820190506117396000830184611715565b92915050565b61174881611693565b82525050565b6000602082019050611763600083018461173f565b92915050565b60008060006060848603121561178257611781611630565b5b60006117908682870161167e565b93505060206117a18682870161167e565b92505060406117b2868287016116b4565b9150509250925092565b600060ff82169050919050565b6117d2816117bc565b82525050565b60006020820190506117ed60008301846117c9565b92915050565b60006020828403121561180957611808611630565b5b60006118178482850161167e565b91505092915050565b60006020828403121561183657611835611630565b5b6000611844848285016116b4565b91505092915050565b61185681611655565b82525050565b6000602082019050611871600083018461184d565b92915050565b61188081611709565b811461188b57600080fd5b50565b60008135905061189d81611877565b92915050565b600080604083850312156118ba576118b9611630565b5b60006118c88582860161167e565b92505060206118d98582860161188e565b9150509250929050565b600080604083850312156118fa576118f9611630565b5b60006119088582860161167e565b92505060206119198582860161167e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061196a57607f821691505b6020821081141561197e5761197d611923565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b6001851115611a0a578086048111156119e6576119e5611984565b5b60018516156119f55780820291505b8081029050611a03856119b3565b94506119ca565b94509492505050565b600082611a235760019050611adf565b81611a315760009050611adf565b8160018114611a475760028114611a5157611a80565b6001915050611adf565b60ff841115611a6357611a62611984565b5b8360020a915084821115611a7a57611a79611984565b5b50611adf565b5060208310610133831016604e8410600b8410161715611ab55782820a905083811115611ab057611aaf611984565b5b611adf565b611ac284848460016119c0565b92509050818404811115611ad957611ad8611984565b5b81810290505b9392505050565b6000611af182611693565b9150611afc836117bc565b9250611b297fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484611a13565b905092915050565b6000611b3c82611693565b9150611b4783611693565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615611b8057611b7f611984565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611bc582611693565b9150611bd083611693565b925082611be057611bdf611b8b565b5b828204905092915050565b6000611bf682611693565b9150611c0183611693565b925082821015611c1457611c13611984565b5b828203905092915050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b6000611c7b602883611580565b9150611c8682611c1f565b604082019050919050565b60006020820190508181036000830152611caa81611c6e565b9050919050565b6000611cbc82611693565b9150611cc783611693565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611cfc57611cfb611984565b5b828201905092915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000611d63602583611580565b9150611d6e82611d07565b604082019050919050565b60006020820190508181036000830152611d9281611d56565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000611df5602683611580565b9150611e0082611d99565b604082019050919050565b60006020820190508181036000830152611e2481611de8565b9050919050565b7f756e7265636f676e69736564206275726e2070657263656e7461676500000000600082015250565b6000611e61601c83611580565b9150611e6c82611e2b565b602082019050919050565b60006020820190508181036000830152611e9081611e54565b9050919050565b7f4e6577206275726e2070657263656e74616765206d757374206265206c65737360008201527f207468616e2063757272656e742076616c756500000000000000000000000000602082015250565b6000611ef3603383611580565b9150611efe82611e97565b604082019050919050565b60006020820190508181036000830152611f2281611ee6565b9050919050565b6000606082019050611f3e600083018661173f565b611f4b602083018561173f565b611f58604083018461173f565b949350505050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000611fbc602483611580565b9150611fc782611f60565b604082019050919050565b60006020820190508181036000830152611feb81611faf565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b600061204e602283611580565b915061205982611ff2565b604082019050919050565b6000602082019050818103600083015261207d81612041565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006120e0602183611580565b91506120eb82612084565b604082019050919050565b6000602082019050818103600083015261210f816120d3565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000612172602283611580565b915061217d82612116565b604082019050919050565b600060208201905081810360008301526121a181612165565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74207a65726f0000000000600082015250565b60006121de601b83611580565b91506121e9826121a8565b602082019050919050565b6000602082019050818103600083015261220d816121d1565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000612270602583611580565b915061227b82612214565b604082019050919050565b6000602082019050818103600083015261229f81612263565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000612302602383611580565b915061230d826122a6565b604082019050919050565b60006020820190508181036000830152612331816122f5565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000612394602683611580565b915061239f82612338565b604082019050919050565b600060208201905081810360008301526123c381612387565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612400602083611580565b915061240b826123ca565b602082019050919050565b6000602082019050818103600083015261242f816123f3565b905091905056fea2646970667358221220e65910a1024571972ce3261c92121748f3cab1799d400a68448aa41f8608950d64736f6c63430008090033

Verified Source Code Partial Match

Compiler: v0.8.9+commit.e5eed63a EVM: london Optimization: No
BitcoinETFToken.sol 447 lines
// SPDX-License-Identifier: MIT

pragma solidity 0.8.9;

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

  /**
   * @dev Emitted when the allowance of a `spender` for an `owner` is set by
   * a call to {approve}. `value` is the new allowance.
   */
  event Approval(address indexed owner, address indexed spender, uint256 value);

  /**
   * @dev Returns the amount of tokens in existence.
   */
  function totalSupply() external view returns (uint256);

  /**
   * @dev Returns the amount of tokens owned by `account`.
   */
  function balanceOf(address account) external view returns (uint256);

  /**
   * @dev Moves `amount` tokens from the caller's account to `to`.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transfer(address to, uint256 amount) external returns (bool);

  /**
   * @dev Returns the remaining number of tokens that `spender` will be
   * allowed to spend on behalf of `owner` through {transferFrom}. This is
   * zero by default.
   *
   * This value changes when {approve} or {transferFrom} are called.
   */
  function allowance(address owner, address spender) external view returns (uint256);

  /**
   * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * IMPORTANT: Beware that changing an allowance with this method brings the risk
   * that someone may use both the old and the new allowance by unfortunate
   * transaction ordering. One possible solution to mitigate this race
   * condition is to first reduce the spender's allowance to 0 and set the
   * desired value afterwards:
   * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
   *
   * Emits an {Approval} event.
   */
  function approve(address spender, uint256 amount) external returns (bool);

  /**
   * @dev Moves `amount` tokens from `from` to `to` using the
   * allowance mechanism. `amount` is then deducted from the caller's
   * allowance.
   *
   * Returns a boolean value indicating whether the operation succeeded.
   *
   * Emits a {Transfer} event.
   */
  function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

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

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

/**
 * @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 Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    _checkOwner();
    _;
  }

  /**
   * @dev Returns the address of the current owner.
   */
  function owner() public view virtual returns (address) {
    return _owner;
  }

  /**
   * @dev Throws if the sender is not the owner.
   */
  function _checkOwner() internal view virtual {
    require(owner() == _msgSender(), 'Ownable: caller is not the owner');
  }

  /**
   * @dev Leaves the contract without owner. It will not be possible to call
   * `onlyOwner` functions. Can only be called by the current owner.
   *
   * NOTE: Renouncing ownership will leave the contract without an owner,
   * thereby disabling any functionality that is only available to the owner.
   */
  function renounceOwnership() public virtual onlyOwner {
    _transferOwnership(address(0));
  }

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`).
   * Can only be called by the current owner.
   */
  function transferOwnership(address newOwner) public virtual onlyOwner {
    require(newOwner != address(0), 'Ownable: new owner is the zero address');
    _transferOwnership(newOwner);
  }

  /**
   * @dev Transfers ownership of the contract to a new account (`newOwner`).
   * Internal function without access restriction.
   */
  function _transferOwnership(address newOwner) internal virtual {
    address oldOwner = _owner;
    _owner = newOwner;
    emit OwnershipTransferred(oldOwner, newOwner);
  }
}

contract BitcoinETFToken is Context, IERC20Metadata, Ownable {
  mapping(address => uint256) private _balances;

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

  uint256 private _totalSupply;

  string private _name;
  string private _symbol;
  uint8 private constant _decimals = 18;
  uint256 public burnPercentage = 5;
  uint256 public constant presaleReserve = 840_000_000 * (10 ** _decimals);
  uint256 public constant stakingReserve = 525_000_000 * (10 ** _decimals);
  uint256 public constant burnReserve = 525_000_000 * (10 ** _decimals);
  uint256 public constant liquidityReserve = 210_000_000 * (10 ** _decimals);

  mapping(address => bool) public isWhitelisted;
  event BurnPercentageChanged(uint256 oldBurnPercentage, uint256 newBurnPercentage, uint256 timestamp);

  /**
   * @dev Contract constructor.
   * @param name_ The name of the token.
   * @param symbol_ The symbol of the token.
   */
  constructor(string memory name_, string memory symbol_) {
    _name = name_;
    _symbol = symbol_;
    _mint(0xDd1F2861E95295eA691fdA2cc558833E1C6eecB2, presaleReserve);
    _mint(0x8AaB0A7f226957bd1b5573cDc6819Ee39f671C40, stakingReserve);
    _mint(0x204b34F04874e749F176433F621e6a7d018773B9, burnReserve);
    _mint(0xe8B5F9E179e36B85003DE7fFA52a4FF9aB96b339, liquidityReserve);
  }

  /**
   * @dev Decreases the burn percentage of tokens during transfers.Can only be called by the contract owner.
   * Emits a `BurnPercentageChanged` event if the burn percentage is decreased successfully.
   * @param _burnPercentage The burn percentage to be set, must be between 0 and 5 inclusive and less than the current burn percentage.
   */
  function decreaseBurnPercentage(uint256 _burnPercentage) external onlyOwner {
    require(_burnPercentage >= 0 && _burnPercentage <= 5, 'unrecognised burn percentage');
    require(_burnPercentage < burnPercentage, 'New burn percentage must be less than current value');
    emit BurnPercentageChanged(burnPercentage, _burnPercentage, block.timestamp);
    burnPercentage = _burnPercentage;
  }

  /**
   * @dev change whitelist status of a particular address
   * @param _address address of the user to change status
   * @param _status bool value for the status
   */
  function whitelistAddress(address _address, bool _status) external onlyOwner {
    isWhitelisted[_address] = _status;
  }

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

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

  /**
   * @dev Returns the number of decimals used for token display.
   * @return The number of decimals.
   */
  function decimals() public view virtual override returns (uint8) {
    return _decimals;
  }

  /**
   * @dev Returns the total supply of the token.
   * @return The total supply.
   */
  function totalSupply() public view virtual override returns (uint256) {
    return _totalSupply;
  }

  /**
   * @dev Returns the balance of the specified account.
   * @param account The address to check the balance for.
   * @return The balance of the account.
   */
  function balanceOf(address account) public view virtual override returns (uint256) {
    return _balances[account];
  }

  /**
   * @dev Transfers tokens from the caller to a specified recipient.
   * @param recipient The address to transfer tokens to.
   * @param amount The amount of tokens to transfer.
   * @return A boolean value indicating whether the transfer was successful.
   */
  function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
    uint256 burnTax = isWhitelisted[_msgSender()] || isWhitelisted[recipient] ? 0 : ((amount * burnPercentage) / 100);
    if (burnTax > 0) _burn(_msgSender(), burnTax);
    _transfer(_msgSender(), recipient, amount - burnTax);
    return true;
  }

  /**
   * @dev Returns the amount of tokens that the spender is allowed to spend on behalf of the owner.
   * @param from The address that approves the spending.
   * @param to The address that is allowed to spend.
   * @return The remaining allowance for the spender.
   */
  function allowance(address from, address to) public view virtual override returns (uint256) {
    return _allowances[from][to];
  }

  /**
   * @dev Approves the specified address to spend the specified amount of tokens on behalf of the caller.
   * @param to The address to approve the spending for.
   * @param amount The amount of tokens to approve.
   * @return A boolean value indicating whether the approval was successful.
   */
  function approve(address to, uint256 amount) public virtual override returns (bool) {
    _approve(_msgSender(), to, amount);
    return true;
  }

  /**
   * @dev Transfers tokens from one address to another.
   * @param sender The address to transfer tokens from.
   * @param recipient The address to transfer tokens to.
   * @param amount The amount of tokens to transfer.
   * @return A boolean value indicating whether the transfer was successful.
   */
  function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
    uint256 burnTax = isWhitelisted[sender] || isWhitelisted[recipient] ? 0 : ((amount * burnPercentage) / 100);
    if (burnTax > 0) _burn(sender, burnTax);
    _transfer(sender, recipient, amount - burnTax);
    uint256 currentAllowance = _allowances[sender][_msgSender()];
    require(currentAllowance >= amount, 'ERC20: transfer amount exceeds allowance');
    unchecked {
      _approve(sender, _msgSender(), currentAllowance - amount);
    }

    return true;
  }

  /**
   * @dev Increases the allowance of the specified address to spend tokens on behalf of the caller.
   * @param to The address to increase the allowance for.
   * @param addedValue The amount of tokens to increase the allowance by.
   * @return A boolean value indicating whether the increase was successful.
   */
  function increaseAllowance(address to, uint256 addedValue) public virtual returns (bool) {
    _approve(_msgSender(), to, _allowances[_msgSender()][to] + addedValue);
    return true;
  }

  /**
   * @dev Decreases the allowance granted by the owner of the tokens to `to` account.
   * @param to The account allowed to spend the tokens.
   * @param subtractedValue The amount of tokens to decrease the allowance by.
   * @return A boolean value indicating whether the operation succeeded.
   */
  function decreaseAllowance(address to, uint256 subtractedValue) public virtual returns (bool) {
    uint256 currentAllowance = _allowances[_msgSender()][to];
    require(currentAllowance >= subtractedValue, 'ERC20: decreased allowance below zero');
    unchecked {
      _approve(_msgSender(), to, currentAllowance - subtractedValue);
    }

    return true;
  }

  /**
   * @dev Transfers `amount` tokens from `sender` to `recipient`.
   * @param sender The account to transfer tokens from.
   * @param recipient The account to transfer tokens to.
   * @param amount The amount of tokens to transfer.
   */
  function _transfer(address sender, address recipient, uint256 amount) internal virtual {
    require(amount > 0, 'ERC20: transfer amount zero');
    require(sender != address(0), 'ERC20: transfer from the zero address');
    require(recipient != address(0), 'ERC20: transfer to the zero address');

    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);
  }

  /**
   * @dev Creates `amount` tokens and assigns them to `account`.
   * @param account The account to assign the newly created tokens to.
   * @param amount The amount of tokens to create.
   */
  function _mint(address account, uint256 amount) internal virtual {
    require(account != address(0), 'ERC20: mint to the zero address');

    _totalSupply += amount;
    _balances[account] += amount;
    emit Transfer(address(0), account, amount);
  }

  /**
   * @dev Destroys `amount` tokens from `account`, reducing the total supply.
   * @param account The account to burn tokens from.
   * @param amount The amount of tokens to burn.
   */
  function _burn(address account, uint256 amount) internal virtual {
    require(account != address(0), 'ERC20: burn from the zero address');

    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);
  }

  /**
   * @dev Destroys `amount` tokens from the caller's account, reducing the total supply.
   * @param amount The amount of tokens to burn.
   */
  function burn(uint256 amount) external {
    _burn(_msgSender(), amount);
  }

  /**
   * @dev Sets `amount` as the allowance of `to` over the caller's tokens.
   * @param from The account granting the allowance.
   * @param to The account allowed to spend the tokens.
   * @param amount The amount of tokens to allow.
   */
  function _approve(address from, address to, uint256 amount) internal virtual {
    require(from != address(0), 'ERC20: approve from the zero address');
    require(to != address(0), 'ERC20: approve to the zero address');

    _allowances[from][to] = amount;
    emit Approval(from, to, amount);
  }
}

Read Contract

allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
burnPercentage 0xf01f20df → uint256
burnReserve 0xbf16257a → uint256
decimals 0x313ce567 → uint8
isWhitelisted 0x3af32abf → bool
liquidityReserve 0xb753bfe9 → uint256
name 0x06fdde03 → string
owner 0x8da5cb5b → address
presaleReserve 0x0c900e90 → uint256
stakingReserve 0xb61d43b1 → uint256
symbol 0x95d89b41 → string
totalSupply 0x18160ddd → uint256

Write Contract 10 functions

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

approve 0x095ea7b3
address to
uint256 amount
returns: bool
burn 0x42966c68
uint256 amount
decreaseAllowance 0xa457c2d7
address to
uint256 subtractedValue
returns: bool
decreaseBurnPercentage 0xfb5f2bf0
uint256 _burnPercentage
increaseAllowance 0x39509351
address to
uint256 addedValue
returns: bool
renounceOwnership 0x715018a6
No parameters
transfer 0xa9059cbb
address recipient
uint256 amount
returns: bool
transferFrom 0x23b872dd
address sender
address recipient
uint256 amount
returns: bool
transferOwnership 0xf2fde38b
address newOwner
whitelistAddress 0xb9a45aac
address _address
bool _status

Recent Transactions

No transactions found for this address