data:application/vnd.facet.tx+json;rule=esip6,{"op":"create","data":{"init_code_hash":"0x45b224f1320c602a827823099dc4e7f596baf4227f919102a7f80523834edb02","args":{"name":"GENESIS","symbol":"GENESIS","owner":"0x6e89216b6D5C8fBeD5CDb21B7838B801B9a9Ca52","maxSupply":"21000000000","perMintLimit":"1000","decimals":"0000"},"source_code":"pragma(:rubidity, \"1.0.0\")\ncontract(:ERC20, abstract: true) {\n event(:Transfer, { from: :address, to: :address, amount: :uint256 })\n event(:Approval, { owner: :address, spender: :address, amount: :uint256 })\n string(:public, :name)\n string(:public, :symbol)\n uint8(:public, :decimals)\n uint256(:public, :totalSupply)\n mapping(({ address: :uint256 }), :public, :balanceOf)\n mapping(({ address: mapping(address: :uint256) }), :public, :allowance)\n constructor(name: :string, symbol: :string, decimals: :uint8) {\n s.name=name\n s.symbol=symbol\n s.decimals=decimals\n }\n function(:approve, { spender: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n s.allowance[msg.sender][spender] = amount\n emit(:Approval, owner: msg.sender, spender: spender, amount: amount)\n return true\n }\n function(:transfer, { to: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n require(s.balanceOf[msg.sender] >= amount, \"Insufficient balance\")\n s.balanceOf[msg.sender] -= amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: msg.sender, to: to, amount: amount)\n return true\n }\n function(:transferFrom, { from: :address, to: :address, amount: :uint256 }, :public, :virtual, returns: :bool) {\n allowed = s.allowance[from][msg.sender]\n require(s.balanceOf[from] >= amount, \"Insufficient balance\")\n require(allowed >= amount, \"Insufficient allowance\")\n s.allowance[from][msg.sender] = allowed - amount\n s.balanceOf[from] -= amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: from, to: to, amount: amount)\n return true\n }\n function(:_mint, { to: :address, amount: :uint256 }, :internal, :virtual) {\n s.totalSupply += amount\n s.balanceOf[to] += amount\n emit(:Transfer, from: address(0), to: to, amount: amount)\n }\n function(:_burn, { from: :address, amount: :uint256 }, :internal, :virtual) {\n require(s.balanceOf[from] >= amount, \"Insufficient balance\")\n s.balanceOf[from] -= amount\n s.totalSupply -= amount\n emit(:Transfer, from: from, to: address(0), amount: amount)\n }\n}\ncontract(:Ownable, abstract: true) {\n address(:public, :owner)\n event(:OwnershipTransferred, { previousOwner: :address, newOwner: :address })\n constructor(owner: :address) {\n s.owner=owner\n }\n function(:transferOwnership, { newOwner: :address }, :public) {\n onlyOwner!\n previousOwner = s.owner\n s.owner=newOwner\n emit(:OwnershipTransferred, previousOwner: previousOwner, newOwner: newOwner)\n }\n function(:onlyOwner!, :internal) {\n require(msg.sender == s.owner, \"msg.sender is not the owner\")\n }\n}\ncontract(:AirdropERC20, is: [:ERC20, :Ownable]) {\n uint256(:public, :maxSupply)\n uint256(:public, :perMintLimit)\n uint256(:public, :singleTxAirdropLimit)\n constructor(name: :string, symbol: :string, owner: :address, maxSupply: :uint256, perMintLimit: :uint256, decimals: :uint8) {\n self.ERC20.constructor(name: name, symbol: symbol, decimals: decimals)\n self.Ownable.constructor(owner: owner)\n s.maxSupply=maxSupply\n s.perMintLimit=perMintLimit\n s.singleTxAirdropLimit=10\n }\n function(:airdrop, { to: :address, amount: :uint256 }, :public) {\n onlyOwner!\n require(amount > 0, \"Amount must be positive\")\n require(amount <= s.perMintLimit, \"Exceeded mint limit\")\n require(s.totalSupply + amount <= s.maxSupply, \"Exceeded max supply\")\n _mint(to: to, amount: amount)\n }\n function(:airdropMultiple, { addresses: [:address], amounts: [:uint256] }, :public) {\n onlyOwner!\n require(addresses.length == amounts.length, \"Address and amount arrays must be the same length\")\n require(addresses.length <= s.singleTxAirdropLimit, \"Cannot import more than 10 addresses at a time\")\n forLoop(condition: ->(i) {\n i < addresses.length\n }, max_iterations: s.singleTxAirdropLimit) { |i|\n to = addresses[i]\n amount = amounts[i]\n airdrop(to: to, amount: amount)\n }\n }\n function(:burn, { amount: :uint256 }, :public) {\n _burn(from: msg.sender, amount: amount)\n }\n}\n"}}