Source Code
Latest 5 from a total of 5 transactions
Latest 25 internal transactions (View All)
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 9192723 | 375 days ago | 0 GLMR | ||||
| 9192723 | 375 days ago | 0 GLMR | ||||
| 9192723 | 375 days ago | 0 GLMR | ||||
| 9167000 | 377 days ago | 0 GLMR | ||||
| 9167000 | 377 days ago | 0 GLMR | ||||
| 9167000 | 377 days ago | 0 GLMR | ||||
| 9166083 | 377 days ago | 0 GLMR | ||||
| 9166083 | 377 days ago | 0 GLMR | ||||
| 9166083 | 377 days ago | 0 GLMR | ||||
| 9166038 | 377 days ago | 0 GLMR | ||||
| 9166038 | 377 days ago | 0 GLMR | ||||
| 9166038 | 377 days ago | 0 GLMR | ||||
| 9165440 | 377 days ago | 0 GLMR | ||||
| 9165440 | 377 days ago | 0 GLMR | ||||
| 9165440 | 377 days ago | 0 GLMR | ||||
| 8817872 | 402 days ago | 0 GLMR | ||||
| 8817872 | 402 days ago | 0 GLMR | ||||
| 8817872 | 402 days ago | 0 GLMR | ||||
| 8661623 | 413 days ago | 0 GLMR | ||||
| 8661623 | 413 days ago | 0 GLMR | ||||
| 8661623 | 413 days ago | 0 GLMR | ||||
| 7809922 | 474 days ago | 0 GLMR | ||||
| 7809922 | 474 days ago | 0 GLMR | ||||
| 7809922 | 474 days ago | 0 GLMR | ||||
| 7809766 | 474 days ago | 0 GLMR |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Rewarder
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at moonbeam.moonscan.io on 2022-02-10
*/
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
/**
* @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() {
_transferOwnership(_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 {
_transferOwnership(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");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making 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;
}
}
interface IBoringERC20 {
function mint(address to, uint256 amount) external;
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function allowance(address owner, address spender)
external
view
returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
/// @notice EIP 2612
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
}
interface IRewarder {
function onFlareReward(
uint256 pid,
address user,
uint256 newLpAmount
) external;
function pendingTokens(uint256 pid, address user)
external
view
returns (uint256 pending);
function rewardToken() external view returns (IBoringERC20);
function poolRewardsPerSec(uint256 pid) external view returns (uint256);
}
interface IFlareDistributor {
function totalAllocPoint() external view returns (uint256);
function deposit(uint256 _pid, uint256 _amount) external;
function poolLength() external view returns (uint256);
function poolTotalLp(uint256 pid) external view returns (uint256);
}
// solhint-disable avoid-low-level-calls
library BoringERC20 {
bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()
bytes4 private constant SIG_NAME = 0x06fdde03; // name()
bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()
bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)
bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)
function returnDataToString(bytes memory data)
internal
pure
returns (string memory)
{
if (data.length >= 64) {
return abi.decode(data, (string));
} else if (data.length == 32) {
uint8 i = 0;
while (i < 32 && data[i] != 0) {
i++;
}
bytes memory bytesArray = new bytes(i);
for (i = 0; i < 32 && data[i] != 0; i++) {
bytesArray[i] = data[i];
}
return string(bytesArray);
} else {
return "???";
}
}
/// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.
/// @param token The address of the ERC-20 token contract.
/// @return (string) Token symbol.
function safeSymbol(IBoringERC20 token)
internal
view
returns (string memory)
{
(bool success, bytes memory data) = address(token).staticcall(
abi.encodeWithSelector(SIG_SYMBOL)
);
return success ? returnDataToString(data) : "???";
}
/// @notice Provides a safe ERC20.name version which returns '???' as fallback string.
/// @param token The address of the ERC-20 token contract.
/// @return (string) Token name.
function safeName(IBoringERC20 token)
internal
view
returns (string memory)
{
(bool success, bytes memory data) = address(token).staticcall(
abi.encodeWithSelector(SIG_NAME)
);
return success ? returnDataToString(data) : "???";
}
/// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.
/// @param token The address of the ERC-20 token contract.
/// @return (uint8) Token decimals.
function safeDecimals(IBoringERC20 token) internal view returns (uint8) {
(bool success, bytes memory data) = address(token).staticcall(
abi.encodeWithSelector(SIG_DECIMALS)
);
return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
}
/// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.
/// Reverts on a failed transfer.
/// @param token The address of the ERC-20 token.
/// @param to Transfer tokens to.
/// @param amount The token amount.
function safeTransfer(
IBoringERC20 token,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(SIG_TRANSFER, to, amount)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"BoringERC20: Transfer failed"
);
}
/// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.
/// Reverts on a failed transfer.
/// @param token The address of the ERC-20 token.
/// @param from Transfer tokens from.
/// @param to Transfer tokens to.
/// @param amount The token amount.
function safeTransferFrom(
IBoringERC20 token,
address from,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"BoringERC20: TransferFrom failed"
);
}
}
/**
* This is a sample contract to be used in the FlareDistributor contract for partners to reward
* stakers with their native token alongside FLARE.
*
* It assumes no minting rights, so requires a set amount of YOUR_TOKEN to be transferred to this contract prior.
* E.g. say you've allocated 100,000 XYZ to the FLARE-XYZ farm over 30 days. Then you would need to transfer
* 100,000 XYZ and set the block reward accordingly so it's fully distributed after 30 days.
*/
contract Rewarder is IRewarder, Ownable, ReentrancyGuard {
using BoringERC20 for IBoringERC20;
IBoringERC20 public immutable override rewardToken;
IFlareDistributor public immutable distributor;
bool public immutable isNative;
/// @notice Info of each distributor user.
/// `amount` LP token amount the user has provided.
/// `rewardDebt` The amount of REWARD entitled to the user.
struct UserInfo {
uint256 amount;
uint256 rewardDebt;
}
/// @notice Info of each distributor poolInfo.
/// `accTokenPerShare` Amount of REWARD each LP token is worth.
/// `startTimestamp` The start timestamp of rewards.
/// `lastRewardTimestamp` The last timestamp REWARD was rewarded to the poolInfo.
/// `allocPoint` The amount of allocation points assigned to the pool.
/// `totalRewards` The amount of rewards added to the pool.
struct PoolInfo {
uint256 accTokenPerShare;
uint256 startTimestamp;
uint256 lastRewardTimestamp;
uint256 allocPoint;
uint256 totalRewards;
}
/// @notice Reward info
/// `startTimestamp` The start timestamp of rewards
/// `endTimestamp` The end timestamp of rewards
/// `rewardPerSec` The amount of rewards per second
struct RewardInfo {
uint256 startTimestamp;
uint256 endTimestamp;
uint256 rewardPerSec;
}
/// @notice Info of each pool.
mapping(uint256 => PoolInfo) public poolInfo;
/// @dev this is mostly used for extending reward period
/// @notice Reward info is a set of {endTimestamp, rewardPerSec}
/// indexed by pool id
mapping(uint256 => RewardInfo[]) public poolRewardInfo;
uint256[] public poolIds;
/// @notice Info of each user that stakes LP tokens.
mapping(uint256 => mapping(address => UserInfo)) public userInfo;
/// @dev Total allocation points. Must be the sum of all allocation points in all pools.
uint256 public totalAllocPoint = 0;
/// @notice limit length of reward info
/// how many phases are allowed
uint256 public immutable rewardInfoLimit = 52; //1y
// The precision factor
uint256 private immutable ACC_TOKEN_PRECISION;
event OnReward(address indexed user, uint256 amount);
event RewardRateUpdated(uint256 oldRate, uint256 newRate);
event AddPool(uint256 indexed pid, uint256 allocPoint);
event SetPool(uint256 indexed pid, uint256 allocPoint);
event UpdatePool(
uint256 indexed pid,
uint256 lastRewardTimestamp,
uint256 lpSupply,
uint256 accTokenPerShare
);
event AddRewardInfo(
uint256 indexed pid,
uint256 indexed phase,
uint256 endTimestamp,
uint256 rewardPerSec
);
modifier onlyDistributor() {
require(
msg.sender == address(distributor),
"onlyDistributor: only FlareDistributor can call this function"
);
_;
}
constructor(
IBoringERC20 _rewardToken,
IFlareDistributor _distributor,
bool _isNative
) {
require(
Address.isContract(address(_rewardToken)),
"constructor: reward token must be a valid contract"
);
require(
Address.isContract(address(_distributor)),
"constructor: FlareDistributor must be a valid contract"
);
rewardToken = _rewardToken;
distributor = _distributor;
isNative = _isNative;
uint256 decimalsRewardToken = uint256(
_isNative ? 18 : _rewardToken.safeDecimals()
);
require(
decimalsRewardToken < 30,
"constructor: reward token decimals must be inferior to 30"
);
ACC_TOKEN_PRECISION = uint256(
10**(uint256(30) - (decimalsRewardToken))
);
}
/// @notice Add a new pool. Can only be called by the owner.
/// @param _pid pool id on distributor
/// @param _allocPoint allocation of the new pool.
function add(
uint256 _pid,
uint256 _allocPoint,
uint256 _startTimestamp
) public onlyOwner {
require(poolInfo[_pid].lastRewardTimestamp == 0, "pool already exists");
totalAllocPoint += _allocPoint;
poolInfo[_pid] = PoolInfo({
allocPoint: _allocPoint,
startTimestamp: _startTimestamp,
lastRewardTimestamp: _startTimestamp,
accTokenPerShare: 0,
totalRewards: 0
});
poolIds.push(_pid);
emit AddPool(_pid, _allocPoint);
}
/// @notice if the new reward info is added, the reward & its end timestamp will be extended by the newly pushed reward info.
function addRewardInfo(
uint256 _pid,
uint256 _endTimestamp,
uint256 _rewardPerSec
) external payable onlyOwner {
RewardInfo[] storage rewardInfo = poolRewardInfo[_pid];
PoolInfo storage pool = poolInfo[_pid];
require(
rewardInfo.length < rewardInfoLimit,
"add reward info: reward info length exceeds the limit"
);
require(
rewardInfo.length == 0 ||
rewardInfo[rewardInfo.length - 1].endTimestamp >=
block.timestamp,
"add reward info: reward period ended"
);
require(
rewardInfo.length == 0 ||
rewardInfo[rewardInfo.length - 1].endTimestamp < _endTimestamp,
"add reward info: bad new endTimestamp"
);
uint256 startTimestamp = rewardInfo.length == 0
? pool.startTimestamp
: rewardInfo[rewardInfo.length - 1].endTimestamp;
uint256 timeRange = _endTimestamp - startTimestamp;
uint256 totalRewards = timeRange * _rewardPerSec;
if (!isNative) {
rewardToken.safeTransferFrom(
msg.sender,
address(this),
totalRewards
);
} else {
require(
msg.value == totalRewards,
"add reward info: not enough funds to transfer"
);
}
pool.totalRewards += totalRewards;
rewardInfo.push(
RewardInfo({
startTimestamp: startTimestamp,
endTimestamp: _endTimestamp,
rewardPerSec: _rewardPerSec
})
);
emit AddRewardInfo(
_pid,
rewardInfo.length - 1,
_endTimestamp,
_rewardPerSec
);
}
function _endTimestampOf(uint256 _pid, uint256 _timestamp)
internal
view
returns (uint256)
{
RewardInfo[] memory rewardInfo = poolRewardInfo[_pid];
uint256 len = rewardInfo.length;
if (len == 0) {
return 0;
}
for (uint256 i = 0; i < len; ++i) {
if (_timestamp <= rewardInfo[i].endTimestamp)
return rewardInfo[i].endTimestamp;
}
/// @dev when couldn't find any reward info, it means that _timestamp exceed endTimestamp
/// so return the latest reward info.
return rewardInfo[len - 1].endTimestamp;
}
/// @notice this will return end timestamp based on the current block timestamp.
function currentEndTimestamp(uint256 _pid) external view returns (uint256) {
return _endTimestampOf(_pid, block.timestamp);
}
/// @notice Return reward multiplier over the given _from to _to timestamp.
function _getTimeElapsed(
uint256 _from,
uint256 _to,
uint256 _endTimestamp
) public pure returns (uint256) {
if ((_from >= _endTimestamp) || (_from > _to)) {
return 0;
}
if (_to <= _endTimestamp) {
return _to - _from;
}
return _endTimestamp - _from;
}
/// @notice Update reward variables of the given pool.
/// @param _pid The index of the pool. See `poolInfo`.
/// @return pool Returns the pool that was updated.
function updatePool(uint256 _pid)
external
nonReentrant
returns (PoolInfo memory pool)
{
return _updatePool(_pid);
}
/// @notice Update reward variables of the given pool.
/// @param pid The index of the pool. See `poolInfo`.
/// @return pool Returns the pool that was updated.
function _updatePool(uint256 pid) public returns (PoolInfo memory pool) {
pool = poolInfo[pid];
RewardInfo[] memory rewardInfo = poolRewardInfo[pid];
if (block.timestamp <= pool.lastRewardTimestamp) {
return pool;
}
uint256 lpSupply = distributor.poolTotalLp(pid);
if (lpSupply == 0) {
// if there is no total supply, return and use the pool's start timestamp as the last reward timestamp
// so that ALL reward will be distributed.
// however, if the first deposit is out of reward period, last reward timestamp will be its timestamp
// in order to keep the multiplier = 0
if (block.timestamp > _endTimestampOf(pid, block.timestamp)) {
pool.lastRewardTimestamp = block.timestamp;
emit UpdatePool(
pid,
pool.lastRewardTimestamp,
lpSupply,
pool.accTokenPerShare
);
}
return pool;
}
/// @dev for each reward info
for (uint256 i = 0; i < rewardInfo.length; ++i) {
// @dev get multiplier based on current timestamp and rewardInfo's end timestamp
// multiplier will be a range of either (current timestamp - pool.timestamp)
// or (reward info's endtimestamp - pool.timestamp) or 0
uint256 timeElapsed = _getTimeElapsed(
pool.lastRewardTimestamp,
block.timestamp,
rewardInfo[i].endTimestamp
);
if (timeElapsed == 0) continue;
// @dev if currentTimestamp exceed end timestamp, use end timestamp as the last reward timestamp
// so that for the next iteration, previous endTimestamp will be used as the last reward timestamp
if (block.timestamp > rewardInfo[i].endTimestamp) {
pool.lastRewardTimestamp = rewardInfo[i].endTimestamp;
} else {
pool.lastRewardTimestamp = block.timestamp;
}
uint256 tokenReward = (timeElapsed *
rewardInfo[i].rewardPerSec *
pool.allocPoint) / totalAllocPoint;
pool.accTokenPerShare += ((tokenReward * ACC_TOKEN_PRECISION) /
lpSupply);
}
poolInfo[pid] = pool;
emit UpdatePool(
pid,
pool.lastRewardTimestamp,
lpSupply,
pool.accTokenPerShare
);
return pool;
}
// Update reward vairables for all pools. Be careful of gas spending!
function massUpdatePools() public nonReentrant {
_massUpdatePools();
}
// Update reward vairables for all pools. Be careful of gas spending!
function _massUpdatePools() internal {
uint256 length = poolIds.length;
for (uint256 pid = 0; pid < length; ++pid) {
_updatePool(poolIds[pid]);
}
}
/// @notice Function called by FlareDistributor whenever staker claims FLARE harvest. Allows staker to also receive a 2nd reward token.
/// @param _user Address of user
/// @param _amount Number of LP tokens the user has
function onFlareReward(
uint256 _pid,
address _user,
uint256 _amount
) external override onlyDistributor nonReentrant {
PoolInfo memory pool = _updatePool(_pid);
UserInfo storage user = userInfo[_pid][_user];
uint256 pending = 0;
uint256 rewardBalance = 0;
if (isNative) {
rewardBalance = address(this).balance;
} else {
rewardBalance = rewardToken.balanceOf(address(this));
}
if (user.amount > 0) {
pending = (((user.amount * pool.accTokenPerShare) /
ACC_TOKEN_PRECISION) - user.rewardDebt);
if (pending > 0) {
if (isNative) {
if (pending > rewardBalance) {
(bool success, ) = _user.call{value: rewardBalance}("");
require(success, "Transfer failed");
} else {
(bool success, ) = _user.call{value: pending}("");
require(success, "Transfer failed");
}
} else {
if (pending > rewardBalance) {
rewardToken.safeTransfer(_user, rewardBalance);
} else {
rewardToken.safeTransfer(_user, pending);
}
}
}
}
user.amount = _amount;
user.rewardDebt =
(user.amount * pool.accTokenPerShare) /
ACC_TOKEN_PRECISION;
emit OnReward(_user, pending);
}
/// @notice View function to see pending Reward on frontend.
function pendingTokens(uint256 _pid, address _user)
external
view
override
returns (uint256)
{
return
_pendingTokens(
_pid,
userInfo[_pid][_user].amount,
userInfo[_pid][_user].rewardDebt
);
}
function _pendingTokens(
uint256 _pid,
uint256 _amount,
uint256 _rewardDebt
) internal view returns (uint256 pending) {
PoolInfo memory pool = poolInfo[_pid];
RewardInfo[] memory rewardInfo = poolRewardInfo[_pid];
uint256 accTokenPerShare = pool.accTokenPerShare;
uint256 lpSupply = distributor.poolTotalLp(_pid);
if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) {
uint256 cursor = pool.lastRewardTimestamp;
for (uint256 i = 0; i < rewardInfo.length; ++i) {
uint256 timeElapsed = _getTimeElapsed(
cursor,
block.timestamp,
rewardInfo[i].endTimestamp
);
if (timeElapsed == 0) continue;
cursor = rewardInfo[i].endTimestamp;
uint256 tokenReward = (timeElapsed *
rewardInfo[i].rewardPerSec *
pool.allocPoint) / totalAllocPoint;
accTokenPerShare +=
(tokenReward * ACC_TOKEN_PRECISION) /
lpSupply;
}
}
pending = (((_amount * accTokenPerShare) / ACC_TOKEN_PRECISION) -
_rewardDebt);
}
function _rewardPerSecOf(uint256 _pid, uint256 _blockTimestamp)
internal
view
returns (uint256)
{
RewardInfo[] memory rewardInfo = poolRewardInfo[_pid];
PoolInfo storage pool = poolInfo[_pid];
uint256 len = rewardInfo.length;
if (len == 0) {
return 0;
}
for (uint256 i = 0; i < len; ++i) {
if (_blockTimestamp <= rewardInfo[i].endTimestamp)
return
(rewardInfo[i].rewardPerSec * pool.allocPoint) /
totalAllocPoint;
}
/// @dev when couldn't find any reward info, it means that timestamp exceed endblock
/// so return 0
return 0;
}
/// @notice View function to see pool rewards per sec
function poolRewardsPerSec(uint256 _pid)
external
view
override
returns (uint256)
{
return _rewardPerSecOf(_pid, block.timestamp);
}
/// @notice Withdraw reward. EMERGENCY ONLY.
function emergencyRewardWithdraw(
uint256 _pid,
uint256 _amount,
address _beneficiary
) external onlyOwner nonReentrant {
PoolInfo storage pool = poolInfo[_pid];
uint256 lpSupply = distributor.poolTotalLp(_pid);
uint256 currentStakingPendingReward = _pendingTokens(_pid, lpSupply, 0);
require(
currentStakingPendingReward + _amount <= pool.totalRewards,
"emergency reward withdraw: not enough reward token"
);
pool.totalRewards -= _amount;
if (!isNative) {
rewardToken.safeTransfer(_beneficiary, _amount);
} else {
(bool sent, ) = _beneficiary.call{value: _amount}("");
require(sent, "emergency reward withdraw: failed to send");
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IBoringERC20","name":"_rewardToken","type":"address"},{"internalType":"contract IFlareDistributor","name":"_distributor","type":"address"},{"internalType":"bool","name":"_isNative","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"AddPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"phase","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardPerSec","type":"uint256"}],"name":"AddRewardInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"OnReward","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":"uint256","name":"oldRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"RewardRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"}],"name":"SetPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accTokenPerShare","type":"uint256"}],"name":"UpdatePool","type":"event"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"}],"name":"_getTimeElapsed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"_updatePool","outputs":[{"components":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"internalType":"struct Rewarder.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint256","name":"_startTimestamp","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"},{"internalType":"uint256","name":"_rewardPerSec","type":"uint256"}],"name":"addRewardInfo","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"currentEndTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"contract IFlareDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_beneficiary","type":"address"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isNative","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"onFlareReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolRewardInfo","outputs":[{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"endTimestamp","type":"uint256"},{"internalType":"uint256","name":"rewardPerSec","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewardsPerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardInfoLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBoringERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","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":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint256","name":"accTokenPerShare","type":"uint256"},{"internalType":"uint256","name":"startTimestamp","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"totalRewards","type":"uint256"}],"internalType":"struct Rewarder.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
6101206040526000600655603460e0523480156200001c57600080fd5b50604051620030fc380380620030fc8339810160408190526200003f9162000376565b6200004a3362000257565b600180819055506200006783620002a760201b62001d771760201c565b620000d45760405162461bcd60e51b815260206004820152603260248201527f636f6e7374727563746f723a2072657761726420746f6b656e206d7573742062604482015271194818481d985b1a590818dbdb9d1c9858dd60721b60648201526084015b60405180910390fd5b620000ea82620002a760201b62001d771760201c565b6200015e5760405162461bcd60e51b815260206004820152603660248201527f636f6e7374727563746f723a20466c6172654469737472696275746f72206d7560448201527f737420626520612076616c696420636f6e7472616374000000000000000000006064820152608401620000cb565b6001600160601b0319606084811b821660805283901b1660a05280151560f81b60c052600081620001ae57620001a8846001600160a01b0316620002ad60201b62001d7d1760201c565b620001b1565b60125b60ff169050601e81106200022e5760405162461bcd60e51b815260206004820152603960248201527f636f6e7374727563746f723a2072657761726420746f6b656e20646563696d6160448201527f6c73206d75737420626520696e666572696f7220746f203330000000000000006064820152608401620000cb565b6200023b81601e6200053f565b6200024890600a62000481565b61010052506200058892505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3b151590565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691620002f59190620003fa565b600060405180830381855afa9150503d806000811462000332576040519150601f19603f3d011682016040523d82523d6000602084013e62000337565b606091505b50915091508180156200034b575080516020145b620003585760126200036e565b808060200190518101906200036e9190620003ce565b949350505050565b6000806000606084860312156200038c57600080fd5b835162000399816200056f565b6020850151909350620003ac816200056f565b60408501519092508015158114620003c357600080fd5b809150509250925092565b600060208284031215620003e157600080fd5b815160ff81168114620003f357600080fd5b9392505050565b6000825160005b818110156200041d576020818601810151858301520162000401565b818111156200042d576000828501525b509190910192915050565b600181815b80851115620004795781600019048211156200045d576200045d62000559565b808516156200046b57918102915b93841c93908002906200043d565b509250929050565b6000620003f383836000826200049a5750600162000539565b81620004a95750600062000539565b8160018114620004c25760028114620004cd57620004ed565b600191505062000539565b60ff841115620004e157620004e162000559565b50506001821b62000539565b5060208310610133831016604e8410600b841016171562000512575081810a62000539565b6200051e838362000438565b806000190482111562000535576200053562000559565b0290505b92915050565b60008282101562000554576200055462000559565b500390565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146200058557600080fd5b50565b60805160601c60a05160601c60c05160f81c60e05161010051612aa862000654600039600081816115890152818161178501528181611b34015281816120b6015261210a0152600081816101960152610a980152600081816103e10152818161089101528181610d410152818161148c01526115d00152600081816104e5015281816107380152818161132d0152818161194c0152611f67015260008181610579015281816108d001528181610d7e015281816114e50152818161171101526117570152612aa86000f3fe60806040526004361061017f5760003560e01c8063715018a6116100d6578063bfe109281161007f578063f2fde38b11610059578063f2fde38b14610547578063f7c618c114610567578063ffcd42631461059b57600080fd5b8063bfe10928146104d3578063c6a7112814610507578063d4aa89b51461052757600080fd5b80638da5cb5b116100b05780638da5cb5b1461041357806393f1a40b1461045f5780639e494bee146104b357600080fd5b8063715018a61461039a57806372333631146103af57806373cfc6b2146103cf57600080fd5b80632ea807c51161013857806351eb05a61161011257806351eb05a614610303578063630b5ba11461036557806369883b4e1461037a57600080fd5b80632ea807c5146102b0578063465e81ec146102c3578063505fb46c146102e357600080fd5b80631526fe27116101695780631526fe271461020657806317caf6f1146102785780631d1231311461028e57600080fd5b8062d74850146101845780630832cfbf146101cb575b600080fd5b34801561019057600080fd5b506101b87f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b3480156101d757600080fd5b506101eb6101e6366004612853565b6105bb565b604080519384526020840192909252908201526060016101c2565b34801561021257600080fd5b506102506102213660046127c0565b600260208190526000918252604090912080546001820154928201546003830154600490930154919392909185565b604080519586526020860194909452928401919091526060830152608082015260a0016101c2565b34801561028457600080fd5b506101b860065481565b34801561029a57600080fd5b506102ae6102a9366004612875565b6105fd565b005b6102ae6102be3660046128aa565b6109fa565b3480156102cf57600080fd5b506101b86102de3660046127c0565b610eec565b3480156102ef57600080fd5b506102ae6102fe3660046128aa565b610efe565b34801561030f57600080fd5b5061032361031e3660046127c0565b6110db565b6040516101c29190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b34801561037157600080fd5b506102ae611192565b34801561038657600080fd5b506101b86103953660046127c0565b611212565b3480156103a657600080fd5b506102ae611233565b3480156103bb57600080fd5b506101b86103ca3660046128aa565b6112c0565b3480156103db57600080fd5b506104037f000000000000000000000000000000000000000000000000000000000000000081565b60405190151581526020016101c2565b34801561041f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c2565b34801561046b57600080fd5b5061049e61047a3660046127f2565b60056020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101c2565b3480156104bf57600080fd5b506101b86104ce3660046127c0565b611309565b3480156104df57600080fd5b5061043a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561051357600080fd5b506102ae61052236600461281e565b611315565b34801561053357600080fd5b506103236105423660046127c0565b611816565b34801561055357600080fd5b506102ae610562366004612783565b611c05565b34801561057357600080fd5b5061043a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105a757600080fd5b506101b86105b63660046127f2565b611d35565b600360205281600052604060002081815481106105d757600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b60005473ffffffffffffffffffffffffffffffffffffffff163314610683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600260015414156106f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067a565b600260018190556000848152602091909152604080822090517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018690529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063654c9ece9060240160206040518083038186803b15801561078f57600080fd5b505afa1580156107a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c791906127d9565b905060006107d786836000611e78565b60048401549091506107e98683612934565b1115610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f656d657267656e6379207265776172642077697468647261773a206e6f74206560448201527f6e6f7567682072657761726420746f6b656e0000000000000000000000000000606482015260840161067a565b8483600401600082825461088b91906129c4565b909155507f000000000000000000000000000000000000000000000000000000000000000090506108fc576108f773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168587612153565b6109ee565b60008473ffffffffffffffffffffffffffffffffffffffff168660405160006040518083038185875af1925050503d8060008114610956576040519150601f19603f3d011682016040523d82523d6000602084013e61095b565b606091505b50509050806109ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f656d657267656e6379207265776172642077697468647261773a206661696c6560448201527f6420746f2073656e640000000000000000000000000000000000000000000000606482015260840161067a565b505b50506001805550505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067a565b6000838152600360209081526040808320600290925290912081547f000000000000000000000000000000000000000000000000000000000000000011610b44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f6164642072657761726420696e666f3a2072657761726420696e666f206c656e60448201527f677468206578636565647320746865206c696d69740000000000000000000000606482015260840161067a565b81541580610b845750815442908390610b5f906001906129c4565b81548110610b6f57610b6f612a43565b90600052602060002090600302016001015410155b610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6164642072657761726420696e666f3a2072657761726420706572696f64206560448201527f6e64656400000000000000000000000000000000000000000000000000000000606482015260840161067a565b81541580610c4e5750815484908390610c2a906001906129c4565b81548110610c3a57610c3a612a43565b906000526020600020906003020160010154105b610cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f6164642072657761726420696e666f3a20626164206e657720656e6454696d6560448201527f7374616d70000000000000000000000000000000000000000000000000000000606482015260840161067a565b815460009015610d1b5782548390610cf4906001906129c4565b81548110610d0457610d04612a43565b906000526020600020906003020160010154610d21565b81600101545b90506000610d2f82876129c4565b90506000610d3d8683612987565b90507f0000000000000000000000000000000000000000000000000000000000000000610dab57610da673ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846122c3565b610e3a565b803414610e3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f6164642072657761726420696e666f3a206e6f7420656e6f7567682066756e6460448201527f7320746f207472616e7366657200000000000000000000000000000000000000606482015260840161067a565b80846004016000828254610e4e9190612934565b90915550506040805160608101825284815260208082018a8152928201898152885460018181018b5560008b8152939093209351600390910290930192835592518282015591516002909101558554610ea791906129c4565b60408051898152602081018990528a917fad90731bd0d97445f5af66088f3adebf343c520c20e033cc42f93b124258cdc2910160405180910390a35050505050505050565b6000610ef8824261243c565b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067a565b6000838152600260208190526040909120015415610ff9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706f6f6c20616c72656164792065786973747300000000000000000000000000604482015260640161067a565b816006600082825461100b9190612934565b90915550506040805160a0810182526000808252602080830185815283850186815260608501888152608086018581528a86526002948590528786209651875592516001808801919091559151938601939093559151600385015551600493840155825490810183559190527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018490555183907fa6b36ea399c1eae2ba98a011138f78722b48f46ad93349269348ccc6e8f1cced906110ce9085815260200190565b60405180910390a2505050565b61110d6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6002600154141561117a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067a565b600260015561118882611816565b6001805592915050565b600260015414156111ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067a565b600260015561120c612570565b60018055565b6004818154811061122257600080fd5b600091825260209091200154905081565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067a565b6112be60006125b9565b565b600081841015806112d057508284115b156112dd57506000611302565b8183116112f5576112ee84846129c4565b9050611302565b6112ff84836129c4565b90505b9392505050565b6000610ef8824261262e565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146113da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f6f6e6c794469737472696275746f723a206f6e6c7920466c617265446973747260448201527f696275746f722063616e2063616c6c20746869732066756e6374696f6e000000606482015260840161067a565b60026001541415611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067a565b6002600155600061145784611816565b600085815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff881684529091528120919250807f0000000000000000000000000000000000000000000000000000000000000000156114b7575047611577565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561153c57600080fd5b505afa158015611550573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157491906127d9565b90505b82541561177e576001830154845184547f0000000000000000000000000000000000000000000000000000000000000000916115b291612987565b6115bc919061294c565b6115c691906129c4565b9150811561177e577f0000000000000000000000000000000000000000000000000000000000000000156116ef57808211156116cd5760008673ffffffffffffffffffffffffffffffffffffffff16826040515b60006040518083038185875af1925050503d8060008114611657576040519150601f19603f3d011682016040523d82523d6000602084013e61165c565b606091505b50509050806116c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c65640000000000000000000000000000000000604482015260640161067a565b5061177e565b60008673ffffffffffffffffffffffffffffffffffffffff168360405161161a565b8082111561173d5761173873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783612153565b61177e565b61177e73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168784612153565b84835583517f0000000000000000000000000000000000000000000000000000000000000000906117af9087612987565b6117b9919061294c565b600184015560405182815273ffffffffffffffffffffffffffffffffffffffff8716907fd1072bb52c3131d0c96197b73fb8a45637e30f8b6664fc142310cc9b242859b49060200160405180910390a25050600180555050505050565b6118486040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b506000818152600260208181526040808420815160a08101835281548152600182015481850152938101548483015260038082015460608601526004909101546080850152858552825280842080548251818502810185019093528083529394939192909190849084015b8282101561190357838290600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050815260200190600101906118b3565b5050505090508160400151421161191a5750919050565b6040517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063654c9ece9060240160206040518083038186803b1580156119a357600080fd5b505afa1580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db91906127d9565b905080611a46576119ec844261262e565b421115611a3f5742604084810182905284518151928352602083018490529082015284907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f46906060015b60405180910390a25b5050919050565b60005b8251811015611b88576000611a80856040015142868581518110611a6f57611a6f612a43565b6020026020010151602001516112c0565b905080611a8d5750611b78565b838281518110611a9f57611a9f612a43565b602002602001015160200151421115611ade57838281518110611ac457611ac4612a43565b602002602001015160200151856040018181525050611ae5565b4260408601525b60006006548660600151868581518110611b0157611b01612a43565b60200260200101516040015184611b189190612987565b611b229190612987565b611b2c919061294c565b905083611b597f000000000000000000000000000000000000000000000000000000000000000083612987565b611b63919061294c565b86518790611b72908390612934565b90525050505b611b81816129db565b9050611a49565b506000848152600260208181526040928390208651808255878301516001830155878501519382018490556060808901516003840155608089015160049093019290925584519384529183018590529282015285917f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469101611a36565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067a565b73ffffffffffffffffffffffffffffffffffffffff8116611d29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161067a565b611d32816125b9565b50565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281208054600190910154611302918591611e78565b3b151590565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691611dfe91906128f9565b600060405180830381855afa9150503d8060008114611e39576040519150601f19603f3d011682016040523d82523d6000602084013e611e3e565b606091505b5091509150818015611e51575080516020145b611e5c576012611e70565b80806020019051810190611e7091906128d6565b949350505050565b6000838152600260208181526040808420815160a08101835281548152600182015481850152938101548483015260038082015460608601526004909101546080850152878552825280842080548251818502810185019093528083528593849084015b82821015611f2c5783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611edc565b505084516040517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018b905293945092600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16915063654c9ece9060240160206040518083038186803b158015611fbf57600080fd5b505afa158015611fd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff791906127d9565b905083604001514211801561200b57508015155b1561210757604084015160005b845181101561210457600061203a8342888581518110611a6f57611a6f612a43565b90508061204757506120f4565b85828151811061205957612059612a43565b60200260200101516020015192506000600654886060015188858151811061208357612083612a43565b6020026020010151604001518461209a9190612987565b6120a49190612987565b6120ae919061294c565b9050846120db7f000000000000000000000000000000000000000000000000000000000000000083612987565b6120e5919061294c565b6120ef9087612934565b955050505b6120fd816129db565b9050612018565b50505b857f0000000000000000000000000000000000000000000000000000000000000000612133848a612987565b61213d919061294c565b61214791906129c4565b98975050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916121ea91906128f9565b6000604051808303816000865af19150503d8060008114612227576040519150601f19603f3d011682016040523d82523d6000602084013e61222c565b606091505b5091509150818015612256575080511580612256575080806020019051810190612256919061279e565b6122bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604482015260640161067a565b5050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161236291906128f9565b6000604051808303816000865af19150503d806000811461239f576040519150601f19603f3d011682016040523d82523d6000602084013e6123a4565b606091505b50915091508180156123ce5750805115806123ce5750808060200190518101906123ce919061279e565b612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604482015260640161067a565b505050505050565b600082815260036020908152604080832080548251818502810185019093528083528493849084015b828210156124b55783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612465565b50505060008681526002602052604090208251929350919050806124df5760009350505050610ef8565b60005b81811015612563578381815181106124fc576124fc612a43565b602002602001015160200151861161255357600654836003015485838151811061252857612528612a43565b60200260200101516040015161253e9190612987565b612548919061294c565b945050505050610ef8565b61255c816129db565b90506124e2565b5060009695505050505050565b60045460005b818110156125b5576125a46004828154811061259457612594612a43565b9060005260206000200154611816565b506125ae816129db565b9050612576565b5050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082815260036020908152604080832080548251818502810185019093528083528493849084015b828210156126a75783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612657565b505082519293505050806126c057600092505050610ef8565b60005b81811015612727578281815181106126dd576126dd612a43565b60200260200101516020015185116127175782818151811061270157612701612a43565b6020026020010151602001519350505050610ef8565b612720816129db565b90506126c3565b50816127346001836129c4565b8151811061274457612744612a43565b6020026020010151602001519250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461277e57600080fd5b919050565b60006020828403121561279557600080fd5b6113028261275a565b6000602082840312156127b057600080fd5b8151801515811461130257600080fd5b6000602082840312156127d257600080fd5b5035919050565b6000602082840312156127eb57600080fd5b5051919050565b6000806040838503121561280557600080fd5b823591506128156020840161275a565b90509250929050565b60008060006060848603121561283357600080fd5b833592506128436020850161275a565b9150604084013590509250925092565b6000806040838503121561286657600080fd5b50508035926020909101359150565b60008060006060848603121561288a57600080fd5b83359250602084013591506128a16040850161275a565b90509250925092565b6000806000606084860312156128bf57600080fd5b505081359360208301359350604090920135919050565b6000602082840312156128e857600080fd5b815160ff8116811461130257600080fd5b6000825160005b8181101561291a5760208186018101518583015201612900565b81811115612929576000828501525b509190910192915050565b6000821982111561294757612947612a14565b500190565b600082612982577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156129bf576129bf612a14565b500290565b6000828210156129d6576129d6612a14565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a0d57612a0d612a14565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220d7b0aa37085035bd0c67e6214612979d4fb57acad6382034b7fa214e253cfbad64736f6c634300080700330000000000000000000000004bde98731149093a12579d71338fd3741fe6e5ce000000000000000000000000995da7dfb96b4dd1e2bd954be384a1e66cbb4b8c0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061017f5760003560e01c8063715018a6116100d6578063bfe109281161007f578063f2fde38b11610059578063f2fde38b14610547578063f7c618c114610567578063ffcd42631461059b57600080fd5b8063bfe10928146104d3578063c6a7112814610507578063d4aa89b51461052757600080fd5b80638da5cb5b116100b05780638da5cb5b1461041357806393f1a40b1461045f5780639e494bee146104b357600080fd5b8063715018a61461039a57806372333631146103af57806373cfc6b2146103cf57600080fd5b80632ea807c51161013857806351eb05a61161011257806351eb05a614610303578063630b5ba11461036557806369883b4e1461037a57600080fd5b80632ea807c5146102b0578063465e81ec146102c3578063505fb46c146102e357600080fd5b80631526fe27116101695780631526fe271461020657806317caf6f1146102785780631d1231311461028e57600080fd5b8062d74850146101845780630832cfbf146101cb575b600080fd5b34801561019057600080fd5b506101b87f000000000000000000000000000000000000000000000000000000000000003481565b6040519081526020015b60405180910390f35b3480156101d757600080fd5b506101eb6101e6366004612853565b6105bb565b604080519384526020840192909252908201526060016101c2565b34801561021257600080fd5b506102506102213660046127c0565b600260208190526000918252604090912080546001820154928201546003830154600490930154919392909185565b604080519586526020860194909452928401919091526060830152608082015260a0016101c2565b34801561028457600080fd5b506101b860065481565b34801561029a57600080fd5b506102ae6102a9366004612875565b6105fd565b005b6102ae6102be3660046128aa565b6109fa565b3480156102cf57600080fd5b506101b86102de3660046127c0565b610eec565b3480156102ef57600080fd5b506102ae6102fe3660046128aa565b610efe565b34801561030f57600080fd5b5061032361031e3660046127c0565b6110db565b6040516101c29190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b34801561037157600080fd5b506102ae611192565b34801561038657600080fd5b506101b86103953660046127c0565b611212565b3480156103a657600080fd5b506102ae611233565b3480156103bb57600080fd5b506101b86103ca3660046128aa565b6112c0565b3480156103db57600080fd5b506104037f000000000000000000000000000000000000000000000000000000000000000081565b60405190151581526020016101c2565b34801561041f57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c2565b34801561046b57600080fd5b5061049e61047a3660046127f2565b60056020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101c2565b3480156104bf57600080fd5b506101b86104ce3660046127c0565b611309565b3480156104df57600080fd5b5061043a7f000000000000000000000000995da7dfb96b4dd1e2bd954be384a1e66cbb4b8c81565b34801561051357600080fd5b506102ae61052236600461281e565b611315565b34801561053357600080fd5b506103236105423660046127c0565b611816565b34801561055357600080fd5b506102ae610562366004612783565b611c05565b34801561057357600080fd5b5061043a7f0000000000000000000000004bde98731149093a12579d71338fd3741fe6e5ce81565b3480156105a757600080fd5b506101b86105b63660046127f2565b611d35565b600360205281600052604060002081815481106105d757600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b60005473ffffffffffffffffffffffffffffffffffffffff163314610683576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600260015414156106f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067a565b600260018190556000848152602091909152604080822090517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018690529091907f000000000000000000000000995da7dfb96b4dd1e2bd954be384a1e66cbb4b8c73ffffffffffffffffffffffffffffffffffffffff169063654c9ece9060240160206040518083038186803b15801561078f57600080fd5b505afa1580156107a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c791906127d9565b905060006107d786836000611e78565b60048401549091506107e98683612934565b1115610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f656d657267656e6379207265776172642077697468647261773a206e6f74206560448201527f6e6f7567682072657761726420746f6b656e0000000000000000000000000000606482015260840161067a565b8483600401600082825461088b91906129c4565b909155507f000000000000000000000000000000000000000000000000000000000000000090506108fc576108f773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004bde98731149093a12579d71338fd3741fe6e5ce168587612153565b6109ee565b60008473ffffffffffffffffffffffffffffffffffffffff168660405160006040518083038185875af1925050503d8060008114610956576040519150601f19603f3d011682016040523d82523d6000602084013e61095b565b606091505b50509050806109ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f656d657267656e6379207265776172642077697468647261773a206661696c6560448201527f6420746f2073656e640000000000000000000000000000000000000000000000606482015260840161067a565b505b50506001805550505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067a565b6000838152600360209081526040808320600290925290912081547f000000000000000000000000000000000000000000000000000000000000003411610b44576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f6164642072657761726420696e666f3a2072657761726420696e666f206c656e60448201527f677468206578636565647320746865206c696d69740000000000000000000000606482015260840161067a565b81541580610b845750815442908390610b5f906001906129c4565b81548110610b6f57610b6f612a43565b90600052602060002090600302016001015410155b610c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6164642072657761726420696e666f3a2072657761726420706572696f64206560448201527f6e64656400000000000000000000000000000000000000000000000000000000606482015260840161067a565b81541580610c4e5750815484908390610c2a906001906129c4565b81548110610c3a57610c3a612a43565b906000526020600020906003020160010154105b610cda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f6164642072657761726420696e666f3a20626164206e657720656e6454696d6560448201527f7374616d70000000000000000000000000000000000000000000000000000000606482015260840161067a565b815460009015610d1b5782548390610cf4906001906129c4565b81548110610d0457610d04612a43565b906000526020600020906003020160010154610d21565b81600101545b90506000610d2f82876129c4565b90506000610d3d8683612987565b90507f0000000000000000000000000000000000000000000000000000000000000000610dab57610da673ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004bde98731149093a12579d71338fd3741fe6e5ce163330846122c3565b610e3a565b803414610e3a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f6164642072657761726420696e666f3a206e6f7420656e6f7567682066756e6460448201527f7320746f207472616e7366657200000000000000000000000000000000000000606482015260840161067a565b80846004016000828254610e4e9190612934565b90915550506040805160608101825284815260208082018a8152928201898152885460018181018b5560008b8152939093209351600390910290930192835592518282015591516002909101558554610ea791906129c4565b60408051898152602081018990528a917fad90731bd0d97445f5af66088f3adebf343c520c20e033cc42f93b124258cdc2910160405180910390a35050505050505050565b6000610ef8824261243c565b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067a565b6000838152600260208190526040909120015415610ff9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706f6f6c20616c72656164792065786973747300000000000000000000000000604482015260640161067a565b816006600082825461100b9190612934565b90915550506040805160a0810182526000808252602080830185815283850186815260608501888152608086018581528a86526002948590528786209651875592516001808801919091559151938601939093559151600385015551600493840155825490810183559190527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018490555183907fa6b36ea399c1eae2ba98a011138f78722b48f46ad93349269348ccc6e8f1cced906110ce9085815260200190565b60405180910390a2505050565b61110d6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6002600154141561117a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067a565b600260015561118882611816565b6001805592915050565b600260015414156111ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067a565b600260015561120c612570565b60018055565b6004818154811061122257600080fd5b600091825260209091200154905081565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067a565b6112be60006125b9565b565b600081841015806112d057508284115b156112dd57506000611302565b8183116112f5576112ee84846129c4565b9050611302565b6112ff84836129c4565b90505b9392505050565b6000610ef8824261262e565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000995da7dfb96b4dd1e2bd954be384a1e66cbb4b8c16146113da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603d60248201527f6f6e6c794469737472696275746f723a206f6e6c7920466c617265446973747260448201527f696275746f722063616e2063616c6c20746869732066756e6374696f6e000000606482015260840161067a565b60026001541415611447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067a565b6002600155600061145784611816565b600085815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff881684529091528120919250807f0000000000000000000000000000000000000000000000000000000000000000156114b7575047611577565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f0000000000000000000000004bde98731149093a12579d71338fd3741fe6e5ce73ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561153c57600080fd5b505afa158015611550573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157491906127d9565b90505b82541561177e576001830154845184547f000000000000000000000000000000000000000000000000000000e8d4a51000916115b291612987565b6115bc919061294c565b6115c691906129c4565b9150811561177e577f0000000000000000000000000000000000000000000000000000000000000000156116ef57808211156116cd5760008673ffffffffffffffffffffffffffffffffffffffff16826040515b60006040518083038185875af1925050503d8060008114611657576040519150601f19603f3d011682016040523d82523d6000602084013e61165c565b606091505b50509050806116c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c65640000000000000000000000000000000000604482015260640161067a565b5061177e565b60008673ffffffffffffffffffffffffffffffffffffffff168360405161161a565b8082111561173d5761173873ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004bde98731149093a12579d71338fd3741fe6e5ce168783612153565b61177e565b61177e73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004bde98731149093a12579d71338fd3741fe6e5ce168784612153565b84835583517f000000000000000000000000000000000000000000000000000000e8d4a51000906117af9087612987565b6117b9919061294c565b600184015560405182815273ffffffffffffffffffffffffffffffffffffffff8716907fd1072bb52c3131d0c96197b73fb8a45637e30f8b6664fc142310cc9b242859b49060200160405180910390a25050600180555050505050565b6118486040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b506000818152600260208181526040808420815160a08101835281548152600182015481850152938101548483015260038082015460608601526004909101546080850152858552825280842080548251818502810185019093528083529394939192909190849084015b8282101561190357838290600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050815260200190600101906118b3565b5050505090508160400151421161191a5750919050565b6040517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018490526000907f000000000000000000000000995da7dfb96b4dd1e2bd954be384a1e66cbb4b8c73ffffffffffffffffffffffffffffffffffffffff169063654c9ece9060240160206040518083038186803b1580156119a357600080fd5b505afa1580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db91906127d9565b905080611a46576119ec844261262e565b421115611a3f5742604084810182905284518151928352602083018490529082015284907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f46906060015b60405180910390a25b5050919050565b60005b8251811015611b88576000611a80856040015142868581518110611a6f57611a6f612a43565b6020026020010151602001516112c0565b905080611a8d5750611b78565b838281518110611a9f57611a9f612a43565b602002602001015160200151421115611ade57838281518110611ac457611ac4612a43565b602002602001015160200151856040018181525050611ae5565b4260408601525b60006006548660600151868581518110611b0157611b01612a43565b60200260200101516040015184611b189190612987565b611b229190612987565b611b2c919061294c565b905083611b597f000000000000000000000000000000000000000000000000000000e8d4a5100083612987565b611b63919061294c565b86518790611b72908390612934565b90525050505b611b81816129db565b9050611a49565b506000848152600260208181526040928390208651808255878301516001830155878501519382018490556060808901516003840155608089015160049093019290925584519384529183018590529282015285917f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469101611a36565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067a565b73ffffffffffffffffffffffffffffffffffffffff8116611d29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161067a565b611d32816125b9565b50565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281208054600190910154611302918591611e78565b3b151590565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691611dfe91906128f9565b600060405180830381855afa9150503d8060008114611e39576040519150601f19603f3d011682016040523d82523d6000602084013e611e3e565b606091505b5091509150818015611e51575080516020145b611e5c576012611e70565b80806020019051810190611e7091906128d6565b949350505050565b6000838152600260208181526040808420815160a08101835281548152600182015481850152938101548483015260038082015460608601526004909101546080850152878552825280842080548251818502810185019093528083528593849084015b82821015611f2c5783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611edc565b505084516040517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018b905293945092600092507f000000000000000000000000995da7dfb96b4dd1e2bd954be384a1e66cbb4b8c73ffffffffffffffffffffffffffffffffffffffff16915063654c9ece9060240160206040518083038186803b158015611fbf57600080fd5b505afa158015611fd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ff791906127d9565b905083604001514211801561200b57508015155b1561210757604084015160005b845181101561210457600061203a8342888581518110611a6f57611a6f612a43565b90508061204757506120f4565b85828151811061205957612059612a43565b60200260200101516020015192506000600654886060015188858151811061208357612083612a43565b6020026020010151604001518461209a9190612987565b6120a49190612987565b6120ae919061294c565b9050846120db7f000000000000000000000000000000000000000000000000000000e8d4a5100083612987565b6120e5919061294c565b6120ef9087612934565b955050505b6120fd816129db565b9050612018565b50505b857f000000000000000000000000000000000000000000000000000000e8d4a51000612133848a612987565b61213d919061294c565b61214791906129c4565b98975050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916121ea91906128f9565b6000604051808303816000865af19150503d8060008114612227576040519150601f19603f3d011682016040523d82523d6000602084013e61222c565b606091505b5091509150818015612256575080511580612256575080806020019051810190612256919061279e565b6122bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604482015260640161067a565b5050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161236291906128f9565b6000604051808303816000865af19150503d806000811461239f576040519150601f19603f3d011682016040523d82523d6000602084013e6123a4565b606091505b50915091508180156123ce5750805115806123ce5750808060200190518101906123ce919061279e565b612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604482015260640161067a565b505050505050565b600082815260036020908152604080832080548251818502810185019093528083528493849084015b828210156124b55783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612465565b50505060008681526002602052604090208251929350919050806124df5760009350505050610ef8565b60005b81811015612563578381815181106124fc576124fc612a43565b602002602001015160200151861161255357600654836003015485838151811061252857612528612a43565b60200260200101516040015161253e9190612987565b612548919061294c565b945050505050610ef8565b61255c816129db565b90506124e2565b5060009695505050505050565b60045460005b818110156125b5576125a46004828154811061259457612594612a43565b9060005260206000200154611816565b506125ae816129db565b9050612576565b5050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082815260036020908152604080832080548251818502810185019093528083528493849084015b828210156126a75783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612657565b505082519293505050806126c057600092505050610ef8565b60005b81811015612727578281815181106126dd576126dd612a43565b60200260200101516020015185116127175782818151811061270157612701612a43565b6020026020010151602001519350505050610ef8565b612720816129db565b90506126c3565b50816127346001836129c4565b8151811061274457612744612a43565b6020026020010151602001519250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461277e57600080fd5b919050565b60006020828403121561279557600080fd5b6113028261275a565b6000602082840312156127b057600080fd5b8151801515811461130257600080fd5b6000602082840312156127d257600080fd5b5035919050565b6000602082840312156127eb57600080fd5b5051919050565b6000806040838503121561280557600080fd5b823591506128156020840161275a565b90509250929050565b60008060006060848603121561283357600080fd5b833592506128436020850161275a565b9150604084013590509250925092565b6000806040838503121561286657600080fd5b50508035926020909101359150565b60008060006060848603121561288a57600080fd5b83359250602084013591506128a16040850161275a565b90509250925092565b6000806000606084860312156128bf57600080fd5b505081359360208301359350604090920135919050565b6000602082840312156128e857600080fd5b815160ff8116811461130257600080fd5b6000825160005b8181101561291a5760208186018101518583015201612900565b81811115612929576000828501525b509190910192915050565b6000821982111561294757612947612a14565b500190565b600082612982577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156129bf576129bf612a14565b500290565b6000828210156129d6576129d6612a14565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a0d57612a0d612a14565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220d7b0aa37085035bd0c67e6214612979d4fb57acad6382034b7fa214e253cfbad64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004bde98731149093a12579d71338fd3741fe6e5ce000000000000000000000000995da7dfb96b4dd1e2bd954be384a1e66cbb4b8c0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _rewardToken (address): 0x4bDE98731149093a12579D71338fd3741fe6E5Ce
Arg [1] : _distributor (address): 0x995da7dfB96B4dd1e2bd954bE384A1e66cBB4b8c
Arg [2] : _isNative (bool): False
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000004bde98731149093a12579d71338fd3741fe6e5ce
Arg [1] : 000000000000000000000000995da7dfb96b4dd1e2bd954be384a1e66cbb4b8c
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
20004:17168:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22141:45;;;;;;;;;;;;;;;;;;11185:25:1;;;11173:2;11158:18;22141:45:0;;;;;;;;21695:54;;;;;;;;;;-1:-1:-1;21695:54:0;;;;;:::i;:::-;;:::i;:::-;;;;11676:25:1;;;11732:2;11717:18;;11710:34;;;;11760:18;;;11753:34;11664:2;11649:18;21695:54:0;11474:319:1;21482:44:0;;;;;;;;;;-1:-1:-1;21482:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12057:25:1;;;12113:2;12098:18;;12091:34;;;;12141:18;;;12134:34;;;;12199:2;12184:18;;12177:34;12242:3;12227:19;;12220:35;12044:3;12029:19;21482:44:0;11798:463:1;22016:34:0;;;;;;;;;;;;;;;;36347:822;;;;;;;;;;-1:-1:-1;36347:822:0;;;;;:::i;:::-;;:::i;:::-;;24864:1894;;;;;;:::i;:::-;;:::i;36102:187::-;;;;;;;;;;-1:-1:-1;36102:187:0;;;;;:::i;:::-;;:::i;24147:578::-;;;;;;;;;;-1:-1:-1;24147:578:0;;;;;:::i;:::-;;:::i;28294:162::-;;;;;;;;;;-1:-1:-1;28294:162:0;;;;;:::i;:::-;;:::i;:::-;;;;;;10689:4:1;10731:3;10720:9;10716:19;10708:27;;10768:6;10762:13;10751:9;10744:32;10832:4;10824:6;10820:17;10814:24;10807:4;10796:9;10792:20;10785:54;10895:4;10887:6;10883:17;10877:24;10870:4;10859:9;10855:20;10848:54;10958:4;10950:6;10946:17;10940:24;10933:4;10922:9;10918:20;10911:54;11021:4;11013:6;11009:17;11003:24;10996:4;10985:9;10981:20;10974:54;10547:487;;;;;31347:84:0;;;;;;;;;;;;;:::i;21758:24::-;;;;;;;;;;-1:-1:-1;21758:24:0;;;;;:::i;:::-;;:::i;10456:103::-;;;;;;;;;;;;;:::i;27749:360::-;;;;;;;;;;-1:-1:-1;27749:360:0;;;;;:::i;:::-;;:::i;20221:30::-;;;;;;;;;;;;;;;;;;4569:14:1;;4562:22;4544:41;;4532:2;4517:18;20221:30:0;4404:187:1;9805:87:0;;;;;;;;;;-1:-1:-1;9851:7:0;9878:6;;;9805:87;;;3644:42:1;3632:55;;;3614:74;;3602:2;3587:18;9805:87:0;3468:226:1;21849:64:0;;;;;;;;;;-1:-1:-1;21849:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11395:25:1;;;11451:2;11436:18;;11429:34;;;;11368:18;21849:64:0;11221:248:1;27521:139:0;;;;;;;;;;-1:-1:-1;27521:139:0;;;;;:::i;:::-;;:::i;20168:46::-;;;;;;;;;;;;;;;31950:1627;;;;;;;;;;-1:-1:-1;31950:1627:0;;;;;:::i;:::-;;:::i;28640:2624::-;;;;;;;;;;-1:-1:-1;28640:2624:0;;;;;:::i;:::-;;:::i;10714:201::-;;;;;;;;;;-1:-1:-1;10714:201:0;;;;;:::i;:::-;;:::i;20111:50::-;;;;;;;;;;;;;;;33651:323;;;;;;;;;;-1:-1:-1;33651:323:0;;;;;:::i;:::-;;:::i;21695:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21695:54:0;;-1:-1:-1;21695:54:0;:::o;36347:822::-;9851:7;9878:6;10025:23;9878:6;8748:10;10025:23;10017:68;;;;;;;7672:2:1;10017:68:0;;;7654:21:1;;;7691:18;;;7684:30;7750:34;7730:18;;;7723:62;7802:18;;10017:68:0;;;;;;;;;12928:1:::1;13526:7;;:19;;13518:63;;;::::0;::::1;::::0;;9975:2:1;13518:63:0::1;::::0;::::1;9957:21:1::0;10014:2;9994:18;;;9987:30;10053:33;10033:18;;;10026:61;10104:18;;13518:63:0::1;9773:355:1::0;13518:63:0::1;12928:1;13659:7;:18:::0;;;36510:21:::2;36534:14:::0;;;::::2;::::0;;;;;;;;36578:29;;;;;::::2;::::0;::::2;11185:25:1::0;;;36534:14:0;;36510:21;36578:11:::2;:23;;::::0;::::2;::::0;11158:18:1;;36578:29:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36559:48;;36620:35;36658:33;36673:4;36679:8;36689:1;36658:14;:33::i;:::-;36767:17;::::0;::::2;::::0;36620:71;;-1:-1:-1;36726:37:0::2;36756:7:::0;36620:71;36726:37:::2;:::i;:::-;:58;;36704:158;;;::::0;::::2;::::0;;6823:2:1;36704:158:0::2;::::0;::::2;6805:21:1::0;6862:2;6842:18;;;6835:30;6901:34;6881:18;;;6874:62;6972:20;6952:18;;;6945:48;7010:19;;36704:158:0::2;6621:414:1::0;36704:158:0::2;36894:7;36873:4;:17;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;36919:8:0::2;::::0;-1:-1:-1;36914:248:0::2;;36944:47;:24;:11;:24;36969:12:::0;36983:7;36944:24:::2;:47::i;:::-;36914:248;;;37025:9;37040:12;:17;;37065:7;37040:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37024:53;;;37100:4;37092:58;;;::::0;::::2;::::0;;6413:2:1;37092:58:0::2;::::0;::::2;6395:21:1::0;6452:2;6432:18;;;6425:30;6491:34;6471:18;;;6464:62;6562:11;6542:18;;;6535:39;6591:19;;37092:58:0::2;6211:405:1::0;37092:58:0::2;37009:153;36914:248;-1:-1:-1::0;;12884:1:0::1;13838:22:::0;;-1:-1:-1;;;;36347:822:0:o;24864:1894::-;9851:7;9878:6;10025:23;9878:6;8748:10;10025:23;10017:68;;;;;;;7672:2:1;10017:68:0;;;7654:21:1;;;7691:18;;;7684:30;7750:34;7730:18;;;7723:62;7802:18;;10017:68:0;7470:356:1;10017:68:0;25019:31:::1;25053:20:::0;;;:14:::1;:20;::::0;;;;;;;25108:8:::1;:14:::0;;;;;;25155:17;;25175:15:::1;-1:-1:-1::0;25133:138:0::1;;;::::0;::::1;::::0;;9192:2:1;25133:138:0::1;::::0;::::1;9174:21:1::0;9231:2;9211:18;;;9204:30;9270:34;9250:18;;;9243:62;9341:23;9321:18;;;9314:51;9382:19;;25133:138:0::1;8990:417:1::0;25133:138:0::1;25304:17:::0;;:22;;:125:::1;;-1:-1:-1::0;25358:17:0;;25414:15:::1;::::0;25347:10;;25358:21:::1;::::0;25378:1:::1;::::0;25358:21:::1;:::i;:::-;25347:33;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;:82;;25304:125;25282:211;;;::::0;::::1;::::0;;8033:2:1;25282:211:0::1;::::0;::::1;8015:21:1::0;8072:2;8052:18;;;8045:30;8111:34;8091:18;;;8084:62;8182:6;8162:18;;;8155:34;8206:19;;25282:211:0::1;7831:400:1::0;25282:211:0::1;25526:17:::0;;:22;;:105:::1;;-1:-1:-1::0;25580:17:0;;25618:13;;25569:10;;25580:21:::1;::::0;25600:1:::1;::::0;25580:21:::1;:::i;:::-;25569:33;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;:62;25526:105;25504:192;;;::::0;::::1;::::0;;8786:2:1;25504:192:0::1;::::0;::::1;8768:21:1::0;8825:2;8805:18;;;8798:30;8864:34;8844:18;;;8837:62;8935:7;8915:18;;;8908:35;8960:19;;25504:192:0::1;8584:401:1::0;25504:192:0::1;25734:17:::0;;25709:22:::1;::::0;25734;:119:::1;;25818:17:::0;;25807:10;;25818:21:::1;::::0;25838:1:::1;::::0;25818:21:::1;:::i;:::-;25807:33;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;25734:119;;;25772:4;:19;;;25734:119;25709:144:::0;-1:-1:-1;25866:17:0::1;25886:30;25709:144:::0;25886:13;:30:::1;:::i;:::-;25866:50:::0;-1:-1:-1;25927:20:0::1;25950:25;25962:13:::0;25866:50;25950:25:::1;:::i;:::-;25927:48;;25993:8;25988:342;;26018:135;:28;:11;:28;26065:10;26102:4;26126:12:::0;26018:28:::1;:135::i;:::-;25988:342;;;26225:12;26212:9;:25;26186:132;;;::::0;::::1;::::0;;10335:2:1;26186:132:0::1;::::0;::::1;10317:21:1::0;10374:2;10354:18;;;10347:30;10413:34;10393:18;;;10386:62;10484:15;10464:18;;;10457:43;10517:19;;26186:132:0::1;10133:409:1::0;26186:132:0::1;26363:12;26342:4;:17;;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;26418:168:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;26388:209;;::::1;::::0;;::::1;::::0;;-1:-1:-1;26388:209:0;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;26662:17;;:21:::1;::::0;26388:209;26662:21:::1;:::i;:::-;26615:135;::::0;;11395:25:1;;;11451:2;11436:18;;11429:34;;;26643:4:0;;26615:135:::1;::::0;11368:18:1;26615:135:0::1;;;;;;;25008:1750;;;;;24864:1894:::0;;;:::o;36102:187::-;36211:7;36243:38;36259:4;36265:15;36243;:38::i;:::-;36236:45;36102:187;-1:-1:-1;;36102:187:0:o;24147:578::-;9851:7;9878:6;10025:23;9878:6;8748:10;10025:23;10017:68;;;;;;;7672:2:1;10017:68:0;;;7654:21:1;;;7691:18;;;7684:30;7750:34;7730:18;;;7723:62;7802:18;;10017:68:0;7470:356:1;10017:68:0;24290:14:::1;::::0;;;:8:::1;:14;::::0;;;;;;;:34:::1;::::0;:39;24282:71:::1;;;::::0;::::1;::::0;;8438:2:1;24282:71:0::1;::::0;::::1;8420:21:1::0;8477:2;8457:18;;;8450:30;8516:21;8496:18;;;8489:49;8555:18;;24282:71:0::1;8236:343:1::0;24282:71:0::1;24383:11;24364:15;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;24424:220:0::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;24424:220:0;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;24407:14;;;:8:::1;:14:::0;;;;;;;:237;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;24657:18;;;;::::1;::::0;;;;;;::::1;::::0;;;24691:26;24416:4;;24691:26:::1;::::0;::::1;::::0;24460:11;11185:25:1;;11173:2;11158:18;;11039:177;24691:26:0::1;;;;;;;;24147:578:::0;;;:::o;28294:162::-;28386:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28386:20:0;12928:1;13526:7;;:19;;13518:63;;;;;;;9975:2:1;13518:63:0;;;9957:21:1;10014:2;9994:18;;;9987:30;10053:33;10033:18;;;10026:61;10104:18;;13518:63:0;9773:355:1;13518:63:0;12928:1;13659:7;:18;28431:17:::1;28443:4:::0;28431:11:::1;:17::i;:::-;12884:1:::0;13838:22;;28424:24;28294:162;-1:-1:-1;;28294:162:0:o;31347:84::-;12928:1;13526:7;;:19;;13518:63;;;;;;;9975:2:1;13518:63:0;;;9957:21:1;10014:2;9994:18;;;9987:30;10053:33;10033:18;;;10026:61;10104:18;;13518:63:0;9773:355:1;13518:63:0;12928:1;13659:7;:18;31405::::1;:16;:18::i;:::-;12884:1:::0;13838:22;;31347:84::o;21758:24::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21758:24:0;:::o;10456:103::-;9851:7;9878:6;10025:23;9878:6;8748:10;10025:23;10017:68;;;;;;;7672:2:1;10017:68:0;;;7654:21:1;;;7691:18;;;7684:30;7750:34;7730:18;;;7723:62;7802:18;;10017:68:0;7470:356:1;10017:68:0;10521:30:::1;10548:1;10521:18;:30::i;:::-;10456:103::o:0;27749:360::-;27880:7;27914:13;27905:5;:22;;27904:41;;;;27941:3;27933:5;:11;27904:41;27900:82;;;-1:-1:-1;27969:1:0;27962:8;;27900:82;28003:13;27996:3;:20;27992:71;;28040:11;28046:5;28040:3;:11;:::i;:::-;28033:18;;;;27992:71;28080:21;28096:5;28080:13;:21;:::i;:::-;28073:28;;27749:360;;;;;;:::o;27521:139::-;27587:7;27614:38;27630:4;27636:15;27614;:38::i;31950:1627::-;22909:10;:34;22931:11;22909:34;;22887:145;;;;;;;7242:2:1;22887:145:0;;;7224:21:1;7281:2;7261:18;;;7254:30;7320:34;7300:18;;;7293:62;7391:31;7371:18;;;7364:59;7440:19;;22887:145:0;7040:425:1;22887:145:0;12928:1:::1;13526:7;;:19;;13518:63;;;::::0;::::1;::::0;;9975:2:1;13518:63:0::1;::::0;::::1;9957:21:1::0;10014:2;9994:18;;;9987:30;10053:33;10033:18;;;10026:61;10104:18;;13518:63:0::1;9773:355:1::0;13518:63:0::1;12928:1;13659:7;:18:::0;32111:20:::2;32134:17;32146:4:::0;32134:11:::2;:17::i;:::-;32162:21;32186:14:::0;;;:8:::2;:14;::::0;;;;;;;:21:::2;::::0;::::2;::::0;;;;;;;32111:40;;-1:-1:-1;32162:21:0;32292:8:::2;32288:163;;;-1:-1:-1::0;32333:21:0::2;32288:163;;;32403:36;::::0;;;;32433:4:::2;32403:36;::::0;::::2;3614:74:1::0;32403:11:0::2;:21;;::::0;::::2;::::0;3587:18:1;;32403:36:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32387:52;;32288:163;32467:11:::0;;:15;32463:915:::2;;32591:15;::::0;::::2;::::0;32526:21;;32512:11;;32568:19:::2;::::0;32512:35:::2;::::0;::::2;:::i;:::-;32511:76;;;;:::i;:::-;32510:96;;;;:::i;:::-;32499:108:::0;-1:-1:-1;32628:11:0;;32624:743:::2;;32664:8;32660:692;;;32711:13;32701:7;:23;32697:365;;;32754:12;32772:5;:10;;32790:13;32772:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32753:55;;;32843:7;32835:35;;;::::0;::::2;::::0;;6069:2:1;32835:35:0::2;::::0;::::2;6051:21:1::0;6108:2;6088:18;;;6081:30;6147:17;6127:18;;;6120:45;6182:18;;32835:35:0::2;5867:339:1::0;32835:35:0::2;32726:168;32660:692;;32697:365;32928:12;32946:5;:10;;32964:7;32946:30;;;3258:205:1::0;32660:692:0::2;33124:13;33114:7;:23;33110:223;;;33166:46;:24;:11;:24;33191:5:::0;33198:13;33166:24:::2;:46::i;:::-;33110:223;;;33269:40;:24;:11;:24;33294:5:::0;33301:7;33269:24:::2;:40::i;:::-;33390:21:::0;;;33470;;33508:19:::2;::::0;33456:35:::2;::::0;33404:7;33456:35:::2;:::i;:::-;33455:72;;;;:::i;:::-;33424:15;::::0;::::2;:103:::0;33545:24:::2;::::0;11185:25:1;;;33545:24:0::2;::::0;::::2;::::0;::::2;::::0;11173:2:1;11158:18;33545:24:0::2;;;;;;;-1:-1:-1::0;;12884:1:0::1;13838:22:::0;;-1:-1:-1;;;;;31950:1627:0:o;28640:2624::-;28690:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28690:20:0;-1:-1:-1;28730:13:0;;;;:8;:13;;;;;;;;28723:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28787:19;;;;;;;;28754:52;;;;;;;;;;;;;;;;;28723:20;;28730:13;28754:52;;28787:19;;28754:52;28730:13;;28754:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28842:4;:24;;;28823:15;:43;28819:87;;28883:11;28640:2624;;;:::o;28819:87::-;28937:28;;;;;;;;11185:25:1;;;28918:16:0;;28937:11;:23;;;;;11158:18:1;;28937:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28918:47;-1:-1:-1;28982:13:0;28978:751;;29373:37;29389:3;29394:15;29373;:37::i;:::-;29355:15;:55;29351:339;;;29458:15;29431:24;;;;:42;;;29634:21;;29497:177;;11676:25:1;;;11732:2;11717:18;;11710:34;;;11760:18;;;11753:34;29530:3:0;;29497:177;;11664:2:1;11649:18;29497:177:0;;;;;;;;29351:339;29706:11;;28640:2624;;;:::o;28978:751::-;29785:9;29780:1265;29804:10;:17;29800:1;:21;29780:1265;;;30097:19;30119:152;30153:4;:24;;;30196:15;30230:10;30241:1;30230:13;;;;;;;;:::i;:::-;;;;;;;:26;;;30119:15;:152::i;:::-;30097:174;-1:-1:-1;30290:16:0;30286:30;;30308:8;;;30286:30;30577:10;30588:1;30577:13;;;;;;;;:::i;:::-;;;;;;;:26;;;30559:15;:44;30555:221;;;30651:10;30662:1;30651:13;;;;;;;;:::i;:::-;;;;;;;:26;;;30624:4;:24;;:53;;;;;30555:221;;;30745:15;30718:24;;;:42;30555:221;30792:19;30911:15;;30892:4;:15;;;30846:10;30857:1;30846:13;;;;;;;;:::i;:::-;;;;;;;:26;;;30815:11;:57;;;;:::i;:::-;:92;;;;:::i;:::-;30814:112;;;;:::i;:::-;30792:134;-1:-1:-1;31024:8:0;30970:33;30984:19;30792:134;30970:33;:::i;:::-;30969:63;;;;:::i;:::-;30943:90;;:4;;:90;;;;;:::i;:::-;;;-1:-1:-1;;;29780:1265:0;29823:3;;;:::i;:::-;;;29780:1265;;;-1:-1:-1;31057:13:0;;;;:8;:13;;;;;;;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31095:137;;11676:25:1;;;11717:18;;;11710:34;;;11760:18;;;11753:34;31057:13:0;;31095:137;;11649:18:1;31095:137:0;11474:319:1;10714:201:0;9851:7;9878:6;10025:23;9878:6;8748:10;10025:23;10017:68;;;;;;;7672:2:1;10017:68:0;;;7654:21:1;;;7691:18;;;7684:30;7750:34;7730:18;;;7723:62;7802:18;;10017:68:0;7470:356:1;10017:68:0;10803:22:::1;::::0;::::1;10795:73;;;::::0;::::1;::::0;;5662:2:1;10795:73:0::1;::::0;::::1;5644:21:1::0;5701:2;5681:18;;;5674:30;5740:34;5720:18;;;5713:62;5811:8;5791:18;;;5784:36;5837:19;;10795:73:0::1;5460:402:1::0;10795:73:0::1;10879:28;10898:8;10879:18;:28::i;:::-;10714:201:::0;:::o;33651:323::-;33771:7;33872:14;;;:8;:14;;;;;;;;:21;;;;;;;;;;:28;;33919:32;;;;;33816:150;;33872:14;;33816;:150::i;797:387::-;1120:20;1168:8;;;797:387::o;17764:293::-;17923:36;;;;;;;;;;;;;;;;;;17946:12;17923:36;;;17883:87;;17829:5;;;;;;17883:25;;;;:87;;17923:36;17883:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17847:123;;;;17988:7;:28;;;;;17999:4;:11;18014:2;17999:17;17988:28;:61;;18047:2;17988:61;;;18030:4;18019:25;;;;;;;;;;;;:::i;:::-;17981:68;17764:293;-1:-1:-1;;;;17764:293:0:o;33982:1305::-;34115:15;34166:14;;;:8;:14;;;;;;;;34143:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34224:20;;;;;;;;34191:53;;;;;;;;;;;;;;;;;34115:15;;;;34191:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34284:21:0;;34335:29;;;;;;;;11185:25:1;;;34191:53:0;;-1:-1:-1;34284:21:0;34257:24;;-1:-1:-1;34335:11:0;:23;;;-1:-1:-1;34335:23:0;;11158:18:1;;34335:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34316:48;;34399:4;:24;;;34381:15;:42;:59;;;;-1:-1:-1;34427:13:0;;;34381:59;34377:799;;;34474:24;;;;34457:14;34515:650;34539:10;:17;34535:1;:21;34515:650;;;34582:19;34604:150;34642:6;34671:15;34709:10;34720:1;34709:13;;;;;;;;:::i;34604:150::-;34582:172;-1:-1:-1;34777:16:0;34773:30;;34795:8;;;34773:30;34831:10;34842:1;34831:13;;;;;;;;:::i;:::-;;;;;;;:26;;;34822:35;;34878:19;35005:15;;34986:4;:15;;;34936:10;34947:1;34936:13;;;;;;;;:::i;:::-;;;;;;;:26;;;34901:11;:61;;;;:::i;:::-;:100;;;;:::i;:::-;34900:120;;;;:::i;:::-;34878:142;-1:-1:-1;35141:8:0;35083:33;35097:19;34878:142;35083:33;:::i;:::-;35082:67;;;;:::i;:::-;35041:108;;;;:::i;:::-;;;34563:602;;34515:650;34558:3;;;:::i;:::-;;;34515:650;;;;34442:734;34377:799;35267:11;35231:19;35201:26;35211:16;35201:7;:26;:::i;:::-;35200:50;;;;:::i;:::-;35199:79;;;;:::i;:::-;35188:91;33982:1305;-1:-1:-1;;;;;;;;33982:1305:0:o;18333:407::-;18527:48;;;18493:19;4294:55:1;;;18527:48:0;;;4276:74:1;4366:18;;;;4359:34;;;18527:48:0;;;;;;;;;;4249:18:1;;;;18527:48:0;;;;;;;;;18550:12;18527:48;;;18493:93;;-1:-1:-1;;;;18493:19:0;;;;:93;;18527:48;18493:93;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18457:129;;;;18619:7;:57;;;;-1:-1:-1;18631:11:0;;:16;;:44;;;18662:4;18651:24;;;;;;;;;;;;:::i;:::-;18597:135;;;;;;;5305:2:1;18597:135:0;;;5287:21:1;5344:2;5324:18;;;5317:30;5383;5363:18;;;5356:58;5431:18;;18597:135:0;5103:352:1;18597:135:0;18446:294;;18333:407;;;:::o;19063:449::-;19284:59;;;19250:19;3980:15:1;;;19284:59:0;;;3962:34:1;4032:15;;;4012:18;;;4005:43;4064:18;;;;4057:34;;;19284:59:0;;;;;;;;;;3874:18:1;;;;19284:59:0;;;;;;;;;19307:17;19284:59;;;19250:104;;-1:-1:-1;;;;19250:19:0;;;;:104;;19284:59;19250:104;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19214:140;;;;19387:7;:57;;;;-1:-1:-1;19399:11:0;;:16;;:44;;;19430:4;19419:24;;;;;;;;;;;;:::i;:::-;19365:139;;;;;;;9614:2:1;19365:139:0;;;9596:21:1;;;9633:18;;;9626:30;9692:34;9672:18;;;9665:62;9744:18;;19365:139:0;9412:356:1;19365:139:0;19203:309;;19063:449;;;;:::o;35295:740::-;35409:7;35467:20;;;:14;:20;;;;;;;;35434:53;;;;;;;;;;;;;;;;;35409:7;;;;35434:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35498:21:0;35522:14;;;:8;:14;;;;;35561:17;;35434:53;;-1:-1:-1;35522:14:0;35561:17;-1:-1:-1;35593:8:0;35589:49;;35625:1;35618:8;;;;;;;35589:49;35653:9;35648:242;35672:3;35668:1;:7;35648:242;;;35720:10;35731:1;35720:13;;;;;;;;:::i;:::-;;;;;;;:26;;;35701:15;:45;35697:181;;35863:15;;35823:4;:15;;;35794:10;35805:1;35794:13;;;;;;;;:::i;:::-;;;;;;;:26;;;:44;;;;:::i;:::-;35793:85;;;;:::i;:::-;35765:113;;;;;;;;35697:181;35677:3;;;:::i;:::-;;;35648:242;;;-1:-1:-1;36026:1:0;;35295:740;-1:-1:-1;;;;;;35295:740:0:o;31514:192::-;31579:7;:14;31562;31604:95;31632:6;31626:3;:12;31604:95;;;31662:25;31674:7;31682:3;31674:12;;;;;;;;:::i;:::-;;;;;;;;;31662:11;:25::i;:::-;-1:-1:-1;31640:5:0;;;:::i;:::-;;;31604:95;;;;31551:155;31514:192::o;11075:191::-;11149:16;11168:6;;;11185:17;;;;;;;;;;11218:40;;11168:6;;;;;;;11218:40;;11149:16;11218:40;11138:128;11075:191;:::o;26766:661::-;26875:7;26933:20;;;:14;:20;;;;;;;;26900:53;;;;;;;;;;;;;;;;;26875:7;;;;26900:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26978:17:0;;26900:53;;-1:-1:-1;;;27010:8:0;27006:49;;27042:1;27035:8;;;;;;27006:49;27070:9;27065:157;27089:3;27085:1;:7;27065:157;;;27132:10;27143:1;27132:13;;;;;;;;:::i;:::-;;;;;;;:26;;;27118:10;:40;27114:96;;27184:10;27195:1;27184:13;;;;;;;;:::i;:::-;;;;;;;:26;;;27177:33;;;;;;;27114:96;27094:3;;;:::i;:::-;;;27065:157;;;-1:-1:-1;27387:10:0;27398:7;27404:1;27398:3;:7;:::i;:::-;27387:19;;;;;;;;:::i;:::-;;;;;;;:32;;;27380:39;;;;26766:661;;;;:::o;14:196:1:-;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:186::-;274:6;327:2;315:9;306:7;302:23;298:32;295:52;;;343:1;340;333:12;295:52;366:29;385:9;366:29;:::i;406:277::-;473:6;526:2;514:9;505:7;501:23;497:32;494:52;;;542:1;539;532:12;494:52;574:9;568:16;627:5;620:13;613:21;606:5;603:32;593:60;;649:1;646;639:12;688:180;747:6;800:2;788:9;779:7;775:23;771:32;768:52;;;816:1;813;806:12;768:52;-1:-1:-1;839:23:1;;688:180;-1:-1:-1;688:180:1:o;873:184::-;943:6;996:2;984:9;975:7;971:23;967:32;964:52;;;1012:1;1009;1002:12;964:52;-1:-1:-1;1035:16:1;;873:184;-1:-1:-1;873:184:1:o;1062:254::-;1130:6;1138;1191:2;1179:9;1170:7;1166:23;1162:32;1159:52;;;1207:1;1204;1197:12;1159:52;1243:9;1230:23;1220:33;;1272:38;1306:2;1295:9;1291:18;1272:38;:::i;:::-;1262:48;;1062:254;;;;;:::o;1321:322::-;1398:6;1406;1414;1467:2;1455:9;1446:7;1442:23;1438:32;1435:52;;;1483:1;1480;1473:12;1435:52;1519:9;1506:23;1496:33;;1548:38;1582:2;1571:9;1567:18;1548:38;:::i;:::-;1538:48;;1633:2;1622:9;1618:18;1605:32;1595:42;;1321:322;;;;;:::o;1648:248::-;1716:6;1724;1777:2;1765:9;1756:7;1752:23;1748:32;1745:52;;;1793:1;1790;1783:12;1745:52;-1:-1:-1;;1816:23:1;;;1886:2;1871:18;;;1858:32;;-1:-1:-1;1648:248:1:o;1901:322::-;1978:6;1986;1994;2047:2;2035:9;2026:7;2022:23;2018:32;2015:52;;;2063:1;2060;2053:12;2015:52;2099:9;2086:23;2076:33;;2156:2;2145:9;2141:18;2128:32;2118:42;;2179:38;2213:2;2202:9;2198:18;2179:38;:::i;:::-;2169:48;;1901:322;;;;;:::o;2228:316::-;2305:6;2313;2321;2374:2;2362:9;2353:7;2349:23;2345:32;2342:52;;;2390:1;2387;2380:12;2342:52;-1:-1:-1;;2413:23:1;;;2483:2;2468:18;;2455:32;;-1:-1:-1;2534:2:1;2519:18;;;2506:32;;2228:316;-1:-1:-1;2228:316:1:o;2549:273::-;2617:6;2670:2;2658:9;2649:7;2645:23;2641:32;2638:52;;;2686:1;2683;2676:12;2638:52;2718:9;2712:16;2768:4;2761:5;2757:16;2750:5;2747:27;2737:55;;2788:1;2785;2778:12;2827:426;2956:3;2994:6;2988:13;3019:1;3029:129;3043:6;3040:1;3037:13;3029:129;;;3141:4;3125:14;;;3121:25;;3115:32;3102:11;;;3095:53;3058:12;3029:129;;;3176:6;3173:1;3170:13;3167:48;;;3211:1;3202:6;3197:3;3193:16;3186:27;3167:48;-1:-1:-1;3231:16:1;;;;;2827:426;-1:-1:-1;;2827:426:1:o;12266:128::-;12306:3;12337:1;12333:6;12330:1;12327:13;12324:39;;;12343:18;;:::i;:::-;-1:-1:-1;12379:9:1;;12266:128::o;12399:274::-;12439:1;12465;12455:189;;12500:77;12497:1;12490:88;12601:4;12598:1;12591:15;12629:4;12626:1;12619:15;12455:189;-1:-1:-1;12658:9:1;;12399:274::o;12678:228::-;12718:7;12844:1;12776:66;12772:74;12769:1;12766:81;12761:1;12754:9;12747:17;12743:105;12740:131;;;12851:18;;:::i;:::-;-1:-1:-1;12891:9:1;;12678:228::o;12911:125::-;12951:4;12979:1;12976;12973:8;12970:34;;;12984:18;;:::i;:::-;-1:-1:-1;13021:9:1;;12911:125::o;13041:195::-;13080:3;13111:66;13104:5;13101:77;13098:103;;;13181:18;;:::i;:::-;-1:-1:-1;13228:1:1;13217:13;;13041:195::o;13241:184::-;13293:77;13290:1;13283:88;13390:4;13387:1;13380:15;13414:4;13411:1;13404:15;13430:184;13482:77;13479:1;13472:88;13579:4;13576:1;13569:15;13603:4;13600:1;13593:15
Swarm Source
ipfs://d7b0aa37085035bd0c67e6214612979d4fb57acad6382034b7fa214e253cfbad
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.