More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 2,696 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer | 22076313 | 317 days ago | IN | 0 ETH | 0.0000396 | ||||
| Transfer | 22076302 | 317 days ago | IN | 0 ETH | 0.0001269 | ||||
| Transfer | 21259114 | 431 days ago | IN | 0 ETH | 0.0009639 | ||||
| Transfer | 21124043 | 450 days ago | IN | 0 ETH | 0.00035202 | ||||
| Exit | 20363909 | 556 days ago | IN | 0 ETH | 0.0003667 | ||||
| Transfer | 20355824 | 557 days ago | IN | 0 ETH | 0.00022254 | ||||
| Exit | 18318888 | 842 days ago | IN | 0 ETH | 0.00054993 | ||||
| Withdraw | 17624404 | 939 days ago | IN | 0 ETH | 0.00241566 | ||||
| Sell | 17585251 | 945 days ago | IN | 0 ETH | 0.00271527 | ||||
| Transfer | 17572819 | 947 days ago | IN | 0 ETH | 0.00191621 | ||||
| Transfer | 17572658 | 947 days ago | IN | 0 ETH | 0.00190969 | ||||
| Withdraw | 17569126 | 947 days ago | IN | 0 ETH | 0.00083231 | ||||
| Transfer | 17568291 | 947 days ago | IN | 0 ETH | 0.00075881 | ||||
| Buy | 17564173 | 948 days ago | IN | 0.00626743 ETH | 0.00215466 | ||||
| Withdraw | 17395439 | 972 days ago | IN | 0 ETH | 0.00196043 | ||||
| Withdraw | 17379092 | 974 days ago | IN | 0 ETH | 0.00439427 | ||||
| Withdraw | 17378597 | 974 days ago | IN | 0 ETH | 0.00263927 | ||||
| Withdraw | 17350350 | 978 days ago | IN | 0 ETH | 0.00118906 | ||||
| Sell | 17346206 | 979 days ago | IN | 0 ETH | 0.00161317 | ||||
| Sell | 17336260 | 980 days ago | IN | 0 ETH | 0.00224679 | ||||
| Sell | 17309945 | 984 days ago | IN | 0 ETH | 0.00097173 | ||||
| Sell | 17309934 | 984 days ago | IN | 0 ETH | 0.00190636 | ||||
| Sell | 17309922 | 984 days ago | IN | 0 ETH | 0.00219583 | ||||
| Reinvest | 17309888 | 984 days ago | IN | 0 ETH | 0.00141495 | ||||
| Reinvest | 17309777 | 984 days ago | IN | 0 ETH | 0.00911361 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 22930766 | 197 days ago | 0 ETH | ||||
| Transfer | 20363909 | 556 days ago | 0.00878238 ETH | ||||
| Transfer | 20363909 | 556 days ago | 0.0001219 ETH | ||||
| Transfer | 18318888 | 842 days ago | 0 ETH | ||||
| Transfer | 18318888 | 842 days ago | 0.07305384 ETH | ||||
| Transfer | 17624404 | 939 days ago | 0.00028968 ETH | ||||
| Transfer | 17585251 | 945 days ago | 0.00002425 ETH | ||||
| Transfer | 17569126 | 947 days ago | 0.00801072 ETH | ||||
| Transfer | 17395439 | 972 days ago | 0.02808544 ETH | ||||
| Transfer | 17379092 | 974 days ago | 0.02837665 ETH | ||||
| Transfer | 17378597 | 974 days ago | 0.00658387 ETH | ||||
| Transfer | 17350350 | 978 days ago | 0.00007526 ETH | ||||
| Transfer | 17346206 | 979 days ago | 0.13974206 ETH | ||||
| Transfer | 17336260 | 980 days ago | 0.00228627 ETH | ||||
| Transfer | 17309934 | 984 days ago | 0.08955895 ETH | ||||
| Transfer | 17309922 | 984 days ago | 0.09111911 ETH | ||||
| Transfer | 17307094 | 984 days ago | 0.04957807 ETH | ||||
| Transfer | 17301581 | 985 days ago | 0.00364658 ETH | ||||
| Transfer | 16832307 | 1051 days ago | 0.01128577 ETH | ||||
| Transfer | 16776415 | 1059 days ago | 0.00213343 ETH | ||||
| Transfer | 16569504 | 1088 days ago | 0.00857336 ETH | ||||
| Transfer | 16503637 | 1097 days ago | 0.00659915 ETH | ||||
| Transfer | 16470629 | 1102 days ago | 0.04569823 ETH | ||||
| Transfer | 16357743 | 1118 days ago | 0.00024501 ETH | ||||
| Transfer | 16296100 | 1126 days ago | 0.02021522 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
BXFToken
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 200 runs
Other Settings:
byzantium EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;
pragma abicoder v2;
import "@openzeppelin/contracts/math/SafeMath.sol";
import "./Company.sol";
import "./Staking.sol";
import "./Founder.sol";
import "./Sale.sol";
import "./DirectBonus.sol";
import "./Emergency.sol";
contract BXFToken is Staking, Company, Sale, DirectBonus, Emergency {
using SafeMath for uint256;
event BXFBuy(address indexed account, uint256 ethereumInvested, uint256 taxedEthereum, uint256 tokensMinted);
event BXFSell(address indexed account, uint256 tokenBurned, uint256 ethereumGot);
event BXFReinvestment(address indexed account, uint256 ethereumReinvested, uint256 tokensMinted);
event Withdraw(address indexed account, uint256 ethereumWithdrawn);
event Transfer(address indexed from, address indexed to, uint256 value);
constructor(string memory name, string memory symbol) StandardToken(name, symbol) {
_setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
}
fallback() external payable {
require(hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "BXFToken: you're not allowed to do this");
}
function buy() public payable isRegistered(msg.sender) {
(uint256 taxedEthereum, uint256 amountOfTokens) = purchaseTokens(msg.sender, msg.value);
emit Transfer(address(0), msg.sender, amountOfTokens);
emit BXFBuy(msg.sender, msg.value, taxedEthereum, amountOfTokens);
}
function sell(uint256 amountOfTokens) public isRegistered(msg.sender) hasEnoughBalance(amountOfTokens) {
address account = msg.sender;
decreaseTotalSupply(amountOfTokens);
decreaseBalanceOf(account, amountOfTokens);
if (isFounder(account)) dropFounderOnSell(account);
uint256 taxedEthereum = processStakingOnSell(account, amountOfTokens);
msg.sender.transfer(taxedEthereum);
emit Transfer(account, address(0), amountOfTokens);
emit BXFSell(account, amountOfTokens, taxedEthereum);
}
function withdraw(uint256 amountToWithdraw) public isRegistered(msg.sender) hasEnoughAvailableEther(amountToWithdraw) {
require(amountToWithdraw <= address(this).balance, "BXFToken: insufficient contract balance");
address account = msg.sender;
addWithdrawnAmountTo(account, amountToWithdraw);
msg.sender.transfer(amountToWithdraw);
emit Withdraw(account, amountToWithdraw);
}
function reinvest(uint256 amountToReinvest) public isRegistered(msg.sender) hasEnoughAvailableEther(amountToReinvest) {
address account = msg.sender;
addReinvestedAmountTo(account, amountToReinvest);
(uint256 taxedEthereum, uint256 amountOfTokens) = purchaseTokens(account, amountToReinvest);
emit Transfer(address(0), account, amountOfTokens);
emit BXFReinvestment(account, amountToReinvest, amountOfTokens);
}
function exit() public isRegistered(msg.sender) {
address account = msg.sender;
if (balanceOf(account) > 0) {
sell(balanceOf(account));
}
if (totalBonusOf(account) > 0) {
withdraw(totalBonusOf(account));
}
}
function transfer(address recipient, uint256 amount) public override hasEnoughBalance(amount) returns(bool) {
address sender = msg.sender;
_beforeTokenTransfer(sender, recipient, amount);
uint256 stakingFee = calculateStakingFee(amount);
uint256 taxedTokens = SafeMath.sub(amount, stakingFee);
decreaseTotalSupply(stakingFee);
decreaseBalanceOf(sender, amount);
increaseBalanceOf(recipient, taxedTokens);
processDistributionOnTransfer(sender, amount, recipient, taxedTokens);
emit Transfer(sender, address(0), stakingFee);
emit Transfer(sender, recipient, taxedTokens);
return true;
}
function purchaseTokens(address senderAccount, uint256 amountOfEthereum) internal canInvest(amountOfEthereum) returns(uint256, uint256) {
uint256 taxedEthereum = amountOfEthereum;
uint256 companyFee = calculateCompanyFee(amountOfEthereum);
uint256 directBonus = calculateDirectBonus(amountOfEthereum);
uint256 stakingFee = calculateStakingFee(amountOfEthereum);
taxedEthereum = taxedEthereum.sub(companyFee);
increaseCompanyBalance(companyFee);
address account = senderAccount;
address sponsor = sponsorOf(account);
increaseSelfBuyOf(account, amountOfEthereum);
if (sponsor == address(this)) {
increaseCompanyBalance(directBonus);
taxedEthereum = taxedEthereum.sub(directBonus);
} else if (isEligibleForDirectBonus(sponsor)) {
addDirectBonusTo(sponsor, directBonus);
taxedEthereum = taxedEthereum.sub(directBonus);
}
taxedEthereum = taxedEthereum.sub(stakingFee);
uint256 amountOfTokens = ethereumToTokens(taxedEthereum);
processStakingOnBuy(senderAccount, amountOfTokens, stakingFee);
increaseBalanceOf(senderAccount, amountOfTokens);
return (taxedEthereum, amountOfTokens);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;
pragma abicoder v2;
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/utils/EnumerableSet.sol";
import "./StandardToken.sol";
abstract contract AccountStorage is StandardToken {
using EnumerableSet for EnumerableSet.AddressSet;
using SafeMath for uint256;
struct AccountData {
address sponsor;
uint256 balance;
uint256 selfBuy;
uint256 directBonus;
uint256 reinvestedAmount;
uint256 withdrawnAmount;
int256 stakingValue;
}
struct MigrationData {
address account;
address sponsor;
uint256 tokensToMint;
uint256 selfBuy;
}
bool private _accountsMigrated = false;
EnumerableSet.AddressSet private _accounts;
mapping (address => AccountData) private _accountsData;
bytes32 constant public ACCOUNT_MANAGER_ROLE = keccak256("ACCOUNT_MANAGER_ROLE");
event AccountCreation(address indexed account, address indexed sponsor);
event AccountMigrationFinished();
event DirectBonusPaid(address indexed account, address indexed fromAccount, uint256 amountOfEthereum);
event AccountSponsorUpdated(address indexed account, address indexed oldSponsor, address indexed newSponsor);
modifier isRegistered(address account) {
require(_accountsMigrated, "AccountStorage: account data isn't migrated yet, try later");
require(hasAccount(account), "AccountStorage: account must be registered first");
_;
}
modifier hasEnoughBalance(uint256 amount) {
require(amount <= balanceOf(msg.sender), "AccountStorage: insufficient account balance");
_;
}
modifier hasEnoughAvailableEther(uint256 amount) {
uint256 totalBonus = totalBonusOf(msg.sender);
require(totalBonus > 0, "AccountStorage: you don't have any available ether");
require(amount <= totalBonus, "AccountStorage: you don't have enough available ether to perform operation");
_;
}
constructor() {
addAccountData(address(this), address(0));
}
function migrateAccount(address account, address sponsor, uint256 tokensToMint, uint256 selfBuy) public {
MigrationData[] memory data = new MigrationData[](1);
data[0] = MigrationData(account, sponsor, tokensToMint, selfBuy);
migrateAccountsInBatch(data);
}
function migrateAccountsInBatch(MigrationData[] memory data) public {
require(hasRole(ACCOUNT_MANAGER_ROLE, msg.sender), "AccountStorage: must have account manager role to migrate data");
require(!_accountsMigrated, "AccountStorage: account data migration method is no more available");
for (uint i = 0; i < data.length; i += 1) {
address curAddress = data[i].account;
address curSponsorAddress = data[i].sponsor;
uint256 tokensToMint = data[i].tokensToMint;
uint256 selfBuy = data[i].selfBuy;
if (curSponsorAddress == address(0)) {
curSponsorAddress = address(this);
}
addAccountData(curAddress, curSponsorAddress);
_accounts.add(curAddress);
increaseTotalSupply(tokensToMint);
increaseBalanceOf(curAddress, tokensToMint);
increaseSelfBuyOf(curAddress, selfBuy);
emit AccountCreation(curAddress, curSponsorAddress);
}
}
function isDataMigrated() public view returns(bool) {
return _accountsMigrated;
}
function finishAccountMigration() public {
require(hasRole(ACCOUNT_MANAGER_ROLE, msg.sender), "AccountStorage: must have account manager role to migrate data");
require(!_accountsMigrated, "AccountStorage: account data migration method is no more available");
_accountsMigrated = true;
emit AccountMigrationFinished();
}
function createAccount(address sponsor) public returns(bool) {
require(_accountsMigrated, "AccountStorage: account data isn't migrated yet, try later");
require(!hasAccount(msg.sender), "AccountStorage: account already exists");
address account = msg.sender;
if (sponsor == address(0)) {
sponsor = address(this);
}
addAccountData(account, sponsor);
_accounts.add(account);
emit AccountCreation(account, sponsor);
return true;
}
function setSponsorFor(address account, address newSponsor) public {
require(hasRole(ACCOUNT_MANAGER_ROLE, msg.sender), "AccountStorage: must have account manager role to change sponsor for account");
address oldSponsor = _accountsData[account].sponsor;
_accountsData[account].sponsor = newSponsor;
emit AccountSponsorUpdated(account, oldSponsor, newSponsor);
}
function getAccountsCount() public view returns(uint256) {
return _accounts.length();
}
function hasAccount(address account) public view returns(bool) {
return _accounts.contains(account);
}
function sponsorOf(address account) public view returns(address) {
return _accountsData[account].sponsor;
}
function selfBuyOf(address account) public view returns(uint256) {
return _accountsData[account].selfBuy;
}
function balanceOf(address account) public override view returns(uint256) {
return _accountsData[account].balance;
}
function directBonusOf(address account) public view returns(uint256) {
return _accountsData[account].directBonus;
}
function withdrawnAmountOf(address account) public view returns(uint256) {
return _accountsData[account].withdrawnAmount;
}
function reinvestedAmountOf(address account) public view returns(uint256) {
return _accountsData[account].reinvestedAmount;
}
function stakingBonusOf(address account) public virtual view returns(uint256);
function totalBonusOf(address account) public view returns(uint256) {
return directBonusOf(account) + stakingBonusOf(account) - withdrawnAmountOf(account) - reinvestedAmountOf(account);
}
function increaseSelfBuyOf(address account, uint256 amount) internal {
_accountsData[account].selfBuy =_accountsData[account].selfBuy.add(amount);
}
function increaseBalanceOf(address account, uint256 amount) internal {
_accountsData[account].balance = _accountsData[account].balance.add(amount);
}
function decreaseBalanceOf(address account, uint256 amount) internal {
_accountsData[account].balance = _accountsData[account].balance.sub(amount, "AccountStorage: amount exceeds balance");
}
function addDirectBonusTo(address account, uint256 amount) internal {
_accountsData[account].directBonus = _accountsData[account].directBonus.add(amount);
emit DirectBonusPaid(account, msg.sender, amount);
}
function addWithdrawnAmountTo(address account, uint256 amount) internal {
_accountsData[account].withdrawnAmount = _accountsData[account].withdrawnAmount.add(amount);
}
function addReinvestedAmountTo(address account, uint256 amount) internal {
_accountsData[account].reinvestedAmount = _accountsData[account].reinvestedAmount.add(amount);
}
function stakingValueOf(address account) internal view returns(int256) {
return _accountsData[account].stakingValue;
}
function increaseStakingValueFor(address account, int256 amount) internal {
_accountsData[account].stakingValue += amount;
}
function decreaseStakingValueFor(address account, int256 amount) internal {
_accountsData[account].stakingValue -= amount;
}
function addAccountData(address account, address sponsor) private {
AccountData memory accountData = AccountData({
sponsor: sponsor,
balance: 0,
selfBuy: 0,
directBonus: 0,
reinvestedAmount: 0,
withdrawnAmount: 0,
stakingValue: 0
});
_accountsData[account] = accountData;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
contract Company is AccessControl {
using SafeMath for uint256;
uint256 private COMPANY_FEE = 41;
uint256 private _companyBalance = 0;
event CompanyWithdraw(address indexed account, uint256 amount);
event CompanyFeeUpdate(uint256 fee);
bytes32 public constant COMPANY_MANAGER_ROLE = keccak256("COMPANY_MANAGER_ROLE");
function companyBalance() public view returns(uint256) {
return _companyBalance;
}
function getCompanyFee() public view returns(uint256) {
return COMPANY_FEE;
}
function setCompanyFee(uint256 fee) public {
require(hasRole(COMPANY_MANAGER_ROLE, msg.sender), "Company: must have company manager role");
COMPANY_FEE = fee;
emit CompanyFeeUpdate(fee);
}
function withdrawCompanyBalance(uint256 amount) public {
require(hasRole(COMPANY_MANAGER_ROLE, msg.sender), "Company: must have company manager role");
require(amount <= _companyBalance, "Company: insufficient company balance");
require(amount <= address(this).balance, "Company: insufficient contract balance");
msg.sender.transfer(amount);
_companyBalance = _companyBalance.add(amount);
emit CompanyWithdraw(msg.sender, amount);
}
function increaseCompanyBalance(uint256 amount) internal {
_companyBalance = _companyBalance.add(amount);
}
function calculateCompanyFee(uint256 amount) internal view returns(uint256) {
return SafeMath.div(SafeMath.mul(amount, COMPANY_FEE), 100);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;
pragma abicoder v2;
import "@openzeppelin/contracts/math/SafeMath.sol";
import "./AccountStorage.sol";
abstract contract DirectBonus is AccountStorage {
using SafeMath for uint256;
uint256 private DIRECT_BONUS_FEE = 10;
uint256 private MINIMUM_SELF_BUY_FOR_DIRECT_BONUS = 0.001 ether;
bytes32 public constant DIRECT_BONUS_MANAGER_ROLE = keccak256("DIRECT_BONUS_MANAGER_ROLE");
event MinimumSelfBuyForDirectBonusUpdate(uint256 amount);
event DirectBonusFeeUpdate(uint256 fee);
function getDirectBonusFee() public view returns(uint256) {
return DIRECT_BONUS_FEE;
}
function setDirectBonusFee(uint256 fee) public {
require(hasRole(DIRECT_BONUS_MANAGER_ROLE, msg.sender), "DirectBonus: must have direct bonus manager role to set direct bonus fee");
DIRECT_BONUS_FEE = fee;
emit DirectBonusFeeUpdate(fee);
}
function getMinimumSelfBuyForDirectBonus() public view returns(uint256) {
return MINIMUM_SELF_BUY_FOR_DIRECT_BONUS;
}
function setMinimumSelfBuyForDirectBonus(uint256 amount) public {
require(hasRole(DIRECT_BONUS_MANAGER_ROLE, msg.sender), "DirectBonus: must have direct bonus manager role to set minimum self buy for direct bonus");
MINIMUM_SELF_BUY_FOR_DIRECT_BONUS = amount;
emit MinimumSelfBuyForDirectBonusUpdate(amount);
}
function calculateDirectBonus(uint256 amount) internal view returns(uint256) {
return SafeMath.div(SafeMath.mul(amount, DIRECT_BONUS_FEE), 100);
}
function isEligibleForDirectBonus(address sponsor) internal view returns(bool) {
return (selfBuyOf(sponsor) >= MINIMUM_SELF_BUY_FOR_DIRECT_BONUS);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;
pragma abicoder v2;
import "@openzeppelin/contracts/access/AccessControl.sol";
import "./Founder.sol";
abstract contract Emergency is Founder {
using EnumerableSet for EnumerableSet.AddressSet;
bytes32 constant public EMERGENCY_MANAGER_ROLE = keccak256("EMERGENCY_MANAGER_ROLE");
EnumerableSet.AddressSet private _emergencyVotes;
uint256 private _emergencyThresholdCount;
bool private _emergencyVotingStarted = false;
event EmergencyVotingStarted();
event EmergencyWithdraw(address account, uint256 amount);
function isEmergencyCase() public view returns(bool) {
return _emergencyVotingStarted;
}
function emergencyContractBalanceWithdraw() public {
require(hasRole(EMERGENCY_MANAGER_ROLE, msg.sender), "Emergency: you're not allowed to do this");
require(emergencyVotesCount() >= emergencyVotingThresholdCount(), "Emergency: not enough votes for performing emergency withdraw");
msg.sender.transfer(address(this).balance);
emit EmergencyWithdraw(msg.sender, address(this).balance);
}
function voteForEmergencyCase() public returns(bool) {
require(_emergencyVotingStarted, "Emergency: emergency voting is not activated");
require(isFounder(msg.sender), "Emergency: only founders have right to vote for emergency cases");
return _emergencyVotes.add(msg.sender);
}
function emergencyVotesCount() public view returns(uint256) {
return _emergencyVotes.length();
}
function emergencyVotingThresholdCount() public view returns(uint256) {
return _emergencyThresholdCount;
}
function hasVotedForEmergency(address account) public view returns(bool) {
return _emergencyVotes.contains(account);
}
function startEmergencyVote(uint256 thresholdCount) public {
require(hasRole(EMERGENCY_MANAGER_ROLE, msg.sender), "Emergency: you're not allowed to start emergency vote");
require(0 < thresholdCount && thresholdCount <= getFoundersCount(), "Emergency: please set right threshold");
_emergencyVotingStarted = true;
_emergencyThresholdCount = thresholdCount;
emit EmergencyVotingStarted();
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;
pragma abicoder v2;
import "@openzeppelin/contracts/utils/EnumerableSet.sol";
import "./DirectBonus.sol";
abstract contract Founder is AccountStorage {
using EnumerableSet for EnumerableSet.AddressSet;
uint256 private FOUNDER_INVESTMENT_CAP_BONUS = 20 ether;
bytes32 constant public FOUNDER_MANAGER_ROLE = keccak256("FOUNDER_MANAGER_ROLE");
EnumerableSet.AddressSet private _founderAccounts;
event FounderInvestmentCapBonusUpdate(uint256 newInvestmentCapBonus);
function isFounder(address account) public view returns(bool) {
return _founderAccounts.contains(account);
}
function getFoundersCount() public view returns(uint256) {
return _founderAccounts.length();
}
function setFounderInvestmentCapBonus(uint256 investmentCapBonus) public {
require(hasRole(FOUNDER_MANAGER_ROLE, msg.sender), "Founder: must have founder manager role set investment cap bonus for founders");
FOUNDER_INVESTMENT_CAP_BONUS = investmentCapBonus;
emit FounderInvestmentCapBonusUpdate(investmentCapBonus);
}
function getFounderInvestmentCapBonus() public view returns(uint256){
return FOUNDER_INVESTMENT_CAP_BONUS;
}
function addFounder(address account) public returns(bool) {
require(hasRole(FOUNDER_MANAGER_ROLE, msg.sender), "Founder: must have founder manager role to add founder");
return _founderAccounts.add(account);
}
function removeFounder(address account) public returns(bool) {
require(hasRole(FOUNDER_MANAGER_ROLE, msg.sender), "Founder: must have founder manager role to remove founder");
return _founderAccounts.remove(account);
}
function dropFounderOnSell(address account) internal returns(bool) {
return _founderAccounts.remove(account);
}
function founderInvestmentBonusCapFor(address account) internal view returns(uint256) {
return isFounder(account) ? getFounderInvestmentCapBonus() : 0;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;
pragma abicoder v2;
import "./StandardToken.sol";
abstract contract Price is StandardToken {
using SafeMath for uint256;
uint256 constant private INITIAL_TOKEN_PRICE = 0.0000001 ether;
uint256 constant private INCREMENT_TOKEN_PRICE = 0.00000001 ether;
function tokenPrice() public view returns(uint256) {
return tokensToEthereum(1 ether);
}
function ethereumToTokens(uint256 _ethereum) internal view returns(uint256) {
uint256 _tokenPriceInitial = INITIAL_TOKEN_PRICE * 1e18;
uint256 _tokensReceived =
(
(
// underflow attempts BTFO
SafeMath.sub(
(sqrt
(
(_tokenPriceInitial**2)
+
(2*(INCREMENT_TOKEN_PRICE * 1e18)*(_ethereum * 1e18))
+
(((INCREMENT_TOKEN_PRICE)**2)*(totalSupply()**2))
+
(2*(INCREMENT_TOKEN_PRICE)*_tokenPriceInitial*totalSupply())
)
), _tokenPriceInitial
)
)/(INCREMENT_TOKEN_PRICE)
)-(totalSupply())
;
return _tokensReceived;
}
function tokensToEthereum(uint256 _tokens) internal view returns(uint256) {
uint256 tokens_ = (_tokens + 1e18);
uint256 _tokenSupply = (totalSupply() + 1e18);
uint256 _etherReceived =
(
// underflow attempts BTFO
SafeMath.add(
(
(
(
INITIAL_TOKEN_PRICE + (INCREMENT_TOKEN_PRICE * (_tokenSupply / 1e18))
) - INCREMENT_TOKEN_PRICE
) * (tokens_ - 1e18)
), (INCREMENT_TOKEN_PRICE * ((tokens_ ** 2 - tokens_) / 1e18)) / 2
)
/1e18);
return _etherReceived;
}
function sqrt(uint x) internal pure returns(uint y) {
uint z = (x + 1) / 2;
y = x;
while (z < y) {
y = z;
z = (x / z + z) / 2;
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;
pragma abicoder v2;
import "./Founder.sol";
abstract contract Sale is Founder {
using SafeMath for uint256;
uint private _saleStartBlockNumber = 0;
bytes32 public constant SALE_MANAGER_ROLE = keccak256("SALE_MANAGER_ROLE");
event SaleStarted(uint atBlockNumber, uint atTimestamp);
event NewSaleStartBlock(uint atBlockNumber, uint atTimestamp);
modifier canInvest(uint256 amount) {
require(selfBuyOf(msg.sender) + amount <= getInvestmentCap() + founderInvestmentBonusCapFor(msg.sender), "Sale: you can't invest more than current investment cap");
_;
}
function getInvestmentCap() public view returns(uint256) {
if (_saleStartBlockNumber == 0)
return 0 ether;
uint256 currentBlockNumberFromSaleStart = block.number - _saleStartBlockNumber;
if (currentBlockNumberFromSaleStart <= 1250000)
return 31680000 * (currentBlockNumberFromSaleStart**2) + 1 ether;
if (currentBlockNumberFromSaleStart <= 2500000)
return 100 ether - 31680000 * (currentBlockNumberFromSaleStart - 2500000)**2;
return 100 ether;
}
function startSale() public {
require(hasRole(SALE_MANAGER_ROLE, msg.sender), "Sale: must have sale manager role");
require(_saleStartBlockNumber == 0, "Sale: start sale method is no more available");
_saleStartBlockNumber = block.number;
emit SaleStarted(block.number, block.timestamp);
}
function moveSaleForwardBy(uint256 blocks) public {
require(hasRole(SALE_MANAGER_ROLE, msg.sender), "Sale: must have sale manager role");
require(_saleStartBlockNumber > 0, "Sale: sale forward move method is not available yet, start sale first");
require(blocks < _saleStartBlockNumber, "Sale: you can't move sale start from zero block");
_saleStartBlockNumber = _saleStartBlockNumber.sub(blocks);
emit NewSaleStartBlock(_saleStartBlockNumber, block.timestamp);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;
pragma abicoder v2;
import "@openzeppelin/contracts/math/SafeMath.sol";
import "./AccountStorage.sol";
import "./Price.sol";
abstract contract Staking is AccountStorage, Price {
using SafeMath for uint256;
uint256 private _stakingProfitPerShare;
bytes32 public constant STAKING_MANAGER_ROLE = keccak256("STAKING_MANAGER_ROLE");
bytes32 public constant LOYALTY_BONUS_MANAGER_ROLE = keccak256("LOYALTY_BONUS_MANAGER_ROLE");
uint256 constant private MAGNITUDE = 2 ** 64;
uint256 private STAKING_FEE = 8;
event StakingFeeUpdate(uint256 fee);
event LoyaltyBonusStaked(uint256 amount);
function getStakingFee() public view returns(uint256) {
return STAKING_FEE;
}
function setStakingFee(uint256 fee) public {
require(hasRole(STAKING_MANAGER_ROLE, msg.sender), "Staking: must have staking manager role to set staking fee");
STAKING_FEE = fee;
emit StakingFeeUpdate(fee);
}
function stakeLoyaltyBonus() public payable {
require(hasRole(LOYALTY_BONUS_MANAGER_ROLE, msg.sender), "Staking: must have loyalty bonus manager role to stake bonuses");
increaseStakingProfitPerShare(msg.value);
emit LoyaltyBonusStaked(msg.value);
}
function stakingBonusOf(address account) public override view returns(uint256) {
return (uint256) ((int256)(_stakingProfitPerShare * balanceOf(account)) - stakingValueOf(account)) / MAGNITUDE;
}
function calculateStakingFee(uint256 amount) internal view returns(uint256) {
return SafeMath.div(SafeMath.mul(amount, STAKING_FEE), 100);
}
function increaseStakingProfitPerShare(uint256 stakingBonus) internal {
_stakingProfitPerShare += (stakingBonus * MAGNITUDE / totalSupply());
}
function processStakingOnBuy(address account, uint256 amountOfTokens, uint256 stakingBonus) internal {
uint256 stakingFee = stakingBonus * MAGNITUDE;
if (totalSupply() > 0) {
increaseTotalSupply(amountOfTokens);
increaseStakingProfitPerShare(stakingBonus);
stakingFee = amountOfTokens * (stakingBonus * MAGNITUDE / totalSupply());
} else {
setTotalSupply(amountOfTokens);
}
int256 stakingPayout = (int256) (_stakingProfitPerShare * amountOfTokens - stakingFee);
increaseStakingValueFor(account, stakingPayout);
}
function processStakingOnSell(address account, uint256 amountOfTokens) internal returns(uint256) {
uint256 ethereum = tokensToEthereum(amountOfTokens);
uint256 stakingFee = calculateStakingFee(ethereum);
uint256 taxedEthereum = SafeMath.sub(ethereum, stakingFee);
int256 stakingValueUpdate = (int256) (_stakingProfitPerShare * amountOfTokens);
decreaseStakingValueFor(account, stakingValueUpdate);
if (totalSupply() > 0) {
increaseStakingProfitPerShare(stakingFee);
}
return taxedEthereum;
}
function processDistributionOnTransfer(address sender, uint256 amountOfTokens, address recipient, uint256 taxedTokens) internal {
uint256 stakedBonus = tokensToEthereum(SafeMath.sub(amountOfTokens, taxedTokens));
decreaseStakingValueFor(sender, (int256) (_stakingProfitPerShare * amountOfTokens));
increaseStakingValueFor(recipient, (int256) (_stakingProfitPerShare * taxedTokens));
increaseStakingProfitPerShare(stakedBonus);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.7.6;
import "@openzeppelin/contracts/GSN/Context.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts/utils/Pausable.sol";
abstract contract StandardToken is Context, AccessControl, Pausable {
using SafeMath for uint256;
uint256 private _totalSupply = 0;
string private _name;
string private _symbol;
uint8 private _decimals;
bytes32 public constant PAUSE_MANAGER_ROLE = keccak256("PAUSE_MANAGER_ROLE");
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
_decimals = 18;
}
function name() public view returns(string memory) {
return _name;
}
function symbol() public view returns(string memory) {
return _symbol;
}
function decimals() public view returns(uint8) {
return _decimals;
}
function totalSupply() public view returns(uint256) {
return _totalSupply;
}
function balanceOf(address account) public virtual view returns(uint256);
function transfer(address recipient, uint256 amount) public virtual returns(bool);
function pause() public {
require(hasRole(PAUSE_MANAGER_ROLE, msg.sender), "StandardToken: must have pauser manager role to pause");
_pause();
}
function unpause() public {
require(hasRole(PAUSE_MANAGER_ROLE, msg.sender), "StandardToken: must have pauser manager role to unpause");
_unpause();
}
function _beforeTokenTransfer(address from, address to, uint256 amount) internal view {
require(!paused(), "StandardToken: token transfer while paused");
require(from != address(0), "StandardToken: transfer from the zero address");
require(to != address(0), "StandardToken: transfer to the zero address");
}
function setTotalSupply(uint256 amount) internal {
_totalSupply = amount;
}
function increaseTotalSupply(uint256 amount) internal {
_totalSupply = _totalSupply.add(amount);
}
function decreaseTotalSupply(uint256 amount) internal {
_totalSupply = _totalSupply.sub(amount);
}
}// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../utils/Context.sol";
// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "../utils/EnumerableSet.sol";
import "../utils/Address.sol";
import "../utils/Context.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it.
*/
abstract contract AccessControl is Context {
using EnumerableSet for EnumerableSet.AddressSet;
using Address for address;
struct RoleData {
EnumerableSet.AddressSet members;
bytes32 adminRole;
}
mapping (bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view returns (bool) {
return _roles[role].members.contains(account);
}
/**
* @dev Returns the number of accounts that have `role`. Can be used
* together with {getRoleMember} to enumerate all bearers of a role.
*/
function getRoleMemberCount(bytes32 role) public view returns (uint256) {
return _roles[role].members.length();
}
/**
* @dev Returns one of the accounts that have `role`. `index` must be a
* value between 0 and {getRoleMemberCount}, non-inclusive.
*
* Role bearers are not sorted in any particular way, and their ordering may
* change at any point.
*
* WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
* you perform all queries on the same block. See the following
* https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
* for more information.
*/
function getRoleMember(bytes32 role, uint256 index) public view returns (address) {
return _roles[role].members.at(index);
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) public virtual {
require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant");
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) public virtual {
require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke");
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) public virtual {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
emit RoleAdminChanged(role, _roles[role].adminRole, adminRole);
_roles[role].adminRole = adminRole;
}
function _grantRole(bytes32 role, address account) private {
if (_roles[role].members.add(account)) {
emit RoleGranted(role, account, _msgSender());
}
}
function _revokeRole(bytes32 role, address account) private {
if (_roles[role].members.remove(account)) {
emit RoleRevoked(role, account, _msgSender());
}
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
/**
* @dev Returns the substraction of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b > a) return (false, 0);
return (true, a - b);
}
/**
* @dev Returns the multiplication of two unsigned integers, with an overflow flag.
*
* _Available since v3.4._
*/
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
/**
* @dev Returns the division of two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a / b);
}
/**
* @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
*
* _Available since v3.4._
*/
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
if (b == 0) return (false, 0);
return (true, a % b);
}
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
*
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
require(b <= a, "SafeMath: subtraction overflow");
return a - b;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
*
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
if (a == 0) return 0;
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: division by zero");
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
require(b > 0, "SafeMath: modulo by zero");
return a % b;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {trySub}.
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
*
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
return a - b;
}
/**
* @dev Returns the integer division of two unsigned integers, reverting with custom message on
* division by zero. The result is rounded towards zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryDiv}.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a / b;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* reverting with custom message when dividing by zero.
*
* CAUTION: This function is deprecated because it requires allocating memory for the error
* message unnecessarily. For custom revert reasons use {tryMod}.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
*
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b > 0, errorMessage);
return a % b;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.2 <0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
// solhint-disable-next-line no-inline-assembly
assembly { size := extcodesize(account) }
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain`call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.call{ value: value }(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
// solhint-disable-next-line avoid-low-level-calls
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
// solhint-disable-next-line no-inline-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address payable) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes memory) {
this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
return msg.data;
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping (bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) { // Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
// When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
// so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
require(set._values.length > index, "EnumerableSet: index out of bounds");
return set._values[index];
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
}// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
import "./Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor () internal {
_paused = false;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}{
"remappings": [],
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "byzantium",
"libraries": {},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sponsor","type":"address"}],"name":"AccountCreation","type":"event"},{"anonymous":false,"inputs":[],"name":"AccountMigrationFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"oldSponsor","type":"address"},{"indexed":true,"internalType":"address","name":"newSponsor","type":"address"}],"name":"AccountSponsorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethereumInvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"taxedEthereum","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensMinted","type":"uint256"}],"name":"BXFBuy","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethereumReinvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensMinted","type":"uint256"}],"name":"BXFReinvestment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenBurned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethereumGot","type":"uint256"}],"name":"BXFSell","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"CompanyFeeUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"CompanyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"DirectBonusFeeUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"fromAccount","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOfEthereum","type":"uint256"}],"name":"DirectBonusPaid","type":"event"},{"anonymous":false,"inputs":[],"name":"EmergencyVotingStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newInvestmentCapBonus","type":"uint256"}],"name":"FounderInvestmentCapBonusUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LoyaltyBonusStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"MinimumSelfBuyForDirectBonusUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"atBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"atTimestamp","type":"uint256"}],"name":"NewSaleStartBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"atBlockNumber","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"atTimestamp","type":"uint256"}],"name":"SaleStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"StakingFeeUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethereumWithdrawn","type":"uint256"}],"name":"Withdraw","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"ACCOUNT_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COMPANY_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DIRECT_BONUS_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FOUNDER_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOYALTY_BONUS_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_MANAGER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addFounder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"companyBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sponsor","type":"address"}],"name":"createAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"directBonusOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyContractBalanceWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyVotesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyVotingThresholdCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finishAccountMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAccountsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCompanyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDirectBonusFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFounderInvestmentCapBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getFoundersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInvestmentCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinimumSelfBuyForDirectBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"hasAccount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"hasVotedForEmergency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDataMigrated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isEmergencyCase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isFounder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"sponsor","type":"address"},{"internalType":"uint256","name":"tokensToMint","type":"uint256"},{"internalType":"uint256","name":"selfBuy","type":"uint256"}],"name":"migrateAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"sponsor","type":"address"},{"internalType":"uint256","name":"tokensToMint","type":"uint256"},{"internalType":"uint256","name":"selfBuy","type":"uint256"}],"internalType":"struct AccountStorage.MigrationData[]","name":"data","type":"tuple[]"}],"name":"migrateAccountsInBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"blocks","type":"uint256"}],"name":"moveSaleForwardBy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountToReinvest","type":"uint256"}],"name":"reinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"reinvestedAmountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeFounder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"selfBuyOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOfTokens","type":"uint256"}],"name":"sell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setCompanyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setDirectBonusFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"investmentCapBonus","type":"uint256"}],"name":"setFounderInvestmentCapBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMinimumSelfBuyForDirectBonus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"newSponsor","type":"address"}],"name":"setSponsorFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee","type":"uint256"}],"name":"setStakingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"sponsorOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeLoyaltyBonus","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"stakingBonusOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"thresholdCount","type":"uint256"}],"name":"startEmergencyVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"totalBonusOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"voteForEmergencyCase","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountToWithdraw","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawCompanyBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawnAmountOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6080604052600060028190556005805461ff00191690556008600a9081556029600b55600c8290556801158e460913d00000600d5560109190915560115566038d7ea4c680006012556016805460ff191690553480156200005f57600080fd5b5060405162004ac738038062004ac7833981016040819052620000829162000413565b6001805460ff19169055815182908290620000a5906003906020850190620002cc565b508051620000bb906004906020840190620002cc565b50506005805460ff1916601217905550620000e1306000640100000000620000ff810204565b620000f760003364010000000062000191810204565b50506200047a565b6040805160e081018252600160a060020a03928316815260006020808301828152838501838152606085018481526080860185815260a0870186815260c088018781529a8a16875260089095529690942094518554600160a060020a03191697169690961784555160018401559351600283015551600382015590516004820155905160058201559051600690910155565b620001a68282640100000000620001aa810204565b5050565b6000828152602081905260409020620001d290826401000000006200262a6200022f82021704565b15620001a657620001eb64010000000062000258810204565b600160a060020a031681600160a060020a0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006200024f83600160a060020a0384166401000000006200025c810204565b90505b92915050565b3390565b6000620002738383640100000000620002b4810204565b620002ab5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000252565b50600062000252565b60009081526001919091016020526040902054151590565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200030457600085556200034f565b82601f106200031f57805160ff19168380011785556200034f565b828001600101855582156200034f579182015b828111156200034f57825182559160200191906001019062000332565b506200035d92915062000361565b5090565b5b808211156200035d576000815560010162000362565b600082601f83011262000389578081fd5b81516001604060020a03808211156200039e57fe5b6040516020601f8401601f1916820181018381118382101715620003be57fe5b6040528382528584018101871015620003d5578485fd5b8492505b83831015620003f85785830181015182840182015291820191620003d9565b838311156200040957848185840101525b5095945050505050565b6000806040838503121562000426578182fd5b82516001604060020a03808211156200043d578384fd5b6200044b8683870162000378565b9350602085015191508082111562000461578283fd5b50620004708582860162000378565b9150509250929050565b61463d806200048a6000396000f3fe60806040526004361061044d576000357c0100000000000000000000000000000000000000000000000000000000900480637cd92e8b11610246578063a9059cbb1161014b578063d547741f116100d3578063e9fad8ee11610097578063e9fad8ee14610bd1578063ec0200bb14610be6578063ec35f2c914610bfb578063ef4ec04714610c10578063f587477a14610c305761044d565b8063d547741f14610b47578063d84f91e814610b67578063dd49b31314610b7c578063e30470be14610b91578063e4849b3214610bb15761044d565b8063b66a0e5d1161011a578063b66a0e5d14610ab2578063bc1265c814610ac7578063c7b5784114610ae7578063c8e40fbf14610b07578063ca15c87314610b275761044d565b8063a9059cbb14610a48578063aca1792514610a68578063adb5855d14610a7d578063b22ed9f114610a9d5761044d565b80639010d07c116101ce5780639859387b1161019d5780639859387b146109d65780639e85206f146109f6578063a217fddf14610a16578063a4a173e314610a2b578063a6f2ae3a14610a405761044d565b80639010d07c1461096157806391d148541461098157806394562799146109a157806395d89b41146109c15761044d565b80637ff9b596116102155780637ff9b596146108e257806383b4918b146108f75780638456cb59146109175780638babbc4e1461092c5780638e3b63ba1461094c5761044d565b80637cd92e8b146108785780637d7c29ac1461088d5780637d95c541146108ad5780637dae3bdf146108c25761044d565b806338d0264e116103575780634e6cabee116102df57806370a08231116102a357806370a08231146108045780637488df8914610824578063752b46bd14610839578063770e31061461084e5780637c1bc86f146108635761044d565b80634e6cabee14610785578063551b42a81461079a5780635c975abb146107af578063603c92e4146107c45780636e0024e7146107e45761044d565b80633f4ba83a116103265780633f4ba83a146107065780633fa706f61461071b578063410dbf7e146107305780634b270a46146107505780634c4c4a4a146107655761044d565b806338d0264e146106a75780633937c0b3146106bc5780633b0febba146106d15780633c9d1652146106f15761044d565b8063248a9ca3116103da5780632f2ff15d116103a95780632f2ff15d146105f8578063313ce5671461061857806334e108a61461063a57806336568abe1461066757806337ac59be146106875761044d565b8063248a9ca31461058e5780632bc1b06d146105ae5780632e1a7d4d146105c35780632f121ada146105e35761044d565b806319de9ff81161042157806319de9ff8146105045780631e295d80146105245780631f874056146105395780632263b7bb146105415780632267b30d146105615761044d565b8062cc8ad814610482578063068c7ad1146104b857806306fdde03146104cd57806318160ddd146104ef575b610458600033610c50565b6104805760405160e560020a62461bcd02815260040161047790613b1e565b60405180910390fd5b005b34801561048e57600080fd5b506104a261049d3660046134ca565b610c71565b6040516104af919061370b565b60405180910390f35b3480156104c457600080fd5b506104a2610c93565b3480156104d957600080fd5b506104e2610ca5565b6040516104af9190613714565b3480156104fb57600080fd5b506104a2610d3b565b34801561051057600080fd5b506104a261051f3660046134ca565b610d41565b34801561053057600080fd5b506104a2610d5f565b610480610d65565b34801561054d57600080fd5b5061048061055c366004613678565b610df0565b34801561056d57600080fd5b5061058161057c3660046134ca565b610f56565b6040516104af9190613700565b34801561059a57600080fd5b506104a26105a9366004613678565b610f9a565b3480156105ba57600080fd5b50610581610faf565b3480156105cf57600080fd5b506104806105de366004613678565b61100a565b3480156105ef57600080fd5b506104a2611157565b34801561060457600080fd5b50610480610613366004613690565b61115d565b34801561062457600080fd5b5061062d6111c7565b6040516104af919061431e565b34801561064657600080fd5b5061065a6106553660046134ca565b6111d0565b6040516104af91906136d3565b34801561067357600080fd5b50610480610682366004613690565b6111ee565b34801561069357600080fd5b506104806106a2366004613516565b611252565b3480156106b357600080fd5b506104a26112e1565b3480156106c857600080fd5b506104a2611305565b3480156106dd57600080fd5b506104a26106ec3660046134ca565b611329565b3480156106fd57600080fd5b506104a2611347565b34801561071257600080fd5b50610480611353565b34801561072757600080fd5b506104a26113c5565b34801561073c57600080fd5b5061048061074b366004613678565b6113cb565b34801561075c57600080fd5b506104a2611454565b34801561077157600080fd5b50610480610780366004613678565b61145a565b34801561079157600080fd5b506104a26114d8565b3480156107a657600080fd5b506104a26114de565b3480156107bb57600080fd5b50610581611502565b3480156107d057600080fd5b506105816107df3660046134ca565b61150b565b3480156107f057600080fd5b506104806107ff366004613580565b611518565b34801561081057600080fd5b506104a261081f3660046134ca565b611697565b34801561083057600080fd5b506104a26116b5565b34801561084557600080fd5b506104a26116d9565b34801561085a57600080fd5b506104a26116fd565b34801561086f57600080fd5b50610581611709565b34801561088457600080fd5b506104a2611712565b34801561089957600080fd5b506104806108a8366004613678565b611718565b3480156108b957600080fd5b50610480611796565b3480156108ce57600080fd5b506104806108dd366004613678565b611832565b3480156108ee57600080fd5b506104a26118ef565b34801561090357600080fd5b50610480610912366004613678565b611902565b34801561092357600080fd5b50610480611a4c565b34801561093857600080fd5b506104a26109473660046134ca565b611abc565b34801561095857600080fd5b506104a2611ada565b34801561096d57600080fd5b5061065a61097c3660046136b2565b611aec565b34801561098d57600080fd5b5061058161099c366004613690565b610c50565b3480156109ad57600080fd5b506104a26109bc3660046134ca565b611b04565b3480156109cd57600080fd5b506104e2611b35565b3480156109e257600080fd5b506105816109f13660046134ca565b611b96565b348015610a0257600080fd5b50610480610a113660046134e4565b611c5e565b348015610a2257600080fd5b506104a2611d06565b348015610a3757600080fd5b506104a2611d0b565b610480611d87565b348015610a5457600080fd5b50610581610a63366004613557565b611e70565b348015610a7457600080fd5b50610480611f6e565b348015610a8957600080fd5b50610480610a98366004613678565b612049565b348015610aa957600080fd5b506104a26120b5565b348015610abe57600080fd5b506104806120c7565b348015610ad357600080fd5b50610480610ae2366004613678565b612169565b348015610af357600080fd5b50610581610b023660046134ca565b61223d565b348015610b1357600080fd5b50610581610b223660046134ca565b61224a565b348015610b3357600080fd5b506104a2610b42366004613678565b612257565b348015610b5357600080fd5b50610480610b62366004613690565b61226e565b348015610b7357600080fd5b506104a26122ca565b348015610b8857600080fd5b506104a26122ee565b348015610b9d57600080fd5b506104a2610bac3660046134ca565b6122f4565b348015610bbd57600080fd5b50610480610bcc366004613678565b612323565b348015610bdd57600080fd5b50610480612482565b348015610bf257600080fd5b506104a2612511565b348015610c0757600080fd5b50610581612535565b348015610c1c57600080fd5b50610581610c2b3660046134ca565b612543565b348015610c3c57600080fd5b50610480610c4b366004613678565b612587565b6000828152602081905260408120610c68908361263f565b90505b92915050565b600160a060020a0381166000908152600860205260409020600501545b919050565b6000610c9f6013612654565b90505b90565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d315780601f10610d0657610100808354040283529160200191610d31565b820191906000526020600020905b815481529060010190602001808311610d1457829003601f168201915b5050505050905090565b60025490565b600160a060020a031660009081526008602052604090206004015490565b60155490565b610d8f7f257885c2d65fff7a90f5295f6426974c57f35a5d5ed3b27d1dcda06c63be25b333610c50565b610dae5760405160e560020a62461bcd02815260040161047790613ed5565b610db73461265f565b7f2a3e3b3e0e5115ac9a0f89f6e9d82a498367f6ff7dc0a5c6adf4b3cd91992b7e34604051610de6919061370b565b60405180910390a1565b610e1a7fcf0a9511b527d83bc52550348e78f3fd005d651c5847c550931486a9755b3edf33610c50565b610e585760405160e560020a62461bcd0281526004018080602001828103825260278152602001806145b26027913960400191505060405180910390fd5b600c54811115610e9c5760405160e560020a62461bcd0281526004018080602001828103825260258152602001806145676025913960400191505060405180910390fd5b3031811115610edf5760405160e560020a62461bcd0281526004018080602001828103825260268152602001806143ef6026913960400191505060405180910390fd5b604051339082156108fc029083906000818181858888f19350505050158015610f0c573d6000803e3d6000fd5b50600c54610f1a908261268a565b600c5560408051828152905133917f02c06d49407e00b9234fbfd019eb7182c4c33ee7412db4c28e5cb5969a6ca9b2919081900360200190a250565b6000610f7060008051602061437383398151915233610c50565b610f8f5760405160e560020a62461bcd028152600401610477906137c4565b610c6b600e836126e7565b60009081526020819052604090206002015490565b60165460009060ff16610fd75760405160e560020a62461bcd02815260040161047790614049565b610fe03361223d565b610fff5760405160e560020a62461bcd02815260040161047790614240565b610c9f60133361262a565b6005543390610100900460ff166110365760405160e560020a62461bcd02815260040161047790613984565b61103f8161224a565b61105e5760405160e560020a62461bcd02815260040161047790613f8f565b81600061106a336122f4565b90506000811161108f5760405160e560020a62461bcd02815260040161047790613e78565b808211156110b25760405160e560020a62461bcd02815260040161047790614103565b30318411156110d65760405160e560020a62461bcd02815260040161047790613f32565b336110e181866126fc565b604051339086156108fc029087906000818181858888f1935050505015801561110e573d6000803e3d6000fd5b5080600160a060020a03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436486604051611148919061370b565b60405180910390a25050505050565b600c5490565b60008281526020819052604090206002015461117b9061099c612745565b6111b95760405160e560020a62461bcd02815260040180806020018281038252602f815260200180614393602f913960400191505060405180910390fd5b6111c38282612749565b5050565b60055460ff1690565b600160a060020a039081166000908152600860205260409020541690565b6111f6612745565b600160a060020a031681600160a060020a0316146112485760405160e560020a62461bcd02815260040180806020018281038252602f8152602001806145d9602f913960400191505060405180910390fd5b6111c382826127b2565b604080516001808252818301909252600091816020015b611271613479565b815260200190600190039081611269579050509050604051806080016040528086600160a060020a0316815260200185600160a060020a0316815260200184815260200183815250816000815181106112c657fe5b60200260200101819052506112da81611518565b5050505050565b7f257885c2d65fff7a90f5295f6426974c57f35a5d5ed3b27d1dcda06c63be25b381565b7fa6b5d83d32632203555cb9b2c2f68a8d94da48cadd9266ac0d17babedb52ea5b81565b600160a060020a031660009081526008602052604090206002015490565b6000610c9f600e612654565b61137d7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a2633610c50565b6113bb5760405160e560020a62461bcd0281526004018080602001828103825260378152602001806144ba6037913960400191505060405180910390fd5b6113c361281b565b565b60115490565b6113f57fa6b5d83d32632203555cb9b2c2f68a8d94da48cadd9266ac0d17babedb52ea5b33610c50565b6114145760405160e560020a62461bcd02815260040161047790614186565b600a8190556040517ff818e99e4ccc0c14829afde18dc69b74258e535caec2aa2e7f45c3a7ad8667e39061144990839061370b565b60405180910390a150565b600a5490565b6114847f89a7f55914a854f66444abdf0d15ab6fc08519557a5b7d904849f3536632fa6933610c50565b6114a35760405160e560020a62461bcd028152600401610477906139e1565b60118190556040517fee1532a8faa6c8314d8fff280a8da6a163658f66974b2732e99c3a42558144a49061144990839061370b565b600b5490565b7f988301af8238f779281a300de031815cd01b48e9f1ae47a0f91ed6584213624a81565b60015460ff1690565b6000610c6b60138361263f565b61153060008051602061449a83398151915233610c50565b61154f5760405160e560020a62461bcd0281526004016104779061429d565b600554610100900460ff161561157a5760405160e560020a62461bcd02815260040161047790613bd8565b60005b81518110156111c357600082828151811061159457fe5b602002602001015160000151905060008383815181106115b057fe5b602002602001015160200151905060008484815181106115cc57fe5b602002602001015160400151905060008585815181106115e857fe5b60200260200101516060015190506000600160a060020a031683600160a060020a03161415611615573092505b61161f84846128c7565b61162a60068561262a565b5061163482612966565b61163e8483612979565b61164884826129c2565b82600160a060020a031684600160a060020a03167ff42594e028dc7ee5cb0166b25b3aa508d4c159d8e2228d1202e0d15f5103e4ca60405160405180910390a35050505060018101905061157d565b600160a060020a031660009081526008602052604090206001015490565b7fdc882e12f5b8cf973047e20ece7167f89c4c0d401afaebea3031a0b4acb9748981565b7fcf0a9511b527d83bc52550348e78f3fd005d651c5847c550931486a9755b3edf81565b6000610c9f6006612654565b60165460ff1690565b600d5490565b6117427f89a7f55914a854f66444abdf0d15ab6fc08519557a5b7d904849f3536632fa6933610c50565b6117615760405160e560020a62461bcd02815260040161047790613cb8565b60128190556040517f55731fa9fcf1c93e180091aa1c3123da5687df94fdd6cd9adc52155c81ed58679061144990839061370b565b6117ae60008051602061449a83398151915233610c50565b6117cd5760405160e560020a62461bcd0281526004016104779061429d565b600554610100900460ff16156117f85760405160e560020a62461bcd02815260040161047790613bd8565b6005805461ff0019166101001790556040517fc1ea53fc76944b7632054646da52f8cd19f07f107f4db68dc27b8ec402e8166090600090a1565b61185c7fdc882e12f5b8cf973047e20ece7167f89c4c0d401afaebea3031a0b4acb9748933610c50565b61187b5760405160e560020a62461bcd028152600401610477906138a4565b806000108015611892575061188e611347565b8111155b6118b15760405160e560020a62461bcd02815260040161047790613fec565b6016805460ff1916600117905560158190556040517f82f3a1fc150a2b0b3cbc95865c811f3133162139c1511495e7faa167bb525ad490600090a150565b6000610c9f670de0b6b3a7640000612a0b565b6005543390610100900460ff1661192e5760405160e560020a62461bcd02815260040161047790613984565b6119378161224a565b6119565760405160e560020a62461bcd02815260040161047790613f8f565b816000611962336122f4565b9050600081116119875760405160e560020a62461bcd02815260040161047790613e78565b808211156119aa5760405160e560020a62461bcd02815260040161047790614103565b336119b58186612aac565b6000806119c28388612af5565b9150915082600160a060020a03166000600160a060020a0316600080516020614547833981519152836040516119f8919061370b565b60405180910390a382600160a060020a03167fb88e2864a84eb395a59f3c0497ae93b7cbbcb0d69ffb688cda352c6c115c417e8883604051611a3b9291906142fa565b60405180910390a250505050505050565b611a767f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a2633610c50565b611ab45760405160e560020a62461bcd0281526004018080602001828103825260358152602001806145126035913960400191505060405180910390fd5b6113c3612c1c565b600160a060020a031660009081526008602052604090206003015490565b60008051602061437383398151915281565b6000828152602081905260408120610c689083612cae565b600068010000000000000000611b1983612cba565b611b2284611697565b600954020381611b2e57fe5b0492915050565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d315780601f10610d0657610100808354040283529160200191610d31565b600554600090610100900460ff16611bc35760405160e560020a62461bcd02815260040161047790613984565b611bcc3361224a565b15611bec5760405160e560020a62461bcd02815260040161047790613ac1565b33600160a060020a038316611bff573092505b611c0981846128c7565b611c1460068261262a565b5082600160a060020a031681600160a060020a03167ff42594e028dc7ee5cb0166b25b3aa508d4c159d8e2228d1202e0d15f5103e4ca60405160405180910390a350600192915050565b611c7660008051602061449a83398151915233610c50565b611c955760405160e560020a62461bcd02815260040161047790613d3b565b600160a060020a03808316600081815260086020526040808220805486861673ffffffffffffffffffffffffffffffffffffffff19821681179092559151919094169392849290917f0460994e3d773b08596730b6b6fcb6bc70bf60a0e89ad7c92ce701706330984b9190a4505050565b600081565b600060105460001415611d2057506000610ca2565b6010544303621312d08111611d4b576002810a6301e3660002670de0b6b3a764000001915050610ca2565b622625a08111611d77576002622625a082030a6301e366000268056bc75e2d6310000003915050610ca2565b68056bc75e2d6310000091505090565b6005543390610100900460ff16611db35760405160e560020a62461bcd02815260040161047790613984565b611dbc8161224a565b611ddb5760405160e560020a62461bcd02815260040161047790613f8f565b600080611de83334612af5565b9150915033600160a060020a03166000600160a060020a031660008051602061454783398151915283604051611e1e919061370b565b60405180910390a333600160a060020a03167f76182f9c4a872a73f7e7298ce0a4dfe633143b506bdce58cebdd086e0f8ec5fd348484604051611e6393929190614308565b60405180910390a2505050565b600081611e7c33611697565b811115611e9e5760405160e560020a62461bcd02815260040161047790613dbe565b33611eaa818686612cd8565b6000611eb585612db4565b90506000611ec38683612dcc565b9050611ece82612e2c565b611ed88387612e39565b611ee28782612979565b611eee83878984612e79565b6000600160a060020a031683600160a060020a031660008051602061454783398151915284604051611f20919061370b565b60405180910390a386600160a060020a031683600160a060020a031660008051602061454783398151915283604051611f59919061370b565b60405180910390a35060019695505050505050565b611f987fdc882e12f5b8cf973047e20ece7167f89c4c0d401afaebea3031a0b4acb9748933610c50565b611fb75760405160e560020a62461bcd02815260040161047790613a64565b611fbf610d5f565b611fc7610c93565b1015611fe85760405160e560020a62461bcd028152600401610477906141e3565b6040513390303180156108fc02916000818181858888f19350505050158015612015573d6000803e3d6000fd5b506040517f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd969590610de69033903031906136e7565b61206160008051602061437383398151915233610c50565b6120805760405160e560020a62461bcd02815260040161047790613821565b600d8190556040517fe1af7dffc759acac953a18226d13937b1e2be2595f8c6a0576342ea3e12b16c29061144990839061370b565b60008051602061449a83398151915281565b6120f17f988301af8238f779281a300de031815cd01b48e9f1ae47a0f91ed6584213624a33610c50565b6121105760405160e560020a62461bcd02815260040161047790613b7b565b601054156121335760405160e560020a62461bcd02815260040161047790613767565b4360108190556040517f87d03dcfa12666a6f670d52387c414c3147775a8cc623d78088c0e23b4a9034691610de69142906142fa565b6121937f988301af8238f779281a300de031815cd01b48e9f1ae47a0f91ed6584213624a33610c50565b6121b25760405160e560020a62461bcd02815260040161047790613b7b565b6000601054116121d75760405160e560020a62461bcd02815260040161047790613901565b60105481106121fb5760405160e560020a62461bcd02815260040161047790613e1b565b6010546122089082612dcc565b60108190556040517f383ecaa214734a9e7fcd0d2be92fa9bf4522ba8742d545b5c9af70f9083defb0916114499142906142fa565b6000610c6b600e8361263f565b6000610c6b60068361263f565b6000818152602081905260408120610c6b90612654565b60008281526020819052604090206002015461228c9061099c612745565b6112485760405160e560020a62461bcd0281526004018080602001828103825260308152602001806144156030913960400191505060405180910390fd5b7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a2681565b60125490565b60006122ff82610d41565b61230883610c71565b61231184611b04565b61231a85611abc565b01030392915050565b6005543390610100900460ff1661234f5760405160e560020a62461bcd02815260040161047790613984565b6123588161224a565b6123775760405160e560020a62461bcd02815260040161047790613f8f565b8161238133611697565b8111156123a35760405160e560020a62461bcd02815260040161047790613dbe565b336123ad84612e2c565b6123b78185612e39565b6123c08161223d565b156123d0576123ce81612eb4565b505b60006123dc8286612ec1565b604051909150339082156108fc029083906000818181858888f1935050505015801561240c573d6000803e3d6000fd5b506000600160a060020a031682600160a060020a03166000805160206145478339815191528760405161243f919061370b565b60405180910390a381600160a060020a03167fd086747da46a76e5ef0eb01edf98ac8517aebdbeff1c39b70c7ac2a44a63782486836040516111489291906142fa565b6005543390610100900460ff166124ae5760405160e560020a62461bcd02815260040161047790613984565b6124b78161224a565b6124d65760405160e560020a62461bcd02815260040161047790613f8f565b3360006124e282611697565b11156124f4576124f4610bcc82611697565b60006124ff826122f4565b11156111c3576111c36105de826122f4565b7f89a7f55914a854f66444abdf0d15ab6fc08519557a5b7d904849f3536632fa6981565b600554610100900460ff1690565b600061255d60008051602061437383398151915233610c50565b61257c5760405160e560020a62461bcd028152600401610477906140a6565b610c6b600e8361262a565b6125b17fcf0a9511b527d83bc52550348e78f3fd005d651c5847c550931486a9755b3edf33610c50565b6125ef5760405160e560020a62461bcd0281526004018080602001828103825260278152602001806145b26027913960400191505060405180910390fd5b600b8190556040805182815290517f8d65e593567aed042acd36d7296734e4f5e587f979c6b0204eee436e2e4f01e89181900360200190a150565b6000610c6883600160a060020a038416612f1d565b6000610c6883600160a060020a038416612f67565b6000610c6b82612f7f565b612667610d3b565b6801000000000000000082028161267a57fe5b6009805492909104909101905550565b600082820183811015610c68576040805160e560020a62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000610c6883600160a060020a038416612f83565b600160a060020a038216600090815260086020526040902060050154612722908261268a565b600160a060020a0390921660009081526008602052604090206005019190915550565b3390565b6000828152602081905260409020612761908261262a565b156111c35761276e612745565b600160a060020a031681600160a060020a0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020819052604090206127ca90826126e7565b156111c3576127d7612745565b600160a060020a031681600160a060020a0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b612823611502565b612877576040805160e560020a62461bcd02815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6128aa612745565b60408051600160a060020a039092168252519081900360200190a1565b6040805160e081018252600160a060020a03928316815260006020808301828152838501838152606085018481526080860185815260a0870186815260c088018781529a8a1687526008909552969094209451855473ffffffffffffffffffffffffffffffffffffffff191697169690961784555160018401559351600283015551600382015590516004820155905160058201559051600690910155565b600254612973908261268a565b60025550565b600160a060020a03821660009081526008602052604090206001015461299f908261268a565b600160a060020a0390921660009081526008602052604090206001019190915550565b600160a060020a0382166000908152600860205260409020600201546129e8908261268a565b600160a060020a0390921660009081526008602052604090206002019190915550565b6000670de0b6b3a7640000820181612a21610d3b565b670de0b6b3a76400000190506000670de0b6b3a7640000612a9b670de0b6b3a764000085036402540be400670de0b6b3a76400008681612a5d57fe5b046402540be4000264174876e8000103026002670de0b6b3a7640000876002890a0381612a8657fe5b046402540be4000281612a9557fe5b0461268a565b81612aa257fe5b0495945050505050565b600160a060020a038216600090815260086020526040902060040154612ad2908261268a565b600160a060020a0390921660009081526008602052604090206004019190915550565b60008082612b0233613049565b612b0a611d0b565b0181612b1533611329565b011115612b375760405160e560020a62461bcd02815260040161047790613c5b565b836000612b4382613067565b90506000612b5087613078565b90506000612b5d88612db4565b9050612b698484612dcc565b9350612b7483613089565b886000612b80826111d0565b9050612b8c828b6129c2565b600160a060020a038116301415612bb757612ba684613089565b612bb08685612dcc565b9550612bdc565b612bc08161309c565b15612bdc57612bcf81856130b2565b612bd98685612dcc565b95505b612be68684612dcc565b95506000612bf387613137565b9050612c008c82866131bd565b612c0a8c82612979565b959b959a509498505050505050505050565b612c24611502565b15612c79576040805160e560020a62461bcd02815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586128aa612745565b6000610c68838361322b565b600160a060020a031660009081526008602052604090206006015490565b612ce0611502565b15612d1f5760405160e560020a62461bcd02815260040180806020018281038252602a815260200180614470602a913960400191505060405180910390fd5b600160a060020a038316612d675760405160e560020a62461bcd02815260040180806020018281038252602d8152602001806143c2602d913960400191505060405180910390fd5b600160a060020a038216612daf5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180614445602b913960400191505060405180910390fd5b505050565b6000610c6b612dc583600a54613292565b60646132ee565b600082821115612e26576040805160e560020a62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6002546129739082612dcc565b61299f8160405180606001604052806026815260200161458c60269139600160a060020a0385166000908152600860205260409020600101549190613358565b6000612e8d612e888584612dcc565b612a0b565b9050612e9d8585600954026133f2565b612eab838360095402613418565b6112da8161265f565b6000610c6b600e836126e7565b600080612ecd83612a0b565b90506000612eda82612db4565b90506000612ee88383612dcc565b6009549091508502612efa87826133f2565b6000612f04610d3b565b1115612f1357612f138361265f565b5095945050505050565b6000612f298383612f67565b612f5f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c6b565b506000610c6b565b60009081526001919091016020526040902054151590565b5490565b6000818152600183016020526040812054801561303f5783546000198083019190810190600090879083908110612fb657fe5b9060005260206000200154905080876000018481548110612fd357fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061300357fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610c6b565b6000915050610c6b565b60006130548261223d565b61305f576000610c6b565b610c6b611712565b6000610c6b612dc583600b54613292565b6000610c6b612dc583601154613292565b600c54613096908261268a565b600c5550565b60006012546130aa83611329565b101592915050565b600160a060020a0382166000908152600860205260409020600301546130d8908261268a565b600160a060020a038316600081815260086020526040908190206003019290925590513391907fd49ca1e65d3d4924d717338dbd09fe8b97d122da780f18088f1938c1d51c79729061312b90859061370b565b60405180910390a35050565b60006c01431e0fae6d7217caa000000081613150610d3b565b6402540be4006131ac6131a6613164610d3b565b86026404a817c800026002613177610d3b565b0a68056bc75e2d6310000002730380d4bd8a8678c1bb542c80deb48000000000008a026002890a01010161343d565b85612dcc565b816131b357fe5b0403949350505050565b68010000000000000000810260006131d3610d3b565b1115613210576131e283612966565b6131eb8261265f565b6131f3610d3b565b6801000000000000000083028161320657fe5b0483029050613219565b61321983613474565b60095483028190036112da8582613418565b815460009082106132705760405160e560020a62461bcd0281526004018080602001828103825260228152602001806143516022913960400191505060405180910390fd5b82600001828154811061327f57fe5b9060005260206000200154905092915050565b6000826132a157506000610c6b565b828202828482816132ae57fe5b0414610c685760405160e560020a62461bcd0281526004018080602001828103825260218152602001806144f16021913960400191505060405180910390fd5b6000808211613347576040805160e560020a62461bcd02815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161335057fe5b049392505050565b600081848411156133ea5760405160e560020a62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b838110156133af578181015183820152602001613397565b50505050905090810190601f1680156133dc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600160a060020a0390911660009081526008602052604090206006018054919091039055565b600160a060020a03909116600090815260086020526040902060060180549091019055565b80600260018201045b8181101561346e5780915060028182858161345d57fe5b04018161346657fe5b049050613446565b50919050565b600255565b60405180608001604052806000600160a060020a031681526020016000600160a060020a0316815260200160008152602001600081525090565b8035600160a060020a0381168114610c8e57600080fd5b6000602082840312156134db578081fd5b610c68826134b3565b600080604083850312156134f6578081fd5b6134ff836134b3565b915061350d602084016134b3565b90509250929050565b6000806000806080858703121561352b578182fd5b613534856134b3565b9350613542602086016134b3565b93969395505050506040820135916060013590565b60008060408385031215613569578182fd5b613572836134b3565b946020939093013593505050565b60006020808385031215613592578182fd5b823567ffffffffffffffff808211156135a9578384fd5b818501915085601f8301126135bc578384fd5b8135818111156135c857fe5b6135d5848583020161432c565b818152848101908486016080808502870188018b10156135f3578889fd5b8896505b848710156136695780828c03121561360d578889fd5b60408051828101818110898211171561362257fe5b825261362d846134b3565b815261363a8a85016134b3565b818b015283820135918101919091526060808401359082015284526001969096019592870192908101906135f7565b50909998505050505050505050565b600060208284031215613689578081fd5b5035919050565b600080604083850312156136a2578182fd5b8235915061350d602084016134b3565b600080604083850312156136c4578182fd5b50508035926020909101359150565b600160a060020a0391909116815260200190565b600160a060020a03929092168252602082015260400190565b901515815260200190565b90815260200190565b6000602080835283518082850152825b8181101561374057858101830151858201604001528201613724565b818111156137515783604083870101525b50601f01601f1916929092016040019392505050565b6020808252602c908201527f53616c653a2073746172742073616c65206d6574686f64206973206e6f206d6f60408201527f726520617661696c61626c650000000000000000000000000000000000000000606082015260800190565b60208082526039908201527f466f756e6465723a206d757374206861766520666f756e646572206d616e616760408201527f657220726f6c6520746f2072656d6f766520666f756e64657200000000000000606082015260800190565b6020808252604d908201527f466f756e6465723a206d757374206861766520666f756e646572206d616e616760408201527f657220726f6c652073657420696e766573746d656e742063617020626f6e757360608201527f20666f7220666f756e6465727300000000000000000000000000000000000000608082015260a00190565b60208082526035908201527f456d657267656e63793a20796f75277265206e6f7420616c6c6f77656420746f60408201527f20737461727420656d657267656e637920766f74650000000000000000000000606082015260800190565b60208082526045908201527f53616c653a2073616c6520666f7277617264206d6f7665206d6574686f64206960408201527f73206e6f7420617661696c61626c65207965742c2073746172742073616c652060608201527f6669727374000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603a908201527f4163636f756e7453746f726167653a206163636f756e7420646174612069736e60408201527f2774206d69677261746564207965742c20747279206c61746572000000000000606082015260800190565b60208082526048908201527f446972656374426f6e75733a206d75737420686176652064697265637420626f60408201527f6e7573206d616e6167657220726f6c6520746f2073657420646972656374206260608201527f6f6e757320666565000000000000000000000000000000000000000000000000608082015260a00190565b60208082526028908201527f456d657267656e63793a20796f75277265206e6f7420616c6c6f77656420746f60408201527f20646f2074686973000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4163636f756e7453746f726167653a206163636f756e7420616c72656164792060408201527f6578697374730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f425846546f6b656e3a20796f75277265206e6f7420616c6c6f77656420746f2060408201527f646f207468697300000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f53616c653a206d75737420686176652073616c65206d616e6167657220726f6c60408201527f6500000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526042908201527f4163636f756e7453746f726167653a206163636f756e742064617461206d696760408201527f726174696f6e206d6574686f64206973206e6f206d6f726520617661696c616260608201527f6c65000000000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526037908201527f53616c653a20796f752063616e277420696e76657374206d6f7265207468616e60408201527f2063757272656e7420696e766573746d656e7420636170000000000000000000606082015260800190565b60208082526059908201527f446972656374426f6e75733a206d75737420686176652064697265637420626f60408201527f6e7573206d616e6167657220726f6c6520746f20736574206d696e696d756d2060608201527f73656c662062757920666f722064697265637420626f6e757300000000000000608082015260a00190565b6020808252604c908201527f4163636f756e7453746f726167653a206d7573742068617665206163636f756e60408201527f74206d616e6167657220726f6c6520746f206368616e67652073706f6e736f7260608201527f20666f72206163636f756e740000000000000000000000000000000000000000608082015260a00190565b6020808252602c908201527f4163636f756e7453746f726167653a20696e73756666696369656e742061636360408201527f6f756e742062616c616e63650000000000000000000000000000000000000000606082015260800190565b6020808252602f908201527f53616c653a20796f752063616e2774206d6f76652073616c652073746172742060408201527f66726f6d207a65726f20626c6f636b0000000000000000000000000000000000606082015260800190565b60208082526032908201527f4163636f756e7453746f726167653a20796f7520646f6e27742068617665206160408201527f6e7920617661696c61626c652065746865720000000000000000000000000000606082015260800190565b6020808252603e908201527f5374616b696e673a206d7573742068617665206c6f79616c747920626f6e757360408201527f206d616e6167657220726f6c6520746f207374616b6520626f6e757365730000606082015260800190565b60208082526027908201527f425846546f6b656e3a20696e73756666696369656e7420636f6e74726163742060408201527f62616c616e636500000000000000000000000000000000000000000000000000606082015260800190565b60208082526030908201527f4163636f756e7453746f726167653a206163636f756e74206d7573742062652060408201527f7265676973746572656420666972737400000000000000000000000000000000606082015260800190565b60208082526025908201527f456d657267656e63793a20706c6561736520736574207269676874207468726560408201527f73686f6c64000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f456d657267656e63793a20656d657267656e637920766f74696e67206973206e60408201527f6f74206163746976617465640000000000000000000000000000000000000000606082015260800190565b60208082526036908201527f466f756e6465723a206d757374206861766520666f756e646572206d616e616760408201527f657220726f6c6520746f2061646420666f756e64657200000000000000000000606082015260800190565b6020808252604a908201527f4163636f756e7453746f726167653a20796f7520646f6e27742068617665206560408201527f6e6f75676820617661696c61626c6520657468657220746f20706572666f726d60608201527f206f7065726174696f6e00000000000000000000000000000000000000000000608082015260a00190565b6020808252603a908201527f5374616b696e673a206d7573742068617665207374616b696e67206d616e616760408201527f657220726f6c6520746f20736574207374616b696e6720666565000000000000606082015260800190565b6020808252603d908201527f456d657267656e63793a206e6f7420656e6f75676820766f74657320666f722060408201527f706572666f726d696e6720656d657267656e6379207769746864726177000000606082015260800190565b6020808252603f908201527f456d657267656e63793a206f6e6c7920666f756e64657273206861766520726960408201527f67687420746f20766f746520666f7220656d657267656e637920636173657300606082015260800190565b6020808252603e908201527f4163636f756e7453746f726167653a206d7573742068617665206163636f756e60408201527f74206d616e6167657220726f6c6520746f206d69677261746520646174610000606082015260800190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561434857fe5b60405291905056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64737beae834696df183bee4ced95908c0d088f2e451dcb8e99b57ccbcc3c8789c93416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e745374616e64617264546f6b656e3a207472616e736665722066726f6d20746865207a65726f2061646472657373436f6d70616e793a20696e73756666696369656e7420636f6e74726163742062616c616e6365416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b655374616e64617264546f6b656e3a207472616e7366657220746f20746865207a65726f20616464726573735374616e64617264546f6b656e3a20746f6b656e207472616e73666572207768696c65207061757365646347c6aea93629aaea238956eaec9051cb6c00a31afc4f20af3aeaf1448809be5374616e64617264546f6b656e3a206d757374206861766520706175736572206d616e6167657220726f6c6520746f20756e7061757365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775374616e64617264546f6b656e3a206d757374206861766520706175736572206d616e6167657220726f6c6520746f207061757365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef436f6d70616e793a20696e73756666696369656e7420636f6d70616e792062616c616e63654163636f756e7453746f726167653a20616d6f756e7420657863656564732062616c616e6365436f6d70616e793a206d757374206861766520636f6d70616e79206d616e6167657220726f6c65416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a264697066735822122036ebacece720a4e10de8f7def14d61c7e0d0750a0833f37b77208a6c117b568564736f6c6343000706003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000f426c61636b466f727420546f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034258460000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061044d576000357c0100000000000000000000000000000000000000000000000000000000900480637cd92e8b11610246578063a9059cbb1161014b578063d547741f116100d3578063e9fad8ee11610097578063e9fad8ee14610bd1578063ec0200bb14610be6578063ec35f2c914610bfb578063ef4ec04714610c10578063f587477a14610c305761044d565b8063d547741f14610b47578063d84f91e814610b67578063dd49b31314610b7c578063e30470be14610b91578063e4849b3214610bb15761044d565b8063b66a0e5d1161011a578063b66a0e5d14610ab2578063bc1265c814610ac7578063c7b5784114610ae7578063c8e40fbf14610b07578063ca15c87314610b275761044d565b8063a9059cbb14610a48578063aca1792514610a68578063adb5855d14610a7d578063b22ed9f114610a9d5761044d565b80639010d07c116101ce5780639859387b1161019d5780639859387b146109d65780639e85206f146109f6578063a217fddf14610a16578063a4a173e314610a2b578063a6f2ae3a14610a405761044d565b80639010d07c1461096157806391d148541461098157806394562799146109a157806395d89b41146109c15761044d565b80637ff9b596116102155780637ff9b596146108e257806383b4918b146108f75780638456cb59146109175780638babbc4e1461092c5780638e3b63ba1461094c5761044d565b80637cd92e8b146108785780637d7c29ac1461088d5780637d95c541146108ad5780637dae3bdf146108c25761044d565b806338d0264e116103575780634e6cabee116102df57806370a08231116102a357806370a08231146108045780637488df8914610824578063752b46bd14610839578063770e31061461084e5780637c1bc86f146108635761044d565b80634e6cabee14610785578063551b42a81461079a5780635c975abb146107af578063603c92e4146107c45780636e0024e7146107e45761044d565b80633f4ba83a116103265780633f4ba83a146107065780633fa706f61461071b578063410dbf7e146107305780634b270a46146107505780634c4c4a4a146107655761044d565b806338d0264e146106a75780633937c0b3146106bc5780633b0febba146106d15780633c9d1652146106f15761044d565b8063248a9ca3116103da5780632f2ff15d116103a95780632f2ff15d146105f8578063313ce5671461061857806334e108a61461063a57806336568abe1461066757806337ac59be146106875761044d565b8063248a9ca31461058e5780632bc1b06d146105ae5780632e1a7d4d146105c35780632f121ada146105e35761044d565b806319de9ff81161042157806319de9ff8146105045780631e295d80146105245780631f874056146105395780632263b7bb146105415780632267b30d146105615761044d565b8062cc8ad814610482578063068c7ad1146104b857806306fdde03146104cd57806318160ddd146104ef575b610458600033610c50565b6104805760405160e560020a62461bcd02815260040161047790613b1e565b60405180910390fd5b005b34801561048e57600080fd5b506104a261049d3660046134ca565b610c71565b6040516104af919061370b565b60405180910390f35b3480156104c457600080fd5b506104a2610c93565b3480156104d957600080fd5b506104e2610ca5565b6040516104af9190613714565b3480156104fb57600080fd5b506104a2610d3b565b34801561051057600080fd5b506104a261051f3660046134ca565b610d41565b34801561053057600080fd5b506104a2610d5f565b610480610d65565b34801561054d57600080fd5b5061048061055c366004613678565b610df0565b34801561056d57600080fd5b5061058161057c3660046134ca565b610f56565b6040516104af9190613700565b34801561059a57600080fd5b506104a26105a9366004613678565b610f9a565b3480156105ba57600080fd5b50610581610faf565b3480156105cf57600080fd5b506104806105de366004613678565b61100a565b3480156105ef57600080fd5b506104a2611157565b34801561060457600080fd5b50610480610613366004613690565b61115d565b34801561062457600080fd5b5061062d6111c7565b6040516104af919061431e565b34801561064657600080fd5b5061065a6106553660046134ca565b6111d0565b6040516104af91906136d3565b34801561067357600080fd5b50610480610682366004613690565b6111ee565b34801561069357600080fd5b506104806106a2366004613516565b611252565b3480156106b357600080fd5b506104a26112e1565b3480156106c857600080fd5b506104a2611305565b3480156106dd57600080fd5b506104a26106ec3660046134ca565b611329565b3480156106fd57600080fd5b506104a2611347565b34801561071257600080fd5b50610480611353565b34801561072757600080fd5b506104a26113c5565b34801561073c57600080fd5b5061048061074b366004613678565b6113cb565b34801561075c57600080fd5b506104a2611454565b34801561077157600080fd5b50610480610780366004613678565b61145a565b34801561079157600080fd5b506104a26114d8565b3480156107a657600080fd5b506104a26114de565b3480156107bb57600080fd5b50610581611502565b3480156107d057600080fd5b506105816107df3660046134ca565b61150b565b3480156107f057600080fd5b506104806107ff366004613580565b611518565b34801561081057600080fd5b506104a261081f3660046134ca565b611697565b34801561083057600080fd5b506104a26116b5565b34801561084557600080fd5b506104a26116d9565b34801561085a57600080fd5b506104a26116fd565b34801561086f57600080fd5b50610581611709565b34801561088457600080fd5b506104a2611712565b34801561089957600080fd5b506104806108a8366004613678565b611718565b3480156108b957600080fd5b50610480611796565b3480156108ce57600080fd5b506104806108dd366004613678565b611832565b3480156108ee57600080fd5b506104a26118ef565b34801561090357600080fd5b50610480610912366004613678565b611902565b34801561092357600080fd5b50610480611a4c565b34801561093857600080fd5b506104a26109473660046134ca565b611abc565b34801561095857600080fd5b506104a2611ada565b34801561096d57600080fd5b5061065a61097c3660046136b2565b611aec565b34801561098d57600080fd5b5061058161099c366004613690565b610c50565b3480156109ad57600080fd5b506104a26109bc3660046134ca565b611b04565b3480156109cd57600080fd5b506104e2611b35565b3480156109e257600080fd5b506105816109f13660046134ca565b611b96565b348015610a0257600080fd5b50610480610a113660046134e4565b611c5e565b348015610a2257600080fd5b506104a2611d06565b348015610a3757600080fd5b506104a2611d0b565b610480611d87565b348015610a5457600080fd5b50610581610a63366004613557565b611e70565b348015610a7457600080fd5b50610480611f6e565b348015610a8957600080fd5b50610480610a98366004613678565b612049565b348015610aa957600080fd5b506104a26120b5565b348015610abe57600080fd5b506104806120c7565b348015610ad357600080fd5b50610480610ae2366004613678565b612169565b348015610af357600080fd5b50610581610b023660046134ca565b61223d565b348015610b1357600080fd5b50610581610b223660046134ca565b61224a565b348015610b3357600080fd5b506104a2610b42366004613678565b612257565b348015610b5357600080fd5b50610480610b62366004613690565b61226e565b348015610b7357600080fd5b506104a26122ca565b348015610b8857600080fd5b506104a26122ee565b348015610b9d57600080fd5b506104a2610bac3660046134ca565b6122f4565b348015610bbd57600080fd5b50610480610bcc366004613678565b612323565b348015610bdd57600080fd5b50610480612482565b348015610bf257600080fd5b506104a2612511565b348015610c0757600080fd5b50610581612535565b348015610c1c57600080fd5b50610581610c2b3660046134ca565b612543565b348015610c3c57600080fd5b50610480610c4b366004613678565b612587565b6000828152602081905260408120610c68908361263f565b90505b92915050565b600160a060020a0381166000908152600860205260409020600501545b919050565b6000610c9f6013612654565b90505b90565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d315780601f10610d0657610100808354040283529160200191610d31565b820191906000526020600020905b815481529060010190602001808311610d1457829003601f168201915b5050505050905090565b60025490565b600160a060020a031660009081526008602052604090206004015490565b60155490565b610d8f7f257885c2d65fff7a90f5295f6426974c57f35a5d5ed3b27d1dcda06c63be25b333610c50565b610dae5760405160e560020a62461bcd02815260040161047790613ed5565b610db73461265f565b7f2a3e3b3e0e5115ac9a0f89f6e9d82a498367f6ff7dc0a5c6adf4b3cd91992b7e34604051610de6919061370b565b60405180910390a1565b610e1a7fcf0a9511b527d83bc52550348e78f3fd005d651c5847c550931486a9755b3edf33610c50565b610e585760405160e560020a62461bcd0281526004018080602001828103825260278152602001806145b26027913960400191505060405180910390fd5b600c54811115610e9c5760405160e560020a62461bcd0281526004018080602001828103825260258152602001806145676025913960400191505060405180910390fd5b3031811115610edf5760405160e560020a62461bcd0281526004018080602001828103825260268152602001806143ef6026913960400191505060405180910390fd5b604051339082156108fc029083906000818181858888f19350505050158015610f0c573d6000803e3d6000fd5b50600c54610f1a908261268a565b600c5560408051828152905133917f02c06d49407e00b9234fbfd019eb7182c4c33ee7412db4c28e5cb5969a6ca9b2919081900360200190a250565b6000610f7060008051602061437383398151915233610c50565b610f8f5760405160e560020a62461bcd028152600401610477906137c4565b610c6b600e836126e7565b60009081526020819052604090206002015490565b60165460009060ff16610fd75760405160e560020a62461bcd02815260040161047790614049565b610fe03361223d565b610fff5760405160e560020a62461bcd02815260040161047790614240565b610c9f60133361262a565b6005543390610100900460ff166110365760405160e560020a62461bcd02815260040161047790613984565b61103f8161224a565b61105e5760405160e560020a62461bcd02815260040161047790613f8f565b81600061106a336122f4565b90506000811161108f5760405160e560020a62461bcd02815260040161047790613e78565b808211156110b25760405160e560020a62461bcd02815260040161047790614103565b30318411156110d65760405160e560020a62461bcd02815260040161047790613f32565b336110e181866126fc565b604051339086156108fc029087906000818181858888f1935050505015801561110e573d6000803e3d6000fd5b5080600160a060020a03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436486604051611148919061370b565b60405180910390a25050505050565b600c5490565b60008281526020819052604090206002015461117b9061099c612745565b6111b95760405160e560020a62461bcd02815260040180806020018281038252602f815260200180614393602f913960400191505060405180910390fd5b6111c38282612749565b5050565b60055460ff1690565b600160a060020a039081166000908152600860205260409020541690565b6111f6612745565b600160a060020a031681600160a060020a0316146112485760405160e560020a62461bcd02815260040180806020018281038252602f8152602001806145d9602f913960400191505060405180910390fd5b6111c382826127b2565b604080516001808252818301909252600091816020015b611271613479565b815260200190600190039081611269579050509050604051806080016040528086600160a060020a0316815260200185600160a060020a0316815260200184815260200183815250816000815181106112c657fe5b60200260200101819052506112da81611518565b5050505050565b7f257885c2d65fff7a90f5295f6426974c57f35a5d5ed3b27d1dcda06c63be25b381565b7fa6b5d83d32632203555cb9b2c2f68a8d94da48cadd9266ac0d17babedb52ea5b81565b600160a060020a031660009081526008602052604090206002015490565b6000610c9f600e612654565b61137d7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a2633610c50565b6113bb5760405160e560020a62461bcd0281526004018080602001828103825260378152602001806144ba6037913960400191505060405180910390fd5b6113c361281b565b565b60115490565b6113f57fa6b5d83d32632203555cb9b2c2f68a8d94da48cadd9266ac0d17babedb52ea5b33610c50565b6114145760405160e560020a62461bcd02815260040161047790614186565b600a8190556040517ff818e99e4ccc0c14829afde18dc69b74258e535caec2aa2e7f45c3a7ad8667e39061144990839061370b565b60405180910390a150565b600a5490565b6114847f89a7f55914a854f66444abdf0d15ab6fc08519557a5b7d904849f3536632fa6933610c50565b6114a35760405160e560020a62461bcd028152600401610477906139e1565b60118190556040517fee1532a8faa6c8314d8fff280a8da6a163658f66974b2732e99c3a42558144a49061144990839061370b565b600b5490565b7f988301af8238f779281a300de031815cd01b48e9f1ae47a0f91ed6584213624a81565b60015460ff1690565b6000610c6b60138361263f565b61153060008051602061449a83398151915233610c50565b61154f5760405160e560020a62461bcd0281526004016104779061429d565b600554610100900460ff161561157a5760405160e560020a62461bcd02815260040161047790613bd8565b60005b81518110156111c357600082828151811061159457fe5b602002602001015160000151905060008383815181106115b057fe5b602002602001015160200151905060008484815181106115cc57fe5b602002602001015160400151905060008585815181106115e857fe5b60200260200101516060015190506000600160a060020a031683600160a060020a03161415611615573092505b61161f84846128c7565b61162a60068561262a565b5061163482612966565b61163e8483612979565b61164884826129c2565b82600160a060020a031684600160a060020a03167ff42594e028dc7ee5cb0166b25b3aa508d4c159d8e2228d1202e0d15f5103e4ca60405160405180910390a35050505060018101905061157d565b600160a060020a031660009081526008602052604090206001015490565b7fdc882e12f5b8cf973047e20ece7167f89c4c0d401afaebea3031a0b4acb9748981565b7fcf0a9511b527d83bc52550348e78f3fd005d651c5847c550931486a9755b3edf81565b6000610c9f6006612654565b60165460ff1690565b600d5490565b6117427f89a7f55914a854f66444abdf0d15ab6fc08519557a5b7d904849f3536632fa6933610c50565b6117615760405160e560020a62461bcd02815260040161047790613cb8565b60128190556040517f55731fa9fcf1c93e180091aa1c3123da5687df94fdd6cd9adc52155c81ed58679061144990839061370b565b6117ae60008051602061449a83398151915233610c50565b6117cd5760405160e560020a62461bcd0281526004016104779061429d565b600554610100900460ff16156117f85760405160e560020a62461bcd02815260040161047790613bd8565b6005805461ff0019166101001790556040517fc1ea53fc76944b7632054646da52f8cd19f07f107f4db68dc27b8ec402e8166090600090a1565b61185c7fdc882e12f5b8cf973047e20ece7167f89c4c0d401afaebea3031a0b4acb9748933610c50565b61187b5760405160e560020a62461bcd028152600401610477906138a4565b806000108015611892575061188e611347565b8111155b6118b15760405160e560020a62461bcd02815260040161047790613fec565b6016805460ff1916600117905560158190556040517f82f3a1fc150a2b0b3cbc95865c811f3133162139c1511495e7faa167bb525ad490600090a150565b6000610c9f670de0b6b3a7640000612a0b565b6005543390610100900460ff1661192e5760405160e560020a62461bcd02815260040161047790613984565b6119378161224a565b6119565760405160e560020a62461bcd02815260040161047790613f8f565b816000611962336122f4565b9050600081116119875760405160e560020a62461bcd02815260040161047790613e78565b808211156119aa5760405160e560020a62461bcd02815260040161047790614103565b336119b58186612aac565b6000806119c28388612af5565b9150915082600160a060020a03166000600160a060020a0316600080516020614547833981519152836040516119f8919061370b565b60405180910390a382600160a060020a03167fb88e2864a84eb395a59f3c0497ae93b7cbbcb0d69ffb688cda352c6c115c417e8883604051611a3b9291906142fa565b60405180910390a250505050505050565b611a767f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a2633610c50565b611ab45760405160e560020a62461bcd0281526004018080602001828103825260358152602001806145126035913960400191505060405180910390fd5b6113c3612c1c565b600160a060020a031660009081526008602052604090206003015490565b60008051602061437383398151915281565b6000828152602081905260408120610c689083612cae565b600068010000000000000000611b1983612cba565b611b2284611697565b600954020381611b2e57fe5b0492915050565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610d315780601f10610d0657610100808354040283529160200191610d31565b600554600090610100900460ff16611bc35760405160e560020a62461bcd02815260040161047790613984565b611bcc3361224a565b15611bec5760405160e560020a62461bcd02815260040161047790613ac1565b33600160a060020a038316611bff573092505b611c0981846128c7565b611c1460068261262a565b5082600160a060020a031681600160a060020a03167ff42594e028dc7ee5cb0166b25b3aa508d4c159d8e2228d1202e0d15f5103e4ca60405160405180910390a350600192915050565b611c7660008051602061449a83398151915233610c50565b611c955760405160e560020a62461bcd02815260040161047790613d3b565b600160a060020a03808316600081815260086020526040808220805486861673ffffffffffffffffffffffffffffffffffffffff19821681179092559151919094169392849290917f0460994e3d773b08596730b6b6fcb6bc70bf60a0e89ad7c92ce701706330984b9190a4505050565b600081565b600060105460001415611d2057506000610ca2565b6010544303621312d08111611d4b576002810a6301e3660002670de0b6b3a764000001915050610ca2565b622625a08111611d77576002622625a082030a6301e366000268056bc75e2d6310000003915050610ca2565b68056bc75e2d6310000091505090565b6005543390610100900460ff16611db35760405160e560020a62461bcd02815260040161047790613984565b611dbc8161224a565b611ddb5760405160e560020a62461bcd02815260040161047790613f8f565b600080611de83334612af5565b9150915033600160a060020a03166000600160a060020a031660008051602061454783398151915283604051611e1e919061370b565b60405180910390a333600160a060020a03167f76182f9c4a872a73f7e7298ce0a4dfe633143b506bdce58cebdd086e0f8ec5fd348484604051611e6393929190614308565b60405180910390a2505050565b600081611e7c33611697565b811115611e9e5760405160e560020a62461bcd02815260040161047790613dbe565b33611eaa818686612cd8565b6000611eb585612db4565b90506000611ec38683612dcc565b9050611ece82612e2c565b611ed88387612e39565b611ee28782612979565b611eee83878984612e79565b6000600160a060020a031683600160a060020a031660008051602061454783398151915284604051611f20919061370b565b60405180910390a386600160a060020a031683600160a060020a031660008051602061454783398151915283604051611f59919061370b565b60405180910390a35060019695505050505050565b611f987fdc882e12f5b8cf973047e20ece7167f89c4c0d401afaebea3031a0b4acb9748933610c50565b611fb75760405160e560020a62461bcd02815260040161047790613a64565b611fbf610d5f565b611fc7610c93565b1015611fe85760405160e560020a62461bcd028152600401610477906141e3565b6040513390303180156108fc02916000818181858888f19350505050158015612015573d6000803e3d6000fd5b506040517f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd969590610de69033903031906136e7565b61206160008051602061437383398151915233610c50565b6120805760405160e560020a62461bcd02815260040161047790613821565b600d8190556040517fe1af7dffc759acac953a18226d13937b1e2be2595f8c6a0576342ea3e12b16c29061144990839061370b565b60008051602061449a83398151915281565b6120f17f988301af8238f779281a300de031815cd01b48e9f1ae47a0f91ed6584213624a33610c50565b6121105760405160e560020a62461bcd02815260040161047790613b7b565b601054156121335760405160e560020a62461bcd02815260040161047790613767565b4360108190556040517f87d03dcfa12666a6f670d52387c414c3147775a8cc623d78088c0e23b4a9034691610de69142906142fa565b6121937f988301af8238f779281a300de031815cd01b48e9f1ae47a0f91ed6584213624a33610c50565b6121b25760405160e560020a62461bcd02815260040161047790613b7b565b6000601054116121d75760405160e560020a62461bcd02815260040161047790613901565b60105481106121fb5760405160e560020a62461bcd02815260040161047790613e1b565b6010546122089082612dcc565b60108190556040517f383ecaa214734a9e7fcd0d2be92fa9bf4522ba8742d545b5c9af70f9083defb0916114499142906142fa565b6000610c6b600e8361263f565b6000610c6b60068361263f565b6000818152602081905260408120610c6b90612654565b60008281526020819052604090206002015461228c9061099c612745565b6112485760405160e560020a62461bcd0281526004018080602001828103825260308152602001806144156030913960400191505060405180910390fd5b7f356a809dfdea9198dd76fb76bf6d403ecf13ea675eb89e1eda2db2c4a4676a2681565b60125490565b60006122ff82610d41565b61230883610c71565b61231184611b04565b61231a85611abc565b01030392915050565b6005543390610100900460ff1661234f5760405160e560020a62461bcd02815260040161047790613984565b6123588161224a565b6123775760405160e560020a62461bcd02815260040161047790613f8f565b8161238133611697565b8111156123a35760405160e560020a62461bcd02815260040161047790613dbe565b336123ad84612e2c565b6123b78185612e39565b6123c08161223d565b156123d0576123ce81612eb4565b505b60006123dc8286612ec1565b604051909150339082156108fc029083906000818181858888f1935050505015801561240c573d6000803e3d6000fd5b506000600160a060020a031682600160a060020a03166000805160206145478339815191528760405161243f919061370b565b60405180910390a381600160a060020a03167fd086747da46a76e5ef0eb01edf98ac8517aebdbeff1c39b70c7ac2a44a63782486836040516111489291906142fa565b6005543390610100900460ff166124ae5760405160e560020a62461bcd02815260040161047790613984565b6124b78161224a565b6124d65760405160e560020a62461bcd02815260040161047790613f8f565b3360006124e282611697565b11156124f4576124f4610bcc82611697565b60006124ff826122f4565b11156111c3576111c36105de826122f4565b7f89a7f55914a854f66444abdf0d15ab6fc08519557a5b7d904849f3536632fa6981565b600554610100900460ff1690565b600061255d60008051602061437383398151915233610c50565b61257c5760405160e560020a62461bcd028152600401610477906140a6565b610c6b600e8361262a565b6125b17fcf0a9511b527d83bc52550348e78f3fd005d651c5847c550931486a9755b3edf33610c50565b6125ef5760405160e560020a62461bcd0281526004018080602001828103825260278152602001806145b26027913960400191505060405180910390fd5b600b8190556040805182815290517f8d65e593567aed042acd36d7296734e4f5e587f979c6b0204eee436e2e4f01e89181900360200190a150565b6000610c6883600160a060020a038416612f1d565b6000610c6883600160a060020a038416612f67565b6000610c6b82612f7f565b612667610d3b565b6801000000000000000082028161267a57fe5b6009805492909104909101905550565b600082820183811015610c68576040805160e560020a62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000610c6883600160a060020a038416612f83565b600160a060020a038216600090815260086020526040902060050154612722908261268a565b600160a060020a0390921660009081526008602052604090206005019190915550565b3390565b6000828152602081905260409020612761908261262a565b156111c35761276e612745565b600160a060020a031681600160a060020a0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60008281526020819052604090206127ca90826126e7565b156111c3576127d7612745565b600160a060020a031681600160a060020a0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b612823611502565b612877576040805160e560020a62461bcd02815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b6001805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6128aa612745565b60408051600160a060020a039092168252519081900360200190a1565b6040805160e081018252600160a060020a03928316815260006020808301828152838501838152606085018481526080860185815260a0870186815260c088018781529a8a1687526008909552969094209451855473ffffffffffffffffffffffffffffffffffffffff191697169690961784555160018401559351600283015551600382015590516004820155905160058201559051600690910155565b600254612973908261268a565b60025550565b600160a060020a03821660009081526008602052604090206001015461299f908261268a565b600160a060020a0390921660009081526008602052604090206001019190915550565b600160a060020a0382166000908152600860205260409020600201546129e8908261268a565b600160a060020a0390921660009081526008602052604090206002019190915550565b6000670de0b6b3a7640000820181612a21610d3b565b670de0b6b3a76400000190506000670de0b6b3a7640000612a9b670de0b6b3a764000085036402540be400670de0b6b3a76400008681612a5d57fe5b046402540be4000264174876e8000103026002670de0b6b3a7640000876002890a0381612a8657fe5b046402540be4000281612a9557fe5b0461268a565b81612aa257fe5b0495945050505050565b600160a060020a038216600090815260086020526040902060040154612ad2908261268a565b600160a060020a0390921660009081526008602052604090206004019190915550565b60008082612b0233613049565b612b0a611d0b565b0181612b1533611329565b011115612b375760405160e560020a62461bcd02815260040161047790613c5b565b836000612b4382613067565b90506000612b5087613078565b90506000612b5d88612db4565b9050612b698484612dcc565b9350612b7483613089565b886000612b80826111d0565b9050612b8c828b6129c2565b600160a060020a038116301415612bb757612ba684613089565b612bb08685612dcc565b9550612bdc565b612bc08161309c565b15612bdc57612bcf81856130b2565b612bd98685612dcc565b95505b612be68684612dcc565b95506000612bf387613137565b9050612c008c82866131bd565b612c0a8c82612979565b959b959a509498505050505050505050565b612c24611502565b15612c79576040805160e560020a62461bcd02815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b6001805460ff1916811790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586128aa612745565b6000610c68838361322b565b600160a060020a031660009081526008602052604090206006015490565b612ce0611502565b15612d1f5760405160e560020a62461bcd02815260040180806020018281038252602a815260200180614470602a913960400191505060405180910390fd5b600160a060020a038316612d675760405160e560020a62461bcd02815260040180806020018281038252602d8152602001806143c2602d913960400191505060405180910390fd5b600160a060020a038216612daf5760405160e560020a62461bcd02815260040180806020018281038252602b815260200180614445602b913960400191505060405180910390fd5b505050565b6000610c6b612dc583600a54613292565b60646132ee565b600082821115612e26576040805160e560020a62461bcd02815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6002546129739082612dcc565b61299f8160405180606001604052806026815260200161458c60269139600160a060020a0385166000908152600860205260409020600101549190613358565b6000612e8d612e888584612dcc565b612a0b565b9050612e9d8585600954026133f2565b612eab838360095402613418565b6112da8161265f565b6000610c6b600e836126e7565b600080612ecd83612a0b565b90506000612eda82612db4565b90506000612ee88383612dcc565b6009549091508502612efa87826133f2565b6000612f04610d3b565b1115612f1357612f138361265f565b5095945050505050565b6000612f298383612f67565b612f5f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c6b565b506000610c6b565b60009081526001919091016020526040902054151590565b5490565b6000818152600183016020526040812054801561303f5783546000198083019190810190600090879083908110612fb657fe5b9060005260206000200154905080876000018481548110612fd357fe5b60009182526020808320909101929092558281526001898101909252604090209084019055865487908061300357fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610c6b565b6000915050610c6b565b60006130548261223d565b61305f576000610c6b565b610c6b611712565b6000610c6b612dc583600b54613292565b6000610c6b612dc583601154613292565b600c54613096908261268a565b600c5550565b60006012546130aa83611329565b101592915050565b600160a060020a0382166000908152600860205260409020600301546130d8908261268a565b600160a060020a038316600081815260086020526040908190206003019290925590513391907fd49ca1e65d3d4924d717338dbd09fe8b97d122da780f18088f1938c1d51c79729061312b90859061370b565b60405180910390a35050565b60006c01431e0fae6d7217caa000000081613150610d3b565b6402540be4006131ac6131a6613164610d3b565b86026404a817c800026002613177610d3b565b0a68056bc75e2d6310000002730380d4bd8a8678c1bb542c80deb48000000000008a026002890a01010161343d565b85612dcc565b816131b357fe5b0403949350505050565b68010000000000000000810260006131d3610d3b565b1115613210576131e283612966565b6131eb8261265f565b6131f3610d3b565b6801000000000000000083028161320657fe5b0483029050613219565b61321983613474565b60095483028190036112da8582613418565b815460009082106132705760405160e560020a62461bcd0281526004018080602001828103825260228152602001806143516022913960400191505060405180910390fd5b82600001828154811061327f57fe5b9060005260206000200154905092915050565b6000826132a157506000610c6b565b828202828482816132ae57fe5b0414610c685760405160e560020a62461bcd0281526004018080602001828103825260218152602001806144f16021913960400191505060405180910390fd5b6000808211613347576040805160e560020a62461bcd02815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161335057fe5b049392505050565b600081848411156133ea5760405160e560020a62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b838110156133af578181015183820152602001613397565b50505050905090810190601f1680156133dc5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600160a060020a0390911660009081526008602052604090206006018054919091039055565b600160a060020a03909116600090815260086020526040902060060180549091019055565b80600260018201045b8181101561346e5780915060028182858161345d57fe5b04018161346657fe5b049050613446565b50919050565b600255565b60405180608001604052806000600160a060020a031681526020016000600160a060020a0316815260200160008152602001600081525090565b8035600160a060020a0381168114610c8e57600080fd5b6000602082840312156134db578081fd5b610c68826134b3565b600080604083850312156134f6578081fd5b6134ff836134b3565b915061350d602084016134b3565b90509250929050565b6000806000806080858703121561352b578182fd5b613534856134b3565b9350613542602086016134b3565b93969395505050506040820135916060013590565b60008060408385031215613569578182fd5b613572836134b3565b946020939093013593505050565b60006020808385031215613592578182fd5b823567ffffffffffffffff808211156135a9578384fd5b818501915085601f8301126135bc578384fd5b8135818111156135c857fe5b6135d5848583020161432c565b818152848101908486016080808502870188018b10156135f3578889fd5b8896505b848710156136695780828c03121561360d578889fd5b60408051828101818110898211171561362257fe5b825261362d846134b3565b815261363a8a85016134b3565b818b015283820135918101919091526060808401359082015284526001969096019592870192908101906135f7565b50909998505050505050505050565b600060208284031215613689578081fd5b5035919050565b600080604083850312156136a2578182fd5b8235915061350d602084016134b3565b600080604083850312156136c4578182fd5b50508035926020909101359150565b600160a060020a0391909116815260200190565b600160a060020a03929092168252602082015260400190565b901515815260200190565b90815260200190565b6000602080835283518082850152825b8181101561374057858101830151858201604001528201613724565b818111156137515783604083870101525b50601f01601f1916929092016040019392505050565b6020808252602c908201527f53616c653a2073746172742073616c65206d6574686f64206973206e6f206d6f60408201527f726520617661696c61626c650000000000000000000000000000000000000000606082015260800190565b60208082526039908201527f466f756e6465723a206d757374206861766520666f756e646572206d616e616760408201527f657220726f6c6520746f2072656d6f766520666f756e64657200000000000000606082015260800190565b6020808252604d908201527f466f756e6465723a206d757374206861766520666f756e646572206d616e616760408201527f657220726f6c652073657420696e766573746d656e742063617020626f6e757360608201527f20666f7220666f756e6465727300000000000000000000000000000000000000608082015260a00190565b60208082526035908201527f456d657267656e63793a20796f75277265206e6f7420616c6c6f77656420746f60408201527f20737461727420656d657267656e637920766f74650000000000000000000000606082015260800190565b60208082526045908201527f53616c653a2073616c6520666f7277617264206d6f7665206d6574686f64206960408201527f73206e6f7420617661696c61626c65207965742c2073746172742073616c652060608201527f6669727374000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603a908201527f4163636f756e7453746f726167653a206163636f756e7420646174612069736e60408201527f2774206d69677261746564207965742c20747279206c61746572000000000000606082015260800190565b60208082526048908201527f446972656374426f6e75733a206d75737420686176652064697265637420626f60408201527f6e7573206d616e6167657220726f6c6520746f2073657420646972656374206260608201527f6f6e757320666565000000000000000000000000000000000000000000000000608082015260a00190565b60208082526028908201527f456d657267656e63793a20796f75277265206e6f7420616c6c6f77656420746f60408201527f20646f2074686973000000000000000000000000000000000000000000000000606082015260800190565b60208082526026908201527f4163636f756e7453746f726167653a206163636f756e7420616c72656164792060408201527f6578697374730000000000000000000000000000000000000000000000000000606082015260800190565b60208082526027908201527f425846546f6b656e3a20796f75277265206e6f7420616c6c6f77656420746f2060408201527f646f207468697300000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f53616c653a206d75737420686176652073616c65206d616e6167657220726f6c60408201527f6500000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526042908201527f4163636f756e7453746f726167653a206163636f756e742064617461206d696760408201527f726174696f6e206d6574686f64206973206e6f206d6f726520617661696c616260608201527f6c65000000000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526037908201527f53616c653a20796f752063616e277420696e76657374206d6f7265207468616e60408201527f2063757272656e7420696e766573746d656e7420636170000000000000000000606082015260800190565b60208082526059908201527f446972656374426f6e75733a206d75737420686176652064697265637420626f60408201527f6e7573206d616e6167657220726f6c6520746f20736574206d696e696d756d2060608201527f73656c662062757920666f722064697265637420626f6e757300000000000000608082015260a00190565b6020808252604c908201527f4163636f756e7453746f726167653a206d7573742068617665206163636f756e60408201527f74206d616e6167657220726f6c6520746f206368616e67652073706f6e736f7260608201527f20666f72206163636f756e740000000000000000000000000000000000000000608082015260a00190565b6020808252602c908201527f4163636f756e7453746f726167653a20696e73756666696369656e742061636360408201527f6f756e742062616c616e63650000000000000000000000000000000000000000606082015260800190565b6020808252602f908201527f53616c653a20796f752063616e2774206d6f76652073616c652073746172742060408201527f66726f6d207a65726f20626c6f636b0000000000000000000000000000000000606082015260800190565b60208082526032908201527f4163636f756e7453746f726167653a20796f7520646f6e27742068617665206160408201527f6e7920617661696c61626c652065746865720000000000000000000000000000606082015260800190565b6020808252603e908201527f5374616b696e673a206d7573742068617665206c6f79616c747920626f6e757360408201527f206d616e6167657220726f6c6520746f207374616b6520626f6e757365730000606082015260800190565b60208082526027908201527f425846546f6b656e3a20696e73756666696369656e7420636f6e74726163742060408201527f62616c616e636500000000000000000000000000000000000000000000000000606082015260800190565b60208082526030908201527f4163636f756e7453746f726167653a206163636f756e74206d7573742062652060408201527f7265676973746572656420666972737400000000000000000000000000000000606082015260800190565b60208082526025908201527f456d657267656e63793a20706c6561736520736574207269676874207468726560408201527f73686f6c64000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602c908201527f456d657267656e63793a20656d657267656e637920766f74696e67206973206e60408201527f6f74206163746976617465640000000000000000000000000000000000000000606082015260800190565b60208082526036908201527f466f756e6465723a206d757374206861766520666f756e646572206d616e616760408201527f657220726f6c6520746f2061646420666f756e64657200000000000000000000606082015260800190565b6020808252604a908201527f4163636f756e7453746f726167653a20796f7520646f6e27742068617665206560408201527f6e6f75676820617661696c61626c6520657468657220746f20706572666f726d60608201527f206f7065726174696f6e00000000000000000000000000000000000000000000608082015260a00190565b6020808252603a908201527f5374616b696e673a206d7573742068617665207374616b696e67206d616e616760408201527f657220726f6c6520746f20736574207374616b696e6720666565000000000000606082015260800190565b6020808252603d908201527f456d657267656e63793a206e6f7420656e6f75676820766f74657320666f722060408201527f706572666f726d696e6720656d657267656e6379207769746864726177000000606082015260800190565b6020808252603f908201527f456d657267656e63793a206f6e6c7920666f756e64657273206861766520726960408201527f67687420746f20766f746520666f7220656d657267656e637920636173657300606082015260800190565b6020808252603e908201527f4163636f756e7453746f726167653a206d7573742068617665206163636f756e60408201527f74206d616e6167657220726f6c6520746f206d69677261746520646174610000606082015260800190565b918252602082015260400190565b9283526020830191909152604082015260600190565b60ff91909116815260200190565b60405181810167ffffffffffffffff8111828210171561434857fe5b60405291905056fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e64737beae834696df183bee4ced95908c0d088f2e451dcb8e99b57ccbcc3c8789c93416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e745374616e64617264546f6b656e3a207472616e736665722066726f6d20746865207a65726f2061646472657373436f6d70616e793a20696e73756666696369656e7420636f6e74726163742062616c616e6365416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b655374616e64617264546f6b656e3a207472616e7366657220746f20746865207a65726f20616464726573735374616e64617264546f6b656e3a20746f6b656e207472616e73666572207768696c65207061757365646347c6aea93629aaea238956eaec9051cb6c00a31afc4f20af3aeaf1448809be5374616e64617264546f6b656e3a206d757374206861766520706175736572206d616e6167657220726f6c6520746f20756e7061757365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775374616e64617264546f6b656e3a206d757374206861766520706175736572206d616e6167657220726f6c6520746f207061757365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef436f6d70616e793a20696e73756666696369656e7420636f6d70616e792062616c616e63654163636f756e7453746f726167653a20616d6f756e7420657863656564732062616c616e6365436f6d70616e793a206d757374206861766520636f6d70616e79206d616e6167657220726f6c65416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a264697066735822122036ebacece720a4e10de8f7def14d61c7e0d0750a0833f37b77208a6c117b568564736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000f426c61636b466f727420546f6b656e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034258460000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): BlackFort Token
Arg [1] : symbol (string): BXF
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [3] : 426c61636b466f727420546f6b656e0000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 4258460000000000000000000000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
OVERVIEW
BlackFort is a cryptocurrency wallet, exchange & merchant service provider. BlackFort offer users with possibility to use/buy/sell/swap cryptocurrencies. B2B Payment Gateway is available as a merchant solution. BXF Token-economy brings value to users in the community.Net Worth in USD
$12,283.11
Net Worth in ETH
4.378086
Token Allocations
ETH
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $2,805.59 | 4.3781 | $12,283.11 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.