Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
StakersPoolV2
Compiler Version
v0.7.3+commit.9bfce1f6
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/* Copyright (C) 2020 InsurAce.io This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ */ // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.7.3; import "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; import {SecurityMatrix} from "../secmatrix/SecurityMatrix.sol"; import {Constant} from "../common/Constant.sol"; import {IStakersPoolV2} from "./IStakersPoolV2.sol"; import {IFeePool} from "../pool/IFeePool.sol"; import {ILPToken} from "../token/ILPToken.sol"; import {Math} from "../common/Math.sol"; import {IClaimSettlementPool} from "../pool/IClaimSettlementPool.sol"; contract StakersPoolV2 is IStakersPoolV2, OwnableUpgradeable, PausableUpgradeable, ReentrancyGuardUpgradeable { using SafeERC20Upgradeable for IERC20Upgradeable; using SafeMathUpgradeable for uint256; using AddressUpgradeable for address; function initializeStakersPoolV2() public initializer { __Ownable_init(); __Pausable_init(); __ReentrancyGuard_init(); } address public securityMatrix; address public insurTokenAddress; // _token mapping(address => uint256) public stakedAmountPT; // _lpToken mapping(address => uint256) public poolLastCalcBlock; mapping(address => uint256) public poolWeightPT; uint256 public totalPoolWeight; mapping(address => uint256) public poolRewardPerLPToken; uint256 public rewardStartBlock; uint256 public rewardEndBlock; uint256 public rewardPerBlock; // _lpToken -> account -> rewards mapping(address => mapping(address => uint256)) public stkRewardsPerAPerLPT; mapping(address => mapping(address => uint256)) public harvestedRewardsPerAPerLPT; // stakers pool signer flag (signer -> true/false) mapping(address => bool) public signerFlagMap; // stakers pool nonce flag (nonce -> true/false) mapping(uint256 => bool) public nonceFlagMap; function setup(address _securityMatrix, address _insurTokenAddress) external onlyOwner { require(_securityMatrix != address(0), "S:1"); securityMatrix = _securityMatrix; require(_insurTokenAddress != address(0), "S:2"); insurTokenAddress = _insurTokenAddress; } function setPoolWeight( address _lpToken, uint256 _poolWeightPT, address[] memory _lpTokens ) external onlyOwner { reCalcAllPools(_lpTokens); if (poolWeightPT[_lpToken] != 0) { totalPoolWeight = totalPoolWeight.sub(poolWeightPT[_lpToken]); } poolWeightPT[_lpToken] = _poolWeightPT; totalPoolWeight = totalPoolWeight.add(_poolWeightPT); } event SetRewardInfo(uint256 _rewardStartBlock, uint256 _rewardEndBlock, uint256 _rewardPerBlock); function setRewardInfo( uint256 _rewardStartBlock, uint256 _rewardEndBlock, uint256 _rewardPerBlock, address[] memory _lpTokens ) external onlyOwner { require(_rewardStartBlock < _rewardEndBlock, "SRI:1"); require(block.number < _rewardEndBlock, "SRI:2"); reCalcAllPools(_lpTokens); if (block.number <= rewardEndBlock && block.number >= rewardStartBlock) { rewardEndBlock = _rewardEndBlock; rewardPerBlock = _rewardPerBlock; } else { rewardStartBlock = _rewardStartBlock; rewardEndBlock = _rewardEndBlock; rewardPerBlock = _rewardPerBlock; } emit SetRewardInfo(_rewardStartBlock, _rewardEndBlock, _rewardPerBlock); } modifier allowedCaller() { require((SecurityMatrix(securityMatrix).isAllowdCaller(address(this), _msgSender())) || (_msgSender() == owner()), "allowedCaller"); _; } event StakedAmountPTEvent(address indexed _token, uint256 _amount); function getPoolReward( uint256 _from, uint256 _to, uint256 _poolWeight ) private view returns (uint256) { uint256 start = Math.max(_from, rewardStartBlock); uint256 end = Math.min(_to, rewardEndBlock); if (end <= start) { return 0; } uint256 deltaBlock = end.sub(start); uint256 amount = deltaBlock.mul(rewardPerBlock).mul(_poolWeight).div(totalPoolWeight); return amount; } function reCalcAllPools(address[] memory _lpTokens) private { for (uint256 i = 0; i < _lpTokens.length; i++) { reCalcPoolPT(_lpTokens[i]); } } function reCalcPoolPT(address _lpToken) public override allowedCaller { if (block.number <= poolLastCalcBlock[_lpToken]) { // require(false, "reCalcPoolPT:1"); return; } uint256 lpSupply = IERC20Upgradeable(_lpToken).totalSupply(); if (lpSupply == 0) { poolLastCalcBlock[_lpToken] = block.number; return; } uint256 reward = getPoolReward(poolLastCalcBlock[_lpToken], block.number, poolWeightPT[_lpToken]); poolRewardPerLPToken[_lpToken] = poolRewardPerLPToken[_lpToken].add(reward.mul(1e18).div(lpSupply)); poolLastCalcBlock[_lpToken] = block.number; } function showPendingRewards(address _account, address _lpToken) external view override returns (uint256) { uint256 poolRewardPerLPTokenT = 0; uint256 userAmt = IERC20Upgradeable(_lpToken).balanceOf(_account); uint256 userRewardDebt = ILPToken(_lpToken).rewardDebtOf(_account); uint256 lpSupply = IERC20Upgradeable(_lpToken).totalSupply(); if (block.number == poolLastCalcBlock[_lpToken]) { return 0; } if (block.number > poolLastCalcBlock[_lpToken] && lpSupply > 0) { uint256 reward = getPoolReward(poolLastCalcBlock[_lpToken], block.number, poolWeightPT[_lpToken]); poolRewardPerLPTokenT = poolRewardPerLPToken[_lpToken].add(reward.mul(1e18).div(lpSupply)); } require(userAmt.mul(poolRewardPerLPTokenT).div(1e18) >= userRewardDebt, "showPR:1"); return userAmt.mul(poolRewardPerLPTokenT).div(1e18).sub(userRewardDebt); } function settlePendingRewards(address _account, address _lpToken) external override allowedCaller { uint256 userAmt = IERC20Upgradeable(_lpToken).balanceOf(_account); uint256 userRewardDebt = ILPToken(_lpToken).rewardDebtOf(_account); if (userAmt > 0) { uint256 pendingAmt = userAmt.mul(poolRewardPerLPToken[_lpToken]).div(1e18).sub(userRewardDebt); if (pendingAmt > 0) { stkRewardsPerAPerLPT[_lpToken][_account] = stkRewardsPerAPerLPT[_lpToken][_account].add(pendingAmt); } } } function showHarvestRewards(address _account, address _lpToken) external view override returns (uint256) { return stkRewardsPerAPerLPT[_lpToken][_account]; } function harvestRewards( address _account, address _lpToken, address _to ) external override allowedCaller returns (uint256) { uint256 amtHas = stkRewardsPerAPerLPT[_lpToken][_account]; harvestedRewardsPerAPerLPT[_lpToken][_account] = harvestedRewardsPerAPerLPT[_lpToken][_account].add(amtHas); stkRewardsPerAPerLPT[_lpToken][_account] = 0; IERC20Upgradeable(insurTokenAddress).safeTransfer(_to, amtHas); return amtHas; } function getPoolRewardPerLPToken(address _lpToken) external view override returns (uint256) { return poolRewardPerLPToken[_lpToken]; } function addStkAmount(address _token, uint256 _amount) external payable override allowedCaller { if (_token == Constant.BCNATIVETOKENADDRESS) { require(msg.value == _amount, "ASA:1"); } stakedAmountPT[_token] = stakedAmountPT[_token].add(_amount); emit StakedAmountPTEvent(_token, stakedAmountPT[_token]); } function getStakedAmountPT(address _token) external view override returns (uint256) { return stakedAmountPT[_token]; } function withdrawTokens( address payable _to, uint256 _withdrawAmtAfterFee, address _token, address _feePool, uint256 _fee ) external override allowedCaller { require(_withdrawAmtAfterFee.add(_fee) <= stakedAmountPT[_token], "WDT:1"); require(_withdrawAmtAfterFee > 0, "WDT:2"); stakedAmountPT[_token] = stakedAmountPT[_token].sub(_withdrawAmtAfterFee); stakedAmountPT[_token] = stakedAmountPT[_token].sub(_fee); if (_token == Constant.BCNATIVETOKENADDRESS) { _to.transfer(_withdrawAmtAfterFee); } else { IERC20Upgradeable(_token).safeTransfer(_to, _withdrawAmtAfterFee); } if (_token == Constant.BCNATIVETOKENADDRESS) { IFeePool(_feePool).addUnstkFee{value: _fee}(_token, _fee); } else { IERC20Upgradeable(_token).safeTransfer(_feePool, _fee); IFeePool(_feePool).addUnstkFee(_token, _fee); } emit StakedAmountPTEvent(_token, stakedAmountPT[_token]); } event ClaimPayoutEvent(address _fromToken, address _paymentToken, uint256 _settleAmtPT, uint256 _claimId, uint256 _fromRate, uint256 _toRate); function claimPayout( address _fromToken, address _paymentToken, uint256 _settleAmtPT, address _claimToSettlementPool, uint256 _claimId, uint256 _fromRate, uint256 _toRate ) external override allowedCaller { if (_settleAmtPT == 0) { return; } uint256 amountIn = _settleAmtPT.mul(_fromRate).mul(10**8).div(_toRate).div(10**8); require(stakedAmountPT[_fromToken] >= amountIn, "claimP:1"); stakedAmountPT[_fromToken] = stakedAmountPT[_fromToken].sub(amountIn); _transferTokenTo(_fromToken, amountIn, _claimToSettlementPool); emit StakedAmountPTEvent(_fromToken, stakedAmountPT[_fromToken]); emit ClaimPayoutEvent(_fromToken, _paymentToken, _settleAmtPT, _claimId, _fromRate, _toRate); } function _transferTokenTo( address _paymentToken, uint256 _amt, address _claimToSettlementPool ) private { if (_paymentToken == Constant.BCNATIVETOKENADDRESS) { IClaimSettlementPool(_claimToSettlementPool).addSettlementAmount{value: _amt}(_paymentToken, _amt); } else { IERC20Upgradeable(_paymentToken).safeTransfer(_claimToSettlementPool, _amt); IClaimSettlementPool(_claimToSettlementPool).addSettlementAmount(_paymentToken, _amt); } } function getRewardToken() external view override returns (address) { return insurTokenAddress; } function getRewardPerBlockPerPool(address _lpToken) external view override returns (uint256) { return rewardPerBlock.mul(poolWeightPT[_lpToken]).div(totalPoolWeight); } function rebalancePools( uint256 _rewardPerBlock, address[] memory _lpTokens, uint256[] memory _weightList, uint256 _nonce, uint8[] memory v, bytes32[] memory r, bytes32[] memory s ) external allowedCaller { require(_rewardPerBlock > 0, "RBLNPL:1"); require(_lpTokens.length == _weightList.length, "RBLNPL:2"); require(v.length == 2 && r.length == 2 && s.length == 2, "RBLNPL:3"); require(_checkSignature(address(this), _rewardPerBlock, _lpTokens, _weightList, _nonce, v, r, s), "RBLNPL:4"); require(!nonceFlagMap[_nonce], "RBLNPL:5"); nonceFlagMap[_nonce] = true; reCalcAllPools(_lpTokens); rewardPerBlock = _rewardPerBlock; for (uint256 i = 0; i < _lpTokens.length; i++) { address lpToken = _lpTokens[i]; if (poolWeightPT[lpToken] != 0) { totalPoolWeight = totalPoolWeight.sub(poolWeightPT[lpToken]); } poolWeightPT[lpToken] = _weightList[i]; totalPoolWeight = totalPoolWeight.add(_weightList[i]); } emit SetRewardInfo(rewardStartBlock, rewardEndBlock, _rewardPerBlock); } function _checkSignature( address _scAddress, uint256 _rewardPerBlock, address[] memory _lpTokens, uint256[] memory _weightList, uint256 _nonce, uint8[] memory v, bytes32[] memory r, bytes32[] memory s ) internal view returns (bool) { bytes32 msgHash = keccak256(abi.encodePacked(_scAddress, _rewardPerBlock, _lpTokens, _weightList, _nonce)); bytes memory prefix = "\x19Ethereum Signed Message:\n32"; bytes32 prefixedHash = keccak256(abi.encodePacked(prefix, msgHash)); address signer1 = ecrecover(prefixedHash, v[0], r[0], s[0]); address signer2 = ecrecover(prefixedHash, v[1], r[1], s[1]); return (signer1 != signer2) && signerFlagMap[signer1] && signerFlagMap[signer2]; } event SetStakersPoolSignerEvent(address indexed signer, bool enabled); function setStakersPoolSigner(address signer, bool enabled) external onlyOwner { require(signer != address(0), "SSPS: 1"); signerFlagMap[signer] = enabled; emit SetStakersPoolSignerEvent(signer, enabled); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./IERC20Upgradeable.sol"; import "../../math/SafeMathUpgradeable.sol"; import "../../utils/AddressUpgradeable.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 SafeERC20Upgradeable { using SafeMathUpgradeable for uint256; using AddressUpgradeable for address; function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20Upgradeable 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(IERC20Upgradeable token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMathUpgradeable { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./ContextUpgradeable.sol"; import "../proxy/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../proxy/Initializable.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } uint256[49] private __gap; }
/* Copyright (C) 2020 InsurAce.io This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ */ // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.7.3; import "@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; import {ISecurityMatrix} from "./ISecurityMatrix.sol"; contract SecurityMatrix is ISecurityMatrix, OwnableUpgradeable, PausableUpgradeable, ReentrancyGuardUpgradeable { using SafeMathUpgradeable for uint256; using AddressUpgradeable for address; function initializeSecurityMatrix() public initializer { __Ownable_init(); __Pausable_init(); __ReentrancyGuard_init(); } // callee -> caller mapping(address => mapping(address => uint256)) public allowedCallersMap; mapping(address => address[]) public allowedCallersArray; address[] public allowedCallees; function pauseAll() external onlyOwner whenNotPaused { _pause(); } function unPauseAll() external onlyOwner whenPaused { _unpause(); } function addAllowdCallersPerCallee(address _callee, address[] memory _callers) external onlyOwner { require(_callers.length != 0, "AACPC:1"); require(allowedCallersArray[_callee].length != 0, "AACPC:2"); for (uint256 index = 0; index < _callers.length; index++) { allowedCallersArray[_callee].push(_callers[index]); allowedCallersMap[_callee][_callers[index]] = 1; } } function setAllowdCallersPerCallee(address _callee, address[] memory _callers) external onlyOwner { require(_callers.length != 0, "SACPC:1"); // check if callee exist if (allowedCallersArray[_callee].length == 0) { // not exist, so add callee allowedCallees.push(_callee); } else { // if callee exist, then purge data for (uint256 i = 0; i < allowedCallersArray[_callee].length; i++) { delete allowedCallersMap[_callee][allowedCallersArray[_callee][i]]; } delete allowedCallersArray[_callee]; } // and overwrite for (uint256 index = 0; index < _callers.length; index++) { allowedCallersArray[_callee].push(_callers[index]); allowedCallersMap[_callee][_callers[index]] = 1; } } function isAllowdCaller(address _callee, address _caller) external view override whenNotPaused returns (bool) { return allowedCallersMap[_callee][_caller] == 1 ? true : false; } function getAllowedCallees() external view returns (address[] memory) { return allowedCallees; } function getAllowedCallersPerCallee(address _callee) external view returns (address[] memory) { return allowedCallersArray[_callee]; } }
/* Copyright (C) 2020 InsurAce.io This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ */ // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.7.3; library Constant { // the standard 10**18 Amount Multiplier uint256 public constant MULTIPLIERX10E18 = 10**18; // the valid ETH and DAI addresses (Rinkeby, TBD: Mainnet) address public constant BCNATIVETOKENADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); // product status enumerations uint256 public constant PRODUCTSTATUS_ENABLED = 1; uint256 public constant PRODUCTSTATUS_DISABLED = 2; // the cover status enumerations uint256 public constant COVERSTATUS_ACTIVE = 0; uint256 public constant COVERSTATUS_EXPIRED = 1; uint256 public constant COVERSTATUS_CLAIMINPROGRESS = 2; uint256 public constant COVERSTATUS_CLAIMDONE = 3; uint256 public constant COVERSTATUS_CANCELLED = 4; // the claim status enumerations uint256 public constant CLAIMSTATUS_SUBMITTED = 0; uint256 public constant CLAIMSTATUS_INVESTIGATING = 1; uint256 public constant CLAIMSTATUS_PREPAREFORVOTING = 2; uint256 public constant CLAIMSTATUS_VOTING = 3; uint256 public constant CLAIMSTATUS_VOTINGCOMPLETED = 4; uint256 public constant CLAIMSTATUS_ABDISCRETION = 5; uint256 public constant CLAIMSTATUS_COMPLAINING = 6; uint256 public constant CLAIMSTATUS_COMPLAININGCOMPLETED = 7; uint256 public constant CLAIMSTATUS_ACCEPTED = 8; uint256 public constant CLAIMSTATUS_REJECTED = 9; uint256 public constant CLAIMSTATUS_PAYOUTREADY = 10; uint256 public constant CLAIMSTATUS_PAID = 11; // the voting outcome status enumerations uint256 public constant OUTCOMESTATUS_NONE = 0; uint256 public constant OUTCOMESTATUS_ACCEPTED = 1; uint256 public constant OUTCOMESTATUS_REJECTED = 2; // the referral reward type uint256 public constant REFERRALREWARD_NONE = 0; uint256 public constant REFERRALREWARD_COVER = 1; uint256 public constant REFERRALREWARD_STAKING = 2; }
/* Copyright (C) 2020 InsurAce.io This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ */ // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.7.3; interface IStakersPoolV2 { function addStkAmount(address _token, uint256 _amount) external payable; function withdrawTokens( address payable _to, uint256 _amount, address _token, address _feePool, uint256 _fee ) external; function reCalcPoolPT(address _lpToken) external; function settlePendingRewards(address _account, address _lpToken) external; function harvestRewards( address _account, address _lpToken, address _to ) external returns (uint256); function getPoolRewardPerLPToken(address _lpToken) external view returns (uint256); function getStakedAmountPT(address _token) external view returns (uint256); function showPendingRewards(address _account, address _lpToken) external view returns (uint256); function showHarvestRewards(address _account, address _lpToken) external view returns (uint256); function getRewardToken() external view returns (address); function getRewardPerBlockPerPool(address _lpToken) external view returns (uint256); function claimPayout( address _fromToken, address _paymentToken, uint256 _settleAmtPT, address _claimToSettlementPool, uint256 _claimId, uint256 _fromRate, uint256 _toRate ) external; }
/* Copyright (C) 2020 InsurAce.io This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ */ // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.7.3; interface IFeePool { function addUnstkFee(address _token, uint256 _fee) external payable; function addClaimFee(address _token, uint256 _fee) external payable; function addComplainFee(address _token, uint256 _fee) external payable; }
/* Copyright (C) 2020 InsurAce.io This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ */ // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.7.3; interface ILPToken { function proposeToBurn( address _account, uint256 _amount, uint256 _blockWeight ) external; function mint( address _account, uint256 _amount, uint256 _poolRewardPerLPToken ) external; function rewardDebtOf(address _account) external view returns (uint256); function burnableAmtOf(address _account) external view returns (uint256); function burn( address _account, uint256 _amount, uint256 _poolRewardPerLPToken ) external; }
/* Copyright (C) 2020 InsurAce.io This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ */ // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.7.3; import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; // a library for performing various math operations library Math { using SafeMathUpgradeable for uint256; function max(uint256 x, uint256 y) internal pure returns (uint256) { return x < y ? y : x; } function min(uint256 x, uint256 y) internal pure returns (uint256) { return x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y.div(2).add(1); while (x < z) { z = x; x = (y.div(x).add(x)).div(2); } } else if (y != 0) { z = 1; } } // power private function function pow(uint256 _base, uint256 _exponent) internal pure returns (uint256) { if (_exponent == 0) { return 1; } else if (_exponent == 1) { return _base; } else if (_base == 0 && _exponent != 0) { return 0; } else { uint256 z = _base; for (uint256 i = 1; i < _exponent; i++) { z = z.mul(_base); } return z; } } }
/* Copyright (C) 2020 InsurAce.io This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ */ // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.7.3; interface IClaimSettlementPool { function addSettlementAmount(address _token, uint256 _fee) external payable; function withdrawSettlementAmount( address _token, address payable _toAddress, uint256 _amount ) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../proxy/Initializable.sol"; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; }
// SPDX-License-Identifier: MIT // solhint-disable-next-line compiler-version pragma solidity >=0.4.24 <0.8.0; import "../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
/* Copyright (C) 2020 InsurAce.io This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/ */ // SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.7.3; interface ISecurityMatrix { function isAllowdCaller(address _callee, address _caller) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_fromToken","type":"address"},{"indexed":false,"internalType":"address","name":"_paymentToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"_settleAmtPT","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_claimId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_fromRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_toRate","type":"uint256"}],"name":"ClaimPayoutEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_rewardStartBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_rewardEndBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"SetRewardInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"signer","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"SetStakersPoolSignerEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_token","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"StakedAmountPTEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addStkAmount","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_fromToken","type":"address"},{"internalType":"address","name":"_paymentToken","type":"address"},{"internalType":"uint256","name":"_settleAmtPT","type":"uint256"},{"internalType":"address","name":"_claimToSettlementPool","type":"address"},{"internalType":"uint256","name":"_claimId","type":"uint256"},{"internalType":"uint256","name":"_fromRate","type":"uint256"},{"internalType":"uint256","name":"_toRate","type":"uint256"}],"name":"claimPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"}],"name":"getPoolRewardPerLPToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"}],"name":"getRewardPerBlockPerPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"getStakedAmountPT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"harvestRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"harvestedRewardsPerAPerLPT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initializeStakersPoolV2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"insurTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nonceFlagMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolLastCalcBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolRewardPerLPToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poolWeightPT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"}],"name":"reCalcPoolPT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"address[]","name":"_lpTokens","type":"address[]"},{"internalType":"uint256[]","name":"_weightList","type":"uint256[]"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint8[]","name":"v","type":"uint8[]"},{"internalType":"bytes32[]","name":"r","type":"bytes32[]"},{"internalType":"bytes32[]","name":"s","type":"bytes32[]"}],"name":"rebalancePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"securityMatrix","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_poolWeightPT","type":"uint256"},{"internalType":"address[]","name":"_lpTokens","type":"address[]"}],"name":"setPoolWeight","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardStartBlock","type":"uint256"},{"internalType":"uint256","name":"_rewardEndBlock","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"address[]","name":"_lpTokens","type":"address[]"}],"name":"setRewardInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"signer","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setStakersPoolSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_lpToken","type":"address"}],"name":"settlePendingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_securityMatrix","type":"address"},{"internalType":"address","name":"_insurTokenAddress","type":"address"}],"name":"setup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_lpToken","type":"address"}],"name":"showHarvestRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"address","name":"_lpToken","type":"address"}],"name":"showPendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"signerFlagMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakedAmountPT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"stkRewardsPerAPerLPT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPoolWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_withdrawAmtAfterFee","type":"uint256"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_feePool","type":"address"},{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613930806100206000396000f3fe60806040526004361061020f5760003560e01c80638da5cb5b11610118578063c5883438116100a0578063e85da91e1161006f578063e85da91e14610b56578063f1383b4814610b89578063f2fde38b14610bb5578063f4e6ae3214610be8578063fb25e5b914610c395761020f565b8063c5883438146109e4578063cb381fdf14610a1f578063d21df23014610a5a578063d4d2911314610a955761020f565b8063b2d2900f116100e7578063b2d2900f14610937578063b676ceed1461094c578063b870029c14610987578063bb1200331461099c578063bea4b343146109b15761020f565b80638da5cb5b146106035780638dae81ff146106185780639e9df5d71461062d578063a84885b2146106725761020f565b80633f56df9f1161019b57806369940d791161016a57806369940d7914610542578063715018a61461057357806382380a121461058857806383853109146105bb5780638ae39cac146105ee5761020f565b80633f56df9f146104b25780635c975abb146104e5578063604ef2e5146104fa57806368198b801461050f5761020f565b806312d1073d116101e257806312d1073d146103135780631a68f8cb1461034657806321515e6514610409578063231c336e1461043c5780632d34ba79146104775761020f565b80630153385c1461021457806302559004146102735780630402d2251461029a5780630721f749146102d5575b600080fd5b34801561022057600080fd5b50610271600480360360e081101561023757600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359091169060808101359060a08101359060c00135610c6c565b005b34801561027f57600080fd5b50610288610ef4565b60408051918252519081900360200190f35b3480156102a657600080fd5b50610288600480360360408110156102bd57600080fd5b506001600160a01b0381358116916020013516610efa565b3480156102e157600080fd5b506102ff600480360360208110156102f857600080fd5b5035610f27565b604080519115158252519081900360200190f35b34801561031f57600080fd5b506102886004803603602081101561033657600080fd5b50356001600160a01b0316610f3c565b34801561035257600080fd5b506102716004803603606081101561036957600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561039857600080fd5b8201836020820111156103aa57600080fd5b803590602001918460208302840111600160201b831117156103cb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610f4e945050505050565b34801561041557600080fd5b506102886004803603602081101561042c57600080fd5b50356001600160a01b0316611030565b34801561044857600080fd5b506102886004803603604081101561045f57600080fd5b506001600160a01b0381358116916020013516611042565b34801561048357600080fd5b506102716004803603604081101561049a57600080fd5b506001600160a01b03813581169160200135166112fc565b3480156104be57600080fd5b50610288600480360360208110156104d557600080fd5b50356001600160a01b031661141b565b3480156104f157600080fd5b506102ff61142d565b34801561050657600080fd5b50610288611436565b34801561051b57600080fd5b506102886004803603602081101561053257600080fd5b50356001600160a01b031661143c565b34801561054e57600080fd5b50610557611457565b604080516001600160a01b039092168252519081900360200190f35b34801561057f57600080fd5b50610271611466565b34801561059457600080fd5b50610271600480360360208110156105ab57600080fd5b50356001600160a01b0316611512565b3480156105c757600080fd5b50610288600480360360208110156105de57600080fd5b50356001600160a01b031661175a565b3480156105fa57600080fd5b50610288611775565b34801561060f57600080fd5b5061055761177b565b34801561062457600080fd5b5061055761178a565b34801561063957600080fd5b506102886004803603606081101561065057600080fd5b506001600160a01b038135811691602081013582169160409091013516611799565b34801561067e57600080fd5b50610271600480360360e081101561069557600080fd5b81359190810190604081016020820135600160201b8111156106b657600080fd5b8201836020820111156106c857600080fd5b803590602001918460208302840111600160201b831117156106e957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561073857600080fd5b82018360208201111561074a57600080fd5b803590602001918460208302840111600160201b8311171561076b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092958435959094909350604081019250602001359050600160201b8111156107c257600080fd5b8201836020820111156107d457600080fd5b803590602001918460208302840111600160201b831117156107f557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561084457600080fd5b82018360208201111561085657600080fd5b803590602001918460208302840111600160201b8311171561087757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156108c657600080fd5b8201836020820111156108d857600080fd5b803590602001918460208302840111600160201b831117156108f957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061193e945050505050565b34801561094357600080fd5b50610288611d15565b34801561095857600080fd5b506102716004803603604081101561096f57600080fd5b506001600160a01b0381351690602001351515611d1b565b34801561099357600080fd5b50610557611e22565b3480156109a857600080fd5b50610271611e31565b3480156109bd57600080fd5b506102ff600480360360208110156109d457600080fd5b50356001600160a01b0316611eea565b3480156109f057600080fd5b5061028860048036036040811015610a0757600080fd5b506001600160a01b0381358116916020013516611eff565b348015610a2b57600080fd5b5061028860048036036040811015610a4257600080fd5b506001600160a01b0381358116916020013516611f1c565b348015610a6657600080fd5b5061027160048036036040811015610a7d57600080fd5b506001600160a01b0381358116916020013516611f39565b348015610aa157600080fd5b5061027160048036036080811015610ab857600080fd5b81359160208101359160408201359190810190608081016060820135600160201b811115610ae557600080fd5b820183602082011115610af757600080fd5b803590602001918460208302840111600160201b83111715610b1857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506121d5945050505050565b348015610b6257600080fd5b5061028860048036036020811015610b7957600080fd5b50356001600160a01b0316612336565b61027160048036036040811015610b9f57600080fd5b506001600160a01b038135169060200135612348565b348015610bc157600080fd5b5061027160048036036020811015610bd857600080fd5b50356001600160a01b0316612521565b348015610bf457600080fd5b50610271600480360360a0811015610c0b57600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359091169060800135612624565b348015610c4557600080fd5b5061028860048036036020811015610c5c57600080fd5b50356001600160a01b03166129ff565b60c9546001600160a01b0316632a1450ea30610c86612a30565b6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015610cd357600080fd5b505afa158015610ce7573d6000803e3d6000fd5b505050506040513d6020811015610cfd57600080fd5b505180610d295750610d0d61177b565b6001600160a01b0316610d1e612a30565b6001600160a01b0316145b610d6a576040805162461bcd60e51b815260206004820152600d60248201526c30b63637bbb2b221b0b63632b960991b604482015290519081900360640190fd5b84610d7457610eeb565b6000610d9a6305f5e100610d94848183610d8e8c8a612a34565b90612a34565b90612a8d565b6001600160a01b038916600090815260cb6020526040902054909150811115610df5576040805162461bcd60e51b8152602060048201526008602482015267636c61696d503a3160c01b604482015290519081900360640190fd5b6001600160a01b038816600090815260cb6020526040902054610e189082612af4565b6001600160a01b038916600090815260cb6020526040902055610e3c888287612b51565b6001600160a01b038816600081815260cb602090815260409182902054825190815291517f869cddd9ceefec21b41c5cb67af8832399fec4f039442688829b60d4cca77ea29281900390910190a2604080516001600160a01b03808b16825289166020820152808201889052606081018690526080810185905260a0810184905290517f27f18772070ad33f5cb0d7f0b3d2268ee0f6b88b3aeb67b242ab9d624e3b8efa9181900360c00190a1505b50505050505050565b60ce5481565b6001600160a01b03808216600090815260d360209081526040808320938616835292905220545b92915050565b60d66020526000908152604090205460ff1681565b60cd6020526000908152604090205481565b610f56612a30565b6001600160a01b0316610f6761177b565b6001600160a01b031614610fb0576040805162461bcd60e51b815260206004820181905260248201526000805160206138b1833981519152604482015290519081900360640190fd5b610fb981612c6f565b6001600160a01b038316600090815260cd602052604090205415611000576001600160a01b038316600090815260cd602052604090205460ce54610ffc91612af4565b60ce555b6001600160a01b038316600090815260cd6020526040902082905560ce546110289083612ca3565b60ce55505050565b60cb6020526000908152604090205481565b600080600090506000836001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561109857600080fd5b505afa1580156110ac573d6000803e3d6000fd5b505050506040513d60208110156110c257600080fd5b5051604080516312ecaf9d60e21b81526001600160a01b038881166004830152915192935060009291871691634bb2be7491602480820192602092909190829003018186803b15801561111457600080fd5b505afa158015611128573d6000803e3d6000fd5b505050506040513d602081101561113e57600080fd5b5051604080516318160ddd60e01b815290519192506000916001600160a01b038816916318160ddd916004808301926020929190829003018186803b15801561118657600080fd5b505afa15801561119a573d6000803e3d6000fd5b505050506040513d60208110156111b057600080fd5b50516001600160a01b038716600090815260cc60205260409020549091504314156111e2576000945050505050610f21565b6001600160a01b038616600090815260cc6020526040902054431180156112095750600081115b1561127c576001600160a01b038616600090815260cc602090815260408083205460cd90925282205461123e91904390612cfd565b905061127861125983610d9484670de0b6b3a7640000612a34565b6001600160a01b038916600090815260cf602052604090205490612ca3565b9450505b81611293670de0b6b3a7640000610d948688612a34565b10156112d1576040805162461bcd60e51b815260206004820152600860248201526773686f7750523a3160c01b604482015290519081900360640190fd5b6112f1826112eb670de0b6b3a7640000610d948789612a34565b90612af4565b979650505050505050565b611304612a30565b6001600160a01b031661131561177b565b6001600160a01b03161461135e576040805162461bcd60e51b815260206004820181905260248201526000805160206138b1833981519152604482015290519081900360640190fd5b6001600160a01b03821661139f576040805162461bcd60e51b8152602060048201526003602482015262533a3160e81b604482015290519081900360640190fd5b60c980546001600160a01b0319166001600160a01b038481169190911790915581166113f8576040805162461bcd60e51b8152602060048201526003602482015262299d1960e91b604482015290519081900360640190fd5b60ca80546001600160a01b0319166001600160a01b039290921691909117905550565b60cc6020526000908152604090205481565b60655460ff1690565b60d15481565b6001600160a01b0316600090815260cb602052604090205490565b60ca546001600160a01b031690565b61146e612a30565b6001600160a01b031661147f61177b565b6001600160a01b0316146114c8576040805162461bcd60e51b815260206004820181905260248201526000805160206138b1833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b60c9546001600160a01b0316632a1450ea3061152c612a30565b6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561157957600080fd5b505afa15801561158d573d6000803e3d6000fd5b505050506040513d60208110156115a357600080fd5b5051806115cf57506115b361177b565b6001600160a01b03166115c4612a30565b6001600160a01b0316145b611610576040805162461bcd60e51b815260206004820152600d60248201526c30b63637bbb2b221b0b63632b960991b604482015290519081900360640190fd5b6001600160a01b038116600090815260cc6020526040902054431161163457611757565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561166f57600080fd5b505afa158015611683573d6000803e3d6000fd5b505050506040513d602081101561169957600080fd5b50519050806116c357506001600160a01b038116600090815260cc60205260409020439055611757565b6001600160a01b038216600090815260cc602090815260408083205460cd9092528220546116f391904390612cfd565b905061172d61170e83610d9484670de0b6b3a7640000612a34565b6001600160a01b038516600090815260cf602052604090205490612ca3565b6001600160a01b038416600090815260cf602090815260408083209390935560cc90522043905550505b50565b6001600160a01b0316600090815260cf602052604090205490565b60d25481565b6033546001600160a01b031690565b60ca546001600160a01b031681565b60c9546000906001600160a01b0316632a1450ea306117b6612a30565b6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561180357600080fd5b505afa158015611817573d6000803e3d6000fd5b505050506040513d602081101561182d57600080fd5b505180611859575061183d61177b565b6001600160a01b031661184e612a30565b6001600160a01b0316145b61189a576040805162461bcd60e51b815260206004820152600d60248201526c30b63637bbb2b221b0b63632b960991b604482015290519081900360640190fd5b6001600160a01b03808416600081815260d3602090815260408083209489168084529482528083205493835260d4825280832094835293905291909120546118e29082612ca3565b6001600160a01b03808616600081815260d4602090815260408083208b86168085529083528184209690965592825260d381528282209482529390935282209190915560ca5461193491168483612d6b565b90505b9392505050565b60c9546001600160a01b0316632a1450ea30611958612a30565b6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156119a557600080fd5b505afa1580156119b9573d6000803e3d6000fd5b505050506040513d60208110156119cf57600080fd5b5051806119fb57506119df61177b565b6001600160a01b03166119f0612a30565b6001600160a01b0316145b611a3c576040805162461bcd60e51b815260206004820152600d60248201526c30b63637bbb2b221b0b63632b960991b604482015290519081900360640190fd5b60008711611a7c576040805162461bcd60e51b815260206004820152600860248201526752424c4e504c3a3160c01b604482015290519081900360640190fd5b8451865114611abd576040805162461bcd60e51b81526020600482015260086024820152672921262728261d1960c11b604482015290519081900360640190fd5b82516002148015611acf575081516002145b8015611adc575080516002145b611b18576040805162461bcd60e51b815260206004820152600860248201526752424c4e504c3a3360c01b604482015290519081900360640190fd5b611b283088888888888888612dbd565b611b64576040805162461bcd60e51b81526020600482015260086024820152671490931394130e8d60c21b604482015290519081900360640190fd5b600084815260d6602052604090205460ff1615611bb3576040805162461bcd60e51b815260206004820152600860248201526752424c4e504c3a3560c01b604482015290519081900360640190fd5b600084815260d660205260409020805460ff19166001179055611bd586612c6f565b60d287905560005b8651811015611cc5576000878281518110611bf457fe5b6020026020010151905060cd6000826001600160a01b03166001600160a01b0316815260200190815260200160002054600014611c54576001600160a01b038116600090815260cd602052604090205460ce54611c5091612af4565b60ce555b868281518110611c6057fe5b602002602001015160cd6000836001600160a01b03166001600160a01b0316815260200190815260200160002081905550611cb9878381518110611ca057fe5b602002602001015160ce54612ca390919063ffffffff16565b60ce5550600101611bdd565b5060d05460d154604080519283526020830191909152818101899052517f2271d36c0d624706467e414cd8c9602fa0beb4a0b5388417796fc40473aef2c99181900360600190a150505050505050565b60d05481565b611d23612a30565b6001600160a01b0316611d3461177b565b6001600160a01b031614611d7d576040805162461bcd60e51b815260206004820181905260248201526000805160206138b1833981519152604482015290519081900360640190fd5b6001600160a01b038216611dc2576040805162461bcd60e51b8152602060048201526007602482015266535350533a203160c81b604482015290519081900360640190fd5b6001600160a01b038216600081815260d56020908152604091829020805460ff1916851515908117909155825190815291517f45d58074c7e0537f8f5ffa497b119a71c3559d5746720dcb0ef78a2f28fe8df89281900390910190a25050565b60c9546001600160a01b031681565b600054610100900460ff1680611e4a5750611e4a6130d5565b80611e58575060005460ff16155b611e935760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff16158015611ebe576000805460ff1961ff0019909116610100171660011790555b611ec66130e6565b611ece613183565b611ed6613220565b8015611757576000805461ff001916905550565b60d56020526000908152604090205460ff1681565b60d360209081526000928352604080842090915290825290205481565b60d460209081526000928352604080842090915290825290205481565b60c9546001600160a01b0316632a1450ea30611f53612a30565b6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015611fa057600080fd5b505afa158015611fb4573d6000803e3d6000fd5b505050506040513d6020811015611fca57600080fd5b505180611ff65750611fda61177b565b6001600160a01b0316611feb612a30565b6001600160a01b0316145b612037576040805162461bcd60e51b815260206004820152600d60248201526c30b63637bbb2b221b0b63632b960991b604482015290519081900360640190fd5b6000816001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561208657600080fd5b505afa15801561209a573d6000803e3d6000fd5b505050506040513d60208110156120b057600080fd5b5051604080516312ecaf9d60e21b81526001600160a01b038681166004830152915192935060009291851691634bb2be7491602480820192602092909190829003018186803b15801561210257600080fd5b505afa158015612116573d6000803e3d6000fd5b505050506040513d602081101561212c57600080fd5b5051905081156121cf576001600160a01b038316600090815260cf602052604081205461216e9083906112eb90670de0b6b3a764000090610d94908890612a34565b905080156121cd576001600160a01b03808516600090815260d360209081526040808320938916835292905220546121a69082612ca3565b6001600160a01b03808616600090815260d360209081526040808320938a16835292905220555b505b50505050565b6121dd612a30565b6001600160a01b03166121ee61177b565b6001600160a01b031614612237576040805162461bcd60e51b815260206004820181905260248201526000805160206138b1833981519152604482015290519081900360640190fd5b828410612273576040805162461bcd60e51b81526020600482015260056024820152645352493a3160d81b604482015290519081900360640190fd5b8243106122af576040805162461bcd60e51b815260206004820152600560248201526429a9249d1960d91b604482015290519081900360640190fd5b6122b881612c6f565b60d15443111580156122cc575060d0544310155b156122e05760d183905560d28290556122f0565b60d084905560d183905560d28290555b604080518581526020810185905280820184905290517f2271d36c0d624706467e414cd8c9602fa0beb4a0b5388417796fc40473aef2c99181900360600190a150505050565b60cf6020526000908152604090205481565b60c9546001600160a01b0316632a1450ea30612362612a30565b6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156123af57600080fd5b505afa1580156123c3573d6000803e3d6000fd5b505050506040513d60208110156123d957600080fd5b50518061240557506123e961177b565b6001600160a01b03166123fa612a30565b6001600160a01b0316145b612446576040805162461bcd60e51b815260206004820152600d60248201526c30b63637bbb2b221b0b63632b960991b604482015290519081900360640190fd5b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156124a7578034146124a7576040805162461bcd60e51b81526020600482015260056024820152644153413a3160d81b604482015290519081900360640190fd5b6001600160a01b038216600090815260cb60205260409020546124ca9082612ca3565b6001600160a01b038316600081815260cb60209081526040918290208490558151938452905191927f869cddd9ceefec21b41c5cb67af8832399fec4f039442688829b60d4cca77ea2929081900390910190a25050565b612529612a30565b6001600160a01b031661253a61177b565b6001600160a01b031614612583576040805162461bcd60e51b815260206004820181905260248201526000805160206138b1833981519152604482015290519081900360640190fd5b6001600160a01b0381166125c85760405162461bcd60e51b815260040180806020018281038252602681526020018061383c6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b60c9546001600160a01b0316632a1450ea3061263e612a30565b6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561268b57600080fd5b505afa15801561269f573d6000803e3d6000fd5b505050506040513d60208110156126b557600080fd5b5051806126e157506126c561177b565b6001600160a01b03166126d6612a30565b6001600160a01b0316145b612722576040805162461bcd60e51b815260206004820152600d60248201526c30b63637bbb2b221b0b63632b960991b604482015290519081900360640190fd5b6001600160a01b038316600090815260cb60205260409020546127458583612ca3565b1115612780576040805162461bcd60e51b81526020600482015260056024820152645744543a3160d81b604482015290519081900360640190fd5b600084116127bd576040805162461bcd60e51b81526020600482015260056024820152642ba22a1d1960d91b604482015290519081900360640190fd5b6001600160a01b038316600090815260cb60205260409020546127e09085612af4565b6001600160a01b038416600090815260cb602052604090208190556128059082612af4565b6001600160a01b038416600081815260cb602052604090209190915573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612878576040516001600160a01b0386169085156108fc029086906000818181858888f19350505050158015612872573d6000803e3d6000fd5b5061288c565b61288c6001600160a01b0384168686612d6b565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561292657816001600160a01b031663cc924c0b8285846040518463ffffffff1660e01b815260040180836001600160a01b03168152602001828152602001925050506000604051808303818588803b15801561290857600080fd5b505af115801561291c573d6000803e3d6000fd5b50505050506129aa565b61293a6001600160a01b0384168383612d6b565b816001600160a01b031663cc924c0b84836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561299157600080fd5b505af11580156129a5573d6000803e3d6000fd5b505050505b6001600160a01b038316600081815260cb602090815260409182902054825190815291517f869cddd9ceefec21b41c5cb67af8832399fec4f039442688829b60d4cca77ea29281900390910190a25050505050565b60ce546001600160a01b038216600090815260cd602052604081205460d2549192610f21929091610d949190612a34565b3390565b600082612a4357506000610f21565b82820282848281612a5057fe5b04146119375760405162461bcd60e51b81526004018080602001828103825260218152602001806138906021913960400191505060405180910390fd5b6000808211612ae3576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612aec57fe5b049392505050565b600082821115612b4b576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612beb57806001600160a01b031663a237a7158385856040518463ffffffff1660e01b815260040180836001600160a01b03168152602001828152602001925050506000604051808303818588803b158015612bcd57600080fd5b505af1158015612be1573d6000803e3d6000fd5b5050505050612c6a565b612bff6001600160a01b0384168284612d6b565b806001600160a01b031663a237a71584846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612c5657600080fd5b505af1158015610eeb573d6000803e3d6000fd5b505050565b60005b8151811015612c9f57612c97828281518110612c8a57fe5b6020026020010151611512565b600101612c72565b5050565b600082820183811015611937576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080612d0c8560d0546132b5565b90506000612d1c8560d1546132ca565b9050818111612d3057600092505050611937565b6000612d3c8284612af4565b90506000612d5f60ce54610d9488610d8e60d25487612a3490919063ffffffff16565b98975050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612c6a9084906132e0565b600080898989898960405160200180866001600160a01b031660601b8152601401858152602001848051906020019060200280838360005b83811015612e0d578181015183820152602001612df5565b50505050905001838051906020019060200280838360005b83811015612e3d578181015183820152602001612e25565b505050509050018281526020019550505050505060405160208183030381529060405280519060200120905060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081836040516020018083805190602001908083835b60208310612ed95780518252601f199092019160209182019101612eba565b6001836020036101000a03801982511681845116808217855250505050505090500182815260200192505050604051602081830303815290604052805190602001209050600060018289600081518110612f2f57fe5b602002602001015189600081518110612f4457fe5b602002602001015189600081518110612f5957fe5b602002602001015160405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612fb5573d6000803e3d6000fd5b50505060206040510351905060006001838a600181518110612fd357fe5b60200260200101518a600181518110612fe857fe5b60200260200101518a600181518110612ffd57fe5b602002602001015160405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015613059573d6000803e3d6000fd5b505050602060405103519050806001600160a01b0316826001600160a01b03161415801561309f57506001600160a01b038216600090815260d5602052604090205460ff165b80156130c357506001600160a01b038116600090815260d5602052604090205460ff165b9e9d5050505050505050505050505050565b60006130e030613391565b15905090565b600054610100900460ff16806130ff57506130ff6130d5565b8061310d575060005460ff16155b6131485760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff16158015613173576000805460ff1961ff0019909116610100171660011790555b61317b613397565b611ed6613437565b600054610100900460ff168061319c575061319c6130d5565b806131aa575060005460ff16155b6131e55760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff16158015613210576000805460ff1961ff0019909116610100171660011790555b613218613397565b611ed6613530565b600054610100900460ff168061323957506132396130d5565b80613247575060005460ff16155b6132825760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff161580156132ad576000805460ff1961ff0019909116610100171660011790555b611ed66135db565b60008183106132c45782611937565b50919050565b60008183106132d95781611937565b5090919050565b6060613335826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136819092919063ffffffff16565b805190915015612c6a5780806020019051602081101561335457600080fd5b5051612c6a5760405162461bcd60e51b815260040180806020018281038252602a8152602001806138d1602a913960400191505060405180910390fd5b3b151590565b600054610100900460ff16806133b057506133b06130d5565b806133be575060005460ff16155b6133f95760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff16158015611ed6576000805460ff1961ff0019909116610100171660011790558015611757576000805461ff001916905550565b600054610100900460ff168061345057506134506130d5565b8061345e575060005460ff16155b6134995760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff161580156134c4576000805460ff1961ff0019909116610100171660011790555b60006134ce612a30565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611757576000805461ff001916905550565b600054610100900460ff168061354957506135496130d5565b80613557575060005460ff16155b6135925760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff161580156135bd576000805460ff1961ff0019909116610100171660011790555b6065805460ff191690558015611757576000805461ff001916905550565b600054610100900460ff16806135f457506135f46130d5565b80613602575060005460ff16155b61363d5760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff16158015613668576000805460ff1961ff0019909116610100171660011790555b60016097558015611757576000805461ff001916905550565b606061193484846000858561369585613391565b6136e6576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106137255780518252601f199092019160209182019101613706565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613787576040519150601f19603f3d011682016040523d82523d6000602084013e61378c565b606091505b50915091506112f1828286606083156137a6575081611937565b8251156137b65782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156138005781810151838201526020016137e8565b50505050905090810190601f16801561382d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220fe2444eeb5f5a18dc53b8acc580b66676f457dbafaf625f1cf643afd98b6a17a64736f6c63430007030033
Deployed Bytecode
0x60806040526004361061020f5760003560e01c80638da5cb5b11610118578063c5883438116100a0578063e85da91e1161006f578063e85da91e14610b56578063f1383b4814610b89578063f2fde38b14610bb5578063f4e6ae3214610be8578063fb25e5b914610c395761020f565b8063c5883438146109e4578063cb381fdf14610a1f578063d21df23014610a5a578063d4d2911314610a955761020f565b8063b2d2900f116100e7578063b2d2900f14610937578063b676ceed1461094c578063b870029c14610987578063bb1200331461099c578063bea4b343146109b15761020f565b80638da5cb5b146106035780638dae81ff146106185780639e9df5d71461062d578063a84885b2146106725761020f565b80633f56df9f1161019b57806369940d791161016a57806369940d7914610542578063715018a61461057357806382380a121461058857806383853109146105bb5780638ae39cac146105ee5761020f565b80633f56df9f146104b25780635c975abb146104e5578063604ef2e5146104fa57806368198b801461050f5761020f565b806312d1073d116101e257806312d1073d146103135780631a68f8cb1461034657806321515e6514610409578063231c336e1461043c5780632d34ba79146104775761020f565b80630153385c1461021457806302559004146102735780630402d2251461029a5780630721f749146102d5575b600080fd5b34801561022057600080fd5b50610271600480360360e081101561023757600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359091169060808101359060a08101359060c00135610c6c565b005b34801561027f57600080fd5b50610288610ef4565b60408051918252519081900360200190f35b3480156102a657600080fd5b50610288600480360360408110156102bd57600080fd5b506001600160a01b0381358116916020013516610efa565b3480156102e157600080fd5b506102ff600480360360208110156102f857600080fd5b5035610f27565b604080519115158252519081900360200190f35b34801561031f57600080fd5b506102886004803603602081101561033657600080fd5b50356001600160a01b0316610f3c565b34801561035257600080fd5b506102716004803603606081101561036957600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561039857600080fd5b8201836020820111156103aa57600080fd5b803590602001918460208302840111600160201b831117156103cb57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610f4e945050505050565b34801561041557600080fd5b506102886004803603602081101561042c57600080fd5b50356001600160a01b0316611030565b34801561044857600080fd5b506102886004803603604081101561045f57600080fd5b506001600160a01b0381358116916020013516611042565b34801561048357600080fd5b506102716004803603604081101561049a57600080fd5b506001600160a01b03813581169160200135166112fc565b3480156104be57600080fd5b50610288600480360360208110156104d557600080fd5b50356001600160a01b031661141b565b3480156104f157600080fd5b506102ff61142d565b34801561050657600080fd5b50610288611436565b34801561051b57600080fd5b506102886004803603602081101561053257600080fd5b50356001600160a01b031661143c565b34801561054e57600080fd5b50610557611457565b604080516001600160a01b039092168252519081900360200190f35b34801561057f57600080fd5b50610271611466565b34801561059457600080fd5b50610271600480360360208110156105ab57600080fd5b50356001600160a01b0316611512565b3480156105c757600080fd5b50610288600480360360208110156105de57600080fd5b50356001600160a01b031661175a565b3480156105fa57600080fd5b50610288611775565b34801561060f57600080fd5b5061055761177b565b34801561062457600080fd5b5061055761178a565b34801561063957600080fd5b506102886004803603606081101561065057600080fd5b506001600160a01b038135811691602081013582169160409091013516611799565b34801561067e57600080fd5b50610271600480360360e081101561069557600080fd5b81359190810190604081016020820135600160201b8111156106b657600080fd5b8201836020820111156106c857600080fd5b803590602001918460208302840111600160201b831117156106e957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561073857600080fd5b82018360208201111561074a57600080fd5b803590602001918460208302840111600160201b8311171561076b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092958435959094909350604081019250602001359050600160201b8111156107c257600080fd5b8201836020820111156107d457600080fd5b803590602001918460208302840111600160201b831117156107f557600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561084457600080fd5b82018360208201111561085657600080fd5b803590602001918460208302840111600160201b8311171561087757600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b8111156108c657600080fd5b8201836020820111156108d857600080fd5b803590602001918460208302840111600160201b831117156108f957600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061193e945050505050565b34801561094357600080fd5b50610288611d15565b34801561095857600080fd5b506102716004803603604081101561096f57600080fd5b506001600160a01b0381351690602001351515611d1b565b34801561099357600080fd5b50610557611e22565b3480156109a857600080fd5b50610271611e31565b3480156109bd57600080fd5b506102ff600480360360208110156109d457600080fd5b50356001600160a01b0316611eea565b3480156109f057600080fd5b5061028860048036036040811015610a0757600080fd5b506001600160a01b0381358116916020013516611eff565b348015610a2b57600080fd5b5061028860048036036040811015610a4257600080fd5b506001600160a01b0381358116916020013516611f1c565b348015610a6657600080fd5b5061027160048036036040811015610a7d57600080fd5b506001600160a01b0381358116916020013516611f39565b348015610aa157600080fd5b5061027160048036036080811015610ab857600080fd5b81359160208101359160408201359190810190608081016060820135600160201b811115610ae557600080fd5b820183602082011115610af757600080fd5b803590602001918460208302840111600160201b83111715610b1857600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506121d5945050505050565b348015610b6257600080fd5b5061028860048036036020811015610b7957600080fd5b50356001600160a01b0316612336565b61027160048036036040811015610b9f57600080fd5b506001600160a01b038135169060200135612348565b348015610bc157600080fd5b5061027160048036036020811015610bd857600080fd5b50356001600160a01b0316612521565b348015610bf457600080fd5b50610271600480360360a0811015610c0b57600080fd5b506001600160a01b038135811691602081013591604082013581169160608101359091169060800135612624565b348015610c4557600080fd5b5061028860048036036020811015610c5c57600080fd5b50356001600160a01b03166129ff565b60c9546001600160a01b0316632a1450ea30610c86612a30565b6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015610cd357600080fd5b505afa158015610ce7573d6000803e3d6000fd5b505050506040513d6020811015610cfd57600080fd5b505180610d295750610d0d61177b565b6001600160a01b0316610d1e612a30565b6001600160a01b0316145b610d6a576040805162461bcd60e51b815260206004820152600d60248201526c30b63637bbb2b221b0b63632b960991b604482015290519081900360640190fd5b84610d7457610eeb565b6000610d9a6305f5e100610d94848183610d8e8c8a612a34565b90612a34565b90612a8d565b6001600160a01b038916600090815260cb6020526040902054909150811115610df5576040805162461bcd60e51b8152602060048201526008602482015267636c61696d503a3160c01b604482015290519081900360640190fd5b6001600160a01b038816600090815260cb6020526040902054610e189082612af4565b6001600160a01b038916600090815260cb6020526040902055610e3c888287612b51565b6001600160a01b038816600081815260cb602090815260409182902054825190815291517f869cddd9ceefec21b41c5cb67af8832399fec4f039442688829b60d4cca77ea29281900390910190a2604080516001600160a01b03808b16825289166020820152808201889052606081018690526080810185905260a0810184905290517f27f18772070ad33f5cb0d7f0b3d2268ee0f6b88b3aeb67b242ab9d624e3b8efa9181900360c00190a1505b50505050505050565b60ce5481565b6001600160a01b03808216600090815260d360209081526040808320938616835292905220545b92915050565b60d66020526000908152604090205460ff1681565b60cd6020526000908152604090205481565b610f56612a30565b6001600160a01b0316610f6761177b565b6001600160a01b031614610fb0576040805162461bcd60e51b815260206004820181905260248201526000805160206138b1833981519152604482015290519081900360640190fd5b610fb981612c6f565b6001600160a01b038316600090815260cd602052604090205415611000576001600160a01b038316600090815260cd602052604090205460ce54610ffc91612af4565b60ce555b6001600160a01b038316600090815260cd6020526040902082905560ce546110289083612ca3565b60ce55505050565b60cb6020526000908152604090205481565b600080600090506000836001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561109857600080fd5b505afa1580156110ac573d6000803e3d6000fd5b505050506040513d60208110156110c257600080fd5b5051604080516312ecaf9d60e21b81526001600160a01b038881166004830152915192935060009291871691634bb2be7491602480820192602092909190829003018186803b15801561111457600080fd5b505afa158015611128573d6000803e3d6000fd5b505050506040513d602081101561113e57600080fd5b5051604080516318160ddd60e01b815290519192506000916001600160a01b038816916318160ddd916004808301926020929190829003018186803b15801561118657600080fd5b505afa15801561119a573d6000803e3d6000fd5b505050506040513d60208110156111b057600080fd5b50516001600160a01b038716600090815260cc60205260409020549091504314156111e2576000945050505050610f21565b6001600160a01b038616600090815260cc6020526040902054431180156112095750600081115b1561127c576001600160a01b038616600090815260cc602090815260408083205460cd90925282205461123e91904390612cfd565b905061127861125983610d9484670de0b6b3a7640000612a34565b6001600160a01b038916600090815260cf602052604090205490612ca3565b9450505b81611293670de0b6b3a7640000610d948688612a34565b10156112d1576040805162461bcd60e51b815260206004820152600860248201526773686f7750523a3160c01b604482015290519081900360640190fd5b6112f1826112eb670de0b6b3a7640000610d948789612a34565b90612af4565b979650505050505050565b611304612a30565b6001600160a01b031661131561177b565b6001600160a01b03161461135e576040805162461bcd60e51b815260206004820181905260248201526000805160206138b1833981519152604482015290519081900360640190fd5b6001600160a01b03821661139f576040805162461bcd60e51b8152602060048201526003602482015262533a3160e81b604482015290519081900360640190fd5b60c980546001600160a01b0319166001600160a01b038481169190911790915581166113f8576040805162461bcd60e51b8152602060048201526003602482015262299d1960e91b604482015290519081900360640190fd5b60ca80546001600160a01b0319166001600160a01b039290921691909117905550565b60cc6020526000908152604090205481565b60655460ff1690565b60d15481565b6001600160a01b0316600090815260cb602052604090205490565b60ca546001600160a01b031690565b61146e612a30565b6001600160a01b031661147f61177b565b6001600160a01b0316146114c8576040805162461bcd60e51b815260206004820181905260248201526000805160206138b1833981519152604482015290519081900360640190fd5b6033546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3603380546001600160a01b0319169055565b60c9546001600160a01b0316632a1450ea3061152c612a30565b6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561157957600080fd5b505afa15801561158d573d6000803e3d6000fd5b505050506040513d60208110156115a357600080fd5b5051806115cf57506115b361177b565b6001600160a01b03166115c4612a30565b6001600160a01b0316145b611610576040805162461bcd60e51b815260206004820152600d60248201526c30b63637bbb2b221b0b63632b960991b604482015290519081900360640190fd5b6001600160a01b038116600090815260cc6020526040902054431161163457611757565b6000816001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561166f57600080fd5b505afa158015611683573d6000803e3d6000fd5b505050506040513d602081101561169957600080fd5b50519050806116c357506001600160a01b038116600090815260cc60205260409020439055611757565b6001600160a01b038216600090815260cc602090815260408083205460cd9092528220546116f391904390612cfd565b905061172d61170e83610d9484670de0b6b3a7640000612a34565b6001600160a01b038516600090815260cf602052604090205490612ca3565b6001600160a01b038416600090815260cf602090815260408083209390935560cc90522043905550505b50565b6001600160a01b0316600090815260cf602052604090205490565b60d25481565b6033546001600160a01b031690565b60ca546001600160a01b031681565b60c9546000906001600160a01b0316632a1450ea306117b6612a30565b6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561180357600080fd5b505afa158015611817573d6000803e3d6000fd5b505050506040513d602081101561182d57600080fd5b505180611859575061183d61177b565b6001600160a01b031661184e612a30565b6001600160a01b0316145b61189a576040805162461bcd60e51b815260206004820152600d60248201526c30b63637bbb2b221b0b63632b960991b604482015290519081900360640190fd5b6001600160a01b03808416600081815260d3602090815260408083209489168084529482528083205493835260d4825280832094835293905291909120546118e29082612ca3565b6001600160a01b03808616600081815260d4602090815260408083208b86168085529083528184209690965592825260d381528282209482529390935282209190915560ca5461193491168483612d6b565b90505b9392505050565b60c9546001600160a01b0316632a1450ea30611958612a30565b6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156119a557600080fd5b505afa1580156119b9573d6000803e3d6000fd5b505050506040513d60208110156119cf57600080fd5b5051806119fb57506119df61177b565b6001600160a01b03166119f0612a30565b6001600160a01b0316145b611a3c576040805162461bcd60e51b815260206004820152600d60248201526c30b63637bbb2b221b0b63632b960991b604482015290519081900360640190fd5b60008711611a7c576040805162461bcd60e51b815260206004820152600860248201526752424c4e504c3a3160c01b604482015290519081900360640190fd5b8451865114611abd576040805162461bcd60e51b81526020600482015260086024820152672921262728261d1960c11b604482015290519081900360640190fd5b82516002148015611acf575081516002145b8015611adc575080516002145b611b18576040805162461bcd60e51b815260206004820152600860248201526752424c4e504c3a3360c01b604482015290519081900360640190fd5b611b283088888888888888612dbd565b611b64576040805162461bcd60e51b81526020600482015260086024820152671490931394130e8d60c21b604482015290519081900360640190fd5b600084815260d6602052604090205460ff1615611bb3576040805162461bcd60e51b815260206004820152600860248201526752424c4e504c3a3560c01b604482015290519081900360640190fd5b600084815260d660205260409020805460ff19166001179055611bd586612c6f565b60d287905560005b8651811015611cc5576000878281518110611bf457fe5b6020026020010151905060cd6000826001600160a01b03166001600160a01b0316815260200190815260200160002054600014611c54576001600160a01b038116600090815260cd602052604090205460ce54611c5091612af4565b60ce555b868281518110611c6057fe5b602002602001015160cd6000836001600160a01b03166001600160a01b0316815260200190815260200160002081905550611cb9878381518110611ca057fe5b602002602001015160ce54612ca390919063ffffffff16565b60ce5550600101611bdd565b5060d05460d154604080519283526020830191909152818101899052517f2271d36c0d624706467e414cd8c9602fa0beb4a0b5388417796fc40473aef2c99181900360600190a150505050505050565b60d05481565b611d23612a30565b6001600160a01b0316611d3461177b565b6001600160a01b031614611d7d576040805162461bcd60e51b815260206004820181905260248201526000805160206138b1833981519152604482015290519081900360640190fd5b6001600160a01b038216611dc2576040805162461bcd60e51b8152602060048201526007602482015266535350533a203160c81b604482015290519081900360640190fd5b6001600160a01b038216600081815260d56020908152604091829020805460ff1916851515908117909155825190815291517f45d58074c7e0537f8f5ffa497b119a71c3559d5746720dcb0ef78a2f28fe8df89281900390910190a25050565b60c9546001600160a01b031681565b600054610100900460ff1680611e4a5750611e4a6130d5565b80611e58575060005460ff16155b611e935760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff16158015611ebe576000805460ff1961ff0019909116610100171660011790555b611ec66130e6565b611ece613183565b611ed6613220565b8015611757576000805461ff001916905550565b60d56020526000908152604090205460ff1681565b60d360209081526000928352604080842090915290825290205481565b60d460209081526000928352604080842090915290825290205481565b60c9546001600160a01b0316632a1450ea30611f53612a30565b6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015611fa057600080fd5b505afa158015611fb4573d6000803e3d6000fd5b505050506040513d6020811015611fca57600080fd5b505180611ff65750611fda61177b565b6001600160a01b0316611feb612a30565b6001600160a01b0316145b612037576040805162461bcd60e51b815260206004820152600d60248201526c30b63637bbb2b221b0b63632b960991b604482015290519081900360640190fd5b6000816001600160a01b03166370a08231846040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561208657600080fd5b505afa15801561209a573d6000803e3d6000fd5b505050506040513d60208110156120b057600080fd5b5051604080516312ecaf9d60e21b81526001600160a01b038681166004830152915192935060009291851691634bb2be7491602480820192602092909190829003018186803b15801561210257600080fd5b505afa158015612116573d6000803e3d6000fd5b505050506040513d602081101561212c57600080fd5b5051905081156121cf576001600160a01b038316600090815260cf602052604081205461216e9083906112eb90670de0b6b3a764000090610d94908890612a34565b905080156121cd576001600160a01b03808516600090815260d360209081526040808320938916835292905220546121a69082612ca3565b6001600160a01b03808616600090815260d360209081526040808320938a16835292905220555b505b50505050565b6121dd612a30565b6001600160a01b03166121ee61177b565b6001600160a01b031614612237576040805162461bcd60e51b815260206004820181905260248201526000805160206138b1833981519152604482015290519081900360640190fd5b828410612273576040805162461bcd60e51b81526020600482015260056024820152645352493a3160d81b604482015290519081900360640190fd5b8243106122af576040805162461bcd60e51b815260206004820152600560248201526429a9249d1960d91b604482015290519081900360640190fd5b6122b881612c6f565b60d15443111580156122cc575060d0544310155b156122e05760d183905560d28290556122f0565b60d084905560d183905560d28290555b604080518581526020810185905280820184905290517f2271d36c0d624706467e414cd8c9602fa0beb4a0b5388417796fc40473aef2c99181900360600190a150505050565b60cf6020526000908152604090205481565b60c9546001600160a01b0316632a1450ea30612362612a30565b6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b1580156123af57600080fd5b505afa1580156123c3573d6000803e3d6000fd5b505050506040513d60208110156123d957600080fd5b50518061240557506123e961177b565b6001600160a01b03166123fa612a30565b6001600160a01b0316145b612446576040805162461bcd60e51b815260206004820152600d60248201526c30b63637bbb2b221b0b63632b960991b604482015290519081900360640190fd5b6001600160a01b03821673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14156124a7578034146124a7576040805162461bcd60e51b81526020600482015260056024820152644153413a3160d81b604482015290519081900360640190fd5b6001600160a01b038216600090815260cb60205260409020546124ca9082612ca3565b6001600160a01b038316600081815260cb60209081526040918290208490558151938452905191927f869cddd9ceefec21b41c5cb67af8832399fec4f039442688829b60d4cca77ea2929081900390910190a25050565b612529612a30565b6001600160a01b031661253a61177b565b6001600160a01b031614612583576040805162461bcd60e51b815260206004820181905260248201526000805160206138b1833981519152604482015290519081900360640190fd5b6001600160a01b0381166125c85760405162461bcd60e51b815260040180806020018281038252602681526020018061383c6026913960400191505060405180910390fd5b6033546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3603380546001600160a01b0319166001600160a01b0392909216919091179055565b60c9546001600160a01b0316632a1450ea3061263e612a30565b6040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561268b57600080fd5b505afa15801561269f573d6000803e3d6000fd5b505050506040513d60208110156126b557600080fd5b5051806126e157506126c561177b565b6001600160a01b03166126d6612a30565b6001600160a01b0316145b612722576040805162461bcd60e51b815260206004820152600d60248201526c30b63637bbb2b221b0b63632b960991b604482015290519081900360640190fd5b6001600160a01b038316600090815260cb60205260409020546127458583612ca3565b1115612780576040805162461bcd60e51b81526020600482015260056024820152645744543a3160d81b604482015290519081900360640190fd5b600084116127bd576040805162461bcd60e51b81526020600482015260056024820152642ba22a1d1960d91b604482015290519081900360640190fd5b6001600160a01b038316600090815260cb60205260409020546127e09085612af4565b6001600160a01b038416600090815260cb602052604090208190556128059082612af4565b6001600160a01b038416600081815260cb602052604090209190915573eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612878576040516001600160a01b0386169085156108fc029086906000818181858888f19350505050158015612872573d6000803e3d6000fd5b5061288c565b61288c6001600160a01b0384168686612d6b565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee141561292657816001600160a01b031663cc924c0b8285846040518463ffffffff1660e01b815260040180836001600160a01b03168152602001828152602001925050506000604051808303818588803b15801561290857600080fd5b505af115801561291c573d6000803e3d6000fd5b50505050506129aa565b61293a6001600160a01b0384168383612d6b565b816001600160a01b031663cc924c0b84836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b15801561299157600080fd5b505af11580156129a5573d6000803e3d6000fd5b505050505b6001600160a01b038316600081815260cb602090815260409182902054825190815291517f869cddd9ceefec21b41c5cb67af8832399fec4f039442688829b60d4cca77ea29281900390910190a25050505050565b60ce546001600160a01b038216600090815260cd602052604081205460d2549192610f21929091610d949190612a34565b3390565b600082612a4357506000610f21565b82820282848281612a5057fe5b04146119375760405162461bcd60e51b81526004018080602001828103825260218152602001806138906021913960400191505060405180910390fd5b6000808211612ae3576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612aec57fe5b049392505050565b600082821115612b4b576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee1415612beb57806001600160a01b031663a237a7158385856040518463ffffffff1660e01b815260040180836001600160a01b03168152602001828152602001925050506000604051808303818588803b158015612bcd57600080fd5b505af1158015612be1573d6000803e3d6000fd5b5050505050612c6a565b612bff6001600160a01b0384168284612d6b565b806001600160a01b031663a237a71584846040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050600060405180830381600087803b158015612c5657600080fd5b505af1158015610eeb573d6000803e3d6000fd5b505050565b60005b8151811015612c9f57612c97828281518110612c8a57fe5b6020026020010151611512565b600101612c72565b5050565b600082820183811015611937576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600080612d0c8560d0546132b5565b90506000612d1c8560d1546132ca565b9050818111612d3057600092505050611937565b6000612d3c8284612af4565b90506000612d5f60ce54610d9488610d8e60d25487612a3490919063ffffffff16565b98975050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612c6a9084906132e0565b600080898989898960405160200180866001600160a01b031660601b8152601401858152602001848051906020019060200280838360005b83811015612e0d578181015183820152602001612df5565b50505050905001838051906020019060200280838360005b83811015612e3d578181015183820152602001612e25565b505050509050018281526020019550505050505060405160208183030381529060405280519060200120905060606040518060400160405280601c81526020017f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152509050600081836040516020018083805190602001908083835b60208310612ed95780518252601f199092019160209182019101612eba565b6001836020036101000a03801982511681845116808217855250505050505090500182815260200192505050604051602081830303815290604052805190602001209050600060018289600081518110612f2f57fe5b602002602001015189600081518110612f4457fe5b602002602001015189600081518110612f5957fe5b602002602001015160405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015612fb5573d6000803e3d6000fd5b50505060206040510351905060006001838a600181518110612fd357fe5b60200260200101518a600181518110612fe857fe5b60200260200101518a600181518110612ffd57fe5b602002602001015160405160008152602001604052604051808581526020018460ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015613059573d6000803e3d6000fd5b505050602060405103519050806001600160a01b0316826001600160a01b03161415801561309f57506001600160a01b038216600090815260d5602052604090205460ff165b80156130c357506001600160a01b038116600090815260d5602052604090205460ff165b9e9d5050505050505050505050505050565b60006130e030613391565b15905090565b600054610100900460ff16806130ff57506130ff6130d5565b8061310d575060005460ff16155b6131485760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff16158015613173576000805460ff1961ff0019909116610100171660011790555b61317b613397565b611ed6613437565b600054610100900460ff168061319c575061319c6130d5565b806131aa575060005460ff16155b6131e55760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff16158015613210576000805460ff1961ff0019909116610100171660011790555b613218613397565b611ed6613530565b600054610100900460ff168061323957506132396130d5565b80613247575060005460ff16155b6132825760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff161580156132ad576000805460ff1961ff0019909116610100171660011790555b611ed66135db565b60008183106132c45782611937565b50919050565b60008183106132d95781611937565b5090919050565b6060613335826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166136819092919063ffffffff16565b805190915015612c6a5780806020019051602081101561335457600080fd5b5051612c6a5760405162461bcd60e51b815260040180806020018281038252602a8152602001806138d1602a913960400191505060405180910390fd5b3b151590565b600054610100900460ff16806133b057506133b06130d5565b806133be575060005460ff16155b6133f95760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff16158015611ed6576000805460ff1961ff0019909116610100171660011790558015611757576000805461ff001916905550565b600054610100900460ff168061345057506134506130d5565b8061345e575060005460ff16155b6134995760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff161580156134c4576000805460ff1961ff0019909116610100171660011790555b60006134ce612a30565b603380546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611757576000805461ff001916905550565b600054610100900460ff168061354957506135496130d5565b80613557575060005460ff16155b6135925760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff161580156135bd576000805460ff1961ff0019909116610100171660011790555b6065805460ff191690558015611757576000805461ff001916905550565b600054610100900460ff16806135f457506135f46130d5565b80613602575060005460ff16155b61363d5760405162461bcd60e51b815260040180806020018281038252602e815260200180613862602e913960400191505060405180910390fd5b600054610100900460ff16158015613668576000805460ff1961ff0019909116610100171660011790555b60016097558015611757576000805461ff001916905550565b606061193484846000858561369585613391565b6136e6576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106137255780518252601f199092019160209182019101613706565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613787576040519150601f19603f3d011682016040523d82523d6000602084013e61378c565b606091505b50915091506112f1828286606083156137a6575081611937565b8251156137b65782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156138005781810151838201526020016137e8565b50505050905090810190601f16801561382d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a2646970667358221220fe2444eeb5f5a18dc53b8acc580b66676f457dbafaf625f1cf643afd98b6a17a64736f6c63430007030033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
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.