Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 437 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw Funds | 12732853 | 1136 days ago | IN | 0 ETH | 0.00056032 | ||||
Redeem Tokens | 12723812 | 1138 days ago | IN | 0 ETH | 0.00145564 | ||||
Redeem Tokens | 12700865 | 1141 days ago | IN | 0 ETH | 0.00105455 | ||||
Swap | 12699947 | 1141 days ago | IN | 0.10279999 ETH | 0.00015431 | ||||
Swap | 12698088 | 1142 days ago | IN | 0.10279999 ETH | 0.00050256 | ||||
Redeem Tokens | 12697475 | 1142 days ago | IN | 0 ETH | 0.0015339 | ||||
Redeem Tokens | 12697330 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697323 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697323 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697323 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697323 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697319 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697319 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697319 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697319 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697319 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697319 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697319 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697319 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697319 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697319 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697319 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697319 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697319 | 1142 days ago | IN | 0 ETH | 0.00210911 | ||||
Redeem Tokens | 12697319 | 1142 days ago | IN | 0 ETH | 0.00210911 |
Loading...
Loading
Contract Name:
FixedSwap
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.7.6; import "./IERC20Detailed.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/utils/Pausable.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; import "./Whitelist.sol"; import "./libraries/TransferHelper.sol"; contract FixedSwap is Pausable, Whitelist { using SafeMath for uint256; uint256 increment = 0; mapping(uint256 => Purchase) public purchases; /* Purchasers mapping */ address[] public buyers; /* Current Buyers Addresses */ uint256[] public purchaseIds; /* All purchaseIds */ mapping(address => uint256[]) public myPurchases; /* Purchasers mapping */ IERC20 public erc20; bool public isSaleFunded = false; uint public decimals = 0; bool public unsoldTokensRedeemed = false; uint256 public tradeValue; /* Price in Wei */ uint256 public startDate; /* Start Date */ uint256 public endDate; /* End Date */ uint256 public individualMinimumAmount = 0; /* Minimum Amount Per Address */ uint256 public individualMaximumAmount = 0; /* Maximum Amount Per Address */ uint256 public minimumRaise = 0; /* Minimum Amount of Tokens that have to be sold */ uint256 public tokensAllocated = 0; /* Tokens Available for Allocation - Dynamic */ uint256 public tokensForSale = 0; /* Tokens Available for Sale */ bool public isTokenSwapAtomic; /* Make token release atomic or not */ address payable public feeAddress; /* Default Address for Fee Percentage */ uint256 public feePercentage = 1; /* Default Fee 1% */ bool private locked; struct Purchase { uint256 amount; address purchaser; uint256 ethAmount; uint256 timestamp; bool wasFinalized; /* Confirm the tokens were sent already */ bool reverted; /* Confirm the tokens were sent already */ } event PurchaseEvent( uint256 indexed purchaseId, uint256 amount, address indexed purchaser, uint256 ethAmount, uint256 timestamp, bool wasFinalized ); event FundEvent(address indexed funder, uint256 amount, address indexed contractAddress, uint256 timestamp); event RedeemTokenEvent( uint256 indexed purchaseId, uint256 amount, address indexed purchaser, uint256 ethAmount, bool wasFinalized, bool reverted ); constructor( address _tokenAddress, address payable _feeAddress, uint256 _tradeValue, uint256 _tokensForSale, uint256 _startDate, uint256 _endDate, uint256 _individualMinimumAmount, uint256 _individualMaximumAmount, bool _isTokenSwapAtomic, uint256 _minimumRaise, uint256 _feeAmount, bool _hasWhitelisting ) Whitelist(_hasWhitelisting) { /* Confirmations */ require(block.timestamp < _endDate, "End Date should be further than current date"); require(block.timestamp < _startDate, "Start Date should be further than current date"); require(_startDate < _endDate, "End Date higher than Start Date"); require(_tokensForSale > 0, "Tokens for Sale should be > 0"); require(_tokensForSale > _individualMinimumAmount, "Tokens for Sale should be > Individual Minimum Amount"); require(_individualMaximumAmount >= _individualMinimumAmount, "Individual Maximum Amount should be > Individual Minimum Amount"); require(_minimumRaise <= _tokensForSale, "Minimum Raise should be < Tokens For Sale"); require(_feeAmount >= feePercentage, "Fee Percentage has to be >= 1"); require(_feeAmount <= 99, "Fee Percentage has to be < 100"); require(_feeAddress != address(0), "Fee Address has to be not ZERO"); require(_tokenAddress != address(0), "Token Address has to be not ZERO"); startDate = _startDate; endDate = _endDate; tokensForSale = _tokensForSale; tradeValue = _tradeValue; individualMinimumAmount = _individualMinimumAmount; individualMaximumAmount = _individualMaximumAmount; isTokenSwapAtomic = _isTokenSwapAtomic; if (!_isTokenSwapAtomic) { /* If raise is not atomic swap */ minimumRaise = _minimumRaise; } erc20 = IERC20(_tokenAddress); decimals = IERC20Detailed(_tokenAddress).decimals(); feePercentage = _feeAmount; feeAddress = _feeAddress; } /** * Modifier to make a function callable only when the contract has Atomic Swaps not available. */ modifier isNotAtomicSwap() { require(!isTokenSwapAtomic, "Has to be non Atomic swap"); _; } /** * Modifier to make a function callable only when the contract has Atomic Swaps not available. */ modifier isSaleFinalized() { require(hasFinalized(), "Has to be finalized"); _; } /** * Modifier to make a function callable only when the swap time is open. */ modifier isSaleOpen() { require(isOpen(), "Has to be open"); _; } /** * Modifier to make a function callable only when the contract has Atomic Swaps not available. */ modifier isSalePreStarted() { require(isPreStart(), "Has to be pre-started"); _; } /** * Modifier to make a function callable only when the contract has Atomic Swaps not available. */ modifier isFunded() { require(isSaleFunded, "Has to be funded"); _; } /** * Modifier for block reentrancy */ modifier blockReentrancy { require(!locked, "Reentrancy is blocked"); locked = true; _; locked = false; } /* Get Functions */ function isBuyer(uint256 purchase_id) public view returns (bool) { return (msg.sender == purchases[purchase_id].purchaser); } /* Get Functions */ function totalRaiseCost() public view returns (uint256) { return (cost(tokensForSale)); } function availableTokens() public view returns (uint256) { return erc20.balanceOf(address(this)); } function tokensLeft() public view returns (uint256) { return tokensForSale - tokensAllocated; } function hasMinimumRaise() public view returns (bool) { return (minimumRaise != 0); } /* Verify if minimum raise was not achieved */ function minimumRaiseNotAchieved() public view returns (bool) { require(cost(tokensAllocated) < cost(minimumRaise), "TotalRaise is bigger than minimum raise amount"); return true; } /* Verify if minimum raise was achieved */ function minimumRaiseAchieved() public view returns (bool) { if (hasMinimumRaise()) { require(cost(tokensAllocated) >= cost(minimumRaise), "TotalRaise is less than minimum raise amount"); } return true; } function hasFinalized() public view returns (bool) { return block.timestamp > endDate; } function hasStarted() public view returns (bool) { return block.timestamp >= startDate; } function isPreStart() public view returns (bool) { return block.timestamp < startDate; } function isOpen() public view returns (bool) { return hasStarted() && !hasFinalized(); } function hasMinimumAmount() public view returns (bool) { return (individualMinimumAmount != 0); } function cost(uint256 _amount) public view returns (uint256) { return _amount.mul(tradeValue).div(10**decimals); } function getPurchase(uint256 _purchase_id) external view returns ( uint256, address, uint256, uint256, bool, bool ) { Purchase memory purchase = purchases[_purchase_id]; return (purchase.amount, purchase.purchaser, purchase.ethAmount, purchase.timestamp, purchase.wasFinalized, purchase.reverted); } function getPurchaseIds() public view returns (uint256[] memory) { return purchaseIds; } function getBuyers() public view returns (address[] memory) { return buyers; } function getMyPurchases(address _address) public view returns (uint256[] memory) { return myPurchases[_address]; } /* Fund - Pre Sale Start */ function fund(uint256 _amount) public isSalePreStarted { /* Confirm transferred tokens is no more than needed */ require(availableTokens().add(_amount) <= tokensForSale, "Transferred tokens have to be equal or less than proposed"); /* Transfer Funds */ TransferHelper.safeTransferFrom(address(erc20), msg.sender, address(this), _amount); /* If Amount is equal to needed - sale is ready */ if (availableTokens() == tokensForSale) { isSaleFunded = true; } emit FundEvent(msg.sender, _amount, address(this), block.timestamp); } /* Action Functions */ function swap(uint256 _amount) external payable whenNotPaused isFunded isSaleOpen onlyWhitelisted blockReentrancy { /* Confirm Amount is positive */ require(_amount > 0, "Amount has to be positive"); /* Confirm Amount is less than tokens available */ require(_amount <= tokensLeft(), "Amount is less than tokens available"); /* Confirm the user has funds for the transfer, confirm the value is equal */ require(msg.value == cost(_amount), "User swap amount has to equal to cost of token in ETH"); /* Confirm Amount is bigger than minimum Amount */ require(_amount >= individualMinimumAmount, "Amount is bigger than minimum amount"); /* Confirm Amount is smaller than maximum Amount */ require(_amount <= individualMaximumAmount, "Amount is smaller than maximum amount"); /* Verify all user purchases, loop thru them */ uint256[] memory _purchases = getMyPurchases(msg.sender); uint256 purchaserTotalAmountPurchased = 0; for (uint i = 0; i < _purchases.length; i++) { Purchase memory _purchase = purchases[_purchases[i]]; purchaserTotalAmountPurchased = purchaserTotalAmountPurchased.add(_purchase.amount); } require(purchaserTotalAmountPurchased.add(_amount) <= individualMaximumAmount, "Address has already passed the max amount of swap"); if (isTokenSwapAtomic) { /* Confirm transfer */ TransferHelper.safeTransfer(address(erc20), msg.sender, _amount); } uint256 purchase_id = increment; increment = increment.add(1); /* Create new purchase */ Purchase memory purchase = Purchase( _amount, msg.sender, msg.value, block.timestamp, isTokenSwapAtomic, /* If Atomic Swap */ false ); purchases[purchase_id] = purchase; purchaseIds.push(purchase_id); myPurchases[msg.sender].push(purchase_id); buyers.push(msg.sender); tokensAllocated = tokensAllocated.add(_amount); emit PurchaseEvent(purchase_id, _amount, msg.sender, msg.value, block.timestamp, isTokenSwapAtomic); } /* Redeem tokens when the sale was finalized */ function redeemTokens(uint256 purchase_id) external isNotAtomicSwap isSaleFinalized whenNotPaused blockReentrancy { /* Confirm it exists and was not finalized */ require((purchases[purchase_id].amount != 0) && !purchases[purchase_id].wasFinalized, "Purchase is either 0 or finalized"); require(isBuyer(purchase_id), "Address is not buyer"); purchases[purchase_id].wasFinalized = true; TransferHelper.safeTransfer(address(erc20), msg.sender, purchases[purchase_id].amount); emit RedeemTokenEvent(purchase_id, purchases[purchase_id].amount, msg.sender, 0, purchases[purchase_id].wasFinalized, false); } /* Retrieve Minimum Amount */ function redeemGivenMinimumGoalNotAchieved(uint256 purchase_id) external isSaleFinalized isNotAtomicSwap whenNotPaused blockReentrancy { require(hasMinimumRaise(), "Minimum raise has to exist"); require(minimumRaiseNotAchieved(), "Minimum raise has to be reached"); /* Confirm it exists and was not finalized */ require((purchases[purchase_id].amount != 0) && !purchases[purchase_id].wasFinalized, "Purchase is either 0 or finalized"); require(isBuyer(purchase_id), "Address is not buyer"); purchases[purchase_id].wasFinalized = true; purchases[purchase_id].reverted = true; msg.sender.transfer(purchases[purchase_id].ethAmount); emit RedeemTokenEvent( purchase_id, 0, msg.sender, purchases[purchase_id].ethAmount, purchases[purchase_id].wasFinalized, purchases[purchase_id].reverted ); } /* Admin Functions */ function withdrawFunds() external onlyOwner whenNotPaused isSaleFinalized { require(minimumRaiseAchieved(), "Minimum raise has to be reached"); uint256 fee = address(this).balance.mul(feePercentage).div(100); feeAddress.transfer(fee); /* Fee Address */ uint256 funds = address(this).balance; msg.sender.transfer(funds); } function withdrawUnsoldTokens() external onlyOwner isSaleFinalized { require(!unsoldTokensRedeemed); uint256 unsoldTokens; if (hasMinimumRaise() && (cost(tokensAllocated) < cost(minimumRaise))) { /* Minimum Raise not reached */ unsoldTokens = tokensForSale; } else { /* If minimum Raise Achieved Redeem All Tokens minus the ones */ unsoldTokens = tokensForSale.sub(tokensAllocated); } if (unsoldTokens > 0) { unsoldTokensRedeemed = true; TransferHelper.safeTransfer(address(erc20), msg.sender, unsoldTokens); } } function removeOtherERC20Tokens(address _tokenAddress, address _to) external onlyOwner isSaleFinalized { require(_tokenAddress != address(erc20), "Token Address has to be diff than the erc20 subject to sale"); // Confirm tokens addresses are different from main sale one IERC20Detailed erc20Token = IERC20Detailed(_tokenAddress); TransferHelper.safeTransfer(address(erc20Token), _to, erc20Token.balanceOf(address(this))); } function pause() external onlyOwner { _pause(); } /* Safe Pull function */ function safePull() external payable onlyOwner whenPaused { msg.sender.transfer(address(this).balance); TransferHelper.safeTransfer(address(erc20), msg.sender, erc20.balanceOf(address(this))); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.6; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IERC20Detailed is IERC20 { function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.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.6.0 <0.8.0; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.6; import "@openzeppelin/contracts/access/Ownable.sol"; contract Whitelist is Ownable { mapping(address => bool) public whitelist; address[] public whitelistedAddresses; bool public hasWhitelisting = false; event AddedToWhitelist(address[] accounts); event RemovedFromWhitelist(address indexed account); modifier onlyWhitelisted() { if (hasWhitelisting) { require(isWhitelisted(msg.sender), "Must be in the whitelist"); } _; } constructor(bool _hasWhitelisting) { hasWhitelisting = _hasWhitelisting; } function add(address[] memory _addresses) public onlyOwner { for (uint i = 0; i < _addresses.length; i++) { require(whitelist[_addresses[i]] != true); whitelist[_addresses[i]] = true; whitelistedAddresses.push(_addresses[i]); } emit AddedToWhitelist(_addresses); } function remove(address _address, uint256 _index) public onlyOwner { require(_address == whitelistedAddresses[_index]); whitelist[_address] = false; delete whitelistedAddresses[_index]; emit RemovedFromWhitelist(_address); } function getWhitelistedAddresses() public view returns (address[] memory) { return whitelistedAddresses; } function isWhitelisted(address _address) public view returns (bool) { return whitelist[_address]; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.6; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove(address token, address to, uint value) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED'); } function safeTransfer(address token, address to, uint value) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED'); } function safeTransferFrom(address token, address from, address to, uint value) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED'); } function safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../utils/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. */ abstract 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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual 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; } }
{ "optimizer": { "enabled": true, "runs": 999999 }, "evmVersion": "istanbul", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address payable","name":"_feeAddress","type":"address"},{"internalType":"uint256","name":"_tradeValue","type":"uint256"},{"internalType":"uint256","name":"_tokensForSale","type":"uint256"},{"internalType":"uint256","name":"_startDate","type":"uint256"},{"internalType":"uint256","name":"_endDate","type":"uint256"},{"internalType":"uint256","name":"_individualMinimumAmount","type":"uint256"},{"internalType":"uint256","name":"_individualMaximumAmount","type":"uint256"},{"internalType":"bool","name":"_isTokenSwapAtomic","type":"bool"},{"internalType":"uint256","name":"_minimumRaise","type":"uint256"},{"internalType":"uint256","name":"_feeAmount","type":"uint256"},{"internalType":"bool","name":"_hasWhitelisting","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"AddedToWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"funder","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"FundEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"purchaseId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"purchaser","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"bool","name":"wasFinalized","type":"bool"}],"name":"PurchaseEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"purchaseId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"purchaser","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"wasFinalized","type":"bool"},{"indexed":false,"internalType":"bool","name":"reverted","type":"bool"}],"name":"RedeemTokenEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"RemovedFromWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"buyers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc20","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"fund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBuyers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getMyPurchases","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_purchase_id","type":"uint256"}],"name":"getPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPurchaseIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistedAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasMinimumAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasMinimumRaise","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasWhitelisting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"individualMaximumAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"individualMinimumAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"purchase_id","type":"uint256"}],"name":"isBuyer","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":"isPreStart","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleFunded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTokenSwapAtomic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumRaise","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumRaiseAchieved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumRaiseNotAchieved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"myPurchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"purchaseIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"purchases","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"purchaser","type":"address"},{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"wasFinalized","type":"bool"},{"internalType":"bool","name":"reverted","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"purchase_id","type":"uint256"}],"name":"redeemGivenMinimumGoalNotAchieved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"purchase_id","type":"uint256"}],"name":"redeemTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"remove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"removeOtherERC20Tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safePull","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"startDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"swap","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"tokensAllocated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensForSale","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRaiseCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradeValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unsoldTokensRedeemed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistedAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawUnsoldTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526003805460ff19908116909155600060048190556009805460ff60a01b19169055600a819055600b8054909216909155600f81905560108190556011819055601281905560135560016015553480156200005d57600080fd5b506040516200440d3803806200440d83398181016040526101808110156200008457600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e08801516101008901516101208a01516101408b0151610160909b01516000805460ff191681559a9b999a989997989697959694959394929391928190620000ed620005a0565b60008054610100600160a81b0319166101006001600160a01b038416908102919091178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506003805460ff1916911515919091179055428711620001905760405162461bcd60e51b815260040180806020018281038252602c81526020018062004316602c913960400191505060405180910390fd5b874210620001d05760405162461bcd60e51b815260040180806020018281038252602e81526020018062004342602e913960400191505060405180910390fd5b86881062000225576040805162461bcd60e51b815260206004820152601f60248201527f456e64204461746520686967686572207468616e205374617274204461746500604482015290519081900360640190fd5b600089116200027b576040805162461bcd60e51b815260206004820152601d60248201527f546f6b656e7320666f722053616c652073686f756c64206265203e2030000000604482015290519081900360640190fd5b858911620002bb5760405162461bcd60e51b8152600401808060200182810382526035815260200180620043d86035913960400191505060405180910390fd5b85851015620002fc5760405162461bcd60e51b815260040180806020018281038252603f81526020018062004370603f913960400191505060405180910390fd5b888311156200033d5760405162461bcd60e51b8152600401808060200182810382526029815260200180620043af6029913960400191505060405180910390fd5b60155482101562000395576040805162461bcd60e51b815260206004820152601d60248201527f4665652050657263656e746167652068617320746f206265203e3d2031000000604482015290519081900360640190fd5b6063821115620003ec576040805162461bcd60e51b815260206004820152601e60248201527f4665652050657263656e746167652068617320746f206265203c203130300000604482015290519081900360640190fd5b6001600160a01b038b1662000448576040805162461bcd60e51b815260206004820152601e60248201527f46656520416464726573732068617320746f206265206e6f74205a45524f0000604482015290519081900360640190fd5b6001600160a01b038c16620004a4576040805162461bcd60e51b815260206004820181905260248201527f546f6b656e20416464726573732068617320746f206265206e6f74205a45524f604482015290519081900360640190fd5b600d889055600e8790556013899055600c8a9055600f86905560108590556014805460ff191685151517905583620004dc5760118390555b600980546001600160a01b0319166001600160a01b038e169081179091556040805163313ce56760e01b8152905163313ce56791600480820192602092909190829003018186803b1580156200053157600080fd5b505afa15801562000546573d6000803e3d6000fd5b505050506040513d60208110156200055d57600080fd5b505160ff16600a55506015555050601480546001600160a01b0390981661010002610100600160a81b03199098169790971790965550620005a495505050505050565b3390565b613d6280620005b46000396000f3fe60806040526004361061036b5760003560e01c8063785e9e86116101c6578063b367940e116100f7578063d65fb16011610095578063f2aa82181161006f578063f2aa821814610af5578063f2fde38b14610b1f578063f64bfaba14610b5f578063fecf415a14610b745761036b565b8063d65fb16014610aa1578063e4101de514610acb578063efbb34d514610ae05761036b565b8063c3ca324f116100d1578063c3ca324f14610972578063c4c1c94f146109b2578063c8bdbfb614610a62578063ca1d209d14610a775761036b565b8063b367940e1461091e578063ba4e5c4914610933578063c24a0f8b1461095d5761036b565b80639483841411610164578063a001ecdd1161013e578063a001ecdd14610884578063a6e158f814610899578063abe7f1ab146108c3578063b31f8f93146109095761036b565b8063948384141461081257806394b918de146108275780639b19251a146108445761036b565b80638da5cb5b116101a05780638da5cb5b146107765780638e75b1311461078b5780639097548d146107a0578063917c854d146107ca5761036b565b8063785e9e86146107225780638392fe31146107375780638456cb59146107615761036b565b80634089aa9a116102a057806369bb4dc21161023e57806370a898bc1161021857806370a898bc146106ce578063715018a6146106e357806374fa05fb146106f8578063755e3e281461070d5761036b565b806369bb4dc21461063f5780636a93df11146106545780636d028027146106b95761036b565b806347535d7b1161027a57806347535d7b146105ba5780635ac699bb146105cf5780635c975abb146106155780636295a2f41461062a5761036b565b80634089aa9a14610552578063412753581461056757806344691f7e146105a55761036b565b806324600fc31161030d5780632ebb5c1e116102e75780632ebb5c1e14610472578063313ce567146104875780633742a9f71461049c5780633af32abf146105125761036b565b806324600fc3146104405780632daa8c84146104555780632e1541071461045d5761036b565b806315b578661161034957806315b57866146103d5578063161a7b2a146103ea5780631de18af7146103ff57806321d3002a1461042b5761036b565b806307662345146103705780630b97bc861461039957806312aef8c3146103c0575b600080fd5b34801561037c57600080fd5b50610385610b9e565b604080519115158252519081900360200190f35b3480156103a557600080fd5b506103ae610ba7565b60408051918252519081900360200190f35b3480156103cc57600080fd5b506103ae610bad565b3480156103e157600080fd5b50610385610bb3565b3480156103f657600080fd5b50610385610bbb565b34801561040b57600080fd5b506104296004803603602081101561042257600080fd5b5035610bdc565b005b34801561043757600080fd5b506103856110dd565b34801561044c57600080fd5b506104296110e6565b61042961138c565b34801561046957600080fd5b506103ae61157d565b34801561047e57600080fd5b50610385611583565b34801561049357600080fd5b506103ae61158b565b3480156104a857600080fd5b506104c6600480360360208110156104bf57600080fd5b5035611591565b6040805196875273ffffffffffffffffffffffffffffffffffffffff909516602087015285850193909352606085019190915215156080840152151560a0830152519081900360c00190f35b34801561051e57600080fd5b506103856004803603602081101561053557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611617565b34801561055e57600080fd5b50610385611642565b34801561057357600080fd5b5061057c61164a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156105b157600080fd5b5061038561166b565b3480156105c657600080fd5b50610385611674565b3480156105db57600080fd5b506103ae600480360360408110156105f257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611694565b34801561062157600080fd5b506103856116c5565b34801561063657600080fd5b506103ae6116ce565b34801561064b57600080fd5b506103ae6116d4565b34801561066057600080fd5b50610669611776565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106a557818101518382015260200161068d565b505050509050019250505060405180910390f35b3480156106c557600080fd5b506106696117ce565b3480156106da57600080fd5b5061038561183c565b3480156106ef57600080fd5b50610429611844565b34801561070457600080fd5b5061038561195f565b34801561071957600080fd5b506103ae6119d3565b34801561072e57600080fd5b5061057c6119d9565b34801561074357600080fd5b506104c66004803603602081101561075a57600080fd5b50356119f5565b34801561076d57600080fd5b50610429611a47565b34801561078257600080fd5b5061057c611af7565b34801561079757600080fd5b506103ae611b18565b3480156107ac57600080fd5b506103ae600480360360208110156107c357600080fd5b5035611b1e565b3480156107d657600080fd5b50610429600480360360408110156107ed57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611b44565b34801561081e57600080fd5b50610385611d44565b6104296004803603602081101561083d57600080fd5b5035611d4d565b34801561085057600080fd5b506103856004803603602081101561086757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612542565b34801561089057600080fd5b506103ae612557565b3480156108a557600080fd5b50610429600480360360208110156108bc57600080fd5b503561255d565b3480156108cf57600080fd5b50610429600480360360408110156108e657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561293f565b34801561091557600080fd5b506103ae612aef565b34801561092a57600080fd5b50610385612af9565b34801561093f57600080fd5b5061057c6004803603602081101561095657600080fd5b5035612b75565b34801561096957600080fd5b506103ae612bac565b34801561097e57600080fd5b506106696004803603602081101561099557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612bb2565b3480156109be57600080fd5b50610429600480360360208110156109d557600080fd5b8101906020810181356401000000008111156109f057600080fd5b820183602082011115610a0257600080fd5b80359060200191846020830284011164010000000083111715610a2457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612c2b945050505050565b348015610a6e57600080fd5b50610429612e8d565b348015610a8357600080fd5b5061042960048036036020811015610a9a57600080fd5b5035613059565b348015610aad57600080fd5b506103ae60048036036020811015610ac457600080fd5b50356131ef565b348015610ad757600080fd5b506103ae613210565b348015610aec57600080fd5b506103ae613216565b348015610b0157600080fd5b5061057c60048036036020811015610b1857600080fd5b5035613223565b348015610b2b57600080fd5b5061042960048036036020811015610b4257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613233565b348015610b6b57600080fd5b506106696133de565b348015610b8057600080fd5b5061038560048036036020811015610b9757600080fd5b503561344b565b60035460ff1681565b600d5481565b60135481565b601154151590565b60095474010000000000000000000000000000000000000000900460ff1681565b610be4611642565b610c4f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f48617320746f2062652066696e616c697a656400000000000000000000000000604482015290519081900360640190fd5b60145460ff1615610cc157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f48617320746f206265206e6f6e2041746f6d6963207377617000000000000000604482015290519081900360640190fd5b610cc96116c5565b15610d3557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b60165460ff1615610da757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5265656e7472616e637920697320626c6f636b65640000000000000000000000604482015290519081900360640190fd5b601680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610dda610bb3565b610e4557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d696e696d756d2072616973652068617320746f206578697374000000000000604482015290519081900360640190fd5b610e4d61195f565b610eb857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d2072616973652068617320746f206265207265616368656400604482015290519081900360640190fd5b60008181526005602052604090205415801590610ee7575060008181526005602052604090206004015460ff16155b610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613b746021913960400191505060405180910390fd5b610f458161344b565b610fb057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f41646472657373206973206e6f74206275796572000000000000000000000000604482015290519081900360640190fd5b6000818152600560205260408082206004810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090911660011716610100179055600201549051339282156108fc02929190818181858888f19350505050158015611042573d6000803e3d6000fd5b506000818152600560209081526040808320600281015460049091015482519485529284015260ff8083161515848301526101009092049091161515606083015251339183917f7c3945978cb75c169561aae1b0e277519de5c4d2ae65a5b8844f8c27710e5bc89181900360800190a350601680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60145460ff1681565b6110ee613478565b73ffffffffffffffffffffffffffffffffffffffff1661110c611af7565b73ffffffffffffffffffffffffffffffffffffffff161461118e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6111966116c5565b1561120257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b61120a611642565b61127557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f48617320746f2062652066696e616c697a656400000000000000000000000000604482015290519081900360640190fd5b61127d612af9565b6112e857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d2072616973652068617320746f206265207265616368656400604482015290519081900360640190fd5b600061130a60646113046015544761347c90919063ffffffff16565b906134f6565b601454604051919250610100900473ffffffffffffffffffffffffffffffffffffffff16906108fc8315029083906000818181858888f19350505050158015611357573d6000803e3d6000fd5b506040514790339082156108fc029083906000818181858888f19350505050158015611387573d6000803e3d6000fd5b505050565b611394613478565b73ffffffffffffffffffffffffffffffffffffffff166113b2611af7565b73ffffffffffffffffffffffffffffffffffffffff161461143457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61143c6116c5565b6114a757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b60405133904780156108fc02916000818181858888f193505050501580156114d3573d6000803e3d6000fd5b50600954604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905161157b9273ffffffffffffffffffffffffffffffffffffffff1691339183916370a08231916024808301926020929190829003018186803b15801561154a57600080fd5b505afa15801561155e573d6000803e3d6000fd5b505050506040513d602081101561157457600080fd5b5051613577565b565b600f5481565b600d54421090565b600a5481565b600090815260056020908152604091829020825160c0810184528154808252600183015473ffffffffffffffffffffffffffffffffffffffff16938201849052600283015494820185905260038301546060830181905260049093015460ff80821615156080850181905261010090920416151560a09093018390529095939493909190565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b600e54421190565b601454610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5442101590565b600061167e61166b565b801561168f575061168d611642565b155b905090565b600860205281600052604060002081815481106116b057600080fd5b90600052602060002001600091509150505481565b60005460ff1690565b600c5481565b600954604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561174557600080fd5b505afa158015611759573d6000803e3d6000fd5b505050506040513d602081101561176f57600080fd5b5051905090565b606060078054806020026020016040519081016040528092919081815260200182805480156117c457602002820191906000526020600020905b8154815260200190600101908083116117b0575b5050505050905090565b606060028054806020026020016040519081016040528092919081815260200182805480156117c457602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611808575050505050905090565b600f54151590565b61184c613478565b73ffffffffffffffffffffffffffffffffffffffff1661186a611af7565b73ffffffffffffffffffffffffffffffffffffffff16146118ec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405161010090910473ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffff0000000000000000000000000000000000000000ff169055565b600061196c601154611b1e565b611977601254611b1e565b106119cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613bdf602e913960400191505060405180910390fd5b50600190565b60125481565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60056020526000908152604090208054600182015460028301546003840154600490940154929373ffffffffffffffffffffffffffffffffffffffff9092169290919060ff8082169161010090041686565b611a4f613478565b73ffffffffffffffffffffffffffffffffffffffff16611a6d611af7565b73ffffffffffffffffffffffffffffffffffffffff1614611aef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61157b613753565b600054610100900473ffffffffffffffffffffffffffffffffffffffff1690565b60115481565b6000611b3e600a54600a0a611304600c548561347c90919063ffffffff16565b92915050565b611b4c613478565b73ffffffffffffffffffffffffffffffffffffffff16611b6a611af7565b73ffffffffffffffffffffffffffffffffffffffff1614611bec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b611bf4611642565b611c5f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f48617320746f2062652066696e616c697a656400000000000000000000000000604482015290519081900360640190fd5b60095473ffffffffffffffffffffffffffffffffffffffff83811691161415611cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180613b39603b913960400191505060405180910390fd5b600082905061138781838373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561154a57600080fd5b600b5460ff1681565b611d556116c5565b15611dc157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b60095474010000000000000000000000000000000000000000900460ff16611e4a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f48617320746f2062652066756e64656400000000000000000000000000000000604482015290519081900360640190fd5b611e52611674565b611ebd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f48617320746f206265206f70656e000000000000000000000000000000000000604482015290519081900360640190fd5b60035460ff1615611f3c57611ed133611617565b611f3c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4d75737420626520696e207468652077686974656c6973740000000000000000604482015290519081900360640190fd5b60165460ff1615611fae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5265656e7472616e637920697320626c6f636b65640000000000000000000000604482015290519081900360640190fd5b601680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558061204557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f416d6f756e742068617320746f20626520706f73697469766500000000000000604482015290519081900360640190fd5b61204d612aef565b8111156120a5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613bbb6024913960400191505060405180910390fd5b6120ae81611b1e565b3414612105576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180613c7f6035913960400191505060405180910390fd5b600f54811015612160576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613ce56024913960400191505060405180910390fd5b6010548111156121bb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613c0d6025913960400191505060405180910390fd5b60006121c633612bb2565b90506000805b825181101561227f576000600560008584815181106121e757fe5b6020908102919091018101518252818101929092526040908101600020815160c0810183528154808252600183015473ffffffffffffffffffffffffffffffffffffffff1694820194909452600282015492810192909252600381015460608301526004015460ff8082161515608084015261010090910416151560a08201529150612274908490613845565b9250506001016121cc565b5060105461228d8285613845565b11156122e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180613cb46031913960400191505060405180910390fd5b60145460ff1615612313576009546123139073ffffffffffffffffffffffffffffffffffffffff163385613577565b600454612321816001613845565b60049081556040805160c08101825286815233602080830182815234848601908152426060860190815260145460ff16151560808701908152600060a088018181528b8252600587528982208951815595516001878101805473ffffffffffffffffffffffffffffffffffffffff939093167fffffffffffffffffffffffff00000000000000000000000000000000000000009384161790559551600288015593516003870155915194909901805491511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9515157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179490941617909255600780548083019091557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880188905583875260088352948620805480870182559087529186209091018690556006805494850181559094527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90920180549093169091179091556012546124c09086613845565b60125560145460408051878152346020820152428183015260ff9092161515606083015251339184917f7406b2b33fdc3ea03b90417f4a39d6eb6753239c4bff86e09737ce5ca3281a1b9181900360800190a35050601680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055505050565b60016020526000908152604090205460ff1681565b60155481565b60145460ff16156125cf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f48617320746f206265206e6f6e2041746f6d6963207377617000000000000000604482015290519081900360640190fd5b6125d7611642565b61264257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f48617320746f2062652066696e616c697a656400000000000000000000000000604482015290519081900360640190fd5b61264a6116c5565b156126b657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b60165460ff161561272857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5265656e7472616e637920697320626c6f636b65640000000000000000000000604482015290519081900360640190fd5b601680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560008181526005602052604090205415801590612782575060008181526005602052604090206004015460ff16155b6127d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613b746021913960400191505060405180910390fd5b6127e08161344b565b61284b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f41646472657373206973206e6f74206275796572000000000000000000000000604482015290519081900360640190fd5b60008181526005602052604090206004810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560095490546128ad9173ffffffffffffffffffffffffffffffffffffffff16903390613577565b60008181526005602090815260408083208054600490910154825191825292810184905260ff90921615158282015260608201929092529051339183917f7c3945978cb75c169561aae1b0e277519de5c4d2ae65a5b8844f8c27710e5bc89181900360800190a350601680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b612947613478565b73ffffffffffffffffffffffffffffffffffffffff16612965611af7565b73ffffffffffffffffffffffffffffffffffffffff16146129e757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600281815481106129f457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff838116911614612a2457600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556002805482908110612a7d57fe5b6000918252602082200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905560405173ffffffffffffffffffffffffffffffffffffffff8416917fcdd2e9b91a56913d370075169cefa1602ba36be5301664f752192bb1709df75791a25050565b6012546013540390565b6000612b03610bb3565b156119cd57612b13601154611b1e565b612b1e601254611b1e565b10156119cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613c32602c913960400191505060405180910390fd5b60028181548110612b8557600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600e5481565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260086020908152604091829020805483518184028101840190945280845260609392830182828015612c1f57602002820191906000526020600020905b815481526020019060010190808311612c0b575b50505050509050919050565b612c33613478565b73ffffffffffffffffffffffffffffffffffffffff16612c51611af7565b73ffffffffffffffffffffffffffffffffffffffff1614612cd357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60005b8151811015612e145760016000838381518110612cef57fe5b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040016000205460ff16151560011415612d3257600080fd5b6001806000848481518110612d4357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506002828281518110612daa57fe5b60209081029190910181015182546001808201855560009485529290932090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915501612cd6565b507fe3c5086a518f78e8aa61952bb9c28a9a0f0022707e537ea961faa918e0d89f6f816040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015612e77578181015183820152602001612e5f565b505050509050019250505060405180910390a150565b612e95613478565b73ffffffffffffffffffffffffffffffffffffffff16612eb3611af7565b73ffffffffffffffffffffffffffffffffffffffff1614612f3557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b612f3d611642565b612fa857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f48617320746f2062652066696e616c697a656400000000000000000000000000604482015290519081900360640190fd5b600b5460ff1615612fb857600080fd5b6000612fc2610bb3565b8015612fe15750612fd4601154611b1e565b612fdf601254611b1e565b105b15612fef5750601354613001565b601254601354612ffe916138b9565b90505b801561305657600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556009546130569073ffffffffffffffffffffffffffffffffffffffff163383613577565b50565b613061611583565b6130cc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f48617320746f206265207072652d737461727465640000000000000000000000604482015290519081900360640190fd5b6013546130e1826130db6116d4565b90613845565b1115613138576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180613b006039913960400191505060405180910390fd5b60095461315d9073ffffffffffffffffffffffffffffffffffffffff16333084613930565b6013546131686116d4565b14156131ae57600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790555b604080518281524260208201528151309233927ffa9e9c1eea421f377d2d3a349fc808d3333930f6ad9854b63661e75f98687f36929081900390910190a350565b600781815481106131ff57600080fd5b600091825260209091200154905081565b60105481565b600061168f601354611b1e565b60068181548110612b8557600080fd5b61323b613478565b73ffffffffffffffffffffffffffffffffffffffff16613259611af7565b73ffffffffffffffffffffffffffffffffffffffff16146132db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116613347576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613b956026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff8085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b606060068054806020026020016040519081016040528092919081815260200182805480156117c45760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611808575050505050905090565b60009081526005602052604090206001015473ffffffffffffffffffffffffffffffffffffffff16331490565b3390565b60008261348b57506000611b3e565b8282028284828161349857fe5b04146134ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613c5e6021913960400191505060405180910390fd5b9392505050565b600080821161356657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161356f57fe5b049392505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251825160009485949389169392918291908083835b6020831061364c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161360f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146136ae576040519150601f19603f3d011682016040523d82523d6000602084013e6136b3565b606091505b50915091508180156136e15750805115806136e157508080602001905160208110156136de57600080fd5b50515b61374c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b61375b6116c5565b156137c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861381b613478565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190a1565b6000828201838110156134ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008282111561392a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000178152925182516000948594938a169392918291908083835b60208310613a0d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016139d0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613a6f576040519150601f19603f3d011682016040523d82523d6000602084013e613a74565b606091505b5091509150818015613aa2575080511580613aa25750808060200190516020811015613a9f57600080fd5b50515b613af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613d096024913960400191505060405180910390fd5b50505050505056fe5472616e7366657272656420746f6b656e73206861766520746f20626520657175616c206f72206c657373207468616e2070726f706f736564546f6b656e20416464726573732068617320746f2062652064696666207468616e20746865206572633230207375626a65637420746f2073616c655075726368617365206973206569746865722030206f722066696e616c697a65644f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416d6f756e74206973206c657373207468616e20746f6b656e7320617661696c61626c65546f74616c526169736520697320626967676572207468616e206d696e696d756d20726169736520616d6f756e74416d6f756e7420697320736d616c6c6572207468616e206d6178696d756d20616d6f756e74546f74616c5261697365206973206c657373207468616e206d696e696d756d20726169736520616d6f756e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7755736572207377617020616d6f756e742068617320746f20657175616c20746f20636f7374206f6620746f6b656e20696e20455448416464726573732068617320616c72656164792070617373656420746865206d617820616d6f756e74206f662073776170416d6f756e7420697320626967676572207468616e206d696e696d756d20616d6f756e745472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a26469706673582212209fabef5d68581d0f7dcb12436ecb40a22584debd5c719141224e9f2db604601164736f6c63430007060033456e6420446174652073686f756c642062652066757274686572207468616e2063757272656e742064617465537461727420446174652073686f756c642062652066757274686572207468616e2063757272656e742064617465496e646976696475616c204d6178696d756d20416d6f756e742073686f756c64206265203e20496e646976696475616c204d696e696d756d20416d6f756e744d696e696d756d2052616973652073686f756c64206265203c20546f6b656e7320466f722053616c65546f6b656e7320666f722053616c652073686f756c64206265203e20496e646976696475616c204d696e696d756d20416d6f756e740000000000000000000000002078ed916728b62115eb33e4b99b3273ced7223b000000000000000000000000983aa003512077bd7d3ea9212fffd8fb7a378e9a0000000000000000000000000000000000000000000000000000021aaed9179c0000000000000000000000000000000000000000000583b8b02231b86c6800000000000000000000000000000000000000000000000000000000000060d481d00000000000000000000000000000000000000000000000000000000060d48fe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000968afb80024198e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002dc36699d6d96b5c0000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x60806040526004361061036b5760003560e01c8063785e9e86116101c6578063b367940e116100f7578063d65fb16011610095578063f2aa82181161006f578063f2aa821814610af5578063f2fde38b14610b1f578063f64bfaba14610b5f578063fecf415a14610b745761036b565b8063d65fb16014610aa1578063e4101de514610acb578063efbb34d514610ae05761036b565b8063c3ca324f116100d1578063c3ca324f14610972578063c4c1c94f146109b2578063c8bdbfb614610a62578063ca1d209d14610a775761036b565b8063b367940e1461091e578063ba4e5c4914610933578063c24a0f8b1461095d5761036b565b80639483841411610164578063a001ecdd1161013e578063a001ecdd14610884578063a6e158f814610899578063abe7f1ab146108c3578063b31f8f93146109095761036b565b8063948384141461081257806394b918de146108275780639b19251a146108445761036b565b80638da5cb5b116101a05780638da5cb5b146107765780638e75b1311461078b5780639097548d146107a0578063917c854d146107ca5761036b565b8063785e9e86146107225780638392fe31146107375780638456cb59146107615761036b565b80634089aa9a116102a057806369bb4dc21161023e57806370a898bc1161021857806370a898bc146106ce578063715018a6146106e357806374fa05fb146106f8578063755e3e281461070d5761036b565b806369bb4dc21461063f5780636a93df11146106545780636d028027146106b95761036b565b806347535d7b1161027a57806347535d7b146105ba5780635ac699bb146105cf5780635c975abb146106155780636295a2f41461062a5761036b565b80634089aa9a14610552578063412753581461056757806344691f7e146105a55761036b565b806324600fc31161030d5780632ebb5c1e116102e75780632ebb5c1e14610472578063313ce567146104875780633742a9f71461049c5780633af32abf146105125761036b565b806324600fc3146104405780632daa8c84146104555780632e1541071461045d5761036b565b806315b578661161034957806315b57866146103d5578063161a7b2a146103ea5780631de18af7146103ff57806321d3002a1461042b5761036b565b806307662345146103705780630b97bc861461039957806312aef8c3146103c0575b600080fd5b34801561037c57600080fd5b50610385610b9e565b604080519115158252519081900360200190f35b3480156103a557600080fd5b506103ae610ba7565b60408051918252519081900360200190f35b3480156103cc57600080fd5b506103ae610bad565b3480156103e157600080fd5b50610385610bb3565b3480156103f657600080fd5b50610385610bbb565b34801561040b57600080fd5b506104296004803603602081101561042257600080fd5b5035610bdc565b005b34801561043757600080fd5b506103856110dd565b34801561044c57600080fd5b506104296110e6565b61042961138c565b34801561046957600080fd5b506103ae61157d565b34801561047e57600080fd5b50610385611583565b34801561049357600080fd5b506103ae61158b565b3480156104a857600080fd5b506104c6600480360360208110156104bf57600080fd5b5035611591565b6040805196875273ffffffffffffffffffffffffffffffffffffffff909516602087015285850193909352606085019190915215156080840152151560a0830152519081900360c00190f35b34801561051e57600080fd5b506103856004803603602081101561053557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611617565b34801561055e57600080fd5b50610385611642565b34801561057357600080fd5b5061057c61164a565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156105b157600080fd5b5061038561166b565b3480156105c657600080fd5b50610385611674565b3480156105db57600080fd5b506103ae600480360360408110156105f257600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611694565b34801561062157600080fd5b506103856116c5565b34801561063657600080fd5b506103ae6116ce565b34801561064b57600080fd5b506103ae6116d4565b34801561066057600080fd5b50610669611776565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156106a557818101518382015260200161068d565b505050509050019250505060405180910390f35b3480156106c557600080fd5b506106696117ce565b3480156106da57600080fd5b5061038561183c565b3480156106ef57600080fd5b50610429611844565b34801561070457600080fd5b5061038561195f565b34801561071957600080fd5b506103ae6119d3565b34801561072e57600080fd5b5061057c6119d9565b34801561074357600080fd5b506104c66004803603602081101561075a57600080fd5b50356119f5565b34801561076d57600080fd5b50610429611a47565b34801561078257600080fd5b5061057c611af7565b34801561079757600080fd5b506103ae611b18565b3480156107ac57600080fd5b506103ae600480360360208110156107c357600080fd5b5035611b1e565b3480156107d657600080fd5b50610429600480360360408110156107ed57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516611b44565b34801561081e57600080fd5b50610385611d44565b6104296004803603602081101561083d57600080fd5b5035611d4d565b34801561085057600080fd5b506103856004803603602081101561086757600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612542565b34801561089057600080fd5b506103ae612557565b3480156108a557600080fd5b50610429600480360360208110156108bc57600080fd5b503561255d565b3480156108cf57600080fd5b50610429600480360360408110156108e657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561293f565b34801561091557600080fd5b506103ae612aef565b34801561092a57600080fd5b50610385612af9565b34801561093f57600080fd5b5061057c6004803603602081101561095657600080fd5b5035612b75565b34801561096957600080fd5b506103ae612bac565b34801561097e57600080fd5b506106696004803603602081101561099557600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16612bb2565b3480156109be57600080fd5b50610429600480360360208110156109d557600080fd5b8101906020810181356401000000008111156109f057600080fd5b820183602082011115610a0257600080fd5b80359060200191846020830284011164010000000083111715610a2457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612c2b945050505050565b348015610a6e57600080fd5b50610429612e8d565b348015610a8357600080fd5b5061042960048036036020811015610a9a57600080fd5b5035613059565b348015610aad57600080fd5b506103ae60048036036020811015610ac457600080fd5b50356131ef565b348015610ad757600080fd5b506103ae613210565b348015610aec57600080fd5b506103ae613216565b348015610b0157600080fd5b5061057c60048036036020811015610b1857600080fd5b5035613223565b348015610b2b57600080fd5b5061042960048036036020811015610b4257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16613233565b348015610b6b57600080fd5b506106696133de565b348015610b8057600080fd5b5061038560048036036020811015610b9757600080fd5b503561344b565b60035460ff1681565b600d5481565b60135481565b601154151590565b60095474010000000000000000000000000000000000000000900460ff1681565b610be4611642565b610c4f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f48617320746f2062652066696e616c697a656400000000000000000000000000604482015290519081900360640190fd5b60145460ff1615610cc157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f48617320746f206265206e6f6e2041746f6d6963207377617000000000000000604482015290519081900360640190fd5b610cc96116c5565b15610d3557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b60165460ff1615610da757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5265656e7472616e637920697320626c6f636b65640000000000000000000000604482015290519081900360640190fd5b601680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055610dda610bb3565b610e4557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4d696e696d756d2072616973652068617320746f206578697374000000000000604482015290519081900360640190fd5b610e4d61195f565b610eb857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d2072616973652068617320746f206265207265616368656400604482015290519081900360640190fd5b60008181526005602052604090205415801590610ee7575060008181526005602052604090206004015460ff16155b610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613b746021913960400191505060405180910390fd5b610f458161344b565b610fb057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f41646472657373206973206e6f74206275796572000000000000000000000000604482015290519081900360640190fd5b6000818152600560205260408082206004810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090911660011716610100179055600201549051339282156108fc02929190818181858888f19350505050158015611042573d6000803e3d6000fd5b506000818152600560209081526040808320600281015460049091015482519485529284015260ff8083161515848301526101009092049091161515606083015251339183917f7c3945978cb75c169561aae1b0e277519de5c4d2ae65a5b8844f8c27710e5bc89181900360800190a350601680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b60145460ff1681565b6110ee613478565b73ffffffffffffffffffffffffffffffffffffffff1661110c611af7565b73ffffffffffffffffffffffffffffffffffffffff161461118e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6111966116c5565b1561120257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b61120a611642565b61127557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f48617320746f2062652066696e616c697a656400000000000000000000000000604482015290519081900360640190fd5b61127d612af9565b6112e857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d696e696d756d2072616973652068617320746f206265207265616368656400604482015290519081900360640190fd5b600061130a60646113046015544761347c90919063ffffffff16565b906134f6565b601454604051919250610100900473ffffffffffffffffffffffffffffffffffffffff16906108fc8315029083906000818181858888f19350505050158015611357573d6000803e3d6000fd5b506040514790339082156108fc029083906000818181858888f19350505050158015611387573d6000803e3d6000fd5b505050565b611394613478565b73ffffffffffffffffffffffffffffffffffffffff166113b2611af7565b73ffffffffffffffffffffffffffffffffffffffff161461143457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61143c6116c5565b6114a757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b60405133904780156108fc02916000818181858888f193505050501580156114d3573d6000803e3d6000fd5b50600954604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905161157b9273ffffffffffffffffffffffffffffffffffffffff1691339183916370a08231916024808301926020929190829003018186803b15801561154a57600080fd5b505afa15801561155e573d6000803e3d6000fd5b505050506040513d602081101561157457600080fd5b5051613577565b565b600f5481565b600d54421090565b600a5481565b600090815260056020908152604091829020825160c0810184528154808252600183015473ffffffffffffffffffffffffffffffffffffffff16938201849052600283015494820185905260038301546060830181905260049093015460ff80821615156080850181905261010090920416151560a09093018390529095939493909190565b73ffffffffffffffffffffffffffffffffffffffff1660009081526001602052604090205460ff1690565b600e54421190565b601454610100900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5442101590565b600061167e61166b565b801561168f575061168d611642565b155b905090565b600860205281600052604060002081815481106116b057600080fd5b90600052602060002001600091509150505481565b60005460ff1690565b600c5481565b600954604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b15801561174557600080fd5b505afa158015611759573d6000803e3d6000fd5b505050506040513d602081101561176f57600080fd5b5051905090565b606060078054806020026020016040519081016040528092919081815260200182805480156117c457602002820191906000526020600020905b8154815260200190600101908083116117b0575b5050505050905090565b606060028054806020026020016040519081016040528092919081815260200182805480156117c457602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611808575050505050905090565b600f54151590565b61184c613478565b73ffffffffffffffffffffffffffffffffffffffff1661186a611af7565b73ffffffffffffffffffffffffffffffffffffffff16146118ec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405161010090910473ffffffffffffffffffffffffffffffffffffffff16907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffff0000000000000000000000000000000000000000ff169055565b600061196c601154611b1e565b611977601254611b1e565b106119cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613bdf602e913960400191505060405180910390fd5b50600190565b60125481565b60095473ffffffffffffffffffffffffffffffffffffffff1681565b60056020526000908152604090208054600182015460028301546003840154600490940154929373ffffffffffffffffffffffffffffffffffffffff9092169290919060ff8082169161010090041686565b611a4f613478565b73ffffffffffffffffffffffffffffffffffffffff16611a6d611af7565b73ffffffffffffffffffffffffffffffffffffffff1614611aef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61157b613753565b600054610100900473ffffffffffffffffffffffffffffffffffffffff1690565b60115481565b6000611b3e600a54600a0a611304600c548561347c90919063ffffffff16565b92915050565b611b4c613478565b73ffffffffffffffffffffffffffffffffffffffff16611b6a611af7565b73ffffffffffffffffffffffffffffffffffffffff1614611bec57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b611bf4611642565b611c5f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f48617320746f2062652066696e616c697a656400000000000000000000000000604482015290519081900360640190fd5b60095473ffffffffffffffffffffffffffffffffffffffff83811691161415611cd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180613b39603b913960400191505060405180910390fd5b600082905061138781838373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561154a57600080fd5b600b5460ff1681565b611d556116c5565b15611dc157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b60095474010000000000000000000000000000000000000000900460ff16611e4a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f48617320746f2062652066756e64656400000000000000000000000000000000604482015290519081900360640190fd5b611e52611674565b611ebd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f48617320746f206265206f70656e000000000000000000000000000000000000604482015290519081900360640190fd5b60035460ff1615611f3c57611ed133611617565b611f3c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4d75737420626520696e207468652077686974656c6973740000000000000000604482015290519081900360640190fd5b60165460ff1615611fae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5265656e7472616e637920697320626c6f636b65640000000000000000000000604482015290519081900360640190fd5b601680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558061204557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f416d6f756e742068617320746f20626520706f73697469766500000000000000604482015290519081900360640190fd5b61204d612aef565b8111156120a5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613bbb6024913960400191505060405180910390fd5b6120ae81611b1e565b3414612105576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526035815260200180613c7f6035913960400191505060405180910390fd5b600f54811015612160576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613ce56024913960400191505060405180910390fd5b6010548111156121bb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613c0d6025913960400191505060405180910390fd5b60006121c633612bb2565b90506000805b825181101561227f576000600560008584815181106121e757fe5b6020908102919091018101518252818101929092526040908101600020815160c0810183528154808252600183015473ffffffffffffffffffffffffffffffffffffffff1694820194909452600282015492810192909252600381015460608301526004015460ff8082161515608084015261010090910416151560a08201529150612274908490613845565b9250506001016121cc565b5060105461228d8285613845565b11156122e4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526031815260200180613cb46031913960400191505060405180910390fd5b60145460ff1615612313576009546123139073ffffffffffffffffffffffffffffffffffffffff163385613577565b600454612321816001613845565b60049081556040805160c08101825286815233602080830182815234848601908152426060860190815260145460ff16151560808701908152600060a088018181528b8252600587528982208951815595516001878101805473ffffffffffffffffffffffffffffffffffffffff939093167fffffffffffffffffffffffff00000000000000000000000000000000000000009384161790559551600288015593516003870155915194909901805491511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff9515157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00909316929092179490941617909255600780548083019091557fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6880188905583875260088352948620805480870182559087529186209091018690556006805494850181559094527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f90920180549093169091179091556012546124c09086613845565b60125560145460408051878152346020820152428183015260ff9092161515606083015251339184917f7406b2b33fdc3ea03b90417f4a39d6eb6753239c4bff86e09737ce5ca3281a1b9181900360800190a35050601680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055505050565b60016020526000908152604090205460ff1681565b60155481565b60145460ff16156125cf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f48617320746f206265206e6f6e2041746f6d6963207377617000000000000000604482015290519081900360640190fd5b6125d7611642565b61264257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f48617320746f2062652066696e616c697a656400000000000000000000000000604482015290519081900360640190fd5b61264a6116c5565b156126b657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b60165460ff161561272857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5265656e7472616e637920697320626c6f636b65640000000000000000000000604482015290519081900360640190fd5b601680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560008181526005602052604090205415801590612782575060008181526005602052604090206004015460ff16155b6127d7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613b746021913960400191505060405180910390fd5b6127e08161344b565b61284b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f41646472657373206973206e6f74206275796572000000000000000000000000604482015290519081900360640190fd5b60008181526005602052604090206004810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560095490546128ad9173ffffffffffffffffffffffffffffffffffffffff16903390613577565b60008181526005602090815260408083208054600490910154825191825292810184905260ff90921615158282015260608201929092529051339183917f7c3945978cb75c169561aae1b0e277519de5c4d2ae65a5b8844f8c27710e5bc89181900360800190a350601680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b612947613478565b73ffffffffffffffffffffffffffffffffffffffff16612965611af7565b73ffffffffffffffffffffffffffffffffffffffff16146129e757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600281815481106129f457fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff838116911614612a2457600080fd5b73ffffffffffffffffffffffffffffffffffffffff8216600090815260016020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556002805482908110612a7d57fe5b6000918252602082200180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905560405173ffffffffffffffffffffffffffffffffffffffff8416917fcdd2e9b91a56913d370075169cefa1602ba36be5301664f752192bb1709df75791a25050565b6012546013540390565b6000612b03610bb3565b156119cd57612b13601154611b1e565b612b1e601254611b1e565b10156119cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180613c32602c913960400191505060405180910390fd5b60028181548110612b8557600080fd5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b600e5481565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260086020908152604091829020805483518184028101840190945280845260609392830182828015612c1f57602002820191906000526020600020905b815481526020019060010190808311612c0b575b50505050509050919050565b612c33613478565b73ffffffffffffffffffffffffffffffffffffffff16612c51611af7565b73ffffffffffffffffffffffffffffffffffffffff1614612cd357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60005b8151811015612e145760016000838381518110612cef57fe5b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040016000205460ff16151560011415612d3257600080fd5b6001806000848481518110612d4357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506002828281518110612daa57fe5b60209081029190910181015182546001808201855560009485529290932090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9093169290921790915501612cd6565b507fe3c5086a518f78e8aa61952bb9c28a9a0f0022707e537ea961faa918e0d89f6f816040518080602001828103825283818151815260200191508051906020019060200280838360005b83811015612e77578181015183820152602001612e5f565b505050509050019250505060405180910390a150565b612e95613478565b73ffffffffffffffffffffffffffffffffffffffff16612eb3611af7565b73ffffffffffffffffffffffffffffffffffffffff1614612f3557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b612f3d611642565b612fa857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f48617320746f2062652066696e616c697a656400000000000000000000000000604482015290519081900360640190fd5b600b5460ff1615612fb857600080fd5b6000612fc2610bb3565b8015612fe15750612fd4601154611b1e565b612fdf601254611b1e565b105b15612fef5750601354613001565b601254601354612ffe916138b9565b90505b801561305657600b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556009546130569073ffffffffffffffffffffffffffffffffffffffff163383613577565b50565b613061611583565b6130cc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f48617320746f206265207072652d737461727465640000000000000000000000604482015290519081900360640190fd5b6013546130e1826130db6116d4565b90613845565b1115613138576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526039815260200180613b006039913960400191505060405180910390fd5b60095461315d9073ffffffffffffffffffffffffffffffffffffffff16333084613930565b6013546131686116d4565b14156131ae57600980547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790555b604080518281524260208201528151309233927ffa9e9c1eea421f377d2d3a349fc808d3333930f6ad9854b63661e75f98687f36929081900390910190a350565b600781815481106131ff57600080fd5b600091825260209091200154905081565b60105481565b600061168f601354611b1e565b60068181548110612b8557600080fd5b61323b613478565b73ffffffffffffffffffffffffffffffffffffffff16613259611af7565b73ffffffffffffffffffffffffffffffffffffffff16146132db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116613347576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613b956026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff8085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff909216610100027fffffffffffffffffffffff0000000000000000000000000000000000000000ff909216919091179055565b606060068054806020026020016040519081016040528092919081815260200182805480156117c45760200282019190600052602060002090815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311611808575050505050905090565b60009081526005602052604090206001015473ffffffffffffffffffffffffffffffffffffffff16331490565b3390565b60008261348b57506000611b3e565b8282028284828161349857fe5b04146134ef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613c5e6021913960400191505060405180910390fd5b9392505050565b600080821161356657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161356f57fe5b049392505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251825160009485949389169392918291908083835b6020831061364c57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161360f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146136ae576040519150601f19603f3d011682016040523d82523d6000602084013e6136b3565b606091505b50915091508180156136e15750805115806136e157508080602001905160208110156136de57600080fd5b50515b61374c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b61375b6116c5565b156137c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861381b613478565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190a1565b6000828201838110156134ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008282111561392a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000178152925182516000948594938a169392918291908083835b60208310613a0d57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016139d0565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613a6f576040519150601f19603f3d011682016040523d82523d6000602084013e613a74565b606091505b5091509150818015613aa2575080511580613aa25750808060200190516020811015613a9f57600080fd5b50515b613af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613d096024913960400191505060405180910390fd5b50505050505056fe5472616e7366657272656420746f6b656e73206861766520746f20626520657175616c206f72206c657373207468616e2070726f706f736564546f6b656e20416464726573732068617320746f2062652064696666207468616e20746865206572633230207375626a65637420746f2073616c655075726368617365206973206569746865722030206f722066696e616c697a65644f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416d6f756e74206973206c657373207468616e20746f6b656e7320617661696c61626c65546f74616c526169736520697320626967676572207468616e206d696e696d756d20726169736520616d6f756e74416d6f756e7420697320736d616c6c6572207468616e206d6178696d756d20616d6f756e74546f74616c5261697365206973206c657373207468616e206d696e696d756d20726169736520616d6f756e74536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7755736572207377617020616d6f756e742068617320746f20657175616c20746f20636f7374206f6620746f6b656e20696e20455448416464726573732068617320616c72656164792070617373656420746865206d617820616d6f756e74206f662073776170416d6f756e7420697320626967676572207468616e206d696e696d756d20616d6f756e745472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544a26469706673582212209fabef5d68581d0f7dcb12436ecb40a22584debd5c719141224e9f2db604601164736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002078ed916728b62115eb33e4b99b3273ced7223b000000000000000000000000983aa003512077bd7d3ea9212fffd8fb7a378e9a0000000000000000000000000000000000000000000000000000021aaed9179c0000000000000000000000000000000000000000000583b8b02231b86c6800000000000000000000000000000000000000000000000000000000000060d481d00000000000000000000000000000000000000000000000000000000060d48fe00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000968afb80024198e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002dc36699d6d96b5c0000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _tokenAddress (address): 0x2078ed916728b62115eB33E4B99B3273CED7223b
Arg [1] : _feeAddress (address): 0x983aA003512077bd7D3Ea9212FfFD8FB7a378E9A
Arg [2] : _tradeValue (uint256): 2313625868188
Arg [3] : _tokensForSale (uint256): 6666666000000000000000000
Arg [4] : _startDate (uint256): 1624539600
Arg [5] : _endDate (uint256): 1624543200
Arg [6] : _individualMinimumAmount (uint256): 0
Arg [7] : _individualMaximumAmount (uint256): 44432421600000000000000
Arg [8] : _isTokenSwapAtomic (bool): False
Arg [9] : _minimumRaise (uint256): 3457776000000000000000000
Arg [10] : _feeAmount (uint256): 1
Arg [11] : _hasWhitelisting (bool): True
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000002078ed916728b62115eb33e4b99b3273ced7223b
Arg [1] : 000000000000000000000000983aa003512077bd7d3ea9212fffd8fb7a378e9a
Arg [2] : 0000000000000000000000000000000000000000000000000000021aaed9179c
Arg [3] : 0000000000000000000000000000000000000000000583b8b02231b86c680000
Arg [4] : 0000000000000000000000000000000000000000000000000000000060d481d0
Arg [5] : 0000000000000000000000000000000000000000000000000000000060d48fe0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000968afb80024198e0000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 00000000000000000000000000000000000000000002dc36699d6d96b5c00000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000001
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.