Address: 0xc8e9B613f9282C7764Ea40Dbf7ada37Ac3820178
Balance (XRP): 0 XRP
Bytecode: 0x608060405234801561001057600080fd5b50600436106101165760003560e01c806370a08231116100a2578063a9059cbb11610071578063a9059cbb146102be578063ae5b2847146102d1578063d27d3e88146102e4578063d2a569c3146102f7578063dd62ed3e146102ff57600080fd5b806370a08231146101f45780638da5cb5b1461021d57806395d89b411461024d578063a69219561461025557600080fd5b8063313ce567116100e9578063313ce5671461018157806345f60e03146101905780634c86659e146101cf5780634e71d92d146101d957806369ec6357146101e157600080fd5b806306fdde031461011b578063095ea7b31461013957806318160ddd1461015c57806323b872dd1461016e575b600080fd5b610123610338565b6040516101309190610baf565b60405180910390f35b61014c610147366004610c19565b6103ca565b6040519015158152602001610130565b6002545b604051908152602001610130565b61014c61017c366004610c43565b610411565b60405160128152602001610130565b6101ba61019e366004610c80565b6009602052600090815260409020805460019091015460ff1682565b60408051928352901515602083015201610130565b6101d7610459565b005b6101d7610483565b6101d76101ef366004610c80565b61056b565b610160610202366004610c80565b6001600160a01b031660009081526020819052604090205490565b6005546102359061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610130565b61012361069c565b6006546007546008546102869291906001600160a01b0381169060ff600160a01b8204811691600160a81b90041685565b6040805195865260208601949094526001600160a01b039092169284019290925290151560608301521515608082015260a001610130565b61014c6102cc366004610c19565b6106ab565b6101d76102df366004610cee565b6106dd565b6101d76102f2366004610cee565b6107c0565b6101d761083b565b61016061030d366004610d5f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b60606003805461034790610d92565b80601f016020809104026020016040519081016040528092919081815260200182805461037390610d92565b80156103c05780601f10610395576101008083540402835291602001916103c0565b820191906000526020600020905b8154815290600101906020018083116103a357829003601f168201915b5050505050905090565b60055460009060ff16156103f95760405162461bcd60e51b81526004016103f090610dcc565b60405180910390fd5b33610405818585610899565b60019150505b92915050565b60055460009060ff16156104375760405162461bcd60e51b81526004016103f090610dcc565b336104438582856108ab565b61044e858585610938565b506001949350505050565b600854600160a01b900460ff161561047057600080fd5b60055461010090046001600160a01b0316ff5b60065443118015610495575060075443105b61049e57600080fd5b60055460ff16156104c15760405162461bcd60e51b81526004016103f090610dcc565b336000908152600960209081526040918290208251808401909352805480845260019091015460ff1615801592840183905290916104ff5750600081115b61053e5760405162461bcd60e51b815260206004820152601060248201526f4e6f7468696e6720746f20636c61696d60801b60448201526064016103f0565b3360008181526009602052604090206001908101805460ff1916909117905561056790826109af565b5050565b60055461010090046001600160a01b0316321461058757600080fd5b600754431180156105a15750600854600160a01b900460ff165b6105dd5760405162461bcd60e51b815260206004820152600d60248201526c041667465722061697264726f7609c1b60448201526064016103f0565b6001600160a01b0381166106335760405162461bcd60e51b815260206004820152601960248201527f5374616b696e6720636f6e74726163742072657175697265640000000000000060448201526064016103f0565b600880546001600160a01b0319166001600160a01b038316179055600254600090606490610662906082610e02565b61066c9190610e19565b600854909150610685906001600160a01b0316826109af565b50506008805460ff60a81b1916600160a81b179055565b60606004805461034790610d92565b60055460009060ff16156106d15760405162461bcd60e51b81526004016103f090610dcc565b33610405818585610938565b60055461010090046001600160a01b031632146106f957600080fd5b8281146107185760405162461bcd60e51b81526004016103f090610e3b565b60005b838110156107b957604051806040016040528084848481811061074057610740610e7c565b905060200201358152602001600015158152506009600087878581811061076957610769610e7c565b905060200201602081019061077e9190610c80565b6001600160a01b03168152602080820192909252604001600020825181559101516001918201805460ff19169115159190911790550161071b565b5050505050565b8281146107df5760405162461bcd60e51b81526004016103f090610e3b565b60005b838110156107b9576108333386868481811061080057610800610e7c565b90506020020160208101906108159190610c80565b85858581811061082757610827610e7c565b90506020020135610938565b6001016107e2565b60055461010090046001600160a01b0316321461085757600080fd5b600854600160a01b900460ff161561086e57600080fd5b6008805460ff60a01b1916600160a01b179055436006819055610894906204f1a0610e92565b600755565b6108a683838360016109ce565b505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811461093257818110156109235760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b60448201526064016103f0565b610932848484840360006109ce565b50505050565b6001600160a01b0383161580159061095857506001600160a01b03821615155b6109a45760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642053656e6465722f526563656976657200000000000000000060448201526064016103f0565b6108a6838383610a78565b6001600160a01b0382166109c257600080fd5b61056760008383610a78565b6001600160a01b038416158015906109ee57506001600160a01b03831615155b6109f757600080fd5b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561093257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051610a6a91815260200190565b60405180910390a350505050565b6001600160a01b038316610aa3578060026000828254610a989190610e92565b90915550610b229050565b6001600160a01b03831660009081526020819052604090205481811015610b035760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016103f0565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216610b3e57600280548290039055610b5d565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610ba291815260200190565b60405180910390a3505050565b602081526000825180602084015260005b81811015610bdd5760208186018101516040868401015201610bc0565b506000604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114610c1457600080fd5b919050565b60008060408385031215610c2c57600080fd5b610c3583610bfd565b946020939093013593505050565b600080600060608486031215610c5857600080fd5b610c6184610bfd565b9250610c6f60208501610bfd565b929592945050506040919091013590565b600060208284031215610c9257600080fd5b610c9b82610bfd565b9392505050565b60008083601f840112610cb457600080fd5b50813567ffffffffffffffff811115610ccc57600080fd5b6020830191508360208260051b8501011115610ce757600080fd5b9250929050565b60008060008060408587031215610d0457600080fd5b843567ffffffffffffffff811115610d1b57600080fd5b610d2787828801610ca2565b909550935050602085013567ffffffffffffffff811115610d4757600080fd5b610d5387828801610ca2565b95989497509550505050565b60008060408385031215610d7257600080fd5b610d7b83610bfd565b9150610d8960208401610bfd565b90509250929050565b600181811c90821680610da657607f821691505b602082108103610dc657634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526006908201526514185d5cd95960d21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761040b5761040b610dec565b600082610e3657634e487b7160e01b600052601260045260246000fd5b500490565b60208082526021908201527f4d69736d61746368696e672061646472657373657320616e6420616d6f756e746040820152607360f81b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b8082018082111561040b5761040b610dec56fea26469706673582212204b3d064de98b785c141e3ac81d11317f3d3eb2605255e679ff65934b81430e4f64736f6c634300081e0033
RealmToken.sol
// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; abstract contract ERC20Pausable { mapping(address account => uint256) private _balances; mapping(address account => mapping(address spender => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; bool private _paused; address public owner; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); modifier whenNotPaused() virtual{ require(!_paused,"Paused"); _; } modifier onlyOwner(){ require(tx.origin==owner); _; } constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } function name() public view virtual returns (string memory) { return _name; } function symbol() public view virtual returns (string memory) { return _symbol; } function decimals() public view virtual returns (uint8) { return 18; } function totalSupply() public view virtual returns (uint256) { return _totalSupply; } function balanceOf(address account) public view virtual returns (uint256) { return _balances[account]; } function transfer(address to, uint256 value) public virtual whenNotPaused returns (bool) { address _owner = msg.sender; _transfer(_owner, to, value); return true; } function allowance(address _owner, address spender) public view virtual returns (uint256) { return _allowances[_owner][spender]; } function approve(address spender, uint256 value) public virtual whenNotPaused returns (bool) { address _owner = msg.sender; _approve(_owner, spender, value); return true; } function transferFrom(address from, address to, uint256 value) public virtual whenNotPaused returns (bool) { address spender = msg.sender; _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } function _transfer(address from, address to, uint256 value) internal { require(from != address(0) && to != address(0),"Invalid Sender/Receiver"); _update(from, to, value); } function _update(address from, address to, uint256 value) internal virtual { if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows _totalSupply += value; } else { uint256 fromBalance = _balances[from]; if (fromBalance < value) { revert("Insufficient balance"); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. _balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. _totalSupply -= value; } } else { unchecked { // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. _balances[to] += value; } } emit Transfer(from, to, value); } function _mint(address account, uint256 value) internal { require(account != address(0)); _update(address(0), account, value); } function _burn(address account, uint256 value) internal { require(account != address(0)); _update(account, address(0), value); } function _approve(address _owner, address spender, uint256 value) internal { _approve(_owner, spender, value, true); } function _approve(address _owner, address spender, uint256 value, bool emitEvent) internal { require(_owner != address(0) && spender!= address(0)); _allowances[_owner][spender] = value; if(emitEvent){ emit Approval(_owner, spender, value); } } function _spendAllowance(address _owner, address spender, uint256 value) internal virtual { uint256 currentAllowance = allowance(_owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert("Insufficient allowance"); } unchecked { _approve(_owner, spender, currentAllowance - value, false); } } } } /// @title My token and Airdrop Claim /// @notice Holds tokens for users to claim. /// @dev Unlike a merkle distributor this contract uses storage to record claims rather than a /// merkle root. This is because calldata on TheRootNework is relatively cheap /// After construction do the following /// 1. addBatchAirdrop - called as many times as required to set all the recipients contract RealmToken is ERC20Pausable{ struct Claim { uint256 amount; bool claimed; } struct Status{ uint256 airdropStartBlock; uint256 airdropEndBlock; address stakingContract; bool airdropStarted; bool stakingStarted; } Status public tokenStatus; mapping(address=>Claim) public claimList; modifier airdropActive{ require(block.number > tokenStatus.airdropStartBlock && block.number < tokenStatus.airdropEndBlock); _; } constructor(address _owner) ERC20Pausable("RealmForge","Realm"){ owner= _owner; uint256 teamAmount = 10_000_000 ether; _mint(owner,teamAmount); } /// @notice Allows owner to set a list of recipients to receive tokens /// @dev This may need to be called many times to set the full list of recipients function addBatchAirdrop(address[] calldata _beneficiaries,uint256[] calldata _amounts) public onlyOwner{ require(_beneficiaries.length == _amounts.length,"Mismatching addresses and amounts"); for(uint i=0;i<_beneficiaries.length;i++){ claimList[_beneficiaries[i]]=Claim(_amounts[i],false); } } /// @notice Allow owner to start the airdrop /// @dev using 4 seconds a block on theRootNetwork , calculate 15 days approximately function startAirdrop() public onlyOwner{ require(!tokenStatus.airdropStarted); tokenStatus.airdropStarted=true; tokenStatus.airdropStartBlock = block.number; tokenStatus.airdropEndBlock = block.number + ((15 * 24 * 60 * 60 ) / 4); // 15 Days } /// @notice Allow bulk sending /// @dev Does not require approval /// @dev Called as many times the required number of beneficiaries for a single txn /// @param _beneficiaries - addresses to receive tokens. Should match amounts length function bulkSend(address[] calldata _beneficiaries,uint256[] calldata _amounts) public { require(_beneficiaries.length == _amounts.length,"Mismatching addresses and amounts"); for (uint i = 0;i<_beneficiaries.length;i++){ _transfer(msg.sender,_beneficiaries[i],_amounts[i]); } } /// @notice Allows a recipient to claim their tokens /// @dev Can only be called during the claim period /// @dev dynamic total supply , starts at 0 tokens , at the end /// of the airdrop , the total supply will be what was claimed function claim() public airdropActive whenNotPaused{ Claim memory currentClaim = claimList[msg.sender]; uint256 claimAmount = currentClaim.amount; require(!currentClaim.claimed && claimAmount >0,"Nothing to claim"); claimList[msg.sender].claimed=true; _mint(msg.sender,claimAmount); } /// @notice Allow team to mint staking and team allocation /// @notice 20% team , 130% staking directly to staking contract function enableStaking(address _stakingContract) public onlyOwner{ require(block.number > tokenStatus.airdropEndBlock && tokenStatus.airdropStarted,"After airdrop"); require(_stakingContract != address(0),"Staking contract required"); tokenStatus.stakingContract = _stakingContract; uint256 stakingAmount = totalSupply() * 130 / 100; _mint(address(tokenStatus.stakingContract),stakingAmount); tokenStatus.stakingStarted=true; } function dispose() public { //Token not distributed require(!tokenStatus.airdropStarted); selfdestruct(payable(owner)); } }
Gas Token: