pragma solidity ^0.4.16;
// copyright contact@bytether.com
contract BasicAccessControl {
address public owner;
address[] public moderators;
function BasicAccessControl() public {
owner = msg.sender;
}
modifier onlyOwner {
require(msg.sender == owner);
_;
}
modifier onlyModerators() {
if (msg.sender != owner) {
bool found = false;
for (uint index = 0; index < moderators.length; index++) {
if (moderators[index] == msg.sender) {
found = true;
break;
}
}
require(found);
}
_;
}
function ChangeOwner(address _newOwner) onlyOwner public {
if (_newOwner != address(0)) {
owner = _newOwner;
}
}
function Kill() onlyOwner public {
selfdestruct(owner);
}
function AddModerator(address _newModerator) onlyOwner public {
if (_newModerator != address(0)) {
for (uint index = 0; index < moderators.length; index++) {
if (moderators[index] == _newModerator) {
return;
}
}
moderators.push(_newModerator);
}
}
function RemoveModerator(address _oldModerator) onlyOwner public {
uint foundIndex = 0;
for (; foundIndex < moderators.length; foundIndex++) {
if (moderators[foundIndex] == _oldModerator) {
break;
}
}
if (foundIndex < moderators.length) {
moderators[foundIndex] = moderators[moderators.length-1];
delete moderators[moderators.length-1];
moderators.length--;
}
}
}
interface TokenRecipient {
function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public;
}
interface CrossForkDistribution {
function getDistributedAmount(uint64 _requestId, string _btcAddress, address _receiver) public;
}
interface CrossForkCallback {
function callbackCrossFork(uint64 _requestId, uint256 _amount, bytes32 _referCodeHash) public;
}
contract TokenERC20 {
uint256 public totalSupply;
mapping (address => uint256) public balanceOf;
mapping (address => mapping (address => uint256)) public allowance;
event Transfer(address indexed from, address indexed to, uint256 value);
event Burn(address indexed from, uint256 value);
function _transfer(address _from, address _to, uint _value) internal {
require(_to != 0x0);
require(balanceOf[_from] >= _value);
require(balanceOf[_to] + _value > balanceOf[_to]);
uint previousBalances = balanceOf[_from] + balanceOf[_to];
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
Transfer(_from, _to, _value);
assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
}
function transfer(address _to, uint256 _value) public {
_transfer(msg.sender, _to, _value);
}
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
require(_value <= allowance[_from][msg.sender]);
allowance[_from][msg.sender] -= _value;
_transfer(_from, _to, _value);
return true;
}
function approve(address _spender, uint256 _value) public returns (bool success) {
allowance[msg.sender][_spender] = _value;
return true;
}
function approveAndCall(address _spender, uint256 _value, bytes _extraData) public returns (bool success) {
TokenRecipient spender = TokenRecipient(_spender);
if (approve(_spender, _value)) {
spender.receiveApproval(msg.sender, _value, this, _extraData);
return true;
}
}
function burn(uint256 _value) public returns (bool success) {
require(balanceOf[msg.sender] >= _value);
balanceOf[msg.sender] -= _value;
totalSupply -= _value;
Burn(msg.sender, _value);
return true;
}
function burnFrom(address _from, uint256 _value) public returns (bool success) {
require(balanceOf[_from] >= _value);
require(_value <= allowance[_from][msg.sender]);
balanceOf[_from] -= _value;
allowance[_from][msg.sender] -= _value;
totalSupply -= _value;
Burn(_from, _value);
return true;
}
}
contract BTHToken is BasicAccessControl, TokenERC20, CrossForkCallback {
// metadata
string public constant name = "Bytether";
string public constant symbol = "BTH";
uint256 public constant decimals = 18;
string public version = "1.0";
// cross fork data
enum ForkResultCode {
SUCCESS,
TRIGGERED,
RECEIVED,
PENDING,
FAILED,
ID_MISMATCH,
NOT_ENOUGH_BALANCE,
NOT_RECEIVED
}
enum ClaimReferResultCode {
SUCCESS,
NOT_ENOUGH_BALANCE
}
struct CrossForkData {
string btcAddress;
address receiver;
uint256 amount;
bytes32 referCodeHash;
uint createTime;
}
uint64 public crossForkCount = 0;
uint public referBenefitRate = 10; // 10 btc -> 1 bth
bool public crossForking = false;
mapping (uint64 => CrossForkData) crossForkMapping;
mapping (string => uint64) crossForkIds;
mapping (bytes32 => uint256) referBenefits; // referCodeHash -> bth amount
address public crossForkDistribution = 0x0; // crossfork contract
uint256 public constant satoshi_bth_decimals = 10 ** 10;
event LogRevertCrossFork(bytes32 indexed btcAddressHash, address indexed receiver, uint64 indexed requestId, uint256 amount, ForkResultCode result);
event LogTriggerCrossFork(bytes32 indexed btcAddressHash, uint64 indexed requestId, ForkResultCode result);
event LogCrossFork(uint64 indexed requestId, address receiver, uint256 amount, ForkResultCode result);
event LogClaimReferBenefit(bytes32 indexed referCodeHash, address receiver, uint256 amount, ClaimReferResultCode result);
// deposit address
address public crossForkFundDeposit; // deposit address for cross fork
address public bthFundDeposit; // deposit address for user growth pool & marketing
address public developerFundDeposit; // deposit address for developer fund
// fund distribution
uint256 public crossForkFund = 17 * (10**6) * 10**decimals; //17m reserved for BitCoin Cross-Fork
uint256 public marketingFund = 2 * (10**6) * 10**decimals; //2m reserved for marketing
uint256 public userPoolFund = 1 * (10**6) * 10**decimals; //1m for user growth pool
uint256 public developerFund = 1 * (10**6) * 10**decimals; //1m reserved for developers
// for future feature
uint256 public sellPrice;
uint256 public buyPrice;
bool public trading = false;
mapping (address => bool) public frozenAccount;
event FrozenFunds(address target, bool frozen);
// modifier
modifier isCrossForking {
require(crossForking == true || msg.sender == owner);
require(crossForkDistribution != 0x0);
_;
}
modifier isTrading {
require(trading == true || msg.sender == owner);
_;
}
// constructor
function BTHToken(address _crossForkDistribution, address _crossForkFundDeposit, address _bthFundDeposit, address _developerFundDeposit) public {
totalSupply = crossForkFund + marketingFund + userPoolFund + developerFund;
crossForkDistribution = _crossForkDistribution;
crossForkFundDeposit = _crossForkFundDeposit;
bthFundDeposit = _bthFundDeposit;
developerFundDeposit = _developerFundDeposit;
balanceOf[crossForkFundDeposit] += crossForkFund;
balanceOf[bthFundDeposit] += marketingFund + userPoolFund;
balanceOf[developerFundDeposit] += developerFund;
}
function () payable public {}
// only admin
function setCrossForkDistribution(address _crossForkDistribution) onlyOwner public {
crossForkDistribution = _crossForkDistribution;
}
function setDepositAddress(address _crossForkFund, address _bthFund, address _developerFund) onlyOwner public {
crossForkFundDeposit = _crossForkFund;
bthFundDeposit = _bthFund;
developerFundDeposit = _developerFund;
}
function setPrices(uint256 _newSellPrice, uint256 _newBuyPrice) onlyOwner public {
sellPrice = _newSellPrice;
buyPrice = _newBuyPrice;
}
function setReferBenefitRate(uint _rate) onlyOwner public {
referBenefitRate = _rate;
}
// only moderators
function toggleCrossForking() onlyModerators public {
crossForking = !crossForking;
}
function toggleTrading() onlyModerators public {
trading = !trading;
}
function claimReferBenefit(string _referCode, address _receiver) onlyModerators public {
bytes32 referCodeHash = keccak256(_referCode);
uint256 totalAmount = referBenefits[referCodeHash];
if (totalAmount==0) {
LogClaimReferBenefit(referCodeHash, _receiver, 0, ClaimReferResultCode.SUCCESS);
return;
}
if (balanceOf[bthFundDeposit] < totalAmount) {
LogClaimReferBenefit(referCodeHash, _receiver, 0, ClaimReferResultCode.NOT_ENOUGH_BALANCE);
return;
}
referBenefits[referCodeHash] = 0;
balanceOf[bthFundDeposit] -= totalAmount;
balanceOf[_receiver] += totalAmount;
LogClaimReferBenefit(referCodeHash, _receiver, totalAmount, ClaimReferResultCode.SUCCESS);
}
// in case there is an error
function revertCrossFork(string _btcAddress) onlyModerators public {
bytes32 btcAddressHash = keccak256(_btcAddress);
uint64 requestId = crossForkIds[_btcAddress];
if (requestId == 0) {
LogRevertCrossFork(btcAddressHash, 0x0, 0, 0, ForkResultCode.NOT_RECEIVED);
return;
}
CrossForkData storage crossForkData = crossForkMapping[requestId];
uint256 amount = crossForkData.amount;
address receiver = crossForkData.receiver;
if (balanceOf[receiver] < crossForkData.amount) {
LogRevertCrossFork(btcAddressHash, receiver, requestId, amount, ForkResultCode.NOT_ENOUGH_BALANCE);
return;
}
// revert
balanceOf[crossForkData.receiver] -= crossForkData.amount;
balanceOf[crossForkFundDeposit] += crossForkData.amount;
crossForkIds[_btcAddress] = 0;
crossForkData.btcAddress = "";
crossForkData.receiver = 0x0;
crossForkData.amount = 0;
crossForkData.createTime = 0;
// revert refer claimable amount if possible
if (referBenefits[crossForkData.referCodeHash] > 0) {
uint256 deductAmount = crossForkData.amount;
if (referBenefits[crossForkData.referCodeHash] < deductAmount) {
deductAmount = referBenefits[crossForkData.referCodeHash];
}
referBenefits[crossForkData.referCodeHash] -= deductAmount;
}
LogRevertCrossFork(btcAddressHash, receiver, requestId, amount, ForkResultCode.SUCCESS);
}
// public
function getCrossForkId(string _btcAddress) constant public returns(uint64) {
return crossForkIds[_btcAddress];
}
function getCrossForkData(uint64 _id) constant public returns(string, address, uint256, uint) {
CrossForkData storage crossForkData = crossForkMapping[_id];
return (crossForkData.btcAddress, crossForkData.receiver, crossForkData.amount, crossForkData.createTime);
}
function getReferBenefit(string _referCode) constant public returns(uint256) {
return referBenefits[keccak256(_referCode)];
}
function callbackCrossFork(uint64 _requestId, uint256 _amount, bytes32 _referCodeHash) public {
if (msg.sender != crossForkDistribution || _amount == 0) {
LogCrossFork(_requestId, 0x0, 0, ForkResultCode.FAILED);
return;
}
CrossForkData storage crossForkData = crossForkMapping[_requestId];
if (crossForkData.receiver == 0x0) {
LogCrossFork(_requestId, crossForkData.receiver, 0, ForkResultCode.ID_MISMATCH);
return;
}
if (crossForkIds[crossForkData.btcAddress] != 0) {
LogCrossFork(_requestId, crossForkData.receiver, crossForkData.amount, ForkResultCode.RECEIVED);
return;
}
crossForkIds[crossForkData.btcAddress] = _requestId;
crossForkData.amount = _amount*satoshi_bth_decimals;
// add fund for address
if (balanceOf[crossForkFundDeposit] < crossForkData.amount) {
LogCrossFork(_requestId, crossForkData.receiver, crossForkData.amount, ForkResultCode.NOT_ENOUGH_BALANCE);
return;
}
balanceOf[crossForkFundDeposit] -= crossForkData.amount;
balanceOf[crossForkData.receiver] += crossForkData.amount;
if (referBenefitRate > 0) {
crossForkData.referCodeHash = _referCodeHash;
referBenefits[_referCodeHash] += crossForkData.amount / referBenefitRate;
}
LogCrossFork(_requestId, crossForkData.receiver, crossForkData.amount, ForkResultCode.SUCCESS);
}
function triggerCrossFork(string _btcAddress) isCrossForking public returns(ForkResultCode) {
bytes32 btcAddressHash = keccak256(_btcAddress);
if (crossForkIds[_btcAddress] > 0) {
LogTriggerCrossFork(btcAddressHash, crossForkIds[_btcAddress], ForkResultCode.RECEIVED);
return ForkResultCode.RECEIVED;
}
crossForkCount += 1;
CrossForkData storage crossForkData = crossForkMapping[crossForkCount];
crossForkData.btcAddress = _btcAddress;
crossForkData.receiver = msg.sender;
crossForkData.amount = 0;
crossForkData.createTime = now;
CrossForkDistribution crossfork = CrossForkDistribution(crossForkDistribution);
crossfork.getDistributedAmount(crossForkCount, _btcAddress, msg.sender);
LogTriggerCrossFork(btcAddressHash, crossForkIds[_btcAddress], ForkResultCode.TRIGGERED);
return ForkResultCode.TRIGGERED;
}
function _transfer(address _from, address _to, uint _value) internal {
require (_to != 0x0);
require (balanceOf[_from] > _value);
require (balanceOf[_to] + _value > balanceOf[_to]);
require(!frozenAccount[_from]);
require(!frozenAccount[_to]);
balanceOf[_from] -= _value;
balanceOf[_to] += _value;
Transfer(_from, _to, _value);
}
function freezeAccount(address _target, bool _freeze) onlyOwner public {
frozenAccount[_target] = _freeze;
FrozenFunds(_target, _freeze);
}
function buy() payable isTrading public {
uint amount = msg.value / buyPrice;
_transfer(this, msg.sender, amount);
}
function sell(uint256 amount) isTrading public {
require(this.balance >= amount * sellPrice);
_transfer(msg.sender, this, amount);
msg.sender.transfer(amount * sellPrice);
}
}
{
"compilationTarget": {
"BTHToken.sol": "BTHToken"
},
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"constant":false,"inputs":[{"name":"_crossForkFund","type":"address"},{"name":"_bthFund","type":"address"},{"name":"_developerFund","type":"address"}],"name":"setDepositAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newSellPrice","type":"uint256"},{"name":"_newBuyPrice","type":"uint256"}],"name":"setPrices","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"crossForkFundDeposit","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"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":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"toggleTrading","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"crossForkFund","outputs":[{"name":"","type":"uint256"}],"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":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_btcAddress","type":"string"}],"name":"triggerCrossFork","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"bthFundDeposit","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"userPoolFund","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint64"}],"name":"getCrossForkData","outputs":[{"name":"","type":"string"},{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sellPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"referBenefitRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_referCode","type":"string"},{"name":"_receiver","type":"address"}],"name":"claimReferBenefit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_requestId","type":"uint64"},{"name":"_amount","type":"uint256"},{"name":"_referCodeHash","type":"bytes32"}],"name":"callbackCrossFork","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_btcAddress","type":"string"}],"name":"revertCrossFork","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"toggleCrossForking","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newModerator","type":"address"}],"name":"AddModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_crossForkDistribution","type":"address"}],"name":"setCrossForkDistribution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"}],"name":"burnFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"developerFundDeposit","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"crossForking","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"buyPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"crossForkCount","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"developerFund","outputs":[{"name":"","type":"uint256"}],"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":"buy","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"frozenAccount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"crossForkDistribution","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_oldModerator","type":"address"}],"name":"RemoveModerator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"moderators","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"Kill","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"satoshi_bth_decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"approveAndCall","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_btcAddress","type":"string"}],"name":"getCrossForkId","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_rate","type":"uint256"}],"name":"setReferBenefitRate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"sell","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_target","type":"address"},{"name":"_freeze","type":"bool"}],"name":"freezeAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"trading","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_referCode","type":"string"}],"name":"getReferBenefit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"marketingFund","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"ChangeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_crossForkDistribution","type":"address"},{"name":"_crossForkFundDeposit","type":"address"},{"name":"_bthFundDeposit","type":"address"},{"name":"_developerFundDeposit","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"btcAddressHash","type":"bytes32"},{"indexed":true,"name":"receiver","type":"address"},{"indexed":true,"name":"requestId","type":"uint64"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"result","type":"uint8"}],"name":"LogRevertCrossFork","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"btcAddressHash","type":"bytes32"},{"indexed":true,"name":"requestId","type":"uint64"},{"indexed":false,"name":"result","type":"uint8"}],"name":"LogTriggerCrossFork","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"requestId","type":"uint64"},{"indexed":false,"name":"receiver","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"result","type":"uint8"}],"name":"LogCrossFork","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"referCodeHash","type":"bytes32"},{"indexed":false,"name":"receiver","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"result","type":"uint8"}],"name":"LogClaimReferBenefit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"target","type":"address"},{"indexed":false,"name":"frozen","type":"bool"}],"name":"FrozenFunds","type":"event"},{"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":"from","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"}]