pragma solidity ^0.4.24; contract NintyNineBillion { uint256 public totalVolume; uint256 public payIndex; uint256 public increase = 1001; //100.1% uint256 public minBuy = 100000000; //100 trx uint256 public goal = 99000000000000000; //99 billion trx address public dev; mapping (address => uint256) public totalBought; mapping (address => uint256) public totalOwed; mapping (address => uint256) public totalPaid; Order[] public orders; struct Order { uint256 amount; address owner; } constructor() public { dev = msg.sender; } event newOrder( address indexed buyer, uint256 amount, uint256 totalVol ); function() public payable { buy(); } function buy() public payable { //min buy to prevent dust greifing clogging up the queue require (msg.value >= minBuy); uint256 valueMultiplied = (msg.value * increase) / 1000; uint256 devAmount = msg.value / 1000; dev.transfer(devAmount); totalVolume += msg.value; totalBought[msg.sender] += msg.value; totalOwed[msg.sender] += valueMultiplied; orders.push( Order({ amount: valueMultiplied, owner: msg.sender }) ); processQueue(msg.value - devAmount); emit newOrder(msg.sender, msg.value, totalVolume); } function forceQueue() public { //under normal circumstances there should be no value in the contract //this provides a way to process any funds accidential stuck in the contract require (address(this).balance > 0 && payIndex < orders.length); processQueue(address(this).balance); } function processQueue(uint256 _value) internal { uint256 value = _value; while (payIndex < orders.length && value > 0) { Order storage order = orders[payIndex]; if (value <= order.amount) { totalPaid[order.owner] += value; totalOwed[order.owner] -= value; order.amount -= value; uint256 tempValue = value; value = 0; //ignore failed send to prevent malicious contracts holding up queue if (!order.owner.send(tempValue)) {} } else { totalPaid[order.owner] += order.amount; totalOwed[order.owner] -= order.amount; value -= order.amount; tempValue = order.amount; order.amount = 0; //ignore failed send to prevent malicious contracts holding up queue if (!order.owner.send(tempValue)) {} payIndex++; } } } function getQueueLength() external view returns(uint256) { return orders.length; } function getAmountToGoal() external view returns(uint256) { return totalVolume < goal ? goal - totalVolume : 0; } }
0.4.24