ERC-20
Source Code
Overview
Max Total Supply
156,852,447.959188553626084366 FFC
Holders
6,784
Market
Onchain Market Cap
-
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
| # | Exchange | Pair | Price | 24H Volume | % Volume |
|---|
Contract Name:
BwinToken
Compiler Version
v0.4.21+commit.dfe3193c
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2018-04-03
*/
pragma solidity ^0.4.13;
contract ERC20Basic {
function totalSupply() public view returns (uint256);
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
contract ERC20 is ERC20Basic {
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
contract ContractReceiver {
struct TKN {
address sender;
uint value;
bytes data;
bytes4 sig;
}
function tokenFallback(address _from, uint _value, bytes _data) public pure {
TKN memory tkn;
tkn.sender = _from;
tkn.value = _value;
tkn.data = _data;
uint32 u = uint32(_data[3]) + (uint32(_data[2]) << 8) + (uint32(_data[1]) << 16) + (uint32(_data[0]) << 24);
tkn.sig = bytes4(u);
/* tkn variable is analogue of msg variable of Ether transaction
* tkn.sender is person who initiated this token transaction (analogue of msg.sender)
* tkn.value the number of tokens that were sent (analogue of msg.value)
* tkn.data is data of token transaction (analogue of msg.data)
* tkn.sig is 4 bytes signature of function
* if data of token transaction is a function execution
*/
}
}
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
function Ownable() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
contract CrowdsaleFront is Ownable{
//Crowdsale public provider;
using SafeMath for uint256;
mapping (address => uint256) internal userAmounts;
mapping (address => uint256) internal rewardPayed;
BwinCommons internal commons;
function setCommons(address _addr) public onlyOwner {
commons = BwinCommons(_addr);
}
// fallback function can be used to buy tokens
function () public payable {
buyTokens(msg.sender, 0, 999);
}
// low level token purchase function
function buyTokens(address beneficiary, address _parent, uint256 _top) public payable returns(bool){
bool ret;
uint256 tokens;
(ret, tokens) = Crowdsale(commons.get("Crowdsale")).buyTokens.value(msg.value)(beneficiary, beneficiary, _parent, _top);
userAmounts[beneficiary] = userAmounts[beneficiary].add(tokens);
require(ret);
}
function getTokensFromBuy(address _addr) public view returns (uint256){
return userAmounts[_addr];
}
function rewardPayedOf(address _user) public view returns (uint256) {
return rewardPayed[_user];
}
function rewardPay(address _user, uint256 amount) public {
require(msg.sender == commons.get("Crowdsale"));
rewardPayed[_user] = rewardPayed[_user].add(amount);
}
// @return true if crowdsale event has ended
function hasEnded() public view returns (bool){
return Crowdsale(commons.get("Crowdsale")).hasEnded();
}
}
contract InterestHolder is Ownable{
using SafeMath for uint256;
BwinCommons internal commons;
function setCommons(address _addr) public onlyOwner {
commons = BwinCommons(_addr);
}
bool public locked = true;
event ReceiveBalanceUpdate(address _addr,address _user);
event ReceiveBalanceUpdateUserType(address _addr,address _user,uint256 _type);
function receiveBalanceUpdate(address _user) external returns (bool) {
emit ReceiveBalanceUpdate(msg.sender, _user);
Token token = Token(commons.get("Token"));
User user = User(commons.get("User"));
if (msg.sender == address(token)){
uint256 _type;
(,,_type) = user.getUserInfo(_user);
emit ReceiveBalanceUpdateUserType(msg.sender, _user, _type);
if (_type == 0){
return true;
}
process(_user,_type);
return true;
}
return false;
}
event ProcessLx(address _addr,address _user, uint256 _type,uint256 lastBalance, uint256 iAmount, uint256 lastTime);
function process(address _user, uint256 _type) internal{
Token token = Token(commons.get("Token"));
User user = User(commons.get("User"));
uint256 _value = compute(_user, _type);
uint256 balance = token.balanceOf(_user);
user.setInterestor(_user,balance.add(_value),now);
if(_value > 0){
token.mintForWorker(_user,_value);
emit ProcessLx(msg.sender, _user, _type, balance, _value, now);
}
}
event GetLx(address _addr,address _user,uint256 _type);
function compute(address _user, uint256 _type) internal view returns (uint256) {
User user = User(commons.get("User"));
uint256 lastBalance = 0;
uint256 lastTime = 0;
bool exist;
(lastBalance,lastTime,exist) = user.getInterestor(_user);
uint256 _value = 0;
if (exist && lastTime > 0){
uint256 times = now.sub(lastTime);
if (_type == 1){
_value = lastBalance.div(10000).mul(5).div(86400).mul(times);
}else if(_type == 2){
_value = lastBalance.div(10000).mul(8).div(86400).mul(times);
}
}
return _value;
}
function getLx() external returns (uint256) {
User user = User(commons.get("User"));
uint256 _type;
(,,_type) = user.getUserInfo(msg.sender);
emit GetLx(msg.sender, msg.sender, _type);
if (_type == 0){
return 0;
}
return compute(msg.sender, _type);
}
}
contract TokenHolder is Ownable{
using SafeMath for uint256;
BwinCommons internal commons;
function setCommons(address _addr) public onlyOwner {
commons = BwinCommons(_addr);
}
bool locked = true;
mapping (address => uint256) lockedAmount;
event ReceiveLockedAmount(address _addr, address _user, uint256 _amount);
function receiveLockedAmount(address _user, uint256 _amount) external returns (bool) {
address cds = commons.get("Crowdsale");
if (msg.sender == address(cds)){
lockedAmount[_user] = lockedAmount[_user].add(_amount);
emit ReceiveLockedAmount(msg.sender, _user, _amount);
return true;
}
return false;
}
function balanceOf(address _user) public view returns (uint256) {
return lockedAmount[_user];
}
function balance() public view returns (uint256) {
return lockedAmount[msg.sender];
}
function setLock(bool _locked) public onlyOwner{
locked = _locked;
}
function withDrawlocked() public view returns (bool) {
return locked;
}
function withDrawable() public view returns (bool) {
User user = User(commons.get("User"));
uint256 _type;
(,,_type) = user.getUserInfo(msg.sender);
return !locked && (_type > 0) && lockedAmount[msg.sender] > 0;
}
function withDraw() external {
assert(!locked);//用户必须是种子钱包
BwinToken token = BwinToken(commons.get("BwinToken"));
User user = User(commons.get("User"));
uint256 _type;
(,,_type) = user.getUserInfo(msg.sender);
assert(_type > 0);
uint _value = lockedAmount[msg.sender];
lockedAmount[msg.sender] = 0;
token.transfer(msg.sender,_value);
}
}
contract Destructible is Ownable {
function Destructible() public payable { }
/**
* @dev Transfers the current balance to the owner and terminates the contract.
*/
function destroy() onlyOwner public {
selfdestruct(owner);
}
function destroyAndSend(address _recipient) onlyOwner public {
selfdestruct(_recipient);
}
}
contract EtherHolder is Destructible{
using SafeMath for uint256;
bool locked = false;
BwinCommons internal commons;
function setCommons(address _addr) public onlyOwner {
commons = BwinCommons(_addr);
}
struct Account {
address wallet;
address parent;
uint256 radio;
bool exist;
}
mapping (address => uint256) private userAmounts;
uint256 internal _balance;
event ProcessFunds(address _topWallet, uint256 _value ,bool isContract);
event ReceiveFunds(address _addr, address _user, uint256 _value, uint256 _amount);
function receiveFunds(address _user, uint256 _amount) external payable returns (bool) {
emit ReceiveFunds(msg.sender, _user, msg.value, _amount);
Crowdsale cds = Crowdsale(commons.get("Crowdsale"));
User user = User(commons.get("User"));
assert(msg.value == _amount);
if (msg.sender == address(cds)){
address _topWallet;
uint _percent=0;
bool _contract;
uint256 _topValue = 0;
bool _topOk;
uint256 _totalShares = 0;
uint256 _totalSharePercent = 0;
bool _shareRet;
if(user.hasUser(_user)){
(_topWallet,_percent,_contract) = user.getTopInfoDetail(_user);
assert(_percent <= 1000);
(_topValue,_topOk) = processFunds(_topWallet,_amount,_percent,_contract);
}else{
_topOk = true;
}
(_totalShares,_totalSharePercent,_shareRet) = processShares(_amount.sub(_topValue));
assert(_topOk && _shareRet);
assert(_topValue.add(_totalShares) <= _amount);
assert(_totalSharePercent <= 1000);
_balance = _balance.add(_amount);
return true;
}
return false;
}
event ProcessShares(uint256 _amount, uint i, uint256 _percent, bool _contract,address _wallet);
function processShares(uint256 _amount) internal returns(uint256,uint256,bool){
uint256 _sended = 0;
uint256 _sharePercent = 0;
User user = User(commons.get("User"));
for(uint i=0;i<user.getShareHolderCount();i++){
address _wallet;
uint256 _percent;
bool _contract;
emit ProcessShares(_amount, i, _percent, _contract,_wallet);
assert(_percent <= 1000);
(_wallet,_percent,_contract) = user.getShareHolder(i);
uint256 _value;
bool _valueOk;
(_value,_valueOk) = processFunds(_wallet,_amount,_percent,_contract);
_sharePercent = _sharePercent.add(_percent);
_sended = _sended.add(_value);
}
return (_sended,_sharePercent,true);
}
function getAmount(uint256 _amount, uint256 _percent) internal pure returns(uint256){
uint256 _value = _amount.div(1000).mul(_percent);
return _value;
}
function processFunds(address _topWallet, uint256 _amount ,uint256 _percent, bool isContract) internal returns(uint,bool) {
uint256 _value = getAmount(_amount, _percent);
userAmounts[_topWallet] = userAmounts[_topWallet].add(_value);
emit ProcessFunds(_topWallet,_value,isContract);
return (_value,true);
}
function balanceOf(address _user) public view returns (uint256) {
return userAmounts[_user];
}
function balanceOfme() public view returns (uint256) {
return userAmounts[msg.sender];
}
function withDrawlocked() public view returns (bool) {
return locked;
}
function getBalance() public view returns (uint256, uint256) {
return (address(this).balance,_balance);
}
function lock(bool _locked) public onlyOwner{
locked = _locked;
}
event WithDraw(address caller, uint256 _amount);
function withDraw(uint256 _amount) external {
assert(!locked);
assert(userAmounts[msg.sender] >= _amount);
userAmounts[msg.sender] = userAmounts[msg.sender].sub(_amount);
_balance = _balance.sub(_amount);
msg.sender.transfer(_amount);
emit WithDraw(msg.sender, _amount);
}
function destroy() onlyOwner public {
selfdestruct(owner);
}
}
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
uint256 c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// 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 c;
}
/**
* @dev Substracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
contract RBAC {
using Roles for Roles.Role;
mapping (string => Roles.Role) private roles;
event RoleAdded(address addr, string roleName);
event RoleRemoved(address addr, string roleName);
/**
* A constant role name for indicating admins.
*/
string public constant ROLE_ADMIN = "admin";
/**
* @dev constructor. Sets msg.sender as admin by default
*/
function RBAC()
public
{
addRole(msg.sender, ROLE_ADMIN);
}
/**
* @dev reverts if addr does not have role
* @param addr address
* @param roleName the name of the role
* // reverts
*/
function checkRole(address addr, string roleName)
view
public
{
roles[roleName].check(addr);
}
/**
* @dev determine if addr has role
* @param addr address
* @param roleName the name of the role
* @return bool
*/
function hasRole(address addr, string roleName)
view
public
returns (bool)
{
return roles[roleName].has(addr);
}
/**
* @dev add a role to an address
* @param addr address
* @param roleName the name of the role
*/
function adminAddRole(address addr, string roleName)
onlyAdmin
public
{
addRole(addr, roleName);
}
/**
* @dev remove a role from an address
* @param addr address
* @param roleName the name of the role
*/
function adminRemoveRole(address addr, string roleName)
onlyAdmin
public
{
removeRole(addr, roleName);
}
/**
* @dev add a role to an address
* @param addr address
* @param roleName the name of the role
*/
function addRole(address addr, string roleName)
internal
{
roles[roleName].add(addr);
emit RoleAdded(addr, roleName);
}
/**
* @dev remove a role from an address
* @param addr address
* @param roleName the name of the role
*/
function removeRole(address addr, string roleName)
internal
{
roles[roleName].remove(addr);
emit RoleRemoved(addr, roleName);
}
/**
* @dev modifier to scope access to a single role (uses msg.sender as addr)
* @param roleName the name of the role
* // reverts
*/
modifier onlyRole(string roleName)
{
checkRole(msg.sender, roleName);
_;
}
/**
* @dev modifier to scope access to admins
* // reverts
*/
modifier onlyAdmin()
{
checkRole(msg.sender, ROLE_ADMIN);
_;
}
/**
* @dev modifier to scope access to a set of roles (uses msg.sender as addr)
* @param roleNames the names of the roles to scope access to
* // reverts
*
* @TODO - when solidity supports dynamic arrays as arguments to modifiers, provide this
* see: https://github.com/ethereum/solidity/issues/2467
*/
// modifier onlyRoles(string[] roleNames) {
// bool hasAnyRole = false;
// for (uint8 i = 0; i < roleNames.length; i++) {
// if (hasRole(msg.sender, roleNames[i])) {
// hasAnyRole = true;
// break;
// }
// }
// require(hasAnyRole);
// _;
// }
}
contract BwinCommons is RBAC, Destructible {
mapping (string => address) internal addresses;
mapping (address => string) internal names;
event UpdateRegistration(string key, address old, address n);
function register(string key, address ad) public onlyAdmin {
emit UpdateRegistration(key, addresses[key], ad);
addresses[key] = ad;
names[ad] = key;
}
function get(string key) public view returns(address) {
return addresses[key];
}
function remove() public {
string memory key = names[msg.sender];
delete addresses[key];
delete names[msg.sender];
}
}
contract User is RBAC ,Destructible{
struct UserInfo {
//推荐人
address parent;
uint256 top;
bool exist;
uint256 userType;
}
struct Partner {
address addr;
uint256 percent;
bool exist;
bool iscontract;
}
struct UserBalance{
address user;
uint256 balance;
uint256 lastTime;
bool exist;
}
mapping (address => UserBalance) internal balanceForInterests;
uint256[] internal tops;
mapping (uint256 => Partner) internal topDefine;
uint256[] internal shareHolders;
mapping (uint256 => Partner) internal shareHolderInfos;
mapping (address => UserInfo) internal tree;
BwinCommons internal commons;
function setCommons(address _addr) public onlyAdmin {
commons = BwinCommons(_addr);
}
address[] internal users;
event SetInterestor(address caller, address _user, uint256 _balance, uint256 _lastTime);
event SetShareHolders(address caller, uint256 topId, address _topAddr, uint256 _percent, bool iscontract);
event SetTop(address caller, uint256 topId, address _topAddr, uint256 _percent, bool iscontract);
event AddUser(address caller, address _parent, uint256 _top);
event SetUser(address caller, address _user, address _parent, uint256 _top, uint256 _type);
event SetUserType(address caller, address _user, uint _type);
event RemoveUser(address caller, uint _index);
function setInterestor(address _user, uint256 _balance, uint256 _lastTime) public onlyRole("INTEREST_HOLDER"){
balanceForInterests[_user] = UserBalance(_user,_balance,_lastTime,true);
emit SetInterestor(msg.sender,_user,_balance,_lastTime);
}
function getInterestor(address _user) public view returns(uint256,uint256,bool){
return (balanceForInterests[_user].balance,balanceForInterests[_user].lastTime,balanceForInterests[_user].exist);
}
function setShareHolders(uint256 topId, address _topAddr, uint256 _percent, bool iscontract) public onlyAdmin {
if (!shareHolderInfos[topId].exist){
shareHolders.push(topId);
}
shareHolderInfos[topId] = Partner(_topAddr, _percent, true, iscontract);
emit SetShareHolders(msg.sender,topId,_topAddr,_percent,iscontract);
}
function getShareHolder(uint256 _index) public view returns(address, uint256, bool){
uint256 shareHolderId = shareHolders[_index];
return getShareHoldersInfo(shareHolderId);
}
function getShareHolderCount() public view returns(uint256){
return shareHolders.length;
}
function getShareHoldersInfo(uint256 shareHolderId) public view returns(address, uint256, bool){
return (shareHolderInfos[shareHolderId].addr, shareHolderInfos[shareHolderId].percent, shareHolderInfos[shareHolderId].iscontract);
}
function setTop(uint256 topId, address _topAddr, uint256 _percent, bool iscontract) public onlyAdmin {
if (!topDefine[topId].exist){
tops.push(topId);
}
topDefine[topId] = Partner(_topAddr, _percent, true, iscontract);
emit SetTop(msg.sender, topId, _topAddr, _percent, iscontract);
}
function getTopInfoDetail(address _user) public view returns(address, uint256, bool){
uint256 _topId;
address _wallet;
uint256 _percent;
bool _contract;
(,_topId,) = getUserInfo(_user);
(_wallet,_percent,_contract) = getTopInfo(_topId);
return (_wallet,_percent,_contract);
}
function getTopInfo(uint256 topId) public view returns(address, uint256, bool){
return (topDefine[topId].addr, topDefine[topId].percent, topDefine[topId].iscontract);
}
function addUser(address _parent, uint256 _top) public {
require(msg.sender != _parent);
if (_parent != address(0)) {
require(tree[_parent].exist);
}
require(!hasUser(msg.sender));
tree[msg.sender] = UserInfo(_parent, _top, true, 0);
users.push(msg.sender);
emit AddUser(msg.sender, _parent, _top);
}
function getUsersCount() public view returns(uint) {
return users.length;
}
function getUserInfo(address _user) public view returns(address, uint256, uint256) {
return (tree[_user].parent, tree[_user].top, tree[_user].userType);
}
function hasUser(address _user) public view returns(bool) {
return tree[_user].exist;
}
function setUser(address _user, address _parent, uint256 _top, uint256 _type) public onlyAdmin {
if(!tree[_user].exist){
users.push(_user);
}
tree[_user] = UserInfo(_parent, _top, true, _type);
emit SetUser(msg.sender, _user, _parent, _top, _type);
}
function setUserType(address _user, uint _type) public onlyAdmin {
require(hasUser(_user));
tree[_user].userType = _type;
emit SetUserType(msg.sender, _user, _type);
}
function indexOfUserInfo(uint _index) public view returns (address) {
return users[_index];
}
function removeUser(uint _index) public onlyAdmin {
address _user = indexOfUserInfo(_index);
delete users[_index];
delete tree[_user];
emit RemoveUser(msg.sender, _index);
}
}
contract Pausable is RBAC {
event Pause();
event Unpause();
bool public paused = false;
/**
* @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);
_;
}
/**
* @dev called by the owner to pause, triggers stopped state
*/
function pause() onlyAdmin whenNotPaused public {
paused = true;
emit Pause();
}
/**
* @dev called by the owner to unpause, returns to normal state
*/
function unpause() onlyAdmin whenPaused public {
paused = false;
emit Unpause();
}
}
contract BwinToken is ERC20, Pausable, Destructible{
//Token t;
BwinCommons internal commons;
function setCommons(address _addr) public onlyOwner {
commons = BwinCommons(_addr);
}
string public constant name = "FFgame Coin";
string public constant symbol = "FFC";
uint8 public constant decimals = 18;
event Transfer(address indexed from, address indexed to, uint256 value);
function BwinToken() public {
addRole(msg.sender, ROLE_ADMIN);
}
function totalSupply() public view returns (uint256){
Token t = Token(commons.get("Token"));
return t.totalSupply();
}
function balanceOf(address who) public view returns (uint256){
Token t = Token(commons.get("Token"));
return t.balanceOf(who);
}
function transfer(address to, uint256 value) public returns (bool){
bytes memory empty;
Token t = Token(commons.get("Token"));
if(t.transfer(msg.sender, to, value,empty)){
emit Transfer(msg.sender, to, value);
return true;
}
return false;
}
function allowance(address owner, address spender) public view returns (uint256){
Token t = Token(commons.get("Token"));
return t.allowance(owner, spender);
}
function transferFrom(address from, address to, uint256 value) public returns (bool){
Token t = Token(commons.get("Token"));
if(t._transferFrom(msg.sender, from, to, value)){
emit Transfer(from, to, value);
return true;
}
return false;
}
function approve(address spender, uint256 value) public returns (bool){
Token t = Token(commons.get("Token"));
if (t._approve(msg.sender, spender, value)){
emit Approval(msg.sender, spender, value);
return true;
}
return false;
}
function increaseApproval(address _spender, uint _addedValue) public whenNotPaused returns (bool success) {
Token t = Token(commons.get("Token"));
if(t._increaseApproval(msg.sender, _spender, _addedValue)){
emit Approval(msg.sender, _spender, _addedValue);
return true;
}
return false;
}
function decreaseApproval(address _spender, uint _subtractedValue) public whenNotPaused returns (bool success) {
Token t = Token(commons.get("Token"));
if (t._decreaseApproval(msg.sender,_spender, _subtractedValue)){
emit Approval(msg.sender, _spender, _subtractedValue);
return true;
}
return false;
}
event Approval(address indexed owner, address indexed spender, uint256 value);
}
contract Token is RBAC, Pausable{
using SafeMath for uint256;
BwinCommons internal commons;
function setCommons(address _addr) public onlyAdmin {
commons = BwinCommons(_addr);
}
event TokenApproval(address indexed owner, address indexed spender, uint256 value);
event TokenTransfer(address indexed from, address indexed to, uint256 value);
event MintForSale(address indexed to, uint256 amount);
event MintForWorker(address indexed to, uint256 amount);
event MintForUnlock(address indexed to, uint256 amount);
function Token() public {
addRole(msg.sender, ROLE_ADMIN);
}
function totalSupply() public view returns (uint256) {
TokenData td = TokenData(commons.get("TokenData"));
return td.totalSupply();
}
function balanceOf(address _owner) public view returns (uint256) {
TokenData td = TokenData(commons.get("TokenData"));
return td.balanceOf(_owner);
}
function _transferFrom(address _sender, address _from, address _to, uint256 _value) external whenNotPaused onlyRole("FRONT_TOKEN_USER") returns (bool) {
InterestHolder ih = InterestHolder(commons.get("InterestHolder"));
TokenData td = TokenData(commons.get("TokenData"));
uint256 _balanceFrom = balanceOf(_from);
uint256 _balanceTo = balanceOf(_to);
uint256 _allow = allowance(_from, _sender);
require(_from != address(0));
require(_sender != address(0));
require(_to != address(0));
require(_value <= _balanceFrom);
require(_value <= _allow);
td.setBalance(_from,_balanceFrom.sub(_value));
td.setBalance(_to,_balanceTo.add(_value));
td.setAllowance(_from, _sender, _allow.sub(_value));
if(ih != address(0)){
ih.receiveBalanceUpdate(_from);
ih.receiveBalanceUpdate(_to);
}
emit TokenTransfer(_from, _to, _value);
return true;
}
function allowance(address _owner, address _spender) public view returns (uint256) {
TokenData td = TokenData(commons.get("TokenData"));
return td.allowance(_owner,_spender);
}
function _approve(address _sender, address _spender, uint256 _value) public onlyRole("FRONT_TOKEN_USER") whenNotPaused returns (bool) {
TokenData td = TokenData(commons.get("TokenData"));
return td.setAllowance(_sender, _spender, _value);
}
function _increaseApproval(address _sender, address _spender, uint _addedValue) public onlyRole("FRONT_TOKEN_USER") whenNotPaused returns (bool) {
TokenData td = TokenData(commons.get("TokenData"));
td.setAllowance(_sender, _spender, allowance(_sender, _spender).add(_addedValue));
emit TokenApproval(_sender, _spender, allowance(_sender, _spender));
return true;
}
function _decreaseApproval(address _sender, address _spender, uint _subtractedValue) public onlyRole("FRONT_TOKEN_USER") whenNotPaused returns (bool) {
TokenData td = TokenData(commons.get("TokenData"));
uint oldValue = allowance(_sender, _spender);
if (_subtractedValue > oldValue) {
td.setAllowance(_sender, _spender, 0);
//allowed[msg.sender][_spender] = 0;
} else {
td.setAllowance(_sender, _spender, oldValue.sub(_subtractedValue));
//allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
}
emit TokenApproval(_sender, _spender, allowance(_sender, _spender));
return true;
}
function unlockAmount(address _to, uint256 _amount) external onlyAdmin returns (bool){
TokenData td = TokenData(commons.get("TokenData"));
require(td.totalSupply().add(_amount) <= td.TotalCapacity());
uint256 unlockedAmount = td.valueOf("unlockedAmount");
if(_mint(_to, _amount)){
td.setValue("unlockedAmount",unlockedAmount.add(_amount));
emit MintForUnlock(_to, _amount);
return true;
}
return false;
}
function _mint(address _to, uint256 _amount) internal returns (bool) {
TokenData td = TokenData(commons.get("TokenData"));
InterestHolder ih = InterestHolder(commons.get("InterestHolder"));
require(_to != address(0));
require(_amount > 0);
uint256 totalMinted = td.valueOf("totalMinted");
td.setTotal(td.totalSupply().add(_amount));
td.setBalance(_to,balanceOf(_to).add(_amount));
td.setValue("totalMinted",totalMinted.add(_amount));
if(address(ih) != address(0)){
ih.receiveBalanceUpdate(_to);
}
return true;
}
function mintForSale(address _to, uint256 _amount) external onlyRole("TOKEN_SALE") whenNotPaused returns (bool) {
TokenData td = TokenData(commons.get("TokenData"));
require(td.totalSupply().add(_amount) <= td.TotalCapacity());
uint256 saledAmount = td.valueOf("saledAmount");
if(_mint(_to, _amount)){
td.setValue("saledAmount",saledAmount.add(_amount));
emit MintForSale(_to, _amount);
return true;
}
return false;
}
function mintForWorker(address _to, uint256 _amount) external onlyRole("TOKEN_WORKER") whenNotPaused returns (bool) {
TokenData td = TokenData(commons.get("TokenData"));
require(td.totalSupply().add(_amount) <= td.TotalCapacity());
uint256 minedAmount = td.valueOf("minedAmount");
if(_mint(_to, _amount)){
td.setValue("minedAmount",minedAmount.add(_amount));
emit MintForWorker(_to, _amount);
return true;
}
return false;
}
function transfer(address _from, address _to, uint _value, bytes _data) external whenNotPaused onlyRole("FRONT_TOKEN_USER") returns (bool success) {
if (isContract(_to)) {
return transferToContract(_from, _to, _value, _data);
}else {
return transferToAddress(_from, _to, _value);
}
}
//assemble the given address bytecode. If bytecode exists then the _addr is a contract.
function isContract(address _addr) internal view returns (bool) {
uint length;
assembly {
//retrieve the size of the code on target address, this needs assembly
length := extcodesize(_addr)
}
return (length > 0);
}
function _transfer(address _from, address _to, uint256 _value) internal returns (bool) {
TokenData td = TokenData(commons.get("TokenData"));
InterestHolder ih = InterestHolder(commons.get("InterestHolder"));
require(_to != address(0));
require(_value <= balanceOf(_from));
td.setBalance(_from,balanceOf(_from).sub(_value));
td.setBalance(_to,balanceOf(_to).add(_value));
if(ih != address(0)){
ih.receiveBalanceUpdate(_from);
ih.receiveBalanceUpdate(_to);
}
emit TokenTransfer(_from, _to, _value);
return true;
}
//function that is called when transaction target is an address
function transferToAddress(address _from, address _to, uint _value) internal returns (bool success) {
require(balanceOf(_from) >= _value);
require(_transfer(_from, _to, _value));
emit TokenTransfer(_from, _to, _value);
return true;
}
//function that is called when transaction target is a contract
function transferToContract(address _from, address _to, uint _value, bytes _data) internal returns (bool success) {
require(balanceOf(_from) >= _value);
require(_transfer(_from, _to, _value));
ContractReceiver receiver = ContractReceiver(_to);
receiver.tokenFallback(msg.sender, _value, _data);
emit TokenTransfer(msg.sender, _to, _value);
return true;
}
}
contract TokenData is RBAC, Pausable{
//using SafeMath for uint256;
event TokenDataBalance(address sender, address indexed addr, uint256 value);
event TokenDataAllowance(address sender, address indexed from, address indexed to, uint256 value);
event SetTotalSupply(address _addr, uint256 _total);
mapping(address => uint256) internal balances;
mapping(string => uint256) internal values;
mapping (address => mapping (address => uint256)) internal allowed;
address[] internal users;
uint256 internal totalSupply_;
uint256 internal totalCapacity_;
string internal name_;
string internal symbol_;
uint8 internal decimals_;
function TokenData(uint256 _totalSupply, uint256 _totalCapacity) public {
addRole(msg.sender, ROLE_ADMIN);
totalSupply_ = _totalSupply;
totalCapacity_ = _totalCapacity;
}
BwinCommons internal commons;
function setCommons(address _addr) public onlyAdmin {
commons = BwinCommons(_addr);
}
function setTotal(uint256 _total) public onlyRole("TOKEN_DATA_USER") {
totalSupply_ = _total;
emit SetTotalSupply(msg.sender, _total);
}
event SetValue(address _addr, string name, uint256 _value);
function setValue(string name, uint256 _value) external onlyRole("TOKEN_DATA_USER") {
values[name] = _value;
emit SetValue(msg.sender, name, _value);
}
event SetTotalCapacity(address _addr, uint256 _total);
function setTotalCapacity(uint256 _total) external onlyRole("TOKEN_DATA_USER") {
totalCapacity_ = _total;
emit SetTotalCapacity(msg.sender, _total);
}
function valueOf(string _name) public view returns(uint256){
return values[_name];
}
function TotalCapacity() public view returns (uint256) {
return totalCapacity_;
}
function totalSupply() public view returns (uint256) {
return totalSupply_;
}
function balanceOf(address _owner) public view returns (uint256) {
return balances[_owner];
}
function allowance(address _owner, address _spender) public view returns (uint256) {
return allowed[_owner][_spender];
}
function setBalance(address _addr, uint256 _value) external whenNotPaused onlyRole("TOKEN_DATA_USER") returns (bool) {
return _setBalance(_addr, _value);
}
function setAllowance(address _from, address _to, uint256 _value) external whenNotPaused onlyRole("TOKEN_DATA_USER") returns (bool) {
return _setAllowance(_from, _to, _value);
}
function setBalanceAdmin(address _addr, uint256 _value) external onlyAdmin returns (bool) {
return _setBalance(_addr, _value);
}
function setAllowanceAdmin(address _from, address _to, uint256 _value) external onlyAdmin returns (bool) {
return _setAllowance(_from, _to, _value);
}
function _setBalance(address _addr, uint256 _value) internal returns (bool) {
require(_addr != address(0));
require(_value >= 0);
balances[_addr] = _value;
emit TokenDataBalance(msg.sender, _addr, _value);
return true;
}
function _setAllowance(address _from, address _to, uint256 _value) internal returns (bool) {
require(_from != address(0));
require(_to != address(0));
require(_value >= 0);
allowed[_from][_to] = _value;
emit TokenDataAllowance(msg.sender, _from, _to, _value);
return true;
}
}
contract Crowdsale is Ownable, Pausable{
using SafeMath for uint256;
uint256 public startTime;
uint256 public endTime;
uint256 public saleCapacity;
uint256 public saledAmount;
uint256 public rate;
uint256 public weiRaised;
event TokenPurchase(address payor, address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
BwinCommons internal commons;
function setCommons(address _addr) public onlyOwner {
commons = BwinCommons(_addr);
}
function buyTokens(address payor, address beneficiary, address _parent, uint256 _top) public payable returns(bool, uint256);
function hasEnded() public view returns (bool){
return (now > endTime || saledAmount >= saleCapacity);
}
modifier onlyFront() {
require(msg.sender == address(commons.get("CrowdsaleFront")));
_;
}
function validPurchase() internal view returns (bool) {
bool withinPeriod = now >= startTime && now <= endTime;
bool withinCapacity = saledAmount <= saleCapacity;
return withinPeriod && withinCapacity;
}
function getTokenAmount(uint256 weiAmount) internal view returns(uint256) {
return weiAmount.mul(rate);
}
}
library Roles {
struct Role {
mapping (address => bool) bearer;
}
/**
* @dev give an address access to this role
*/
function add(Role storage role, address addr)
internal
{
role.bearer[addr] = true;
}
/**
* @dev remove an address' access to this role
*/
function remove(Role storage role, address addr)
internal
{
role.bearer[addr] = false;
}
/**
* @dev check if an address has this role
* // reverts
*/
function check(Role storage role, address addr)
view
internal
{
require(has(role, addr));
}
/**
* @dev check if an address has this role
* @return bool
*/
function has(Role storage role, address addr)
view
internal
returns (bool)
{
return role.bearer[addr];
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"},{"name":"roleName","type":"string"}],"name":"checkRole","outputs":[],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"},{"name":"roleName","type":"string"}],"name":"hasRole","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"roleName","type":"string"}],"name":"adminRemoveRole","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"roleName","type":"string"}],"name":"adminAddRole","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"}],"name":"setCommons","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ROLE_ADMIN","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_recipient","type":"address"}],"name":"destroyAndSend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"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":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"roleName","type":"string"}],"name":"RoleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"},{"indexed":false,"name":"roleName","type":"string"}],"name":"RoleRemoved","type":"event"}]Contract Creation Code
60606040526000600160006101000a81548160ff02191690831515021790555034156200002b57600080fd5b62000080336040805190810160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152506200011b64010000000002620022f2176401000000009004565b336001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000115336040805190810160405280600581526020017f61646d696e0000000000000000000000000000000000000000000000000000008152506200011b64010000000002620022f2176401000000009004565b620002df565b620001aa826000836040518082805190602001908083835b6020831015156200015a578051825260208201915060208101905060208303925062000133565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206200028164010000000002620024a1179091906401000000009004565b7fbfec83d64eaa953f2708271a023ab9ee82057f8f3578d548c1a4ba0b5b7004898282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156200024157808201518184015260208101905062000224565b50505050905090810190601f1680156200026f5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b61253f80620002ef6000396000f30060606040526004361061013e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde0314610143578063095ea7b3146101d15780630988ca8c1461022b57806318160ddd146102a7578063217fe6c6146102d057806323b872dd14610364578063313ce567146103dd5780633f4ba83a1461040c5780635c975abb14610421578063661884631461044e57806370a08231146104a857806383197ef0146104f55780638456cb591461050a57806388cee87e1461051f5780638da5cb5b1461059b57806395d89b41146105f0578063a9059cbb1461067e578063b25fa92c146106d8578063d23ad39d14610754578063d391014b1461078d578063d73dd6231461081b578063dd62ed3e14610875578063f2fde38b146108e1578063f5074f411461091a575b600080fd5b341561014e57600080fd5b610156610953565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561019657808201518184015260208101905061017b565b50505050905090810190601f1680156101c35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101dc57600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061098c565b604051808215151515815260200191505060405180910390f35b341561023657600080fd5b6102a5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610bd5565b005b34156102b257600080fd5b6102ba610c56565b6040518082815260200191505060405180910390f35b34156102db57600080fd5b61034a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610db3565b604051808215151515815260200191505060405180910390f35b341561036f57600080fd5b6103c3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610e3a565b604051808215151515815260200191505060405180910390f35b34156103e857600080fd5b6103f06110b8565b604051808260ff1660ff16815260200191505060405180910390f35b341561041757600080fd5b61041f6110bd565b005b341561042c57600080fd5b610434611160565b604051808215151515815260200191505060405180910390f35b341561045957600080fd5b61048e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611173565b604051808215151515815260200191505060405180910390f35b34156104b357600080fd5b6104df600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113d8565b6040518082815260200191505060405180910390f35b341561050057600080fd5b61050861156e565b005b341561051557600080fd5b61051d611603565b005b341561052a57600080fd5b610599600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506116a6565b005b34156105a657600080fd5b6105ae6116f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105fb57600080fd5b610603611718565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610643578082015181840152602081019050610628565b50505050905090810190601f1680156106705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561068957600080fd5b6106be600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611751565b604051808215151515815260200191505060405180910390f35b34156106e357600080fd5b610752600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611a11565b005b341561075f57600080fd5b61078b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a5e565b005b341561079857600080fd5b6107a0611afd565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107e05780820151818401526020810190506107c5565b50505050905090810190601f16801561080d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561082657600080fd5b61085b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611b36565b604051808215151515815260200191505060405180910390f35b341561088057600080fd5b6108cb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611d9b565b6040518082815260200191505060405180910390f35b34156108ec57600080fd5b610918600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f66565b005b341561092557600080fd5b610951600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120bb565b005b6040805190810160405280600b81526020017f464667616d6520436f696e00000000000000000000000000000000000000000081525081565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515610a5057600080fd5b5af11515610a5d57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663104e81ff3386866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515610b3f57600080fd5b5af11515610b4c57600080fd5b5050506040518051905015610bc9578373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a360019150610bce565b600091505b5092915050565b610c52826000836040518082805190602001908083835b602083101515610c115780518252602082019150602081019050602083039250610bec565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061212f90919063ffffffff16565b5050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515610d1a57600080fd5b5af11515610d2757600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610d9657600080fd5b5af11515610da357600080fd5b5050506040518051905091505090565b6000610e32836000846040518082805190602001908083835b602083101515610df15780518252602082019150602081019050602083039250610dcc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061214890919063ffffffff16565b905092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515610efe57600080fd5b5af11515610f0b57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663851d1c27338787876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b151561102157600080fd5b5af1151561102e57600080fd5b50505060405180519050156110ab578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600191506110b0565b600091505b509392505050565b601281565b6110fc336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b600160009054906101000a900460ff16151561111757600080fd5b6000600160006101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600160009054906101000a900460ff1681565b600080600160009054906101000a900460ff1615151561119257600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b151561125357600080fd5b5af1151561126057600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663a03928973386866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561134257600080fd5b5af1151561134f57600080fd5b50505060405180519050156113cc578373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a3600191506113d1565b600091505b5092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b151561149c57600080fd5b5af115156114a957600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561154f57600080fd5b5af1151561155c57600080fd5b50505060405180519050915050919050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115c957600080fd5b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b611642336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b600160009054906101000a900460ff1615151561165e57600080fd5b60018060006101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6116e5336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b6116ef82826121a1565b5050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600381526020017f464643000000000000000000000000000000000000000000000000000000000081525081565b600061175b6124ff565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b151561181e57600080fd5b5af1151561182b57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff166312a837b4338787866040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561192c578082015181840152602081019050611911565b50505050905090810190601f1680156119595780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b151561197a57600080fd5b5af1151561198757600080fd5b5050506040518051905015611a04578473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a360019250611a09565b600092505b505092915050565b611a50336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b611a5a82826122f2565b5050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ab957600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525081565b600080600160009054906101000a900460ff16151515611b5557600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515611c1657600080fd5b5af11515611c2357600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff16638a6e0a8e3386866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515611d0557600080fd5b5af11515611d1257600080fd5b5050506040518051905015611d8f578373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a360019150611d94565b600091505b5092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515611e5f57600080fd5b5af11515611e6c57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e85856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515611f4657600080fd5b5af11515611f5357600080fd5b5050506040518051905091505092915050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fc157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ffd57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561211657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6121398282612148565b151561214457600080fd5b5050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61221e826000836040518082805190602001908083835b6020831015156121dd57805182526020820191506020810190506020830392506121b8565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061244390919063ffffffff16565b7fd211483f91fc6eff862467f8de606587a30c8fc9981056f051b897a418df803a8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156122b3578082015181840152602081019050612298565b50505050905090810190601f1680156122e05780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b61236f826000836040518082805190602001908083835b60208310151561232e5780518252602082019150602081019050602083039250612309565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206124a190919063ffffffff16565b7fbfec83d64eaa953f2708271a023ab9ee82057f8f3578d548c1a4ba0b5b7004898282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156124045780820151818401526020810190506123e9565b50505050905090810190601f1680156124315780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6020604051908101604052806000815250905600a165627a7a7230582079aa5201125b5861ab37b34dc129345840c94ae224b98313416024ad2d5fa1720029
Deployed Bytecode
0x60606040526004361061013e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806306fdde0314610143578063095ea7b3146101d15780630988ca8c1461022b57806318160ddd146102a7578063217fe6c6146102d057806323b872dd14610364578063313ce567146103dd5780633f4ba83a1461040c5780635c975abb14610421578063661884631461044e57806370a08231146104a857806383197ef0146104f55780638456cb591461050a57806388cee87e1461051f5780638da5cb5b1461059b57806395d89b41146105f0578063a9059cbb1461067e578063b25fa92c146106d8578063d23ad39d14610754578063d391014b1461078d578063d73dd6231461081b578063dd62ed3e14610875578063f2fde38b146108e1578063f5074f411461091a575b600080fd5b341561014e57600080fd5b610156610953565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561019657808201518184015260208101905061017b565b50505050905090810190601f1680156101c35780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34156101dc57600080fd5b610211600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001909190505061098c565b604051808215151515815260200191505060405180910390f35b341561023657600080fd5b6102a5600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610bd5565b005b34156102b257600080fd5b6102ba610c56565b6040518082815260200191505060405180910390f35b34156102db57600080fd5b61034a600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610db3565b604051808215151515815260200191505060405180910390f35b341561036f57600080fd5b6103c3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050610e3a565b604051808215151515815260200191505060405180910390f35b34156103e857600080fd5b6103f06110b8565b604051808260ff1660ff16815260200191505060405180910390f35b341561041757600080fd5b61041f6110bd565b005b341561042c57600080fd5b610434611160565b604051808215151515815260200191505060405180910390f35b341561045957600080fd5b61048e600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611173565b604051808215151515815260200191505060405180910390f35b34156104b357600080fd5b6104df600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506113d8565b6040518082815260200191505060405180910390f35b341561050057600080fd5b61050861156e565b005b341561051557600080fd5b61051d611603565b005b341561052a57600080fd5b610599600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f016020809104026020016040519081016040528093929190818152602001838380828437820191505050505050919050506116a6565b005b34156105a657600080fd5b6105ae6116f3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156105fb57600080fd5b610603611718565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610643578082015181840152602081019050610628565b50505050905090810190601f1680156106705780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561068957600080fd5b6106be600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611751565b604051808215151515815260200191505060405180910390f35b34156106e357600080fd5b610752600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050611a11565b005b341561075f57600080fd5b61078b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611a5e565b005b341561079857600080fd5b6107a0611afd565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107e05780820151818401526020810190506107c5565b50505050905090810190601f16801561080d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561082657600080fd5b61085b600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091908035906020019091905050611b36565b604051808215151515815260200191505060405180910390f35b341561088057600080fd5b6108cb600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611d9b565b6040518082815260200191505060405180910390f35b34156108ec57600080fd5b610918600480803573ffffffffffffffffffffffffffffffffffffffff16906020019091905050611f66565b005b341561092557600080fd5b610951600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506120bb565b005b6040805190810160405280600b81526020017f464667616d6520436f696e00000000000000000000000000000000000000000081525081565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515610a5057600080fd5b5af11515610a5d57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663104e81ff3386866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515610b3f57600080fd5b5af11515610b4c57600080fd5b5050506040518051905015610bc9578373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a360019150610bce565b600091505b5092915050565b610c52826000836040518082805190602001908083835b602083101515610c115780518252602082019150602081019050602083039250610bec565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061212f90919063ffffffff16565b5050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515610d1a57600080fd5b5af11515610d2757600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1515610d9657600080fd5b5af11515610da357600080fd5b5050506040518051905091505090565b6000610e32836000846040518082805190602001908083835b602083101515610df15780518252602082019150602081019050602083039250610dcc565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061214890919063ffffffff16565b905092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515610efe57600080fd5b5af11515610f0b57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663851d1c27338787876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b151561102157600080fd5b5af1151561102e57600080fd5b50505060405180519050156110ab578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3600191506110b0565b600091505b509392505050565b601281565b6110fc336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b600160009054906101000a900460ff16151561111757600080fd5b6000600160006101000a81548160ff0219169083151502179055507f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3360405160405180910390a1565b600160009054906101000a900460ff1681565b600080600160009054906101000a900460ff1615151561119257600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b151561125357600080fd5b5af1151561126057600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663a03928973386866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b151561134257600080fd5b5af1151561134f57600080fd5b50505060405180519050156113cc578373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a3600191506113d1565b600091505b5092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b151561149c57600080fd5b5af115156114a957600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561154f57600080fd5b5af1151561155c57600080fd5b50505060405180519050915050919050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156115c957600080fd5b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16ff5b611642336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b600160009054906101000a900460ff1615151561165e57600080fd5b60018060006101000a81548160ff0219169083151502179055507f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62560405160405180910390a1565b6116e5336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b6116ef82826121a1565b5050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600381526020017f464643000000000000000000000000000000000000000000000000000000000081525081565b600061175b6124ff565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b151561181e57600080fd5b5af1151561182b57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff166312a837b4338787866040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561192c578082015181840152602081019050611911565b50505050905090810190601f1680156119595780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b151561197a57600080fd5b5af1151561198757600080fd5b5050506040518051905015611a04578473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a360019250611a09565b600092505b505092915050565b611a50336040805190810160405280600581526020017f61646d696e000000000000000000000000000000000000000000000000000000815250610bd5565b611a5a82826122f2565b5050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611ab957600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040805190810160405280600581526020017f61646d696e00000000000000000000000000000000000000000000000000000081525081565b600080600160009054906101000a900460ff16151515611b5557600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515611c1657600080fd5b5af11515611c2357600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff16638a6e0a8e3386866040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b1515611d0557600080fd5b5af11515611d1257600080fd5b5050506040518051905015611d8f578373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040518082815260200191505060405180910390a360019150611d94565b600091505b5092915050565b600080600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663693ec85e6040518163ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018080602001828103825260058152602001807f546f6b656e000000000000000000000000000000000000000000000000000000815250602001915050602060405180830381600087803b1515611e5f57600080fd5b5af11515611e6c57600080fd5b5050506040518051905090508073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e85856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b1515611f4657600080fd5b5af11515611f5357600080fd5b5050506040518051905091505092915050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611fc157600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611ffd57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806001806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6001809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561211657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16ff5b6121398282612148565b151561214457600080fd5b5050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61221e826000836040518082805190602001908083835b6020831015156121dd57805182526020820191506020810190506020830392506121b8565b6001836020036101000a038019825116818451168082178552505050505050905001915050908152602001604051809103902061244390919063ffffffff16565b7fd211483f91fc6eff862467f8de606587a30c8fc9981056f051b897a418df803a8282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156122b3578082015181840152602081019050612298565b50505050905090810190601f1680156122e05780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b61236f826000836040518082805190602001908083835b60208310151561232e5780518252602082019150602081019050602083039250612309565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390206124a190919063ffffffff16565b7fbfec83d64eaa953f2708271a023ab9ee82057f8f3578d548c1a4ba0b5b7004898282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b838110156124045780820151818401526020810190506123e9565b50505050905090810190601f1680156124315780820380516001836020036101000a031916815260200191505b50935050505060405180910390a15050565b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6020604051908101604052806000815250905600a165627a7a7230582079aa5201125b5861ab37b34dc129345840c94ae224b98313416024ad2d5fa1720029
Swarm Source
bzzr://79aa5201125b5861ab37b34dc129345840c94ae224b98313416024ad2d5fa172
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.
Add Token to MetaMask (Web3)