Address Contract Partially Verified
Address
0xC80c5E40220172B36aDee2c951f26F2a577810C5
Balance
8.5922 ETH
Nonce
1
Code Size
9556 bytes
Creator
0x002a6dF1...6651 at tx 0xe0b47ed6...afa2ac
Indexed Transactions
0
Contract Bytecode
9556 bytes
0x6060604052600436106101f55763ffffffff60e060020a600035041663046f7da2811461020e57806306fdde0314610221578063095ea7b3146102ab57806311fe7e43146102e157806318160ddd14610338578063205360e01461035d57806323b872dd146103805780632e12e6a1146103a8578063313ce567146103d45780633284b3e2146103fd5780633c9c97f0146104295780633ead67b514610449578063475a9fa914610468578063522e35fb1461048a5780635c975abb146104a957806366188463146104bc5780636e4ed796146104de5780636ff96d17146104f157806370a082311461053d5780637362377b1461055c578063763232531461056f5780637af05516146105855780638456cb59146105a55780638a19c8bc146105b85780638b39d181146105e857806395d89b411461060a5780639d1303431461061d578063a293d1e81461063c578063a9059cbb14610655578063b5931f7c14610677578063b88a802f14610690578063be45fd62146106a3578063c0ee0b8a14610708578063c38e650f1461076d578063c7b235611461078c578063d05c78da146107fe578063d2631e4214610817578063d73dd62314610836578063dd62ed3e14610858578063e6cb90131461087d578063f6368f8a14610896578063f6ba13a51461093d578063f9368e7a14610950575b60055460e060020a900460ff161561020c57600080fd5b005b341561021957600080fd5b61020c610970565b341561022c57600080fd5b6102346109cb565b60405160208082528190810183818151815260200191508051906020019080838360005b83811015610270578082015183820152602001610258565b50505050905090810190601f16801561029d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156102b657600080fd5b6102cd600160a060020a0360043516602435610a02565b604051901515815260200160405180910390f35b34156102ec57600080fd5b61030167ffffffffffffffff60043516610a85565b60405167ffffffffffffffff9094168452602084019290925260408084019190915290151560608301526080909101905180910390f35b341561034357600080fd5b61034b610aba565b60405190815260200160405180910390f35b341561036857600080fd5b61020c67ffffffffffffffff60043516602435610ac1565b341561038b57600080fd5b6102cd600160a060020a0360043581169060243516604435610b9e565b34156103b357600080fd5b6102cd600160a060020a036004351667ffffffffffffffff60243516610cad565b34156103df57600080fd5b6103e7610ce7565b60405160ff909116815260200160405180910390f35b341561040857600080fd5b61034b600160a060020a036004351667ffffffffffffffff60243516610cec565b341561043457600080fd5b61020c67ffffffffffffffff60043516610f0f565b341561045457600080fd5b61020c600160a060020a0360043516610f6d565b341561047357600080fd5b61020c600160a060020a0360043516602435610fda565b341561049557600080fd5b61020c600160a060020a036004351661103f565b34156104b457600080fd5b6102cd6110a4565b34156104c757600080fd5b6102cd600160a060020a03600435166024356110b4565b34156104e957600080fd5b61034b6111a8565b34156104fc57600080fd5b610510600160a060020a03600435166111ae565b60405192835267ffffffffffffffff90911660208301526040808301919091526060909101905180910390f35b341561054857600080fd5b61034b600160a060020a03600435166111d9565b341561056757600080fd5b61020c6111f4565b341561057a57600080fd5b61020c600435611265565b341561059057600080fd5b61034b67ffffffffffffffff600435166112d3565b34156105b057600080fd5b61020c6113b3565b34156105c357600080fd5b6105cb611413565b60405167ffffffffffffffff909116815260200160405180910390f35b34156105f357600080fd5b61034b600160a060020a036004351660243561142a565b341561061557600080fd5b610234611456565b341561062857600080fd5b61034b600160a060020a036004351661148d565b341561064757600080fd5b61034b6004356024356114b5565b341561066057600080fd5b6102cd600160a060020a03600435166024356114c7565b341561068257600080fd5b61034b600435602435611552565b341561069b57600080fd5b61034b611567565b34156106ae57600080fd5b6102cd60048035600160a060020a03169060248035919060649060443590810190830135806020601f820181900481020160405190810160405281815292919060208401838380828437509496506115ab95505050505050565b341561071357600080fd5b61020c60048035600160a060020a03169060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061162795505050505050565b341561077857600080fd5b61020c600160a060020a036004351661163e565b341561079757600080fd5b6107ab600160a060020a03600435166116a3565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156107ea5780820151838201526020016107d2565b505050509050019250505060405180910390f35b341561080957600080fd5b61034b60043560243561175d565b341561082257600080fd5b61020c600160a060020a0360043516611788565b341561084157600080fd5b6102cd600160a060020a03600435166024356117ed565b341561086357600080fd5b61034b600160a060020a036004358116906024351661188b565b341561088857600080fd5b61034b6004356024356118d1565b34156108a157600080fd5b6102cd60048035600160a060020a03169060248035919060649060443590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506118eb95505050505050565b341561094857600080fd5b61034b611bca565b341561095b57600080fd5b61034b67ffffffffffffffff60043516611bd0565b60025433600160a060020a0390811691161461098b57600080fd5b60055460e060020a900460ff1615156109a357600080fd5b600580547cff0000000000000000000000000000000000000000000000000000000019169055565b60408051908101604052600c81527f42616e6b657220546f6b656e0000000000000000000000000000000000000000602082015281565b60055460009060e060020a900460ff1615610a1c57600080fd5b600160a060020a03338116600081815260096020908152604080832094881680845294909152908190208590557f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b600660205260009081526040902080546001820154600283015460039093015467ffffffffffffffff90921692909160ff1684565b6001545b90565b60055460009060e060020a900460ff1615610adb57600080fd5b60035433600160a060020a03908116911614801590610b09575060025433600160a060020a03908116911614155b15610b1357600080fd5b610b1b611be2565b5067ffffffffffffffff8083166000818152600660205260409020805490921614610b4257fe5b600381015460ff1615610b5157fe5b600181018290556000821115610b8c5767ffffffffffffffff8316600090815260086020526040902054610b86908390611552565b60028201555b600301805460ff191660011790555050565b6000610ba861248e565b60055460e060020a900460ff1615610bbf57600080fd5b600160a060020a0384161515610bd457600080fd5b600160a060020a0380861660009081526009602090815260408083203390941683529290522054831115610c0757600080fd5b610c1084611c05565b15610c3157610c2185858584611c0d565b1515610c2c57600080fd5b610c48565b610c3d85858584611e40565b1515610c4857600080fd5b600160a060020a0380861660009081526009602090815260408083203390941683529290522054610c7990846114b5565b600160a060020a0380871660009081526009602090815260408083203390941683529290522055600191505b509392505050565b600160a060020a038216600090815260076020908152604080832067ffffffffffffffff8516845260020190915290205460ff1692915050565b600881565b6000806000806000806000806000809750600560149054906101000a900467ffffffffffffffff1667ffffffffffffffff168a67ffffffffffffffff161115610d3457600080fd5b600554600160a060020a90910467ffffffffffffffff161015610d5657600080fd5b600160a060020a038b16600090815260076020526040902060038101549097501515610d8157600080fd5b600487015467ffffffffffffffff90811696508a1686901015610da357600080fd5b8594505b8967ffffffffffffffff168567ffffffffffffffff161015610f005767ffffffffffffffff85166000908152600660205260409020600381015490945060ff161515610def57fe5b67ffffffffffffffff8516600090815260028801602052604090205460ff1615610e5057610e4988610e448960010160008967ffffffffffffffff16815260200190815260200160002054876002015461175d565b6118d1565b9750610ef5565b60038701546000935091505b6000821115610ec1576003870180546000198401908110610e7957fe5b6000918252602090912060048204015460039091166008026101000a900467ffffffffffffffff908116915085168111610eb557809250610ec1565b60001990910190610e5c565b610ef288610e448960010160008767ffffffffffffffff16815260200190815260200160002054876002015461175d565b97505b600190940193610da7565b50959998505050505050505050565b60055460e060020a900460ff1615610f2657600080fd5b60045433600160a060020a03908116911614801590610f54575060025433600160a060020a03908116911614155b15610f5e57600080fd5b67ffffffffffffffff16600a55565b60025433600160a060020a03908116911614610f8857600080fd5b610f90611be2565b600254600160a060020a03828116911614610fd2576002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038316179055610fd7565b600080fd5b50565b60055460e060020a900460ff1615610ff157600080fd5b60055433600160a060020a0390811691161480159061101f575060025433600160a060020a03908116911614155b1561102957600080fd5b611031611be2565b61103b8282611f92565b5050565b60025433600160a060020a0390811691161461105a57600080fd5b611062611be2565b600554600160a060020a03828116911614610fd2576005805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038316179055610fd7565b60055460e060020a900460ff1681565b600160a060020a0333811660009081526009602090815260408083209386168352929052908120548083111561111157600160a060020a033381166000908152600960209081526040808320938816835292905290812055611142565b61111b81846114b5565b600160a060020a033381166000908152600960209081526040808320938916835292905220555b600160a060020a0333811660008181526009602090815260408083209489168084529490915290819020547f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925915190815260200160405180910390a35060019392505050565b600a5481565b600760205260009081526040902080546004820154600590920154909167ffffffffffffffff169083565b600160a060020a031660009081526007602052604090205490565b60025433600160a060020a0390811691161461120f57600080fd5b611217611be2565b600030600160a060020a0316311115610fd257600254600160a060020a039081169030163180156108fc0290604051600060405180830381858888f19350505050151561126357600080fd5b565b600080600061127643600b546114b5565b600a5490935083106112cd5761128e83600a54611552565b91508382111561129c578391505b6112ae600b54610e4484600a5461175d565b600b555060005b818110156112cd576112c56121a1565b6001016112b5565b50505050565b60055460009060e060020a900460ff16156112ed57600080fd5b6112f5611be2565b6112ff3383610cec565b33600160a060020a03166000908152600760205260408120600401805467ffffffffffffffff191667ffffffffffffffff86161790559091508111156113ae57600160a060020a03331660009081526007602052604090206005015461136590826118d1565b600160a060020a03331660008181526007602052604090819020600501929092559082156108fc0290839051600060405180830381858888f1935050505015156113ae57600080fd5b919050565b60025433600160a060020a039081169116146113ce57600080fd5b60055460e060020a900460ff16156113e557600080fd5b600580547cff00000000000000000000000000000000000000000000000000000000191660e060020a179055565b60055460a060020a900467ffffffffffffffff1681565b600160a060020a0391909116600090815260076020908152604080832093835260019093019052205490565b60408051908101604052600381527f424e4b0000000000000000000000000000000000000000000000000000000000602082015281565b60006114af82600560149054906101000a900467ffffffffffffffff16610cec565b92915050565b6000828211156114c157fe5b50900390565b60006114d161248e565b8380600160a060020a031633600160a060020a031614156114f157600080fd5b60055460e060020a900460ff161561150857600080fd5b600160a060020a038516151561151d57600080fd5b61152685611c05565b1561153e5761153733868685611c0d565b925061154a565b61153733868685611e40565b505092915050565b6000818381151561155f57fe5b049392505050565b60055460009060e060020a900460ff161561158157600080fd5b611589611be2565b6005546115a69060a060020a900467ffffffffffffffff166112d3565b905090565b60055460009060e060020a900460ff16156115c557600080fd5b8380600160a060020a031633600160a060020a031614156115e557600080fd5b600160a060020a03851615156115fa57600080fd5b61160385611c05565b1561161b5761161433868686611c0d565b9150610ca5565b61161433868686611e40565b60055460e060020a900460ff1615610fd257600080fd5b60025433600160a060020a0390811691161461165957600080fd5b611661611be2565b600454600160a060020a03828116911614610fd2576004805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038316179055610fd7565b6116ab61248e565b6007600083600160a060020a0316600160a060020a0316815260200190815260200160002060030180548060200260200160405190810160405280929190818152602001828054801561175157602002820191906000526020600020906000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff168152602001906008019060208260070104928301926001038202915080841161170c5790505b50505050509050919050565b6000828202831580611779575082848281151561177657fe5b04145b151561178157fe5b9392505050565b60025433600160a060020a039081169116146117a357600080fd5b6117ab611be2565b600354600160a060020a03828116911614610fd2576003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a038316179055610fd7565b600160a060020a03338116600090815260096020908152604080832093861683529290529081205461181f90836118d1565b600160a060020a0333811660008181526009602090815260408083209489168084529490915290819020849055919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591905190815260200160405180910390a350600192915050565b60055460009060e060020a900460ff16156118a557600080fd5b50600160a060020a03918216600090815260096020908152604080832093909416825291909152205490565b600082820183811080159061177957508281101561178157fe5b60055460009060e060020a900460ff161561190557600080fd5b8480600160a060020a031633600160a060020a0316141561192557600080fd5b600160a060020a038616151561193a57600080fd5b61194386611c05565b15611bb257600160a060020a0333166000908152600760205260409020548590101561196e57600080fd5b600160a060020a03861660009081526007602052604090205461199181876118d1565b101561199c57600080fd5b6119a4611be2565b6119ae3386612231565b6119b88686612326565b85600160a060020a03166000846040518082805190602001908083835b602083106119f45780518252601f1990920191602091820191016119d5565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051809103902060e060020a9004903388886040518563ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a03168152602001838152602001828051906020019080838360005b83811015611a85578082015183820152602001611a6d565b50505050905090810190601f168015611ab25780820380516001836020036101000a031916815260200191505b50935050505060006040518083038185885af193505050501515611ad257fe5b85600160a060020a031633600160a060020a03166000805160206124e9833981519152878760405182815260406020820181815290820183818151815260200191508051906020019080838360005b83811015611b39578082015183820152602001611b21565b50505050905090810190601f168015611b665780820380516001836020036101000a031916815260200191505b50935050505060405180910390a385600160a060020a031633600160a060020a03166000805160206125098339815191528760405190815260200160405180910390a360019150611bc1565b611bbe33878787611e40565b91505b50949350505050565b600b5481565b60086020526000908152604090205481565b6000611bf043600b546114b5565b600a549091508110610fd757610fd781612447565b6000903b1190565b600160a060020a038416600090815260076020526040812054819084901015611c3557600080fd5b600160a060020a038516600090815260076020526040902054611c5881866118d1565b1015611c6357600080fd5b611c6b611be2565b611c758685612231565b611c7f8585612326565b5083600160a060020a03811663c0ee0b8a8786866040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611d00578082015183820152602001611ce8565b50505050905090810190601f168015611d2d5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b1515611d4d57600080fd5b5af11515611d5a57600080fd5b50505084600160a060020a031686600160a060020a03166000805160206124e9833981519152868660405182815260406020820181815290820183818151815260200191508051906020019080838360005b83811015611dc4578082015183820152602001611dac565b50505050905090810190601f168015611df15780820380516001836020036101000a031916815260200191505b50935050505060405180910390a384600160a060020a031686600160a060020a03166000805160206125098339815191528660405190815260200160405180910390a350600195945050505050565b600160a060020a03841660009081526007602052604081205483901015611e6657600080fd5b600160a060020a038416600090815260076020526040902054611e8981856118d1565b1015611e9457600080fd5b611e9c611be2565b611ea68584612231565b611eb08484612326565b83600160a060020a031685600160a060020a03166000805160206124e9833981519152858560405182815260406020820181815290820183818151815260200191508051906020019080838360005b83811015611f17578082015183820152602001611eff565b50505050905090810190601f168015611f445780820380516001836020036101000a031916815260200191505b50935050505060405180910390a383600160a060020a031685600160a060020a03166000805160206125098339815191528560405190815260200160405180910390a3506001949350505050565b6000611f9c61248e565b6000831515611faa57600080fd5b611fb6846000546118d1565b9250600154831115611fc757600080fd5b611fd18585612326565b6000839055611fdf85611c05565b156120c3575083600160a060020a03811663c0ee0b8a3386856040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561206557808201518382015260200161204d565b50505050905090810190601f1680156120925780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15156120b257600080fd5b5af115156120bf57600080fd5b5050505b84600160a060020a031633600160a060020a03166000805160206124e9833981519152868560405182815260406020820181815290820183818151815260200191508051906020019080838360005b8381101561212a578082015183820152602001612112565b50505050905090810190601f1680156121575780820380516001836020036101000a031916815260200191505b50935050505060405180910390a384600160a060020a031633600160a060020a03166000805160206125098339815191528660405190815260200160405180910390a35050505050565b600080546005805467ffffffffffffffff60a060020a91829004811685526008602090815260408087209590955583548390048216808752600690915293909420805467ffffffffffffffff1916909317909255805482810484166001019093169091027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600160a060020a038216600090815260076020908152604080832060055460a060020a900467ffffffffffffffff168452600281019092529091205460ff1615156122ec576003810180546001810161228a83826124a0565b50600091825260208083206005805460048504909201805467ffffffffffffffff60039096166008026101000a8681021990911660a060020a9485900487169091021790555404909116825260028301905260409020805460ff191660011790555b80546122f890836114b5565b80825560055460a060020a900467ffffffffffffffff16600090815260019092016020526040909120555050565b600160a060020a038216600090815260076020908152604080832060055460a060020a900467ffffffffffffffff168452600281019092529091205460ff16151561243b5760038101541580156123915750600554600060a060020a90910467ffffffffffffffff16115b156123c55760055460048201805460a060020a90920467ffffffffffffffff1667ffffffffffffffff199092169190911790555b600381018054600181016123d983826124a0565b50600091825260208083206005805460048504909201805467ffffffffffffffff60039096166008026101000a8681021990911660a060020a9485900487169091021790555404909116825260028301905260409020805460ff191660011790555b80546122f890836118d1565b60008061245683600a54611552565b915061246a600b54610e4484600a5461175d565b600b555060005b81811015612489576124816121a1565b600101612471565b505050565b60206040519081016040526000815290565b8154818355818115116124895760008381526020902061248991610abe9160046003928301819004820192860104015b808211156124e457600081556001016124d0565b50905600e19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a723058200de39c798fd5f56c3400ead577732ed81f31812abd4f012b6991853bbe9d062c0029
Verified Source Code Partial Match
Compiler: v0.4.21+commit.dfe3193c
EVM: byzantium
Optimization: Yes (200 runs)
BankeraToken.sol 630 lines
pragma solidity ^0.4.18;
/**
* Math operations with safety checks that throw on error
*/
contract SafeMath {
function safeMul(uint256 a, uint256 b) public pure returns (uint256) {
uint256 c = a * b;
assert(a == 0 || c / a == b);
return c;
}
function safeDiv(uint256 a, uint256 b) public pure returns (uint256) {
//assert(a > 0);// Solidity automatically throws when dividing by 0
//assert(b > 0);// Solidity automatically throws when dividing by 0
// uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return a / b;
}
function safeSub(uint256 a, uint256 b) public pure returns (uint256) {
assert(b <= a);
return a - b;
}
function safeAdd(uint256 a, uint256 b) public pure returns (uint256) {
uint256 c = a + b;
assert(c>=a && c>=b);
return c;
}
}
/*
* ERC20 interface
* see https://github.com/ethereum/EIPs/issues/20
*/
contract ERC20 {
function totalSupply() public constant returns (uint256);
function balanceOf(address _owner) public constant returns (uint256);
function transfer(address _to, uint256 _value) public returns (bool success);
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
function approve(address _spender, uint256 _value) public returns (bool success);
function allowance(address _owner, address _spender) public constant returns (uint256);
/* ERC20 Events */
event Transfer(address indexed _from, address indexed _to, uint256 _value);
event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}
contract ContractReceiver {
function tokenFallback(address _from, uint256 _value, bytes _data) public;
}
contract ERC223 is ERC20 {
function transfer(address _to, uint256 _value, bytes _data) public returns (bool success);
function transfer(address _to, uint256 _value, bytes _data, string _custom_fallback) public returns (bool success);
/* ERC223 Events */
event Transfer(address indexed _from, address indexed _to, uint256 _value, bytes _data);
}
contract BankeraToken is ERC223, SafeMath {
string public constant name = "Banker Token"; // Set the name for display purposes
string public constant symbol = "BNK"; // Set the symbol for display purposes
uint8 public constant decimals = 8; // Amount of decimals for display purposes
uint256 private issued = 0; // tokens count issued to addresses
uint256 private totalTokens = 25000000000 * 100000000; //25,000,000,000.0000 0000 BNK
address private contractOwner;
address private rewardManager;
address private roundManager;
address private issueManager;
uint64 public currentRound = 0;
bool public paused = false;
mapping (uint64 => Reward) public reward; //key - round, value - reward in round
mapping (address => AddressBalanceInfoStructure) public accountBalances; //key - address, value - address balance info
mapping (uint64 => uint256) public issuedTokensInRound; //key - round, value - issued tokens
mapping (address => mapping (address => uint256)) internal allowed;
uint256 public blocksPerRound; // blocks per round
uint256 public lastBlockNumberInRound;
struct Reward {
uint64 roundNumber;
uint256 rewardInWei;
uint256 rewardRate; //reward rate in wei. 1 sBNK - xxx wei
bool isConfigured;
}
struct AddressBalanceInfoStructure {
uint256 addressBalance;
mapping (uint256 => uint256) roundBalanceMap; //key - round number, value - total token amount in round
mapping (uint64 => bool) wasModifiedInRoundMap; //key - round number, value - is modified in round
uint64[] mapKeys; //round balance map keys
uint64 claimedRewardTillRound;
uint256 totalClaimedReward;
}
/* Initializes contract with initial blocks per round number*/
function BankeraToken(uint256 _blocksPerRound, uint64 _round) public {
contractOwner = msg.sender;
lastBlockNumberInRound = block.number;
blocksPerRound = _blocksPerRound;
currentRound = _round;
}
function() public whenNotPaused payable {
}
// Public functions
/**
* @dev Reject all ERC223 compatible tokens
* @param _from address The address that is transferring the tokens
* @param _value uint256 the amount of the specified token
* @param _data Bytes The data passed from the caller.
*/
function tokenFallback(address _from, uint256 _value, bytes _data) public whenNotPaused view {
revert();
}
function setReward(uint64 _roundNumber, uint256 _roundRewardInWei) public whenNotPaused onlyRewardManager {
isNewRound();
Reward storage rewardInfo = reward[_roundNumber];
//validations
assert(rewardInfo.roundNumber == _roundNumber);
assert(!rewardInfo.isConfigured); //allow just not configured reward configuration
rewardInfo.rewardInWei = _roundRewardInWei;
if(_roundRewardInWei > 0){
rewardInfo.rewardRate = safeDiv(_roundRewardInWei, issuedTokensInRound[_roundNumber]);
}
rewardInfo.isConfigured = true;
}
/* Change contract owner */
function changeContractOwner(address _newContractOwner) public onlyContractOwner {
isNewRound();
if (_newContractOwner != contractOwner) {
contractOwner = _newContractOwner;
} else {
revert();
}
}
/* Change reward contract owner */
function changeRewardManager(address _newRewardManager) public onlyContractOwner {
isNewRound();
if (_newRewardManager != rewardManager) {
rewardManager = _newRewardManager;
} else {
revert();
}
}
/* Change round contract owner */
function changeRoundManager(address _newRoundManager) public onlyContractOwner {
isNewRound();
if (_newRoundManager != roundManager) {
roundManager = _newRoundManager;
} else {
revert();
}
}
/* Change issue contract owner */
function changeIssueManager(address _newIssueManager) public onlyContractOwner {
isNewRound();
if (_newIssueManager != issueManager) {
issueManager = _newIssueManager;
} else {
revert();
}
}
function setBlocksPerRound(uint64 _newBlocksPerRound) public whenNotPaused onlyRoundManager {
blocksPerRound = _newBlocksPerRound;
}
/**
* @dev called by the owner to pause, triggers stopped state
*/
function pause() onlyContractOwner whenNotPaused public {
paused = true;
}
/**
* @dev called by the owner to resume, returns to normal state
*/
function resume() onlyContractOwner whenPaused public {
paused = false;
}
/**
*
* permission checker
*/
modifier onlyContractOwner() {
if(msg.sender != contractOwner){
revert();
}
_;
}
/**
* set reward for round (reward admin)
*/
modifier onlyRewardManager() {
if(msg.sender != rewardManager && msg.sender != contractOwner){
revert();
}
_;
}
/**
* adjust round length (round admin)
*/
modifier onlyRoundManager() {
if(msg.sender != roundManager && msg.sender != contractOwner){
revert();
}
_;
}
/**
* issue tokens to ETH addresses (issue admin)
*/
modifier onlyIssueManager() {
if(msg.sender != issueManager && msg.sender != contractOwner){
revert();
}
_;
}
modifier notSelf(address _to) {
if(msg.sender == _to){
revert();
}
_;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*/
modifier whenNotPaused() {
require(!paused);
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*/
modifier whenPaused() {
require(paused);
_;
}
function getRoundBalance(address _address, uint256 _round) public view returns (uint256) {
return accountBalances[_address].roundBalanceMap[_round];
}
function isModifiedInRound(address _address, uint64 _round) public view returns (bool) {
return accountBalances[_address].wasModifiedInRoundMap[_round];
}
function getBalanceModificationRounds(address _address) public view returns (uint64[]) {
return accountBalances[_address].mapKeys;
}
//action for issue tokens
function issueTokens(address _receiver, uint256 _tokenAmount) public whenNotPaused onlyIssueManager {
isNewRound();
issue(_receiver, _tokenAmount);
}
function withdrawEther() public onlyContractOwner {
isNewRound();
if(this.balance > 0) {
contractOwner.transfer(this.balance);
} else {
revert();
}
}
/* Send coins from owner to other address */
/*Override*/
function transfer(address _to, uint256 _value) public notSelf(_to) whenNotPaused returns (bool success){
require(_to != address(0));
//added due to backwards compatibility reasons
bytes memory empty;
if(isContract(_to)) {
return transferToContract(msg.sender, _to, _value, empty);
}
else {
return transferToAddress(msg.sender, _to, _value, empty);
}
}
/*Override*/
function balanceOf(address _owner) public constant returns (uint256 balance) {
return accountBalances[_owner].addressBalance;
}
/*Override*/
function totalSupply() public constant returns (uint256){
return totalTokens;
}
/**
* @dev Transfer tokens from one address to another
* @param _from address The address which you want to send tokens from
* @param _to address The address which you want to transfer to
* @param _value uint256 the amount of tokens to be transferred
*/
/*Override*/
function transferFrom(address _from, address _to, uint256 _value) public whenNotPaused returns (bool) {
require(_to != address(0));
require(_value <= allowed[_from][msg.sender]);
//added due to backwards compatibility reasons
bytes memory empty;
if(isContract(_to)) {
require(transferToContract(_from, _to, _value, empty));
}
else {
require(transferToAddress(_from, _to, _value, empty));
}
allowed[_from][msg.sender] = safeSub(allowed[_from][msg.sender], _value);
return true;
}
/**
* @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
*
* Beware that changing an allowance with this method brings the risk that someone may use both the old
* and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
* race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
* @param _spender The address which will spend the funds.
* @param _value The amount of tokens to be spent.
*/
/*Override*/
function approve(address _spender, uint256 _value) public whenNotPaused returns (bool) {
allowed[msg.sender][_spender] = _value;
Approval(msg.sender, _spender, _value);
return true;
}
/**
* @dev Function to check the amount of tokens that an owner allowed to a spender.
* @param _owner address The address which owns the funds.
* @param _spender address The address which will spend the funds.
* @return A uint256 specifying the amount of tokens still available for the spender.
*/
/*Override*/
function allowance(address _owner, address _spender) public view whenNotPaused returns (uint256) {
return allowed[_owner][_spender];
}
/**
* @dev Increase the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To increment
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _addedValue The amount of tokens to increase the allowance by.
*/
function increaseApproval(address _spender, uint256 _addedValue) public returns (bool) {
allowed[msg.sender][_spender] = safeAdd(allowed[msg.sender][_spender], _addedValue);
Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
/**
* @dev Decrease the amount of tokens that an owner allowed to a spender.
*
* approve should be called when allowed[_spender] == 0. To decrement
* allowed value is better to use this function to avoid 2 calls (and wait until
* the first transaction is mined)
* From MonolithDAO Token.sol
* @param _spender The address which will spend the funds.
* @param _subtractedValue The amount of tokens to decrease the allowance by.
*/
function decreaseApproval(address _spender, uint256 _subtractedValue) public returns (bool) {
uint256 oldValue = allowed[msg.sender][_spender];
if (_subtractedValue > oldValue) {
allowed[msg.sender][_spender] = 0;
} else {
allowed[msg.sender][_spender] = safeSub(oldValue, _subtractedValue);
}
Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
return true;
}
// Function that is called when a user or another contract wants to transfer funds .
/*Override*/
function transfer(address _to, uint256 _value, bytes _data) public whenNotPaused notSelf(_to) returns (bool success){
require(_to != address(0));
if(isContract(_to)) {
return transferToContract(msg.sender, _to, _value, _data);
}
else {
return transferToAddress(msg.sender, _to, _value, _data);
}
}
// Function that is called when a user or another contract wants to transfer funds.
/*Override*/
function transfer(address _to, uint256 _value, bytes _data, string _custom_fallback) public whenNotPaused notSelf(_to) returns (bool success){
require(_to != address(0));
if(isContract(_to)) {
if(accountBalances[msg.sender].addressBalance < _value){ // Check if the sender has enough
revert();
}
if(safeAdd(accountBalances[_to].addressBalance, _value) < accountBalances[_to].addressBalance){ // Check for overflows
revert();
}
isNewRound();
subFromAddressBalancesInfo(msg.sender, _value); // Subtract from the sender
addToAddressBalancesInfo(_to, _value); // Add the same to the recipient
assert(_to.call.value(0)(bytes4(keccak256(_custom_fallback)), msg.sender, _value, _data));
/* Notify anyone listening that this transfer took place */
Transfer(msg.sender, _to, _value, _data);
Transfer(msg.sender, _to, _value);
return true;
}
else {
return transferToAddress(msg.sender, _to, _value, _data);
}
}
function claimReward() public whenNotPaused returns (uint256 rewardAmountInWei) {
isNewRound();
return claimRewardTillRound(currentRound);
}
function claimRewardTillRound(uint64 _claimTillRound) public whenNotPaused returns (uint256 rewardAmountInWei) {
isNewRound();
rewardAmountInWei = calculateClaimableRewardTillRound(msg.sender, _claimTillRound);
accountBalances[msg.sender].claimedRewardTillRound = _claimTillRound;
if (rewardAmountInWei > 0){
accountBalances[msg.sender].totalClaimedReward = safeAdd(accountBalances[msg.sender].totalClaimedReward, rewardAmountInWei);
msg.sender.transfer(rewardAmountInWei);
}
return rewardAmountInWei;
}
function calculateClaimableReward(address _address) public constant returns (uint256 rewardAmountInWei) {
return calculateClaimableRewardTillRound(_address, currentRound);
}
function calculateClaimableRewardTillRound(address _address, uint64 _claimTillRound) public constant returns (uint256) {
uint256 rewardAmountInWei = 0;
if (_claimTillRound > currentRound) { revert(); }
if (currentRound < 1) { revert(); }
AddressBalanceInfoStructure storage accountBalanceInfo = accountBalances[_address];
if(accountBalanceInfo.mapKeys.length == 0){ revert(); }
uint64 userLastClaimedRewardRound = accountBalanceInfo.claimedRewardTillRound;
if (_claimTillRound < userLastClaimedRewardRound) { revert(); }
for (uint64 workRound = userLastClaimedRewardRound; workRound < _claimTillRound; workRound++) {
Reward storage rewardInfo = reward[workRound];
assert(rewardInfo.isConfigured); //don't allow to withdraw reward if affected reward is not configured
if(accountBalanceInfo.wasModifiedInRoundMap[workRound]){
rewardAmountInWei = safeAdd(rewardAmountInWei, safeMul(accountBalanceInfo.roundBalanceMap[workRound], rewardInfo.rewardRate));
} else {
uint64 lastBalanceModifiedRound = 0;
for (uint256 i = accountBalanceInfo.mapKeys.length; i > 0; i--) {
uint64 modificationInRound = accountBalanceInfo.mapKeys[i-1];
if (modificationInRound <= workRound) {
lastBalanceModifiedRound = modificationInRound;
break;
}
}
rewardAmountInWei = safeAdd(rewardAmountInWei, safeMul(accountBalanceInfo.roundBalanceMap[lastBalanceModifiedRound], rewardInfo.rewardRate));
}
}
return rewardAmountInWei;
}
function createRounds(uint256 maxRounds) public {
uint256 blocksAfterLastRound = safeSub(block.number, lastBlockNumberInRound); //current block number - last round block number = blocks after last round
if(blocksAfterLastRound >= blocksPerRound){ // need to increase reward round if blocks after last round is greater or equal blocks per round
uint256 roundsNeedToCreate = safeDiv(blocksAfterLastRound, blocksPerRound); //calculate how many rounds need to create
if(roundsNeedToCreate > maxRounds){
roundsNeedToCreate = maxRounds;
}
lastBlockNumberInRound = safeAdd(lastBlockNumberInRound, safeMul(roundsNeedToCreate, blocksPerRound));
for (uint256 i = 0; i < roundsNeedToCreate; i++) {
updateRoundInformation();
}
}
}
// Private functions
//assemble the given address bytecode. If bytecode exists then the _address is a contract.
function isContract(address _address) private view returns (bool is_contract) {
uint256 length;
assembly {
//retrieve the size of the code on target address, this needs assembly
length := extcodesize(_address)
}
return (length > 0);
}
function isNewRound() private {
uint256 blocksAfterLastRound = safeSub(block.number, lastBlockNumberInRound); //current block number - last round block number = blocks after last round
if(blocksAfterLastRound >= blocksPerRound){ // need to increase reward round if blocks after last round is greater or equal blocks per round
updateRoundsInformation(blocksAfterLastRound);
}
}
function updateRoundsInformation(uint256 _blocksAfterLastRound) private {
uint256 roundsNeedToCreate = safeDiv(_blocksAfterLastRound, blocksPerRound); //calculate how many rounds need to create
lastBlockNumberInRound = safeAdd(lastBlockNumberInRound, safeMul(roundsNeedToCreate, blocksPerRound)); //calculate last round creation block number
for (uint256 i = 0; i < roundsNeedToCreate; i++) {
updateRoundInformation();
}
}
function updateRoundInformation() private {
issuedTokensInRound[currentRound] = issued;
Reward storage rewardInfo = reward[currentRound];
rewardInfo.roundNumber = currentRound;
currentRound = currentRound + 1;
}
function issue(address _receiver, uint256 _tokenAmount) private {
if(_tokenAmount == 0){
revert();
}
uint256 newIssuedAmount = safeAdd(_tokenAmount, issued);
if(newIssuedAmount > totalTokens){
revert();
}
addToAddressBalancesInfo(_receiver, _tokenAmount);
issued = newIssuedAmount;
bytes memory empty;
if(isContract(_receiver)) {
ContractReceiver receiverContract = ContractReceiver(_receiver);
receiverContract.tokenFallback(msg.sender, _tokenAmount, empty);
}
/* Notify anyone listening that this transfer took place */
Transfer(msg.sender, _receiver, _tokenAmount, empty);
Transfer(msg.sender, _receiver, _tokenAmount);
}
function addToAddressBalancesInfo(address _receiver, uint256 _tokenAmount) private {
AddressBalanceInfoStructure storage accountBalance = accountBalances[_receiver];
if(!accountBalance.wasModifiedInRoundMap[currentRound]){ //allow just push one time per round
// If user first time get update balance set user claimed reward round to round before.
if(accountBalance.mapKeys.length == 0 && currentRound > 0){
accountBalance.claimedRewardTillRound = currentRound;
}
accountBalance.mapKeys.push(currentRound);
accountBalance.wasModifiedInRoundMap[currentRound] = true;
}
accountBalance.addressBalance = safeAdd(accountBalance.addressBalance, _tokenAmount);
accountBalance.roundBalanceMap[currentRound] = accountBalance.addressBalance;
}
function subFromAddressBalancesInfo(address _adr, uint256 _tokenAmount) private {
AddressBalanceInfoStructure storage accountBalance = accountBalances[_adr];
if(!accountBalance.wasModifiedInRoundMap[currentRound]){ //allow just push one time per round
accountBalance.mapKeys.push(currentRound);
accountBalance.wasModifiedInRoundMap[currentRound] = true;
}
accountBalance.addressBalance = safeSub(accountBalance.addressBalance, _tokenAmount);
accountBalance.roundBalanceMap[currentRound] = accountBalance.addressBalance;
}
//function that is called when transaction target is an address
function transferToAddress(address _from, address _to, uint256 _value, bytes _data) private returns (bool success) {
if(accountBalances[_from].addressBalance < _value){ // Check if the sender has enough
revert();
}
if(safeAdd(accountBalances[_to].addressBalance, _value) < accountBalances[_to].addressBalance){ // Check for overflows
revert();
}
isNewRound();
subFromAddressBalancesInfo(_from, _value); // Subtract from the sender
addToAddressBalancesInfo(_to, _value); // Add the same to the recipient
/* Notify anyone listening that this transfer took place */
Transfer(_from, _to, _value, _data);
Transfer(_from, _to, _value);
return true;
}
//function that is called when transaction target is a contract
function transferToContract(address _from, address _to, uint256 _value, bytes _data) private returns (bool success) {
if(accountBalances[_from].addressBalance < _value){ // Check if the sender has enough
revert();
}
if(safeAdd(accountBalances[_to].addressBalance, _value) < accountBalances[_to].addressBalance){ // Check for overflows
revert();
}
isNewRound();
subFromAddressBalancesInfo(_from, _value); // Subtract from the sender
addToAddressBalancesInfo(_to, _value); // Add the same to the recipient
ContractReceiver receiver = ContractReceiver(_to);
receiver.tokenFallback(_from, _value, _data);
/* Notify anyone listening that this transfer took place */
Transfer(_from, _to, _value, _data);
Transfer(_from, _to, _value);
return true;
}
}
Read Contract
accountBalances 0x6ff96d17 → uint256, uint64, uint256
allowance 0xdd62ed3e → uint256
balanceOf 0x70a08231 → uint256
blocksPerRound 0x6e4ed796 → uint256
calculateClaimableReward 0x9d130343 → uint256
calculateClaimableRewardTillRound 0x3284b3e2 → uint256
currentRound 0x8a19c8bc → uint64
decimals 0x313ce567 → uint8
getBalanceModificationRounds 0xc7b23561 → uint64[]
getRoundBalance 0x8b39d181 → uint256
isModifiedInRound 0x2e12e6a1 → bool
issuedTokensInRound 0xf9368e7a → uint256
lastBlockNumberInRound 0xf6ba13a5 → uint256
name 0x06fdde03 → string
paused 0x5c975abb → bool
reward 0x11fe7e43 → uint64, uint256, uint256, bool
safeAdd 0xe6cb9013 → uint256
safeDiv 0xb5931f7c → uint256
safeMul 0xd05c78da → uint256
safeSub 0xa293d1e8 → uint256
symbol 0x95d89b41 → string
tokenFallback 0xc0ee0b8a
totalSupply 0x18160ddd → uint256
Write Contract 20 functions
These functions modify contract state and require a wallet transaction to execute.
approve 0x095ea7b3
address _spender
uint256 _value
returns: bool
changeContractOwner 0x3ead67b5
address _newContractOwner
changeIssueManager 0x522e35fb
address _newIssueManager
changeRewardManager 0xd2631e42
address _newRewardManager
changeRoundManager 0xc38e650f
address _newRoundManager
claimReward 0xb88a802f
No parameters
returns: uint256
claimRewardTillRound 0x7af05516
uint64 _claimTillRound
returns: uint256
createRounds 0x76323253
uint256 maxRounds
decreaseApproval 0x66188463
address _spender
uint256 _subtractedValue
returns: bool
increaseApproval 0xd73dd623
address _spender
uint256 _addedValue
returns: bool
issueTokens 0x475a9fa9
address _receiver
uint256 _tokenAmount
pause 0x8456cb59
No parameters
resume 0x046f7da2
No parameters
setBlocksPerRound 0x3c9c97f0
uint64 _newBlocksPerRound
setReward 0x205360e0
uint64 _roundNumber
uint256 _roundRewardInWei
transfer 0xa9059cbb
address _to
uint256 _value
returns: bool
transfer 0xbe45fd62
address _to
uint256 _value
bytes _data
returns: bool
transfer 0xf6368f8a
address _to
uint256 _value
bytes _data
string _custom_fallback
returns: bool
transferFrom 0x23b872dd
address _from
address _to
uint256 _value
returns: bool
withdrawEther 0x7362377b
No parameters
Token Balances (1)
View Transfers →Recent Transactions
No transactions found for this address