Overview
FTM Balance
0 FTM
FTM Value
$0.00More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
41798141 | 936 days ago | Contract Creation | 0 FTM |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
Manager
Compiler Version
v0.8.0+commit.c7dfd78e
Optimization Enabled:
Yes with 200 runs
Other Settings:
byzantium EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// Openzeppelin imports import '@openzeppelin/contracts/access/AccessControl.sol'; import '@openzeppelin/contracts/token/ERC20/ERC20.sol'; import '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol'; /// Local imports import './PVTToken.sol'; import './IStrategy.sol'; /** * @title Implementation of the SyncDao Manager */ contract Manager is AccessControl { using SafeERC20 for ERC20; using SafeERC20 for PVTToken; /// Public types struct Stake { uint256 pvtAmount; uint256 lastBlockNumber; uint256 lastTotalWork; uint256 rewardsTaken; } struct Affiliate { address affiliateAddress; uint256 percentage; uint256 ownerPercentage; uint256 charityPercentage; bool valid; } /// Public variables uint256 public constant RATE_COEF = 100; mapping(address => Affiliate) public affiliateMapping; address public defaultAffiliate; address public charity; uint256 public affiliatePercentage = 10; uint256 public ownerPercentage = 5; uint256 public charityPercentage = 5; uint256 public tokenRateT = 1; uint256 public tokenRateB = 1; PVTToken public pvtToken; IStrategy public strategy; mapping(address => Stake) public stakesMapping; address[] private stakersLookup; Stake public ownerStake; uint256 public totalStableTokenAmount = 0; uint256 public lastBlockNumber = 0; uint256 public lastTotalWork = 0; uint256 public rewardsTaken = 0; uint256 public totalPVTAmount = 0; /// Events event Minted(address indexed minter, uint256 pvtAmount); event Staked(address indexed staker, uint256 pvtAmount); event Unstaked(address indexed staker, uint256 pvtAmount); event RewardTaken(address indexed staker, uint256 amount); /// Constructor constructor(address pvtTokenAddress_, address initialStrategyAddress_, address charityAddress_) { lastBlockNumber = block.number; strategy = IStrategy(initialStrategyAddress_); require(address(0x0) != address(strategy), 'Strategy cannot be null'); pvtToken = PVTToken(pvtTokenAddress_); _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); defaultAffiliate = _msgSender(); changeTokenRate(RATE_COEF); charity = charityAddress_; } /// Public member functions function getTokenRate() view external returns (uint256) { uint256 pd = pvtToken.decimals(); uint256 sd = ERC20(strategy.vaultTokenAddress()).decimals(); if (pd >= sd) { return tokenRateT / (10 ** (pd - sd)); } else { return tokenRateT; } } function changeTokenRate(uint256 rate_) public onlyRole(DEFAULT_ADMIN_ROLE) { require(0 < rate_, 'Token rate cannot be 0'); uint256 pd = pvtToken.decimals(); uint256 sd = ERC20(strategy.vaultTokenAddress()).decimals(); if (pd >= sd) { tokenRateT = rate_ * (10 ** (pd - sd)); tokenRateB = RATE_COEF; } else { tokenRateT = rate_; tokenRateB = RATE_COEF * (10 ** (sd - pd)); } } function changeAffiliatePercentage(uint256 percentage_) external onlyRole(DEFAULT_ADMIN_ROLE) { require(percentage_ <= 100, 'Percentage must be from 0 to 100'); affiliatePercentage = percentage_; } function changeCharityPercentage(uint256 percentage_) external onlyRole(DEFAULT_ADMIN_ROLE) { require(percentage_ <= 100, 'Percentage must be from 0 to 100'); charityPercentage = percentage_; } function changeOwnerPercentage(uint256 percentage_) external onlyRole(DEFAULT_ADMIN_ROLE) { require(percentage_ <= 100, 'Percentage must be from 0 to 100'); ownerPercentage = percentage_; } function changeDefaultAffiliate(address newDefaultAffiliateAddress_) external onlyRole(DEFAULT_ADMIN_ROLE) { require(address(0x0) != newDefaultAffiliateAddress_, 'defaultAffiliate cannot be null'); defaultAffiliate = newDefaultAffiliateAddress_; } function changeCharity(address newCharityAddress_) external onlyRole(DEFAULT_ADMIN_ROLE) { require(address(0x0) != newCharityAddress_, 'charity cannot be null'); charity = newCharityAddress_; } function getStakers() external view returns(address[] memory) { return stakersLookup; } function changeStrategy(address newStrategyAddress_) external onlyRole(DEFAULT_ADMIN_ROLE) { require(address(0x0) != newStrategyAddress_, 'strategy cannot be null'); strategy = IStrategy(newStrategyAddress_); } function mintPVTToken(uint256 amount_, address erc20Token_, address affiliateAddress_, bool autoStake_) external { require(affiliateAddress_ != _msgSender(), 'User cannot be affiliate'); uint256 stableTokenAmount = ERC20(erc20Token_).allowance(_msgSender(), address(this)); if (0 != amount_) { require(amount_ <= stableTokenAmount, 'There is no allowance'); stableTokenAmount = amount_; } require(0 != stableTokenAmount, 'There is no allowance'); ERC20(erc20Token_).safeTransferFrom(_msgSender(), address(this), stableTokenAmount); (bool success, bytes memory result) = address(strategy).delegatecall(abi.encodeWithSignature( 'farm(address,uint256)', erc20Token_, stableTokenAmount)); require(success, 'Delegate call failed'); stableTokenAmount = abi.decode(result, (uint256)); _mintPVTToken(stableTokenAmount, autoStake_); _setAffiliateIfNeeded(_msgSender(), affiliateAddress_); } function stake(uint256 amount_, address affiliateAddress_) external { require(affiliateAddress_ != _msgSender(), 'User cannot be affiliate'); uint256 pvtAmount = pvtToken.allowance(_msgSender(), address(this)); if (0 != amount_) { require(amount_ <= pvtAmount, 'There is no allowance'); pvtAmount = amount_; } require(0 < pvtAmount, 'There is no allowance'); pvtToken.safeTransferFrom(_msgSender(), address(this), pvtAmount); _stake(_msgSender(), pvtAmount); ownerStake.lastTotalWork += ownerStake.pvtAmount * (block.number - ownerStake.lastBlockNumber); ownerStake.lastBlockNumber = block.number; ownerStake.pvtAmount -= pvtAmount; _setAffiliateIfNeeded(_msgSender(), affiliateAddress_); } function unstake(uint256 amount_) external { require(0 < amount_, 'amount_ cannot be 0'); Stake storage s = stakesMapping[_msgSender()]; require(s.pvtAmount >= amount_, 'Not enough tokens'); pvtToken.safeTransfer(_msgSender(), amount_); uint256 a = estimateReward(_msgSender()); if (0 != a) { _takeReward(a); } s.lastTotalWork += (block.number - s.lastBlockNumber) * s.pvtAmount; s.pvtAmount -= amount_; s.lastBlockNumber = block.number; ownerStake.lastTotalWork += ownerStake.pvtAmount * (block.number - ownerStake.lastBlockNumber); ownerStake.lastBlockNumber = block.number; ownerStake.pvtAmount += amount_; emit Unstaked(_msgSender(), amount_); } function estimateReward(address userAddress_) public view returns (uint256) { return _estimateStakeReward(stakesMapping[userAddress_]); } function takeRewardWithExpectedTokens( address[] memory expectedTokens_, uint256[] memory percentages_, bool autoStake_) external { uint256 amount = estimateReward(_msgSender()); require (0 < amount, 'There is no reward'); _takeReward(amount, expectedTokens_, percentages_, autoStake_); } function takeReward() external { uint256 amount = estimateReward(_msgSender()); require (0 < amount, 'There is no reward'); _takeReward(amount); } function estimateOwnerReward() public view returns (uint256) { return _estimateStakeReward(ownerStake); } function takeOwnerReward(address recipientAddress_) external onlyRole(DEFAULT_ADMIN_ROLE) { require(address(0x0) != address(recipientAddress_), 'recipientAddress_ cannot be null'); uint256 amount = estimateOwnerReward(); require (0 < amount, 'There is no reward'); _delegateTakeRewardIfNeeded(recipientAddress_, strategy.vaultTokenAddress(), amount); ownerStake.rewardsTaken += amount; rewardsTaken += amount; } function takeAllStableTokens(address newPVTTokenAddress_) external onlyRole(DEFAULT_ADMIN_ROLE) { (bool success,) = address(strategy).delegatecall(abi.encodeWithSignature('takeReward(address)', _msgSender())); require(success, 'Delegate call failed'); if (address(0x0) != newPVTTokenAddress_) { pvtToken = PVTToken(newPVTTokenAddress_); _reset(); } } /// Helper private functions function _mintPVTToken(uint256 stableTokenAmount_, bool autoStake_) private { uint256 pvtAmount = stableTokenAmount_ * tokenRateT / tokenRateB; lastTotalWork += totalPVTAmount * (block.number - lastBlockNumber); if (autoStake_) { pvtToken.mint(address(this), pvtAmount); _stake(_msgSender(), pvtAmount); } else { pvtToken.mint(_msgSender(), pvtAmount); ownerStake.lastTotalWork += ownerStake.pvtAmount * (block.number - ownerStake.lastBlockNumber); ownerStake.lastBlockNumber = block.number; ownerStake.pvtAmount += pvtAmount; } totalPVTAmount += pvtAmount; lastBlockNumber = block.number; totalStableTokenAmount += stableTokenAmount_; emit Minted(_msgSender(), pvtAmount); } function _estimateStakeReward(Stake memory stake_) private view returns (uint256) { uint256 e = strategy.estimateReward(address(this)); if (e <= totalStableTokenAmount) { return 0; } uint256 work = stake_.lastTotalWork + stake_.pvtAmount * (block.number - stake_.lastBlockNumber); uint256 Work = lastTotalWork + totalPVTAmount * (block.number - lastBlockNumber); uint256 Amount = e + rewardsTaken - totalStableTokenAmount; uint256 amount = work * Amount / Work; if (amount <= stake_.rewardsTaken) { return 0; } uint256 total = amount - stake_.rewardsTaken; return total > e - totalStableTokenAmount ? e - totalStableTokenAmount : total; } function _setAffiliateIfNeeded(address userAddress_, address affiliateAddress_) private { if (! affiliateMapping[userAddress_].valid) { if (address(0x0) != affiliateAddress_) { affiliateMapping[userAddress_].affiliateAddress = affiliateAddress_; } affiliateMapping[userAddress_].ownerPercentage = ownerPercentage; affiliateMapping[userAddress_].charityPercentage = charityPercentage; affiliateMapping[userAddress_].percentage = affiliatePercentage; affiliateMapping[userAddress_].valid = true; } } function _stake(address userAddress_, uint256 pvtAmount_) private { Stake storage s = stakesMapping[userAddress_]; if (0 == s.lastBlockNumber) { stakersLookup.push(userAddress_); } else { s.lastTotalWork += (block.number - s.lastBlockNumber) * s.pvtAmount; } s.pvtAmount += pvtAmount_; s.lastBlockNumber = block.number; emit Staked(userAddress_, pvtAmount_); } function _takeReward(uint256 amount_) private { require(affiliateMapping[_msgSender()].valid); _distributeReward(amount_, amount_ * affiliateMapping[_msgSender()].ownerPercentage / 100, amount_ * affiliateMapping[_msgSender()].charityPercentage / 100, affiliateMapping[_msgSender()].affiliateAddress, amount_ * affiliateMapping[_msgSender()].percentage / 100); stakesMapping[_msgSender()].rewardsTaken += amount_; rewardsTaken += amount_; emit RewardTaken(_msgSender(), amount_); } function _takeReward(uint256 amount_, address[] memory expectedTokens_, uint256[] memory percentages_, bool autoStake_) private { require(affiliateMapping[_msgSender()].valid); require(0 != expectedTokens_.length, 'lenght of array cannot be 0'); require(expectedTokens_.length == percentages_.length, 'expectedTokens and percentages lenght must be the same'); uint256 ownerAmount = amount_ * affiliateMapping[_msgSender()].ownerPercentage / 100; uint256 charityAmount = amount_ * affiliateMapping[_msgSender()].charityPercentage / 100; uint256 affiliateAmount = amount_ * affiliateMapping[_msgSender()].percentage / 100; uint256 amount = amount_ - affiliateAmount - ownerAmount - charityAmount; uint256 sum = 0; uint256 pSum = 0; for (uint256 i = 0; i < expectedTokens_.length - 1; ++i) { require(address(0x0) != expectedTokens_[i], 'expected token cannot be null'); require(0 != percentages_[i], 'percentage cannot be 0'); uint256 am = amount * percentages_[i] / 100; if (expectedTokens_[i] == address(pvtToken)) { _mintPVTToken(am, autoStake_); } else { _delegateTakeRewardIfNeeded(_msgSender(), expectedTokens_[i], am); } sum += am; pSum += percentages_[i]; } require(address(0x0) != expectedTokens_[expectedTokens_.length - 1], 'expected token cannot be null'); require(0 != percentages_[percentages_.length - 1], 'percentage cannot be 0'); require(100 == pSum + percentages_[percentages_.length - 1], 'sum of percentages must be 100'); if (expectedTokens_[expectedTokens_.length - 1] == address(pvtToken)) { _mintPVTToken(amount - sum, autoStake_); } else { _delegateTakeRewardIfNeeded(_msgSender(), expectedTokens_[expectedTokens_.length - 1], amount - sum); } _distributeReward(ownerAmount + affiliateAmount + charityAmount, ownerAmount, charityAmount, affiliateMapping[_msgSender()].affiliateAddress, affiliateAmount); stakesMapping[_msgSender()].rewardsTaken += amount_; rewardsTaken += amount_; emit RewardTaken(_msgSender(), amount_); } function _distributeReward(uint256 totalAmount_, uint256 ownerAmount_, uint256 charityAmount_, address affiliateAddress_, uint256 affiliateAmount_) private { address vta = strategy.vaultTokenAddress(); _delegateTakeRewardIfNeeded(_msgSender(), vta, totalAmount_ - ownerAmount_ - affiliateAmount_ - charityAmount_); if (address(0x0) == affiliateAddress_) { _delegateTakeRewardIfNeeded(defaultAffiliate, vta, affiliateAmount_ + ownerAmount_); } else { _delegateTakeRewardIfNeeded(defaultAffiliate, vta, ownerAmount_); _delegateTakeRewardIfNeeded(affiliateAddress_, vta, affiliateAmount_); } _delegateTakeRewardIfNeeded(charity, vta, charityAmount_); } function _delegateTakeRewardIfNeeded(address address_, address expectedToken_, uint256 amount_) private { if (0 != amount_) { (bool success,) = address(strategy).delegatecall( abi.encodeWithSignature('takeReward(address,address,uint256)', address_, expectedToken_, amount_)); require(success, 'Delegate call takeReward failed'); } } function _reset() private { affiliatePercentage = 10; ownerPercentage = 5; charityPercentage = 5; changeTokenRate(RATE_COEF); for (uint256 i = 0; i < stakersLookup.length; ++i) { address s = stakersLookup[i]; delete stakesMapping[s]; delete affiliateMapping[s]; } delete stakersLookup; delete ownerStake; totalStableTokenAmount = 0; lastBlockNumber = block.number; lastTotalWork = 0; rewardsTaken = 0; totalPVTAmount = 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /// Openzeppelin imports import '@openzeppelin/contracts/access/AccessControl.sol'; import '@openzeppelin/contracts/token/ERC20/ERC20.sol'; /** * @title Implementation of the PVTToken. * */ contract PVTToken is AccessControl, ERC20 { bytes32 public constant MINTER_ROLE = keccak256('MINTER_ROLE'); constructor() ERC20('Perpetual Vault Token', 'PVT') { _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); } function mint(address to_, uint256 amount_) public onlyRole(MINTER_ROLE) virtual { _mint(to_, amount_); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; interface IStrategy { function farm(address erc20Token_, uint256 amount_) external returns(uint256); function estimateReward(address) view external returns(uint256); function takeReward(address to_, address currency_, uint256 amount_) external; function takeReward(address to_) external; function decimals() view external returns(uint256); function vaultAddress() view external returns(address); function vaultTokenAddress() view external returns(address); function uniswapFactoryAddress() view external returns (address); function uniswapRouterAddress() view external returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// 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; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// 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; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "byzantium", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"pvtTokenAddress_","type":"address"},{"internalType":"address","name":"initialStrategyAddress_","type":"address"},{"internalType":"address","name":"charityAddress_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"pvtAmount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardTaken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"pvtAmount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":false,"internalType":"uint256","name":"pvtAmount","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RATE_COEF","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"affiliateMapping","outputs":[{"internalType":"address","name":"affiliateAddress","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"uint256","name":"ownerPercentage","type":"uint256"},{"internalType":"uint256","name":"charityPercentage","type":"uint256"},{"internalType":"bool","name":"valid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"affiliatePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage_","type":"uint256"}],"name":"changeAffiliatePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCharityAddress_","type":"address"}],"name":"changeCharity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage_","type":"uint256"}],"name":"changeCharityPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newDefaultAffiliateAddress_","type":"address"}],"name":"changeDefaultAffiliate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percentage_","type":"uint256"}],"name":"changeOwnerPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newStrategyAddress_","type":"address"}],"name":"changeStrategy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"rate_","type":"uint256"}],"name":"changeTokenRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"charity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charityPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"defaultAffiliate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"estimateOwnerReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress_","type":"address"}],"name":"estimateReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTotalWork","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"address","name":"erc20Token_","type":"address"},{"internalType":"address","name":"affiliateAddress_","type":"address"},{"internalType":"bool","name":"autoStake_","type":"bool"}],"name":"mintPVTToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ownerPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerStake","outputs":[{"internalType":"uint256","name":"pvtAmount","type":"uint256"},{"internalType":"uint256","name":"lastBlockNumber","type":"uint256"},{"internalType":"uint256","name":"lastTotalWork","type":"uint256"},{"internalType":"uint256","name":"rewardsTaken","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pvtToken","outputs":[{"internalType":"contract PVTToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardsTaken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"address","name":"affiliateAddress_","type":"address"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakesMapping","outputs":[{"internalType":"uint256","name":"pvtAmount","type":"uint256"},{"internalType":"uint256","name":"lastBlockNumber","type":"uint256"},{"internalType":"uint256","name":"lastTotalWork","type":"uint256"},{"internalType":"uint256","name":"rewardsTaken","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategy","outputs":[{"internalType":"contract IStrategy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newPVTTokenAddress_","type":"address"}],"name":"takeAllStableTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipientAddress_","type":"address"}],"name":"takeOwnerReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"takeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"expectedTokens_","type":"address[]"},{"internalType":"uint256[]","name":"percentages_","type":"uint256[]"},{"internalType":"bool","name":"autoStake_","type":"bool"}],"name":"takeRewardWithExpectedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenRateB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenRateT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPVTAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStableTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600a60045560058055600560065560016007556001600855600060115560006012556000601355600060145560006015553480156200004257600080fd5b50604051620046a7380380620046a78339810160408190526200006591620008c5565b43601255600a8054600160a060020a031916600160a060020a03848116919091179182905516620000cd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000c49062000a20565b60405180910390fd5b60098054600160a060020a031916600160a060020a0385161790556200011060006200010164010000000062000181810204565b64010000000062000185810204565b6200012364010000000062000181810204565b60028054600160a060020a031916600160a060020a03929092169190911790556200015860646401000000006200019e810204565b60038054600160a060020a031916600160a060020a03929092169190911790555062000c949050565b3390565b6200019a828264010000000062000450810204565b5050565b6000620001c781620001b864010000000062000181810204565b640100000000620004ec810204565b8160001062000204576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000c49062000a57565b600954604080517f313ce5670000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163313ce567916004808301926020929190829003018186803b1580156200026357600080fd5b505afa15801562000278573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200029e91906200090e565b60ff1690506000600a60009054906101000a9004600160a060020a0316600160a060020a031663df72f0176040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b1580156200031057600080fd5b505afa15801562000325573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200034b9190620008a8565b600160a060020a031663313ce5676040518163ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040160206040518083038186803b158015620003a057600080fd5b505afa158015620003b5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003db91906200090e565b60ff1690508082106200041b57620003f4818362000c02565b6200040190600a62000af8565b6200040d908562000be0565b60075560646008556200044a565b60078490556200042c828262000c02565b6200043990600a62000af8565b6200044690606462000be0565b6008555b50505050565b6200046582826401000000006200059a810204565b6200019a57600082815260208181526040808320600160a060020a03851684529091529020805460ff19166001179055620004a864010000000062000181810204565b600160a060020a031681600160a060020a0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6200050182826401000000006200059a810204565b6200019a576200052a600160a060020a038216601464010000000062001631620005c382021704565b6200054583602064010000000062001631620005c382021704565b6040516020016200055892919062000931565b60408051601f19818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252620000c491600401620009b6565b600091825260208281526040808420600160a060020a0393909316845291905290205460ff1690565b60606000620005d483600262000be0565b620005e190600262000a8e565b67ffffffffffffffff81111562000621577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156200064c576020820181803683370190505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110620006ab577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020010190600160f860020a031916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106200071e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020010190600160f860020a031916908160001a90535060006200074484600262000be0565b6200075190600162000a8e565b90505b600181111562000848577f303132333435363738396162636465660000000000000000000000000000000085600f1660108110620007bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a7f01000000000000000000000000000000000000000000000000000000000000000282828151811062000818577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020010190600160f860020a031916908160001a905350601090940493620008408162000c4b565b905062000754565b50831562000884576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000c490620009eb565b9392505050565b8051600160a060020a0381168114620008a357600080fd5b919050565b600060208284031215620008ba578081fd5b62000884826200088b565b600080600060608486031215620008da578182fd5b620008e5846200088b565b9250620008f5602085016200088b565b915062000905604085016200088b565b90509250925092565b60006020828403121562000920578081fd5b815160ff8116811462000884578182fd5b60007f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000825283516200096b81601785016020880162000c1c565b7f206973206d697373696e6720726f6c65200000000000000000000000000000006017918401918201528351620009aa81602884016020880162000c1c565b01602801949350505050565b6000602082528251806020840152620009d781604085016020870162000c1c565b601f01601f19169190910160400192915050565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b60208082526017908201527f53747261746567792063616e6e6f74206265206e756c6c000000000000000000604082015260600190565b60208082526016908201527f546f6b656e20726174652063616e6e6f74206265203000000000000000000000604082015260600190565b6000821982111562000aa45762000aa462000c65565b500190565b80825b600180861162000abd575062000aef565b81870482111562000ad25762000ad262000c65565b8086161562000ae057918102915b50600290940493800262000aac565b94509492505050565b600062000884600019848460008262000b145750600162000884565b8162000b235750600062000884565b816001811462000b3c576002811462000b475762000b7b565b600191505062000884565b60ff84111562000b5b5762000b5b62000c65565b8360020a91508482111562000b745762000b7462000c65565b5062000884565b5060208310610133831016604e8410600b841016171562000bb3575081810a8381111562000bad5762000bad62000c65565b62000884565b62000bc2848484600162000aa9565b80860482111562000bd75762000bd762000c65565b02949350505050565b600081600019048311821515161562000bfd5762000bfd62000c65565b500290565b60008282101562000c175762000c1762000c65565b500390565b60005b8381101562000c3957818101518382015260200162000c1f565b838111156200044a5750506000910152565b60008162000c5d5762000c5d62000c65565b506000190190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b613a038062000ca46000396000f3fe608060405234801561001057600080fd5b506004361061026c5760003560e060020a900480637acb775711610155578063af659e80116100c7578063d2423f5e1161008b578063d2423f5e146104a3578063d39b7413146104ab578063d547741f146104be578063dcd3725f146104d1578063e0f3a8fa146104e4578063e6de48e0146105085761026c565b8063af659e8014610465578063af6e359e1461046d578063b4106cdf14610480578063b78abb1814610488578063c9577b75146104905761026c565b80639277b84b116101195780639277b84b14610404578063934aa0231461041757806394bbfb561461041f578063a217fddf14610432578063a6fc61cb1461043a578063a8c62e761461045d5761026c565b80637acb7757146103c65780637cde0ee2146103d9578063900e1824146103e157806391a57544146103e957806391d14854146103f15761026c565b80634118d8fc116101ee57806358c1d24a116101b257806358c1d24a1461037557806370eccd061461038857806374331a951461039057806376bd58e614610398578063799d431d146103ab5780637a9024bd146103b35761026c565b80634118d8fc1461033557806341da75551461033d57806343352d61146103455780634fbe30d41461035a57806354ada7161461036d5761026c565b80632552317c116102355780632552317c146102ec5780632e17de78146102f45780632f2ff15d1461030757806336568abe1461031a5780633e2d70041461032d5761026c565b80629f0f321461027157806301ffc9a7146102865780631793ed6d146102af5780631df804de146102c4578063248a9ca3146102d9575b600080fd5b61028461027f366004612f68565b61051b565b005b610299610294366004612f28565b610769565b6040516102a69190613160565b60405180910390f35b6102b76107af565b6040516102a69190613078565b6102cc6107be565b6040516102a6919061316b565b6102cc6102e7366004612ee1565b6107f9565b6102cc61080e565b610284610302366004612ee1565b610814565b610284610315366004612ef9565b6109ba565b610284610328366004612ef9565b6109e3565b6102cc610a2c565b6102cc610bfe565b6102cc610c04565b61034d610c0a565b6040516102a69190613113565b610284610368366004612ee1565b610c6c565b6102b7610e9d565b610284610383366004612ee1565b610eac565b610284610ee4565b6102cc610f22565b6102846103a6366004612df5565b610f28565b6102cc610f66565b6102846103c1366004612dbd565b610f6c565b6102846103d4366004612ef9565b610fc6565b6102cc611171565b6102cc611177565b6102cc61117d565b6102996103ff366004612ef9565b611183565b610284610412366004612ee1565b6111ac565b6102b76111e4565b61028461042d366004612ee1565b6111f3565b6102cc61122b565b61044d610448366004612dbd565b611230565b6040516102a6949392919061372a565b6102b7611257565b6102cc611266565b61028461047b366004612dbd565b61126b565b61044d611384565b6102cc611393565b61028461049e366004612dbd565b611399565b6102cc6113f3565b6102846104b9366004612dbd565b6113f9565b6102846104cc366004612ef9565b61152a565b6102846104df366004612dbd565b611549565b6104f76104f2366004612dbd565b6115a3565b6040516102a69594939291906130e3565b6102cc610516366004612dbd565b6115e0565b6105236118a7565b600160a060020a031682600160a060020a031614156105605760405160e560020a62461bcd028152600401610557906136f3565b60405180910390fd5b600083600160a060020a031663dd62ed3e6105796118a7565b306040518363ffffffff1660e060020a02815260040161059a92919061308c565b60206040518083038186803b1580156105b257600080fd5b505afa1580156105c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ea9190612f50565b9050841561061857808511156106155760405160e560020a62461bcd0281526004016105579061334a565b50835b806106385760405160e560020a62461bcd0281526004016105579061334a565b6106556106436118a7565b600160a060020a0386169030846118ab565b600a546040516000918291600160a060020a039091169061067c90889086906024016130ca565b60408051601f19818403018152918152602082018051600160e060020a03167fdf0d88b300000000000000000000000000000000000000000000000000000000179052516106ca9190612fdb565b600060405180830381855af49150503d8060008114610705576040519150601f19603f3d011682016040523d82523d6000602084013e61070a565b606091505b50915091508161072f5760405160e560020a62461bcd028152600401610557906133b8565b808060200190518101906107439190612f50565b925061074f8385611906565b61076061075a6118a7565b86611b1c565b50505050505050565b6000600160e060020a031982167f7965db0b0000000000000000000000000000000000000000000000000000000014806107a757506107a782611bc5565b90505b919050565b600954600160a060020a031681565b60408051608081018252600d548152600e546020820152600f549181019190915260105460608201526000906107f390611bf7565b90505b90565b60009081526020819052604090206001015490565b60125481565b806000106108375760405160e560020a62461bcd02815260040161055790613313565b6000600b60006108456118a7565b600160a060020a0316600160a060020a031681526020019081526020016000209050818160000154101561088e5760405160e560020a62461bcd028152600401610557906135ba565b6108ac6108996118a7565b600954600160a060020a03169084611d9d565b60006108b96105166118a7565b905080156108ca576108ca81611dbf565b815460018301546108db9043613903565b6108e591906138e4565b8260020160008282546108f89190613793565b9091555050815483908390600090610911908490613903565b90915550504360018301819055600e5461092a91613903565b600d5461093791906138e4565b600f8054600090610949908490613793565b909155505043600e55600d8054849190600090610967908490613793565b9091555061097590506118a7565b600160a060020a03167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75846040516109ad919061316b565b60405180910390a2505050565b6109c3826107f9565b6109d4816109cf6118a7565b611f91565b6109de8383611ff8565b505050565b6109eb6118a7565b600160a060020a031681600160a060020a031614610a1e5760405160e560020a62461bcd02815260040161055790613696565b610a28828261207d565b5050565b600080600960009054906101000a9004600160a060020a0316600160a060020a031663313ce5676040518163ffffffff1660e060020a02815260040160206040518083038186803b158015610a8057600080fd5b505afa158015610a94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab89190612fba565b60ff1690506000600a60009054906101000a9004600160a060020a0316600160a060020a031663df72f0176040518163ffffffff1660e060020a02815260040160206040518083038186803b158015610b1057600080fd5b505afa158015610b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b489190612dd9565b600160a060020a031663313ce5676040518163ffffffff1660e060020a02815260040160206040518083038186803b158015610b8357600080fd5b505afa158015610b97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbb9190612fba565b60ff169050808210610bf257610bd18183613903565b610bdc90600a613816565b600754610be991906137ab565b925050506107f6565b600754925050506107f6565b60155481565b60055481565b6060600c805480602002602001604051908101604052809291908181526020018280548015610c6257602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610c44575b5050505050905090565b6000610c7a816109cf6118a7565b81600010610c9d5760405160e560020a62461bcd0281526004016105579061365f565b600954604080517f313ce5670000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163313ce567916004808301926020929190829003018186803b158015610cfb57600080fd5b505afa158015610d0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d339190612fba565b60ff1690506000600a60009054906101000a9004600160a060020a0316600160a060020a031663df72f0176040518163ffffffff1660e060020a02815260040160206040518083038186803b158015610d8b57600080fd5b505afa158015610d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc39190612dd9565b600160a060020a031663313ce5676040518163ffffffff1660e060020a02815260040160206040518083038186803b158015610dfe57600080fd5b505afa158015610e12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e369190612fba565b60ff169050808210610e6e57610e4c8183613903565b610e5790600a613816565b610e6190856138e4565b6007556064600855610e97565b6007849055610e7d8282613903565b610e8890600a613816565b610e939060646138e4565b6008555b50505050565b600254600160a060020a031681565b6000610eba816109cf6118a7565b6064821115610ede5760405160e560020a62461bcd02815260040161055790613281565b50600555565b6000610ef16105166118a7565b905080600010610f165760405160e560020a62461bcd028152600401610557906131a7565b610f1f81611dbf565b50565b60135481565b6000610f356105166118a7565b905080600010610f5a5760405160e560020a62461bcd028152600401610557906131a7565b610e9781858585612100565b60065481565b6000610f7a816109cf6118a7565b600160a060020a038216610fa35760405160e560020a62461bcd02815260040161055790613526565b50600a8054600160a060020a031916600160a060020a0392909216919091179055565b610fce6118a7565b600160a060020a031681600160a060020a031614156110025760405160e560020a62461bcd028152600401610557906136f3565b600954600090600160a060020a031663dd62ed3e61101e6118a7565b306040518363ffffffff1660e060020a02815260040161103f92919061308c565b60206040518083038186803b15801561105757600080fd5b505afa15801561106b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108f9190612f50565b905082156110bd57808311156110ba5760405160e560020a62461bcd0281526004016105579061334a565b50815b806000106110e05760405160e560020a62461bcd0281526004016105579061334a565b6110ff6110eb6118a7565b600954600160a060020a03169030846118ab565b61111061110a6118a7565b8261274d565b600e5461111d9043613903565b600d5461112a91906138e4565b600f805460009061113c908490613793565b909155505043600e55600d805482919060009061115a908490613903565b909155506109de905061116b6118a7565b83611b1c565b60115481565b60145481565b60045481565b600091825260208281526040808420600160a060020a0393909316845291905290205460ff1690565b60006111ba816109cf6118a7565b60648211156111de5760405160e560020a62461bcd02815260040161055790613281565b50600655565b600354600160a060020a031681565b6000611201816109cf6118a7565b60648211156112255760405160e560020a62461bcd02815260040161055790613281565b50600455565b600081565b600b6020526000908152604090208054600182015460028301546003909301549192909184565b600a54600160a060020a031681565b606481565b6000611279816109cf6118a7565b600a54600090600160a060020a03166112906118a7565b6040516024016112a09190613078565b60408051601f19818403018152918152602082018051600160e060020a03167f2ad2e08c00000000000000000000000000000000000000000000000000000000179052516112ee9190612fdb565b600060405180830381855af49150503d8060008114611329576040519150601f19603f3d011682016040523d82523d6000602084013e61132e565b606091505b50509050806113525760405160e560020a62461bcd028152600401610557906133b8565b600160a060020a038316156109de5760098054600160a060020a031916600160a060020a0385161790556109de61284c565b600d54600e54600f5460105484565b60085481565b60006113a7816109cf6118a7565b600160a060020a0382166113d05760405160e560020a62461bcd028152600401610557906134b8565b5060038054600160a060020a031916600160a060020a0392909216919091179055565b60075481565b6000611407816109cf6118a7565b600160a060020a0382166114305760405160e560020a62461bcd028152600401610557906133ef565b600061143a6107be565b90508060001061145f5760405160e560020a62461bcd028152600401610557906131a7565b6114f283600a60009054906101000a9004600160a060020a0316600160a060020a031663df72f0176040518163ffffffff1660e060020a02815260040160206040518083038186803b1580156114b457600080fd5b505afa1580156114c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ec9190612dd9565b83612952565b80600d60030160008282546115079190613793565b9250508190555080601460008282546115209190613793565b9091555050505050565b611533826107f9565b61153f816109cf6118a7565b6109de838361207d565b6000611557816109cf6118a7565b600160a060020a0382166115805760405160e560020a62461bcd0281526004016105579061324a565b5060028054600160a060020a031916600160a060020a0392909216919091179055565b600160208190526000918252604090912080549181015460028201546003830154600490930154600160a060020a03909416939192909160ff1685565b600160a060020a0381166000908152600b602090815260408083208151608081018352815481526001820154938101939093526002810154918301919091526003015460608201526107a790611bf7565b606060006116408360026138e4565b61164b906002613793565b67ffffffffffffffff8111156116745760e060020a634e487b7102600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561169e576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106116e65760e060020a634e487b7102600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061175a5760e060020a634e487b7102600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006117968460026138e4565b6117a1906001613793565b90505b600181111561187e577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106117f35760e060020a634e487b7102600052603260045260246000fd5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106118395760e060020a634e487b7102600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060109094049361187781613946565b90506117a4565b5083156118a05760405160e560020a62461bcd028152600401610557906131de565b9392505050565b3390565b610e97846323b872dd60e060020a028585856040516024016118cf939291906130a6565b60408051601f19818403018152919052602081018051600160e060020a0316600160e060020a031990931692909217909152612a2f565b60006008546007548461191991906138e4565b61192391906137ab565b9050601254436119339190613903565b60155461194091906138e4565b601360008282546119519190613793565b909155505081156119e9576009546040517f40c10f19000000000000000000000000000000000000000000000000000000008152600160a060020a03909116906340c10f19906119a790309085906004016130ca565b600060405180830381600087803b1580156119c157600080fd5b505af11580156119d5573d6000803e3d6000fd5b505050506119e461110a6118a7565b611aa6565b600954600160a060020a03166340c10f19611a026118a7565b836040518363ffffffff1660e060020a028152600401611a239291906130ca565b600060405180830381600087803b158015611a3d57600080fd5b505af1158015611a51573d6000803e3d6000fd5b5050600e54611a639250905043613903565b600d54611a7091906138e4565b600f8054600090611a82908490613793565b909155505043600e55600d8054829190600090611aa0908490613793565b90915550505b8060156000828254611ab89190613793565b90915550504360125560118054849190600090611ad6908490613793565b90915550611ae490506118a7565b600160a060020a03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe826040516109ad919061316b565b600160a060020a03821660009081526001602052604090206004015460ff16610a2857600160a060020a03811615611b7d57600160a060020a0382811660009081526001602052604090208054600160a060020a0319169183169190911790555b600554600160a060020a0383166000908152600160208190526040909120600281019290925560065460038301556004805483830155909101805460ff191690911790555050565b600160e060020a031981167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b600a546040517fe6de48e00000000000000000000000000000000000000000000000000000000081526000918291600160a060020a039091169063e6de48e090611c45903090600401613078565b60206040518083038186803b158015611c5d57600080fd5b505afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c959190612f50565b90506011548111611caa5760009150506107aa565b6000836020015143611cbc9190613903565b8451611cc891906138e4565b8460400151611cd79190613793565b9050600060125443611ce99190613903565b601554611cf691906138e4565b601354611d039190613793565b9050600060115460145485611d189190613793565b611d229190613903565b9050600082611d3183866138e4565b611d3b91906137ab565b905086606001518111611d56576000955050505050506107aa565b6000876060015182611d689190613903565b905060115486611d789190613903565b8111611d845780611d91565b601154611d919087613903565b98975050505050505050565b6109de8363a9059cbb60e060020a0284846040516024016118cf9291906130ca565b60016000611dcb6118a7565b600160a060020a0316815260208101919091526040016000206004015460ff16611df457600080fd5b611ee881606460016000611e066118a7565b600160a060020a03168152602081019190915260400160002060020154611e2d90856138e4565b611e3791906137ab565b606460016000611e456118a7565b600160a060020a03168152602081019190915260400160002060030154611e6c90866138e4565b611e7691906137ab565b60016000611e826118a7565b600160a060020a039081168252602082019290925260400160009081205490911690606490600190611eb26118a7565b600160a060020a03168152602081019190915260400160002060010154611ed990886138e4565b611ee391906137ab565b612ac1565b80600b6000611ef56118a7565b600160a060020a0316600160a060020a031681526020019081526020016000206003016000828254611f279190613793565b925050819055508060146000828254611f409190613793565b90915550611f4e90506118a7565b600160a060020a03167f11232b62083a698039ef038dbb12def09340c4ac3b4c838e46d3e7c89ebbb9ba82604051611f86919061316b565b60405180910390a250565b611f9b8282611183565b610a2857611fb381600160a060020a03166014611631565b611fbe836020611631565b604051602001611fcf929190612ff7565b60408051601f198184030181529082905260e560020a62461bcd02825261055791600401613174565b6120028282611183565b610a2857600082815260208181526040808320600160a060020a03851684529091529020805460ff191660011790556120396118a7565b600160a060020a031681600160a060020a0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6120878282611183565b15610a2857600082815260208181526040808320600160a060020a03851684529091529020805460ff191690556120bc6118a7565b600160a060020a031681600160a060020a0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6001600061210c6118a7565b600160a060020a0316815260208101919091526040016000206004015460ff1661213557600080fd5b82516121565760405160e560020a62461bcd02815260040161055790613481565b815183511461217a5760405160e560020a62461bcd028152600401610557906132b6565b600060646001600061218a6118a7565b600160a060020a031681526020810191909152604001600020600201546121b190876138e4565b6121bb91906137ab565b905060006064600160006121cd6118a7565b600160a060020a031681526020810191909152604001600020600301546121f490886138e4565b6121fe91906137ab565b905060006064600160006122106118a7565b600160a060020a0316815260208101919091526040016000206001015461223790896138e4565b61224191906137ab565b905060008284612251848b613903565b61225b9190613903565b6122659190613903565b905060008060005b60018a5161227b9190613903565b811015612461578981815181106122a55760e060020a634e487b7102600052603260045260246000fd5b6020026020010151600160a060020a03166000600160a060020a031614156122e25760405160e560020a62461bcd028152600401610557906135f1565b8881815181106123055760e060020a634e487b7102600052603260045260246000fd5b6020026020010151600014156123305760405160e560020a62461bcd02815260040161055790613381565b600060648a83815181106123575760e060020a634e487b7102600052603260045260246000fd5b60200260200101518661236a91906138e4565b61237491906137ab565b6009548c51919250600160a060020a0316908c90849081106123a95760e060020a634e487b7102600052603260045260246000fd5b6020026020010151600160a060020a031614156123cf576123ca818a611906565b61240b565b61240b6123da6118a7565b8c84815181106123fd5760e060020a634e487b7102600052603260045260246000fd5b602002602001015183612952565b6124158185613793565b935089828151811061243a5760e060020a634e487b7102600052603260045260246000fd5b60200260200101518361244d9190613793565b9250508061245a9061395d565b905061226d565b508860018a516124719190613903565b815181106124925760e060020a634e487b7102600052603260045260246000fd5b6020026020010151600160a060020a03166000600160a060020a031614156124cf5760405160e560020a62461bcd028152600401610557906135f1565b87600189516124de9190613903565b815181106124ff5760e060020a634e487b7102600052603260045260246000fd5b60200260200101516000141561252a5760405160e560020a62461bcd02815260040161055790613381565b87600189516125399190613903565b8151811061255a5760e060020a634e487b7102600052603260045260246000fd5b60200260200101518161256d9190613793565b60641461258f5760405160e560020a62461bcd02815260040161055790613628565b6009548951600160a060020a03909116908a906125ae90600190613903565b815181106125cf5760e060020a634e487b7102600052603260045260246000fd5b6020026020010151600160a060020a031614156125fe576125f96125f38385613903565b88611906565b612652565b6126526126096118a7565b8a60018c516126189190613903565b815181106126395760e060020a634e487b7102600052603260045260246000fd5b6020026020010151848661264d9190613903565b612952565b61269b856126608689613793565b61266a9190613793565b8787600160006126786118a7565b600160a060020a0390811682526020820192909252604001600020541688612ac1565b89600b60006126a86118a7565b600160a060020a0316600160a060020a0316815260200190815260200160002060030160008282546126da9190613793565b9250508190555089601460008282546126f39190613793565b9091555061270190506118a7565b600160a060020a03167f11232b62083a698039ef038dbb12def09340c4ac3b4c838e46d3e7c89ebbb9ba8b604051612739919061316b565b60405180910390a250505050505050505050565b600160a060020a0382166000908152600b6020526040902060018101546127be57600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7018054600160a060020a031916600160a060020a0385161790556127f2565b805460018201546127cf9043613903565b6127d991906138e4565b8160020160008282546127ec9190613793565b90915550505b818160000160008282546128069190613793565b9091555050436001820155604051600160a060020a038416907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d906109ad90859061316b565b600a60045560058080556006556128636064610c6c565b60005b600c54811015612917576000600c82815481106128965760e060020a634e487b7102600052603260045260246000fd5b6000918252602080832090910154600160a060020a03168252600b81526040808320838155600181810185905560028083018690556003928301869055938190529184208054600160a060020a031916815591820184905591810183905590810191909155600401805460ff19169055506129108161395d565b9050612866565b50612924600c6000612d14565b6000600d819055600e819055600f819055601081905560118190554360125560138190556014819055601555565b80156109de57600a54604051600091600160a060020a03169061297d908690869086906024016130a6565b60408051601f19818403018152918152602082018051600160e060020a03167f3f47817c00000000000000000000000000000000000000000000000000000000179052516129cb9190612fdb565b600060405180830381855af49150503d8060008114612a06576040519150601f19603f3d011682016040523d82523d6000602084013e612a0b565b606091505b5050905080610e975760405160e560020a62461bcd02815260040161055790613213565b6000612a84826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525085600160a060020a0316612bf49092919063ffffffff16565b8051909150156109de5780806020019051810190612aa29190612ec5565b6109de5760405160e560020a62461bcd0281526004016105579061355d565b600a54604080517fdf72f0170000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163df72f017916004808301926020929190829003018186803b158015612b1f57600080fd5b505afa158015612b33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b579190612dd9565b9050612b85612b646118a7565b828685612b718a8c613903565b612b7b9190613903565b61264d9190613903565b600160a060020a038316612bb357600254612bae90600160a060020a03168261264d8886613793565b612bd5565b600254612bca90600160a060020a03168287612952565b612bd5838284612952565b600354612bec90600160a060020a03168286612952565b505050505050565b6060612c038484600085612c0b565b949350505050565b60603031831115612c315760405160e560020a62461bcd02815260040161055790613424565b612c3a85612cd2565b612c595760405160e560020a62461bcd028152600401610557906134ef565b60008086600160a060020a03168587604051612c759190612fdb565b60006040518083038185875af1925050503d8060008114612cb2576040519150601f19603f3d011682016040523d82523d6000602084013e612cb7565b606091505b5091509150612cc7828286612cd8565b979650505050505050565b3b151590565b60608315612ce75750816118a0565b825115612cf75782518084602001fd5b8160405160e560020a62461bcd0281526004016105579190613174565b5080546000825590600052602060002090810190610f1f91905b80821115612d425760008155600101612d2e565b5090565b600082601f830112612d56578081fd5b81356020612d6b612d668361376f565b613745565b8281528181019085830183850287018401881015612d87578586fd5b855b85811015612da557813584529284019290840190600101612d89565b5090979650505050505050565b80356107aa816139bf565b600060208284031215612dce578081fd5b81356118a0816139aa565b600060208284031215612dea578081fd5b81516118a0816139aa565b600080600060608486031215612e09578182fd5b833567ffffffffffffffff80821115612e20578384fd5b818601915086601f830112612e33578384fd5b81356020612e43612d668361376f565b82815281810190858301838502870184018c1015612e5f578889fd5b8896505b84871015612e8a578035612e76816139aa565b835260019690960195918301918301612e63565b5097505087013592505080821115612ea0578384fd5b50612ead86828701612d46565b925050612ebc60408501612db2565b90509250925092565b600060208284031215612ed6578081fd5b81516118a0816139bf565b600060208284031215612ef2578081fd5b5035919050565b60008060408385031215612f0b578182fd5b823591506020830135612f1d816139aa565b809150509250929050565b600060208284031215612f39578081fd5b8135600160e060020a0319811681146118a0578182fd5b600060208284031215612f61578081fd5b5051919050565b60008060008060808587031215612f7d578081fd5b843593506020850135612f8f816139aa565b92506040850135612f9f816139aa565b91506060850135612faf816139bf565b939692955090935050565b600060208284031215612fcb578081fd5b815160ff811681146118a0578182fd5b60008251612fed81846020870161391a565b9190910192915050565b60007f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008252835161302f81601785016020880161391a565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161306c81602884016020880161391a565b01602801949350505050565b600160a060020a0391909116815260200190565b600160a060020a0392831681529116602082015260400190565b600160a060020a039384168152919092166020820152604081019190915260600190565b600160a060020a03929092168252602082015260400190565b600160a060020a039590951685526020850193909352604084019190915260608301521515608082015260a00190565b6020808252825182820181905260009190848201906040850190845b81811015613154578351600160a060020a03168352928401929184019160010161312f565b50909695505050505050565b901515815260200190565b90815260200190565b600060208252825180602084015261319381604085016020870161391a565b601f01601f19169190910160400192915050565b60208082526012908201527f5468657265206973206e6f207265776172640000000000000000000000000000604082015260600190565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b6020808252601f908201527f44656c65676174652063616c6c2074616b65526577617264206661696c656400604082015260600190565b6020808252601f908201527f64656661756c74416666696c696174652063616e6e6f74206265206e756c6c00604082015260600190565b6020808252818101527f50657263656e74616765206d7573742062652066726f6d203020746f20313030604082015260600190565b60208082526036908201527f6578706563746564546f6b656e7320616e642070657263656e7461676573206c60408201527f656e676874206d757374206265207468652073616d6500000000000000000000606082015260800190565b60208082526013908201527f616d6f756e745f2063616e6e6f74206265203000000000000000000000000000604082015260600190565b60208082526015908201527f5468657265206973206e6f20616c6c6f77616e63650000000000000000000000604082015260600190565b60208082526016908201527f70657263656e746167652063616e6e6f74206265203000000000000000000000604082015260600190565b60208082526014908201527f44656c65676174652063616c6c206661696c6564000000000000000000000000604082015260600190565b6020808252818101527f726563697069656e74416464726573735f2063616e6e6f74206265206e756c6c604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60408201527f722063616c6c0000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f6c656e676874206f662061727261792063616e6e6f7420626520300000000000604082015260600190565b60208082526016908201527f636861726974792063616e6e6f74206265206e756c6c00000000000000000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526017908201527f73747261746567792063616e6e6f74206265206e756c6c000000000000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f4e6f7420656e6f75676820746f6b656e73000000000000000000000000000000604082015260600190565b6020808252601d908201527f657870656374656420746f6b656e2063616e6e6f74206265206e756c6c000000604082015260600190565b6020808252601e908201527f73756d206f662070657263656e7461676573206d757374206265203130300000604082015260600190565b60208082526016908201527f546f6b656e20726174652063616e6e6f74206265203000000000000000000000604082015260600190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201527f20726f6c657320666f722073656c660000000000000000000000000000000000606082015260800190565b60208082526018908201527f557365722063616e6e6f7420626520616666696c696174650000000000000000604082015260600190565b93845260208401929092526040830152606082015260800190565b60405181810167ffffffffffffffff8111828210171561376757613767613991565b604052919050565b600067ffffffffffffffff82111561378957613789613991565b5060209081020190565b600082198211156137a6576137a6613978565b500190565b6000826137c95760e060020a634e487b710281526012600452602481fd5b500490565b80825b60018086116137e0575061380d565b8187048211156137f2576137f2613978565b808616156137ff57918102915b5060029094049380026137d1565b94509492505050565b60006118a0600019848460008261382f575060016118a0565b8161383c575060006118a0565b8160018114613852576002811461385c57613889565b60019150506118a0565b60ff84111561386d5761386d613978565b8360020a91508482111561388357613883613978565b506118a0565b5060208310610133831016604e8410600b84101617156138bc575081810a838111156138b7576138b7613978565b6118a0565b6138c984848460016137ce565b8086048211156138db576138db613978565b02949350505050565b60008160001904831182151516156138fe576138fe613978565b500290565b60008282101561391557613915613978565b500390565b60005b8381101561393557818101518382015260200161391d565b83811115610e975750506000910152565b60008161395557613955613978565b506000190190565b600060001982141561397157613971613978565b5060010190565b60e060020a634e487b7102600052601160045260246000fd5b60e060020a634e487b7102600052604160045260246000fd5b600160a060020a0381168114610f1f57600080fd5b8015158114610f1f57600080fdfea26469706673582212201a9b66165c43e2125a4e62a13666328d8d3c6ff435b2c57a2d6e14e73437228b64736f6c63430008000033000000000000000000000000f4cfe59eb340d4b23d795d7c81b5e2fe6d5b412f000000000000000000000000eb445e688b7545d16d06e86488d42b184d89c9480000000000000000000000008d4a3de94a8e20203043870cc188db9fc118b74d
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061026c5760003560e060020a900480637acb775711610155578063af659e80116100c7578063d2423f5e1161008b578063d2423f5e146104a3578063d39b7413146104ab578063d547741f146104be578063dcd3725f146104d1578063e0f3a8fa146104e4578063e6de48e0146105085761026c565b8063af659e8014610465578063af6e359e1461046d578063b4106cdf14610480578063b78abb1814610488578063c9577b75146104905761026c565b80639277b84b116101195780639277b84b14610404578063934aa0231461041757806394bbfb561461041f578063a217fddf14610432578063a6fc61cb1461043a578063a8c62e761461045d5761026c565b80637acb7757146103c65780637cde0ee2146103d9578063900e1824146103e157806391a57544146103e957806391d14854146103f15761026c565b80634118d8fc116101ee57806358c1d24a116101b257806358c1d24a1461037557806370eccd061461038857806374331a951461039057806376bd58e614610398578063799d431d146103ab5780637a9024bd146103b35761026c565b80634118d8fc1461033557806341da75551461033d57806343352d61146103455780634fbe30d41461035a57806354ada7161461036d5761026c565b80632552317c116102355780632552317c146102ec5780632e17de78146102f45780632f2ff15d1461030757806336568abe1461031a5780633e2d70041461032d5761026c565b80629f0f321461027157806301ffc9a7146102865780631793ed6d146102af5780631df804de146102c4578063248a9ca3146102d9575b600080fd5b61028461027f366004612f68565b61051b565b005b610299610294366004612f28565b610769565b6040516102a69190613160565b60405180910390f35b6102b76107af565b6040516102a69190613078565b6102cc6107be565b6040516102a6919061316b565b6102cc6102e7366004612ee1565b6107f9565b6102cc61080e565b610284610302366004612ee1565b610814565b610284610315366004612ef9565b6109ba565b610284610328366004612ef9565b6109e3565b6102cc610a2c565b6102cc610bfe565b6102cc610c04565b61034d610c0a565b6040516102a69190613113565b610284610368366004612ee1565b610c6c565b6102b7610e9d565b610284610383366004612ee1565b610eac565b610284610ee4565b6102cc610f22565b6102846103a6366004612df5565b610f28565b6102cc610f66565b6102846103c1366004612dbd565b610f6c565b6102846103d4366004612ef9565b610fc6565b6102cc611171565b6102cc611177565b6102cc61117d565b6102996103ff366004612ef9565b611183565b610284610412366004612ee1565b6111ac565b6102b76111e4565b61028461042d366004612ee1565b6111f3565b6102cc61122b565b61044d610448366004612dbd565b611230565b6040516102a6949392919061372a565b6102b7611257565b6102cc611266565b61028461047b366004612dbd565b61126b565b61044d611384565b6102cc611393565b61028461049e366004612dbd565b611399565b6102cc6113f3565b6102846104b9366004612dbd565b6113f9565b6102846104cc366004612ef9565b61152a565b6102846104df366004612dbd565b611549565b6104f76104f2366004612dbd565b6115a3565b6040516102a69594939291906130e3565b6102cc610516366004612dbd565b6115e0565b6105236118a7565b600160a060020a031682600160a060020a031614156105605760405160e560020a62461bcd028152600401610557906136f3565b60405180910390fd5b600083600160a060020a031663dd62ed3e6105796118a7565b306040518363ffffffff1660e060020a02815260040161059a92919061308c565b60206040518083038186803b1580156105b257600080fd5b505afa1580156105c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ea9190612f50565b9050841561061857808511156106155760405160e560020a62461bcd0281526004016105579061334a565b50835b806106385760405160e560020a62461bcd0281526004016105579061334a565b6106556106436118a7565b600160a060020a0386169030846118ab565b600a546040516000918291600160a060020a039091169061067c90889086906024016130ca565b60408051601f19818403018152918152602082018051600160e060020a03167fdf0d88b300000000000000000000000000000000000000000000000000000000179052516106ca9190612fdb565b600060405180830381855af49150503d8060008114610705576040519150601f19603f3d011682016040523d82523d6000602084013e61070a565b606091505b50915091508161072f5760405160e560020a62461bcd028152600401610557906133b8565b808060200190518101906107439190612f50565b925061074f8385611906565b61076061075a6118a7565b86611b1c565b50505050505050565b6000600160e060020a031982167f7965db0b0000000000000000000000000000000000000000000000000000000014806107a757506107a782611bc5565b90505b919050565b600954600160a060020a031681565b60408051608081018252600d548152600e546020820152600f549181019190915260105460608201526000906107f390611bf7565b90505b90565b60009081526020819052604090206001015490565b60125481565b806000106108375760405160e560020a62461bcd02815260040161055790613313565b6000600b60006108456118a7565b600160a060020a0316600160a060020a031681526020019081526020016000209050818160000154101561088e5760405160e560020a62461bcd028152600401610557906135ba565b6108ac6108996118a7565b600954600160a060020a03169084611d9d565b60006108b96105166118a7565b905080156108ca576108ca81611dbf565b815460018301546108db9043613903565b6108e591906138e4565b8260020160008282546108f89190613793565b9091555050815483908390600090610911908490613903565b90915550504360018301819055600e5461092a91613903565b600d5461093791906138e4565b600f8054600090610949908490613793565b909155505043600e55600d8054849190600090610967908490613793565b9091555061097590506118a7565b600160a060020a03167f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75846040516109ad919061316b565b60405180910390a2505050565b6109c3826107f9565b6109d4816109cf6118a7565b611f91565b6109de8383611ff8565b505050565b6109eb6118a7565b600160a060020a031681600160a060020a031614610a1e5760405160e560020a62461bcd02815260040161055790613696565b610a28828261207d565b5050565b600080600960009054906101000a9004600160a060020a0316600160a060020a031663313ce5676040518163ffffffff1660e060020a02815260040160206040518083038186803b158015610a8057600080fd5b505afa158015610a94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab89190612fba565b60ff1690506000600a60009054906101000a9004600160a060020a0316600160a060020a031663df72f0176040518163ffffffff1660e060020a02815260040160206040518083038186803b158015610b1057600080fd5b505afa158015610b24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b489190612dd9565b600160a060020a031663313ce5676040518163ffffffff1660e060020a02815260040160206040518083038186803b158015610b8357600080fd5b505afa158015610b97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bbb9190612fba565b60ff169050808210610bf257610bd18183613903565b610bdc90600a613816565b600754610be991906137ab565b925050506107f6565b600754925050506107f6565b60155481565b60055481565b6060600c805480602002602001604051908101604052809291908181526020018280548015610c6257602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610c44575b5050505050905090565b6000610c7a816109cf6118a7565b81600010610c9d5760405160e560020a62461bcd0281526004016105579061365f565b600954604080517f313ce5670000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163313ce567916004808301926020929190829003018186803b158015610cfb57600080fd5b505afa158015610d0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d339190612fba565b60ff1690506000600a60009054906101000a9004600160a060020a0316600160a060020a031663df72f0176040518163ffffffff1660e060020a02815260040160206040518083038186803b158015610d8b57600080fd5b505afa158015610d9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dc39190612dd9565b600160a060020a031663313ce5676040518163ffffffff1660e060020a02815260040160206040518083038186803b158015610dfe57600080fd5b505afa158015610e12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e369190612fba565b60ff169050808210610e6e57610e4c8183613903565b610e5790600a613816565b610e6190856138e4565b6007556064600855610e97565b6007849055610e7d8282613903565b610e8890600a613816565b610e939060646138e4565b6008555b50505050565b600254600160a060020a031681565b6000610eba816109cf6118a7565b6064821115610ede5760405160e560020a62461bcd02815260040161055790613281565b50600555565b6000610ef16105166118a7565b905080600010610f165760405160e560020a62461bcd028152600401610557906131a7565b610f1f81611dbf565b50565b60135481565b6000610f356105166118a7565b905080600010610f5a5760405160e560020a62461bcd028152600401610557906131a7565b610e9781858585612100565b60065481565b6000610f7a816109cf6118a7565b600160a060020a038216610fa35760405160e560020a62461bcd02815260040161055790613526565b50600a8054600160a060020a031916600160a060020a0392909216919091179055565b610fce6118a7565b600160a060020a031681600160a060020a031614156110025760405160e560020a62461bcd028152600401610557906136f3565b600954600090600160a060020a031663dd62ed3e61101e6118a7565b306040518363ffffffff1660e060020a02815260040161103f92919061308c565b60206040518083038186803b15801561105757600080fd5b505afa15801561106b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108f9190612f50565b905082156110bd57808311156110ba5760405160e560020a62461bcd0281526004016105579061334a565b50815b806000106110e05760405160e560020a62461bcd0281526004016105579061334a565b6110ff6110eb6118a7565b600954600160a060020a03169030846118ab565b61111061110a6118a7565b8261274d565b600e5461111d9043613903565b600d5461112a91906138e4565b600f805460009061113c908490613793565b909155505043600e55600d805482919060009061115a908490613903565b909155506109de905061116b6118a7565b83611b1c565b60115481565b60145481565b60045481565b600091825260208281526040808420600160a060020a0393909316845291905290205460ff1690565b60006111ba816109cf6118a7565b60648211156111de5760405160e560020a62461bcd02815260040161055790613281565b50600655565b600354600160a060020a031681565b6000611201816109cf6118a7565b60648211156112255760405160e560020a62461bcd02815260040161055790613281565b50600455565b600081565b600b6020526000908152604090208054600182015460028301546003909301549192909184565b600a54600160a060020a031681565b606481565b6000611279816109cf6118a7565b600a54600090600160a060020a03166112906118a7565b6040516024016112a09190613078565b60408051601f19818403018152918152602082018051600160e060020a03167f2ad2e08c00000000000000000000000000000000000000000000000000000000179052516112ee9190612fdb565b600060405180830381855af49150503d8060008114611329576040519150601f19603f3d011682016040523d82523d6000602084013e61132e565b606091505b50509050806113525760405160e560020a62461bcd028152600401610557906133b8565b600160a060020a038316156109de5760098054600160a060020a031916600160a060020a0385161790556109de61284c565b600d54600e54600f5460105484565b60085481565b60006113a7816109cf6118a7565b600160a060020a0382166113d05760405160e560020a62461bcd028152600401610557906134b8565b5060038054600160a060020a031916600160a060020a0392909216919091179055565b60075481565b6000611407816109cf6118a7565b600160a060020a0382166114305760405160e560020a62461bcd028152600401610557906133ef565b600061143a6107be565b90508060001061145f5760405160e560020a62461bcd028152600401610557906131a7565b6114f283600a60009054906101000a9004600160a060020a0316600160a060020a031663df72f0176040518163ffffffff1660e060020a02815260040160206040518083038186803b1580156114b457600080fd5b505afa1580156114c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ec9190612dd9565b83612952565b80600d60030160008282546115079190613793565b9250508190555080601460008282546115209190613793565b9091555050505050565b611533826107f9565b61153f816109cf6118a7565b6109de838361207d565b6000611557816109cf6118a7565b600160a060020a0382166115805760405160e560020a62461bcd0281526004016105579061324a565b5060028054600160a060020a031916600160a060020a0392909216919091179055565b600160208190526000918252604090912080549181015460028201546003830154600490930154600160a060020a03909416939192909160ff1685565b600160a060020a0381166000908152600b602090815260408083208151608081018352815481526001820154938101939093526002810154918301919091526003015460608201526107a790611bf7565b606060006116408360026138e4565b61164b906002613793565b67ffffffffffffffff8111156116745760e060020a634e487b7102600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561169e576020820181803683370190505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106116e65760e060020a634e487b7102600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061175a5760e060020a634e487b7102600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006117968460026138e4565b6117a1906001613793565b90505b600181111561187e577f303132333435363738396162636465660000000000000000000000000000000085600f16601081106117f35760e060020a634e487b7102600052603260045260246000fd5b1a7f0100000000000000000000000000000000000000000000000000000000000000028282815181106118395760e060020a634e487b7102600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060109094049361187781613946565b90506117a4565b5083156118a05760405160e560020a62461bcd028152600401610557906131de565b9392505050565b3390565b610e97846323b872dd60e060020a028585856040516024016118cf939291906130a6565b60408051601f19818403018152919052602081018051600160e060020a0316600160e060020a031990931692909217909152612a2f565b60006008546007548461191991906138e4565b61192391906137ab565b9050601254436119339190613903565b60155461194091906138e4565b601360008282546119519190613793565b909155505081156119e9576009546040517f40c10f19000000000000000000000000000000000000000000000000000000008152600160a060020a03909116906340c10f19906119a790309085906004016130ca565b600060405180830381600087803b1580156119c157600080fd5b505af11580156119d5573d6000803e3d6000fd5b505050506119e461110a6118a7565b611aa6565b600954600160a060020a03166340c10f19611a026118a7565b836040518363ffffffff1660e060020a028152600401611a239291906130ca565b600060405180830381600087803b158015611a3d57600080fd5b505af1158015611a51573d6000803e3d6000fd5b5050600e54611a639250905043613903565b600d54611a7091906138e4565b600f8054600090611a82908490613793565b909155505043600e55600d8054829190600090611aa0908490613793565b90915550505b8060156000828254611ab89190613793565b90915550504360125560118054849190600090611ad6908490613793565b90915550611ae490506118a7565b600160a060020a03167f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe826040516109ad919061316b565b600160a060020a03821660009081526001602052604090206004015460ff16610a2857600160a060020a03811615611b7d57600160a060020a0382811660009081526001602052604090208054600160a060020a0319169183169190911790555b600554600160a060020a0383166000908152600160208190526040909120600281019290925560065460038301556004805483830155909101805460ff191690911790555050565b600160e060020a031981167f01ffc9a70000000000000000000000000000000000000000000000000000000014919050565b600a546040517fe6de48e00000000000000000000000000000000000000000000000000000000081526000918291600160a060020a039091169063e6de48e090611c45903090600401613078565b60206040518083038186803b158015611c5d57600080fd5b505afa158015611c71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c959190612f50565b90506011548111611caa5760009150506107aa565b6000836020015143611cbc9190613903565b8451611cc891906138e4565b8460400151611cd79190613793565b9050600060125443611ce99190613903565b601554611cf691906138e4565b601354611d039190613793565b9050600060115460145485611d189190613793565b611d229190613903565b9050600082611d3183866138e4565b611d3b91906137ab565b905086606001518111611d56576000955050505050506107aa565b6000876060015182611d689190613903565b905060115486611d789190613903565b8111611d845780611d91565b601154611d919087613903565b98975050505050505050565b6109de8363a9059cbb60e060020a0284846040516024016118cf9291906130ca565b60016000611dcb6118a7565b600160a060020a0316815260208101919091526040016000206004015460ff16611df457600080fd5b611ee881606460016000611e066118a7565b600160a060020a03168152602081019190915260400160002060020154611e2d90856138e4565b611e3791906137ab565b606460016000611e456118a7565b600160a060020a03168152602081019190915260400160002060030154611e6c90866138e4565b611e7691906137ab565b60016000611e826118a7565b600160a060020a039081168252602082019290925260400160009081205490911690606490600190611eb26118a7565b600160a060020a03168152602081019190915260400160002060010154611ed990886138e4565b611ee391906137ab565b612ac1565b80600b6000611ef56118a7565b600160a060020a0316600160a060020a031681526020019081526020016000206003016000828254611f279190613793565b925050819055508060146000828254611f409190613793565b90915550611f4e90506118a7565b600160a060020a03167f11232b62083a698039ef038dbb12def09340c4ac3b4c838e46d3e7c89ebbb9ba82604051611f86919061316b565b60405180910390a250565b611f9b8282611183565b610a2857611fb381600160a060020a03166014611631565b611fbe836020611631565b604051602001611fcf929190612ff7565b60408051601f198184030181529082905260e560020a62461bcd02825261055791600401613174565b6120028282611183565b610a2857600082815260208181526040808320600160a060020a03851684529091529020805460ff191660011790556120396118a7565b600160a060020a031681600160a060020a0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6120878282611183565b15610a2857600082815260208181526040808320600160a060020a03851684529091529020805460ff191690556120bc6118a7565b600160a060020a031681600160a060020a0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b6001600061210c6118a7565b600160a060020a0316815260208101919091526040016000206004015460ff1661213557600080fd5b82516121565760405160e560020a62461bcd02815260040161055790613481565b815183511461217a5760405160e560020a62461bcd028152600401610557906132b6565b600060646001600061218a6118a7565b600160a060020a031681526020810191909152604001600020600201546121b190876138e4565b6121bb91906137ab565b905060006064600160006121cd6118a7565b600160a060020a031681526020810191909152604001600020600301546121f490886138e4565b6121fe91906137ab565b905060006064600160006122106118a7565b600160a060020a0316815260208101919091526040016000206001015461223790896138e4565b61224191906137ab565b905060008284612251848b613903565b61225b9190613903565b6122659190613903565b905060008060005b60018a5161227b9190613903565b811015612461578981815181106122a55760e060020a634e487b7102600052603260045260246000fd5b6020026020010151600160a060020a03166000600160a060020a031614156122e25760405160e560020a62461bcd028152600401610557906135f1565b8881815181106123055760e060020a634e487b7102600052603260045260246000fd5b6020026020010151600014156123305760405160e560020a62461bcd02815260040161055790613381565b600060648a83815181106123575760e060020a634e487b7102600052603260045260246000fd5b60200260200101518661236a91906138e4565b61237491906137ab565b6009548c51919250600160a060020a0316908c90849081106123a95760e060020a634e487b7102600052603260045260246000fd5b6020026020010151600160a060020a031614156123cf576123ca818a611906565b61240b565b61240b6123da6118a7565b8c84815181106123fd5760e060020a634e487b7102600052603260045260246000fd5b602002602001015183612952565b6124158185613793565b935089828151811061243a5760e060020a634e487b7102600052603260045260246000fd5b60200260200101518361244d9190613793565b9250508061245a9061395d565b905061226d565b508860018a516124719190613903565b815181106124925760e060020a634e487b7102600052603260045260246000fd5b6020026020010151600160a060020a03166000600160a060020a031614156124cf5760405160e560020a62461bcd028152600401610557906135f1565b87600189516124de9190613903565b815181106124ff5760e060020a634e487b7102600052603260045260246000fd5b60200260200101516000141561252a5760405160e560020a62461bcd02815260040161055790613381565b87600189516125399190613903565b8151811061255a5760e060020a634e487b7102600052603260045260246000fd5b60200260200101518161256d9190613793565b60641461258f5760405160e560020a62461bcd02815260040161055790613628565b6009548951600160a060020a03909116908a906125ae90600190613903565b815181106125cf5760e060020a634e487b7102600052603260045260246000fd5b6020026020010151600160a060020a031614156125fe576125f96125f38385613903565b88611906565b612652565b6126526126096118a7565b8a60018c516126189190613903565b815181106126395760e060020a634e487b7102600052603260045260246000fd5b6020026020010151848661264d9190613903565b612952565b61269b856126608689613793565b61266a9190613793565b8787600160006126786118a7565b600160a060020a0390811682526020820192909252604001600020541688612ac1565b89600b60006126a86118a7565b600160a060020a0316600160a060020a0316815260200190815260200160002060030160008282546126da9190613793565b9250508190555089601460008282546126f39190613793565b9091555061270190506118a7565b600160a060020a03167f11232b62083a698039ef038dbb12def09340c4ac3b4c838e46d3e7c89ebbb9ba8b604051612739919061316b565b60405180910390a250505050505050505050565b600160a060020a0382166000908152600b6020526040902060018101546127be57600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7018054600160a060020a031916600160a060020a0385161790556127f2565b805460018201546127cf9043613903565b6127d991906138e4565b8160020160008282546127ec9190613793565b90915550505b818160000160008282546128069190613793565b9091555050436001820155604051600160a060020a038416907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d906109ad90859061316b565b600a60045560058080556006556128636064610c6c565b60005b600c54811015612917576000600c82815481106128965760e060020a634e487b7102600052603260045260246000fd5b6000918252602080832090910154600160a060020a03168252600b81526040808320838155600181810185905560028083018690556003928301869055938190529184208054600160a060020a031916815591820184905591810183905590810191909155600401805460ff19169055506129108161395d565b9050612866565b50612924600c6000612d14565b6000600d819055600e819055600f819055601081905560118190554360125560138190556014819055601555565b80156109de57600a54604051600091600160a060020a03169061297d908690869086906024016130a6565b60408051601f19818403018152918152602082018051600160e060020a03167f3f47817c00000000000000000000000000000000000000000000000000000000179052516129cb9190612fdb565b600060405180830381855af49150503d8060008114612a06576040519150601f19603f3d011682016040523d82523d6000602084013e612a0b565b606091505b5050905080610e975760405160e560020a62461bcd02815260040161055790613213565b6000612a84826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c656481525085600160a060020a0316612bf49092919063ffffffff16565b8051909150156109de5780806020019051810190612aa29190612ec5565b6109de5760405160e560020a62461bcd0281526004016105579061355d565b600a54604080517fdf72f0170000000000000000000000000000000000000000000000000000000081529051600092600160a060020a03169163df72f017916004808301926020929190829003018186803b158015612b1f57600080fd5b505afa158015612b33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b579190612dd9565b9050612b85612b646118a7565b828685612b718a8c613903565b612b7b9190613903565b61264d9190613903565b600160a060020a038316612bb357600254612bae90600160a060020a03168261264d8886613793565b612bd5565b600254612bca90600160a060020a03168287612952565b612bd5838284612952565b600354612bec90600160a060020a03168286612952565b505050505050565b6060612c038484600085612c0b565b949350505050565b60603031831115612c315760405160e560020a62461bcd02815260040161055790613424565b612c3a85612cd2565b612c595760405160e560020a62461bcd028152600401610557906134ef565b60008086600160a060020a03168587604051612c759190612fdb565b60006040518083038185875af1925050503d8060008114612cb2576040519150601f19603f3d011682016040523d82523d6000602084013e612cb7565b606091505b5091509150612cc7828286612cd8565b979650505050505050565b3b151590565b60608315612ce75750816118a0565b825115612cf75782518084602001fd5b8160405160e560020a62461bcd0281526004016105579190613174565b5080546000825590600052602060002090810190610f1f91905b80821115612d425760008155600101612d2e565b5090565b600082601f830112612d56578081fd5b81356020612d6b612d668361376f565b613745565b8281528181019085830183850287018401881015612d87578586fd5b855b85811015612da557813584529284019290840190600101612d89565b5090979650505050505050565b80356107aa816139bf565b600060208284031215612dce578081fd5b81356118a0816139aa565b600060208284031215612dea578081fd5b81516118a0816139aa565b600080600060608486031215612e09578182fd5b833567ffffffffffffffff80821115612e20578384fd5b818601915086601f830112612e33578384fd5b81356020612e43612d668361376f565b82815281810190858301838502870184018c1015612e5f578889fd5b8896505b84871015612e8a578035612e76816139aa565b835260019690960195918301918301612e63565b5097505087013592505080821115612ea0578384fd5b50612ead86828701612d46565b925050612ebc60408501612db2565b90509250925092565b600060208284031215612ed6578081fd5b81516118a0816139bf565b600060208284031215612ef2578081fd5b5035919050565b60008060408385031215612f0b578182fd5b823591506020830135612f1d816139aa565b809150509250929050565b600060208284031215612f39578081fd5b8135600160e060020a0319811681146118a0578182fd5b600060208284031215612f61578081fd5b5051919050565b60008060008060808587031215612f7d578081fd5b843593506020850135612f8f816139aa565b92506040850135612f9f816139aa565b91506060850135612faf816139bf565b939692955090935050565b600060208284031215612fcb578081fd5b815160ff811681146118a0578182fd5b60008251612fed81846020870161391a565b9190910192915050565b60007f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008252835161302f81601785016020880161391a565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000601791840191820152835161306c81602884016020880161391a565b01602801949350505050565b600160a060020a0391909116815260200190565b600160a060020a0392831681529116602082015260400190565b600160a060020a039384168152919092166020820152604081019190915260600190565b600160a060020a03929092168252602082015260400190565b600160a060020a039590951685526020850193909352604084019190915260608301521515608082015260a00190565b6020808252825182820181905260009190848201906040850190845b81811015613154578351600160a060020a03168352928401929184019160010161312f565b50909695505050505050565b901515815260200190565b90815260200190565b600060208252825180602084015261319381604085016020870161391a565b601f01601f19169190910160400192915050565b60208082526012908201527f5468657265206973206e6f207265776172640000000000000000000000000000604082015260600190565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b6020808252601f908201527f44656c65676174652063616c6c2074616b65526577617264206661696c656400604082015260600190565b6020808252601f908201527f64656661756c74416666696c696174652063616e6e6f74206265206e756c6c00604082015260600190565b6020808252818101527f50657263656e74616765206d7573742062652066726f6d203020746f20313030604082015260600190565b60208082526036908201527f6578706563746564546f6b656e7320616e642070657263656e7461676573206c60408201527f656e676874206d757374206265207468652073616d6500000000000000000000606082015260800190565b60208082526013908201527f616d6f756e745f2063616e6e6f74206265203000000000000000000000000000604082015260600190565b60208082526015908201527f5468657265206973206e6f20616c6c6f77616e63650000000000000000000000604082015260600190565b60208082526016908201527f70657263656e746167652063616e6e6f74206265203000000000000000000000604082015260600190565b60208082526014908201527f44656c65676174652063616c6c206661696c6564000000000000000000000000604082015260600190565b6020808252818101527f726563697069656e74416464726573735f2063616e6e6f74206265206e756c6c604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60408201527f722063616c6c0000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601b908201527f6c656e676874206f662061727261792063616e6e6f7420626520300000000000604082015260600190565b60208082526016908201527f636861726974792063616e6e6f74206265206e756c6c00000000000000000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526017908201527f73747261746567792063616e6e6f74206265206e756c6c000000000000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60408201527f6f74207375636365656400000000000000000000000000000000000000000000606082015260800190565b60208082526011908201527f4e6f7420656e6f75676820746f6b656e73000000000000000000000000000000604082015260600190565b6020808252601d908201527f657870656374656420746f6b656e2063616e6e6f74206265206e756c6c000000604082015260600190565b6020808252601e908201527f73756d206f662070657263656e7461676573206d757374206265203130300000604082015260600190565b60208082526016908201527f546f6b656e20726174652063616e6e6f74206265203000000000000000000000604082015260600190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201527f20726f6c657320666f722073656c660000000000000000000000000000000000606082015260800190565b60208082526018908201527f557365722063616e6e6f7420626520616666696c696174650000000000000000604082015260600190565b93845260208401929092526040830152606082015260800190565b60405181810167ffffffffffffffff8111828210171561376757613767613991565b604052919050565b600067ffffffffffffffff82111561378957613789613991565b5060209081020190565b600082198211156137a6576137a6613978565b500190565b6000826137c95760e060020a634e487b710281526012600452602481fd5b500490565b80825b60018086116137e0575061380d565b8187048211156137f2576137f2613978565b808616156137ff57918102915b5060029094049380026137d1565b94509492505050565b60006118a0600019848460008261382f575060016118a0565b8161383c575060006118a0565b8160018114613852576002811461385c57613889565b60019150506118a0565b60ff84111561386d5761386d613978565b8360020a91508482111561388357613883613978565b506118a0565b5060208310610133831016604e8410600b84101617156138bc575081810a838111156138b7576138b7613978565b6118a0565b6138c984848460016137ce565b8086048211156138db576138db613978565b02949350505050565b60008160001904831182151516156138fe576138fe613978565b500290565b60008282101561391557613915613978565b500390565b60005b8381101561393557818101518382015260200161391d565b83811115610e975750506000910152565b60008161395557613955613978565b506000190190565b600060001982141561397157613971613978565b5060010190565b60e060020a634e487b7102600052601160045260246000fd5b60e060020a634e487b7102600052604160045260246000fd5b600160a060020a0381168114610f1f57600080fd5b8015158114610f1f57600080fdfea26469706673582212201a9b66165c43e2125a4e62a13666328d8d3c6ff435b2c57a2d6e14e73437228b64736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f4cfe59eb340d4b23d795d7c81b5e2fe6d5b412f000000000000000000000000eb445e688b7545d16d06e86488d42b184d89c9480000000000000000000000008d4a3de94a8e20203043870cc188db9fc118b74d
-----Decoded View---------------
Arg [0] : pvtTokenAddress_ (address): 0xf4cFE59Eb340d4B23D795d7C81B5E2Fe6D5B412F
Arg [1] : initialStrategyAddress_ (address): 0xeb445e688B7545D16D06E86488d42b184D89C948
Arg [2] : charityAddress_ (address): 0x8d4a3DE94A8E20203043870cC188db9fc118B74d
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000f4cfe59eb340d4b23d795d7c81b5e2fe6d5b412f
Arg [1] : 000000000000000000000000eb445e688b7545d16d06e86488d42b184d89c948
Arg [2] : 0000000000000000000000008d4a3de94a8e20203043870cc188db9fc118b74d
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 29 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.