More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,715 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Distributi... | 22122208 | 21 days ago | IN | 0 ETH | 0.00009189 | ||||
Claim Distributi... | 21882420 | 54 days ago | IN | 0 ETH | 0.00013561 | ||||
Set Vesting | 21737622 | 74 days ago | IN | 0 ETH | 0.00031069 | ||||
Claim Distributi... | 21720191 | 77 days ago | IN | 0 ETH | 0.00051716 | ||||
Claim Distributi... | 21638333 | 88 days ago | IN | 0 ETH | 0.00106665 | ||||
Claim Distributi... | 21618509 | 91 days ago | IN | 0 ETH | 0.00095225 | ||||
Claim Distributi... | 21349934 | 128 days ago | IN | 0 ETH | 0.00097102 | ||||
Claim Distributi... | 21323535 | 132 days ago | IN | 0 ETH | 0.00600529 | ||||
Claim Distributi... | 21306250 | 135 days ago | IN | 0 ETH | 0.00112137 | ||||
Claim Distributi... | 21300585 | 135 days ago | IN | 0 ETH | 0.00091826 | ||||
Claim Distributi... | 21265169 | 140 days ago | IN | 0 ETH | 0.00132372 | ||||
Claim Distributi... | 21180521 | 152 days ago | IN | 0 ETH | 0.00812987 | ||||
Claim Distributi... | 21180392 | 152 days ago | IN | 0 ETH | 0.00677659 | ||||
Claim Distributi... | 20225445 | 285 days ago | IN | 0 ETH | 0.00090567 | ||||
Claim Distributi... | 20182389 | 291 days ago | IN | 0 ETH | 0.00632858 | ||||
Claim Distributi... | 20173787 | 293 days ago | IN | 0 ETH | 0.00041661 | ||||
Claim Distributi... | 20126315 | 299 days ago | IN | 0 ETH | 0.00071343 | ||||
Approve | 20032511 | 312 days ago | IN | 0 ETH | 0.00032747 | ||||
Claim Distributi... | 20024763 | 313 days ago | IN | 0 ETH | 0.00090068 | ||||
Claim Distributi... | 19968600 | 321 days ago | IN | 0 ETH | 0.00132373 | ||||
Claim Distributi... | 19904211 | 330 days ago | IN | 0 ETH | 0.00024137 | ||||
Claim Distributi... | 19888420 | 333 days ago | IN | 0 ETH | 0.00110067 | ||||
Approve | 19836944 | 340 days ago | IN | 0 ETH | 0.00006661 | ||||
Claim Distributi... | 19809620 | 344 days ago | IN | 0 ETH | 0.00045758 | ||||
Claim Distributi... | 19754851 | 351 days ago | IN | 0 ETH | 0.00103461 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
DecubateVesting
Compiler Version
v0.8.8+commit.dddeac2f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT //** Decubate Locking Contract */ //** Author Aaron & Vipin : Decubate Vesting Contract 2021.6 */ pragma solidity ^0.8.8; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "./interfaces/IDecubateVesting.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; contract DecubateVesting is IDecubateVesting, Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; /** * * @dev whitelistPools store all active whitelist members. * */ MaxTokenTransferValue public maxTokenTransfer; VestingPool[] public vestingPools; IERC20 private _token; constructor(address token) { _token = IERC20(token); } modifier optionExists(uint256 _option) { require(_option < vestingPools.length, "Vesting option does not exist"); _; } modifier userInWhitelist(uint256 _option, address _wallet) { require(_option < vestingPools.length, "Vesting option does not exist"); require( vestingPools[_option].hasWhitelist[_wallet].active, "User is not in whitelist" ); _; } function addVestingStrategy( string memory _name, uint256 _cliff, uint256 _start, uint256 _duration, uint256 _initialUnlockPercent, bool _revocable ) external override onlyOwner returns (bool) { VestingPool storage newStrategy = vestingPools.push(); newStrategy.cliff = _start.add(_cliff); newStrategy.name = _name; newStrategy.start = _start; newStrategy.duration = _duration; newStrategy.initialUnlockPercent = _initialUnlockPercent; newStrategy.revocable = _revocable; return true; } function setVestingStrategy( uint256 _strategy, string memory _name, uint256 _cliff, uint256 _start, uint256 _duration, uint256 _initialUnlockPercent, bool _revocable ) external override onlyOwner returns (bool) { require(_strategy < vestingPools.length, "Strategy does not exist"); VestingPool storage vest = vestingPools[_strategy]; vest.cliff = _start.add(_cliff); vest.name = _name; vest.start = _start; vest.duration = _duration; vest.initialUnlockPercent = _initialUnlockPercent; vest.revocable = _revocable; return true; } function setMaxTokenTransfer(uint256 _amount, bool _active) external onlyOwner returns (bool) { maxTokenTransfer.amount = _amount; maxTokenTransfer.active = _active; return true; } function getAllVestingPools() external view returns (VestingInfo[] memory) { VestingInfo[] memory infoArr = new VestingInfo[](vestingPools.length); for (uint256 i = 0; i < vestingPools.length; i++) { infoArr[i] = getVestingInfo(i); } return infoArr; } /** * * @dev get vesting info * * @param {uint256} strategy of vesting info * * @return return vesting strategy * */ function getVestingInfo(uint256 _strategy) public view optionExists(_strategy) returns (VestingInfo memory) { return VestingInfo({ name: vestingPools[_strategy].name, cliff: vestingPools[_strategy].cliff, start: vestingPools[_strategy].start, duration: vestingPools[_strategy].duration, initialUnlockPercent: vestingPools[_strategy].initialUnlockPercent, revocable: vestingPools[_strategy].revocable }); } /** * * @dev add the address to whitelist * * @param {address} address of the user * * @return {bool} return status of the whitelist * */ function addWhitelist( address _wallet, uint256 _dcbAmount, uint256 _option ) public override onlyOwner optionExists(_option) returns (bool) { HasWhitelist storage whitelist = vestingPools[_option].hasWhitelist[ _wallet ]; require(!whitelist.active, "Whitelist already available"); WhitelistInfo[] storage pool = vestingPools[_option].whitelistPool; whitelist.active = true; whitelist.arrIdx = pool.length; pool.push( WhitelistInfo({ wallet: _wallet, dcbAmount: _dcbAmount, distributedAmount: 0, joinDate: block.timestamp, revoke: false, disabled: false }) ); emit AddWhitelist(_wallet); return true; } function batchAddWhitelist( address[] memory wallets, uint256[] memory amounts, uint256 option ) external onlyOwner returns (bool) { require(wallets.length == amounts.length, "Sizes of inputs do not match"); for (uint256 i = 0; i < wallets.length; i++) { addWhitelist(wallets[i], amounts[i], option); } return true; } /** * * @dev set the address as whitelist user address * * @param {address} address of the user * * @return {bool} return status of the whitelist * */ function setWhitelist( address _wallet, uint256 _dcbAmount, uint256 _option ) external override onlyOwner userInWhitelist(_option, _wallet) returns (bool) { uint256 idx = vestingPools[_option].hasWhitelist[_wallet].arrIdx; WhitelistInfo storage info = vestingPools[_option].whitelistPool[idx]; info.dcbAmount = _dcbAmount; return true; } /** * * @dev set the address as whitelist user address * * @param {address} address of the user * * @return {Whitelist} return whitelist instance * */ function getWhitelist(uint256 _option, address _wallet) external view userInWhitelist(_option, _wallet) returns (WhitelistInfo memory) { uint256 idx = vestingPools[_option].hasWhitelist[_wallet].arrIdx; return vestingPools[_option].whitelistPool[idx]; } /** * * @dev set token address for contract * * @param {_token} address of IERC20 instance * @return {bool} return status of token address * */ function setToken(address _addr) external override onlyOwner returns (bool) { _token = IERC20(_addr); return true; } /** * * @dev getter function for deployed decubate token address * * @return {address} return deployment address of decubate token * */ function getToken() external view override returns (address) { return address(_token); } /** * * @dev calculate the total vested amount by the time * * @param {address} user wallet address * * @return {uint256} return vested amount * */ function calculateVestAmount(uint256 _option, address _wallet) internal view userInWhitelist(_option, _wallet) returns (uint256) { uint256 idx = vestingPools[_option].hasWhitelist[_wallet].arrIdx; WhitelistInfo memory whitelist = vestingPools[_option].whitelistPool[idx]; VestingPool storage vest = vestingPools[_option]; // initial unlock uint256 initial = whitelist.dcbAmount.mul(vest.initialUnlockPercent).div( 1000 ); if(whitelist.revoke) { return whitelist.dcbAmount; } if (block.timestamp < vest.start) { return 0; } else if(block.timestamp >= vest.start && block.timestamp < vest.cliff) { return initial; } else if(block.timestamp >= vest.cliff && block.timestamp < vest.cliff.add(vest.duration)) { // remaining locked token uint256 remaining = whitelist.dcbAmount.sub(initial); //More accurate // return initial unlock + remaining x % of time passed return initial + remaining.mul(block.timestamp.sub(vest.cliff)).div(vest.duration); } else { return whitelist.dcbAmount; } } /** * * @dev calculate releasable amount by subtracting distributed amount * * @param {address} investor wallet address * * @return {uint256} releasable amount of the whitelist * */ function calculateReleasableAmount(uint256 _option, address _wallet) internal view userInWhitelist(_option, _wallet) returns (uint256) { uint256 idx = vestingPools[_option].hasWhitelist[_wallet].arrIdx; return calculateVestAmount(_option, _wallet).sub( vestingPools[_option].whitelistPool[idx].distributedAmount ); } /** * * @dev distribute the token to the investors * * @param {address} wallet address of the investor * * @return {bool} return status of distribution * */ function claimDistribution(uint256 _option, address _wallet) external override nonReentrant returns (bool) { uint256 idx = vestingPools[_option].hasWhitelist[_wallet].arrIdx; WhitelistInfo storage whitelist = vestingPools[_option].whitelistPool[idx]; require(!whitelist.disabled, "User is disabled from claiming token"); uint256 releaseAmount = calculateReleasableAmount(_option, _wallet); require(releaseAmount > 0, "Zero amount to claim"); if (maxTokenTransfer.active && releaseAmount > maxTokenTransfer.amount) { releaseAmount = maxTokenTransfer.amount; } whitelist.distributedAmount = whitelist.distributedAmount.add( releaseAmount ); _token.transfer(_wallet, releaseAmount); emit Claim(_wallet, releaseAmount, _option, block.timestamp); return true; } /** * * @dev allow the owner to revoke the vesting * */ function revoke(uint256 _option, address _wallet) public onlyOwner userInWhitelist(_option, _wallet) { uint256 idx = vestingPools[_option].hasWhitelist[_wallet].arrIdx; WhitelistInfo storage whitelist = vestingPools[_option].whitelistPool[idx]; require(vestingPools[_option].revocable, "Strategy is not revocable"); require(!whitelist.revoke, "already revoked"); whitelist.revoke = true; emit Revoked(_wallet); } /** * * @dev allow the owner to enable/disable the vesting * * User will not be able to claim his tokens, but claimable balance remains unchanged * */ function setVesting(uint256 _option, address _wallet, bool _status) public onlyOwner userInWhitelist(_option, _wallet) { uint256 idx = vestingPools[_option].hasWhitelist[_wallet].arrIdx; WhitelistInfo storage whitelist = vestingPools[_option].whitelistPool[idx]; whitelist.disabled = _status; emit StatusChanged(_wallet,_status); } /** * * @dev Allow owner to transfer token from contract * * @param {address} contract address of corresponding token * @param {uint256} amount of token to be transferred * * This is a generalized function which can be used to transfer any accidentally * sent (including DCB) out of the contract to wowner * */ function transferToken(address _addr, uint256 _amount) external onlyOwner returns (bool) { IERC20 token = IERC20(_addr); bool success = token.transfer(address(owner()), _amount); return success; } /** * * @dev Retrieve total amount of token from the contract * * @param {address} address of the token * * @return {uint256} total amount of token * */ function getTotalToken(address _addr) external view returns (uint256) { IERC20 token = IERC20(_addr); return token.balanceOf(address(this)); } function hasWhitelist(uint256 _option, address _wallet) external view returns (bool) { return vestingPools[_option].hasWhitelist[_wallet].active; } function getVestAmount(uint256 _option, address _wallet) external view override returns (uint256) { return calculateVestAmount(_option, _wallet); } function getReleasableAmount(uint256 _option, address _wallet) external view override returns (uint256) { return calculateReleasableAmount(_option, _wallet); } function getWhitelistPool(uint256 _option) external view optionExists(_option) returns (WhitelistInfo[] memory) { return vestingPools[_option].whitelistPool; } }
// SPDX-License-Identifier: MIT //** Decubate Vesting Factory Contract */ //** Author Vipin : Decubate Crowfunding 2021.5 */ pragma solidity ^0.8.8; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; interface IDecubateVesting { /** * * @dev this event will call when new token added to the contract * currently, we are supporting DCB token and this will be used for future implementation * */ event AddToken(address indexed token); /** * * @dev this event will be called each time a user claims some tokens * */ event Claim( address indexed token, uint256 amount, uint256 indexed option, uint256 time ); /** * * @dev this event calls when new whitelist member joined to the pool * */ event AddWhitelist(address indexed wallet); /** * * @dev this event call when distirbuted token revoked * */ event Revoked(address indexed wallet); /** * * @dev this event call when token claim status is changed for a user * */ event StatusChanged(address indexed wallet, bool status); /** * * @dev define vesting informations like x%, x months * */ struct VestingInfo { string name; uint256 cliff; uint256 start; uint256 duration; uint256 initialUnlockPercent; bool revocable; } struct VestingPool { string name; uint256 cliff; uint256 start; uint256 duration; uint256 initialUnlockPercent; WhitelistInfo[] whitelistPool; mapping(address => HasWhitelist) hasWhitelist; bool revocable; } struct MaxTokenTransferValue { uint256 amount; bool active; } /** * * @dev WhiteInfo is the struct type which store whitelist information * */ struct WhitelistInfo { address wallet; uint256 dcbAmount; uint256 distributedAmount; uint256 joinDate; bool revoke; bool disabled; } struct HasWhitelist { uint256 arrIdx; bool active; } /** * * inherit functions will be used in contract * */ function getVestAmount(uint256 _option, address _wallet) external view returns (uint256); function getReleasableAmount(uint256 _option, address _wallet) external view returns (uint256); function getVestingInfo(uint256 _strategy) external view returns (VestingInfo memory); function addVestingStrategy( string memory _name, uint256 _cliff, uint256 _start, uint256 _duration, uint256 _initialUnlockPercent, bool _revocable ) external returns (bool); function setVestingStrategy( uint256 _strategy, string memory _name, uint256 _cliff, uint256 _start, uint256 _duration, uint256 _initialUnlockPercent, bool _revocable ) external returns (bool); function addWhitelist( address _wallet, uint256 _dcbAmount, uint256 _option ) external returns (bool); function getWhitelist(uint256 _option, address _wallet) external view returns (WhitelistInfo memory); function setWhitelist( address _wallet, uint256 _dcbAmount, uint256 _option ) external returns (bool); function setToken(address _addr) external returns (bool); function getToken() external view returns (address); function claimDistribution(uint256 _option, address _wallet) external returns (bool); function getWhitelistPool(uint256 _option) external view returns (WhitelistInfo[] memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler * now has built in overflow checking. */ 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) { unchecked { 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) { unchecked { 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) { unchecked { // 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) { unchecked { 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) { unchecked { 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) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return 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) { return a * b; } /** * @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. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { 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) { 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) { unchecked { 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. * * 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) { unchecked { 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) { unchecked { require(b > 0, errorMessage); return a % b; } } }
// SPDX-License-Identifier: MIT pragma solidity ^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 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) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC20.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^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.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.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() { _setOwner(_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 { _setOwner(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"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
{ "remappings": [], "optimizer": { "enabled": false, "runs": 200 }, "evmVersion": "london", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"}],"name":"AddToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"}],"name":"AddWhitelist","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"option","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Claim","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":true,"internalType":"address","name":"wallet","type":"address"}],"name":"Revoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"StatusChanged","type":"event"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_cliff","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_initialUnlockPercent","type":"uint256"},{"internalType":"bool","name":"_revocable","type":"bool"}],"name":"addVestingStrategy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_dcbAmount","type":"uint256"},{"internalType":"uint256","name":"_option","type":"uint256"}],"name":"addWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"wallets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256","name":"option","type":"uint256"}],"name":"batchAddWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_option","type":"uint256"},{"internalType":"address","name":"_wallet","type":"address"}],"name":"claimDistribution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllVestingPools","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"initialUnlockPercent","type":"uint256"},{"internalType":"bool","name":"revocable","type":"bool"}],"internalType":"struct IDecubateVesting.VestingInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_option","type":"uint256"},{"internalType":"address","name":"_wallet","type":"address"}],"name":"getReleasableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"getTotalToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_option","type":"uint256"},{"internalType":"address","name":"_wallet","type":"address"}],"name":"getVestAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_strategy","type":"uint256"}],"name":"getVestingInfo","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"initialUnlockPercent","type":"uint256"},{"internalType":"bool","name":"revocable","type":"bool"}],"internalType":"struct IDecubateVesting.VestingInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_option","type":"uint256"},{"internalType":"address","name":"_wallet","type":"address"}],"name":"getWhitelist","outputs":[{"components":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"dcbAmount","type":"uint256"},{"internalType":"uint256","name":"distributedAmount","type":"uint256"},{"internalType":"uint256","name":"joinDate","type":"uint256"},{"internalType":"bool","name":"revoke","type":"bool"},{"internalType":"bool","name":"disabled","type":"bool"}],"internalType":"struct IDecubateVesting.WhitelistInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_option","type":"uint256"}],"name":"getWhitelistPool","outputs":[{"components":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"dcbAmount","type":"uint256"},{"internalType":"uint256","name":"distributedAmount","type":"uint256"},{"internalType":"uint256","name":"joinDate","type":"uint256"},{"internalType":"bool","name":"revoke","type":"bool"},{"internalType":"bool","name":"disabled","type":"bool"}],"internalType":"struct IDecubateVesting.WhitelistInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_option","type":"uint256"},{"internalType":"address","name":"_wallet","type":"address"}],"name":"hasWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTokenTransfer","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_option","type":"uint256"},{"internalType":"address","name":"_wallet","type":"address"}],"name":"revoke","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_active","type":"bool"}],"name":"setMaxTokenTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"setToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_option","type":"uint256"},{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_strategy","type":"uint256"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"uint256","name":"_cliff","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint256","name":"_initialUnlockPercent","type":"uint256"},{"internalType":"bool","name":"_revocable","type":"bool"}],"name":"setVestingStrategy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_dcbAmount","type":"uint256"},{"internalType":"uint256","name":"_option","type":"uint256"}],"name":"setWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vestingPools","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"cliff","type":"uint256"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"initialUnlockPercent","type":"uint256"},{"internalType":"bool","name":"revocable","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162004524380380620045248339818101604052810190620000379190620001dc565b620000576200004b620000a660201b60201c565b620000ae60201b60201c565b6001808190555080600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200020e565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001a48262000177565b9050919050565b620001b68162000197565b8114620001c257600080fd5b50565b600081519050620001d681620001ab565b92915050565b600060208284031215620001f557620001f462000172565b5b60006200020584828501620001c5565b91505092915050565b614306806200021e6000396000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c80639627e1f7116100de578063c47c9f3c11610097578063e54b17ba11610071578063e54b17ba146104e9578063ea0cdeff14610519578063f2fde38b14610538578063ffbd30bc1461055457610173565b8063c47c9f3c14610459578063c5460e7114610489578063cecd8b0a146104b957610173565b80639627e1f71461033457806397d21c1e14610364578063993b189314610394578063a19d21b0146103c9578063a5902fac146103f9578063afee1ff11461042957610173565b806340349ced1161013057806340349ced1461027257806369f1f0521461028e5780636abfd407146102be578063715018a6146102ee57806379bf4a63146102f85780638da5cb5b1461031657610173565b80631072cbea14610178578063144fa6d7146101a857806320d154da146101d857806320f6b0a9146101f457806321df0da7146102245780633801381b14610242575b600080fd5b610192600480360381019061018d9190612d8f565b610584565b60405161019f9190612dea565b60405180910390f35b6101c260048036038101906101bd9190612e05565b6106aa565b6040516101cf9190612dea565b60405180910390f35b6101f260048036038101906101ed9190612e32565b610772565b005b61020e60048036038101906102099190612e72565b610ac8565b60405161021b9190612fdf565b60405180910390f35b61022c610cc2565b6040516102399190613010565b60405180910390f35b61025c6004803603810190610257919061302b565b610cec565b6040516102699190612dea565b60405180910390f35b61028c600480360381019061028791906130aa565b610f30565b005b6102a860048036038101906102a39190612e32565b6111cd565b6040516102b5919061310c565b60405180910390f35b6102d860048036038101906102d39190613127565b6111e1565b6040516102e59190612dea565b60405180910390f35b6102f6611290565b005b610300611318565b60405161030d91906132b2565b60405180910390f35b61031e6113c9565b60405161032b9190613010565b60405180910390f35b61034e6004803603810190610349919061302b565b6113f2565b60405161035b9190612dea565b60405180910390f35b61037e60048036038101906103799190613409565b61172f565b60405161038b9190612dea565b60405180910390f35b6103ae60048036038101906103a99190612e72565b611895565b6040516103c096959493929190613511565b60405180910390f35b6103e360048036038101906103de9190612e05565b611976565b6040516103f0919061310c565b60405180910390f35b610413600480360381019061040e9190612e32565b611a0d565b6040516104209190612dea565b60405180910390f35b610443600480360381019061043e9190612e32565b611d18565b6040516104509190612dea565b60405180910390f35b610473600480360381019061046e9190612e32565b611d95565b6040516104809190613603565b60405180910390f35b6104a3600480360381019061049e9190612e32565b612007565b6040516104b0919061310c565b60405180910390f35b6104d360048036038101906104ce91906137a9565b61201b565b6040516104e09190612dea565b60405180910390f35b61050360048036038101906104fe9190612e72565b612148565b604051610510919061395e565b60405180910390f35b6105216122bf565b60405161052f929190613980565b60405180910390f35b610552600480360381019061054d9190612e05565b6122de565b005b61056e600480360381019061056991906139a9565b6123d6565b60405161057b9190612dea565b60405180910390f35b600061058e6124f2565b73ffffffffffffffffffffffffffffffffffffffff166105ac6113c9565b73ffffffffffffffffffffffffffffffffffffffff1614610602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f990613a9e565b60405180910390fd5b600083905060008173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61062d6113c9565b866040518363ffffffff1660e01b815260040161064b929190613abe565b602060405180830381600087803b15801561066557600080fd5b505af1158015610679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069d9190613afc565b9050809250505092915050565b60006106b46124f2565b73ffffffffffffffffffffffffffffffffffffffff166106d26113c9565b73ffffffffffffffffffffffffffffffffffffffff1614610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90613a9e565b60405180910390fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b61077a6124f2565b73ffffffffffffffffffffffffffffffffffffffff166107986113c9565b73ffffffffffffffffffffffffffffffffffffffff16146107ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e590613a9e565b60405180910390fd5b81816004805490508210610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082e90613b75565b60405180910390fd5b6004828154811061084b5761084a613b95565b5b906000526020600020906008020160060160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff166108e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e090613c10565b60405180910390fd5b6000600485815481106108ff576108fe613b95565b5b906000526020600020906008020160060160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060006004868154811061096957610968613b95565b5b9060005260206000209060080201600501828154811061098c5761098b613b95565b5b90600052602060002090600502019050600486815481106109b0576109af613b95565b5b906000526020600020906008020160070160009054906101000a900460ff16610a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0590613c7c565b60405180910390fd5b8060040160009054906101000a900460ff1615610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5790613ce8565b60405180910390fd5b60018160040160006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167fb6fa8b8bd5eab60f292eca876e3ef90722275b785309d84b1de113ce0b8c4e7460405160405180910390a2505050505050565b610ad0612bbc565b816004805490508110610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90613b75565b60405180910390fd5b6040518060c0016040528060048581548110610b3757610b36613b95565b5b90600052602060002090600802016000018054610b5390613d37565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7f90613d37565b8015610bcc5780601f10610ba157610100808354040283529160200191610bcc565b820191906000526020600020905b815481529060010190602001808311610baf57829003601f168201915b5050505050815260200160048581548110610bea57610be9613b95565b5b906000526020600020906008020160010154815260200160048581548110610c1557610c14613b95565b5b906000526020600020906008020160020154815260200160048581548110610c4057610c3f613b95565b5b906000526020600020906008020160030154815260200160048581548110610c6b57610c6a613b95565b5b906000526020600020906008020160040154815260200160048581548110610c9657610c95613b95565b5b906000526020600020906008020160070160009054906101000a900460ff161515815250915050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610cf66124f2565b73ffffffffffffffffffffffffffffffffffffffff16610d146113c9565b73ffffffffffffffffffffffffffffffffffffffff1614610d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6190613a9e565b60405180910390fd5b81846004805490508210610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa90613b75565b60405180910390fd5b60048281548110610dc757610dc6613b95565b5b906000526020600020906008020160060160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c90613c10565b60405180910390fd5b600060048581548110610e7b57610e7a613b95565b5b906000526020600020906008020160060160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600060048681548110610ee557610ee4613b95565b5b90600052602060002090600802016005018281548110610f0857610f07613b95565b5b9060005260206000209060050201905086816001018190555060019450505050509392505050565b610f386124f2565b73ffffffffffffffffffffffffffffffffffffffff16610f566113c9565b73ffffffffffffffffffffffffffffffffffffffff1614610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390613a9e565b60405180910390fd5b82826004805490508210610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec90613b75565b60405180910390fd5b6004828154811061100957611008613b95565b5b906000526020600020906008020160060160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff166110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e90613c10565b60405180910390fd5b6000600486815481106110bd576110bc613b95565b5b906000526020600020906008020160060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060006004878154811061112757611126613b95565b5b9060005260206000209060080201600501828154811061114a57611149613b95565b5b90600052602060002090600502019050848160040160016101000a81548160ff0219169083151502179055508573ffffffffffffffffffffffffffffffffffffffff167f6303039f3f903247906337ae51ea67063408be3dbc7a2f517044e91404293a61866040516111bc9190612dea565b60405180910390a250505050505050565b60006111d983836124fa565b905092915050565b60006111eb6124f2565b73ffffffffffffffffffffffffffffffffffffffff166112096113c9565b73ffffffffffffffffffffffffffffffffffffffff161461125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613a9e565b60405180910390fd5b8260026000018190555081600260010160006101000a81548160ff0219169083151502179055506001905092915050565b6112986124f2565b73ffffffffffffffffffffffffffffffffffffffff166112b66113c9565b73ffffffffffffffffffffffffffffffffffffffff161461130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130390613a9e565b60405180910390fd5b61131660006128ca565b565b6060600060048054905067ffffffffffffffff81111561133b5761133a6132de565b5b60405190808252806020026020018201604052801561137457816020015b611361612bbc565b8152602001906001900390816113595790505b50905060005b6004805490508110156113c15761139081610ac8565b8282815181106113a3576113a2613b95565b5b602002602001018190525080806113b990613d98565b91505061137a565b508091505090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006113fc6124f2565b73ffffffffffffffffffffffffffffffffffffffff1661141a6113c9565b73ffffffffffffffffffffffffffffffffffffffff1614611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146790613a9e565b60405180910390fd5b8160048054905081106114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90613b75565b60405180910390fd5b6000600484815481106114ce576114cd613b95565b5b906000526020600020906008020160060160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060010160009054906101000a900460ff1615611570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156790613e2d565b60405180910390fd5b60006004858154811061158657611585613b95565b5b9060005260206000209060080201600501905060018260010160006101000a81548160ff02191690831515021790555080805490508260000181905550806040518060c001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020016000815260200142815260200160001515815260200160001515815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a08201518160040160016101000a81548160ff02191690831515021790555050508673ffffffffffffffffffffffffffffffffffffffff167fe463fa6bdecb16f96f58191d902152633214e760ea443684105a7eef1ad16b9d60405160405180910390a2600193505050509392505050565b60006117396124f2565b73ffffffffffffffffffffffffffffffffffffffff166117576113c9565b73ffffffffffffffffffffffffffffffffffffffff16146117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a490613a9e565b60405180910390fd5b60048054905088106117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb90613e99565b60405180910390fd5b60006004898154811061180a57611809613b95565b5b9060005260206000209060080201905061182d878761298e90919063ffffffff16565b81600101819055508781600001908051906020019061184d929190612bf4565b50858160020181905550848160030181905550838160040181905550828160070160006101000a81548160ff0219169083151502179055506001915050979650505050505050565b600481815481106118a557600080fd5b90600052602060002090600802016000915090508060000180546118c890613d37565b80601f01602080910402602001604051908101604052809291908181526020018280546118f490613d37565b80156119415780601f1061191657610100808354040283529160200191611941565b820191906000526020600020905b81548152906001019060200180831161192457829003601f168201915b5050505050908060010154908060020154908060030154908060040154908060070160009054906101000a900460ff16905086565b6000808290508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119b59190613010565b60206040518083038186803b1580156119cd57600080fd5b505afa1580156119e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a059190613ece565b915050919050565b600060026001541415611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90613f47565b60405180910390fd5b6002600181905550600060048481548110611a7357611a72613b95565b5b906000526020600020906008020160060160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600060048581548110611add57611adc613b95565b5b90600052602060002090600802016005018281548110611b0057611aff613b95565b5b906000526020600020906005020190508060040160019054906101000a900460ff1615611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990613fd9565b60405180910390fd5b6000611b6e86866129a4565b905060008111611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa90614045565b60405180910390fd5b600260010160009054906101000a900460ff168015611bd6575060026000015481115b15611be45760026000015490505b611bfb81836002015461298e90919063ffffffff16565b8260020181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b8152600401611c60929190613abe565b602060405180830381600087803b158015611c7a57600080fd5b505af1158015611c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb29190613afc565b50858573ffffffffffffffffffffffffffffffffffffffff167f45c072aa05b9853b5a993de7a28bc332ee01404a628cec1a23ce0f659f842ef18342604051611cfc929190614065565b60405180910390a3600193505050506001808190555092915050565b600060048381548110611d2e57611d2d613b95565b5b906000526020600020906008020160060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16905092915050565b611d9d612c7a565b82826004805490508210611de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddd90613b75565b60405180910390fd5b60048281548110611dfa57611df9613b95565b5b906000526020600020906008020160060160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f90613c10565b60405180910390fd5b600060048681548110611eae57611ead613b95565b5b906000526020600020906008020160060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060048681548110611f1657611f15613b95565b5b90600052602060002090600802016005018181548110611f3957611f38613b95565b5b90600052602060002090600502016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581526020016004820160019054906101000a900460ff161515151581525050935050505092915050565b600061201383836129a4565b905092915050565b60006120256124f2565b73ffffffffffffffffffffffffffffffffffffffff166120436113c9565b73ffffffffffffffffffffffffffffffffffffffff1614612099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209090613a9e565b60405180910390fd5b82518451146120dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d4906140da565b60405180910390fd5b60005b845181101561213c576121288582815181106120ff576120fe613b95565b5b602002602001015185838151811061211a57612119613b95565b5b6020026020010151856113f2565b50808061213490613d98565b9150506120e0565b50600190509392505050565b6060816004805490508110612192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218990613b75565b60405180910390fd5b600483815481106121a6576121a5613b95565b5b9060005260206000209060080201600501805480602002602001604051908101604052809291908181526020016000905b828210156122b357838290600052602060002090600502016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581526020016004820160019054906101000a900460ff161515151581525050815260200190600101906121d7565b50505050915050919050565b60028060000154908060010160009054906101000a900460ff16905082565b6122e66124f2565b73ffffffffffffffffffffffffffffffffffffffff166123046113c9565b73ffffffffffffffffffffffffffffffffffffffff161461235a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235190613a9e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c19061416c565b60405180910390fd5b6123d3816128ca565b50565b60006123e06124f2565b73ffffffffffffffffffffffffffffffffffffffff166123fe6113c9565b73ffffffffffffffffffffffffffffffffffffffff1614612454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244b90613a9e565b60405180910390fd5b60006004600181600181540180825580915050039060005260206000209060080201905061248b878761298e90919063ffffffff16565b8160010181905550878160000190805190602001906124ab929190612bf4565b50858160020181905550848160030181905550838160040181905550828160070160006101000a81548160ff02191690831515021790555060019150509695505050505050565b600033905090565b600082826004805490508210612545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253c90613b75565b60405180910390fd5b6004828154811061255957612558613b95565b5b906000526020600020906008020160060160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff166125f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ee90613c10565b60405180910390fd5b60006004868154811061260d5761260c613b95565b5b906000526020600020906008020160060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060006004878154811061267757612676613b95565b5b9060005260206000209060080201600501828154811061269a57612699613b95565b5b90600052602060002090600502016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581526020016004820160019054906101000a900460ff161515151581525050905060006004888154811061277557612774613b95565b5b9060005260206000209060080201905060006127b66103e86127a884600401548660200151612b7a90919063ffffffff16565b612b9090919063ffffffff16565b90508260800151156127d25782602001519650505050506128c2565b81600201544210156127eb5760009650505050506128c2565b816002015442101580156128025750816001015442105b1561281357809650505050506128c2565b81600101544210158015612840575061283d8260030154836001015461298e90919063ffffffff16565b42105b156128b657600061285e828560200151612ba690919063ffffffff16565b905061289f8360030154612891612882866001015442612ba690919063ffffffff16565b84612b7a90919063ffffffff16565b612b9090919063ffffffff16565b826128aa919061418c565b975050505050506128c2565b82602001519650505050505b505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361299c919061418c565b905092915050565b6000828260048054905082106129ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e690613b75565b60405180910390fd5b60048281548110612a0357612a02613b95565b5b906000526020600020906008020160060160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16612aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9890613c10565b60405180910390fd5b600060048681548110612ab757612ab6613b95565b5b906000526020600020906008020160060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050612b6f60048781548110612b2257612b21613b95565b5b90600052602060002090600802016005018281548110612b4557612b44613b95565b5b906000526020600020906005020160020154612b6188886124fa565b612ba690919063ffffffff16565b935050505092915050565b60008183612b8891906141e2565b905092915050565b60008183612b9e919061426b565b905092915050565b60008183612bb4919061429c565b905092915050565b6040518060c0016040528060608152602001600081526020016000815260200160008152602001600081526020016000151581525090565b828054612c0090613d37565b90600052602060002090601f016020900481019282612c225760008555612c69565b82601f10612c3b57805160ff1916838001178555612c69565b82800160010185558215612c69579182015b82811115612c68578251825591602001919060010190612c4d565b5b509050612c769190612cca565b5090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000151581526020016000151581525090565b5b80821115612ce3576000816000905550600101612ccb565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d2682612cfb565b9050919050565b612d3681612d1b565b8114612d4157600080fd5b50565b600081359050612d5381612d2d565b92915050565b6000819050919050565b612d6c81612d59565b8114612d7757600080fd5b50565b600081359050612d8981612d63565b92915050565b60008060408385031215612da657612da5612cf1565b5b6000612db485828601612d44565b9250506020612dc585828601612d7a565b9150509250929050565b60008115159050919050565b612de481612dcf565b82525050565b6000602082019050612dff6000830184612ddb565b92915050565b600060208284031215612e1b57612e1a612cf1565b5b6000612e2984828501612d44565b91505092915050565b60008060408385031215612e4957612e48612cf1565b5b6000612e5785828601612d7a565b9250506020612e6885828601612d44565b9150509250929050565b600060208284031215612e8857612e87612cf1565b5b6000612e9684828501612d7a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ed9578082015181840152602081019050612ebe565b83811115612ee8576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f0a82612e9f565b612f148185612eaa565b9350612f24818560208601612ebb565b612f2d81612eee565b840191505092915050565b612f4181612d59565b82525050565b612f5081612dcf565b82525050565b600060c0830160008301518482036000860152612f738282612eff565b9150506020830151612f886020860182612f38565b506040830151612f9b6040860182612f38565b506060830151612fae6060860182612f38565b506080830151612fc16080860182612f38565b5060a0830151612fd460a0860182612f47565b508091505092915050565b60006020820190508181036000830152612ff98184612f56565b905092915050565b61300a81612d1b565b82525050565b60006020820190506130256000830184613001565b92915050565b60008060006060848603121561304457613043612cf1565b5b600061305286828701612d44565b935050602061306386828701612d7a565b925050604061307486828701612d7a565b9150509250925092565b61308781612dcf565b811461309257600080fd5b50565b6000813590506130a48161307e565b92915050565b6000806000606084860312156130c3576130c2612cf1565b5b60006130d186828701612d7a565b93505060206130e286828701612d44565b92505060406130f386828701613095565b9150509250925092565b61310681612d59565b82525050565b600060208201905061312160008301846130fd565b92915050565b6000806040838503121561313e5761313d612cf1565b5b600061314c85828601612d7a565b925050602061315d85828601613095565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060c08301600083015184820360008601526131b08282612eff565b91505060208301516131c56020860182612f38565b5060408301516131d86040860182612f38565b5060608301516131eb6060860182612f38565b5060808301516131fe6080860182612f38565b5060a083015161321160a0860182612f47565b508091505092915050565b60006132288383613193565b905092915050565b6000602082019050919050565b600061324882613167565b6132528185613172565b93508360208202850161326485613183565b8060005b858110156132a05784840389528151613281858261321c565b945061328c83613230565b925060208a01995050600181019050613268565b50829750879550505050505092915050565b600060208201905081810360008301526132cc818461323d565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61331682612eee565b810181811067ffffffffffffffff82111715613335576133346132de565b5b80604052505050565b6000613348612ce7565b9050613354828261330d565b919050565b600067ffffffffffffffff821115613374576133736132de565b5b61337d82612eee565b9050602081019050919050565b82818337600083830152505050565b60006133ac6133a784613359565b61333e565b9050828152602081018484840111156133c8576133c76132d9565b5b6133d384828561338a565b509392505050565b600082601f8301126133f0576133ef6132d4565b5b8135613400848260208601613399565b91505092915050565b600080600080600080600060e0888a03121561342857613427612cf1565b5b60006134368a828b01612d7a565b975050602088013567ffffffffffffffff81111561345757613456612cf6565b5b6134638a828b016133db565b96505060406134748a828b01612d7a565b95505060606134858a828b01612d7a565b94505060806134968a828b01612d7a565b93505060a06134a78a828b01612d7a565b92505060c06134b88a828b01613095565b91505092959891949750929550565b600082825260208201905092915050565b60006134e382612e9f565b6134ed81856134c7565b93506134fd818560208601612ebb565b61350681612eee565b840191505092915050565b600060c082019050818103600083015261352b81896134d8565b905061353a60208301886130fd565b61354760408301876130fd565b61355460608301866130fd565b61356160808301856130fd565b61356e60a0830184612ddb565b979650505050505050565b61358281612d1b565b82525050565b60c08201600082015161359e6000850182613579565b5060208201516135b16020850182612f38565b5060408201516135c46040850182612f38565b5060608201516135d76060850182612f38565b5060808201516135ea6080850182612f47565b5060a08201516135fd60a0850182612f47565b50505050565b600060c0820190506136186000830184613588565b92915050565b600067ffffffffffffffff821115613639576136386132de565b5b602082029050602081019050919050565b600080fd5b600061366261365d8461361e565b61333e565b905080838252602082019050602084028301858111156136855761368461364a565b5b835b818110156136ae578061369a8882612d44565b845260208401935050602081019050613687565b5050509392505050565b600082601f8301126136cd576136cc6132d4565b5b81356136dd84826020860161364f565b91505092915050565b600067ffffffffffffffff821115613701576137006132de565b5b602082029050602081019050919050565b6000613725613720846136e6565b61333e565b905080838252602082019050602084028301858111156137485761374761364a565b5b835b81811015613771578061375d8882612d7a565b84526020840193505060208101905061374a565b5050509392505050565b600082601f8301126137905761378f6132d4565b5b81356137a0848260208601613712565b91505092915050565b6000806000606084860312156137c2576137c1612cf1565b5b600084013567ffffffffffffffff8111156137e0576137df612cf6565b5b6137ec868287016136b8565b935050602084013567ffffffffffffffff81111561380d5761380c612cf6565b5b6138198682870161377b565b925050604061382a86828701612d7a565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60c0820160008201516138766000850182613579565b5060208201516138896020850182612f38565b50604082015161389c6040850182612f38565b5060608201516138af6060850182612f38565b5060808201516138c26080850182612f47565b5060a08201516138d560a0850182612f47565b50505050565b60006138e78383613860565b60c08301905092915050565b6000602082019050919050565b600061390b82613834565b613915818561383f565b935061392083613850565b8060005b8381101561395157815161393888826138db565b9750613943836138f3565b925050600181019050613924565b5085935050505092915050565b600060208201905081810360008301526139788184613900565b905092915050565b600060408201905061399560008301856130fd565b6139a26020830184612ddb565b9392505050565b60008060008060008060c087890312156139c6576139c5612cf1565b5b600087013567ffffffffffffffff8111156139e4576139e3612cf6565b5b6139f089828a016133db565b9650506020613a0189828a01612d7a565b9550506040613a1289828a01612d7a565b9450506060613a2389828a01612d7a565b9350506080613a3489828a01612d7a565b92505060a0613a4589828a01613095565b9150509295509295509295565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a886020836134c7565b9150613a9382613a52565b602082019050919050565b60006020820190508181036000830152613ab781613a7b565b9050919050565b6000604082019050613ad36000830185613001565b613ae060208301846130fd565b9392505050565b600081519050613af68161307e565b92915050565b600060208284031215613b1257613b11612cf1565b5b6000613b2084828501613ae7565b91505092915050565b7f56657374696e67206f7074696f6e20646f6573206e6f74206578697374000000600082015250565b6000613b5f601d836134c7565b9150613b6a82613b29565b602082019050919050565b60006020820190508181036000830152613b8e81613b52565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f55736572206973206e6f7420696e2077686974656c6973740000000000000000600082015250565b6000613bfa6018836134c7565b9150613c0582613bc4565b602082019050919050565b60006020820190508181036000830152613c2981613bed565b9050919050565b7f5374726174656779206973206e6f74207265766f6361626c6500000000000000600082015250565b6000613c666019836134c7565b9150613c7182613c30565b602082019050919050565b60006020820190508181036000830152613c9581613c59565b9050919050565b7f616c7265616479207265766f6b65640000000000000000000000000000000000600082015250565b6000613cd2600f836134c7565b9150613cdd82613c9c565b602082019050919050565b60006020820190508181036000830152613d0181613cc5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d4f57607f821691505b60208210811415613d6357613d62613d08565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613da382612d59565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613dd657613dd5613d69565b5b600182019050919050565b7f57686974656c69737420616c726561647920617661696c61626c650000000000600082015250565b6000613e17601b836134c7565b9150613e2282613de1565b602082019050919050565b60006020820190508181036000830152613e4681613e0a565b9050919050565b7f537472617465677920646f6573206e6f74206578697374000000000000000000600082015250565b6000613e836017836134c7565b9150613e8e82613e4d565b602082019050919050565b60006020820190508181036000830152613eb281613e76565b9050919050565b600081519050613ec881612d63565b92915050565b600060208284031215613ee457613ee3612cf1565b5b6000613ef284828501613eb9565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613f31601f836134c7565b9150613f3c82613efb565b602082019050919050565b60006020820190508181036000830152613f6081613f24565b9050919050565b7f557365722069732064697361626c65642066726f6d20636c61696d696e67207460008201527f6f6b656e00000000000000000000000000000000000000000000000000000000602082015250565b6000613fc36024836134c7565b9150613fce82613f67565b604082019050919050565b60006020820190508181036000830152613ff281613fb6565b9050919050565b7f5a65726f20616d6f756e7420746f20636c61696d000000000000000000000000600082015250565b600061402f6014836134c7565b915061403a82613ff9565b602082019050919050565b6000602082019050818103600083015261405e81614022565b9050919050565b600060408201905061407a60008301856130fd565b61408760208301846130fd565b9392505050565b7f53697a6573206f6620696e7075747320646f206e6f74206d6174636800000000600082015250565b60006140c4601c836134c7565b91506140cf8261408e565b602082019050919050565b600060208201905081810360008301526140f3816140b7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141566026836134c7565b9150614161826140fa565b604082019050919050565b6000602082019050818103600083015261418581614149565b9050919050565b600061419782612d59565b91506141a283612d59565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141d7576141d6613d69565b5b828201905092915050565b60006141ed82612d59565b91506141f883612d59565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561423157614230613d69565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061427682612d59565b915061428183612d59565b9250826142915761429061423c565b5b828204905092915050565b60006142a782612d59565b91506142b283612d59565b9250828210156142c5576142c4613d69565b5b82820390509291505056fea264697066735822122021089f5b28d488fcd7aaa125626965973dcdcf8416e573370dc1241e99610dee64736f6c6343000808003300000000000000000000000010dc55157cfcf77e063c7b2d0e0ea2aba8b8c257
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c80639627e1f7116100de578063c47c9f3c11610097578063e54b17ba11610071578063e54b17ba146104e9578063ea0cdeff14610519578063f2fde38b14610538578063ffbd30bc1461055457610173565b8063c47c9f3c14610459578063c5460e7114610489578063cecd8b0a146104b957610173565b80639627e1f71461033457806397d21c1e14610364578063993b189314610394578063a19d21b0146103c9578063a5902fac146103f9578063afee1ff11461042957610173565b806340349ced1161013057806340349ced1461027257806369f1f0521461028e5780636abfd407146102be578063715018a6146102ee57806379bf4a63146102f85780638da5cb5b1461031657610173565b80631072cbea14610178578063144fa6d7146101a857806320d154da146101d857806320f6b0a9146101f457806321df0da7146102245780633801381b14610242575b600080fd5b610192600480360381019061018d9190612d8f565b610584565b60405161019f9190612dea565b60405180910390f35b6101c260048036038101906101bd9190612e05565b6106aa565b6040516101cf9190612dea565b60405180910390f35b6101f260048036038101906101ed9190612e32565b610772565b005b61020e60048036038101906102099190612e72565b610ac8565b60405161021b9190612fdf565b60405180910390f35b61022c610cc2565b6040516102399190613010565b60405180910390f35b61025c6004803603810190610257919061302b565b610cec565b6040516102699190612dea565b60405180910390f35b61028c600480360381019061028791906130aa565b610f30565b005b6102a860048036038101906102a39190612e32565b6111cd565b6040516102b5919061310c565b60405180910390f35b6102d860048036038101906102d39190613127565b6111e1565b6040516102e59190612dea565b60405180910390f35b6102f6611290565b005b610300611318565b60405161030d91906132b2565b60405180910390f35b61031e6113c9565b60405161032b9190613010565b60405180910390f35b61034e6004803603810190610349919061302b565b6113f2565b60405161035b9190612dea565b60405180910390f35b61037e60048036038101906103799190613409565b61172f565b60405161038b9190612dea565b60405180910390f35b6103ae60048036038101906103a99190612e72565b611895565b6040516103c096959493929190613511565b60405180910390f35b6103e360048036038101906103de9190612e05565b611976565b6040516103f0919061310c565b60405180910390f35b610413600480360381019061040e9190612e32565b611a0d565b6040516104209190612dea565b60405180910390f35b610443600480360381019061043e9190612e32565b611d18565b6040516104509190612dea565b60405180910390f35b610473600480360381019061046e9190612e32565b611d95565b6040516104809190613603565b60405180910390f35b6104a3600480360381019061049e9190612e32565b612007565b6040516104b0919061310c565b60405180910390f35b6104d360048036038101906104ce91906137a9565b61201b565b6040516104e09190612dea565b60405180910390f35b61050360048036038101906104fe9190612e72565b612148565b604051610510919061395e565b60405180910390f35b6105216122bf565b60405161052f929190613980565b60405180910390f35b610552600480360381019061054d9190612e05565b6122de565b005b61056e600480360381019061056991906139a9565b6123d6565b60405161057b9190612dea565b60405180910390f35b600061058e6124f2565b73ffffffffffffffffffffffffffffffffffffffff166105ac6113c9565b73ffffffffffffffffffffffffffffffffffffffff1614610602576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105f990613a9e565b60405180910390fd5b600083905060008173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61062d6113c9565b866040518363ffffffff1660e01b815260040161064b929190613abe565b602060405180830381600087803b15801561066557600080fd5b505af1158015610679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069d9190613afc565b9050809250505092915050565b60006106b46124f2565b73ffffffffffffffffffffffffffffffffffffffff166106d26113c9565b73ffffffffffffffffffffffffffffffffffffffff1614610728576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071f90613a9e565b60405180910390fd5b81600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b61077a6124f2565b73ffffffffffffffffffffffffffffffffffffffff166107986113c9565b73ffffffffffffffffffffffffffffffffffffffff16146107ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e590613a9e565b60405180910390fd5b81816004805490508210610837576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082e90613b75565b60405180910390fd5b6004828154811061084b5761084a613b95565b5b906000526020600020906008020160060160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff166108e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e090613c10565b60405180910390fd5b6000600485815481106108ff576108fe613b95565b5b906000526020600020906008020160060160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060006004868154811061096957610968613b95565b5b9060005260206000209060080201600501828154811061098c5761098b613b95565b5b90600052602060002090600502019050600486815481106109b0576109af613b95565b5b906000526020600020906008020160070160009054906101000a900460ff16610a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0590613c7c565b60405180910390fd5b8060040160009054906101000a900460ff1615610a60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5790613ce8565b60405180910390fd5b60018160040160006101000a81548160ff0219169083151502179055508473ffffffffffffffffffffffffffffffffffffffff167fb6fa8b8bd5eab60f292eca876e3ef90722275b785309d84b1de113ce0b8c4e7460405160405180910390a2505050505050565b610ad0612bbc565b816004805490508110610b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0f90613b75565b60405180910390fd5b6040518060c0016040528060048581548110610b3757610b36613b95565b5b90600052602060002090600802016000018054610b5390613d37565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7f90613d37565b8015610bcc5780601f10610ba157610100808354040283529160200191610bcc565b820191906000526020600020905b815481529060010190602001808311610baf57829003601f168201915b5050505050815260200160048581548110610bea57610be9613b95565b5b906000526020600020906008020160010154815260200160048581548110610c1557610c14613b95565b5b906000526020600020906008020160020154815260200160048581548110610c4057610c3f613b95565b5b906000526020600020906008020160030154815260200160048581548110610c6b57610c6a613b95565b5b906000526020600020906008020160040154815260200160048581548110610c9657610c95613b95565b5b906000526020600020906008020160070160009054906101000a900460ff161515815250915050919050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000610cf66124f2565b73ffffffffffffffffffffffffffffffffffffffff16610d146113c9565b73ffffffffffffffffffffffffffffffffffffffff1614610d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6190613a9e565b60405180910390fd5b81846004805490508210610db3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610daa90613b75565b60405180910390fd5b60048281548110610dc757610dc6613b95565b5b906000526020600020906008020160060160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c90613c10565b60405180910390fd5b600060048581548110610e7b57610e7a613b95565b5b906000526020600020906008020160060160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600060048681548110610ee557610ee4613b95565b5b90600052602060002090600802016005018281548110610f0857610f07613b95565b5b9060005260206000209060050201905086816001018190555060019450505050509392505050565b610f386124f2565b73ffffffffffffffffffffffffffffffffffffffff16610f566113c9565b73ffffffffffffffffffffffffffffffffffffffff1614610fac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa390613a9e565b60405180910390fd5b82826004805490508210610ff5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fec90613b75565b60405180910390fd5b6004828154811061100957611008613b95565b5b906000526020600020906008020160060160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff166110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e90613c10565b60405180910390fd5b6000600486815481106110bd576110bc613b95565b5b906000526020600020906008020160060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060006004878154811061112757611126613b95565b5b9060005260206000209060080201600501828154811061114a57611149613b95565b5b90600052602060002090600502019050848160040160016101000a81548160ff0219169083151502179055508573ffffffffffffffffffffffffffffffffffffffff167f6303039f3f903247906337ae51ea67063408be3dbc7a2f517044e91404293a61866040516111bc9190612dea565b60405180910390a250505050505050565b60006111d983836124fa565b905092915050565b60006111eb6124f2565b73ffffffffffffffffffffffffffffffffffffffff166112096113c9565b73ffffffffffffffffffffffffffffffffffffffff161461125f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125690613a9e565b60405180910390fd5b8260026000018190555081600260010160006101000a81548160ff0219169083151502179055506001905092915050565b6112986124f2565b73ffffffffffffffffffffffffffffffffffffffff166112b66113c9565b73ffffffffffffffffffffffffffffffffffffffff161461130c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130390613a9e565b60405180910390fd5b61131660006128ca565b565b6060600060048054905067ffffffffffffffff81111561133b5761133a6132de565b5b60405190808252806020026020018201604052801561137457816020015b611361612bbc565b8152602001906001900390816113595790505b50905060005b6004805490508110156113c15761139081610ac8565b8282815181106113a3576113a2613b95565b5b602002602001018190525080806113b990613d98565b91505061137a565b508091505090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60006113fc6124f2565b73ffffffffffffffffffffffffffffffffffffffff1661141a6113c9565b73ffffffffffffffffffffffffffffffffffffffff1614611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146790613a9e565b60405180910390fd5b8160048054905081106114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90613b75565b60405180910390fd5b6000600484815481106114ce576114cd613b95565b5b906000526020600020906008020160060160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090508060010160009054906101000a900460ff1615611570576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156790613e2d565b60405180910390fd5b60006004858154811061158657611585613b95565b5b9060005260206000209060080201600501905060018260010160006101000a81548160ff02191690831515021790555080805490508260000181905550806040518060c001604052808973ffffffffffffffffffffffffffffffffffffffff1681526020018881526020016000815260200142815260200160001515815260200160001515815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a08201518160040160016101000a81548160ff02191690831515021790555050508673ffffffffffffffffffffffffffffffffffffffff167fe463fa6bdecb16f96f58191d902152633214e760ea443684105a7eef1ad16b9d60405160405180910390a2600193505050509392505050565b60006117396124f2565b73ffffffffffffffffffffffffffffffffffffffff166117576113c9565b73ffffffffffffffffffffffffffffffffffffffff16146117ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a490613a9e565b60405180910390fd5b60048054905088106117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb90613e99565b60405180910390fd5b60006004898154811061180a57611809613b95565b5b9060005260206000209060080201905061182d878761298e90919063ffffffff16565b81600101819055508781600001908051906020019061184d929190612bf4565b50858160020181905550848160030181905550838160040181905550828160070160006101000a81548160ff0219169083151502179055506001915050979650505050505050565b600481815481106118a557600080fd5b90600052602060002090600802016000915090508060000180546118c890613d37565b80601f01602080910402602001604051908101604052809291908181526020018280546118f490613d37565b80156119415780601f1061191657610100808354040283529160200191611941565b820191906000526020600020905b81548152906001019060200180831161192457829003601f168201915b5050505050908060010154908060020154908060030154908060040154908060070160009054906101000a900460ff16905086565b6000808290508073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016119b59190613010565b60206040518083038186803b1580156119cd57600080fd5b505afa1580156119e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a059190613ece565b915050919050565b600060026001541415611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c90613f47565b60405180910390fd5b6002600181905550600060048481548110611a7357611a72613b95565b5b906000526020600020906008020160060160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050600060048581548110611add57611adc613b95565b5b90600052602060002090600802016005018281548110611b0057611aff613b95565b5b906000526020600020906005020190508060040160019054906101000a900460ff1615611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990613fd9565b60405180910390fd5b6000611b6e86866129a4565b905060008111611bb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611baa90614045565b60405180910390fd5b600260010160009054906101000a900460ff168015611bd6575060026000015481115b15611be45760026000015490505b611bfb81836002015461298e90919063ffffffff16565b8260020181905550600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb86836040518363ffffffff1660e01b8152600401611c60929190613abe565b602060405180830381600087803b158015611c7a57600080fd5b505af1158015611c8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb29190613afc565b50858573ffffffffffffffffffffffffffffffffffffffff167f45c072aa05b9853b5a993de7a28bc332ee01404a628cec1a23ce0f659f842ef18342604051611cfc929190614065565b60405180910390a3600193505050506001808190555092915050565b600060048381548110611d2e57611d2d613b95565b5b906000526020600020906008020160060160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16905092915050565b611d9d612c7a565b82826004805490508210611de6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ddd90613b75565b60405180910390fd5b60048281548110611dfa57611df9613b95565b5b906000526020600020906008020160060160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f90613c10565b60405180910390fd5b600060048681548110611eae57611ead613b95565b5b906000526020600020906008020160060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060048681548110611f1657611f15613b95565b5b90600052602060002090600802016005018181548110611f3957611f38613b95565b5b90600052602060002090600502016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581526020016004820160019054906101000a900460ff161515151581525050935050505092915050565b600061201383836129a4565b905092915050565b60006120256124f2565b73ffffffffffffffffffffffffffffffffffffffff166120436113c9565b73ffffffffffffffffffffffffffffffffffffffff1614612099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209090613a9e565b60405180910390fd5b82518451146120dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d4906140da565b60405180910390fd5b60005b845181101561213c576121288582815181106120ff576120fe613b95565b5b602002602001015185838151811061211a57612119613b95565b5b6020026020010151856113f2565b50808061213490613d98565b9150506120e0565b50600190509392505050565b6060816004805490508110612192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218990613b75565b60405180910390fd5b600483815481106121a6576121a5613b95565b5b9060005260206000209060080201600501805480602002602001604051908101604052809291908181526020016000905b828210156122b357838290600052602060002090600502016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581526020016004820160019054906101000a900460ff161515151581525050815260200190600101906121d7565b50505050915050919050565b60028060000154908060010160009054906101000a900460ff16905082565b6122e66124f2565b73ffffffffffffffffffffffffffffffffffffffff166123046113c9565b73ffffffffffffffffffffffffffffffffffffffff161461235a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161235190613a9e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c19061416c565b60405180910390fd5b6123d3816128ca565b50565b60006123e06124f2565b73ffffffffffffffffffffffffffffffffffffffff166123fe6113c9565b73ffffffffffffffffffffffffffffffffffffffff1614612454576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244b90613a9e565b60405180910390fd5b60006004600181600181540180825580915050039060005260206000209060080201905061248b878761298e90919063ffffffff16565b8160010181905550878160000190805190602001906124ab929190612bf4565b50858160020181905550848160030181905550838160040181905550828160070160006101000a81548160ff02191690831515021790555060019150509695505050505050565b600033905090565b600082826004805490508210612545576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253c90613b75565b60405180910390fd5b6004828154811061255957612558613b95565b5b906000526020600020906008020160060160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff166125f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ee90613c10565b60405180910390fd5b60006004868154811061260d5761260c613b95565b5b906000526020600020906008020160060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154905060006004878154811061267757612676613b95565b5b9060005260206000209060080201600501828154811061269a57612699613b95565b5b90600052602060002090600502016040518060c00160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016001820154815260200160028201548152602001600382015481526020016004820160009054906101000a900460ff161515151581526020016004820160019054906101000a900460ff161515151581525050905060006004888154811061277557612774613b95565b5b9060005260206000209060080201905060006127b66103e86127a884600401548660200151612b7a90919063ffffffff16565b612b9090919063ffffffff16565b90508260800151156127d25782602001519650505050506128c2565b81600201544210156127eb5760009650505050506128c2565b816002015442101580156128025750816001015442105b1561281357809650505050506128c2565b81600101544210158015612840575061283d8260030154836001015461298e90919063ffffffff16565b42105b156128b657600061285e828560200151612ba690919063ffffffff16565b905061289f8360030154612891612882866001015442612ba690919063ffffffff16565b84612b7a90919063ffffffff16565b612b9090919063ffffffff16565b826128aa919061418c565b975050505050506128c2565b82602001519650505050505b505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000818361299c919061418c565b905092915050565b6000828260048054905082106129ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e690613b75565b60405180910390fd5b60048281548110612a0357612a02613b95565b5b906000526020600020906008020160060160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16612aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9890613c10565b60405180910390fd5b600060048681548110612ab757612ab6613b95565b5b906000526020600020906008020160060160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050612b6f60048781548110612b2257612b21613b95565b5b90600052602060002090600802016005018281548110612b4557612b44613b95565b5b906000526020600020906005020160020154612b6188886124fa565b612ba690919063ffffffff16565b935050505092915050565b60008183612b8891906141e2565b905092915050565b60008183612b9e919061426b565b905092915050565b60008183612bb4919061429c565b905092915050565b6040518060c0016040528060608152602001600081526020016000815260200160008152602001600081526020016000151581525090565b828054612c0090613d37565b90600052602060002090601f016020900481019282612c225760008555612c69565b82601f10612c3b57805160ff1916838001178555612c69565b82800160010185558215612c69579182015b82811115612c68578251825591602001919060010190612c4d565b5b509050612c769190612cca565b5090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600081526020016000151581526020016000151581525090565b5b80821115612ce3576000816000905550600101612ccb565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d2682612cfb565b9050919050565b612d3681612d1b565b8114612d4157600080fd5b50565b600081359050612d5381612d2d565b92915050565b6000819050919050565b612d6c81612d59565b8114612d7757600080fd5b50565b600081359050612d8981612d63565b92915050565b60008060408385031215612da657612da5612cf1565b5b6000612db485828601612d44565b9250506020612dc585828601612d7a565b9150509250929050565b60008115159050919050565b612de481612dcf565b82525050565b6000602082019050612dff6000830184612ddb565b92915050565b600060208284031215612e1b57612e1a612cf1565b5b6000612e2984828501612d44565b91505092915050565b60008060408385031215612e4957612e48612cf1565b5b6000612e5785828601612d7a565b9250506020612e6885828601612d44565b9150509250929050565b600060208284031215612e8857612e87612cf1565b5b6000612e9684828501612d7a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ed9578082015181840152602081019050612ebe565b83811115612ee8576000848401525b50505050565b6000601f19601f8301169050919050565b6000612f0a82612e9f565b612f148185612eaa565b9350612f24818560208601612ebb565b612f2d81612eee565b840191505092915050565b612f4181612d59565b82525050565b612f5081612dcf565b82525050565b600060c0830160008301518482036000860152612f738282612eff565b9150506020830151612f886020860182612f38565b506040830151612f9b6040860182612f38565b506060830151612fae6060860182612f38565b506080830151612fc16080860182612f38565b5060a0830151612fd460a0860182612f47565b508091505092915050565b60006020820190508181036000830152612ff98184612f56565b905092915050565b61300a81612d1b565b82525050565b60006020820190506130256000830184613001565b92915050565b60008060006060848603121561304457613043612cf1565b5b600061305286828701612d44565b935050602061306386828701612d7a565b925050604061307486828701612d7a565b9150509250925092565b61308781612dcf565b811461309257600080fd5b50565b6000813590506130a48161307e565b92915050565b6000806000606084860312156130c3576130c2612cf1565b5b60006130d186828701612d7a565b93505060206130e286828701612d44565b92505060406130f386828701613095565b9150509250925092565b61310681612d59565b82525050565b600060208201905061312160008301846130fd565b92915050565b6000806040838503121561313e5761313d612cf1565b5b600061314c85828601612d7a565b925050602061315d85828601613095565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600060c08301600083015184820360008601526131b08282612eff565b91505060208301516131c56020860182612f38565b5060408301516131d86040860182612f38565b5060608301516131eb6060860182612f38565b5060808301516131fe6080860182612f38565b5060a083015161321160a0860182612f47565b508091505092915050565b60006132288383613193565b905092915050565b6000602082019050919050565b600061324882613167565b6132528185613172565b93508360208202850161326485613183565b8060005b858110156132a05784840389528151613281858261321c565b945061328c83613230565b925060208a01995050600181019050613268565b50829750879550505050505092915050565b600060208201905081810360008301526132cc818461323d565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61331682612eee565b810181811067ffffffffffffffff82111715613335576133346132de565b5b80604052505050565b6000613348612ce7565b9050613354828261330d565b919050565b600067ffffffffffffffff821115613374576133736132de565b5b61337d82612eee565b9050602081019050919050565b82818337600083830152505050565b60006133ac6133a784613359565b61333e565b9050828152602081018484840111156133c8576133c76132d9565b5b6133d384828561338a565b509392505050565b600082601f8301126133f0576133ef6132d4565b5b8135613400848260208601613399565b91505092915050565b600080600080600080600060e0888a03121561342857613427612cf1565b5b60006134368a828b01612d7a565b975050602088013567ffffffffffffffff81111561345757613456612cf6565b5b6134638a828b016133db565b96505060406134748a828b01612d7a565b95505060606134858a828b01612d7a565b94505060806134968a828b01612d7a565b93505060a06134a78a828b01612d7a565b92505060c06134b88a828b01613095565b91505092959891949750929550565b600082825260208201905092915050565b60006134e382612e9f565b6134ed81856134c7565b93506134fd818560208601612ebb565b61350681612eee565b840191505092915050565b600060c082019050818103600083015261352b81896134d8565b905061353a60208301886130fd565b61354760408301876130fd565b61355460608301866130fd565b61356160808301856130fd565b61356e60a0830184612ddb565b979650505050505050565b61358281612d1b565b82525050565b60c08201600082015161359e6000850182613579565b5060208201516135b16020850182612f38565b5060408201516135c46040850182612f38565b5060608201516135d76060850182612f38565b5060808201516135ea6080850182612f47565b5060a08201516135fd60a0850182612f47565b50505050565b600060c0820190506136186000830184613588565b92915050565b600067ffffffffffffffff821115613639576136386132de565b5b602082029050602081019050919050565b600080fd5b600061366261365d8461361e565b61333e565b905080838252602082019050602084028301858111156136855761368461364a565b5b835b818110156136ae578061369a8882612d44565b845260208401935050602081019050613687565b5050509392505050565b600082601f8301126136cd576136cc6132d4565b5b81356136dd84826020860161364f565b91505092915050565b600067ffffffffffffffff821115613701576137006132de565b5b602082029050602081019050919050565b6000613725613720846136e6565b61333e565b905080838252602082019050602084028301858111156137485761374761364a565b5b835b81811015613771578061375d8882612d7a565b84526020840193505060208101905061374a565b5050509392505050565b600082601f8301126137905761378f6132d4565b5b81356137a0848260208601613712565b91505092915050565b6000806000606084860312156137c2576137c1612cf1565b5b600084013567ffffffffffffffff8111156137e0576137df612cf6565b5b6137ec868287016136b8565b935050602084013567ffffffffffffffff81111561380d5761380c612cf6565b5b6138198682870161377b565b925050604061382a86828701612d7a565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b60c0820160008201516138766000850182613579565b5060208201516138896020850182612f38565b50604082015161389c6040850182612f38565b5060608201516138af6060850182612f38565b5060808201516138c26080850182612f47565b5060a08201516138d560a0850182612f47565b50505050565b60006138e78383613860565b60c08301905092915050565b6000602082019050919050565b600061390b82613834565b613915818561383f565b935061392083613850565b8060005b8381101561395157815161393888826138db565b9750613943836138f3565b925050600181019050613924565b5085935050505092915050565b600060208201905081810360008301526139788184613900565b905092915050565b600060408201905061399560008301856130fd565b6139a26020830184612ddb565b9392505050565b60008060008060008060c087890312156139c6576139c5612cf1565b5b600087013567ffffffffffffffff8111156139e4576139e3612cf6565b5b6139f089828a016133db565b9650506020613a0189828a01612d7a565b9550506040613a1289828a01612d7a565b9450506060613a2389828a01612d7a565b9350506080613a3489828a01612d7a565b92505060a0613a4589828a01613095565b9150509295509295509295565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a886020836134c7565b9150613a9382613a52565b602082019050919050565b60006020820190508181036000830152613ab781613a7b565b9050919050565b6000604082019050613ad36000830185613001565b613ae060208301846130fd565b9392505050565b600081519050613af68161307e565b92915050565b600060208284031215613b1257613b11612cf1565b5b6000613b2084828501613ae7565b91505092915050565b7f56657374696e67206f7074696f6e20646f6573206e6f74206578697374000000600082015250565b6000613b5f601d836134c7565b9150613b6a82613b29565b602082019050919050565b60006020820190508181036000830152613b8e81613b52565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f55736572206973206e6f7420696e2077686974656c6973740000000000000000600082015250565b6000613bfa6018836134c7565b9150613c0582613bc4565b602082019050919050565b60006020820190508181036000830152613c2981613bed565b9050919050565b7f5374726174656779206973206e6f74207265766f6361626c6500000000000000600082015250565b6000613c666019836134c7565b9150613c7182613c30565b602082019050919050565b60006020820190508181036000830152613c9581613c59565b9050919050565b7f616c7265616479207265766f6b65640000000000000000000000000000000000600082015250565b6000613cd2600f836134c7565b9150613cdd82613c9c565b602082019050919050565b60006020820190508181036000830152613d0181613cc5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613d4f57607f821691505b60208210811415613d6357613d62613d08565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613da382612d59565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613dd657613dd5613d69565b5b600182019050919050565b7f57686974656c69737420616c726561647920617661696c61626c650000000000600082015250565b6000613e17601b836134c7565b9150613e2282613de1565b602082019050919050565b60006020820190508181036000830152613e4681613e0a565b9050919050565b7f537472617465677920646f6573206e6f74206578697374000000000000000000600082015250565b6000613e836017836134c7565b9150613e8e82613e4d565b602082019050919050565b60006020820190508181036000830152613eb281613e76565b9050919050565b600081519050613ec881612d63565b92915050565b600060208284031215613ee457613ee3612cf1565b5b6000613ef284828501613eb9565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613f31601f836134c7565b9150613f3c82613efb565b602082019050919050565b60006020820190508181036000830152613f6081613f24565b9050919050565b7f557365722069732064697361626c65642066726f6d20636c61696d696e67207460008201527f6f6b656e00000000000000000000000000000000000000000000000000000000602082015250565b6000613fc36024836134c7565b9150613fce82613f67565b604082019050919050565b60006020820190508181036000830152613ff281613fb6565b9050919050565b7f5a65726f20616d6f756e7420746f20636c61696d000000000000000000000000600082015250565b600061402f6014836134c7565b915061403a82613ff9565b602082019050919050565b6000602082019050818103600083015261405e81614022565b9050919050565b600060408201905061407a60008301856130fd565b61408760208301846130fd565b9392505050565b7f53697a6573206f6620696e7075747320646f206e6f74206d6174636800000000600082015250565b60006140c4601c836134c7565b91506140cf8261408e565b602082019050919050565b600060208201905081810360008301526140f3816140b7565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006141566026836134c7565b9150614161826140fa565b604082019050919050565b6000602082019050818103600083015261418581614149565b9050919050565b600061419782612d59565b91506141a283612d59565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156141d7576141d6613d69565b5b828201905092915050565b60006141ed82612d59565b91506141f883612d59565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561423157614230613d69565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061427682612d59565b915061428183612d59565b9250826142915761429061423c565b5b828204905092915050565b60006142a782612d59565b91506142b283612d59565b9250828210156142c5576142c4613d69565b5b82820390509291505056fea264697066735822122021089f5b28d488fcd7aaa125626965973dcdcf8416e573370dc1241e99610dee64736f6c63430008080033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000010dc55157cfcf77e063c7b2d0e0ea2aba8b8c257
-----Decoded View---------------
Arg [0] : token (address): 0x10Dc55157CFCf77E063C7b2D0e0eA2abA8B8C257
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000010dc55157cfcf77e063c7b2d0e0ea2aba8b8c257
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
BSC | 31.72% | $0.010176 | 100,818.7351 | $1,025.91 | |
BSC | 18.22% | $0.999902 | 589.2095 | $589.15 | |
BSC | 11.22% | $1 | 363 | $363.04 | |
BSC | 10.75% | $0.000345 | 1,007,808.6296 | $347.82 | |
BSC | 0.16% | $0.001291 | 4,000 | $5.16 | |
ETH | 26.86% | $0.012041 | 72,138.0341 | $868.58 | |
ETH | 0.65% | $1,645.94 | 0.0127 | $20.87 | |
POL | 0.43% | $0.999925 | 13.7614 | $13.76 | |
POL | <0.01% | $0.18632 | 0.003 | $0.000559 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.