Last active
April 12, 2016 16:55
-
-
Save RCasatta/a86f3529c67e3fa3928e4ac736b1a8d1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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