Polygon Sponsored slots available. Book your slot here!
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x72de85e0a39b3fb2fb7bc3519cb9f8dbecc1308a
Contract Name:
TheGarden
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; // _ __ ___ __ _ _ __ ______ _ _ __ // | '_ \ / _ \/ _` | '__|_ / _` | '_ \ // | |_) | __/ (_| | | / / (_| | |_) | // | .__/ \___|\__,_|_| /___\__,_| .__/ // | | | | // |_| |_| // https://pearzap.com/ // The garden : Stake 1 token, earn 2 tokens import "./SafeMath.sol"; import "./Ownable.sol"; //import "./IBEP20.sol"; import "./BEP20.sol"; import "./PEARToken.sol"; import "./SafeBEP20.sol"; contract TheGarden is Ownable { using SafeMath for uint256; using SafeBEP20 for IBEP20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebtTA; // Reward debt. See explanation below. uint256 rewardDebtTB; // Reward debt. See explanation below. } // Info of each pool. struct PoolInfo { IBEP20 lpToken; // Address of LP token contract. uint256 allocPointTokenA; // How many allocation points assigned to this pool. PEARs to distribute per block for token A uint256 allocPointTokenB; // How many allocation points assigned to this pool. PEARs to distribute per block for token B uint256 lastRewardBlock; // Last block number that PEARs distribution occurs. uint256 accRewardTAPerShare; // Accumulated TokenA rewards per share, times 1e30. See below. uint256 accRewardTBPerShare; // Accumulated TokenB rewards per share, times 1e30. See below. uint16 depositFeeBP; // Deposit fee in basis points } // PEAR token PearToken public pear; // Reward tokens IBEP20 public rewardTokenA; IBEP20 public rewardTokenB; // Reward tokens distributed per block. uint256 public rewardPerBlockTA; uint256 public rewardPerBlockTB; // Deposit burn address address public burnAddress; // Deposit fee to burn uint16 public depositFeeToBurn; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping (address => UserInfo) public userInfo; // Total allocation poitns. Must be the sum of all allocation points in all pools. uint256 private totalAllocPoint = 0; // The block number when PEAR mining starts. uint256 public startBlock; // The block number when PEAR mining ends. uint256 public bonusEndBlock; event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); constructor( PearToken _pear, IBEP20 _rewardTokenA, IBEP20 _rewardTokenB, uint256 _rewardPerBlockTA, uint256 _rewardPerBlockTB, address _burnAddress, uint16 _depositFeeBP, uint256 _startBlock, uint256 _bonusEndBlock ) public { pear = _pear; rewardTokenA = _rewardTokenA; rewardTokenB = _rewardTokenB; rewardPerBlockTA = _rewardPerBlockTA; rewardPerBlockTB = _rewardPerBlockTB; burnAddress = _burnAddress; depositFeeToBurn = _depositFeeBP; startBlock = _startBlock; bonusEndBlock = _bonusEndBlock; // Deposit fee limited to 10% No way for contract owner to set higher deposit fee require(depositFeeToBurn <= 1000, "contract: invalid deposit fee basis points"); // staking pool poolInfo.push(PoolInfo({ lpToken: _pear, allocPointTokenA: 1000, allocPointTokenB: 1000, lastRewardBlock: startBlock, accRewardTAPerShare: 0, accRewardTBPerShare: 0, depositFeeBP: depositFeeToBurn })); totalAllocPoint = 1000; } function stopReward() public onlyOwner { bonusEndBlock = block.number; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public view returns (uint256) { if (_to <= bonusEndBlock) { return _to.sub(_from); } else if (_from >= bonusEndBlock) { return 0; } else { return bonusEndBlock.sub(_from); } } // View function to see pending Reward for token A on frontend. function pendingRewardTA(address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[_user]; uint256 accRewardTAPerShare = pool.accRewardTAPerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 tokenAReward = multiplier.mul(rewardPerBlockTA).mul(pool.allocPointTokenA).div(totalAllocPoint); accRewardTAPerShare = accRewardTAPerShare.add(tokenAReward.mul(1e30).div(lpSupply)); } return user.amount.mul(accRewardTAPerShare).div(1e30).sub(user.rewardDebtTA); } // View function to see pending Reward for token A on frontend. function pendingRewardTB(address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[_user]; uint256 accRewardTBPerShare = pool.accRewardTBPerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 tokenBReward = multiplier.mul(rewardPerBlockTB).mul(pool.allocPointTokenB).div(totalAllocPoint); accRewardTBPerShare = accRewardTBPerShare.add(tokenBReward.mul(1e30).div(lpSupply)); } return user.amount.mul(accRewardTBPerShare).div(1e30).sub(user.rewardDebtTB); } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (lpSupply == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 tokenAReward = multiplier.mul(rewardPerBlockTA).mul(pool.allocPointTokenA).div(totalAllocPoint); pool.accRewardTAPerShare = pool.accRewardTAPerShare.add(tokenAReward.mul(1e30).div(lpSupply)); uint256 tokenBReward = multiplier.mul(rewardPerBlockTB).mul(pool.allocPointTokenB).div(totalAllocPoint); pool.accRewardTBPerShare = pool.accRewardTBPerShare.add(tokenBReward.mul(1e30).div(lpSupply)); pool.lastRewardBlock = block.number; } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Stake PEAR tokens to TheGarden function deposit(uint256 _amount) public { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; updatePool(0); if (user.amount > 0) { uint256 pendingTA = user.amount.mul(pool.accRewardTAPerShare).div(1e30).sub(user.rewardDebtTA); if(pendingTA > 0) { rewardTokenA.safeTransfer(address(msg.sender), pendingTA); } uint256 pendingTB = user.amount.mul(pool.accRewardTBPerShare).div(1e30).sub(user.rewardDebtTB); if(pendingTA > 0) { rewardTokenB.safeTransfer(address(msg.sender), pendingTB); } } // Add the possibility of deposit fees sent to burn address if(_amount > 0) { pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); // handling burn tax if PEAR token if (address(pool.lpToken) == address(pear)) { uint256 burnTax = _amount.mul(pear.burnRateTax()).div(10000); _amount = _amount.sub(burnTax); } if(pool.depositFeeBP > 0){ uint256 depositFee = _amount.mul(pool.depositFeeBP).div(10000); pool.lpToken.safeTransfer(burnAddress, depositFee); user.amount = user.amount.add(_amount).sub(depositFee); }else{ user.amount = user.amount.add(_amount); } } user.rewardDebtTA = user.amount.mul(pool.accRewardTAPerShare).div(1e30); user.rewardDebtTB = user.amount.mul(pool.accRewardTBPerShare).div(1e30); emit Deposit(msg.sender, _amount); } // Withdraw PEAR tokens from STAKING. function withdraw(uint256 _amount) public { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; require(user.amount >= _amount, "withdraw: not good"); updatePool(0); uint256 pendingTA = user.amount.mul(pool.accRewardTAPerShare).div(1e30).sub(user.rewardDebtTA); if(pendingTA > 0) { rewardTokenA.safeTransfer(address(msg.sender), pendingTA); } uint256 pendingTB = user.amount.mul(pool.accRewardTBPerShare).div(1e30).sub(user.rewardDebtTB); if(pendingTA > 0) { rewardTokenB.safeTransfer(address(msg.sender), pendingTB); } if(_amount > 0) { user.amount = user.amount.sub(_amount); pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebtTA = user.amount.mul(pool.accRewardTAPerShare).div(1e30); user.rewardDebtTB = user.amount.mul(pool.accRewardTBPerShare).div(1e30); emit Withdraw(msg.sender, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() public { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; pool.lpToken.safeTransfer(address(msg.sender), user.amount); user.amount = 0; user.rewardDebtTA = 0; user.rewardDebtTB = 0; emit EmergencyWithdraw(msg.sender, user.amount); } // Withdraw reward token A. EMERGENCY ONLY. function emergencyRewardWithdrawTA(uint256 _amount) public onlyOwner { require(_amount < rewardTokenA.balanceOf(address(this)), 'not enough token'); rewardTokenA.safeTransfer(address(msg.sender), _amount); } // Withdraw reward token A. EMERGENCY ONLY. function emergencyRewardWithdrawTB(uint256 _amount) public onlyOwner { require(_amount < rewardTokenB.balanceOf(address(this)), 'not enough token'); rewardTokenB.safeTransfer(address(msg.sender), _amount); } // Add a function to update rewardPerBlock. Can only be called by the owner. function updateRewardPerBlockTA(uint256 _rewardPerBlockTA) public onlyOwner { rewardPerBlockTA = _rewardPerBlockTA; //Automatically updatePool 0 updatePool(0); } // Add a function to update rewardPerBlock. Can only be called by the owner. function updateRewardPerBlockTB(uint256 _rewardPerBlockTB) public onlyOwner { rewardPerBlockTB = _rewardPerBlockTB; //Automatically updatePool 0 updatePool(0); } // Add a function to update bonusEndBlock. Can only be called by the owner. function updateBonusEndBlock(uint256 _bonusEndBlock) public onlyOwner { bonusEndBlock = _bonusEndBlock; } // Update the given pool's deposit fee. Can only be called by the owner. function updateDepositFeeBP(uint256 _pid, uint16 _depositFeeBP) public onlyOwner { require(_depositFeeBP <= 10000, "updateDepositFeeBP: invalid deposit fee basis points"); poolInfo[_pid].depositFeeBP = _depositFeeBP; depositFeeToBurn = _depositFeeBP; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // 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.4.0; import "./Context.sol"; import "./IBEP20.sol"; import "./Ownable.sol"; import "./SafeMath.sol"; import "./Address.sol"; /** * @dev Implementation of the {IBEP20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {BEP20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-BEP20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of BEP20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IBEP20-approve}. */ contract BEP20 is Context, IBEP20, Ownable { using SafeMath for uint256; using Address for address; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 18. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor(string memory name, string memory symbol) public { _name = name; _symbol = symbol; _decimals = 18; } /** * @dev Returns the bep token owner. */ function getOwner() external override view returns (address) { return owner(); } /** * @dev Returns the token name. */ function name() public override view returns (string memory) { return _name; } /** * @dev Returns the token decimals. */ function decimals() public override view returns (uint8) { return _decimals; } /** * @dev Returns the token symbol. */ function symbol() public override view returns (string memory) { return _symbol; } /** * @dev See {BEP20-totalSupply}. */ function totalSupply() public override view returns (uint256) { return _totalSupply; } /** * @dev See {BEP20-balanceOf}. */ function balanceOf(address account) public override view returns (uint256) { return _balances[account]; } /** * @dev See {BEP20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {BEP20-allowance}. */ function allowance(address owner, address spender) public override view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {BEP20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {BEP20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {BEP20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public override returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "BEP20: transfer amount exceeds allowance") ); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {BEP20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {BEP20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "BEP20: decreased allowance below zero") ); return true; } /** * @dev Creates `amount` tokens and assigns them to `msg.sender`, increasing * the total supply. * * Requirements * * - `msg.sender` must be the token owner */ function mint(uint256 amount) public onlyOwner returns (bool) { _mint(_msgSender(), amount); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "BEP20: transfer from the zero address"); require(recipient != address(0), "BEP20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount, "BEP20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), "BEP20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal { require(account != address(0), "BEP20: burn from the zero address"); _balances[account] = _balances[account].sub(amount, "BEP20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal { require(owner != address(0), "BEP20: approve from the zero address"); require(spender != address(0), "BEP20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve( account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "BEP20: burn amount exceeds allowance") ); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.4; interface IBEP20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address _owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; // _ __ ___ __ _ _ __ ______ _ _ __ // | '_ \ / _ \/ _` | '__|_ / _` | '_ \ // | |_) | __/ (_| | | / / (_| | |_) | // | .__/ \___|\__,_|_| /___\__,_| .__/ // | | | | // |_| |_| // https://pearzap.com/ import "./BEP20.sol"; // PearToken with Governance. contract PearToken is BEP20 { // Burn tax rate in basis points. (defaut 2%, max 2%) uint16 public burnRateTax = 200; // Burn address address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD; // Max transfer amount rate in basis points. (default is 1% of total supply) uint16 public maxTransferAmountRate = 100; // Addresses that are excluded from antiWhale mapping(address => bool) private _excludedFromAntiWhale; // Addresses that are excluded from transfert tax mapping(address => bool) private _excludedFromTrsfTax; // The operator can only update the transfer burn tax rate & update maxTransferAmountRate & add address to antiWhale and transfer tax whitelist & change operator adresse address private _operator; // The super operator can only update the owner adresse : This acces is protected by a 15 days timelock : Super operator address can't be change in anyway address private _superOperator; // Events event OperatorTransferred(address indexed previousOperator, address indexed newOperator); event OwnerTransferred(address indexed previousOwner, address indexed newOwner); event BurnRateUpdated(address indexed operator, uint256 previousRate, uint256 newRate); event MaxTransferAmountRateUpdated(address indexed operator, uint256 previousRate, uint256 newRate); event PearSwapRouterUpdated(address indexed operator, address indexed router, address indexed pair); event ExcludedFromAntiWhale(address indexed exludedAdresse, bool indexed excludedStatut); event ExcludedFromTrsfTax(address indexed exludedAdresse, bool indexed excludedStatut); // Modifiers modifier onlyOperator() { require(_operator == msg.sender, "operator: caller is not the operator"); _; } modifier antiWhale(address sender, address recipient, uint256 amount) { if (maxTransferAmount() > 0) { if ( _excludedFromAntiWhale[sender] == false && _excludedFromAntiWhale[recipient] == false ) { require(amount <= maxTransferAmount(), "PEAR::antiWhale: Transfer amount exceeds the maxTransferAmount"); } } _; } /** * @notice Constructs the PearToken contract. */ constructor() public BEP20("Pear Token", "PEAR") { _operator = _msgSender(); emit OperatorTransferred(address(0), _operator); _excludedFromAntiWhale[msg.sender] = true; _excludedFromAntiWhale[address(0)] = true; _excludedFromAntiWhale[address(this)] = true; _excludedFromAntiWhale[BURN_ADDRESS] = true; } /// @notice Creates `_amount` token to `_to`. Must only be called by the owner (MasterChef). function mint(address _to, uint256 _amount) public onlyOwner { _mint(_to, _amount); _moveDelegates(address(0), _delegates[_to], _amount); } /// @dev overrides transfer BEP20 function to meet tokenomics of PEAR function _transfer(address sender, address recipient, uint256 amount) internal virtual override antiWhale(sender, recipient, amount) { if (recipient == BURN_ADDRESS || _excludedFromTrsfTax[sender] == true || _excludedFromTrsfTax[recipient] == true) { super._transfer(sender, recipient, amount); _moveDelegates(_delegates[sender], _delegates[recipient], amount); } else { // default burn tax is 2% by default of every transfer uint256 burnAmount = amount.mul(burnRateTax).div(10000); // default 98% of transfer sent to recipient uint256 sendAmount = amount.sub(burnAmount); require(amount == sendAmount + burnAmount, "PEAR::transfer: Burn value invalid"); super._transfer(sender, BURN_ADDRESS, burnAmount); _moveDelegates(_delegates[sender], _delegates[BURN_ADDRESS], burnAmount); super._transfer(sender, recipient, sendAmount); _moveDelegates(_delegates[sender], _delegates[recipient], sendAmount); amount = sendAmount; } } /** * @dev Returns the max transfer amount. */ function maxTransferAmount() public view returns (uint256) { return totalSupply().mul(maxTransferAmountRate).div(10000); } /** * @dev Returns the address is excluded from antiWhale or not. */ function isExcludedFromAntiWhale(address _account) public view returns (bool) { return _excludedFromAntiWhale[_account]; } /** * @dev Returns the address is excluded from transfert tax or not. */ function isExcludedFromTrsfTax(address _account) public view returns (bool) { return _excludedFromTrsfTax[_account]; } /** * @dev Update the burn rate. * Can only be called by the current operator. */ function updateBurnRate(uint16 _burnRateTax) public onlyOperator { require(_burnRateTax <= 200, "PEAR::updateBurnRate: Burn rate must not exceed the maximum rate."); emit BurnRateUpdated(msg.sender, burnRateTax, _burnRateTax); burnRateTax = _burnRateTax; } /** * @dev Update the max transfer amount rate. * Can only be called by the current operator. */ function updateMaxTransferAmountRate(uint16 _maxTransferAmountRate) public onlyOperator { require(_maxTransferAmountRate <= 10000, "PEAR::updateMaxTransferAmountRate: Max transfer amount rate must not exceed the maximum rate."); emit MaxTransferAmountRateUpdated(msg.sender, maxTransferAmountRate, _maxTransferAmountRate); maxTransferAmountRate = _maxTransferAmountRate; } /** * @dev Exclude or include an address from antiWhale. * Can only be called by the current operator. */ function setExcludedFromAntiWhale(address _account, bool _excluded) public onlyOperator { _excludedFromAntiWhale[_account] = _excluded; emit ExcludedFromAntiWhale(_account, _excluded); } /** * @dev Exclude or include an address from antiWhale. * Can only be called by the current operator. */ function setExcludedFromTrsfTax(address _account, bool _excluded) public onlyOperator { _excludedFromTrsfTax[_account] = _excluded; emit ExcludedFromTrsfTax(_account, _excluded); } /** * @dev Returns the address of the current operator. */ function operator() public view returns (address) { return _operator; } /** * @dev Transfers operator of the contract to a new account (`newOperator`). * Can only be called by the current operator. */ function transferOperator(address newOperator) public onlyOperator { require(newOperator != address(0), "PEAR::transferOperator: new operator is the zero address"); emit OperatorTransferred(_operator, newOperator); _operator = newOperator; } // Copied and modified from YAM code: // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernanceStorage.sol // https://github.com/yam-finance/yam-protocol/blob/master/contracts/token/YAMGovernance.sol // Which is copied and modified from COMPOUND: // https://github.com/compound-finance/compound-protocol/blob/master/contracts/Governance/Comp.sol /// @dev A record of each accounts delegate mapping (address => address) internal _delegates; /// @notice A checkpoint for marking number of votes from a given block struct Checkpoint { uint32 fromBlock; uint256 votes; } /// @notice A record of votes checkpoints for each account, by index mapping (address => mapping (uint32 => Checkpoint)) public checkpoints; /// @notice The number of checkpoints for each account mapping (address => uint32) public numCheckpoints; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant DELEGATION_TYPEHASH = keccak256("Delegation(address delegatee,uint256 nonce,uint256 expiry)"); /// @notice A record of states for signing / validating signatures mapping (address => uint) public nonces; /// @notice An event thats emitted when an account changes its delegate event DelegateChanged(address indexed delegator, address indexed fromDelegate, address indexed toDelegate); /// @notice An event thats emitted when a delegate account's vote balance changes event DelegateVotesChanged(address indexed delegate, uint previousBalance, uint newBalance); /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegator The address to get delegatee for */ function delegates(address delegator) external view returns (address) { return _delegates[delegator]; } /** * @notice Delegate votes from `msg.sender` to `delegatee` * @param delegatee The address to delegate votes to */ function delegate(address delegatee) external { return _delegate(msg.sender, delegatee); } /** * @notice Delegates votes from signatory to `delegatee` * @param delegatee The address to delegate votes to * @param nonce The contract state required to match the signature * @param expiry The time at which to expire the signature * @param v The recovery byte of the signature * @param r Half of the ECDSA signature pair * @param s Half of the ECDSA signature pair */ function delegateBySig( address delegatee, uint nonce, uint expiry, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode( DOMAIN_TYPEHASH, keccak256(bytes(name())), getChainId(), address(this) ) ); bytes32 structHash = keccak256( abi.encode( DELEGATION_TYPEHASH, delegatee, nonce, expiry ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", domainSeparator, structHash ) ); address signatory = ecrecover(digest, v, r, s); require(signatory != address(0), "PEAR::delegateBySig: invalid signature"); require(nonce == nonces[signatory]++, "PEAR::delegateBySig: invalid nonce"); require(now <= expiry, "PEAR::delegateBySig: signature expired"); return _delegate(signatory, delegatee); } /** * @notice Gets the current votes balance for `account` * @param account The address to get votes balance * @return The number of current votes for `account` */ function getCurrentVotes(address account) external view returns (uint256) { uint32 nCheckpoints = numCheckpoints[account]; return nCheckpoints > 0 ? checkpoints[account][nCheckpoints - 1].votes : 0; } /** * @notice Determine the prior number of votes for an account as of a block number * @dev Block number must be a finalized block or else this function will revert to prevent misinformation. * @param account The address of the account to check * @param blockNumber The block number to get the vote balance at * @return The number of votes the account had as of the given block */ function getPriorVotes(address account, uint blockNumber) external view returns (uint256) { require(blockNumber < block.number, "PEAR::getPriorVotes: not yet determined"); uint32 nCheckpoints = numCheckpoints[account]; if (nCheckpoints == 0) { return 0; } // First check most recent balance if (checkpoints[account][nCheckpoints - 1].fromBlock <= blockNumber) { return checkpoints[account][nCheckpoints - 1].votes; } // Next check implicit zero balance if (checkpoints[account][0].fromBlock > blockNumber) { return 0; } uint32 lower = 0; uint32 upper = nCheckpoints - 1; while (upper > lower) { uint32 center = upper - (upper - lower) / 2; // ceil, avoiding overflow Checkpoint memory cp = checkpoints[account][center]; if (cp.fromBlock == blockNumber) { return cp.votes; } else if (cp.fromBlock < blockNumber) { lower = center; } else { upper = center - 1; } } return checkpoints[account][lower].votes; } function _delegate(address delegator, address delegatee) internal { address currentDelegate = _delegates[delegator]; uint256 delegatorBalance = balanceOf(delegator); // balance of underlying PEARs (not scaled); _delegates[delegator] = delegatee; emit DelegateChanged(delegator, currentDelegate, delegatee); _moveDelegates(currentDelegate, delegatee, delegatorBalance); } function _moveDelegates(address srcRep, address dstRep, uint256 amount) internal { if (srcRep != dstRep && amount > 0) { if (srcRep != address(0)) { // decrease old representative uint32 srcRepNum = numCheckpoints[srcRep]; uint256 srcRepOld = srcRepNum > 0 ? checkpoints[srcRep][srcRepNum - 1].votes : 0; uint256 srcRepNew = srcRepOld.sub(amount); _writeCheckpoint(srcRep, srcRepNum, srcRepOld, srcRepNew); } if (dstRep != address(0)) { // increase new representative uint32 dstRepNum = numCheckpoints[dstRep]; uint256 dstRepOld = dstRepNum > 0 ? checkpoints[dstRep][dstRepNum - 1].votes : 0; uint256 dstRepNew = dstRepOld.add(amount); _writeCheckpoint(dstRep, dstRepNum, dstRepOld, dstRepNew); } } } function _writeCheckpoint( address delegatee, uint32 nCheckpoints, uint256 oldVotes, uint256 newVotes ) internal { uint32 blockNumber = safe32(block.number, "PEAR::_writeCheckpoint: block number exceeds 32 bits"); if (nCheckpoints > 0 && checkpoints[delegatee][nCheckpoints - 1].fromBlock == blockNumber) { checkpoints[delegatee][nCheckpoints - 1].votes = newVotes; } else { checkpoints[delegatee][nCheckpoints] = Checkpoint(blockNumber, newVotes); numCheckpoints[delegatee] = nCheckpoints + 1; } emit DelegateVotesChanged(delegatee, oldVotes, newVotes); } function safe32(uint n, string memory errorMessage) internal pure returns (uint32) { require(n < 2**32, errorMessage); return uint32(n); } function getChainId() internal pure returns (uint) { uint256 chainId; assembly { chainId := chainid() } return chainId; } //a way to get back other BEP20 tokens sended by error into the PEAR token contract function inCaseTokensGetStuck(address _token, uint256 _amount) public onlyOperator { IBEP20(_token).transfer(msg.sender, _amount); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./IBEP20.sol"; import "./SafeMath.sol"; import "./Address.sol"; /** * @title SafeBEP20 * @dev Wrappers around BEP20 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 SafeBEP20 for IBEP20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeBEP20 { using SafeMath for uint256; using Address for address; function safeTransfer(IBEP20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IBEP20 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 * {IBEP20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IBEP20 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), "SafeBEP20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IBEP20 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(IBEP20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeBEP20: 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(IBEP20 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, "SafeBEP20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeBEP20: BEP20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract PearToken","name":"_pear","type":"address"},{"internalType":"contract IBEP20","name":"_rewardTokenA","type":"address"},{"internalType":"contract IBEP20","name":"_rewardTokenB","type":"address"},{"internalType":"uint256","name":"_rewardPerBlockTA","type":"uint256"},{"internalType":"uint256","name":"_rewardPerBlockTB","type":"uint256"},{"internalType":"address","name":"_burnAddress","type":"address"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositFeeToBurn","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdrawTA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdrawTB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pear","outputs":[{"internalType":"contract PearToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingRewardTA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingRewardTB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IBEP20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPointTokenA","type":"uint256"},{"internalType":"uint256","name":"allocPointTokenB","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accRewardTAPerShare","type":"uint256"},{"internalType":"uint256","name":"accRewardTBPerShare","type":"uint256"},{"internalType":"uint16","name":"depositFeeBP","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerBlockTA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlockTB","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenA","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenB","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"}],"name":"updateBonusEndBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"}],"name":"updateDepositFeeBP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlockTA","type":"uint256"}],"name":"updateRewardPerBlockTA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlockTB","type":"uint256"}],"name":"updateRewardPerBlockTB","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebtTA","type":"uint256"},{"internalType":"uint256","name":"rewardDebtTB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600060095534801561001557600080fd5b50604051611fa3380380611fa3833981810160405261012081101561003957600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e088015161010090980151969795969495939492939192909190600061007f6102a3565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600180546001600160a01b03199081166001600160a01b038c8116919091179092556002805482168b84161790556003805482168a841617905560048890556005879055600680549091169186169190911761ffff60a01b1916600160a01b61ffff86811682029290921792839055600a859055600b8490556103e892041611156101855760405162461bcd60e51b815260040180806020018281038252602a815260200180611f79602a913960400191505060405180910390fd5b60076040518060e001604052808b6001600160a01b031681526020016103e881526020016103e88152602001600a5481526020016000815260200160008152602001600660149054906101000a900461ffff1661ffff16815250908060018154018082558091505060019003906000526020600020906007020160009091909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548161ffff021916908361ffff16021790555050506103e86009819055505050505050505050506102a7565b3390565b611cc3806102b66000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063872b512b11610104578063b6b55f25116100a2578063db2e21bc11610071578063db2e21bc1461046e578063dc9b00e414610476578063f0fe603f14610493578063f2fde38b146104b0576101cf565b8063b6b55f25146103fa578063bff67d6114610417578063c81fadef14610434578063d25b847514610451576101cf565b8063977d9494116100de578063977d9494146103c3578063a4da982d146103cb578063aa7b83e3146103ea578063ad23c779146103f2576101cf565b8063872b512b146103725780638da5cb5b146103985780638dbb1e3a146103a0576101cf565b806351eb05a61161017157806370d5ae051161014b57806370d5ae0514610334578063715018a61461033c57806371e7713f1461034457806380dc06721461036a576101cf565b806351eb05a6146102eb578063630b5ba1146103085780636b8ba92c14610310576101cf565b80631aed6553116101ad5780631aed6553146102a45780632e1a7d4d146102be5780633856a9ab146102db57806348cd4cb1146102e3576101cf565b8063110d4ff5146101d45780631526fe27146101fd5780631959a00214610260575b600080fd5b6101fb600480360360408110156101ea57600080fd5b508035906020013561ffff166104d6565b005b61021a6004803603602081101561021357600080fd5b50356105c3565b604080516001600160a01b0390981688526020880196909652868601949094526060860192909252608085015260a084015261ffff1660c0830152519081900360e00190f35b6102866004803603602081101561027657600080fd5b50356001600160a01b031661061d565b60408051938452602084019290925282820152519081900360600190f35b6102ac61063e565b60408051918252519081900360200190f35b6101fb600480360360208110156102d457600080fd5b5035610644565b6102ac610833565b6102ac610839565b6101fb6004803603602081101561030157600080fd5b503561083f565b6101fb6109ce565b6103186109f1565b604080516001600160a01b039092168252519081900360200190f35b610318610a00565b6101fb610a0f565b6102ac6004803603602081101561035a57600080fd5b50356001600160a01b0316610ab1565b6101fb610c15565b6102ac6004803603602081101561038857600080fd5b50356001600160a01b0316610c73565b610318610dc7565b6102ac600480360360408110156103b657600080fd5b5080359060200135610dd6565b6102ac610e16565b6103d3610e1c565b6040805161ffff9092168252519081900360200190f35b610318610e2d565b610318610e3c565b6101fb6004803603602081101561041057600080fd5b5035610e4b565b6101fb6004803603602081101561042d57600080fd5b5035611108565b6101fb6004803603602081101561044a57600080fd5b503561116f565b6101fb6004803603602081101561046757600080fd5b503561129b565b6101fb611302565b6101fb6004803603602081101561048c57600080fd5b503561139c565b6101fb600480360360208110156104a957600080fd5b50356114c8565b6101fb600480360360208110156104c657600080fd5b50356001600160a01b0316611525565b6104de61161d565b6000546001600160a01b0390811691161461052e576040805162461bcd60e51b81526020600482018190526024820152600080516020611c3a833981519152604482015290519081900360640190fd5b6127108161ffff1611156105735760405162461bcd60e51b8152600401808060200182810382526034815260200180611c5a6034913960400191505060405180910390fd5b806007838154811061058157fe5b600091825260209091206007909102016006908101805461ffff191661ffff938416179055805461ffff60a01b1916600160a01b939092169290920217905550565b600781815481106105d057fe5b600091825260209091206007909102018054600182015460028301546003840154600485015460058601546006909601546001600160a01b039095169650929491939092919061ffff1687565b60086020526000908152604090208054600182015460029092015490919083565b600b5481565b6000600760008154811061065457fe5b60009182526020808320338452600890915260409092208054600790920290920192508311156106c0576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b6106ca600061083f565b600061070b826001015461070568327cb2734119d3b7a9601e1b6106ff8760040154876000015461162190919063ffffffff16565b90611681565b906116c3565b9050801561072a5760025461072a906001600160a01b03163383611705565b600061075f836002015461070568327cb2734119d3b7a9601e1b6106ff8860050154886000015461162190919063ffffffff16565b9050811561077e5760035461077e906001600160a01b03163383611705565b84156107a857825461079090866116c3565b835583546107a8906001600160a01b03163387611705565b600484015483546107ca9168327cb2734119d3b7a9601e1b916106ff91611621565b6001840155600584015483546107f19168327cb2734119d3b7a9601e1b916106ff91611621565b600284015560408051868152905133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364919081900360200190a25050505050565b60045481565b600a5481565b60006007828154811061084e57fe5b906000526020600020906007020190508060030154431161086f57506109cb565b8054604080516370a0823160e01b815230600482015290516000926001600160a01b0316916370a08231916024808301926020929190829003018186803b1580156108b957600080fd5b505afa1580156108cd573d6000803e3d6000fd5b505050506040513d60208110156108e357600080fd5b50519050806108f95750436003909101556109cb565b6000610909836003015443610dd6565b905060006109366009546106ff86600101546109306004548761162190919063ffffffff16565b90611621565b9050610960610955846106ff8468327cb2734119d3b7a9601e1b611621565b60048601549061175c565b8460040181905550600061098d6009546106ff87600201546109306005548861162190919063ffffffff16565b90506109b76109ac856106ff8468327cb2734119d3b7a9601e1b611621565b60058701549061175c565b600586015550504360039093019290925550505b50565b60075460005b818110156109ed576109e58161083f565b6001016109d4565b5050565b6002546001600160a01b031681565b6006546001600160a01b031681565b610a1761161d565b6000546001600160a01b03908116911614610a67576040805162461bcd60e51b81526020600482018190526024820152600080516020611c3a833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000806007600081548110610ac257fe5b600091825260208083206001600160a01b0380881685526008835260408086206005600790960290930194850154855482516370a0823160e01b8152306004820152925196985093969095909493909216926370a0823192602480840193829003018186803b158015610b3457600080fd5b505afa158015610b48573d6000803e3d6000fd5b505050506040513d6020811015610b5e57600080fd5b5051600385015490915043118015610b7557508015155b15610bdc576000610b8a856003015443610dd6565b90506000610bb16009546106ff88600201546109306005548761162190919063ffffffff16565b9050610bd7610bd0846106ff8468327cb2734119d3b7a9601e1b611621565b859061175c565b935050505b610c0b836002015461070568327cb2734119d3b7a9601e1b6106ff86886000015461162190919063ffffffff16565b9695505050505050565b610c1d61161d565b6000546001600160a01b03908116911614610c6d576040805162461bcd60e51b81526020600482018190526024820152600080516020611c3a833981519152604482015290519081900360640190fd5b43600b55565b6000806007600081548110610c8457fe5b600091825260208083206001600160a01b038781168552600883526040808620600795909502909201600481810154825485516370a0823160e01b81523093810193909352945192985095969493909216926370a082319260248082019391829003018186803b158015610cf757600080fd5b505afa158015610d0b573d6000803e3d6000fd5b505050506040513d6020811015610d2157600080fd5b5051600385015490915043118015610d3857508015155b15610d98576000610d4d856003015443610dd6565b90506000610d746009546106ff88600101546109306004548761162190919063ffffffff16565b9050610d93610bd0846106ff8468327cb2734119d3b7a9601e1b611621565b935050505b610c0b836001015461070568327cb2734119d3b7a9601e1b6106ff86886000015461162190919063ffffffff16565b6000546001600160a01b031690565b6000600b548211610df257610deb82846116c3565b9050610e10565b600b548310610e0357506000610e10565b600b54610deb90846116c3565b92915050565b60055481565b600654600160a01b900461ffff1681565b6003546001600160a01b031681565b6001546001600160a01b031681565b60006007600081548110610e5b57fe5b60009182526020808320338452600890915260408320600790920201925090610e839061083f565b805415610f35576000610ebf826001015461070568327cb2734119d3b7a9601e1b6106ff8760040154876000015461162190919063ffffffff16565b90508015610ede57600254610ede906001600160a01b03163383611705565b6000610f13836002015461070568327cb2734119d3b7a9601e1b6106ff8860050154886000015461162190919063ffffffff16565b90508115610f3257600354610f32906001600160a01b03163383611705565b50505b821561107f578154610f52906001600160a01b03163330866117b6565b60015482546001600160a01b039081169116141561100a576000610ffa6127106106ff600160009054906101000a90046001600160a01b03166001600160a01b0316630aa80f4b6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fc357600080fd5b505afa158015610fd7573d6000803e3d6000fd5b505050506040513d6020811015610fed57600080fd5b5051879061ffff16611621565b905061100684826116c3565b9350505b600682015461ffff161561107057600682015460009061103790612710906106ff90879061ffff16611621565b6006548454919250611056916001600160a01b03908116911683611705565b8154611068908290610705908761175c565b82555061107f565b805461107c908461175c565b81555b600482015481546110a19168327cb2734119d3b7a9601e1b916106ff91611621565b6001820155600582015481546110c89168327cb2734119d3b7a9601e1b916106ff91611621565b600282015560408051848152905133917fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c919081900360200190a2505050565b61111061161d565b6000546001600160a01b03908116911614611160576040805162461bcd60e51b81526020600482018190526024820152600080516020611c3a833981519152604482015290519081900360640190fd5b60048190556109cb600061083f565b61117761161d565b6000546001600160a01b039081169116146111c7576040805162461bcd60e51b81526020600482018190526024820152600080516020611c3a833981519152604482015290519081900360640190fd5b600254604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561121257600080fd5b505afa158015611226573d6000803e3d6000fd5b505050506040513d602081101561123c57600080fd5b50518110611284576040805162461bcd60e51b815260206004820152601060248201526f3737ba1032b737bab3b4103a37b5b2b760811b604482015290519081900360640190fd5b6002546109cb906001600160a01b03163383611705565b6112a361161d565b6000546001600160a01b039081169116146112f3576040805162461bcd60e51b81526020600482018190526024820152600080516020611c3a833981519152604482015290519081900360640190fd5b60058190556109cb600061083f565b6000600760008154811061131257fe5b600091825260208083203380855260089092526040909320805460079093029093018054909450611350926001600160a01b03919091169190611705565b60008082556001820181905560028201819055604080519182525133917f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695919081900360200190a25050565b6113a461161d565b6000546001600160a01b039081169116146113f4576040805162461bcd60e51b81526020600482018190526024820152600080516020611c3a833981519152604482015290519081900360640190fd5b600354604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561143f57600080fd5b505afa158015611453573d6000803e3d6000fd5b505050506040513d602081101561146957600080fd5b505181106114b1576040805162461bcd60e51b815260206004820152601060248201526f3737ba1032b737bab3b4103a37b5b2b760811b604482015290519081900360640190fd5b6003546109cb906001600160a01b03163383611705565b6114d061161d565b6000546001600160a01b03908116911614611520576040805162461bcd60e51b81526020600482018190526024820152600080516020611c3a833981519152604482015290519081900360640190fd5b600b55565b61152d61161d565b6000546001600160a01b0390811691161461157d576040805162461bcd60e51b81526020600482018190526024820152600080516020611c3a833981519152604482015290519081900360640190fd5b6001600160a01b0381166115c25760405162461bcd60e51b8152600401808060200182810382526026815260200180611bcd6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b3390565b60008261163057506000610e10565b8282028284828161163d57fe5b041461167a5760405162461bcd60e51b8152600401808060200182810382526021815260200180611c196021913960400191505060405180910390fd5b9392505050565b600061167a83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611816565b600061167a83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506118b8565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611757908490611912565b505050565b60008282018381101561167a576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052611810908590611912565b50505050565b600081836118a25760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561186757818101518382015260200161184f565b50505050905090810190601f1680156118945780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816118ae57fe5b0495945050505050565b6000818484111561190a5760405162461bcd60e51b815260206004820181815283516024840152835190928392604490910191908501908083836000831561186757818101518382015260200161184f565b505050900390565b6060611967826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166119c39092919063ffffffff16565b8051909150156117575780806020019051602081101561198657600080fd5b50516117575760405162461bcd60e51b815260040180806020018281038252602a815260200180611ba3602a913960400191505060405180910390fd5b60606119d284846000856119da565b949350505050565b606082471015611a1b5760405162461bcd60e51b8152600401808060200182810382526026815260200180611bf36026913960400191505060405180910390fd5b611a2485611b36565b611a75576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310611ab45780518252601f199092019160209182019101611a95565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611b16576040519150601f19603f3d011682016040523d82523d6000602084013e611b1b565b606091505b5091509150611b2b828286611b3c565b979650505050505050565b3b151590565b60608315611b4b57508161167a565b825115611b5b5782518084602001fd5b60405162461bcd60e51b815260206004820181815284516024840152845185939192839260440191908501908083836000831561186757818101518382015260200161184f56fe5361666542455032303a204245503230206f7065726174696f6e20646964206e6f7420737563636565644f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65727570646174654465706f73697446656542503a20696e76616c6964206465706f7369742066656520626173697320706f696e7473a264697066735822122013fd552a84fb0c8eb8e9c66f5ba0a321f4d3a6abf652b0ff7783c182c4d169f564736f6c634300060c0033636f6e74726163743a20696e76616c6964206465706f7369742066656520626173697320706f696e7473000000000000000000000000c8bcb58caef1be972c0b638b1dd8b0748fdc8a44000000000000000000000000c2132d05d31c914a87c6611c10748aeb04b58e8f00000000000000000000000053e0bca35ec356bd5dddfebbd1fc0fd03fabad39000000000000000000000000000000000000000000000000000003e612e1120500000000000000000000000000000000000000000000000000000063ceb01b67000000000000000000000000000000000000000000000000000000000000dead0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000106bcd40000000000000000000000000000000000000000000000000000000001188914
Deployed ByteCode Sourcemap
553:12018:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12278:284;;;;;;;;;;;;;;;;-1:-1:-1;12278:284:8;;;;;;;;;:::i;:::-;;2122:26;;;;;;;;;;;;;;;;-1:-1:-1;2122:26:8;;:::i;:::-;;;;-1:-1:-1;;;;;2122:26:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2204:45;;;;;;;;;;;;;;;;-1:-1:-1;2204:45:8;-1:-1:-1;;;;;2204:45:8;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;2516:28;;;:::i;:::-;;;;;;;;;;;;;;;;9306:1047;;;;;;;;;;;;;;;;-1:-1:-1;9306:1047:8;;:::i;1884:31::-;;;:::i;2436:25::-;;;:::i;6240:951::-;;;;;;;;;;;;;;;;-1:-1:-1;6240:951:8;;:::i;7274:180::-;;;:::i;1770:26::-;;;:::i;:::-;;;;-1:-1:-1;;;;;1770:26:8;;;;;;;;;;;;;;1995;;;:::i;1754:148:4:-;;;:::i;5384:776:8:-;;;;;;;;;;;;;;;;-1:-1:-1;5384:776:8;-1:-1:-1;;;;;5384:776:8;;:::i;3984:86::-;;;:::i;4531:776::-;;;;;;;;;;;;;;;;-1:-1:-1;4531:776:8;-1:-1:-1;;;;;4531:776:8;;:::i;1112:79:4:-;;;:::i;4148:306:8:-;;;;;;;;;;;;;;;;-1:-1:-1;4148:306:8;;;;;;;:::i;1922:31::-;;;:::i;2056:30::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1804:26;;;:::i;1719:21::-;;;:::i;7503:1752::-;;;;;;;;;;;;;;;;-1:-1:-1;7503:1752:8;;:::i;11471:201::-;;;;;;;;;;;;;;;;-1:-1:-1;11471:201:8;;:::i;10852:230::-;;;;;;;;;;;;;;;;-1:-1:-1;10852:230:8;;:::i;11767:201::-;;;;;;;;;;;;;;;;-1:-1:-1;11767:201:8;;:::i;10424:371::-;;;:::i;11143:230::-;;;;;;;;;;;;;;;;-1:-1:-1;11143:230:8;;:::i;12066:119::-;;;;;;;;;;;;;;;;-1:-1:-1;12066:119:8;;:::i;2057:244:4:-;;;;;;;;;;;;;;;;-1:-1:-1;2057:244:4;-1:-1:-1;;;;;2057:244:4;;:::i;12278:284:8:-;1334:12:4;:10;:12::i;:::-;1324:6;;-1:-1:-1;;;;;1324:6:4;;;:22;;;1316:67;;;;;-1:-1:-1;;;1316:67:4;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1316:67:4;;;;;;;;;;;;;;;12395:5:8::1;12378:13;:22;;;;12370:87;;;;-1:-1:-1::0;;;12370:87:8::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12498:13;12468:8;12477:4;12468:14;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;;:27;::::0;;::::1;:43:::0;;-1:-1:-1;;12468:43:8::1;;::::0;;::::1;;::::0;;12522:32;;-1:-1:-1;;;;12522:32:8::1;-1:-1:-1::0;;;12522:32:8;;;::::1;::::0;;;::::1;;::::0;;-1:-1:-1;12278:284:8:o;2122:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2122:26:8;;;;-1:-1:-1;2122:26:8;;;;;;;;;;;:::o;2204:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2516:28::-;;;;:::o;9306:1047::-;9359:21;9383:8;9392:1;9383:11;;;;;;;;;;;;;;;;9438:10;9429:20;;:8;:20;;;;;;;9468:11;;9383;;;;;;;;-1:-1:-1;9468:22:8;-1:-1:-1;9468:22:8;9460:53;;;;;-1:-1:-1;;;9460:53:8;;;;;;;;;;;;-1:-1:-1;;;9460:53:8;;;;;;;;;;;;;;;9524:13;9535:1;9524:10;:13::i;:::-;9548:17;9568:74;9624:4;:17;;;9568:51;-1:-1:-1;;;9568:41:8;9584:4;:24;;;9568:4;:11;;;:15;;:41;;;;:::i;:::-;:45;;:51::i;:::-;:55;;:74::i;:::-;9548:94;-1:-1:-1;9656:13:8;;9653:102;;9686:12;;:57;;-1:-1:-1;;;;;9686:12:8;9720:10;9733:9;9686:25;:57::i;:::-;9765:17;9785:74;9841:4;:17;;;9785:51;-1:-1:-1;;;9785:41:8;9801:4;:24;;;9785:4;:11;;;:15;;:41;;;;:::i;:74::-;9765:94;-1:-1:-1;9873:13:8;;9870:102;;9903:12;;:57;;-1:-1:-1;;;;;9903:12:8;9937:10;9950:9;9903:25;:57::i;:::-;9987:11;;9984:151;;10029:11;;:24;;10045:7;10029:15;:24::i;:::-;10015:38;;10068:12;;:55;;-1:-1:-1;;;;;10068:12:8;10102:10;10115:7;10068:25;:55::i;:::-;10181:24;;;;10165:11;;:51;;-1:-1:-1;;;10211:4:8;10165:41;;:15;:41::i;:51::-;10145:17;;;:71;10263:24;;;;10247:11;;:51;;-1:-1:-1;;;10293:4:8;10247:41;;:15;:41::i;:51::-;10227:17;;;:71;10316:29;;;;;;;;10325:10;;10316:29;;;;;;;;;;9306:1047;;;;;:::o;1884:31::-;;;;:::o;2436:25::-;;;;:::o;6240:951::-;6292:21;6316:8;6325:4;6316:14;;;;;;;;;;;;;;;;;;6292:38;;6361:4;:20;;;6345:12;:36;6341:75;;6398:7;;;6341:75;6445:12;;:37;;;-1:-1:-1;;;6445:37:8;;6476:4;6445:37;;;;;;6426:16;;-1:-1:-1;;;;;6445:12:8;;:22;;:37;;;;;;;;;;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6445:37:8;;-1:-1:-1;6497:13:8;6493:102;;-1:-1:-1;6550:12:8;6527:20;;;;:35;6577:7;;6493:102;6605:18;6626:49;6640:4;:20;;;6662:12;6626:13;:49::i;:::-;6605:70;;6696:20;6719:80;6783:15;;6719:59;6756:4;:21;;;6719:32;6734:16;;6719:10;:14;;:32;;;;:::i;:::-;:36;;:59::i;:80::-;6696:103;-1:-1:-1;6837:66:8;6866:36;6893:8;6866:22;6696:103;-1:-1:-1;;;6866:16:8;:22::i;:36::-;6837:24;;;;;:28;:66::i;:::-;6810:4;:24;;:93;;;;6920:20;6943:80;7007:15;;6943:59;6980:4;:21;;;6943:32;6958:16;;6943:10;:14;;:32;;;;:::i;:80::-;6920:103;-1:-1:-1;7061:66:8;7090:36;7117:8;7090:22;6920:103;-1:-1:-1;;;7090:16:8;:22::i;:36::-;7061:24;;;;;:28;:66::i;:::-;7034:24;;;:93;-1:-1:-1;;7171:12:8;7148:20;;;;:35;;;;-1:-1:-1;;6240:951:8;;:::o;7274:180::-;7336:8;:15;7319:14;7362:85;7390:6;7384:3;:12;7362:85;;;7420:15;7431:3;7420:10;:15::i;:::-;7398:5;;7362:85;;;;7274:180;:::o;1770:26::-;;;-1:-1:-1;;;;;1770:26:8;;:::o;1995:::-;;;-1:-1:-1;;;;;1995:26:8;;:::o;1754:148:4:-;1334:12;:10;:12::i;:::-;1324:6;;-1:-1:-1;;;;;1324:6:4;;;:22;;;1316:67;;;;;-1:-1:-1;;;1316:67:4;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1316:67:4;;;;;;;;;;;;;;;1861:1:::1;1845:6:::0;;1824:40:::1;::::0;-1:-1:-1;;;;;1845:6:4;;::::1;::::0;1824:40:::1;::::0;1861:1;;1824:40:::1;1892:1;1875:19:::0;;-1:-1:-1;;;;;;1875:19:4::1;::::0;;1754:148::o;5384:776:8:-;5447:7;5467:21;5491:8;5500:1;5491:11;;;;;;;;;;;;;;;;-1:-1:-1;;;;;5537:15:8;;;;;:8;:15;;;;;;5593:24;5491:11;;;;;;;5593:24;;;;5647:12;;:37;;-1:-1:-1;;;5647:37:8;;5678:4;5647:37;;;;;;5491:11;;-1:-1:-1;5537:15:8;;5593:24;;5491:11;;5647:12;;;;;:22;;:37;;;;;;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5647:37:8;5714:20;;;;5647:37;;-1:-1:-1;5699:12:8;:35;:52;;;;-1:-1:-1;5738:13:8;;;5699:52;5695:371;;;5768:18;5789:49;5803:4;:20;;;5825:12;5789:13;:49::i;:::-;5768:70;;5853:20;5876:80;5940:15;;5876:59;5913:4;:21;;;5876:32;5891:16;;5876:10;:14;;:32;;;;:::i;:80::-;5853:103;-1:-1:-1;5993:61:8;6017:36;6044:8;6017:22;5853:103;-1:-1:-1;;;6017:16:8;:22::i;:36::-;5993:19;;:23;:61::i;:::-;5971:83;;5695:371;;;6083:69;6134:4;:17;;;6083:46;-1:-1:-1;;;6083:36:8;6099:19;6083:4;:11;;;:15;;:36;;;;:::i;:69::-;6076:76;5384:776;-1:-1:-1;;;;;;5384:776:8:o;3984:86::-;1334:12:4;:10;:12::i;:::-;1324:6;;-1:-1:-1;;;;;1324:6:4;;;:22;;;1316:67;;;;;-1:-1:-1;;;1316:67:4;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1316:67:4;;;;;;;;;;;;;;;4050:12:8::1;4034:13;:28:::0;3984:86::o;4531:776::-;4594:7;4614:21;4638:8;4647:1;4638:11;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4684:15:8;;;;;:8;:15;;;;;;4638:11;;;;;;;;4740:24;;;;;4794:12;;:37;;-1:-1:-1;;;4794:37:8;;4825:4;4794:37;;;;;;;;;4638:11;;-1:-1:-1;4684:15:8;;4638:11;4794:12;;;;;:22;;:37;;;;;;;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4794:37:8;4861:20;;;;4794:37;;-1:-1:-1;4846:12:8;:35;:52;;;;-1:-1:-1;4885:13:8;;;4846:52;4842:371;;;4915:18;4936:49;4950:4;:20;;;4972:12;4936:13;:49::i;:::-;4915:70;;5000:20;5023:80;5087:15;;5023:59;5060:4;:21;;;5023:32;5038:16;;5023:10;:14;;:32;;;;:::i;:80::-;5000:103;-1:-1:-1;5140:61:8;5164:36;5191:8;5164:22;5000:103;-1:-1:-1;;;5164:16:8;:22::i;5140:61::-;5118:83;;4842:371;;;5230:69;5281:4;:17;;;5230:46;-1:-1:-1;;;5230:36:8;5246:19;5230:4;:11;;;:15;;:36;;;;:::i;1112:79:4:-;1150:7;1177:6;-1:-1:-1;;;;;1177:6:4;1112:79;:::o;4148:306:8:-;4220:7;4251:13;;4244:3;:20;4240:207;;4288:14;:3;4296:5;4288:7;:14::i;:::-;4281:21;;;;4240:207;4333:13;;4324:5;:22;4320:127;;-1:-1:-1;4370:1:8;4363:8;;4320:127;4411:13;;:24;;4429:5;4411:17;:24::i;4320:127::-;4148:306;;;;:::o;1922:31::-;;;;:::o;2056:30::-;;;-1:-1:-1;;;2056:30:8;;;;;:::o;1804:26::-;;;-1:-1:-1;;;;;1804:26:8;;:::o;1719:21::-;;;-1:-1:-1;;;;;1719:21:8;;:::o;7503:1752::-;7555:21;7579:8;7588:1;7579:11;;;;;;;;;;;;;;;;7634:10;7625:20;;:8;:20;;;;;;7579:11;;;;;;-1:-1:-1;7625:20:8;7658:13;;:10;:13::i;:::-;7686:11;;:15;7682:511;;7718:17;7738:74;7794:4;:17;;;7738:51;-1:-1:-1;;;7738:41:8;7754:4;:24;;;7738:4;:11;;;:15;;:41;;;;:::i;:74::-;7718:94;-1:-1:-1;7830:13:8;;7827:110;;7864:12;;:57;;-1:-1:-1;;;;;7864:12:8;7898:10;7911:9;7864:25;:57::i;:::-;7951:17;7971:74;8027:4;:17;;;7971:51;-1:-1:-1;;;7971:41:8;7987:4;:24;;;7971:4;:11;;;:15;;:41;;;;:::i;:74::-;7951:94;-1:-1:-1;8063:13:8;;8060:110;;8097:12;;:57;;-1:-1:-1;;;;;8097:12:8;8131:10;8144:9;8097:25;:57::i;:::-;7682:511;;;8275:11;;8272:738;;8303:12;;:74;;-1:-1:-1;;;;;8303:12:8;8341:10;8362:4;8369:7;8303:29;:74::i;:::-;8479:4;;8454:12;;-1:-1:-1;;;;;8454:12:8;;;8479:4;;8446:38;8442:188;;;8505:15;8523:42;8559:5;8523:31;8535:4;;;;;;;;;-1:-1:-1;;;;;8535:4:8;-1:-1:-1;;;;;8535:16:8;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8535:18:8;8523:7;;:31;;:11;:31::i;:42::-;8505:60;-1:-1:-1;8594:20:8;:7;8505:60;8594:11;:20::i;:::-;8584:30;;8442:188;;8661:17;;;;;;:21;8658:341;;8735:17;;;;8702:18;;8723:41;;8758:5;;8723:30;;:7;;8735:17;;8723:11;:30::i;:41::-;8809:11;;8783:12;;8702:62;;-1:-1:-1;8783:50:8;;-1:-1:-1;;;;;8783:12:8;;;;8809:11;8702:62;8783:25;:50::i;:::-;8866:11;;:40;;8895:10;;8866:24;;8882:7;8866:15;:24::i;:40::-;8852:54;;-1:-1:-1;8658:341:8;;;8959:11;;:24;;8975:7;8959:15;:24::i;:::-;8945:38;;8658:341;9084:24;;;;9068:11;;:51;;-1:-1:-1;;;9114:4:8;9068:41;;:15;:41::i;:51::-;9048:17;;;:71;9166:24;;;;9150:11;;:51;;-1:-1:-1;;;9196:4:8;9150:41;;:15;:41::i;:51::-;9130:17;;;:71;9219:28;;;;;;;;9227:10;;9219:28;;;;;;;;;;7503:1752;;;:::o;11471:201::-;1334:12:4;:10;:12::i;:::-;1324:6;;-1:-1:-1;;;;;1324:6:4;;;:22;;;1316:67;;;;;-1:-1:-1;;;1316:67:4;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1316:67:4;;;;;;;;;;;;;;;11558:16:8::1;:36:::0;;;11643:13:::1;11654:1;11643:10;:13::i;10852:230::-:0;1334:12:4;:10;:12::i;:::-;1324:6;;-1:-1:-1;;;;;1324:6:4;;;:22;;;1316:67;;;;;-1:-1:-1;;;1316:67:4;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1316:67:4;;;;;;;;;;;;;;;10950:12:8::1;::::0;:37:::1;::::0;;-1:-1:-1;;;10950:37:8;;10981:4:::1;10950:37;::::0;::::1;::::0;;;-1:-1:-1;;;;;10950:12:8;;::::1;::::0;:22:::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:12;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;10950:37:8;10940:47;::::1;10932:76;;;::::0;;-1:-1:-1;;;10932:76:8;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10932:76:8;;;;;;;;;;;;;::::1;;11019:12;::::0;:55:::1;::::0;-1:-1:-1;;;;;11019:12:8::1;11053:10;11066:7:::0;11019:25:::1;:55::i;11767:201::-:0;1334:12:4;:10;:12::i;:::-;1324:6;;-1:-1:-1;;;;;1324:6:4;;;:22;;;1316:67;;;;;-1:-1:-1;;;1316:67:4;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1316:67:4;;;;;;;;;;;;;;;11854:16:8::1;:36:::0;;;11939:13:::1;11950:1;11939:10;:13::i;10424:371::-:0;10471:21;10495:8;10504:1;10495:11;;;;;;;;;;;;;;;;10550:10;10541:20;;;:8;:20;;;;;;;10619:11;;10495;;;;;;;10572:12;;10495:11;;-1:-1:-1;10572:59:8;;-1:-1:-1;;;;;10572:12:8;;;;;10550:10;10572:25;:59::i;:::-;10656:1;10642:15;;;10668:17;;;:21;;;10700:17;;;:21;;;10745:42;;;;;;;10763:10;;10745:42;;;;;;;;;;10424:371;;:::o;11143:230::-;1334:12:4;:10;:12::i;:::-;1324:6;;-1:-1:-1;;;;;1324:6:4;;;:22;;;1316:67;;;;;-1:-1:-1;;;1316:67:4;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1316:67:4;;;;;;;;;;;;;;;11241:12:8::1;::::0;:37:::1;::::0;;-1:-1:-1;;;11241:37:8;;11272:4:::1;11241:37;::::0;::::1;::::0;;;-1:-1:-1;;;;;11241:12:8;;::::1;::::0;:22:::1;::::0;:37;;;;;::::1;::::0;;;;;;;;;:12;:37;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;11241:37:8;11231:47;::::1;11223:76;;;::::0;;-1:-1:-1;;;11223:76:8;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;11223:76:8;;;;;;;;;;;;;::::1;;11310:12;::::0;:55:::1;::::0;-1:-1:-1;;;;;11310:12:8::1;11344:10;11357:7:::0;11310:25:::1;:55::i;12066:119::-:0;1334:12:4;:10;:12::i;:::-;1324:6;;-1:-1:-1;;;;;1324:6:4;;;:22;;;1316:67;;;;;-1:-1:-1;;;1316:67:4;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1316:67:4;;;;;;;;;;;;;;;12147:13:8::1;:30:::0;12066:119::o;2057:244:4:-;1334:12;:10;:12::i;:::-;1324:6;;-1:-1:-1;;;;;1324:6:4;;;:22;;;1316:67;;;;;-1:-1:-1;;;1316:67:4;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1316:67:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;2146:22:4;::::1;2138:73;;;;-1:-1:-1::0;;;2138:73:4::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2248:6;::::0;;2227:38:::1;::::0;-1:-1:-1;;;;;2227:38:4;;::::1;::::0;2248:6;::::1;::::0;2227:38:::1;::::0;::::1;2276:6;:17:::0;;-1:-1:-1;;;;;;2276:17:4::1;-1:-1:-1::0;;;;;2276:17:4;;;::::1;::::0;;;::::1;::::0;;2057:244::o;613:106:2:-;701:10;613:106;:::o;2264:471:7:-;2322:7;2567:6;2563:47;;-1:-1:-1;2597:1:7;2590:8;;2563:47;2634:5;;;2638:1;2634;:5;:1;2658:5;;;;;:10;2650:56;;;;-1:-1:-1;;;2650:56:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2726:1;2264:471;-1:-1:-1;;;2264:471:7:o;3211:132::-;3269:7;3296:39;3300:1;3303;3296:39;;;;;;;;;;;;;;;;;:3;:39::i;1374:136::-;1432:7;1459:43;1463:1;1466;1459:43;;;;;;;;;;;;;;;;;:3;:43::i;706:177:6:-;816:58;;;-1:-1:-1;;;;;816:58:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;816:58:6;-1:-1:-1;;;816:58:6;;;789:86;;809:5;;789:19;:86::i;:::-;706:177;;;:::o;910:181:7:-;968:7;1000:5;;;1024:6;;;;1016:46;;;;;-1:-1:-1;;;1016:46:7;;;;;;;;;;;;;;;;;;;;;;;;;;;891:205:6;1019:68;;;-1:-1:-1;;;;;1019:68:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1019:68:6;-1:-1:-1;;;1019:68:6;;;992:96;;1012:5;;992:19;:96::i;:::-;891:205;;;;:::o;3839:278:7:-;3925:7;3960:12;3953:5;3945:28;;;;-1:-1:-1;;;3945:28:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3984:9;4000:1;3996;:5;;;;;;;3839:278;-1:-1:-1;;;;;3839:278:7:o;1813:192::-;1899:7;1935:12;1927:6;;;;1919:29;;;;-1:-1:-1;;;1919:29:7;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1971:5:7;;;1813:192::o;3011:761:6:-;3435:23;3461:69;3489:4;3461:69;;;;;;;;;;;;;;;;;3469:5;-1:-1:-1;;;;;3461:27:6;;;:69;;;;;:::i;:::-;3545:17;;3435:95;;-1:-1:-1;3545:21:6;3541:224;;3687:10;3676:30;;;;;;;;;;;;;;;-1:-1:-1;3676:30:6;3668:85;;;;-1:-1:-1;;;3668:85:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3669:195:0;3772:12;3804:52;3826:6;3834:4;3840:1;3843:12;3804:21;:52::i;:::-;3797:59;3669:195;-1:-1:-1;;;;3669:195:0:o;4721:530::-;4848:12;4906:5;4881:21;:30;;4873:81;;;;-1:-1:-1;;;4873:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4973:18;4984:6;4973:10;:18::i;:::-;4965:60;;;;;-1:-1:-1;;;4965:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5099:12;5113:23;5140:6;-1:-1:-1;;;;;5140:11:0;5160:5;5168:4;5140:33;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5140:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5098:75;;;;5191:52;5209:7;5218:10;5230:12;5191:17;:52::i;:::-;5184:59;4721:530;-1:-1:-1;;;;;;;4721:530:0:o;751:422::-;1118:20;1157:8;;;751:422::o;6257:742::-;6372:12;6401:7;6397:595;;;-1:-1:-1;6432:10:0;6425:17;;6397:595;6546:17;;:21;6542:439;;6809:10;6803:17;6870:15;6857:10;6853:2;6849:19;6842:44;6757:148;6945:20;;-1:-1:-1;;;6945:20:0;;;;;;;;;;;;;;;;;6952:12;;6945:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://13fd552a84fb0c8eb8e9c66f5ba0a321f4d3a6abf652b0ff7783c182c4d169f5
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.