Contract Overview
Transactions:
4 txns
TxHash | Block | Age | From | To | Value | [TxFee] | |
---|---|---|---|---|---|---|---|
0xb5da999ae2f8837791cc4f76dc9e16d75467d33e63ccbf7fecf3b98a498df666 | 5249842 | 346 days 2 hrs ago | 0x5f6e6c888f141930ff6a95bc6e1737cc7538b1fb | IN | 0xc29021a71f3a6c3fd9f361035d748b5f7912f55e | 1.5 Ether | 0.003578275 |
0x452c913ebf6ba5226b03938574b1f44d47e6713d32df7984c10409caea0f00d7 | 5184782 | 357 days 3 hrs ago | 0x1f27bdd58b7c88e2bfb8f03b173bf02960ebb973 | IN | 0xc29021a71f3a6c3fd9f361035d748b5f7912f55e | 0.09 Ether | 0.0020455 |
0x35e7d8a24ece7ccbb224cd39226b918508de4623c13f8c29ca521b067d8983ec | 5184663 | 357 days 3 hrs ago | 0x7a29e1343c6a107ce78199f1b3a1d2952efd77ba | IN | 0xc29021a71f3a6c3fd9f361035d748b5f7912f55e | 0 Ether | 0.00199947 |
0x3cf8d8bf715480d846048bf7685aa752197b4743ebf574842a90e71216522544 | 5184640 | 357 days 4 hrs ago | 0x7a29e1343c6a107ce78199f1b3a1d2952efd77ba | IN | Contract Creation | 0 Ether | 0.01108087 |
[ Download CSV Export ]
Internal Transactions as a result of Contract Execution
Parent TxHash | Block | Age | From | To | Value |
---|
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity), NestedArrayFunctionCallDecoder (medium-severity) Solidity Compiler Bugs.
Contract Source Code Verified (Exact Match)
Contract Source Code Verified (Exact Match)
Contract Name: | EPXCrowdsale |
Compiler Version: | v0.4.18+commit.9cf6e910 |
Optimization Enabled: | Yes |
Runs (Optimizer): | 200 |
Contract Source Code
pragma solidity ^0.4.18; // ------------------------------------------------- // ethPoker.io EPX token - Presale & ICO token sale contract // contact [email protected] for queries // Revision 20b // Refunds integrated, full test suite 20r passed // ------------------------------------------------- // ERC Token Standard #20 interface: // https://github.com/ethereum/EIPs/issues/20 // EPX contract sources: // https://github.com/EthPokerIO/ethpokerIO // ------------------------------------------------ // 2018 improvements: // - Updates to comply with latest Solidity versioning (0.4.18): // - Classification of internal/private vs public functions // - Specification of pure functions such as SafeMath integrated functions // - Conversion of all constant to view or pure dependant on state changed // - Full regression test of code updates // - Revision of block number timing for new Ethereum block times // - Removed duplicate Buy/Transfer event call in buyEPXtokens function (ethScan output verified) // - Burn event now records number of EPX tokens burned vs Refund event Eth // - Transfer event now fired when beneficiaryWallet withdraws // - Gas req optimisation for payable function to maximise compatibility // - Going live for initial Presale round 02/03/2018 // ------------------------------------------------- // Security reviews passed - cycle 20r // Functional reviews passed - cycle 20r // Final code revision and regression test cycle passed - cycle 20r // ------------------------------------------------- contract owned { address public owner; function owned() internal { owner = msg.sender; } modifier onlyOwner { require(msg.sender == owner); _; } } contract safeMath { function safeMul(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a * b; safeAssert(a == 0 || c / a == b); return c; } function safeDiv(uint256 a, uint256 b) internal pure returns (uint256) { safeAssert(b > 0); uint256 c = a / b; safeAssert(a == b * c + a % b); return c; } function safeSub(uint256 a, uint256 b) internal pure returns (uint256) { safeAssert(b <= a); return a - b; } function safeAdd(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; safeAssert(c>=a && c>=b); return c; } function safeAssert(bool assertion) internal pure { if (!assertion) revert(); } } contract StandardToken is owned, safeMath { function balanceOf(address who) view public returns (uint256); function transfer(address to, uint256 value) public returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); } contract EPXCrowdsale is owned, safeMath { // owner/admin & token reward address public admin = owner; // admin address StandardToken public tokenReward; // address of the token used as reward // deployment variables for static supply sale uint256 private initialTokenSupply; uint256 private tokensRemaining; // multi-sig addresses and price variable address private beneficiaryWallet; // beneficiaryMultiSig (founder group) or wallet account // uint256 values for min,max,caps,tracking uint256 public amountRaisedInWei; // uint256 public fundingMinCapInWei; // // loop control, ICO startup and limiters string public CurrentStatus = ""; // current crowdsale status uint256 public fundingStartBlock; // crowdsale start block# uint256 public fundingEndBlock; // crowdsale end block# bool public isCrowdSaleClosed = false; // crowdsale completion boolean bool private areFundsReleasedToBeneficiary = false; // boolean for founder to receive Eth or not bool public isCrowdSaleSetup = false; // boolean for crowdsale setup event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); event Buy(address indexed _sender, uint256 _eth, uint256 _EPX); event Refund(address indexed _refunder, uint256 _value); event Burn(address _from, uint256 _value); mapping(address => uint256) balancesArray; mapping(address => uint256) usersEPXfundValue; // default function, map admin function EPXCrowdsale() public onlyOwner { admin = msg.sender; CurrentStatus = "Crowdsale deployed to chain"; } // total number of tokens initially function initialEPXSupply() public view returns (uint256 initialEPXtokenCount) { return safeDiv(initialTokenSupply,10000); // div by 10,000 for display normalisation (4 decimals) } // remaining number of tokens function remainingEPXSupply() public view returns (uint256 remainingEPXtokenCount) { return safeDiv(tokensRemaining,10000); // div by 10,000 for display normalisation (4 decimals) } // setup the CrowdSale parameters function SetupCrowdsale(uint256 _fundingStartBlock, uint256 _fundingEndBlock) public onlyOwner returns (bytes32 response) { if ((msg.sender == admin) && (!(isCrowdSaleSetup)) && (!(beneficiaryWallet > 0))) { // init addresses beneficiaryWallet = 0x7A29e1343c6a107ce78199F1b3a1d2952efd77bA; tokenReward = StandardToken(0x35BAA72038F127f9f8C8f9B491049f64f377914d); // funding targets fundingMinCapInWei = 30000000000000000000; // ETH 300 + 000000000000000000 18 dec wei // update values amountRaisedInWei = 0; initialTokenSupply = 200000000000; // 20,000,000 + 4 dec resolution tokensRemaining = initialTokenSupply; fundingStartBlock = _fundingStartBlock; fundingEndBlock = _fundingEndBlock; // configure crowdsale isCrowdSaleSetup = true; isCrowdSaleClosed = false; CurrentStatus = "Crowdsale is setup"; return "Crowdsale is setup"; } else if (msg.sender != admin) { return "not authorised"; } else { return "campaign cannot be changed"; } } function checkPrice() internal view returns (uint256 currentPriceValue) { if (block.number >= fundingStartBlock+177534) { // 30-day price change/final 30day change return (7600); //30days-end =7600EPX:1ETH } else if (block.number >= fundingStartBlock+124274) { //3 week mark/over 21days return (8200); //3w-30days =8200EPX:1ETH } else if (block.number >= fundingStartBlock) { // start [0 hrs] return (8800); //0-3weeks =8800EPX:1ETH } } // default payable function when sending ether to this contract function () public payable { // 0. conditions (length, crowdsale setup, zero check, exceed funding contrib check, contract valid check, within funding block range check, balance overflow check etc) require(!(msg.value == 0) && (msg.data.length == 0) && (block.number <= fundingEndBlock) && (block.number >= fundingStartBlock) && (tokensRemaining > 0)); // 1. vars uint256 rewardTransferAmount = 0; // 2. effects amountRaisedInWei = safeAdd(amountRaisedInWei, msg.value); rewardTransferAmount = ((safeMul(msg.value, checkPrice())) / 100000000000000); // 3. interaction tokensRemaining = safeSub(tokensRemaining, rewardTransferAmount); tokenReward.transfer(msg.sender, rewardTransferAmount); // 4. events usersEPXfundValue[msg.sender] = safeAdd(usersEPXfundValue[msg.sender], msg.value); Buy(msg.sender, msg.value, rewardTransferAmount); } function beneficiaryMultiSigWithdraw(uint256 _amount) public onlyOwner { require(areFundsReleasedToBeneficiary && (amountRaisedInWei >= fundingMinCapInWei)); beneficiaryWallet.transfer(_amount); Transfer(this, beneficiaryWallet, _amount); } function checkGoalReached() public onlyOwner { // return crowdfund status to owner for each result case, update public vars // update state & status variables require (isCrowdSaleSetup); if ((amountRaisedInWei < fundingMinCapInWei) && (block.number <= fundingEndBlock && block.number >= fundingStartBlock)) { // ICO in progress, under softcap areFundsReleasedToBeneficiary = false; isCrowdSaleClosed = false; CurrentStatus = "In progress (Eth < Softcap)"; } else if ((amountRaisedInWei < fundingMinCapInWei) && (block.number < fundingStartBlock)) { // ICO has not started areFundsReleasedToBeneficiary = false; isCrowdSaleClosed = false; CurrentStatus = "Crowdsale is setup"; } else if ((amountRaisedInWei < fundingMinCapInWei) && (block.number > fundingEndBlock)) { // ICO ended, under softcap areFundsReleasedToBeneficiary = false; isCrowdSaleClosed = true; CurrentStatus = "Unsuccessful (Eth < Softcap)"; } else if ((amountRaisedInWei >= fundingMinCapInWei) && (tokensRemaining == 0)) { // ICO ended, all tokens bought! areFundsReleasedToBeneficiary = true; isCrowdSaleClosed = true; CurrentStatus = "Successful (EPX >= Hardcap)!"; } else if ((amountRaisedInWei >= fundingMinCapInWei) && (block.number > fundingEndBlock) && (tokensRemaining > 0)) { // ICO ended, over softcap! areFundsReleasedToBeneficiary = true; isCrowdSaleClosed = true; CurrentStatus = "Successful (Eth >= Softcap)!"; } else if ((amountRaisedInWei >= fundingMinCapInWei) && (tokensRemaining > 0) && (block.number <= fundingEndBlock)) { // ICO in progress, over softcap! areFundsReleasedToBeneficiary = true; isCrowdSaleClosed = false; CurrentStatus = "In progress (Eth >= Softcap)!"; } } function refund() public { // any contributor can call this to have their Eth returned. user's purchased EPX tokens are burned prior refund of Eth. //require minCap not reached require ((amountRaisedInWei < fundingMinCapInWei) && (isCrowdSaleClosed) && (block.number > fundingEndBlock) && (usersEPXfundValue[msg.sender] > 0)); //burn user's token EPX token balance, refund Eth sent uint256 ethRefund = usersEPXfundValue[msg.sender]; balancesArray[msg.sender] = 0; usersEPXfundValue[msg.sender] = 0; //record Burn event with number of EPX tokens burned Burn(msg.sender, usersEPXfundValue[msg.sender]); //send Eth back msg.sender.transfer(ethRefund); //record Refund event with number of Eth refunded in transaction Refund(msg.sender, ethRefund); } }
Contract ABI
[{"constant":false,"inputs":[],"name":"checkGoalReached","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"remainingEPXSupply","outputs":[{"name":"remainingEPXtokenCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isCrowdSaleSetup","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"refund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialEPXSupply","outputs":[{"name":"initialEPXtokenCount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenReward","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"amountRaisedInWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"beneficiaryMultiSigWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"fundingMinCapInWei","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fundingEndBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isCrowdSaleClosed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_fundingStartBlock","type":"uint256"},{"name":"_fundingEndBlock","type":"uint256"}],"name":"SetupCrowdsale","outputs":[{"name":"response","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"fundingStartBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CurrentStatus","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_sender","type":"address"},{"indexed":false,"name":"_eth","type":"uint256"},{"indexed":false,"name":"_EPX","type":"uint256"}],"name":"Buy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_refunder","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_from","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Burn","type":"event"}]
Contract Creation Code
6060604090815260005460018054600160a060020a031916600160a060020a03909216919091179055602090519081016040526000815260089080516100499291602001906100f8565b50600b805462ffffff19169055341561006157600080fd5b60008054600160a060020a03338116600160a060020a0319909216821792839055919091161461009057600080fd5b60018054600160a060020a03191633600160a060020a031617905560408051908101604052601b81527f43726f776473616c65206465706c6f79656420746f20636861696e0000000000602082015260089080516100f29291602001906100f8565b50610193565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061013957805160ff1916838001178555610166565b82800160010185558215610166579182015b8281111561016657825182559160200191906001019061014b565b50610172929150610176565b5090565b61019091905b80821115610172576000815560010161017c565b90565b610e1080620001a36000396000f3006060604052600436106100e55763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166301cb3b2081146102825780631de1441f1461029757806337205d76146102bc578063590e1ae3146102e3578063670be445146102f65780636e66f6e91461030957806372729ff21461033857806379ca07921461034b5780637ee6b2d0146103615780638da5cb5b1461037457806391b43d1314610387578063a26d7b941461039a578063ac06e302146103ad578063d648a647146103c6578063e3306a6f146103d9578063f851a44014610463575b600034158015906100f4575036155b80156101025750600a544311155b801561011057506009544310155b801561011e57506000600454115b151561012957600080fd5b6000905061013960065434610476565b600655655af3107a40006101543461014f61049a565b6104dc565b81151561015d57fe5b04905061016c600454826104ff565b600455600254600160a060020a031663a9059cbb33836000604051602001526040517c010000000000000000000000000000000000000000000000000000000063ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156101e757600080fd5b6102c65a03f115156101f857600080fd5b50505060405180515050600160a060020a0333166000908152600d60205260409020546102259034610476565b600160a060020a0333166000818152600d60205260409081902092909255907f1cbc5ab135991bd2b6a4b034a04aa2aa086dac1371cb9b16b8b5e2ed6b036bed90349084905191825260208201526040908101905180910390a250005b341561028d57600080fd5b610295610518565b005b34156102a257600080fd5b6102aa61082a565b60405190815260200160405180910390f35b34156102c757600080fd5b6102cf61083f565b604051901515815260200160405180910390f35b34156102ee57600080fd5b61029561084e565b341561030157600080fd5b6102aa610986565b341561031457600080fd5b61031c610996565b604051600160a060020a03909116815260200160405180910390f35b341561034357600080fd5b6102aa6109a5565b341561035657600080fd5b6102956004356109ab565b341561036c57600080fd5b6102aa610a66565b341561037f57600080fd5b61031c610a6c565b341561039257600080fd5b6102aa610a7b565b34156103a557600080fd5b6102cf610a81565b34156103b857600080fd5b6102aa600435602435610a8a565b34156103d157600080fd5b6102aa610c56565b34156103e457600080fd5b6103ec610c5c565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015610428578082015183820152602001610410565b50505050905090810190601f1680156104555780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561046e57600080fd5b61031c610cfa565b600082820161049384821080159061048e5750838210155b610d09565b9392505050565b6009546000906202b57e0143106104b45750611db06104d9565b6009546201e5720143106104cb57506120086104d9565b60095443106104d957506122605b90565b600082820261049384158061048e57508385838115156104f857fe5b0414610d09565b600061050d83831115610d09565b508082035b92915050565b60005433600160a060020a0390811691161461053357600080fd5b600b5462010000900460ff16151561054a57600080fd5b60075460065410801561056c5750600a54431115801561056c57506009544310155b156105c957600b805461ffff1916905560408051908101604052601b81527f496e2070726f67726573732028457468203c20536f6674636170290000000000602082015260089080516105c3929160200190610d4c565b50610828565b6007546006541080156105dd575060095443105b1561063457600b805461ffff1916905560408051908101604052601281527f43726f776473616c652069732073657475700000000000000000000000000000602082015260089080516105c3929160200190610d4c565b6007546006541080156106485750600a5443115b156106a257600b805461ffff1916600117905560408051908101604052601c81527f556e7375636365737366756c2028457468203c20536f66746361702900000000602082015260089080516105c3929160200190610d4c565b600754600654101580156106b65750600454155b1561071a57600b805460ff1961ff00199091166101001716600117905560408051908101604052601c81527f5375636365737366756c2028455058203e3d2048617264636170292100000000602082015260089080516105c3929160200190610d4c565b6007546006541015801561072f5750600a5443115b801561073d57506000600454115b156107a157600b805460ff1961ff00199091166101001716600117905560408051908101604052601c81527f5375636365737366756c2028457468203e3d20536f6674636170292100000000602082015260089080516105c3929160200190610d4c565b600754600654101580156107b757506000600454115b80156107c55750600a544311155b1561082857600b805460ff1961ff00199091166101001716905560408051908101604052601d81527f496e2070726f67726573732028457468203e3d20536f6674636170292100000060208201526008908051610826929160200190610d4c565b505b565b600061083a600454612710610d15565b905090565b600b5462010000900460ff1681565b60006007546006541080156108655750600b5460ff165b80156108725750600a5443115b80156108945750600160a060020a0333166000908152600d6020526040812054115b151561089f57600080fd5b5033600160a060020a0381166000908152600d602081815260408084208054600c8452828620869055939092529083905590927fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca592909151600160a060020a03909216825260208201526040908101905180910390a1600160a060020a03331681156108fc0282604051600060405180830381858888f19350505050151561094657600080fd5b33600160a060020a03167fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d8260405190815260200160405180910390a250565b600061083a600354612710610d15565b600254600160a060020a031681565b60065481565b60005433600160a060020a039081169116146109c657600080fd5b600b54610100900460ff1680156109e1575060075460065410155b15156109ec57600080fd5b600554600160a060020a031681156108fc0282604051600060405180830381858888f193505050501515610a1f57600080fd5b600554600160a060020a039081169030167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405190815260200160405180910390a350565b60075481565b600054600160a060020a031681565b600a5481565b600b5460ff1681565b6000805433600160a060020a03908116911614610aa657600080fd5b60015433600160a060020a039081169116148015610acd5750600b5462010000900460ff16155b8015610ae757506005546000600160a060020a0390911611155b15610bf2576005805473ffffffffffffffffffffffffffffffffffffffff19908116737a29e1343c6a107ce78199f1b3a1d2952efd77ba17909155600280549091167335baa72038f127f9f8c8f9b491049f64f377914d1790556801a055690d9db800006007556000600655642e90edd00060038190556004556009839055600a829055600b805460ff1962ff000019909116620100001716905560408051908101604052601281527f43726f776473616c65206973207365747570000000000000000000000000000060208201526008908051610bc9929160200190610d4c565b507f43726f776473616c6520697320736574757000000000000000000000000000009050610512565b60015433600160a060020a03908116911614610c2f57507f6e6f7420617574686f7269736564000000000000000000000000000000000000610512565b507f63616d706169676e2063616e6e6f74206265206368616e676564000000000000610512565b60095481565b60088054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610cf25780601f10610cc757610100808354040283529160200191610cf2565b820191906000526020600020905b815481529060010190602001808311610cd557829003601f168201915b505050505081565b600154600160a060020a031681565b80151561082657600080fd5b600080610d2460008411610d09565b8284811515610d2f57fe5b0490506104938385811515610d4057fe5b06828502018514610d09565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10610d8d57805160ff1916838001178555610dba565b82800160010185558215610dba579182015b82811115610dba578251825591602001919060010190610d9f565b50610dc6929150610dca565b5090565b6104d991905b80821115610dc65760008155600101610dd05600a165627a7a72305820f709d434c5c69bd25346d6d6917d49c7d77287c70d262d3ccfb9d47c5dcad4810029
Swarm Source:
bzzr://f709d434c5c69bd25346d6d6917d49c7d77287c70d262d3ccfb9d47c5dcad481
Block | Age | transaction | Difficulty | GasUsed | Reward |
---|
Block | Age | Uncle Number | Difficulty | GasUsed | Reward |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.