Transaction Hash:
Block:
21378874 at Dec-11-2024 11:09:47 AM +UTC
Transaction Fee:
0.000390188681201428 ETH
$0.95
Gas Used:
29,753 Gas / 13.114263476 Gwei
Emitted Events:
224 |
AIOZToken.Transfer( from=[Sender] 0x9296759fb1e2000ab4c99ea9ed9efcb6ca95020f, to=0xdD1212fdD13635Fe3157D2060321f24F4Bc1647a, value=119450217791380567958385 )
|
Account State Difference:
Address | Before | After | State Difference | ||
---|---|---|---|---|---|
0x4838B106...B0BAD5f97
Miner
| (Titan Builder) | 7.798142316360416371 Eth | 7.798171868552896915 Eth | 0.000029552192480544 | |
0x626E8036...2433cBF18 | |||||
0x9296759f...6Ca95020F |
0.041949927693779159 Eth
Nonce: 66
|
0.041559739012577731 Eth
Nonce: 67
| 0.000390188681201428 |
Execution Trace
AIOZToken.transfer( recipient=0xdD1212fdD13635Fe3157D2060321f24F4Bc1647a, amount=119450217791380567958385 ) => ( True )
{"AIOZToken.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \u0027./IERC20.sol\u0027;\nimport \u0027./IERC20Metadata.sol\u0027;\nimport \u0027./Ownable.sol\u0027;\nimport \u0027./TokenTimelock.sol\u0027;\n\ncontract ERC20 is IERC20, IERC20Metadata {\n mapping (address =\u003e uint256) private _balances;\n\n mapping (address =\u003e mapping (address =\u003e uint256)) private _allowances;\n\n uint256 private _totalSupply;\n\n string private _name;\n string private _symbol;\n\n constructor (string memory name_, string memory symbol_) {\n _name = name_;\n _symbol = symbol_;\n }\n \n function name() public view virtual override returns (string memory) {\n return _name;\n }\n\n function symbol() public view virtual override returns (string memory) {\n return _symbol;\n }\n\n function decimals() public view virtual override returns (uint8) {\n return 18;\n }\n\n function totalSupply() public view virtual override returns (uint256) {\n return _totalSupply;\n }\n\n function balanceOf(address account) public view virtual override returns (uint256) {\n return _balances[account];\n }\n\n function transfer(address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(msg.sender, recipient, amount);\n return true;\n }\n\n function allowance(address owner, address spender) public view virtual override returns (uint256) {\n return _allowances[owner][spender];\n }\n\n function approve(address spender, uint256 amount) public virtual override returns (bool) {\n _approve(msg.sender, spender, amount);\n return true;\n }\n\n function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {\n _transfer(sender, recipient, amount);\n uint256 currentAllowance = _allowances[sender][msg.sender];\n require(currentAllowance \u003e= amount, \"ERC20: transfer amount exceeds allowance\");\n _approve(sender, msg.sender, currentAllowance - amount);\n return true;\n }\n\n function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {\n _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue);\n return true;\n }\n\n function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {\n uint256 currentAllowance = _allowances[msg.sender][spender];\n require(currentAllowance \u003e= subtractedValue, \"ERC20: decreased allowance below zero\");\n _approve(msg.sender, spender, currentAllowance - subtractedValue);\n return true;\n }\n\n function _transfer(address sender, address recipient, uint256 amount) internal virtual {\n require(sender != address(0), \"ERC20: transfer from the zero address\");\n require(recipient != address(0), \"ERC20: transfer to the zero address\");\n\n uint256 senderBalance = _balances[sender];\n require(senderBalance \u003e= amount, \"ERC20: transfer amount exceeds balance\");\n _balances[sender] = senderBalance - amount;\n _balances[recipient] += amount;\n\n emit Transfer(sender, recipient, amount);\n }\n\n function _mint(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: mint to the zero address\");\n\n _totalSupply += amount;\n _balances[account] += amount;\n emit Transfer(address(0), account, amount);\n }\n\n function _burn(address account, uint256 amount) internal virtual {\n require(account != address(0), \"ERC20: burn from the zero address\");\n\n uint256 accountBalance = _balances[account];\n require(accountBalance \u003e= amount, \"ERC20: burn amount exceeds balance\");\n _balances[account] = accountBalance - amount;\n _totalSupply -= amount;\n\n emit Transfer(account, address(0), amount);\n }\n\n function _approve(address owner, address spender, uint256 amount) internal virtual {\n require(owner != address(0), \"ERC20: approve from the zero address\");\n require(spender != address(0), \"ERC20: approve to the zero address\");\n\n _allowances[owner][spender] = amount;\n emit Approval(owner, spender, amount);\n }\n}\n\ncontract AIOZToken is ERC20, Ownable {\n uint256 private _maxTotalSupply;\n \n constructor() ERC20(\"AIOZ Network\", \"AIOZ\") {\n _maxTotalSupply = 1000000000e18;\n \n // init timelock factory\n TimelockFactory timelockFactory = new TimelockFactory();\n\n // ERC20\n // public sales\n mint(0x076592ad72b79bBaBDD05aDd7d367f44f2CFf658, 10333333e18); // for Paid Ignition\n // private sales\n mint(0xF8477220f8375968E38a3B79ECA4343822b53af2, 73000000e18*25/100);\n address privateSalesLock = timelockFactory.createTimelock(this, 0xF8477220f8375968E38a3B79ECA4343822b53af2, block.timestamp + 30 days, 73000000e18*25/100, 30 days);\n mint(privateSalesLock, 73000000e18*75/100);\n // team\n address teamLock = timelockFactory.createTimelock(this, 0x82E83054CC631C0Da85Ca67087E45ca31b93F29b, block.timestamp + 180 days, 250000000e18*8/100, 30 days);\n mint(teamLock, 250000000e18);\n // advisors\n address advisorsLock = timelockFactory.createTimelock(this, 0xBbf78c2Ee1794229e31af81c83F4d5125F08FE0F, block.timestamp + 90 days, 50000000e18*8/100, 30 days);\n mint(advisorsLock, 50000000e18);\n // marketing\n mint(0x9E2F8e278585CAfD3308E894d2E09ffEc520b1E9, 30000000e18*10/100);\n address marketingERC20Lock = timelockFactory.createTimelock(this, 0x9E2F8e278585CAfD3308E894d2E09ffEc520b1E9, block.timestamp + 30 days, 30000000e18*5/100, 30 days);\n mint(marketingERC20Lock, 30000000e18*90/100);\n // exchange liquidity provision\n mint(0x6c3D8872002B66C808aE462Db314B87962DCC7aF, 23333333e18);\n // ecosystem growth\n address growthLock = timelockFactory.createTimelock(this, 0xCFd6736a11e76c0e3418FEEbb788822211d92F1e, block.timestamp + 90 days, 0, 0);\n mint(growthLock, 530000000e18);\n\n // BEP20\n // // public sales\n // mint(0xc9Fc843DBAA8ccCcf37E09b67DeEa5f963E3919E, 6666667e18); // for BSCPad\n // // marketing\n // mint(0x7e318e80EB8e401451334cAa2278E39Da7F6C49B, 20000000e18*10/100);\n // address marketingBEP20Lock = timelockFactory.createTimelock(this, 0x7e318e80EB8e401451334cAa2278E39Da7F6C49B, block.timestamp + 30 days, 20000000e18*5/100, 30 days);\n // mint(marketingBEP20Lock, 20000000e18*90/100);\n // // exchange liquidity provision\n // mint(0x0a515Ac284E3c741575A4fd71C27e377a19D5E6D, 6666667e18);\n }\n\n function mint(address account, uint256 amount) public onlyOwner returns (bool) {\n require(totalSupply() + amount \u003c= _maxTotalSupply, \"AIOZ Token: mint more than the max total supply\");\n _mint(account, amount);\n return true;\n }\n\n function burn(uint256 amount) public onlyOwner returns (bool) {\n _burn(msg.sender, amount);\n return true;\n }\n}"},"IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\ninterface IERC20 {\n function totalSupply() external view returns (uint256);\n function balanceOf(address account) external view returns (uint256);\n function transfer(address recipient, uint256 amount) external returns (bool);\n function allowance(address owner, address spender) external view returns (uint256);\n function approve(address spender, uint256 amount) external returns (bool);\n function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);\n event Transfer(address indexed from, address indexed to, uint256 value);\n event Approval(address indexed owner, address indexed spender, uint256 value);\n}"},"IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \"./IERC20.sol\";\n\ninterface IERC20Metadata is IERC20 {\n function name() external view returns (string memory);\n function symbol() external view returns (string memory);\n function decimals() external view returns (uint8);\n}"},"Ownable.sol":{"content":"// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor () {\n address msgSender = msg.sender;\n _owner = msgSender;\n emit OwnershipTransferred(address(0), msgSender);\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n require(owner() == msg.sender, \"Ownable: caller is not the owner\");\n _;\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n emit OwnershipTransferred(_owner, address(0));\n _owner = address(0);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n emit OwnershipTransferred(_owner, newOwner);\n _owner = newOwner;\n }\n}"},"TokenTimelock.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.0;\n\nimport \u0027./IERC20.sol\u0027;\n\ncontract TokenTimelock {\n IERC20 private _token;\n address private _beneficiary;\n uint256 private _nextReleaseTime;\n uint256 private _releaseAmount;\n uint256 private _releasePeriod;\n\n TimelockFactory private _factory;\n\n event Released(address indexed beneficiary, uint256 amount);\n event BeneficiaryTransferred(address indexed previousBeneficiary, address indexed newBeneficiary);\n\n\tconstructor(){\n\t\t_token = IERC20(address(1));\n\t}\n\n\tfunction init(IERC20 token_, address beneficiary_, uint256 releaseStart_, uint256 releaseAmount_, uint256 releasePeriod_) external {\n\t\trequire(_token == IERC20(address(0)), \"TokenTimelock: already initialized\");\n\t\trequire(token_ != IERC20(address(0)), \"TokenTimelock: erc20 token address is zero\");\n require(beneficiary_ != address(0), \"TokenTimelock: beneficiary address is zero\");\n require(releasePeriod_ == 0 || releaseAmount_ != 0, \"TokenTimelock: release amount is zero\");\n\n emit BeneficiaryTransferred(address(0), beneficiary_);\n\n _token = token_;\n _beneficiary = beneficiary_;\n _nextReleaseTime = releaseStart_;\n _releaseAmount = releaseAmount_;\n _releasePeriod = releasePeriod_;\n\n _factory = TimelockFactory(msg.sender);\n\t}\n\n function token() public view virtual returns (IERC20) {\n return _token;\n }\n\n function beneficiary() public view virtual returns (address) {\n return _beneficiary;\n }\n\n function nextReleaseTime() public view virtual returns (uint256) {\n return _nextReleaseTime;\n }\n\n function releaseAmount() public view virtual returns (uint256) {\n return _releaseAmount;\n }\n\n function balance() public view virtual returns (uint256) {\n return token().balanceOf(address(this));\n }\n\n function releasableAmount() public view virtual returns (uint256) {\n if (block.timestamp \u003c _nextReleaseTime) return 0;\n\n uint256 amount = balance();\n if (amount == 0) return 0;\n if (_releasePeriod == 0) return amount;\n\n uint256 passedPeriods = (block.timestamp - _nextReleaseTime) / _releasePeriod;\n uint256 maxReleasableAmount = (passedPeriods + 1) * _releaseAmount;\n \n if (amount \u003c= maxReleasableAmount) return amount;\n return maxReleasableAmount;\n }\n\n function releasePeriod() public view virtual returns (uint256) {\n return _releasePeriod;\n }\n\n function release() public virtual returns (bool) {\n // solhint-disable-next-line not-rely-on-time\n require(block.timestamp \u003e= nextReleaseTime(), \"TokenTimelock: current time is before release time\");\n\n uint256 _releasableAmount = releasableAmount();\n require(_releasableAmount \u003e 0, \"TokenTimelock: no releasable tokens\");\n\n emit Released(beneficiary(), _releasableAmount);\n require(token().transfer(beneficiary(), _releasableAmount));\n\n if (_releasePeriod != 0) {\n uint256 passedPeriods = (block.timestamp - _nextReleaseTime) / _releasePeriod;\n _nextReleaseTime += (passedPeriods + 1) * _releasePeriod;\n }\n\n return true;\n }\n\n function transferBeneficiary(address newBeneficiary) public virtual returns (bool) {\n\t\trequire(msg.sender == beneficiary(), \"TokenTimelock: caller is not the beneficiary\");\n\t\trequire(newBeneficiary != address(0), \"TokenTimelock: the new beneficiary is zero address\");\n\t\t\n emit BeneficiaryTransferred(beneficiary(), newBeneficiary);\n\t\t_beneficiary = newBeneficiary;\n\t\treturn true;\n\t}\n\n function split(address splitBeneficiary, uint256 splitAmount) public virtual returns (bool) {\n uint256 _amount = balance();\n\t\trequire(msg.sender == beneficiary(), \"TokenTimelock: caller is not the beneficiary\");\n\t\trequire(splitBeneficiary != address(0), \"TokenTimelock: beneficiary address is zero\");\n require(splitAmount \u003e 0, \"TokenTimelock: amount is zero\");\n require(splitAmount \u003c= _amount, \"TokenTimelock: amount exceeds balance\");\n\n uint256 splitReleaseAmount;\n if (_releasePeriod \u003e 0) {\n splitReleaseAmount = _releaseAmount * splitAmount / _amount;\n }\n\n address newTimelock = _factory.createTimelock(token(), splitBeneficiary, _nextReleaseTime, splitReleaseAmount, _releasePeriod);\n\n require(token().transfer(newTimelock, splitAmount));\n _releaseAmount -= splitReleaseAmount;\n\t\treturn true;\n\t}\n}\n\ncontract CloneFactory {\n function createClone(address target) internal returns (address result) {\n bytes20 targetBytes = bytes20(target);\n assembly {\n let clone := mload(0x40)\n mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\n mstore(add(clone, 0x14), targetBytes)\n mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\n result := create(0, clone, 0x37)\n }\n }\n}\n\ncontract TimelockFactory is CloneFactory {\n\taddress private _tokenTimelockImpl;\n\tevent Timelock(address timelockContract);\n\tconstructor() {\n\t\t_tokenTimelockImpl = address(new TokenTimelock());\n\t}\n\tfunction createTimelock(IERC20 token, address to, uint256 releaseTime, uint256 releaseAmount, uint256 period) public returns (address) {\n\t\taddress clone = createClone(_tokenTimelockImpl);\n\t\tTokenTimelock(clone).init(token, to, releaseTime, releaseAmount, period);\n\n\t\temit Timelock(clone);\n\t\treturn clone;\n\t}\n}"}}