Source Code
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ComplexRewarderPerSecV2
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at moonriver.moonscan.io on 2022-02-11
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) private pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
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() {
_setOwner(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
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 IComplexRewarder {
function onSolarReward(
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 ISolarDistributorV2 {
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 SolarDistributorV2 contract for partners to reward
* stakers with their native token alongside SOLAR.
*
* 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 SOLAR-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 ComplexRewarderPerSecV2 is IComplexRewarder, Ownable, ReentrancyGuard {
using BoringERC20 for IBoringERC20;
IBoringERC20 public immutable override rewardToken;
ISolarDistributorV2 public immutable distributorV2;
bool public immutable isNative;
/// @notice Info of each distributorV2 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 distributorV2 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 onlyDistributorV2() {
require(
msg.sender == address(distributorV2),
"onlyDistributorV2: only DistributorV2 can call this function"
);
_;
}
constructor(
IBoringERC20 _rewardToken,
ISolarDistributorV2 _distributorV2,
bool _isNative
) {
require(
Address.isContract(address(_rewardToken)),
"constructor: reward token must be a valid contract"
);
require(
Address.isContract(address(_distributorV2)),
"constructor: SolarDistributorV2 must be a valid contract"
);
rewardToken = _rewardToken;
distributorV2 = _distributorV2;
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 DistributorV2
/// @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 = distributorV2.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 SolarDistributorV2 whenever staker claims SOLAR 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 onSolarReward(
uint256 _pid,
address _user,
uint256 _amount
) external override onlyDistributorV2 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 = distributorV2.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 = distributorV2.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 ISolarDistributorV2","name":"_distributorV2","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 ComplexRewarderPerSecV2.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":"distributorV2","outputs":[{"internalType":"contract ISolarDistributorV2","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":"onSolarReward","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 ComplexRewarderPerSecV2.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
6101206040526000600655603460e0523480156200001c57600080fd5b5060405162003100380380620031008339810160408190526200003f9162000376565b6200004a3362000257565b600180819055506200006783620002a760201b62001d7b1760201c565b620000d45760405162461bcd60e51b815260206004820152603260248201527f636f6e7374727563746f723a2072657761726420746f6b656e206d7573742062604482015271194818481d985b1a590818dbdb9d1c9858dd60721b60648201526084015b60405180910390fd5b620000ea82620002a760201b62001d7b1760201c565b6200015e5760405162461bcd60e51b815260206004820152603860248201527f636f6e7374727563746f723a20536f6c61724469737472696275746f7256322060448201527f6d75737420626520612076616c696420636f6e747261637400000000000000006064820152608401620000cb565b6001600160601b0319606084811b821660805283901b1660a05280151560f81b60c052600081620001ae57620001a8846001600160a01b0316620002ad60201b62001d811760201c565b620001b1565b60125b60ff169050601e81106200022e5760405162461bcd60e51b815260206004820152603960248201527f636f6e7374727563746f723a2072657761726420746f6b656e20646563696d6160448201527f6c73206d75737420626520696e666572696f7220746f203330000000000000006064820152608401620000cb565b6200023b81601e6200053f565b6200024890600a62000481565b61010052506200058892505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b3b151590565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b03861691620002f59190620003fa565b600060405180830381855afa9150503d806000811462000332576040519150601f19603f3d011682016040523d82523d6000602084013e62000337565b606091505b50915091508180156200034b575080516020145b620003585760126200036e565b808060200190518101906200036e9190620003ce565b949350505050565b6000806000606084860312156200038c57600080fd5b835162000399816200056f565b6020850151909350620003ac816200056f565b60408501519092508015158114620003c357600080fd5b809150509250925092565b600060208284031215620003e157600080fd5b815160ff81168114620003f357600080fd5b9392505050565b6000825160005b818110156200041d576020818601810151858301520162000401565b818111156200042d576000828501525b509190910192915050565b600181815b80851115620004795781600019048211156200045d576200045d62000559565b808516156200046b57918102915b93841c93908002906200043d565b509250929050565b6000620003f383836000826200049a5750600162000539565b81620004a95750600062000539565b8160018114620004c25760028114620004cd57620004ed565b600191505062000539565b60ff841115620004e157620004e162000559565b50506001821b62000539565b5060208310610133831016604e8410600b841016171562000512575081810a62000539565b6200051e838362000438565b806000190482111562000535576200053562000559565b0290505b92915050565b60008282101562000554576200055462000559565b500390565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b03811681146200058557600080fd5b50565b60805160601c60a05160601c60c05160f81c60e05161010051612aac620006546000396000818161163701528181611aac01528181611ca8015281816120ba015261210e0152600081816101960152610a9c0152600081816103e10152818161089501528181610d45015281816119af0152611af30152600081816104250152818161073c0152818161144f015281816118500152611f6b01526000818161055d015281816108d401528181610d8201528181611a0801528181611c340152611c7a0152612aac6000f3fe60806040526004361061017f5760003560e01c8063715018a6116100d65780639e494bee1161007f578063f7c618c111610059578063f7c618c11461054b578063fe8343fb1461057f578063ffcd42631461059f57600080fd5b80639e494bee146104eb578063d4aa89b51461050b578063f2fde38b1461052b57600080fd5b80637d0d9d5f116100b05780637d0d9d5f146104135780638da5cb5b1461046c57806393f1a40b1461049757600080fd5b8063715018a61461039a57806372333631146103af57806373cfc6b2146103cf57600080fd5b80632ea807c51161013857806351eb05a61161011257806351eb05a614610303578063630b5ba11461036557806369883b4e1461037a57600080fd5b80632ea807c5146102b0578063465e81ec146102c3578063505fb46c146102e357600080fd5b80631526fe27116101695780631526fe271461020657806317caf6f1146102785780631d1231311461028e57600080fd5b8062d74850146101845780630832cfbf146101cb575b600080fd5b34801561019057600080fd5b506101b87f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b3480156101d757600080fd5b506101eb6101e6366004612857565b6105bf565b604080519384526020840192909252908201526060016101c2565b34801561021257600080fd5b506102506102213660046127c4565b600260208190526000918252604090912080546001820154928201546003830154600490930154919392909185565b604080519586526020860194909452928401919091526060830152608082015260a0016101c2565b34801561028457600080fd5b506101b860065481565b34801561029a57600080fd5b506102ae6102a9366004612879565b610601565b005b6102ae6102be3660046128ae565b6109fe565b3480156102cf57600080fd5b506101b86102de3660046127c4565b610ef0565b3480156102ef57600080fd5b506102ae6102fe3660046128ae565b610f02565b34801561030f57600080fd5b5061032361031e3660046127c4565b6110df565b6040516101c29190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b34801561037157600080fd5b506102ae611196565b34801561038657600080fd5b506101b86103953660046127c4565b611216565b3480156103a657600080fd5b506102ae611237565b3480156103bb57600080fd5b506101b86103ca3660046128ae565b6112c4565b3480156103db57600080fd5b506104037f000000000000000000000000000000000000000000000000000000000000000081565b60405190151581526020016101c2565b34801561041f57600080fd5b506104477f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c2565b34801561047857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610447565b3480156104a357600080fd5b506104d66104b23660046127f6565b60056020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101c2565b3480156104f757600080fd5b506101b86105063660046127c4565b61130d565b34801561051757600080fd5b506103236105263660046127c4565b611319565b34801561053757600080fd5b506102ae610546366004612787565b611708565b34801561055757600080fd5b506104477f000000000000000000000000000000000000000000000000000000000000000081565b34801561058b57600080fd5b506102ae61059a366004612822565b611838565b3480156105ab57600080fd5b506101b86105ba3660046127f6565b611d39565b600360205281600052604060002081815481106105db57600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b60005473ffffffffffffffffffffffffffffffffffffffff163314610687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600260015414156106f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067e565b600260018190556000848152602091909152604080822090517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018690529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063654c9ece9060240160206040518083038186803b15801561079357600080fd5b505afa1580156107a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cb91906127dd565b905060006107db86836000611e7c565b60048401549091506107ed8683612938565b111561087b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f656d657267656e6379207265776172642077697468647261773a206e6f74206560448201527f6e6f7567682072657761726420746f6b656e0000000000000000000000000000606482015260840161067e565b8483600401600082825461088f91906129c8565b909155507f00000000000000000000000000000000000000000000000000000000000000009050610900576108fb73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168587612157565b6109f2565b60008473ffffffffffffffffffffffffffffffffffffffff168660405160006040518083038185875af1925050503d806000811461095a576040519150601f19603f3d011682016040523d82523d6000602084013e61095f565b606091505b50509050806109f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f656d657267656e6379207265776172642077697468647261773a206661696c6560448201527f6420746f2073656e640000000000000000000000000000000000000000000000606482015260840161067e565b505b50506001805550505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067e565b6000838152600360209081526040808320600290925290912081547f000000000000000000000000000000000000000000000000000000000000000011610b48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f6164642072657761726420696e666f3a2072657761726420696e666f206c656e60448201527f677468206578636565647320746865206c696d69740000000000000000000000606482015260840161067e565b81541580610b885750815442908390610b63906001906129c8565b81548110610b7357610b73612a47565b90600052602060002090600302016001015410155b610c13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6164642072657761726420696e666f3a2072657761726420706572696f64206560448201527f6e64656400000000000000000000000000000000000000000000000000000000606482015260840161067e565b81541580610c525750815484908390610c2e906001906129c8565b81548110610c3e57610c3e612a47565b906000526020600020906003020160010154105b610cde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f6164642072657761726420696e666f3a20626164206e657720656e6454696d6560448201527f7374616d70000000000000000000000000000000000000000000000000000000606482015260840161067e565b815460009015610d1f5782548390610cf8906001906129c8565b81548110610d0857610d08612a47565b906000526020600020906003020160010154610d25565b81600101545b90506000610d3382876129c8565b90506000610d41868361298b565b90507f0000000000000000000000000000000000000000000000000000000000000000610daf57610daa73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000163330846122c7565b610e3e565b803414610e3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f6164642072657761726420696e666f3a206e6f7420656e6f7567682066756e6460448201527f7320746f207472616e7366657200000000000000000000000000000000000000606482015260840161067e565b80846004016000828254610e529190612938565b90915550506040805160608101825284815260208082018a8152928201898152885460018181018b5560008b8152939093209351600390910290930192835592518282015591516002909101558554610eab91906129c8565b60408051898152602081018990528a917fad90731bd0d97445f5af66088f3adebf343c520c20e033cc42f93b124258cdc2910160405180910390a35050505050505050565b6000610efc8242612440565b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067e565b6000838152600260208190526040909120015415610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706f6f6c20616c72656164792065786973747300000000000000000000000000604482015260640161067e565b816006600082825461100f9190612938565b90915550506040805160a0810182526000808252602080830185815283850186815260608501888152608086018581528a86526002948590528786209651875592516001808801919091559151938601939093559151600385015551600493840155825490810183559190527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018490555183907fa6b36ea399c1eae2ba98a011138f78722b48f46ad93349269348ccc6e8f1cced906110d29085815260200190565b60405180910390a2505050565b6111116040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6002600154141561117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067e565b600260015561118c82611319565b6001805592915050565b60026001541415611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067e565b6002600155611210612574565b60018055565b6004818154811061122657600080fd5b600091825260209091200154905081565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067e565b6112c260006125bd565b565b600081841015806112d457508284115b156112e157506000611306565b8183116112f9576112f284846129c8565b9050611306565b61130384836129c8565b90505b9392505050565b6000610efc8242612632565b61134b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b506000818152600260208181526040808420815160a08101835281548152600182015481850152938101548483015260038082015460608601526004909101546080850152858552825280842080548251818502810185019093528083529394939192909190849084015b8282101561140657838290600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050815260200190600101906113b6565b5050505090508160400151421161141d5750919050565b6040517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018490526000907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063654c9ece9060240160206040518083038186803b1580156114a657600080fd5b505afa1580156114ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114de91906127dd565b905080611549576114ef8442612632565b4211156115425742604084810182905284518151928352602083018490529082015284907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f46906060015b60405180910390a25b5050919050565b60005b825181101561168b57600061158385604001514286858151811061157257611572612a47565b6020026020010151602001516112c4565b905080611590575061167b565b8382815181106115a2576115a2612a47565b6020026020010151602001514211156115e1578382815181106115c7576115c7612a47565b6020026020010151602001518560400181815250506115e8565b4260408601525b6000600654866060015186858151811061160457611604612a47565b6020026020010151604001518461161b919061298b565b611625919061298b565b61162f9190612950565b90508361165c7f00000000000000000000000000000000000000000000000000000000000000008361298b565b6116669190612950565b86518790611675908390612938565b90525050505b611684816129df565b905061154c565b506000848152600260208181526040928390208651808255878301516001830155878501519382018490556060808901516003840155608089015160049093019290925584519384529183018590529282015285917f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469101611539565b60005473ffffffffffffffffffffffffffffffffffffffff163314611789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067e565b73ffffffffffffffffffffffffffffffffffffffff811661182c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161067e565b611835816125bd565b50565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146118fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f6f6e6c794469737472696275746f7256323a206f6e6c7920446973747269627560448201527f746f7256322063616e2063616c6c20746869732066756e6374696f6e00000000606482015260840161067e565b6002600154141561196a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067e565b6002600155600061197a84611319565b600085815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff881684529091528120919250807f0000000000000000000000000000000000000000000000000000000000000000156119da575047611a9a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015611a5f57600080fd5b505afa158015611a73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9791906127dd565b90505b825415611ca1576001830154845184547f000000000000000000000000000000000000000000000000000000000000000091611ad59161298b565b611adf9190612950565b611ae991906129c8565b91508115611ca1577f000000000000000000000000000000000000000000000000000000000000000015611c125780821115611bf05760008673ffffffffffffffffffffffffffffffffffffffff16826040515b60006040518083038185875af1925050503d8060008114611b7a576040519150601f19603f3d011682016040523d82523d6000602084013e611b7f565b606091505b5050905080611bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c65640000000000000000000000000000000000604482015260640161067e565b50611ca1565b60008673ffffffffffffffffffffffffffffffffffffffff1683604051611b3d565b80821115611c6057611c5b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168783612157565b611ca1565b611ca173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168784612157565b84835583517f000000000000000000000000000000000000000000000000000000000000000090611cd2908761298b565b611cdc9190612950565b600184015560405182815273ffffffffffffffffffffffffffffffffffffffff8716907fd1072bb52c3131d0c96197b73fb8a45637e30f8b6664fc142310cc9b242859b49060200160405180910390a25050600180555050505050565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281208054600190910154611306918591611e7c565b3b151590565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691611e0291906128fd565b600060405180830381855afa9150503d8060008114611e3d576040519150601f19603f3d011682016040523d82523d6000602084013e611e42565b606091505b5091509150818015611e55575080516020145b611e60576012611e74565b80806020019051810190611e7491906128da565b949350505050565b6000838152600260208181526040808420815160a08101835281548152600182015481850152938101548483015260038082015460608601526004909101546080850152878552825280842080548251818502810185019093528083528593849084015b82821015611f305783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611ee0565b505084516040517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018b905293945092600092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16915063654c9ece9060240160206040518083038186803b158015611fc357600080fd5b505afa158015611fd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffb91906127dd565b905083604001514211801561200f57508015155b1561210b57604084015160005b845181101561210857600061203e834288858151811061157257611572612a47565b90508061204b57506120f8565b85828151811061205d5761205d612a47565b60200260200101516020015192506000600654886060015188858151811061208757612087612a47565b6020026020010151604001518461209e919061298b565b6120a8919061298b565b6120b29190612950565b9050846120df7f00000000000000000000000000000000000000000000000000000000000000008361298b565b6120e99190612950565b6120f39087612938565b955050505b612101816129df565b905061201c565b50505b857f0000000000000000000000000000000000000000000000000000000000000000612137848a61298b565b6121419190612950565b61214b91906129c8565b98975050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916121ee91906128fd565b6000604051808303816000865af19150503d806000811461222b576040519150601f19603f3d011682016040523d82523d6000602084013e612230565b606091505b509150915081801561225a57508051158061225a57508080602001905181019061225a91906127a2565b6122c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604482015260640161067e565b5050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161236691906128fd565b6000604051808303816000865af19150503d80600081146123a3576040519150601f19603f3d011682016040523d82523d6000602084013e6123a8565b606091505b50915091508180156123d25750805115806123d25750808060200190518101906123d291906127a2565b612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604482015260640161067e565b505050505050565b600082815260036020908152604080832080548251818502810185019093528083528493849084015b828210156124b95783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612469565b50505060008681526002602052604090208251929350919050806124e35760009350505050610efc565b60005b818110156125675783818151811061250057612500612a47565b602002602001015160200151861161255757600654836003015485838151811061252c5761252c612a47565b602002602001015160400151612542919061298b565b61254c9190612950565b945050505050610efc565b612560816129df565b90506124e6565b5060009695505050505050565b60045460005b818110156125b9576125a86004828154811061259857612598612a47565b9060005260206000200154611319565b506125b2816129df565b905061257a565b5050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082815260036020908152604080832080548251818502810185019093528083528493849084015b828210156126ab578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250508152602001906001019061265b565b505082519293505050806126c457600092505050610efc565b60005b8181101561272b578281815181106126e1576126e1612a47565b602002602001015160200151851161271b5782818151811061270557612705612a47565b6020026020010151602001519350505050610efc565b612724816129df565b90506126c7565b50816127386001836129c8565b8151811061274857612748612a47565b6020026020010151602001519250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461278257600080fd5b919050565b60006020828403121561279957600080fd5b6113068261275e565b6000602082840312156127b457600080fd5b8151801515811461130657600080fd5b6000602082840312156127d657600080fd5b5035919050565b6000602082840312156127ef57600080fd5b5051919050565b6000806040838503121561280957600080fd5b823591506128196020840161275e565b90509250929050565b60008060006060848603121561283757600080fd5b833592506128476020850161275e565b9150604084013590509250925092565b6000806040838503121561286a57600080fd5b50508035926020909101359150565b60008060006060848603121561288e57600080fd5b83359250602084013591506128a56040850161275e565b90509250925092565b6000806000606084860312156128c357600080fd5b505081359360208301359350604090920135919050565b6000602082840312156128ec57600080fd5b815160ff8116811461130657600080fd5b6000825160005b8181101561291e5760208186018101518583015201612904565b8181111561292d576000828501525b509190910192915050565b6000821982111561294b5761294b612a18565b500190565b600082612986577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156129c3576129c3612a18565b500290565b6000828210156129da576129da612a18565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a1157612a11612a18565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212200614704b67aeb4c5987ffc3b820df22c5aaa46d2f76fb8a0d0fb1d41db15784664736f6c63430008070033000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x60806040526004361061017f5760003560e01c8063715018a6116100d65780639e494bee1161007f578063f7c618c111610059578063f7c618c11461054b578063fe8343fb1461057f578063ffcd42631461059f57600080fd5b80639e494bee146104eb578063d4aa89b51461050b578063f2fde38b1461052b57600080fd5b80637d0d9d5f116100b05780637d0d9d5f146104135780638da5cb5b1461046c57806393f1a40b1461049757600080fd5b8063715018a61461039a57806372333631146103af57806373cfc6b2146103cf57600080fd5b80632ea807c51161013857806351eb05a61161011257806351eb05a614610303578063630b5ba11461036557806369883b4e1461037a57600080fd5b80632ea807c5146102b0578063465e81ec146102c3578063505fb46c146102e357600080fd5b80631526fe27116101695780631526fe271461020657806317caf6f1146102785780631d1231311461028e57600080fd5b8062d74850146101845780630832cfbf146101cb575b600080fd5b34801561019057600080fd5b506101b87f000000000000000000000000000000000000000000000000000000000000003481565b6040519081526020015b60405180910390f35b3480156101d757600080fd5b506101eb6101e6366004612857565b6105bf565b604080519384526020840192909252908201526060016101c2565b34801561021257600080fd5b506102506102213660046127c4565b600260208190526000918252604090912080546001820154928201546003830154600490930154919392909185565b604080519586526020860194909452928401919091526060830152608082015260a0016101c2565b34801561028457600080fd5b506101b860065481565b34801561029a57600080fd5b506102ae6102a9366004612879565b610601565b005b6102ae6102be3660046128ae565b6109fe565b3480156102cf57600080fd5b506101b86102de3660046127c4565b610ef0565b3480156102ef57600080fd5b506102ae6102fe3660046128ae565b610f02565b34801561030f57600080fd5b5061032361031e3660046127c4565b6110df565b6040516101c29190600060a082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015292915050565b34801561037157600080fd5b506102ae611196565b34801561038657600080fd5b506101b86103953660046127c4565b611216565b3480156103a657600080fd5b506102ae611237565b3480156103bb57600080fd5b506101b86103ca3660046128ae565b6112c4565b3480156103db57600080fd5b506104037f000000000000000000000000000000000000000000000000000000000000000081565b60405190151581526020016101c2565b34801561041f57600080fd5b506104477f0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f81565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c2565b34801561047857600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff16610447565b3480156104a357600080fd5b506104d66104b23660046127f6565b60056020908152600092835260408084209091529082529020805460019091015482565b604080519283526020830191909152016101c2565b3480156104f757600080fd5b506101b86105063660046127c4565b61130d565b34801561051757600080fd5b506103236105263660046127c4565b611319565b34801561053757600080fd5b506102ae610546366004612787565b611708565b34801561055757600080fd5b506104477f000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d81565b34801561058b57600080fd5b506102ae61059a366004612822565b611838565b3480156105ab57600080fd5b506101b86105ba3660046127f6565b611d39565b600360205281600052604060002081815481106105db57600080fd5b600091825260209091206003909102018054600182015460029092015490935090915083565b60005473ffffffffffffffffffffffffffffffffffffffff163314610687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b600260015414156106f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067e565b600260018190556000848152602091909152604080822090517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018690529091907f0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f73ffffffffffffffffffffffffffffffffffffffff169063654c9ece9060240160206040518083038186803b15801561079357600080fd5b505afa1580156107a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107cb91906127dd565b905060006107db86836000611e7c565b60048401549091506107ed8683612938565b111561087b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f656d657267656e6379207265776172642077697468647261773a206e6f74206560448201527f6e6f7567682072657761726420746f6b656e0000000000000000000000000000606482015260840161067e565b8483600401600082825461088f91906129c8565b909155507f00000000000000000000000000000000000000000000000000000000000000009050610900576108fb73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d168587612157565b6109f2565b60008473ffffffffffffffffffffffffffffffffffffffff168660405160006040518083038185875af1925050503d806000811461095a576040519150601f19603f3d011682016040523d82523d6000602084013e61095f565b606091505b50509050806109f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f656d657267656e6379207265776172642077697468647261773a206661696c6560448201527f6420746f2073656e640000000000000000000000000000000000000000000000606482015260840161067e565b505b50506001805550505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a7f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067e565b6000838152600360209081526040808320600290925290912081547f000000000000000000000000000000000000000000000000000000000000003411610b48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603560248201527f6164642072657761726420696e666f3a2072657761726420696e666f206c656e60448201527f677468206578636565647320746865206c696d69740000000000000000000000606482015260840161067e565b81541580610b885750815442908390610b63906001906129c8565b81548110610b7357610b73612a47565b90600052602060002090600302016001015410155b610c13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6164642072657761726420696e666f3a2072657761726420706572696f64206560448201527f6e64656400000000000000000000000000000000000000000000000000000000606482015260840161067e565b81541580610c525750815484908390610c2e906001906129c8565b81548110610c3e57610c3e612a47565b906000526020600020906003020160010154105b610cde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f6164642072657761726420696e666f3a20626164206e657720656e6454696d6560448201527f7374616d70000000000000000000000000000000000000000000000000000000606482015260840161067e565b815460009015610d1f5782548390610cf8906001906129c8565b81548110610d0857610d08612a47565b906000526020600020906003020160010154610d25565b81600101545b90506000610d3382876129c8565b90506000610d41868361298b565b90507f0000000000000000000000000000000000000000000000000000000000000000610daf57610daa73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d163330846122c7565b610e3e565b803414610e3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f6164642072657761726420696e666f3a206e6f7420656e6f7567682066756e6460448201527f7320746f207472616e7366657200000000000000000000000000000000000000606482015260840161067e565b80846004016000828254610e529190612938565b90915550506040805160608101825284815260208082018a8152928201898152885460018181018b5560008b8152939093209351600390910290930192835592518282015591516002909101558554610eab91906129c8565b60408051898152602081018990528a917fad90731bd0d97445f5af66088f3adebf343c520c20e033cc42f93b124258cdc2910160405180910390a35050505050505050565b6000610efc8242612440565b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f83576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067e565b6000838152600260208190526040909120015415610ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706f6f6c20616c72656164792065786973747300000000000000000000000000604482015260640161067e565b816006600082825461100f9190612938565b90915550506040805160a0810182526000808252602080830185815283850186815260608501888152608086018581528a86526002948590528786209651875592516001808801919091559151938601939093559151600385015551600493840155825490810183559190527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b018490555183907fa6b36ea399c1eae2ba98a011138f78722b48f46ad93349269348ccc6e8f1cced906110d29085815260200190565b60405180910390a2505050565b6111116040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b6002600154141561117e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067e565b600260015561118c82611319565b6001805592915050565b60026001541415611203576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067e565b6002600155611210612574565b60018055565b6004818154811061122657600080fd5b600091825260209091200154905081565b60005473ffffffffffffffffffffffffffffffffffffffff1633146112b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067e565b6112c260006125bd565b565b600081841015806112d457508284115b156112e157506000611306565b8183116112f9576112f284846129c8565b9050611306565b61130384836129c8565b90505b9392505050565b6000610efc8242612632565b61134b6040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b506000818152600260208181526040808420815160a08101835281548152600182015481850152938101548483015260038082015460608601526004909101546080850152858552825280842080548251818502810185019093528083529394939192909190849084015b8282101561140657838290600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050815260200190600101906113b6565b5050505090508160400151421161141d5750919050565b6040517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018490526000907f0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f73ffffffffffffffffffffffffffffffffffffffff169063654c9ece9060240160206040518083038186803b1580156114a657600080fd5b505afa1580156114ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114de91906127dd565b905080611549576114ef8442612632565b4211156115425742604084810182905284518151928352602083018490529082015284907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f46906060015b60405180910390a25b5050919050565b60005b825181101561168b57600061158385604001514286858151811061157257611572612a47565b6020026020010151602001516112c4565b905080611590575061167b565b8382815181106115a2576115a2612a47565b6020026020010151602001514211156115e1578382815181106115c7576115c7612a47565b6020026020010151602001518560400181815250506115e8565b4260408601525b6000600654866060015186858151811061160457611604612a47565b6020026020010151604001518461161b919061298b565b611625919061298b565b61162f9190612950565b90508361165c7f00000000000000000000000000000000000000000000d3c21bcecceda10000008361298b565b6116669190612950565b86518790611675908390612938565b90525050505b611684816129df565b905061154c565b506000848152600260208181526040928390208651808255878301516001830155878501519382018490556060808901516003840155608089015160049093019290925584519384529183018590529282015285917f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469101611539565b60005473ffffffffffffffffffffffffffffffffffffffff163314611789576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161067e565b73ffffffffffffffffffffffffffffffffffffffff811661182c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161067e565b611835816125bd565b50565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f16146118fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603c60248201527f6f6e6c794469737472696275746f7256323a206f6e6c7920446973747269627560448201527f746f7256322063616e2063616c6c20746869732066756e6374696f6e00000000606482015260840161067e565b6002600154141561196a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161067e565b6002600155600061197a84611319565b600085815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff881684529091528120919250807f0000000000000000000000000000000000000000000000000000000000000000156119da575047611a9a565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d73ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015611a5f57600080fd5b505afa158015611a73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9791906127dd565b90505b825415611ca1576001830154845184547f00000000000000000000000000000000000000000000d3c21bcecceda100000091611ad59161298b565b611adf9190612950565b611ae991906129c8565b91508115611ca1577f000000000000000000000000000000000000000000000000000000000000000015611c125780821115611bf05760008673ffffffffffffffffffffffffffffffffffffffff16826040515b60006040518083038185875af1925050503d8060008114611b7a576040519150601f19603f3d011682016040523d82523d6000602084013e611b7f565b606091505b5050905080611bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5472616e73666572206661696c65640000000000000000000000000000000000604482015260640161067e565b50611ca1565b60008673ffffffffffffffffffffffffffffffffffffffff1683604051611b3d565b80821115611c6057611c5b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d168783612157565b611ca1565b611ca173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d168784612157565b84835583517f00000000000000000000000000000000000000000000d3c21bcecceda100000090611cd2908761298b565b611cdc9190612950565b600184015560405182815273ffffffffffffffffffffffffffffffffffffffff8716907fd1072bb52c3131d0c96197b73fb8a45637e30f8b6664fc142310cc9b242859b49060200160405180910390a25050600180555050505050565b600082815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8516845290915281208054600190910154611306918591611e7c565b3b151590565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff861691611e0291906128fd565b600060405180830381855afa9150503d8060008114611e3d576040519150601f19603f3d011682016040523d82523d6000602084013e611e42565b606091505b5091509150818015611e55575080516020145b611e60576012611e74565b80806020019051810190611e7491906128da565b949350505050565b6000838152600260208181526040808420815160a08101835281548152600182015481850152938101548483015260038082015460608601526004909101546080850152878552825280842080548251818502810185019093528083528593849084015b82821015611f305783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190611ee0565b505084516040517f654c9ece000000000000000000000000000000000000000000000000000000008152600481018b905293945092600092507f0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f73ffffffffffffffffffffffffffffffffffffffff16915063654c9ece9060240160206040518083038186803b158015611fc357600080fd5b505afa158015611fd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ffb91906127dd565b905083604001514211801561200f57508015155b1561210b57604084015160005b845181101561210857600061203e834288858151811061157257611572612a47565b90508061204b57506120f8565b85828151811061205d5761205d612a47565b60200260200101516020015192506000600654886060015188858151811061208757612087612a47565b6020026020010151604001518461209e919061298b565b6120a8919061298b565b6120b29190612950565b9050846120df7f00000000000000000000000000000000000000000000d3c21bcecceda10000008361298b565b6120e99190612950565b6120f39087612938565b955050505b612101816129df565b905061201c565b50505b857f00000000000000000000000000000000000000000000d3c21bcecceda1000000612137848a61298b565b6121419190612950565b61214b91906129c8565b98975050505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916121ee91906128fd565b6000604051808303816000865af19150503d806000811461222b576040519150601f19603f3d011682016040523d82523d6000602084013e612230565b606091505b509150915081801561225a57508051158061225a57508080602001905181019061225a91906127a2565b6122c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604482015260640161067e565b5050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052915160009283929088169161236691906128fd565b6000604051808303816000865af19150503d80600081146123a3576040519150601f19603f3d011682016040523d82523d6000602084013e6123a8565b606091505b50915091508180156123d25750805115806123d25750808060200190518101906123d291906127a2565b612438576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604482015260640161067e565b505050505050565b600082815260036020908152604080832080548251818502810185019093528083528493849084015b828210156124b95783829060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505081526020019060010190612469565b50505060008681526002602052604090208251929350919050806124e35760009350505050610efc565b60005b818110156125675783818151811061250057612500612a47565b602002602001015160200151861161255757600654836003015485838151811061252c5761252c612a47565b602002602001015160400151612542919061298b565b61254c9190612950565b945050505050610efc565b612560816129df565b90506124e6565b5060009695505050505050565b60045460005b818110156125b9576125a86004828154811061259857612598612a47565b9060005260206000200154611319565b506125b2816129df565b905061257a565b5050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082815260036020908152604080832080548251818502810185019093528083528493849084015b828210156126ab578382906000526020600020906003020160405180606001604052908160008201548152602001600182015481526020016002820154815250508152602001906001019061265b565b505082519293505050806126c457600092505050610efc565b60005b8181101561272b578281815181106126e1576126e1612a47565b602002602001015160200151851161271b5782818151811061270557612705612a47565b6020026020010151602001519350505050610efc565b612724816129df565b90506126c7565b50816127386001836129c8565b8151811061274857612748612a47565b6020026020010151602001519250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461278257600080fd5b919050565b60006020828403121561279957600080fd5b6113068261275e565b6000602082840312156127b457600080fd5b8151801515811461130657600080fd5b6000602082840312156127d657600080fd5b5035919050565b6000602082840312156127ef57600080fd5b5051919050565b6000806040838503121561280957600080fd5b823591506128196020840161275e565b90509250929050565b60008060006060848603121561283757600080fd5b833592506128476020850161275e565b9150604084013590509250925092565b6000806040838503121561286a57600080fd5b50508035926020909101359150565b60008060006060848603121561288e57600080fd5b83359250602084013591506128a56040850161275e565b90509250925092565b6000806000606084860312156128c357600080fd5b505081359360208301359350604090920135919050565b6000602082840312156128ec57600080fd5b815160ff8116811461130657600080fd5b6000825160005b8181101561291e5760208186018101518583015201612904565b8181111561292d576000828501525b509190910192915050565b6000821982111561294b5761294b612a18565b500190565b600082612986577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156129c3576129c3612a18565b500290565b6000828210156129da576129da612a18565b500390565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612a1157612a11612a18565b5060010190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea26469706673582212200614704b67aeb4c5987ffc3b820df22c5aaa46d2f76fb8a0d0fb1d41db15784664736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _rewardToken (address): 0xE3F5a90F9cb311505cd691a46596599aA1A0AD7D
Arg [1] : _distributorV2 (address): 0x0329867a8c457e9F75e25b0685011291CD30904F
Arg [2] : _isNative (bool): False
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000e3f5a90f9cb311505cd691a46596599aa1a0ad7d
Arg [1] : 0000000000000000000000000329867a8c457e9f75e25b0685011291cd30904f
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
19544:17225:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21711:45;;;;;;;;;;;;;;;;;;11186:25:1;;;11174:2;11159:18;21711:45:0;;;;;;;;21265:54;;;;;;;;;;-1:-1:-1;21265:54:0;;;;;:::i;:::-;;:::i;:::-;;;;11677:25:1;;;11733:2;11718:18;;11711:34;;;;11761:18;;;11754:34;11665:2;11650:18;21265:54:0;11475:319:1;21052:44:0;;;;;;;;;;-1:-1:-1;21052:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12058:25:1;;;12114:2;12099:18;;12092:34;;;;12142:18;;;12135:34;;;;12200:2;12185:18;;12178:34;12243:3;12228:19;;12221:35;12045:3;12030:19;21052:44:0;11799:463:1;21586:34:0;;;;;;;;;;;;;;;;35942:824;;;;;;;;;;-1:-1:-1;35942:824:0;;;;;:::i;:::-;;:::i;:::-;;24451:1894;;;;;;:::i;:::-;;:::i;35697:187::-;;;;;;;;;;-1:-1:-1;35697:187:0;;;;;:::i;:::-;;:::i;23734:578::-;;;;;;;;;;-1:-1:-1;23734:578:0;;;;;:::i;:::-;;:::i;27881:162::-;;;;;;;;;;-1:-1:-1;27881:162:0;;;;;:::i;:::-;;:::i;:::-;;;;;;10690:4:1;10732:3;10721:9;10717:19;10709:27;;10769:6;10763:13;10752:9;10745:32;10833:4;10825:6;10821:17;10815:24;10808:4;10797:9;10793:20;10786:54;10896:4;10888:6;10884:17;10878:24;10871:4;10860:9;10856:20;10849:54;10959:4;10951:6;10947:17;10941:24;10934:4;10923:9;10919:20;10912:54;11022:4;11014:6;11010:17;11004:24;10997:4;10986:9;10982:20;10975:54;10548:487;;;;;30936:84:0;;;;;;;;;;;;;:::i;21328:24::-;;;;;;;;;;-1:-1:-1;21328:24:0;;;;;:::i;:::-;;:::i;10173:94::-;;;;;;;;;;;;;:::i;27336:360::-;;;;;;;;;;-1:-1:-1;27336:360:0;;;;;:::i;:::-;;:::i;19787:30::-;;;;;;;;;;;;;;;;;;4569:14:1;;4562:22;4544:41;;4532:2;4517:18;19787:30:0;4404:187:1;19730:50:0;;;;;;;;;;;;;;;;;;3644:42:1;3632:55;;;3614:74;;3602:2;3587:18;19730:50:0;3468:226:1;9522:87:0;;;;;;;;;;-1:-1:-1;9568:7:0;9595:6;;;9522:87;;21419:64;;;;;;;;;;-1:-1:-1;21419:64:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11396:25:1;;;11452:2;11437:18;;11430:34;;;;11369:18;21419:64:0;11222:248:1;27108:139:0;;;;;;;;;;-1:-1:-1;27108:139:0;;;;;:::i;:::-;;:::i;28227:2626::-;;;;;;;;;;-1:-1:-1;28227:2626:0;;;;;:::i;:::-;;:::i;10422:192::-;;;;;;;;;;-1:-1:-1;10422:192:0;;;;;:::i;:::-;;:::i;19673:50::-;;;;;;;;;;;;;;;31541:1629;;;;;;;;;;-1:-1:-1;31541:1629:0;;;;;:::i;:::-;;:::i;33244:323::-;;;;;;;;;;-1:-1:-1;33244:323:0;;;;;:::i;:::-;;:::i;21265:54::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21265:54:0;;-1:-1:-1;21265:54:0;:::o;35942:824::-;9568:7;9595:6;9742:23;9595:6;8474:10;9742:23;9734:68;;;;;;;7673:2:1;9734:68:0;;;7655:21:1;;;7692:18;;;7685:30;7751:34;7731:18;;;7724:62;7803:18;;9734:68:0;;;;;;;;;12457:1:::1;13053:7;;:19;;13045:63;;;::::0;::::1;::::0;;9976:2:1;13045:63:0::1;::::0;::::1;9958:21:1::0;10015:2;9995:18;;;9988:30;10054:33;10034:18;;;10027:61;10105:18;;13045:63:0::1;9774:355:1::0;13045:63:0::1;12457:1;13186:7;:18:::0;;;36105:21:::2;36129:14:::0;;;::::2;::::0;;;;;;;;36173:31;;;;;::::2;::::0;::::2;11186:25:1::0;;;36129:14:0;;36105:21;36173:13:::2;:25;;::::0;::::2;::::0;11159:18:1;;36173:31:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36154:50;;36217:35;36255:33;36270:4;36276:8;36286:1;36255:14;:33::i;:::-;36364:17;::::0;::::2;::::0;36217:71;;-1:-1:-1;36323:37:0::2;36353:7:::0;36217:71;36323:37:::2;:::i;:::-;:58;;36301:158;;;::::0;::::2;::::0;;6825:2:1;36301:158:0::2;::::0;::::2;6807:21:1::0;6864:2;6844:18;;;6837:30;6903:34;6883:18;;;6876:62;6974:20;6954:18;;;6947:48;7012:19;;36301:158:0::2;6623:414:1::0;36301:158:0::2;36491:7;36470:4;:17;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;36516:8:0::2;::::0;-1:-1:-1;36511:248:0::2;;36541:47;:24;:11;:24;36566:12:::0;36580:7;36541:24:::2;:47::i;:::-;36511:248;;;36622:9;36637:12;:17;;36662:7;36637:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36621:53;;;36697:4;36689:58;;;::::0;::::2;::::0;;6415:2:1;36689:58:0::2;::::0;::::2;6397:21:1::0;6454:2;6434:18;;;6427:30;6493:34;6473:18;;;6466:62;6564:11;6544:18;;;6537:39;6593:19;;36689:58:0::2;6213:405:1::0;36689:58:0::2;36606:153;36511:248;-1:-1:-1::0;;12413:1:0::1;13365:22:::0;;-1:-1:-1;;;;35942:824:0:o;24451:1894::-;9568:7;9595:6;9742:23;9595:6;8474:10;9742:23;9734:68;;;;;;;7673:2:1;9734:68:0;;;7655:21:1;;;7692:18;;;7685:30;7751:34;7731:18;;;7724:62;7803:18;;9734:68:0;7471:356:1;9734:68:0;24606:31:::1;24640:20:::0;;;:14:::1;:20;::::0;;;;;;;24695:8:::1;:14:::0;;;;;;24742:17;;24762:15:::1;-1:-1:-1::0;24720:138:0::1;;;::::0;::::1;::::0;;9193:2:1;24720:138:0::1;::::0;::::1;9175:21:1::0;9232:2;9212:18;;;9205:30;9271:34;9251:18;;;9244:62;9342:23;9322:18;;;9315:51;9383:19;;24720:138:0::1;8991:417:1::0;24720:138:0::1;24891:17:::0;;:22;;:125:::1;;-1:-1:-1::0;24945:17:0;;25001:15:::1;::::0;24934:10;;24945:21:::1;::::0;24965:1:::1;::::0;24945:21:::1;:::i;:::-;24934:33;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;:82;;24891:125;24869:211;;;::::0;::::1;::::0;;8034:2:1;24869:211:0::1;::::0;::::1;8016:21:1::0;8073:2;8053:18;;;8046:30;8112:34;8092:18;;;8085:62;8183:6;8163:18;;;8156:34;8207:19;;24869:211:0::1;7832:400:1::0;24869:211:0::1;25113:17:::0;;:22;;:105:::1;;-1:-1:-1::0;25167:17:0;;25205:13;;25156:10;;25167:21:::1;::::0;25187:1:::1;::::0;25167:21:::1;:::i;:::-;25156:33;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;:62;25113:105;25091:192;;;::::0;::::1;::::0;;8787:2:1;25091:192:0::1;::::0;::::1;8769:21:1::0;8826:2;8806:18;;;8799:30;8865:34;8845:18;;;8838:62;8936:7;8916:18;;;8909:35;8961:19;;25091:192:0::1;8585:401:1::0;25091:192:0::1;25321:17:::0;;25296:22:::1;::::0;25321;:119:::1;;25405:17:::0;;25394:10;;25405:21:::1;::::0;25425:1:::1;::::0;25405:21:::1;:::i;:::-;25394:33;;;;;;;;:::i;:::-;;;;;;;;;;;:46;;;25321:119;;;25359:4;:19;;;25321:119;25296:144:::0;-1:-1:-1;25453:17:0::1;25473:30;25296:144:::0;25473:13;:30:::1;:::i;:::-;25453:50:::0;-1:-1:-1;25514:20:0::1;25537:25;25549:13:::0;25453:50;25537:25:::1;:::i;:::-;25514:48;;25580:8;25575:342;;25605:135;:28;:11;:28;25652:10;25689:4;25713:12:::0;25605:28:::1;:135::i;:::-;25575:342;;;25812:12;25799:9;:25;25773:132;;;::::0;::::1;::::0;;10336:2:1;25773:132:0::1;::::0;::::1;10318:21:1::0;10375:2;10355:18;;;10348:30;10414:34;10394:18;;;10387:62;10485:15;10465:18;;;10458:43;10518:19;;25773:132:0::1;10134:409:1::0;25773:132:0::1;25950:12;25929:4;:17;;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;26005:168:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;25975:209;;::::1;::::0;;::::1;::::0;;-1:-1:-1;25975:209:0;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;26249:17;;:21:::1;::::0;25975:209;26249:21:::1;:::i;:::-;26202:135;::::0;;11396:25:1;;;11452:2;11437:18;;11430:34;;;26230:4:0;;26202:135:::1;::::0;11369:18:1;26202:135:0::1;;;;;;;24595:1750;;;;;24451:1894:::0;;;:::o;35697:187::-;35806:7;35838:38;35854:4;35860:15;35838;:38::i;:::-;35831:45;35697:187;-1:-1:-1;;35697:187:0:o;23734:578::-;9568:7;9595:6;9742:23;9595:6;8474:10;9742:23;9734:68;;;;;;;7673:2:1;9734:68:0;;;7655:21:1;;;7692:18;;;7685:30;7751:34;7731:18;;;7724:62;7803:18;;9734:68:0;7471:356:1;9734:68:0;23877:14:::1;::::0;;;:8:::1;:14;::::0;;;;;;;:34:::1;::::0;:39;23869:71:::1;;;::::0;::::1;::::0;;8439:2:1;23869:71:0::1;::::0;::::1;8421:21:1::0;8478:2;8458:18;;;8451:30;8517:21;8497:18;;;8490:49;8556:18;;23869:71:0::1;8237:343:1::0;23869:71:0::1;23970:11;23951:15;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;24011:220:0::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;24011:220:0;;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;23994:14;;;:8:::1;:14:::0;;;;;;;:237;;;;;;::::1;::::0;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;24244:18;;;;::::1;::::0;;;;;;::::1;::::0;;;24278:26;24003:4;;24278:26:::1;::::0;::::1;::::0;24047:11;11186:25:1;;11174:2;11159:18;;11040:177;24278:26:0::1;;;;;;;;23734:578:::0;;;:::o;27881:162::-;27973:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27973:20:0;12457:1;13053:7;;:19;;13045:63;;;;;;;9976:2:1;13045:63:0;;;9958:21:1;10015:2;9995:18;;;9988:30;10054:33;10034:18;;;10027:61;10105:18;;13045:63:0;9774:355:1;13045:63:0;12457:1;13186:7;:18;28018:17:::1;28030:4:::0;28018:11:::1;:17::i;:::-;12413:1:::0;13365:22;;28011:24;27881:162;-1:-1:-1;;27881:162:0:o;30936:84::-;12457:1;13053:7;;:19;;13045:63;;;;;;;9976:2:1;13045:63:0;;;9958:21:1;10015:2;9995:18;;;9988:30;10054:33;10034:18;;;10027:61;10105:18;;13045:63:0;9774:355:1;13045:63:0;12457:1;13186:7;:18;30994::::1;:16;:18::i;:::-;12413:1:::0;13365:22;;30936:84::o;21328:24::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21328:24:0;:::o;10173:94::-;9568:7;9595:6;9742:23;9595:6;8474:10;9742:23;9734:68;;;;;;;7673:2:1;9734:68:0;;;7655:21:1;;;7692:18;;;7685:30;7751:34;7731:18;;;7724:62;7803:18;;9734:68:0;7471:356:1;9734:68:0;10238:21:::1;10256:1;10238:9;:21::i;:::-;10173:94::o:0;27336:360::-;27467:7;27501:13;27492:5;:22;;27491:41;;;;27528:3;27520:5;:11;27491:41;27487:82;;;-1:-1:-1;27556:1:0;27549:8;;27487:82;27590:13;27583:3;:20;27579:71;;27627:11;27633:5;27627:3;:11;:::i;:::-;27620:18;;;;27579:71;27667:21;27683:5;27667:13;:21;:::i;:::-;27660:28;;27336:360;;;;;;:::o;27108:139::-;27174:7;27201:38;27217:4;27223:15;27201;:38::i;28227:2626::-;28277:20;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28277:20:0;-1:-1:-1;28317:13:0;;;;:8;:13;;;;;;;;28310:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28374:19;;;;;;;;28341:52;;;;;;;;;;;;;;;;;28310:20;;28317:13;28341:52;;28374:19;;28341:52;28317:13;;28341:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28429:4;:24;;;28410:15;:43;28406:87;;28470:11;28227:2626;;;:::o;28406:87::-;28524:30;;;;;;;;11186:25:1;;;28505:16:0;;28524:13;:25;;;;;11159:18:1;;28524:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28505:49;-1:-1:-1;28571:13:0;28567:751;;28962:37;28978:3;28983:15;28962;:37::i;:::-;28944:15;:55;28940:339;;;29047:15;29020:24;;;;:42;;;29223:21;;29086:177;;11677:25:1;;;11733:2;11718:18;;11711:34;;;11761:18;;;11754:34;29119:3:0;;29086:177;;11665:2:1;11650:18;29086:177:0;;;;;;;;28940:339;29295:11;;28227:2626;;;:::o;28567:751::-;29374:9;29369:1265;29393:10;:17;29389:1;:21;29369:1265;;;29686:19;29708:152;29742:4;:24;;;29785:15;29819:10;29830:1;29819:13;;;;;;;;:::i;:::-;;;;;;;:26;;;29708:15;:152::i;:::-;29686:174;-1:-1:-1;29879:16:0;29875:30;;29897:8;;;29875:30;30166:10;30177:1;30166:13;;;;;;;;:::i;:::-;;;;;;;:26;;;30148:15;:44;30144:221;;;30240:10;30251:1;30240:13;;;;;;;;:::i;:::-;;;;;;;:26;;;30213:4;:24;;:53;;;;;30144:221;;;30334:15;30307:24;;;:42;30144:221;30381:19;30500:15;;30481:4;:15;;;30435:10;30446:1;30435:13;;;;;;;;:::i;:::-;;;;;;;:26;;;30404:11;:57;;;;:::i;:::-;:92;;;;:::i;:::-;30403:112;;;;:::i;:::-;30381:134;-1:-1:-1;30613:8:0;30559:33;30573:19;30381:134;30559:33;:::i;:::-;30558:63;;;;:::i;:::-;30532:90;;:4;;:90;;;;;:::i;:::-;;;-1:-1:-1;;;29369:1265:0;29412:3;;;:::i;:::-;;;29369:1265;;;-1:-1:-1;30646:13:0;;;;:8;:13;;;;;;;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30684:137;;11677:25:1;;;11718:18;;;11711:34;;;11761:18;;;11754:34;30646:13:0;;30684:137;;11650:18:1;30684:137:0;11475:319:1;10422:192:0;9568:7;9595:6;9742:23;9595:6;8474:10;9742:23;9734:68;;;;;;;7673:2:1;9734:68:0;;;7655:21:1;;;7692:18;;;7685:30;7751:34;7731:18;;;7724:62;7803:18;;9734:68:0;7471:356:1;9734:68:0;10511:22:::1;::::0;::::1;10503:73;;;::::0;::::1;::::0;;5664:2:1;10503:73:0::1;::::0;::::1;5646:21:1::0;5703:2;5683:18;;;5676:30;5742:34;5722:18;;;5715:62;5813:8;5793:18;;;5786:36;5839:19;;10503:73:0::1;5462:402:1::0;10503:73:0::1;10587:19;10597:8;10587:9;:19::i;:::-;10422:192:::0;:::o;31541:1629::-;22481:10;:36;22503:13;22481:36;;22459:146;;;;;;;7244:2:1;22459:146:0;;;7226:21:1;7283:2;7263:18;;;7256:30;7322:34;7302:18;;;7295:62;7393:30;7373:18;;;7366:58;7441:19;;22459:146:0;7042:424:1;22459:146:0;12457:1:::1;13053:7;;:19;;13045:63;;;::::0;::::1;::::0;;9976:2:1;13045:63:0::1;::::0;::::1;9958:21:1::0;10015:2;9995:18;;;9988:30;10054:33;10034:18;;;10027:61;10105:18;;13045:63:0::1;9774:355:1::0;13045:63:0::1;12457:1;13186:7;:18:::0;31704:20:::2;31727:17;31739:4:::0;31727:11:::2;:17::i;:::-;31755:21;31779:14:::0;;;:8:::2;:14;::::0;;;;;;;:21:::2;::::0;::::2;::::0;;;;;;;31704:40;;-1:-1:-1;31755:21:0;31885:8:::2;31881:163;;;-1:-1:-1::0;31926:21:0::2;31881:163;;;31996:36;::::0;;;;32026:4:::2;31996:36;::::0;::::2;3614:74:1::0;31996:11:0::2;:21;;::::0;::::2;::::0;3587:18:1;;31996:36:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31980:52;;31881:163;32060:11:::0;;:15;32056:915:::2;;32184:15;::::0;::::2;::::0;32119:21;;32105:11;;32161:19:::2;::::0;32105:35:::2;::::0;::::2;:::i;:::-;32104:76;;;;:::i;:::-;32103:96;;;;:::i;:::-;32092:108:::0;-1:-1:-1;32221:11:0;;32217:743:::2;;32257:8;32253:692;;;32304:13;32294:7;:23;32290:365;;;32347:12;32365:5;:10;;32383:13;32365:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32346:55;;;32436:7;32428:35;;;::::0;::::2;::::0;;6071:2:1;32428:35:0::2;::::0;::::2;6053:21:1::0;6110:2;6090:18;;;6083:30;6149:17;6129:18;;;6122:45;6184:18;;32428:35:0::2;5869:339:1::0;32428:35:0::2;32319:168;32253:692;;32290:365;32521:12;32539:5;:10;;32557:7;32539:30;;;3258:205:1::0;32253:692:0::2;32717:13;32707:7;:23;32703:223;;;32759:46;:24;:11;:24;32784:5:::0;32791:13;32759:24:::2;:46::i;:::-;32703:223;;;32862:40;:24;:11;:24;32887:5:::0;32894:7;32862:24:::2;:40::i;:::-;32983:21:::0;;;33063;;33101:19:::2;::::0;33049:35:::2;::::0;32997:7;33049:35:::2;:::i;:::-;33048:72;;;;:::i;:::-;33017:15;::::0;::::2;:103:::0;33138:24:::2;::::0;11186:25:1;;;33138:24:0::2;::::0;::::2;::::0;::::2;::::0;11174:2:1;11159:18;33138:24:0::2;;;;;;;-1:-1:-1::0;;12413:1:0::1;13365:22:::0;;-1:-1:-1;;;;;31541:1629:0:o;33244:323::-;33364:7;33465:14;;;:8;:14;;;;;;;;:21;;;;;;;;;;:28;;33512:32;;;;;33409:150;;33465:14;;33409;:150::i;741:387::-;1064:20;1112:8;;;741:387::o;17302:293::-;17461:36;;;;;;;;;;;;;;;;;;17484:12;17461:36;;;17421:87;;17367:5;;;;;;17421:25;;;;:87;;17461:36;17421:87;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17385:123;;;;17526:7;:28;;;;;17537:4;:11;17552:2;17537:17;17526:28;:61;;17585:2;17526:61;;;17568:4;17557:25;;;;;;;;;;;;:::i;:::-;17519:68;17302:293;-1:-1:-1;;;;17302:293:0:o;33575:1307::-;33708:15;33759:14;;;:8;:14;;;;;;;;33736:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33817:20;;;;;;;;33784:53;;;;;;;;;;;;;;;;;33708:15;;;;33784:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33877:21:0;;33928:31;;;;;;;;11186:25:1;;;33784:53:0;;-1:-1:-1;33877:21:0;33850:24;;-1:-1:-1;33928:13:0;:25;;;-1:-1:-1;33928:25:0;;11159:18:1;;33928:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33909:50;;33994:4;:24;;;33976:15;:42;:59;;;;-1:-1:-1;34022:13:0;;;33976:59;33972:799;;;34069:24;;;;34052:14;34110:650;34134:10;:17;34130:1;:21;34110:650;;;34177:19;34199:150;34237:6;34266:15;34304:10;34315:1;34304:13;;;;;;;;:::i;34199:150::-;34177:172;-1:-1:-1;34372:16:0;34368:30;;34390:8;;;34368:30;34426:10;34437:1;34426:13;;;;;;;;:::i;:::-;;;;;;;:26;;;34417:35;;34473:19;34600:15;;34581:4;:15;;;34531:10;34542:1;34531:13;;;;;;;;:::i;:::-;;;;;;;:26;;;34496:11;:61;;;;:::i;:::-;:100;;;;:::i;:::-;34495:120;;;;:::i;:::-;34473:142;-1:-1:-1;34736:8:0;34678:33;34692:19;34473:142;34678:33;:::i;:::-;34677:67;;;;:::i;:::-;34636:108;;;;:::i;:::-;;;34158:602;;34110:650;34153:3;;;:::i;:::-;;;34110:650;;;;34037:734;33972:799;34862:11;34826:19;34796:26;34806:16;34796:7;:26;:::i;:::-;34795:50;;;;:::i;:::-;34794:79;;;;:::i;:::-;34783:91;33575:1307;-1:-1:-1;;;;;;;;33575:1307:0:o;17871:407::-;18065:48;;;18031:19;4294:55:1;;;18065:48:0;;;4276:74:1;4366:18;;;;4359:34;;;18065:48:0;;;;;;;;;;4249:18:1;;;;18065:48:0;;;;;;;;;18088:12;18065:48;;;18031:93;;-1:-1:-1;;;;18031:19:0;;;;:93;;18065:48;18031:93;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17995:129;;;;18157:7;:57;;;;-1:-1:-1;18169:11:0;;:16;;:44;;;18200:4;18189:24;;;;;;;;;;;;:::i;:::-;18135:135;;;;;;;5307:2:1;18135:135:0;;;5289:21:1;5346:2;5326:18;;;5319:30;5385;5365:18;;;5358:58;5433:18;;18135:135:0;5105:352:1;18135:135:0;17984:294;;17871:407;;;:::o;18601:449::-;18822:59;;;18788:19;3980:15:1;;;18822:59:0;;;3962:34:1;4032:15;;;4012:18;;;4005:43;4064:18;;;;4057:34;;;18822:59:0;;;;;;;;;;3874:18:1;;;;18822:59:0;;;;;;;;;18845:17;18822:59;;;18788:104;;-1:-1:-1;;;;18788:19:0;;;;:104;;18822:59;18788:104;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18752:140;;;;18925:7;:57;;;;-1:-1:-1;18937:11:0;;:16;;:44;;;18968:4;18957:24;;;;;;;;;;;;:::i;:::-;18903:139;;;;;;;9615:2:1;18903:139:0;;;9597:21:1;;;9634:18;;;9627:30;9693:34;9673:18;;;9666:62;9745:18;;18903:139:0;9413:356:1;18903:139:0;18741:309;;18601:449;;;;:::o;34890:740::-;35004:7;35062:20;;;:14;:20;;;;;;;;35029:53;;;;;;;;;;;;;;;;;35004:7;;;;35029:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35093:21:0;35117:14;;;:8;:14;;;;;35156:17;;35029:53;;-1:-1:-1;35117:14:0;35156:17;-1:-1:-1;35188:8:0;35184:49;;35220:1;35213:8;;;;;;;35184:49;35248:9;35243:242;35267:3;35263:1;:7;35243:242;;;35315:10;35326:1;35315:13;;;;;;;;:::i;:::-;;;;;;;:26;;;35296:15;:45;35292:181;;35458:15;;35418:4;:15;;;35389:10;35400:1;35389:13;;;;;;;;:::i;:::-;;;;;;;:26;;;:44;;;;:::i;:::-;35388:85;;;;:::i;:::-;35360:113;;;;;;;;35292:181;35272:3;;;:::i;:::-;;;35243:242;;;-1:-1:-1;35621:1:0;;34890:740;-1:-1:-1;;;;;;34890:740:0:o;31103:192::-;31168:7;:14;31151;31193:95;31221:6;31215:3;:12;31193:95;;;31251:25;31263:7;31271:3;31263:12;;;;;;;;:::i;:::-;;;;;;;;;31251:11;:25::i;:::-;-1:-1:-1;31229:5:0;;;:::i;:::-;;;31193:95;;;;31140:155;31103:192::o;10622:173::-;10678:16;10697:6;;;10714:17;;;;;;;;;;10747:40;;10697:6;;;;;;;10747:40;;10678:16;10747:40;10667:128;10622:173;:::o;26353:661::-;26462:7;26520:20;;;:14;:20;;;;;;;;26487:53;;;;;;;;;;;;;;;;;26462:7;;;;26487:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26565:17:0;;26487:53;;-1:-1:-1;;;26597:8:0;26593:49;;26629:1;26622:8;;;;;;26593:49;26657:9;26652:157;26676:3;26672:1;:7;26652:157;;;26719:10;26730:1;26719:13;;;;;;;;:::i;:::-;;;;;;;:26;;;26705:10;:40;26701:96;;26771:10;26782:1;26771:13;;;;;;;;:::i;:::-;;;;;;;:26;;;26764:33;;;;;;;26701:96;26681:3;;;:::i;:::-;;;26652:157;;;-1:-1:-1;26974:10:0;26985:7;26991:1;26985:3;:7;:::i;:::-;26974:19;;;;;;;;:::i;:::-;;;;;;;:32;;;26967:39;;;;26353: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;12267:128::-;12307:3;12338:1;12334:6;12331:1;12328:13;12325:39;;;12344:18;;:::i;:::-;-1:-1:-1;12380:9:1;;12267:128::o;12400:274::-;12440:1;12466;12456:189;;12501:77;12498:1;12491:88;12602:4;12599:1;12592:15;12630:4;12627:1;12620:15;12456:189;-1:-1:-1;12659:9:1;;12400:274::o;12679:228::-;12719:7;12845:1;12777:66;12773:74;12770:1;12767:81;12762:1;12755:9;12748:17;12744:105;12741:131;;;12852:18;;:::i;:::-;-1:-1:-1;12892:9:1;;12679:228::o;12912:125::-;12952:4;12980:1;12977;12974:8;12971:34;;;12985:18;;:::i;:::-;-1:-1:-1;13022:9:1;;12912:125::o;13042:195::-;13081:3;13112:66;13105:5;13102:77;13099:103;;;13182:18;;:::i;:::-;-1:-1:-1;13229:1:1;13218:13;;13042:195::o;13242:184::-;13294:77;13291:1;13284:88;13391:4;13388:1;13381:15;13415:4;13412:1;13405:15;13431:184;13483:77;13480:1;13473:88;13580:4;13577:1;13570:15;13604:4;13601:1;13594:15
Swarm Source
ipfs://0614704b67aeb4c5987ffc3b820df22c5aaa46d2f76fb8a0d0fb1d41db157846
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$4,243.26
Net Worth in MOVR
Token Allocations
USDC
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| MOVR | 100.00% | $0.999738 | 4,244.3736 | $4,243.26 |
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.