Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 607 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer | 14271269 | 1011 days ago | IN | 0.1 ETH | 0.00153499 | ||||
Transfer | 14271227 | 1011 days ago | IN | 0.107 ETH | 0.00114778 | ||||
Withdraw Tokens | 14264764 | 1012 days ago | IN | 0 ETH | 0.00289976 | ||||
Withdraw Tokens | 13894265 | 1069 days ago | IN | 0 ETH | 0.00379606 | ||||
Withdraw Tokens | 13894255 | 1069 days ago | IN | 0 ETH | 0.00425486 | ||||
Withdraw Tokens | 13892565 | 1070 days ago | IN | 0 ETH | 0.00238518 | ||||
Withdraw Tokens | 13892549 | 1070 days ago | IN | 0 ETH | 0.00241626 | ||||
Withdraw Tokens | 13892545 | 1070 days ago | IN | 0 ETH | 0.00253008 | ||||
Withdraw Tokens | 13835892 | 1078 days ago | IN | 0 ETH | 0.00241454 | ||||
Withdraw Tokens | 13830959 | 1079 days ago | IN | 0 ETH | 0.00281484 | ||||
Withdraw Tokens | 13830949 | 1079 days ago | IN | 0 ETH | 0.00367378 | ||||
Withdraw Tokens | 13830936 | 1079 days ago | IN | 0 ETH | 0.00366033 | ||||
Withdraw Tokens | 13822699 | 1080 days ago | IN | 0 ETH | 0.00203413 | ||||
Withdraw Tokens | 13822039 | 1081 days ago | IN | 0 ETH | 0.00117074 | ||||
Withdraw Tokens | 13818724 | 1081 days ago | IN | 0 ETH | 0.00860241 | ||||
Withdraw Tokens | 13815152 | 1082 days ago | IN | 0 ETH | 0.00378963 | ||||
Withdraw Tokens | 13808894 | 1083 days ago | IN | 0 ETH | 0.0041884 | ||||
Withdraw Tokens | 13562183 | 1122 days ago | IN | 0 ETH | 0.00496973 | ||||
Withdraw Tokens | 13558478 | 1122 days ago | IN | 0 ETH | 0.01073236 | ||||
Withdraw Tokens | 13475890 | 1135 days ago | IN | 0 ETH | 0.00575622 | ||||
Withdraw Tokens | 13475885 | 1135 days ago | IN | 0 ETH | 0.00599214 | ||||
Withdraw Tokens | 13327051 | 1158 days ago | IN | 0 ETH | 0.00623748 | ||||
Withdraw Tokens | 13193400 | 1179 days ago | IN | 0 ETH | 0.00756633 | ||||
Withdraw Tokens | 13135570 | 1188 days ago | IN | 0 ETH | 0.00954313 | ||||
Withdraw Tokens | 13096878 | 1194 days ago | IN | 0 ETH | 0.00409094 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12762950 | 1246 days ago | 0.01 ETH | ||||
12762939 | 1246 days ago | 0.01 ETH | ||||
12762927 | 1246 days ago | 0.01 ETH | ||||
12717039 | 1253 days ago | 0.48 ETH | ||||
12717008 | 1253 days ago | 0.05 ETH | ||||
12716962 | 1253 days ago | 0.05 ETH | ||||
12716951 | 1253 days ago | 0.03928731 ETH | ||||
12716913 | 1253 days ago | 0.026 ETH | ||||
12716721 | 1253 days ago | 0.182 ETH | ||||
12716650 | 1253 days ago | 0.029 ETH | ||||
12716639 | 1253 days ago | 0.02 ETH | ||||
12716494 | 1253 days ago | 0.86 ETH | ||||
12716196 | 1253 days ago | 0.13 ETH | ||||
12716181 | 1253 days ago | 0.492 ETH | ||||
12716093 | 1253 days ago | 0.02 ETH | ||||
12716027 | 1253 days ago | 0.63 ETH | ||||
12715802 | 1254 days ago | 0.10960045 ETH | ||||
12715406 | 1254 days ago | 0.99440649 ETH | ||||
12715137 | 1254 days ago | 0.25 ETH | ||||
12714837 | 1254 days ago | 0.04 ETH | ||||
12714827 | 1254 days ago | 0.559 ETH | ||||
12714716 | 1254 days ago | 0.59428201 ETH | ||||
12714554 | 1254 days ago | 0.015 ETH | ||||
12714115 | 1254 days ago | 0.10717216 ETH | ||||
12712624 | 1254 days ago | 0.19562908 ETH |
Loading...
Loading
Contract Name:
HLBICO
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./SafeMath.sol"; import "./CappedTimedCrowdsale.sol"; import "./RefundPostdevCrowdsale.sol"; /** ** ICO Contract for the LBC crowdsale */ contract HLBICO is CappedTimedCrowdsale, RefundablePostDeliveryCrowdsale { using SafeMath for uint256; /* ** Global State */ bool public initialized; // default : false /* ** Addresses */ address public _deployingAddress; // should remain the same as deployer's address address public _whitelistingAddress; // should be oracle address public _reserveAddress; // should be deployer then humble reserve /* ** Events */ event InitializedContract(address indexed changerAddress, address indexed whitelistingAddress); event ChangedWhitelisterAddress(address indexed whitelisterAddress, address indexed changerAddress); event ChangedReserveAddress(address indexed reserveAddress, address indexed changerAddress); event ChangedDeployerAddress(address indexed deployerAddress, address indexed changerAddress); event BlacklistedAdded(address indexed account); event BlacklistedRemoved(address indexed account); event UpdatedCaps(uint256 newGoal, uint256 newCap, uint256 newTranche, uint256 newMaxInvest, uint256 newRate, uint256 newRateCoef); /* ** Attrs */ uint256 private _currentRate; uint256 private _rateCoef; mapping(address => bool) private _blacklistedAddrs; mapping(address => uint256) private _investmentAddrs; uint256 private _weiMaxInvest; uint256 private _etherTranche; uint256 private _currentWeiTranche; // Holds the current invested value for a tranche uint256 private _deliverToReserve; uint256 private _minimumInvest; /* * initialRateReceived : Number of token units a buyer gets per wei for the first investment slice. Should be 5000 (diving by 1000 for 3 decimals). * walletReceived : Wallet that will get the invested eth at the end of the crowdsale * tokenReceived : Address of the LBC token being sold * openingTimeReceived : Starting date of the ICO * closingtimeReceived : Ending date of the ICO * capReceived : Max amount of wei to be contributed * goalReceived : Funding goal * etherMaxInvestReceived : Maximum ether that can be invested */ constructor(uint256 initialRateReceived, uint256 rateCoefficientReceived, address payable walletReceived, LBCToken tokenReceived, uint256 openingTimeReceived, uint256 closingTimeReceived, uint256 capReceived, uint256 goalReceived) CrowdsaleMint(initialRateReceived, walletReceived, tokenReceived) TimedCrowdsale(openingTimeReceived, closingTimeReceived) CappedTimedCrowdsale(capReceived) RefundableCrowdsale(goalReceived) { _deployingAddress = msg.sender; _etherTranche = 250000000000000000000; // 300000€; For eth = 1200 € _weiMaxInvest = 8340000000000000000; // 10008€; for eth = 1200 € _currentRate = initialRateReceived; _rateCoef = rateCoefficientReceived; _currentWeiTranche = 0; _deliverToReserve = 0; _minimumInvest = 1000000000000000; // 1.20€; for eth = 1200€ } /* ** Initializes the contract address and affects addresses to their roles. */ function init( address whitelistingAddress, address reserveAddress ) public isNotInitialized onlyDeployingAddress { require(whitelistingAddress != address(0), "HLBICO: whitelistingAddress cannot be 0x"); require(reserveAddress != address(0), "HLBICO: reserveAddress cannot be 0x"); _whitelistingAddress = whitelistingAddress; _reserveAddress = reserveAddress; initialized = true; emit InitializedContract(_msgSender(), whitelistingAddress); } /** * @dev Returns the rate of tokens per wei at the present time and computes rate depending on tranche. * @param weiAmount The value in wei to be converted into tokens * @return The number of tokens a buyer gets per wei for a given tranche */ function _getCustomAmount(uint256 weiAmount) internal returns (uint256) { if (!isOpen()) { return 0; } uint256 calculatedAmount = 0; _currentWeiTranche = _currentWeiTranche.add(weiAmount); if (_currentWeiTranche > _etherTranche) { _currentWeiTranche = _currentWeiTranche.sub(_etherTranche); //If we updated the tranche manually to a smaller one uint256 manualSkew = weiAmount.sub(_currentWeiTranche); if (manualSkew >= 0) { calculatedAmount = calculatedAmount.add(weiAmount.sub(_currentWeiTranche).mul(rate())); _currentRate -= _rateCoef; // coefficient for 35 tokens reduction for each tranche calculatedAmount = calculatedAmount.add(_currentWeiTranche.mul(rate())); } //If there is a skew between invested wei and calculated wei for a tranche else { _currentRate -= _rateCoef; // coefficient for 35 tokens reduction for each tranche calculatedAmount = calculatedAmount.add(weiAmount.mul(rate())); } } else calculatedAmount = calculatedAmount.add(weiAmount.mul(rate())); uint256 participationAmount = calculatedAmount.mul(5).div(100); calculatedAmount = calculatedAmount.sub(participationAmount); _deliverToReserve = _deliverToReserve.add(participationAmount); return calculatedAmount; } /* ** Adjusts all parameters influenced by Ether value based on a percentage coefficient ** coef is based on 4 digits for decimal representation with 1 precision ** i.e : 934 -> 93.4%; 1278 -> 127.8% */ function adjustEtherValue(uint256 coef) public onlyDeployingAddress { require(coef > 0 && coef < 10000, "HLBICO: coef isn't within range of authorized values"); uint256 baseCoef = 1000; changeGoal(goal().mul(coef).div(1000)); changeCap(cap().mul(coef).div(1000)); _etherTranche = _etherTranche.mul(coef).div(1000); _weiMaxInvest = _weiMaxInvest.mul(coef).div(1000); if (coef > 1000) { coef = coef.sub(1000); _currentRate = _currentRate.sub(_currentRate.mul(coef).div(1000)); _rateCoef = _rateCoef.sub(_rateCoef.mul(coef).div(1000)); } else { coef = baseCoef.sub(coef); _currentRate = _currentRate.add(_currentRate.mul(coef).div(1000)); _rateCoef = _rateCoef.add(_rateCoef.mul(coef).div(1000)); } emit UpdatedCaps(goal(), cap(), _etherTranche, _weiMaxInvest, _currentRate, _rateCoef); } function rate() public view override returns (uint256) { return _currentRate; } function getNextRate() public view returns (uint256) { return _currentRate.sub(_rateCoef); } /* ** Changes the address of the token contract. Must only be callable by deployer */ function changeToken(LBCToken newToken) public onlyDeployingAddress { _changeToken(newToken); } /* ** Changes the address with whitelisting role and can only be called by deployer */ function changeWhitelister(address newWhitelisterAddress) public onlyDeployingAddress { _whitelistingAddress = newWhitelisterAddress; emit ChangedWhitelisterAddress(newWhitelisterAddress, _msgSender()); } /* ** Changes the address with deployer role and can only be called by deployer */ function changeDeployer(address newDeployerAddress) public onlyDeployingAddress { _deployingAddress = newDeployerAddress; emit ChangedDeployerAddress(_deployingAddress, _msgSender()); } /* ** Changes the address with pause role and can only be called by deployer */ function changeReserveAddress(address newReserveAddress) public onlyDeployingAddress { _reserveAddress = newReserveAddress; emit ChangedReserveAddress(newReserveAddress, _msgSender()); } /** * @dev Escrow finalization task, called when finalize() is called. */ function _finalization() override virtual internal { // Mints the 5% participation and sends it to humblereserve if (goalReached()) { _deliverTokens(_reserveAddress, _deliverToReserve); } super._finalization(); } /* ** Checks if an adress has been blacklisted before letting them withdraw their funds */ function withdrawTokens(address beneficiary) override virtual public { require(!isBlacklisted(beneficiary), "HLBICO: account is blacklisted"); super.withdrawTokens(beneficiary); } /** * @dev Overrides parent method taking into account variable rate. * @param weiAmount The value in wei to be converted into tokens * @return The number of tokens _weiAmount wei will buy at present time */ function _getTokenAmount(uint256 weiAmount) internal override returns (uint256) { return _getCustomAmount(weiAmount); } function _forwardFunds() internal override(CrowdsaleMint, RefundablePostDeliveryCrowdsale) { RefundablePostDeliveryCrowdsale._forwardFunds(); } function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal override(TimedCrowdsale, CappedTimedCrowdsale) view { require(weiAmount >= _minimumInvest, "HLBICO: Investment must be greater than or equal to 0.001 eth"); _dontExceedAmount(beneficiary, weiAmount); CappedTimedCrowdsale._preValidatePurchase(beneficiary, weiAmount); } function _postValidatePurchase(address beneficiary, uint256 weiAmount) internal override { require(beneficiary != address(0), "HLBICO: _postValidatePurchase benificiary is the zero address"); _investmentAddrs[beneficiary] = _investmentAddrs[beneficiary].add(weiAmount); } function _processPurchase(address beneficiary, uint256 tokenAmount) internal override(CrowdsaleMint, RefundablePostDeliveryCrowdsale) { RefundablePostDeliveryCrowdsale._processPurchase(beneficiary, tokenAmount); } function hasClosed() public view override(TimedCrowdsale, CappedTimedCrowdsale) returns (bool) { // solhint-disable-next-line not-rely-on-time return CappedTimedCrowdsale.hasClosed(); } function etherTranche() public view returns (uint256) { return _etherTranche; } function maxInvest() public view returns (uint256) { return _weiMaxInvest; } function addBlacklisted(address account) public onlyWhitelistingAddress { _addBlacklisted(account); } function removeBlacklisted(address account) public onlyWhitelistingAddress { _removeBlacklisted(account); } function isBlacklisted(address account) public view returns (bool) { require(account != address(0), "HLBICO: account is zero address"); return _blacklistedAddrs[account]; } function _addBlacklisted(address account) internal { require(!isBlacklisted(account), "HLBICO: account already blacklisted"); _blacklistedAddrs[account] = true; emit BlacklistedAdded(account); } function _removeBlacklisted(address account) internal { require(isBlacklisted(account), "HLBICO: account is not blacklisted"); _blacklistedAddrs[account] = true; emit BlacklistedRemoved(account); } function _dontExceedAmount(address beneficiary, uint256 weiAmount) internal view { require(_investmentAddrs[beneficiary].add(weiAmount) <= _weiMaxInvest, "HLBICO: Cannot invest more than KYC limit."); } modifier onlyWhitelistingAddress() { require(_msgSender() == _whitelistingAddress, "HLBICO: caller does not have the Whitelisted role"); _; } /* ** Checks if the contract hasn't already been initialized */ modifier isNotInitialized() { require(initialized == false, "HLBICO: contract is already initialized."); _; } /* ** Checks if the sender is the minter controller address */ modifier onlyDeployingAddress() { require(msg.sender == _deployingAddress, "HLBICO: only the deploying address can call this method."); _; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @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"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); 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.7.0; import "./SafeMath.sol"; import "./TimedCrowdsale.sol"; /** * @title CappedCrowdsale * @dev Crowdsale with a limit for total contributions based on time. */ abstract contract CappedTimedCrowdsale is TimedCrowdsale { using SafeMath for uint256; uint256 private _cap; /** * @dev Constructor, takes maximum amount of wei accepted in the crowdsale. * @param capReceived Max amount of wei to be contributed */ constructor (uint256 capReceived) { require(capReceived > 0, "CappedCrowdsale: cap is 0"); _cap = capReceived; } /** * @return the cap of the crowdsale. */ function cap() public view returns (uint256) { return _cap; } /* ** Updates cap */ function changeCap(uint256 newCap) internal { _cap = newCap; } /** * @dev Checks whether the period in which the crowdsale is open has already elapsed or if the cap has been reached. */ function hasClosed() public view override virtual returns (bool) { // solhint-disable-next-line not-rely-on-time return capReached() || super.hasClosed(); } /** * @dev Checks whether the cap has been reached. * @return Whether the cap was reached */ function capReached() public view returns (bool) { return weiRaised() >= _cap; } /** * @dev Extend parent behavior requiring purchase to respect the funding cap. * @param beneficiary Token purchaser * @param weiAmount Amount of wei contributed */ function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal override virtual view { super._preValidatePurchase(beneficiary, weiAmount); require(weiRaised().add(weiAmount) <= _cap, "CappedCrowdsale: cap exceeded"); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./Escrow.sol"; /** * @title ConditionalEscrow * @dev Base abstract escrow to only allow withdrawal if a condition is met. * @dev Intended usage: See {Escrow}. Same usage guidelines apply here. */ abstract contract ConditionalEscrow is Escrow { /** * @dev Returns whether an address is allowed to withdraw their funds. To be * implemented by derived contracts. * @param payee The destination address of the funds. */ function withdrawalAllowed(address payee) public view virtual returns (bool); function withdraw(address payable payee) public virtual override { require(withdrawalAllowed(payee), "ConditionalEscrow: payee is not allowed to withdraw"); super.withdraw(payee); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.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.7.0; import "./Context.sol"; import "./IERC20.sol"; import "./SafeERC20.sol"; import "./SafeMath.sol"; import "./LBCToken.sol"; import "./ReentrancyGuard.sol"; /** * Based on OpenZeppelin's Crowdsale legacy contract */ contract CrowdsaleMint is Context, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // The token being sold LBCToken private _token; // Address where funds are collected address payable private _wallet; // How many token units a buyer gets per wei. // The rate is the conversion between wei and the smallest and indivisible token unit. // So, if you are using a rate of 1 with a ERC20Detailed token with 3 decimals called TOK // 1 wei will give you 1 unit, or 0.001 TOK. uint256 private _rate; // Amount of wei raised uint256 private _weiRaised; /** * Event for token purchase logging * @param purchaser who paid for the tokens * @param beneficiary who got the tokens * @param value weis paid for purchase * @param amount amount of tokens purchased */ event TokensPurchased(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount); /** * @param rateReceived Number of token units a buyer gets per wei * @dev The rate is the conversion between wei and the smallest and indivisible * token unit. So, if you are using a rate of 1 with a ERC20Detailed token * with 3 decimals called TOK, 1 wei will give you 1 unit, or 0.001 TOK. * @param walletReceived Address where collected funds will be forwarded to * @param tokenReceived Address of the token being sold */ constructor (uint256 rateReceived, address payable walletReceived, LBCToken tokenReceived) { require(rateReceived > 0, "Crowdsale: rate is 0"); require(walletReceived != address(0), "Crowdsale: wallet is the zero address"); require(address(tokenReceived) != address(0), "Crowdsale: token is the zero address"); _rate = rateReceived; _wallet = walletReceived; _token = tokenReceived; } /** * @dev fallback function ***DO NOT OVERRIDE*** * Note that other contracts will transfer funds with a base gas stipend * of 2300, which is not enough to call buyTokens. Consider calling * buyTokens directly when purchasing tokens from a contract. */ receive() external payable { buyTokens(_msgSender()); } fallback() external payable { buyTokens(_msgSender()); } /** * @return the token being sold. */ function token() public view returns (LBCToken) { return _token; } function _changeToken(LBCToken newToken) internal { _token = newToken; } /** * @return the address where funds are collected. */ function wallet() public view returns (address payable) { return _wallet; } /** * @return the number of token units a buyer gets per wei. */ function rate() public view virtual returns (uint256) { return _rate; } /** * @return the amount of wei raised. */ function weiRaised() public view returns (uint256) { return _weiRaised; } /** * @dev low level token purchase ***DO NOT OVERRIDE*** * This function has a non-reentrancy guard, so it shouldn't be called by * another `nonReentrant` function. * @param beneficiary Recipient of the token purchase */ function buyTokens(address beneficiary) public nonReentrant payable { uint256 weiAmount = msg.value; _preValidatePurchase(beneficiary, weiAmount); // calculate token amount to be created uint256 tokens = _getTokenAmount(weiAmount); // update state _weiRaised = _weiRaised.add(weiAmount); _processPurchase(beneficiary, tokens); emit TokensPurchased(_msgSender(), beneficiary, weiAmount, tokens); _updatePurchasingState(beneficiary, weiAmount); _forwardFunds(); _postValidatePurchase(beneficiary, weiAmount); } /** * @dev Validation of an incoming purchase. Use require statements to revert state when conditions are not met. * Use `super` in contracts that inherit from Crowdsale to extend their validations. * Example from CappedCrowdsale.sol's _preValidatePurchase method: * super._preValidatePurchase(beneficiary, weiAmount); * require(weiRaised().add(weiAmount) <= cap); * @param beneficiary Address performing the token purchase * @param weiAmount Value in wei involved in the purchase */ function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal virtual view { require(beneficiary != address(0), "Crowdsale: beneficiary is the zero address"); require(weiAmount != 0, "Crowdsale: weiAmount is 0"); this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 } /** * @dev Validation of an executed purchase. Observe state and use revert statements to undo rollback when valid * conditions are not met. * @param beneficiary Address performing the token purchase * @param weiAmount Value in wei involved in the purchase */ function _postValidatePurchase(address beneficiary, uint256 weiAmount) internal virtual { // solhint-disable-previous-line no-empty-blocks } /** * @dev Source of tokens. Override this method to modify the way in which the crowdsale ultimately gets and sends * its tokens. * @param beneficiary Address performing the token purchase * @param tokenAmount Number of tokens to be emitted */ function _deliverTokens(address beneficiary, uint256 tokenAmount) internal { require( _token.mint(beneficiary, tokenAmount) == true, "Crowdsale: minting failed"); } /** * @dev Executed when a purchase has been validated and is ready to be executed. Doesn't necessarily emit/send * tokens. * @param beneficiary Address receiving the tokens * @param tokenAmount Number of tokens to be purchased */ function _processPurchase(address beneficiary, uint256 tokenAmount) internal virtual { _deliverTokens(beneficiary, tokenAmount); } /** * @dev Override for extensions that require an internal state to check for validity (current user contributions, * etc.) * @param beneficiary Address receiving the tokens * @param weiAmount Value in wei involved in the purchase */ function _updatePurchasingState(address beneficiary, uint256 weiAmount) internal { // solhint-disable-previous-line no-empty-blocks } /** * @dev Override to extend the way in which ether is converted to tokens. * @param weiAmount Value in wei to be converted into tokens * @return Number of tokens that can be purchased with the specified _weiAmount */ function _getTokenAmount(uint256 weiAmount) internal virtual returns (uint256) { return weiAmount.mul(_rate); } /** * @dev Determines how ETH is stored/forwarded on purchases. */ function _forwardFunds() virtual internal { _wallet.transfer(msg.value); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./ERC20PausableUnburnable.sol"; /** * @dev Extension of {ERC20} that adds a cap to the supply of tokens. */ abstract contract ERC20CappedUnburnable is ERC20PausableUnburnable { using SafeMath for uint256; uint256 private _cap; /** * @dev Sets the value of the `cap`. This value is immutable, it can only be * set once during construction. */ constructor (uint256 capGiven) { require(capGiven > 0, "ERC20Capped: cap is 0"); _cap = capGiven; } /** * @dev Returns the cap on the token's total supply. */ function cap() public view returns (uint256) { return _cap; } /** * @dev See {ERC20-_beforeTokenTransfer}. * * Requirements: * * - minted tokens must not cause the total supply to go over the cap. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override { super._beforeTokenTransfer(from, to, amount); if (from == address(0)) { // When minting tokens require(totalSupply().add(amount) <= _cap, "ERC20Capped: cap exceeded"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./ERC20Unburnable.sol"; import "./Pausable.sol"; /** * OpenZeppelin ERC20Pausable based on ERC20Unbernable */ abstract contract ERC20PausableUnburnable is ERC20Unburnable, Pausable { function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override { super._beforeTokenTransfer(from, to, amount); require(!paused(), "ERC20PausableUnburnable: token transfer while paused"); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./Context.sol"; import "./IERC20.sol"; import "./SafeMath.sol"; import "./Address.sol"; /** * OpenZeppelin Erc20 implementation without _burn private method and with cap mechanism */ contract ERC20Unburnable is Context, IERC20 { using SafeMath for uint256; using Address for address; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; constructor (string memory nameGiven, string memory symbolGiven) { _name = nameGiven; _symbol = symbolGiven; _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 override returns (uint256) { return _totalSupply; } function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20Unburnable: transfer amount exceeds allowance")); return true; } function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20Unburnable: decreased allowance below zero")); return true; } function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20Unburnable: transfer from the zero address"); require(recipient != address(0), "ERC20Unburnable: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20Unburnable: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20Unburnable: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20Unburnable: approve from the zero address"); require(spender != address(0), "ERC20Unburnable: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./SafeMath.sol"; import "./Ownable.sol"; import "./Address.sol"; /** * @title Escrow * @dev Base escrow contract, holds funds designated for a payee until they * withdraw them. * * Intended usage: This contract (and derived escrow contracts) should be a * standalone contract, that only interacts with the contract that instantiated * it. That way, it is guaranteed that all Ether will be handled according to * the `Escrow` rules, and there is no need to check for payable functions or * transfers in the inheritance tree. The contract that uses the escrow as its * payment method should be its owner, and provide public methods redirecting * to the escrow's deposit and withdraw. */ contract Escrow is Ownable { using SafeMath for uint256; using Address for address payable; event Deposited(address indexed payee, uint256 weiAmount); event Withdrawn(address indexed payee, uint256 weiAmount); mapping(address => uint256) private _deposits; function depositsOf(address payee) public view returns (uint256) { return _deposits[payee]; } /** * @dev Stores the sent amount as credit to be withdrawn. * @param payee The destination address of the funds. */ function deposit(address payee) public virtual payable onlyOwner { uint256 amount = msg.value; _deposits[payee] = _deposits[payee].add(amount); emit Deposited(payee, amount); } /** * @dev Withdraw accumulated balance for a payee, forwarding all gas to the * recipient. * * WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities. * Make sure you trust the recipient, or are either following the * checks-effects-interactions pattern or using {ReentrancyGuard}. * * @param payee The address whose funds will be withdrawn and transferred to. */ function withdraw(address payable payee) public virtual onlyOwner { uint256 payment = _deposits[payee]; _deposits[payee] = 0; payee.sendValue(payment); emit Withdrawn(payee, payment); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./SafeMath.sol"; import "./TimedCrowdsale.sol"; /** * @title FinalizableCrowdsale * @dev Extension of TimedCrowdsale with a one-off finalization action, where one * can do extra work after finishing. */ abstract contract FinalizableCrowdsale is TimedCrowdsale { using SafeMath for uint256; bool private _finalized; event CrowdsaleFinalized(); constructor () { _finalized = false; } /** * @return true if the crowdsale is finalized, false otherwise. */ function finalized() public view returns (bool) { return _finalized; } /** * @dev Must be called after crowdsale ends, to do some extra finalization * work. Calls the contract's finalization function. */ function finalize() public { require(!_finalized, "FinalizableCrowdsale: already finalized"); require(hasClosed(), "FinalizableCrowdsale: not closed"); _finalized = true; _finalization(); emit CrowdsaleFinalized(); } /** * @dev Can be overridden to add finalization logic. The overriding function * should call super._finalization() to ensure the chain of finalization is * executed entirely. */ function _finalization() internal virtual { // solhint-disable-previous-line no-empty-blocks } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./Context.sol"; import "./ERC20CappedUnburnable.sol"; import "./ERC20Unburnable.sol"; import "./ERC20PausableUnburnable.sol"; contract LBCToken is Context, ERC20CappedUnburnable { /* ** Global State */ bool public initialized; // default : false /* ** Addresses */ address public _deployingAddress; // should be changed to multisig contract address address public _pauserAddress; // should be deployer's address public _minterAddress; // should be ico's address then poe's address public _reserveAddress; // should be multisig then humble reserve /* ** Events */ event InitializedContract(address indexed reserveAddress); event ChangedMinterAddress(address indexed minterAddress, address indexed changerAddress); event ChangedPauserAddress(address indexed pauserAddress, address indexed changerAddress); event ChangedReserveAddress(address indexed reserveAddress, address indexed changerAddress); event ChangedDeployerAddress(address indexed deployerAddress, address indexed changerAddress); constructor( string memory name, string memory symbol ) ERC20Unburnable(name, symbol) ERC20CappedUnburnable(300000000000000000000000000) { _deployingAddress = msg.sender; } /* ** Initializes the contract address and affects addresses to their roles. */ function init( address minterAddress, address pauserAddress, address reserveAddress ) public isNotInitialized onlyDeployingAddress { require(minterAddress != address(0), "_minterAddress cannot be 0x"); require(pauserAddress != address(0), "_pauserAddress cannot be 0x"); require(reserveAddress != address(0), "_reserveAddress cannot be 0x"); _minterAddress = minterAddress; _pauserAddress = pauserAddress; _reserveAddress = reserveAddress; initialized = true; emit InitializedContract(reserveAddress); } /* ** Mint function that can only be called by minter address and mints a specified amount and sends it to an address */ function mint(address to, uint256 amount) public onlyMinterAddress virtual returns (bool) { _mint(to, amount); return true; } /* ** Freeze function that stops transactions and can only be called by pauser address */ function pause() public onlyPauserAddress virtual { _pause(); } /* ** Unfreeze function that resumes transactions and can only be called by pauser address */ function unpause() public onlyPauserAddress virtual { _unpause(); } /* ** Changes the address with pause role and can only be called by previous pauser address */ function changePauser(address newPauserAddress) public onlyDeployingAddress whenNotPaused { _pauserAddress = newPauserAddress; emit ChangedPauserAddress(newPauserAddress, _msgSender()); } /* ** Changes the address with minter role and can only be called by previous minter address */ function changeMinter(address newMinterAddress) public onlyDeployingAddress whenNotPaused { _minterAddress = newMinterAddress; emit ChangedMinterAddress(newMinterAddress, _msgSender()); } /* ** Changes the address with deployer role and can only be called by deployer */ function changeDeployer(address newDeployerAddress) public onlyDeployingAddress { _deployingAddress = newDeployerAddress; emit ChangedDeployerAddress(_deployingAddress, _msgSender()); } /* ** Checks if the sender is the minter controller address */ modifier onlyDeployingAddress() { require(msg.sender == _deployingAddress, "Only the deploying address can call this method."); _; } /* ** Checks if the sender is the minter controller address */ modifier onlyMinterAddress() { require(msg.sender == _minterAddress, "Only the minter address can call this method."); _; } /* ** Checks if the sender is the pauser controller address */ modifier onlyPauserAddress() { require(msg.sender == _pauserAddress, "Only the pauser address can call this method."); _; } /* ** Checks if the contract hasn't already been initialized */ modifier isNotInitialized() { require(initialized == false, "Contract is already initialized."); _; } function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual override(ERC20CappedUnburnable) { super._beforeTokenTransfer(from, to, amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.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. */ 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 () { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view 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()); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./TimedCrowdsale.sol"; import "./SafeMath.sol"; import "./Secondary.sol"; import "./IERC20.sol"; /** * @title PostDeliveryCrowdsale * @dev Crowdsale that locks tokens from withdrawal until it ends. */ abstract contract PostDeliveryCrowdsale is TimedCrowdsale { using SafeMath for uint256; mapping(address => uint256) private _balances; __unstable__TokenVault private _vault; constructor() { _vault = new __unstable__TokenVault(); } /** * @dev Withdraw tokens only after crowdsale ends. * @param beneficiary Whose tokens will be withdrawn. */ function withdrawTokens(address beneficiary) public virtual { require(hasClosed(), "PostDeliveryCrowdsale: not closed"); uint256 amount = _balances[beneficiary]; require(amount > 0, "PostDeliveryCrowdsale: beneficiary is not due any tokens"); _balances[beneficiary] = 0; _vault.transfer(token(), beneficiary, amount); } /** * @return the balance of an account. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev Overrides parent by storing due balances, and delivering tokens to the vault instead of the end user. This * ensures that the tokens will be available by the time they are withdrawn (which may not be the case if * `_deliverTokens` was called later). * @param beneficiary Token purchaser * @param tokenAmount Amount of tokens purchased */ function _processPurchase(address beneficiary, uint256 tokenAmount) override virtual internal { _balances[beneficiary] = _balances[beneficiary].add(tokenAmount); _deliverTokens(address(_vault), tokenAmount); } } /** * @title __unstable__TokenVault * @dev Similar to an Escrow for tokens, this contract allows its primary account to spend its tokens as it sees fit. * This contract is an internal helper for PostDeliveryCrowdsale, and should not be used outside of this context. */ // solhint-disable-next-line contract-name-camelcase contract __unstable__TokenVault is Secondary { function transfer(IERC20 token, address to, uint256 amount) public onlyPrimary { token.transfer(to, amount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./Context.sol"; import "./SafeERC20.sol"; import "./FinalizableCrowdsale.sol"; import "./RefundEscrow.sol"; /** * @title RefundableCrowdsale * @dev Extension of `FinalizableCrowdsale` contract that adds a funding goal, and the possibility of users * getting a refund if goal is not met. * * Deprecated, use `RefundablePostDeliveryCrowdsale` instead. Note that if you allow tokens to be traded before the goal * is met, then an attack is possible in which the attacker purchases tokens from the crowdsale and when they sees that * the goal is unlikely to be met, they sell their tokens (possibly at a discount). The attacker will be refunded when * the crowdsale is finalized, and the users that purchased from them will be left with worthless tokens. */ abstract contract RefundableCrowdsale is Context, FinalizableCrowdsale { using SafeMath for uint256; // minimum amount of funds to be raised in weis uint256 private _goal; // refund escrow used to hold funds while crowdsale is running RefundEscrow private _escrow; /** * @dev Constructor, creates RefundEscrow. * @param goalReceived Funding goal */ constructor (uint256 goalReceived) { require(goalReceived > 0, "RefundableCrowdsale: goal is 0"); _escrow = new RefundEscrow(wallet()); _goal = goalReceived; } /** * @return minimum amount of funds to be raised in wei. */ function goal() public view returns (uint256) { return _goal; } /** ** Updates goal */ function changeGoal(uint256 newGoal) internal { _goal = newGoal; } /** * @dev Investors can claim refunds here if crowdsale is unsuccessful. * @param refundee Whose refund will be claimed. */ function claimRefund(address payable refundee) public { require(finalized(), "RefundableCrowdsale: not finalized"); require(!goalReached(), "RefundableCrowdsale: goal reached"); _escrow.withdraw(refundee); } /** * @dev Checks whether funding goal was reached. * @return Whether funding goal was reached */ function goalReached() public view returns (bool) { return weiRaised() >= _goal; } /** * @dev Escrow finalization task, called when finalize() is called. */ function _finalization() override virtual internal { if (goalReached()) { _escrow.close(); _escrow.beneficiaryWithdraw(); } else { _escrow.enableRefunds(); } super._finalization(); } /** * @dev Overrides Crowdsale fund forwarding, sending funds to escrow. */ function _forwardFunds() override virtual internal { _escrow.deposit{value : msg.value}(_msgSender()); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./ConditionalEscrow.sol"; /** * @title RefundEscrow * @dev Escrow that holds funds for a beneficiary, deposited from multiple * parties. * @dev Intended usage: See {Escrow}. Same usage guidelines apply here. * @dev The owner account (that is, the contract that instantiates this * contract) may deposit, close the deposit period, and allow for either * withdrawal by the beneficiary, or refunds to the depositors. All interactions * with `RefundEscrow` will be made through the owner contract. */ contract RefundEscrow is ConditionalEscrow { enum State { Active, Refunding, Closed } event RefundsClosed(); event RefundsEnabled(); State private _state; address payable private _beneficiary; /** * @dev Constructor. * @param beneficiaryReceived The beneficiary of the deposits. */ constructor (address payable beneficiaryReceived) { require(beneficiaryReceived != address(0), "RefundEscrow: beneficiary is the zero address"); _beneficiary = beneficiaryReceived; _state = State.Active; } /** * @return The current state of the escrow. */ function state() public view returns (State) { return _state; } /** * @return The beneficiary of the escrow. */ function beneficiary() public view returns (address) { return _beneficiary; } /** * @dev Stores funds that may later be refunded. * @param refundee The address funds will be sent to if a refund occurs. */ function deposit(address refundee) public payable virtual override { require(_state == State.Active, "RefundEscrow: can only deposit while active"); super.deposit(refundee); } /** * @dev Allows for the beneficiary to withdraw their funds, rejecting * further deposits. */ function close() public onlyOwner virtual { require(_state == State.Active, "RefundEscrow: can only close while active"); _state = State.Closed; emit RefundsClosed(); } /** * @dev Allows for refunds to take place, rejecting further deposits. */ function enableRefunds() public onlyOwner virtual { require(_state == State.Active, "RefundEscrow: can only enable refunds while active"); _state = State.Refunding; emit RefundsEnabled(); } /** * @dev Withdraws the beneficiary's funds. */ function beneficiaryWithdraw() public virtual { require(_state == State.Closed, "RefundEscrow: beneficiary can only withdraw while closed"); _beneficiary.transfer(address(this).balance); } /** * @dev Returns whether refundees can withdraw their deposits (be refunded). The overridden function receives a * 'payee' argument, but we ignore it here since the condition is global, not per-payee. */ function withdrawalAllowed(address) public view override returns (bool) { return _state == State.Refunding; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./RefundableCrowdsale.sol"; import "./PostDeliveryCrowdsale.sol"; /** * @title RefundablePostDeliveryCrowdsale * @dev Extension of RefundableCrowdsale contract that only delivers the tokens * once the crowdsale has closed and the goal met, preventing refunds to be issued * to token holders. */ abstract contract RefundablePostDeliveryCrowdsale is RefundableCrowdsale, PostDeliveryCrowdsale { function _forwardFunds() internal override(CrowdsaleMint,RefundableCrowdsale) virtual { RefundableCrowdsale._forwardFunds(); } function _processPurchase(address beneficiary, uint256 tokenAmount) internal override(CrowdsaleMint, PostDeliveryCrowdsale) virtual { PostDeliveryCrowdsale._processPurchase(beneficiary, tokenAmount); } function withdrawTokens(address beneficiary) override virtual public { require(finalized(), "RefundablePostDeliveryCrowdsale: not finalized"); require(goalReached(), "RefundablePostDeliveryCrowdsale: goal not reached"); super.withdrawTokens(beneficiary); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./IERC20.sol"; import "./SafeMath.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.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, 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) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * 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); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./Context.sol"; /** * @dev A Secondary contract can only be used by its primary account (the one that created it). */ abstract contract Secondary is Context { address private _primary; /** * @dev Emitted when the primary contract changes. */ event PrimaryTransferred( address recipient ); /** * @dev Sets the primary account to the one that is creating the Secondary contract. */ constructor () { address msgSender = _msgSender(); _primary = msgSender; emit PrimaryTransferred(msgSender); } /** * @dev Reverts if called from any account other than the primary. */ modifier onlyPrimary() { require(_msgSender() == _primary, "Secondary: caller is not the primary account"); _; } /** * @return the address of the primary. */ function primary() public view returns (address) { return _primary; } /** * @dev Transfers contract to a new primary. * @param recipient The address of new primary. */ function transferPrimary(address recipient) public onlyPrimary { require(recipient != address(0), "Secondary: new primary is the zero address"); _primary = recipient; emit PrimaryTransferred(recipient); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "./SafeMath.sol"; import "./CrowdsaleMint.sol"; /** * Based on OpenZeppelin's TimedCrowdsale legacy contract */ abstract contract TimedCrowdsale is CrowdsaleMint { using SafeMath for uint256; uint256 private _openingTime; uint256 private _closingTime; /** * Event for crowdsale extending * @param newClosingTime new closing time * @param prevClosingTime old closing time */ event TimedCrowdsaleExtended(uint256 prevClosingTime, uint256 newClosingTime); /** * @dev Reverts if not in crowdsale time range. */ modifier onlyWhileOpen { require(isOpen(), "TimedCrowdsale: not open"); _; } /** * @dev Constructor, takes crowdsale opening and closing times. * @param openingTimeReceived Crowdsale opening time * @param closingTimeReceived Crowdsale closing time */ constructor (uint256 openingTimeReceived, uint256 closingTimeReceived) { // solhint-disable-next-line not-rely-on-time require(openingTimeReceived >= block.timestamp, "TimedCrowdsale: opening time is before current time"); // solhint-disable-next-line max-line-length require(closingTimeReceived > openingTimeReceived, "TimedCrowdsale: opening time is not before closing time"); _openingTime = openingTimeReceived; _closingTime = closingTimeReceived; } /** * @return the crowdsale opening time. */ function openingTime() public view returns (uint256) { return _openingTime; } /** * @return the crowdsale closing time. */ function closingTime() public view returns (uint256) { return _closingTime; } /** * @return true if the crowdsale is open, false otherwise. */ function isOpen() public view returns (bool) { // solhint-disable-next-line not-rely-on-time return block.timestamp >= _openingTime && block.timestamp <= _closingTime; } /** * @dev Checks whether the period in which the crowdsale is open has already elapsed. * @return Whether crowdsale period has elapsed */ function hasClosed() public view virtual returns (bool) { // solhint-disable-next-line not-rely-on-time return block.timestamp > _closingTime; } /** * @dev Extend parent behavior requiring to be within contributing period. * @param beneficiary Token purchaser * @param weiAmount Amount of wei contributed */ function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal override virtual onlyWhileOpen view { super._preValidatePurchase(beneficiary, weiAmount); } /** * @dev Extend crowdsale. * @param newClosingTime Crowdsale closing time */ function _extendTime(uint256 newClosingTime) internal { require(!hasClosed(), "TimedCrowdsale: already closed"); // solhint-disable-next-line max-line-length require(newClosingTime > _closingTime, "TimedCrowdsale: new closing time is before current closing time"); emit TimedCrowdsaleExtended(_closingTime, newClosingTime); _closingTime = newClosingTime; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"initialRateReceived","type":"uint256"},{"internalType":"uint256","name":"rateCoefficientReceived","type":"uint256"},{"internalType":"address payable","name":"walletReceived","type":"address"},{"internalType":"contract LBCToken","name":"tokenReceived","type":"address"},{"internalType":"uint256","name":"openingTimeReceived","type":"uint256"},{"internalType":"uint256","name":"closingTimeReceived","type":"uint256"},{"internalType":"uint256","name":"capReceived","type":"uint256"},{"internalType":"uint256","name":"goalReceived","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BlacklistedAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BlacklistedRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"deployerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"changerAddress","type":"address"}],"name":"ChangedDeployerAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"reserveAddress","type":"address"},{"indexed":true,"internalType":"address","name":"changerAddress","type":"address"}],"name":"ChangedReserveAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"whitelisterAddress","type":"address"},{"indexed":true,"internalType":"address","name":"changerAddress","type":"address"}],"name":"ChangedWhitelisterAddress","type":"event"},{"anonymous":false,"inputs":[],"name":"CrowdsaleFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"changerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"whitelistingAddress","type":"address"}],"name":"InitializedContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"prevClosingTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newClosingTime","type":"uint256"}],"name":"TimedCrowdsaleExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"purchaser","type":"address"},{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newGoal","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newCap","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newTranche","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newMaxInvest","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRateCoef","type":"uint256"}],"name":"UpdatedCaps","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"_deployingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_reserveAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_whitelistingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addBlacklisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"coef","type":"uint256"}],"name":"adjustEtherValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"buyTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"capReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newDeployerAddress","type":"address"}],"name":"changeDeployer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newReserveAddress","type":"address"}],"name":"changeReserveAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract LBCToken","name":"newToken","type":"address"}],"name":"changeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newWhitelisterAddress","type":"address"}],"name":"changeWhitelister","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"refundee","type":"address"}],"name":"claimRefund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"etherTranche","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"finalize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"finalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"goal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"goalReached","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasClosed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"whitelistingAddress","type":"address"},{"internalType":"address","name":"reserveAddress","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxInvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openingTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeBlacklisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract LBCToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wallet","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weiRaised","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620058fa380380620058fa83398181016040526101008110156200003857600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050808285858b8a8a60016000819055506000831162000115576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f43726f776473616c653a2072617465206973203000000000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200019d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180620058d56025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000225576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180620058b16024913960400191505060405180910390fd5b8260038190555081600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050428210156200030c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526033815260200180620058476033913960400191505060405180910390fd5b81811162000366576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806200587a6037913960400191505060405180910390fd5b8160058190555080600681905550505060008111620003ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43617070656443726f776473616c653a2063617020697320300000000000000081525060200191505060405180910390fd5b80600781905550506000600860006101000a81548160ff0219169083151502179055506000811162000487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f526566756e6461626c6543726f776473616c653a20676f616c2069732030000081525060200191505060405180910390fd5b620004976200063160201b60201c565b604051620004a5906200065b565b808273ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f080158015620004e2573d6000803e3d6000fd5b50600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060098190555050604051620005399062000669565b604051809103906000f08015801562000556573d6000803e3d6000fd5b50600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550680d8d726b7177a800006015819055506773bda1d012c2000060148190555087601081905550866011819055506000601681905550600060178190555066038d7ea4c68000601881905550505050505050505062000677565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115eb8062003c8883390190565b6105d4806200527383390190565b61360180620006876000396000f3fe6080604052600436106101fd5760003560e01c80634f9359451161010d578063b7a8807c116100a0578063ec8ac4d81161006f578063ec8ac4d8146108b9578063f09a4016146108fd578063f5e343bb1461096e578063fc0c546a146109af578063fe575a87146109f057610214565b8063b7a8807c1461079b578063bffa55d5146107c6578063c6a276c214610817578063defdfae61461086857610214565b80637d3d6522116100dc5780637d3d6522146106af578063966aeece146106dc578063ae5b5b111461072d578063b3f05b971461076e57610214565b80634f9359451461058b578063521eb273146105b857806366829b16146105f957806370a082311461064a57610214565b806337b71da11161019057806347535d7b1161015f57806347535d7b1461047a578063477fea02146104a757806349df728c146104f85780634b6753bc146105495780634bb278f31461057457610214565b806337b71da1146103ce5780633f701544146103f957806340193883146104245780634042b66f1461044f57610214565b80632c4e722e116101cc5780632c4e722e146103125780633110235a1461033d578063329425c514610368578063355274ea146103a357610214565b80631515bc2b14610226578063158ef93e14610253578063188efc16146102805780631cd273cf146102d157610214565b366102145761021261020d610a57565b610a5f565b005b61022461021f610a57565b610a5f565b005b34801561023257600080fd5b5061023b610bbe565b60405180821515815260200191505060405180910390f35b34801561025f57600080fd5b50610268610bcd565b60405180821515815260200191505060405180910390f35b34801561028c57600080fd5b506102cf600480360360208110156102a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610be0565b005b3480156102dd57600080fd5b506102e6610c99565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031e57600080fd5b50610327610cbf565b6040518082815260200191505060405180910390f35b34801561034957600080fd5b50610352610cc9565b6040518082815260200191505060405180910390f35b34801561037457600080fd5b506103a16004803603602081101561038b57600080fd5b8101908080359060200190929190505050610cd3565b005b3480156103af57600080fd5b506103b8611071565b6040518082815260200191505060405180910390f35b3480156103da57600080fd5b506103e361107b565b6040518082815260200191505060405180910390f35b34801561040557600080fd5b5061040e611099565b6040518082815260200191505060405180910390f35b34801561043057600080fd5b506104396110a3565b6040518082815260200191505060405180910390f35b34801561045b57600080fd5b506104646110ad565b6040518082815260200191505060405180910390f35b34801561048657600080fd5b5061048f6110b7565b60405180821515815260200191505060405180910390f35b3480156104b357600080fd5b506104f6600480360360208110156104ca57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110d2565b005b34801561050457600080fd5b506105476004803603602081101561051b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061121d565b005b34801561055557600080fd5b5061055e6112a5565b6040518082815260200191505060405180910390f35b34801561058057600080fd5b506105896112af565b005b34801561059757600080fd5b506105a06113e0565b60405180821515815260200191505060405180910390f35b3480156105c457600080fd5b506105cd6113f4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561060557600080fd5b506106486004803603602081101561061c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061141e565b005b34801561065657600080fd5b506106996004803603602081101561066d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114d0565b6040518082815260200191505060405180910390f35b3480156106bb57600080fd5b506106c4611519565b60405180821515815260200191505060405180910390f35b3480156106e857600080fd5b5061072b600480360360208110156106ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061152d565b005b34801561073957600080fd5b50610742611678565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561077a57600080fd5b5061078361169e565b60405180821515815260200191505060405180910390f35b3480156107a757600080fd5b506107b06116b5565b6040518082815260200191505060405180910390f35b3480156107d257600080fd5b50610815600480360360208110156107e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116bf565b005b34801561082357600080fd5b506108666004803603602081101561083a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611820565b005b34801561087457600080fd5b506108b76004803603602081101561088b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118d9565b005b6108fb600480360360208110156108cf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a5f565b005b34801561090957600080fd5b5061096c6004803603604081101561092057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a46565b005b34801561097a57600080fd5b50610983611d66565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109bb57600080fd5b506109c4611d8c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109fc57600080fd5b50610a3f60048036036020811015610a1357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611db6565b60405180821515815260200191505060405180910390f35b600033905090565b60026000541415610ad8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026000819055506000349050610aef8282611eae565b6000610afa82611f21565b9050610b1182600454611f3390919063ffffffff16565b600481905550610b218382611fbb565b8273ffffffffffffffffffffffffffffffffffffffff16610b40610a57565b73ffffffffffffffffffffffffffffffffffffffff167f6faf93231a456e552dbc9961f58d9713ee4f2e69d15f1975b050ef0911053a7b8484604051808381526020018281526020019250505060405180910390a3610b9f8383611fc9565b610ba7611fcd565b610bb18383611fd7565b5050600160008190555050565b6000610bc86120f6565b905090565b600c60149054906101000a900460ff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610c21610a57565b73ffffffffffffffffffffffffffffffffffffffff1614610c8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806133606031913960400191505060405180910390fd5b610c9681612114565b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601054905090565b6000601454905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806135946038913960400191505060405180910390fd5b600081118015610d8a575061271081105b610ddf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806132666034913960400191505060405180910390fd5b60006103e89050610e1c610e176103e8610e0985610dfb6110a3565b61221190919063ffffffff16565b61229790919063ffffffff16565b6122e1565b610e52610e4d6103e8610e3f85610e31611071565b61221190919063ffffffff16565b61229790919063ffffffff16565b6122eb565b610e7b6103e8610e6d8460155461221190919063ffffffff16565b61229790919063ffffffff16565b601581905550610eaa6103e8610e9c8460145461221190919063ffffffff16565b61229790919063ffffffff16565b6014819055506103e8821115610f5c57610ecf6103e8836122f590919063ffffffff16565b9150610f0e610efd6103e8610eef8560105461221190919063ffffffff16565b61229790919063ffffffff16565b6010546122f590919063ffffffff16565b601081905550610f51610f406103e8610f328560115461221190919063ffffffff16565b61229790919063ffffffff16565b6011546122f590919063ffffffff16565b601181905550610ff8565b610f6f82826122f590919063ffffffff16565b9150610fae610f9d6103e8610f8f8560105461221190919063ffffffff16565b61229790919063ffffffff16565b601054611f3390919063ffffffff16565b601081905550610ff1610fe06103e8610fd28560115461221190919063ffffffff16565b61229790919063ffffffff16565b601154611f3390919063ffffffff16565b6011819055505b7ff3daf0fa83d5049e1ca3831cb505fe867090c0f5af177702b1adeb296b0414b76110216110a3565b611029611071565b60155460145460105460115460405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a15050565b6000600754905090565b60006110946011546010546122f590919063ffffffff16565b905090565b6000601554905090565b6000600954905090565b6000600454905090565b600060055442101580156110cd57506006544211155b905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611178576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806135946038913960400191505060405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506111c1610a57565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7c07f5a6c7576e884f7d9e01c457774a9059fb680caf5cdd02c86700d3ce1b5460405160405180910390a350565b61122681611db6565b15611299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f484c4249434f3a206163636f756e7420697320626c61636b6c6973746564000081525060200191505060405180910390fd5b6112a28161233f565b50565b6000600654905090565b600860009054906101000a900460ff1615611315576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806134576027913960400191505060405180910390fd5b61131d610bbe565b61138f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f46696e616c697a61626c6543726f776473616c653a206e6f7420636c6f73656481525060200191505060405180910390fd5b6001600860006101000a81548160ff0219169083151502179055506113b2612405565b7f9270cc390c096600a1c17c44345a1ba689fafd99d97487b10cfccf86cf73183660405160405180910390a1565b60006007546113ed6110ad565b1015905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806135946038913960400191505060405180910390fd5b6114cd8161244b565b50565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006009546115266110ad565b1015905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806135946038913960400191505060405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061161c610a57565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f63c70fa8d3aed6b9cda2842d4152a4ccf78aab6db236b9b22ad898ca7541e11360405160405180910390a350565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860009054906101000a900460ff16905090565b6000600554905090565b6116c761169e565b61171c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806135126022913960400191505060405180910390fd5b611724611519565b1561177a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061347e6021913960400191505060405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166351cff8d9826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561180557600080fd5b505af1158015611819573d6000803e3d6000fd5b5050505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611861610a57565b73ffffffffffffffffffffffffffffffffffffffff16146118cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806133606031913960400191505060405180910390fd5b6118d68161248f565b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461197f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806135946038913960400191505060405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506119c8610a57565b73ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f70d5e3e3a45cc7fd9718d32fc5f8ab32f67c593330bfd9231cfd2467d0c74c6360405160405180910390a350565b60001515600c60149054906101000a900460ff16151514611ab2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806133916028913960400191505060405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806135946038913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806134ea6028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806133db6023913960400191505060405180910390fd5b81600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c60146101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d20610a57565b73ffffffffffffffffffffffffffffffffffffffff167f1136ccf874c0c85bed8c1488e35920195c98fda6c939c473a46510d35826d5a160405160405180910390a35050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f484c4249434f3a206163636f756e74206973207a65726f20616464726573730081525060200191505060405180910390fd5b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b601854811015611f09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613557603d913960400191505060405180910390fd5b611f13828261258b565b611f1d828261263b565b5050565b6000611f2c826126da565b9050919050565b600080828401905083811015611fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b611fc582826128bd565b5050565b5050565b611fd56128cb565b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561205d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806132c8603d913960400191505060405180910390fd5b6120af81601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f3390919063ffffffff16565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60006121006113e0565b8061210f575061210e6128d5565b5b905090565b61211d81611db6565b15612173576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806135346023913960400191505060405180910390fd5b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fdbe320accb74107e8da655fa6a1e2b454c3102a3985d4201aba99308881a410a60405160405180910390a250565b6000808314156122245760009050612291565b600082840290508284828161223557fe5b041461228c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134366021913960400191505060405180910390fd5b809150505b92915050565b60006122d983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506128e1565b905092915050565b8060098190555050565b8060078190555050565b600061233783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506129a7565b905092915050565b61234761169e565b61239c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061329a602e913960400191505060405180910390fd5b6123a4611519565b6123f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806133056031913960400191505060405180910390fd5b61240281612a67565b50565b61240d611519565b1561244157612440600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601754612c7a565b5b612449612dc5565b565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61249881611db6565b6124ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806133b96022913960400191505060405180910390fd5b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167ff38e60871ec534937251cd91cad807e15f55f1f6815128faecc256e71994b49760405160405180910390a250565b6014546125e082601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f3390919063ffffffff16565b1115612637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613336602a913960400191505060405180910390fd5b5050565b6126458282612f68565b600754612662826126546110ad565b611f3390919063ffffffff16565b11156126d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43617070656443726f776473616c653a2063617020657863656564656400000081525060200191505060405180910390fd5b5050565b60006126e46110b7565b6126f157600090506128b8565b600061270883601654611f3390919063ffffffff16565b6016819055506015546016541115612828576127316015546016546122f590919063ffffffff16565b601681905550600061274e601654856122f590919063ffffffff16565b9050600081106127e157612798612789612766610cbf565b61277b601654886122f590919063ffffffff16565b61221190919063ffffffff16565b83611f3390919063ffffffff16565b91506011546010600082825403925050819055506127da6127cb6127ba610cbf565b60165461221190919063ffffffff16565b83611f3390919063ffffffff16565b9150612822565b60115460106000828254039250508190555061281f612810612801610cbf565b8661221190919063ffffffff16565b83611f3390919063ffffffff16565b91505b50612857565b612854612845612836610cbf565b8561221190919063ffffffff16565b82611f3390919063ffffffff16565b90505b6000612880606461287260058561221190919063ffffffff16565b61229790919063ffffffff16565b905061289581836122f590919063ffffffff16565b91506128ac81601754611f3390919063ffffffff16565b60178190555081925050505b919050565b6128c78282612ff0565b5050565b6128d36130b5565b565b60006006544211905090565b6000808311829061298d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612952578082015181840152602081019050612937565b50505050905090810190601f16801561297f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161299957fe5b049050809150509392505050565b6000838311158290612a54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a195780820151818401526020810190506129fe565b50505050905090810190601f168015612a465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b612a6f610bbe565b612ac4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134c96021913960400191505060405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111612b61576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806133fe6038913960400191505060405180910390fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663beabacc8612bec611d8c565b84846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612c5e57600080fd5b505af1158015612c72573d6000803e3d6000fd5b505050505050565b60011515600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1984846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612d1157600080fd5b505af1158015612d25573d6000803e3d6000fd5b505050506040513d6020811015612d3b57600080fd5b8101908080519060200190929190505050151514612dc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43726f776473616c653a206d696e74696e67206661696c65640000000000000081525060200191505060405180910390fd5b5050565b612dcd611519565b15612edb57600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166343d726d66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612e3c57600080fd5b505af1158015612e50573d6000803e3d6000fd5b50505050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639af6549a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612ebe57600080fd5b505af1158015612ed2573d6000803e3d6000fd5b50505050612f5e565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638c52dc416040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f4557600080fd5b505af1158015612f59573d6000803e3d6000fd5b505050505b612f66613162565b565b612f706110b7565b612fe2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f54696d656443726f776473616c653a206e6f74206f70656e000000000000000081525060200191505060405180910390fd5b612fec8282613164565b5050565b61304281600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f3390919063ffffffff16565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506130b1600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612c7a565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f340fa01346130fc610a57565b6040518363ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506000604051808303818588803b15801561314757600080fd5b505af115801561315b573d6000803e3d6000fd5b5050505050565b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061349f602a913960400191505060405180910390fd5b6000811415613261576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43726f776473616c653a20776569416d6f756e7420697320300000000000000081525060200191505060405180910390fd5b505056fe484c4249434f3a20636f65662069736e27742077697468696e2072616e6765206f6620617574686f72697a65642076616c756573526566756e6461626c65506f737444656c697665727943726f776473616c653a206e6f742066696e616c697a6564484c4249434f3a205f706f737456616c696461746550757263686173652062656e696669636961727920697320746865207a65726f2061646472657373526566756e6461626c65506f737444656c697665727943726f776473616c653a20676f616c206e6f742072656163686564484c4249434f3a2043616e6e6f7420696e76657374206d6f7265207468616e204b5943206c696d69742e484c4249434f3a2063616c6c657220646f6573206e6f742068617665207468652057686974656c697374656420726f6c65484c4249434f3a20636f6e747261637420697320616c726561647920696e697469616c697a65642e484c4249434f3a206163636f756e74206973206e6f7420626c61636b6c6973746564484c4249434f3a2072657365727665416464726573732063616e6e6f74206265203078506f737444656c697665727943726f776473616c653a2062656e6566696369617279206973206e6f742064756520616e7920746f6b656e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7746696e616c697a61626c6543726f776473616c653a20616c72656164792066696e616c697a6564526566756e6461626c6543726f776473616c653a20676f616c207265616368656443726f776473616c653a2062656e656669636961727920697320746865207a65726f2061646472657373506f737444656c697665727943726f776473616c653a206e6f7420636c6f736564484c4249434f3a2077686974656c697374696e67416464726573732063616e6e6f74206265203078526566756e6461626c6543726f776473616c653a206e6f742066696e616c697a6564484c4249434f3a206163636f756e7420616c726561647920626c61636b6c6973746564484c4249434f3a20496e766573746d656e74206d7573742062652067726561746572207468616e206f7220657175616c20746f20302e30303120657468484c4249434f3a206f6e6c7920746865206465706c6f79696e6720616464726573732063616e2063616c6c2074686973206d6574686f642ea264697066735822122024a959e4535dfd78a0a6f9274ca04298ff3e88610a8fc4167c449a83b1f8962b64736f6c63430007060033608060405234801561001057600080fd5b506040516115eb3803806115eb8339818101604052602081101561003357600080fd5b810190808051906020019092919050505060006100546101e360201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001806115be602d913960400191505060405180910390fd5b80600260016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260006101000a81548160ff021916908360028111156101d857fe5b0217905550506101eb565b600033905090565b6113c4806101fa6000396000f3fe6080604052600436106100a75760003560e01c80638da5cb5b116100645780638da5cb5b146101ea5780639af6549a1461022b578063c19d93fb14610242578063e3a9db1a14610278578063f2fde38b146102dd578063f340fa011461032e576100a7565b806338af3eed146100ac57806343d726d6146100ed57806351cff8d914610104578063685ca19414610155578063715018a6146101bc5780638c52dc41146101d3575b600080fd5b3480156100b857600080fd5b506100c1610372565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156100f957600080fd5b5061010261039c565b005b34801561011057600080fd5b506101536004803603602081101561012757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610533565b005b34801561016157600080fd5b506101a46004803603602081101561017857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061059d565b60405180821515815260200191505060405180910390f35b3480156101c857600080fd5b506101d16105cf565b005b3480156101df57600080fd5b506101e8610755565b005b3480156101f657600080fd5b506101ff6108ed565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561023757600080fd5b50610240610916565b005b34801561024e57600080fd5b506102576109fe565b6040518082600281111561026757fe5b815260200191505060405180910390f35b34801561028457600080fd5b506102c76004803603602081101561029b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a15565b6040518082815260200191505060405180910390f35b3480156102e957600080fd5b5061032c6004803603602081101561030057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a5e565b005b6103706004803603602081101561034457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c69565b005b6000600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6103a4610cf3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610464576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600281111561047157fe5b600260009054906101000a900460ff16600281111561048c57fe5b146104e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806113346029913960400191505060405180910390fd5b60028060006101000a81548160ff0219169083600281111561050057fe5b02179055507f088672c3a6e342f7cd94a65ba63b79df24a8973927b4d05d803c44bbf787d12f60405160405180910390a1565b61053c8161059d565b610591576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260338152602001806113016033913960400191505060405180910390fd5b61059a81610cfb565b50565b6000600160028111156105ac57fe5b600260009054906101000a900460ff1660028111156105c757fe5b149050919050565b6105d7610cf3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610697576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61075d610cf3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461081d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600281111561082a57fe5b600260009054906101000a900460ff16600281111561084557fe5b1461089b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603281526020018061135d6032913960400191505060405180910390fd5b6001600260006101000a81548160ff021916908360028111156108ba57fe5b02179055507f599d8e5a83cffb867d051598c4d70e805d59802d8081c1c7d6dffc5b6aca2b8960405160405180910390a1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60028081111561092257fe5b600260009054906101000a900460ff16600281111561093d57fe5b14610993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061123e6038913960400191505060405180910390fd5b600260019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050501580156109fb573d6000803e3d6000fd5b50565b6000600260009054906101000a900460ff16905090565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a66610cf3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b26576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610bac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806112766026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006002811115610c7657fe5b600260009054906101000a900460ff166002811115610c9157fe5b14610ce7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806112d6602b913960400191505060405180910390fd5b610cf081610ec7565b50565b600033905090565b610d03610cf3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dc3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610e75818373ffffffffffffffffffffffffffffffffffffffff1661107b90919063ffffffff16565b8173ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5826040518082815260200191505060405180910390a25050565b610ecf610cf3565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f8f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000349050610fe681600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111b590919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f2da466a7b24304f47e87fa2e1e5a81b9831ce54fec19055ce277ca2f39ba42c4826040518082815260200191505060405180910390a25050565b804710156110f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a20696e73756666696369656e742062616c616e636500000081525060200191505060405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff168260405180600001905060006040518083038185875af1925050503d8060008114611151576040519150601f19603f3d011682016040523d82523d6000602084013e611156565b606091505b50509050806111b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a81526020018061129c603a913960400191505060405180910390fd5b505050565b600080828401905083811015611233576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b809150509291505056fe526566756e64457363726f773a2062656e65666963696172792063616e206f6e6c79207769746864726177207768696c6520636c6f7365644f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564526566756e64457363726f773a2063616e206f6e6c79206465706f736974207768696c6520616374697665436f6e646974696f6e616c457363726f773a207061796565206973206e6f7420616c6c6f77656420746f207769746864726177526566756e64457363726f773a2063616e206f6e6c7920636c6f7365207768696c6520616374697665526566756e64457363726f773a2063616e206f6e6c7920656e61626c6520726566756e6473207768696c6520616374697665a2646970667358221220736d671f4d275163e6d5e6445b820f4976180d0a1a39c97a496c7c744d22cf5364736f6c63430007060033526566756e64457363726f773a2062656e656669636961727920697320746865207a65726f2061646472657373608060405234801561001057600080fd5b5060006100216100b660201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4101e71e974f68df5e9730cc223280b41654676bbb052cdcc735c3337e64d2d981604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1506100be565b600033905090565b610507806100cd6000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80632348238c14610046578063beabacc81461008a578063c6dbdf61146100f8575b600080fd5b6100886004803603602081101561005c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061012c565b005b6100f6600480360360608110156100a057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506102ed565b005b61010061044a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661016b610473565b73ffffffffffffffffffffffffffffffffffffffff16146101d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806104a6602c913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561025d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061047c602a913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f4101e71e974f68df5e9730cc223280b41654676bbb052cdcc735c3337e64d2d981604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661032c610473565b73ffffffffffffffffffffffffffffffffffffffff1614610398576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001806104a6602c913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561040957600080fd5b505af115801561041d573d6000803e3d6000fd5b505050506040513d602081101561043357600080fd5b810190808051906020019092919050505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60003390509056fe5365636f6e646172793a206e6577207072696d61727920697320746865207a65726f20616464726573735365636f6e646172793a2063616c6c6572206973206e6f7420746865207072696d617279206163636f756e74a2646970667358221220aa0df5a7e4e9b22b28af4c6478103078ec6a41286e5cb5bed012a368c34189db64736f6c6343000706003354696d656443726f776473616c653a206f70656e696e672074696d65206973206265666f72652063757272656e742074696d6554696d656443726f776473616c653a206f70656e696e672074696d65206973206e6f74206265666f726520636c6f73696e672074696d6543726f776473616c653a20746f6b656e20697320746865207a65726f206164647265737343726f776473616c653a2077616c6c657420697320746865207a65726f2061646472657373000000000000000000000000000000000000000000000000000000000000177000000000000000000000000000000000000000000000000000000000000000d20000000000000000000000006607e860434987af72caf89ddf3ffecf6db4f5a60000000000000000000000005b9348e7d9d6c1c8044108955e60cf732a3fbbeb00000000000000000000000000000000000000000000000000000000603a88a00000000000000000000000000000000000000000000000000000000060d8bca000000000000000000000000000000000000000000000010f0cf064dd5920000000000000000000000000000000000000000000000000000d8d726b7177a80000
Deployed Bytecode
0x6080604052600436106101fd5760003560e01c80634f9359451161010d578063b7a8807c116100a0578063ec8ac4d81161006f578063ec8ac4d8146108b9578063f09a4016146108fd578063f5e343bb1461096e578063fc0c546a146109af578063fe575a87146109f057610214565b8063b7a8807c1461079b578063bffa55d5146107c6578063c6a276c214610817578063defdfae61461086857610214565b80637d3d6522116100dc5780637d3d6522146106af578063966aeece146106dc578063ae5b5b111461072d578063b3f05b971461076e57610214565b80634f9359451461058b578063521eb273146105b857806366829b16146105f957806370a082311461064a57610214565b806337b71da11161019057806347535d7b1161015f57806347535d7b1461047a578063477fea02146104a757806349df728c146104f85780634b6753bc146105495780634bb278f31461057457610214565b806337b71da1146103ce5780633f701544146103f957806340193883146104245780634042b66f1461044f57610214565b80632c4e722e116101cc5780632c4e722e146103125780633110235a1461033d578063329425c514610368578063355274ea146103a357610214565b80631515bc2b14610226578063158ef93e14610253578063188efc16146102805780631cd273cf146102d157610214565b366102145761021261020d610a57565b610a5f565b005b61022461021f610a57565b610a5f565b005b34801561023257600080fd5b5061023b610bbe565b60405180821515815260200191505060405180910390f35b34801561025f57600080fd5b50610268610bcd565b60405180821515815260200191505060405180910390f35b34801561028c57600080fd5b506102cf600480360360208110156102a357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610be0565b005b3480156102dd57600080fd5b506102e6610c99565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561031e57600080fd5b50610327610cbf565b6040518082815260200191505060405180910390f35b34801561034957600080fd5b50610352610cc9565b6040518082815260200191505060405180910390f35b34801561037457600080fd5b506103a16004803603602081101561038b57600080fd5b8101908080359060200190929190505050610cd3565b005b3480156103af57600080fd5b506103b8611071565b6040518082815260200191505060405180910390f35b3480156103da57600080fd5b506103e361107b565b6040518082815260200191505060405180910390f35b34801561040557600080fd5b5061040e611099565b6040518082815260200191505060405180910390f35b34801561043057600080fd5b506104396110a3565b6040518082815260200191505060405180910390f35b34801561045b57600080fd5b506104646110ad565b6040518082815260200191505060405180910390f35b34801561048657600080fd5b5061048f6110b7565b60405180821515815260200191505060405180910390f35b3480156104b357600080fd5b506104f6600480360360208110156104ca57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110d2565b005b34801561050457600080fd5b506105476004803603602081101561051b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061121d565b005b34801561055557600080fd5b5061055e6112a5565b6040518082815260200191505060405180910390f35b34801561058057600080fd5b506105896112af565b005b34801561059757600080fd5b506105a06113e0565b60405180821515815260200191505060405180910390f35b3480156105c457600080fd5b506105cd6113f4565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561060557600080fd5b506106486004803603602081101561061c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061141e565b005b34801561065657600080fd5b506106996004803603602081101561066d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114d0565b6040518082815260200191505060405180910390f35b3480156106bb57600080fd5b506106c4611519565b60405180821515815260200191505060405180910390f35b3480156106e857600080fd5b5061072b600480360360208110156106ff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061152d565b005b34801561073957600080fd5b50610742611678565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561077a57600080fd5b5061078361169e565b60405180821515815260200191505060405180910390f35b3480156107a757600080fd5b506107b06116b5565b6040518082815260200191505060405180910390f35b3480156107d257600080fd5b50610815600480360360208110156107e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116bf565b005b34801561082357600080fd5b506108666004803603602081101561083a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611820565b005b34801561087457600080fd5b506108b76004803603602081101561088b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506118d9565b005b6108fb600480360360208110156108cf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a5f565b005b34801561090957600080fd5b5061096c6004803603604081101561092057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a46565b005b34801561097a57600080fd5b50610983611d66565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109bb57600080fd5b506109c4611d8c565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156109fc57600080fd5b50610a3f60048036036020811015610a1357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611db6565b60405180821515815260200191505060405180910390f35b600033905090565b60026000541415610ad8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0081525060200191505060405180910390fd5b60026000819055506000349050610aef8282611eae565b6000610afa82611f21565b9050610b1182600454611f3390919063ffffffff16565b600481905550610b218382611fbb565b8273ffffffffffffffffffffffffffffffffffffffff16610b40610a57565b73ffffffffffffffffffffffffffffffffffffffff167f6faf93231a456e552dbc9961f58d9713ee4f2e69d15f1975b050ef0911053a7b8484604051808381526020018281526020019250505060405180910390a3610b9f8383611fc9565b610ba7611fcd565b610bb18383611fd7565b5050600160008190555050565b6000610bc86120f6565b905090565b600c60149054906101000a900460ff1681565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610c21610a57565b73ffffffffffffffffffffffffffffffffffffffff1614610c8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806133606031913960400191505060405180910390fd5b610c9681612114565b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000601054905090565b6000601454905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806135946038913960400191505060405180910390fd5b600081118015610d8a575061271081105b610ddf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806132666034913960400191505060405180910390fd5b60006103e89050610e1c610e176103e8610e0985610dfb6110a3565b61221190919063ffffffff16565b61229790919063ffffffff16565b6122e1565b610e52610e4d6103e8610e3f85610e31611071565b61221190919063ffffffff16565b61229790919063ffffffff16565b6122eb565b610e7b6103e8610e6d8460155461221190919063ffffffff16565b61229790919063ffffffff16565b601581905550610eaa6103e8610e9c8460145461221190919063ffffffff16565b61229790919063ffffffff16565b6014819055506103e8821115610f5c57610ecf6103e8836122f590919063ffffffff16565b9150610f0e610efd6103e8610eef8560105461221190919063ffffffff16565b61229790919063ffffffff16565b6010546122f590919063ffffffff16565b601081905550610f51610f406103e8610f328560115461221190919063ffffffff16565b61229790919063ffffffff16565b6011546122f590919063ffffffff16565b601181905550610ff8565b610f6f82826122f590919063ffffffff16565b9150610fae610f9d6103e8610f8f8560105461221190919063ffffffff16565b61229790919063ffffffff16565b601054611f3390919063ffffffff16565b601081905550610ff1610fe06103e8610fd28560115461221190919063ffffffff16565b61229790919063ffffffff16565b601154611f3390919063ffffffff16565b6011819055505b7ff3daf0fa83d5049e1ca3831cb505fe867090c0f5af177702b1adeb296b0414b76110216110a3565b611029611071565b60155460145460105460115460405180878152602001868152602001858152602001848152602001838152602001828152602001965050505050505060405180910390a15050565b6000600754905090565b60006110946011546010546122f590919063ffffffff16565b905090565b6000601554905090565b6000600954905090565b6000600454905090565b600060055442101580156110cd57506006544211155b905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611178576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806135946038913960400191505060405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506111c1610a57565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f7c07f5a6c7576e884f7d9e01c457774a9059fb680caf5cdd02c86700d3ce1b5460405160405180910390a350565b61122681611db6565b15611299576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f484c4249434f3a206163636f756e7420697320626c61636b6c6973746564000081525060200191505060405180910390fd5b6112a28161233f565b50565b6000600654905090565b600860009054906101000a900460ff1615611315576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806134576027913960400191505060405180910390fd5b61131d610bbe565b61138f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f46696e616c697a61626c6543726f776473616c653a206e6f7420636c6f73656481525060200191505060405180910390fd5b6001600860006101000a81548160ff0219169083151502179055506113b2612405565b7f9270cc390c096600a1c17c44345a1ba689fafd99d97487b10cfccf86cf73183660405160405180910390a1565b60006007546113ed6110ad565b1015905090565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806135946038913960400191505060405180910390fd5b6114cd8161244b565b50565b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60006009546115266110ad565b1015905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806135946038913960400191505060405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061161c610a57565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f63c70fa8d3aed6b9cda2842d4152a4ccf78aab6db236b9b22ad898ca7541e11360405160405180910390a350565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600860009054906101000a900460ff16905090565b6000600554905090565b6116c761169e565b61171c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806135126022913960400191505060405180910390fd5b611724611519565b1561177a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061347e6021913960400191505060405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166351cff8d9826040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561180557600080fd5b505af1158015611819573d6000803e3d6000fd5b5050505050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611861610a57565b73ffffffffffffffffffffffffffffffffffffffff16146118cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806133606031913960400191505060405180910390fd5b6118d68161248f565b50565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461197f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806135946038913960400191505060405180910390fd5b80600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506119c8610a57565b73ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f70d5e3e3a45cc7fd9718d32fc5f8ab32f67c593330bfd9231cfd2467d0c74c6360405160405180910390a350565b60001515600c60149054906101000a900460ff16151514611ab2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806133916028913960400191505060405180910390fd5b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b58576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806135946038913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bde576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806134ea6028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c64576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806133db6023913960400191505060405180910390fd5b81600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600c60146101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d20610a57565b73ffffffffffffffffffffffffffffffffffffffff167f1136ccf874c0c85bed8c1488e35920195c98fda6c939c473a46510d35826d5a160405160405180910390a35050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f484c4249434f3a206163636f756e74206973207a65726f20616464726573730081525060200191505060405180910390fd5b601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b601854811015611f09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d815260200180613557603d913960400191505060405180910390fd5b611f13828261258b565b611f1d828261263b565b5050565b6000611f2c826126da565b9050919050565b600080828401905083811015611fb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b611fc582826128bd565b5050565b5050565b611fd56128cb565b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561205d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001806132c8603d913960400191505060405180910390fd5b6120af81601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f3390919063ffffffff16565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b60006121006113e0565b8061210f575061210e6128d5565b5b905090565b61211d81611db6565b15612173576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806135346023913960400191505060405180910390fd5b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fdbe320accb74107e8da655fa6a1e2b454c3102a3985d4201aba99308881a410a60405160405180910390a250565b6000808314156122245760009050612291565b600082840290508284828161223557fe5b041461228c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134366021913960400191505060405180910390fd5b809150505b92915050565b60006122d983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506128e1565b905092915050565b8060098190555050565b8060078190555050565b600061233783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506129a7565b905092915050565b61234761169e565b61239c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e81526020018061329a602e913960400191505060405180910390fd5b6123a4611519565b6123f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806133056031913960400191505060405180910390fd5b61240281612a67565b50565b61240d611519565b1561244157612440600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601754612c7a565b5b612449612dc5565b565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61249881611db6565b6124ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806133b96022913960400191505060405180910390fd5b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167ff38e60871ec534937251cd91cad807e15f55f1f6815128faecc256e71994b49760405160405180910390a250565b6014546125e082601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f3390919063ffffffff16565b1115612637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613336602a913960400191505060405180910390fd5b5050565b6126458282612f68565b600754612662826126546110ad565b611f3390919063ffffffff16565b11156126d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f43617070656443726f776473616c653a2063617020657863656564656400000081525060200191505060405180910390fd5b5050565b60006126e46110b7565b6126f157600090506128b8565b600061270883601654611f3390919063ffffffff16565b6016819055506015546016541115612828576127316015546016546122f590919063ffffffff16565b601681905550600061274e601654856122f590919063ffffffff16565b9050600081106127e157612798612789612766610cbf565b61277b601654886122f590919063ffffffff16565b61221190919063ffffffff16565b83611f3390919063ffffffff16565b91506011546010600082825403925050819055506127da6127cb6127ba610cbf565b60165461221190919063ffffffff16565b83611f3390919063ffffffff16565b9150612822565b60115460106000828254039250508190555061281f612810612801610cbf565b8661221190919063ffffffff16565b83611f3390919063ffffffff16565b91505b50612857565b612854612845612836610cbf565b8561221190919063ffffffff16565b82611f3390919063ffffffff16565b90505b6000612880606461287260058561221190919063ffffffff16565b61229790919063ffffffff16565b905061289581836122f590919063ffffffff16565b91506128ac81601754611f3390919063ffffffff16565b60178190555081925050505b919050565b6128c78282612ff0565b5050565b6128d36130b5565b565b60006006544211905090565b6000808311829061298d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612952578082015181840152602081019050612937565b50505050905090810190601f16801561297f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161299957fe5b049050809150509392505050565b6000838311158290612a54576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a195780820151818401526020810190506129fe565b50505050905090810190601f168015612a465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b612a6f610bbe565b612ac4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134c96021913960400191505060405180910390fd5b6000600b60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008111612b61576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806133fe6038913960400191505060405180910390fd5b6000600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663beabacc8612bec611d8c565b84846040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050600060405180830381600087803b158015612c5e57600080fd5b505af1158015612c72573d6000803e3d6000fd5b505050505050565b60011515600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1984846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612d1157600080fd5b505af1158015612d25573d6000803e3d6000fd5b505050506040513d6020811015612d3b57600080fd5b8101908080519060200190929190505050151514612dc1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43726f776473616c653a206d696e74696e67206661696c65640000000000000081525060200191505060405180910390fd5b5050565b612dcd611519565b15612edb57600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166343d726d66040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612e3c57600080fd5b505af1158015612e50573d6000803e3d6000fd5b50505050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639af6549a6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612ebe57600080fd5b505af1158015612ed2573d6000803e3d6000fd5b50505050612f5e565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638c52dc416040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612f4557600080fd5b505af1158015612f59573d6000803e3d6000fd5b505050505b612f66613162565b565b612f706110b7565b612fe2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f54696d656443726f776473616c653a206e6f74206f70656e000000000000000081525060200191505060405180910390fd5b612fec8282613164565b5050565b61304281600b60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f3390919063ffffffff16565b600b60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506130b1600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612c7a565b5050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f340fa01346130fc610a57565b6040518363ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506000604051808303818588803b15801561314757600080fd5b505af115801561315b573d6000803e3d6000fd5b5050505050565b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a81526020018061349f602a913960400191505060405180910390fd5b6000811415613261576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f43726f776473616c653a20776569416d6f756e7420697320300000000000000081525060200191505060405180910390fd5b505056fe484c4249434f3a20636f65662069736e27742077697468696e2072616e6765206f6620617574686f72697a65642076616c756573526566756e6461626c65506f737444656c697665727943726f776473616c653a206e6f742066696e616c697a6564484c4249434f3a205f706f737456616c696461746550757263686173652062656e696669636961727920697320746865207a65726f2061646472657373526566756e6461626c65506f737444656c697665727943726f776473616c653a20676f616c206e6f742072656163686564484c4249434f3a2043616e6e6f7420696e76657374206d6f7265207468616e204b5943206c696d69742e484c4249434f3a2063616c6c657220646f6573206e6f742068617665207468652057686974656c697374656420726f6c65484c4249434f3a20636f6e747261637420697320616c726561647920696e697469616c697a65642e484c4249434f3a206163636f756e74206973206e6f7420626c61636b6c6973746564484c4249434f3a2072657365727665416464726573732063616e6e6f74206265203078506f737444656c697665727943726f776473616c653a2062656e6566696369617279206973206e6f742064756520616e7920746f6b656e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7746696e616c697a61626c6543726f776473616c653a20616c72656164792066696e616c697a6564526566756e6461626c6543726f776473616c653a20676f616c207265616368656443726f776473616c653a2062656e656669636961727920697320746865207a65726f2061646472657373506f737444656c697665727943726f776473616c653a206e6f7420636c6f736564484c4249434f3a2077686974656c697374696e67416464726573732063616e6e6f74206265203078526566756e6461626c6543726f776473616c653a206e6f742066696e616c697a6564484c4249434f3a206163636f756e7420616c726561647920626c61636b6c6973746564484c4249434f3a20496e766573746d656e74206d7573742062652067726561746572207468616e206f7220657175616c20746f20302e30303120657468484c4249434f3a206f6e6c7920746865206465706c6f79696e6720616464726573732063616e2063616c6c2074686973206d6574686f642ea264697066735822122024a959e4535dfd78a0a6f9274ca04298ff3e88610a8fc4167c449a83b1f8962b64736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000177000000000000000000000000000000000000000000000000000000000000000d20000000000000000000000006607e860434987af72caf89ddf3ffecf6db4f5a60000000000000000000000005b9348e7d9d6c1c8044108955e60cf732a3fbbeb00000000000000000000000000000000000000000000000000000000603a88a00000000000000000000000000000000000000000000000000000000060d8bca000000000000000000000000000000000000000000000010f0cf064dd5920000000000000000000000000000000000000000000000000000d8d726b7177a80000
-----Decoded View---------------
Arg [0] : initialRateReceived (uint256): 6000
Arg [1] : rateCoefficientReceived (uint256): 210
Arg [2] : walletReceived (address): 0x6607E860434987af72cAF89DDf3fFecF6db4f5a6
Arg [3] : tokenReceived (address): 0x5b9348E7d9D6c1C8044108955e60Cf732a3FBBeb
Arg [4] : openingTimeReceived (uint256): 1614448800
Arg [5] : closingTimeReceived (uint256): 1624816800
Arg [6] : capReceived (uint256): 5000000000000000000000
Arg [7] : goalReceived (uint256): 250000000000000000000
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000001770
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000d2
Arg [2] : 0000000000000000000000006607e860434987af72caf89ddf3ffecf6db4f5a6
Arg [3] : 0000000000000000000000005b9348e7d9d6c1c8044108955e60cf732a3fbbeb
Arg [4] : 00000000000000000000000000000000000000000000000000000000603a88a0
Arg [5] : 0000000000000000000000000000000000000000000000000000000060d8bca0
Arg [6] : 00000000000000000000000000000000000000000000010f0cf064dd59200000
Arg [7] : 00000000000000000000000000000000000000000000000d8d726b7177a80000
Deployed Bytecode Sourcemap
207:12336:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2492:23:4;2502:12;:10;:12::i;:::-;2492:9;:23::i;:::-;207:12336:10;;2566:23:4;2576:12;:10;:12::i;:::-;2566:9;:23::i;:::-;207:12336:10;10394:205;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;353:23;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;10796:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;433:32;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;6875:90;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10702:88;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5908:961;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;695:73:1;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6971:104:10;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;10605:91;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1494:75:19;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3217:85:4;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1835:189:23;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;8059:218:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8741:200;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1661:89:23;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;813:262:9;;;;;;;;;;;;;:::i;:::-;;1318:92:1;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2899:87:4;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;7179:119:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1094:108:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;2197:94:19;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;7403:236:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;580:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;573:82:9;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1507:89:23;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1838:236:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10915:119:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;7744:217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3559:606:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;3384:532:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;519:35;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2655:78:4;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11040:192:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;590:104:3;643:15;677:10;670:17;;590:104;:::o;3559:606:4:-;1671:1:16;2251:7;;:19;;2243:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1671:1;2381:7;:18;;;;3637:17:4::1;3657:9;3637:29;;3676:44;3697:11;3710:9;3676:20;:44::i;:::-;3779:14;3796:26;3812:9;3796:15;:26::i;:::-;3779:43;;3870:25;3885:9;3870:10;;:14;;:25;;;;:::i;:::-;3857:10;:38;;;;3907:37;3924:11;3937:6;3907:16;:37::i;:::-;3989:11;3959:61;;3975:12;:10;:12::i;:::-;3959:61;;;4002:9;4013:6;3959:61;;;;;;;;;;;;;;;;;;;;;;;;4031:46;4054:11;4067:9;4031:22;:46::i;:::-;4088:15;:13;:15::i;:::-;4113:45;4135:11;4148:9;4113:21;:45::i;:::-;2410:1:16;;1628::::0;2554:7;:22;;;;3559:606:4;:::o;10394:205:10:-;10483:4;10560:32;:30;:32::i;:::-;10553:39;;10394:205;:::o;353:23::-;;;;;;;;;;;;;:::o;10796:113::-;11996:20;;;;;;;;;;;11980:36;;:12;:10;:12::i;:::-;:36;;;11972:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10878:24:::1;10894:7;10878:15;:24::i;:::-;10796:113:::0;:::o;433:32::-;;;;;;;;;;;;;:::o;6875:90::-;6921:7;6946:12;;6939:19;;6875:90;:::o;10702:88::-;10744:7;10770:13;;10763:20;;10702:88;:::o;5908:961::-;12444:17;;;;;;;;;;;12430:31;;:10;:31;;;12422:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6009:1:::1;6002:4;:8;:24;;;;;6021:5;6014:4;:12;6002:24;5994:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6094:16;6113:4;6094:23;;6128:38;6139:26;6160:4;6139:16;6150:4;6139:6;:4;:6::i;:::-;:10;;:16;;;;:::i;:::-;:20;;:26;;;;:::i;:::-;6128:10;:38::i;:::-;6176:36;6186:25;6206:4;6186:15;6196:4;6186:5;:3;:5::i;:::-;:9;;:15;;;;:::i;:::-;:19;;:25;;;;:::i;:::-;6176:9;:36::i;:::-;6238:33;6266:4;6238:23;6256:4;6238:13;;:17;;:23;;;;:::i;:::-;:27;;:33;;;;:::i;:::-;6222:13;:49;;;;6297:33;6325:4;6297:23;6315:4;6297:13;;:17;;:23;;;;:::i;:::-;:27;;:33;;;;:::i;:::-;6281:13;:49;;;;6360:4;6353;:11;6349:417;;;6387:14;6396:4;6387;:8;;:14;;;;:::i;:::-;6380:21;;6430:50;6447:32;6474:4;6447:22;6464:4;6447:12;;:16;;:22;;;;:::i;:::-;:26;;:32;;;;:::i;:::-;6430:12;;:16;;:50;;;;:::i;:::-;6415:12;:65;;;;6506:44;6520:29;6544:4;6520:19;6534:4;6520:9;;:13;;:19;;;;:::i;:::-;:23;;:29;;;;:::i;:::-;6506:9;;:13;;:44;;;;:::i;:::-;6494:9;:56;;;;6349:417;;;6588:18;6601:4;6588:8;:12;;:18;;;;:::i;:::-;6581:25;;6635:50;6652:32;6679:4;6652:22;6669:4;6652:12;;:16;;:22;;;;:::i;:::-;:26;;:32;;;;:::i;:::-;6635:12;;:16;;:50;;;;:::i;:::-;6620:12;:65;;;;6711:44;6725:29;6749:4;6725:19;6739:4;6725:9;;:13;;:19;;;;:::i;:::-;:23;;:29;;;;:::i;:::-;6711:9;;:13;;:44;;;;:::i;:::-;6699:9;:56;;;;6349:417;6781:81;6793:6;:4;:6::i;:::-;6801:5;:3;:5::i;:::-;6808:13;;6823;;6838:12;;6852:9;;6781:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12532:1;5908:961:::0;:::o;695:73:1:-;731:7;757:4;;750:11;;695:73;:::o;6971:104:10:-;7015:7;7041:27;7058:9;;7041:12;;:16;;:27;;;;:::i;:::-;7034:34;;6971:104;:::o;10605:91::-;10650:7;10676:13;;10669:20;;10605:91;:::o;1494:75:19:-;1531:7;1557:5;;1550:12;;1494:75;:::o;3217:85:4:-;3259:7;3285:10;;3278:17;;3217:85;:::o;1835:189:23:-;1874:4;1970:12;;1951:15;:31;;:66;;;;;2005:12;;1986:15;:31;;1951:66;1944:73;;1835:189;:::o;8059:218:10:-;12444:17;;;;;;;;;;;12430:31;;:10;:31;;;12422:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8184:17:::1;8166:15;;:35;;;;;;;;;;;;;;;;;;8257:12;:10;:12::i;:::-;8216:54;;8238:17;8216:54;;;;;;;;;;;;8059:218:::0;:::o;8741:200::-;8829:26;8843:11;8829:13;:26::i;:::-;8828:27;8820:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8901:33;8922:11;8901:20;:33::i;:::-;8741:200;:::o;1661:89:23:-;1705:7;1731:12;;1724:19;;1661:89;:::o;813:262:9:-;859:10;;;;;;;;;;;858:11;850:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;931:11;:9;:11::i;:::-;923:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1003:4;990:10;;:17;;;;;;;;;;;;;;;;;;1018:15;:13;:15::i;:::-;1048:20;;;;;;;;;;813:262::o;1318:92:1:-;1361:4;1399;;1384:11;:9;:11::i;:::-;:19;;1377:26;;1318:92;:::o;2899:87:4:-;2938:15;2972:7;;;;;;;;;;;2965:14;;2899:87;:::o;7179:119:10:-;12444:17;;;;;;;;;;;12430:31;;:10;:31;;;12422:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7269:22:::1;7282:8;7269:12;:22::i;:::-;7179:119:::0;:::o;1094:108:15:-;1151:7;1177:9;:18;1187:7;1177:18;;;;;;;;;;;;;;;;1170:25;;1094:108;;;:::o;2197:94:19:-;2241:4;2279:5;;2264:11;:9;:11::i;:::-;:20;;2257:27;;2197:94;:::o;7403:236:10:-;12444:17;;;;;;;;;;;12430:31;;:10;:31;;;12422:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7534:21:::1;7511:20;;:44;;;;;;;;;;;;;;;;;;7619:12;:10;:12::i;:::-;7570:62;;7596:21;7570:62;;;;;;;;;;;;7403:236:::0;:::o;580:30::-;;;;;;;;;;;;;:::o;573:82:9:-;615:4;638:10;;;;;;;;;;;631:17;;573:82;:::o;1507:89:23:-;1551:7;1577:12;;1570:19;;1507:89;:::o;1838:236:19:-;1910:11;:9;:11::i;:::-;1902:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1979:13;:11;:13::i;:::-;1978:14;1970:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2041:7;;;;;;;;;;;:16;;;2058:8;2041:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1838:236;:::o;10915:119:10:-;11996:20;;;;;;;;;;;11980:36;;:12;:10;:12::i;:::-;:36;;;11972:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11000:27:::1;11019:7;11000:18;:27::i;:::-;10915:119:::0;:::o;7744:217::-;12444:17;;;;;;;;;;;12430:31;;:10;:31;;;12422:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7866:18:::1;7846:17;;:38;;;;;;;;;;;;;;;;;;7941:12;:10;:12::i;:::-;7899:55;;7922:17;;;;;;;;;;;7899:55;;;;;;;;;;;;7744:217:::0;:::o;3384:532::-;12231:5;12216:20;;:11;;;;;;;;;;;:20;;;12208:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12444:17:::1;;;;;;;;;;;12430:31;;:10;:31;;;12422:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3583:1:::2;3552:33;;:19;:33;;;;3544:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3674:1;3648:28;;:14;:28;;;;3640:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3750:19;3727:20;;:42;;;;;;;;;;;;;;;;;;3797:14;3779:15;;:32;;;;;;;;;;;;;;;;;;3835:4;3821:11;;:18;;;;;;;;;;;;;;;;;;3889:19;3855:54;;3875:12;:10;:12::i;:::-;3855:54;;;;;;;;;;;;3384:532:::0;;:::o;519:35::-;;;;;;;;;;;;;:::o;2655:78:4:-;2693:8;2720:6;;;;;;;;;;;2713:13;;2655:78;:::o;11040:192:10:-;11101:4;11144:1;11125:21;;:7;:21;;;;11117:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11199:17;:26;11217:7;11199:26;;;;;;;;;;;;;;;;;;;;;;;;;11192:33;;11040:192;;;:::o;9476:375::-;9638:14;;9625:9;:27;;9617:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9728:41;9746:11;9759:9;9728:17;:41::i;:::-;9779:65;9821:11;9834:9;9779:41;:65::i;:::-;9476:375;;:::o;9179:130::-;9250:7;9275:27;9292:9;9275:16;:27::i;:::-;9268:34;;9179:130;;;:::o;874:176:21:-;932:7;951:9;967:1;963;:5;951:17;;991:1;986;:6;;978:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1042:1;1035:8;;;874:176;;;;:::o;10163:225:10:-;10307:74;10356:11;10369;10307:48;:74::i;:::-;10163:225;;:::o;6672:145:4:-;;;:::o;9315:155:10:-;9416:47;:45;:47::i;:::-;9315:155::o;9857:300::-;9987:1;9964:25;;:11;:25;;;;9956:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10098:44;10132:9;10098:16;:29;10115:11;10098:29;;;;;;;;;;;;;;;;:33;;:44;;;;:::i;:::-;10066:16;:29;10083:11;10066:29;;;;;;;;;;;;;;;:76;;;;9857:300;;:::o;1024:176:1:-;1083:4;1160:12;:10;:12::i;:::-;:33;;;;1176:17;:15;:17::i;:::-;1160:33;1153:40;;1024:176;:::o;11238:222:10:-;11308:22;11322:7;11308:13;:22::i;:::-;11307:23;11299:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11409:4;11380:17;:26;11398:7;11380:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;11445:7;11428:25;;;;;;;;;;;;11238:222;:::o;2180:459:21:-;2238:7;2484:1;2479;:6;2475:45;;;2508:1;2501:8;;;;2475:45;2530:9;2546:1;2542;:5;2530:17;;2574:1;2569;2565;:5;;;;;;:10;2557:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2631:1;2624:8;;;2180:459;;;;;:::o;3101:130::-;3159:7;3185:39;3189:1;3192;3185:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3178:46;;3101:130;;;;:::o;1610:78:19:-;1674:7;1666:5;:15;;;;1610:78;:::o;807:74:1:-;868:6;861:4;:13;;;;807:74;:::o;1321:134:21:-;1379:7;1405:43;1409:1;1412;1405:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1398:50;;1321:134;;;;:::o;833:285:18:-;920:11;:9;:11::i;:::-;912:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1000:13;:11;:13::i;:::-;992:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1078:33;1099:11;1078:20;:33::i;:::-;833:285;:::o;8371:261:10:-;8504:13;:11;:13::i;:::-;8500:94;;;8533:50;8548:15;;;;;;;;;;;8565:17;;8533:14;:50::i;:::-;8500:94;8604:21;:19;:21::i;:::-;8371:261::o;2739:84:4:-;2808:8;2799:6;;:17;;;;;;;;;;;;;;;;;;2739:84;:::o;11466:225:10:-;11538:22;11552:7;11538:13;:22::i;:::-;11530:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11638:4;11609:17;:26;11627:7;11609:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;11676:7;11657:27;;;;;;;;;;;;11466:225;:::o;11697:224::-;11844:13;;11796:44;11830:9;11796:16;:29;11813:11;11796:29;;;;;;;;;;;;;;;;:33;;:44;;;;:::i;:::-;:61;;11788:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11697:224;;:::o;1606:254:1:-;1717:50;1744:11;1757:9;1717:26;:50::i;:::-;1815:4;;1785:26;1801:9;1785:11;:9;:11::i;:::-;:15;;:26;;;;:::i;:::-;:34;;1777:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1606:254;;:::o;4191:1488:10:-;4254:7;4278:8;:6;:8::i;:::-;4273:48;;4309:1;4302:8;;;;4273:48;4331:24;4391:33;4414:9;4391:18;;:22;;:33;;;;:::i;:::-;4370:18;:54;;;;4460:13;;4439:18;;:34;4435:987;;;4510:37;4533:13;;4510:18;;:22;;:37;;;;:::i;:::-;4489:18;:58;;;;4628:18;4649:33;4663:18;;4649:9;:13;;:33;;;;:::i;:::-;4628:54;;4715:1;4701:10;:15;4697:627;;4755:67;4776:45;4814:6;:4;:6::i;:::-;4776:33;4790:18;;4776:9;:13;;:33;;;;:::i;:::-;:37;;:45;;;;:::i;:::-;4755:16;:20;;:67;;;;:::i;:::-;4736:86;;4856:9;;4840:12;;:25;;;;;;;;;;;4958:52;4979:30;5002:6;:4;:6::i;:::-;4979:18;;:22;;:30;;;;:::i;:::-;4958:16;:20;;:52;;;;:::i;:::-;4939:71;;4697:627;;;5164:9;;5148:12;;:25;;;;;;;;;;;5266:43;5287:21;5301:6;:4;:6::i;:::-;5287:9;:13;;:21;;;;:::i;:::-;5266:16;:20;;:43;;;;:::i;:::-;5247:62;;4697:627;4435:987;;;;5379:43;5400:21;5414:6;:4;:6::i;:::-;5400:9;:13;;:21;;;;:::i;:::-;5379:16;:20;;:43;;;;:::i;:::-;5360:62;;4435:987;5433:27;5463:32;5491:3;5463:23;5484:1;5463:16;:20;;:23;;;;:::i;:::-;:27;;:32;;;;:::i;:::-;5433:62;;5525:41;5546:19;5525:16;:20;;:41;;;;:::i;:::-;5506:60;;5596:42;5618:19;5596:17;;:21;;:42;;;;:::i;:::-;5576:17;:62;;;;5656:16;5649:23;;;;4191:1488;;;;:::o;614:213:18:-;756:64;795:11;808;756:38;:64::i;:::-;614:213;;:::o;470:138::-;566:35;:33;:35::i;:::-;470:138::o;2188:164:23:-;2238:4;2333:12;;2315:15;:30;2308:37;;2188:164;:::o;3713:272:21:-;3799:7;3830:1;3826;:5;3833:12;3818:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3856:9;3872:1;3868;:5;;;;;;3856:17;;3977:1;3970:8;;;3713:272;;;;;:::o;1746:187::-;1832:7;1864:1;1859;:6;;1867:12;1851:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1890:9;1906:1;1902;:5;1890:17;;1925:1;1918:8;;;1746:187;;;;;:::o;666:364:15:-;744:11;:9;:11::i;:::-;736:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;803:14;820:9;:22;830:11;820:22;;;;;;;;;;;;;;;;803:39;;869:1;860:6;:10;852:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;967:1;942:9;:22;952:11;942:22;;;;;;;;;;;;;;;:26;;;;978:6;;;;;;;;;;;:15;;;994:7;:5;:7::i;:::-;1003:11;1016:6;978:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;666:364;;:::o;5818:176:4:-;5953:4;5912:45;;:6;;;;;;;;;;;:11;;;5924;5937;5912:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:45;;;5903:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5818:176;;:::o;2385:255:19:-;2450:13;:11;:13::i;:::-;2446:156;;;2479:7;;;;;;;;;;;:13;;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2508:7;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2446:156;;;2568:7;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2446:156;2612:21;:19;:21::i;:::-;2385:255::o;2545:182:23:-;678:8;:6;:8::i;:::-;670:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2670:50:::1;2697:11;2710:9;2670:26;:50::i;:::-;2545:182:::0;;:::o;1591:229:15:-;1720:39;1747:11;1720:9;:22;1730:11;1720:22;;;;;;;;;;;;;;;;:26;;:39;;;;:::i;:::-;1695:9;:22;1705:11;1695:22;;;;;;;;;;;;;;;:64;;;;1769:44;1792:6;;;;;;;;;;;1801:11;1769:14;:44::i;:::-;1591:229;;:::o;2736:116:19:-;2797:7;;;;;;;;;;;:15;;;2821:9;2832:12;:10;:12::i;:::-;2797:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2736:116::o;1284:106:9:-;:::o;4707:384:4:-;4840:1;4817:25;;:11;:25;;;;4809:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4920:1;4907:9;:14;;4899:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4707:384;;:::o
Swarm Source
ipfs://aa0df5a7e4e9b22b28af4c6478103078ec6a41286e5cb5bed012a368c34189db
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.