Skip to content

Instantly share code, notes, and snippets.

@RCasatta
Last active April 12, 2016 16:55
Show Gist options
  • Save RCasatta/a86f3529c67e3fa3928e4ac736b1a8d1 to your computer and use it in GitHub Desktop.
Save RCasatta/a86f3529c67e3fa3928e4ac736b1a8d1 to your computer and use it in GitHub Desktop.
contract tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData); }
contract MyToken {
/* Public variables of the token */
string public name;
string public symbol;
string public version;
uint8 public decimals;
uint256 public totalSupply;
/* This creates an array with all balances */
mapping (address => uint256) public balanceOf;
/* An array of owners is required to iterate over owners */
address[] public owners;
/* Address could be deleted from owners array if owned token are 0 */
function del(uint _idx) {
var addr=owners[_idx];
if(balanceOf[addr]>0) throw;
owners[_idx]=owners[owners.length-1];
owners.length=owners.length-1;
}
/* This generates a public event on the blockchain that will notify clients */
event Transfer(address indexed from, address indexed to, uint256 value);
/* Initializes contract with initial supply tokens to the creator of the contract */
function MyToken(
uint256 initialSupply,
string tokenName,
uint8 decimalUnits,
string tokenSymbol
) {
balanceOf[msg.sender] = initialSupply; // Give the creator all initial tokens
owners[owners.length++] = msg.sender;
totalSupply = initialSupply; // Update total supply
name = tokenName; // Set the name for display purposes
symbol = tokenSymbol; // Set the symbol for display purposes
decimals = decimalUnits; // Amount of decimals for display purposes
dividendDistribution = false;
}
/* Send coins */
function transfer(address _to, uint256 _value) {
if (dividendDistribution) throw; //cannot transfer token while dividend is happening
if (balanceOf[msg.sender] < _value) throw; // Check if the sender has enough
if (balanceOf[_to] + _value < balanceOf[_to]) throw; // Check for overflows
var exist = balanceOf[_to] > 0; // Check if recipient already exist in list
balanceOf[msg.sender] -= _value; // Subtract from the sender
balanceOf[_to] += _value; // Add the same to the recipient
if(!exist)
owners[owners.length++]=_to; // Add to the array of owners if there wasn't
Transfer(msg.sender, _to, _value); // Notify anyone listening that this transfer took place
}
bool public dividendDistribution; // if true dividend distribution is happening
uint public last; // if a dividend operation was happening but did not finish it stores the next index to iterate
uint public dividendBalance; // balance to share for dividends
function dividend() {
if( balanceOf[msg.sender]==0 ) throw; // only token owners could call
if( !dividendDistribution && this.balance < 10 finney) throw; // only if there is some budget share dividend could happen
uint start;
if(!dividendDistribution) {
dividendDistribution = true;
dividendBalance = this.balance;
start = 0;
} else {
start = last;
}
for(var i=start ; i< owners.length;i++) {
if(msg.gas<20000) { // if I am running out of gas, I am saving status and exiting
last = i;
return;
}
if(balanceOf[owners[i]]>0) {
owners[i].send( dividendBalance * balanceOf[owners[i]] / totalSupply );
}
}
dividendBalance = 0;
dividendDistribution=false;
}
function () {
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment