Source Code
Latest 25 from a total of 40 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer Ownersh... | 266660 | 1463 days ago | IN | 0 GLMR | 0.0026057 | ||||
| Add | 266639 | 1463 days ago | IN | 0 GLMR | 0.0250891 | ||||
| Add | 266624 | 1463 days ago | IN | 0 GLMR | 0.0247376 | ||||
| Add | 266608 | 1463 days ago | IN | 0 GLMR | 0.0243861 | ||||
| Add | 266592 | 1463 days ago | IN | 0 GLMR | 0.0240346 | ||||
| Add | 266576 | 1463 days ago | IN | 0 GLMR | 0.0236831 | ||||
| Add | 266560 | 1463 days ago | IN | 0 GLMR | 0.0233316 | ||||
| Add | 266544 | 1463 days ago | IN | 0 GLMR | 0.0229801 | ||||
| Add | 266528 | 1463 days ago | IN | 0 GLMR | 0.0226286 | ||||
| Add | 266512 | 1463 days ago | IN | 0 GLMR | 0.0222771 | ||||
| Add | 266496 | 1463 days ago | IN | 0 GLMR | 0.0219256 | ||||
| Add | 266480 | 1463 days ago | IN | 0 GLMR | 0.0215741 | ||||
| Add | 266464 | 1463 days ago | IN | 0 GLMR | 0.0212226 | ||||
| Add | 266448 | 1463 days ago | IN | 0 GLMR | 0.0208711 | ||||
| Add | 266432 | 1463 days ago | IN | 0 GLMR | 0.0205196 | ||||
| Add | 266416 | 1463 days ago | IN | 0 GLMR | 0.0201681 | ||||
| Add | 266401 | 1463 days ago | IN | 0 GLMR | 0.0198166 | ||||
| Add | 266386 | 1463 days ago | IN | 0 GLMR | 0.0194651 | ||||
| Add | 266370 | 1463 days ago | IN | 0 GLMR | 0.0191136 | ||||
| Add | 266354 | 1463 days ago | IN | 0 GLMR | 0.0187621 | ||||
| Add | 266339 | 1463 days ago | IN | 0 GLMR | 0.0184106 | ||||
| Add | 266325 | 1463 days ago | IN | 0 GLMR | 0.0180591 | ||||
| Add | 266309 | 1463 days ago | IN | 0 GLMR | 0.0177076 | ||||
| Add | 266295 | 1463 days ago | IN | 0 GLMR | 0.0173561 | ||||
| Add | 266279 | 1463 days ago | IN | 0 GLMR | 0.0170046 |
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Loading...
Loading
Contract Name:
MasterChef
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "./interfaces/IComplexRewarder.sol";
import "./libraries/BoringERC20.sol";
import "../uniswapv2/interfaces/IUniswapV2Pair.sol";
contract MasterChef is Ownable, ReentrancyGuard {
using BoringERC20 for IBoringERC20;
// Info of each user.
struct UserInfo {
uint256 amount; // How many LP tokens the user has provided.
uint256 rewardDebt; // Reward debt. See explanation below.
uint256 rewardLockedUp; // Reward locked up.
uint256 nextHarvestUntil; // When can the user harvest again.
}
// Info of each pool.
struct PoolInfo {
IBoringERC20 lpToken; // Address of LP token contract.
uint256 allocPoint; // How many allocation points assigned to this pool. Nova to distribute per block.
uint256 lastRewardTimestamp; // Last block number that Nova distribution occurs.
uint256 accNovaPerShare; // Accumulated Nova per share, times 1e18. See below.
uint16 depositFeeBP; // Deposit fee in basis points
uint256 harvestInterval; // Harvest interval in seconds
uint256 totalLp; // Total token in Pool
IComplexRewarder[] rewarders; // Array of rewarder contract for pools with incentives
}
IBoringERC20 public nova;
// Nova tokens created per second
uint256 public novaPerSec;
// Max harvest interval: 14 days
uint256 public constant MAXIMUM_HARVEST_INTERVAL = 14 days;
// Maximum deposit fee rate: 10%
uint16 public constant MAXIMUM_DEPOSIT_FEE_RATE = 1000;
// Info of each pool
PoolInfo[] public poolInfo;
// Info of each user that stakes LP tokens.
mapping(uint256 => mapping(address => UserInfo)) public userInfo;
// Total allocation points. Must be the sum of all allocation points in all pools.
uint256 public totalAllocPoint = 0;
// The timestamp when Nova mining starts.
uint256 public startTimestamp;
// Total locked up rewards
uint256 public totalLockedUpRewards;
// Total Nova in Nova Pools (can be multiple pools)
uint256 public totalNovaInPools = 0;
// Team address.
address public teamAddress;
// Treasury address.
address public treasuryAddress;
// Investor address.
address public investorAddress;
// Percentage of pool rewards that goto the team.
uint256 public teamPercent;
// Percentage of pool rewards that goes to the treasury.
uint256 public treasuryPercent;
// Percentage of pool rewards that goes to the investor.
uint256 public investorPercent;
// The precision factor
uint256 private immutable ACC_TOKEN_PRECISION = 1e12;
modifier validatePoolByPid(uint256 _pid) {
require(_pid < poolInfo.length, "Pool does not exist");
_;
}
event Add(
uint256 indexed pid,
uint256 allocPoint,
IBoringERC20 indexed lpToken,
uint16 depositFeeBP,
uint256 harvestInterval,
IComplexRewarder[] indexed rewarders
);
event Set(
uint256 indexed pid,
uint256 allocPoint,
uint16 depositFeeBP,
uint256 harvestInterval,
IComplexRewarder[] indexed rewarders
);
event UpdatePool(
uint256 indexed pid,
uint256 lastRewardTimestamp,
uint256 lpSupply,
uint256 accNovaPerShare
);
event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
event EmergencyWithdraw(
address indexed user,
uint256 indexed pid,
uint256 amount
);
event EmissionRateUpdated(
address indexed caller,
uint256 previousValue,
uint256 newValue
);
event RewardLockedUp(
address indexed user,
uint256 indexed pid,
uint256 amountLockedUp
);
event AllocPointsUpdated(
address indexed caller,
uint256 previousAmount,
uint256 newAmount
);
event SetTeamAddress(
address indexed oldAddress,
address indexed newAddress
);
event SetTreasuryAddress(
address indexed oldAddress,
address indexed newAddress
);
event SetInvestorAddress(
address indexed oldAddress,
address indexed newAddress
);
event SetTeamPercent(uint256 oldPercent, uint256 newPercent);
event SetTreasuryPercent(uint256 oldPercent, uint256 newPercent);
event SetInvestorPercent(uint256 oldPercent, uint256 newPercent);
constructor(
IBoringERC20 _nova,
uint256 _novaPerSec,
address _teamAddress,
address _treasuryAddress,
address _investorAddress,
uint256 _teamPercent,
uint256 _treasuryPercent,
uint256 _investorPercent
) {
require(
_teamPercent <= 1000,
"constructor: invalid team percent value"
);
require(
_treasuryPercent <= 1000,
"constructor: invalid treasury percent value"
);
require(
_investorPercent <= 1000,
"constructor: invalid investor percent value"
);
require(
_teamPercent + _treasuryPercent + _investorPercent <= 1000,
"constructor: total percent over max"
);
//StartBlock always many years later from contract const ruct, will be set later in StartFarming function
startTimestamp = block.timestamp + (60 * 60 * 24 * 365);
nova = _nova;
novaPerSec = _novaPerSec;
teamAddress = _teamAddress;
treasuryAddress = _treasuryAddress;
investorAddress = _investorAddress;
teamPercent = _teamPercent;
treasuryPercent = _treasuryPercent;
investorPercent = _investorPercent;
}
// Set farming start, can call only once
function startFarming() public onlyOwner {
require(
block.timestamp < startTimestamp,
"start farming: farm started already"
);
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
PoolInfo storage pool = poolInfo[pid];
pool.lastRewardTimestamp = block.timestamp;
}
startTimestamp = block.timestamp;
}
function poolLength() external view returns (uint256) {
return poolInfo.length;
}
// Add a new lp to the pool. Can only be called by the owner.
// Can add multiple pool with same lp token without messing up rewards, because each pool's balance is tracked using its own totalLp
function add(
uint256 _allocPoint,
IBoringERC20 _lpToken,
uint16 _depositFeeBP,
uint256 _harvestInterval,
IComplexRewarder[] calldata _rewarders
) public onlyOwner {
require(_rewarders.length <= 10, "add: too many rewarders");
require(
_depositFeeBP <= MAXIMUM_DEPOSIT_FEE_RATE,
"add: deposit fee too high"
);
require(
_harvestInterval <= MAXIMUM_HARVEST_INTERVAL,
"add: invalid harvest interval"
);
require(
Address.isContract(address(_lpToken)),
"add: LP token must be a valid contract"
);
for (
uint256 rewarderId = 0;
rewarderId < _rewarders.length;
++rewarderId
) {
require(
Address.isContract(address(_rewarders[rewarderId])),
"add: rewarder must be contract"
);
}
_massUpdatePools();
uint256 lastRewardTimestamp = block.timestamp > startTimestamp
? block.timestamp
: startTimestamp;
totalAllocPoint += _allocPoint;
poolInfo.push(
PoolInfo({
lpToken: _lpToken,
allocPoint: _allocPoint,
lastRewardTimestamp: lastRewardTimestamp,
accNovaPerShare: 0,
depositFeeBP: _depositFeeBP,
harvestInterval: _harvestInterval,
totalLp: 0,
rewarders: _rewarders
})
);
emit Add(
poolInfo.length - 1,
_allocPoint,
_lpToken,
_depositFeeBP,
_harvestInterval,
_rewarders
);
}
// Update the given pool's Nova allocation point and deposit fee. Can only be called by the owner.
function set(
uint256 _pid,
uint256 _allocPoint,
uint16 _depositFeeBP,
uint256 _harvestInterval,
IComplexRewarder[] calldata _rewarders
) public onlyOwner validatePoolByPid(_pid) {
require(_rewarders.length <= 10, "set: too many rewarders");
require(
_depositFeeBP <= MAXIMUM_DEPOSIT_FEE_RATE,
"set: deposit fee too high"
);
require(
_harvestInterval <= MAXIMUM_HARVEST_INTERVAL,
"set: invalid harvest interval"
);
for (
uint256 rewarderId = 0;
rewarderId < _rewarders.length;
++rewarderId
) {
require(
Address.isContract(address(_rewarders[rewarderId])),
"set: rewarder must be contract"
);
}
_massUpdatePools();
totalAllocPoint =
totalAllocPoint -
poolInfo[_pid].allocPoint +
_allocPoint;
poolInfo[_pid].allocPoint = _allocPoint;
poolInfo[_pid].depositFeeBP = _depositFeeBP;
poolInfo[_pid].harvestInterval = _harvestInterval;
poolInfo[_pid].rewarders = _rewarders;
emit Set(
_pid,
_allocPoint,
_depositFeeBP,
_harvestInterval,
_rewarders
);
}
// View function to see pending rewards on frontend.
function pendingTokens(uint256 _pid, address _user)
external
view
validatePoolByPid(_pid)
returns (
address[] memory addresses,
string[] memory symbols,
uint256[] memory decimals,
uint256[] memory amounts
)
{
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint256 accNovaPerShare = pool.accNovaPerShare;
uint256 lpSupply = pool.totalLp;
if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) {
uint256 multiplier = block.timestamp - pool.lastRewardTimestamp;
uint256 total = 1000;
uint256 lpPercent = total -
teamPercent -
treasuryPercent -
investorPercent;
uint256 novaReward = (multiplier *
novaPerSec *
pool.allocPoint *
lpPercent) /
totalAllocPoint /
total;
accNovaPerShare += (
((novaReward * ACC_TOKEN_PRECISION) / lpSupply)
);
}
uint256 pendingNova = (((user.amount * accNovaPerShare) /
ACC_TOKEN_PRECISION) - user.rewardDebt) + user.rewardLockedUp;
addresses = new address[](pool.rewarders.length + 1);
symbols = new string[](pool.rewarders.length + 1);
amounts = new uint256[](pool.rewarders.length + 1);
decimals = new uint256[](pool.rewarders.length + 1);
addresses[0] = address(nova);
symbols[0] = IBoringERC20(nova).safeSymbol();
decimals[0] = IBoringERC20(nova).safeDecimals();
amounts[0] = pendingNova;
for (
uint256 rewarderId = 0;
rewarderId < pool.rewarders.length;
++rewarderId
) {
addresses[rewarderId + 1] = address(
pool.rewarders[rewarderId].rewardToken()
);
symbols[rewarderId + 1] = IBoringERC20(
pool.rewarders[rewarderId].rewardToken()
).safeSymbol();
decimals[rewarderId + 1] = IBoringERC20(
pool.rewarders[rewarderId].rewardToken()
).safeDecimals();
amounts[rewarderId + 1] = pool.rewarders[rewarderId].pendingTokens(
_pid,
_user
);
}
}
/// @notice View function to see pool rewards per sec
function poolRewardsPerSec(uint256 _pid)
external
view
validatePoolByPid(_pid)
returns (
address[] memory addresses,
string[] memory symbols,
uint256[] memory decimals,
uint256[] memory rewardsPerSec
)
{
PoolInfo storage pool = poolInfo[_pid];
addresses = new address[](pool.rewarders.length + 1);
symbols = new string[](pool.rewarders.length + 1);
decimals = new uint256[](pool.rewarders.length + 1);
rewardsPerSec = new uint256[](pool.rewarders.length + 1);
addresses[0] = address(nova);
symbols[0] = IBoringERC20(nova).safeSymbol();
decimals[0] = IBoringERC20(nova).safeDecimals();
uint256 total = 1000;
uint256 lpPercent = total -
teamPercent -
treasuryPercent -
investorPercent;
rewardsPerSec[0] =
(pool.allocPoint * novaPerSec * lpPercent) /
totalAllocPoint /
total;
for (
uint256 rewarderId = 0;
rewarderId < pool.rewarders.length;
++rewarderId
) {
addresses[rewarderId + 1] = address(
pool.rewarders[rewarderId].rewardToken()
);
symbols[rewarderId + 1] = IBoringERC20(
pool.rewarders[rewarderId].rewardToken()
).safeSymbol();
decimals[rewarderId + 1] = IBoringERC20(
pool.rewarders[rewarderId].rewardToken()
).safeDecimals();
rewardsPerSec[rewarderId + 1] = pool
.rewarders[rewarderId]
.poolRewardsPerSec(_pid);
}
}
// View function to see rewarders for a pool
function poolRewarders(uint256 _pid)
external
view
validatePoolByPid(_pid)
returns (address[] memory rewarders)
{
PoolInfo storage pool = poolInfo[_pid];
rewarders = new address[](pool.rewarders.length);
for (
uint256 rewarderId = 0;
rewarderId < pool.rewarders.length;
++rewarderId
) {
rewarders[rewarderId] = address(pool.rewarders[rewarderId]);
}
}
// View function to see if user can harvest Nova.
function canHarvest(uint256 _pid, address _user)
public
view
validatePoolByPid(_pid)
returns (bool)
{
UserInfo storage user = userInfo[_pid][_user];
return
block.timestamp >= startTimestamp &&
block.timestamp >= user.nextHarvestUntil;
}
// Update reward vairables for all pools. Be careful of gas spending!
function massUpdatePools() external nonReentrant {
_massUpdatePools();
}
// Internal method for massUpdatePools
function _massUpdatePools() internal {
for (uint256 pid = 0; pid < poolInfo.length; ++pid) {
_updatePool(pid);
}
}
// Update reward variables of the given pool to be up-to-date.
function updatePool(uint256 _pid) external nonReentrant {
_updatePool(_pid);
}
// Internal method for _updatePool
function _updatePool(uint256 _pid) internal validatePoolByPid(_pid) {
PoolInfo storage pool = poolInfo[_pid];
if (block.timestamp <= pool.lastRewardTimestamp) {
return;
}
uint256 lpSupply = pool.totalLp;
if (lpSupply == 0 || pool.allocPoint == 0) {
pool.lastRewardTimestamp = block.timestamp;
return;
}
uint256 multiplier = block.timestamp - pool.lastRewardTimestamp;
uint256 novaReward = ((multiplier * novaPerSec) * pool.allocPoint) /
totalAllocPoint;
uint256 total = 1000;
uint256 lpPercent = total -
teamPercent -
treasuryPercent -
investorPercent;
nova.mint(teamAddress, (novaReward * teamPercent) / total);
nova.mint(treasuryAddress, (novaReward * treasuryPercent) / total);
nova.mint(investorAddress, (novaReward * investorPercent) / total);
nova.mint(address(this), (novaReward * lpPercent) / total);
pool.accNovaPerShare +=
(novaReward * ACC_TOKEN_PRECISION * lpPercent) /
pool.totalLp /
total;
pool.lastRewardTimestamp = block.timestamp;
emit UpdatePool(
_pid,
pool.lastRewardTimestamp,
lpSupply,
pool.accNovaPerShare
);
}
function depositWithPermit(
uint256 pid,
uint256 amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public nonReentrant validatePoolByPid(pid) {
PoolInfo storage pool = poolInfo[pid];
IUniswapV2Pair pair = IUniswapV2Pair(address(pool.lpToken));
pair.permit(msg.sender, address(this), amount, deadline, v, r, s);
_deposit(pid, amount);
}
// Deposit tokens for Nova allocation.
function deposit(uint256 _pid, uint256 _amount) public nonReentrant {
_deposit(_pid, _amount);
}
// Deposit tokens for Nova allocation.
function _deposit(uint256 _pid, uint256 _amount)
internal
validatePoolByPid(_pid)
{
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
_updatePool(_pid);
payOrLockupPendingNova(_pid);
if (_amount > 0) {
uint256 beforeDeposit = pool.lpToken.balanceOf(address(this));
pool.lpToken.safeTransferFrom(msg.sender, address(this), _amount);
uint256 afterDeposit = pool.lpToken.balanceOf(address(this));
_amount = afterDeposit - beforeDeposit;
if (pool.depositFeeBP > 0) {
uint256 depositFee = (_amount * pool.depositFeeBP) / 10000;
pool.lpToken.safeTransfer(treasuryAddress, depositFee);
_amount = _amount - depositFee;
}
user.amount += _amount;
if (address(pool.lpToken) == address(nova)) {
totalNovaInPools += _amount;
}
}
user.rewardDebt =
(user.amount * pool.accNovaPerShare) /
ACC_TOKEN_PRECISION;
for (
uint256 rewarderId = 0;
rewarderId < pool.rewarders.length;
++rewarderId
) {
pool.rewarders[rewarderId].onNovaReward(
_pid,
msg.sender,
user.amount
);
}
if (_amount > 0) {
pool.totalLp += _amount;
}
emit Deposit(msg.sender, _pid, _amount);
}
//withdraw tokens
function withdraw(uint256 _pid, uint256 _amount)
public
nonReentrant
validatePoolByPid(_pid)
{
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
//this will make sure that user can only withdraw from his pool
require(user.amount >= _amount, "withdraw: user amount not enough");
//cannot withdraw more than pool's balance
require(pool.totalLp >= _amount, "withdraw: pool total not enough");
_updatePool(_pid);
payOrLockupPendingNova(_pid);
if (_amount > 0) {
user.amount -= _amount;
if (address(pool.lpToken) == address(nova)) {
totalNovaInPools -= _amount;
}
pool.lpToken.safeTransfer(msg.sender, _amount);
}
user.rewardDebt =
(user.amount * pool.accNovaPerShare) /
ACC_TOKEN_PRECISION;
for (
uint256 rewarderId = 0;
rewarderId < pool.rewarders.length;
++rewarderId
) {
pool.rewarders[rewarderId].onNovaReward(
_pid,
msg.sender,
user.amount
);
}
if (_amount > 0) {
pool.totalLp -= _amount;
}
emit Withdraw(msg.sender, _pid, _amount);
}
// Withdraw without caring about rewards. EMERGENCY ONLY.
function emergencyWithdraw(uint256 _pid) public nonReentrant {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
uint256 amount = user.amount;
//Cannot withdraw more than pool's balance
require(
pool.totalLp >= amount,
"emergency withdraw: pool total not enough"
);
user.amount = 0;
user.rewardDebt = 0;
user.rewardLockedUp = 0;
user.nextHarvestUntil = 0;
pool.totalLp -= amount;
for (
uint256 rewarderId = 0;
rewarderId < pool.rewarders.length;
++rewarderId
) {
pool.rewarders[rewarderId].onNovaReward(_pid, msg.sender, 0);
}
if (address(pool.lpToken) == address(nova)) {
totalNovaInPools -= amount;
}
pool.lpToken.safeTransfer(msg.sender, amount);
emit EmergencyWithdraw(msg.sender, _pid, amount);
}
// Pay or lockup pending Nova.
function payOrLockupPendingNova(uint256 _pid) internal {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
if (user.nextHarvestUntil == 0 && block.timestamp >= startTimestamp) {
user.nextHarvestUntil = block.timestamp + pool.harvestInterval;
}
uint256 pending = ((user.amount * pool.accNovaPerShare) /
ACC_TOKEN_PRECISION) - user.rewardDebt;
if (canHarvest(_pid, msg.sender)) {
if (pending > 0 || user.rewardLockedUp > 0) {
uint256 pendingRewards = pending + user.rewardLockedUp;
// reset lockup
totalLockedUpRewards -= user.rewardLockedUp;
user.rewardLockedUp = 0;
user.nextHarvestUntil = block.timestamp + pool.harvestInterval;
// send rewards
safeNovaTransfer(msg.sender, pendingRewards);
}
} else if (pending > 0) {
totalLockedUpRewards += pending;
user.rewardLockedUp += pending;
emit RewardLockedUp(msg.sender, _pid, pending);
}
}
// Safe Nova transfer function, just in case if rounding error causes pool do not have enough Nova.
function safeNovaTransfer(address _to, uint256 _amount) internal {
if (nova.balanceOf(address(this)) > totalNovaInPools) {
//novaBal = total Nova in MasterChef - total Nova in Nova pools, this will make sure that MasterChef never transfer rewards from deposited Nova pools
uint256 novaBal = nova.balanceOf(address(this)) -
totalNovaInPools;
if (_amount >= novaBal) {
nova.safeTransfer(_to, novaBal);
} else if (_amount > 0) {
nova.safeTransfer(_to, _amount);
}
}
}
function updateEmissionRate(uint256 _novaPerSec) public onlyOwner {
_massUpdatePools();
emit EmissionRateUpdated(msg.sender, novaPerSec, _novaPerSec);
novaPerSec = _novaPerSec;
}
function updateAllocPoint(uint256 _pid, uint256 _allocPoint)
public
onlyOwner
{
_massUpdatePools();
emit AllocPointsUpdated(
msg.sender,
poolInfo[_pid].allocPoint,
_allocPoint
);
totalAllocPoint =
totalAllocPoint -
poolInfo[_pid].allocPoint +
_allocPoint;
poolInfo[_pid].allocPoint = _allocPoint;
}
function poolTotalLp(uint256 pid) external view returns (uint256) {
return poolInfo[pid].totalLp;
}
// Function to harvest many pools in a single transaction
function harvestMany(uint256[] calldata _pids) public nonReentrant {
require(_pids.length <= 30, "harvest many: too many pool ids");
for (uint256 index = 0; index < _pids.length; ++index) {
_deposit(_pids[index], 0);
}
}
// Update team address by the previous team address.
function setTeamAddress(address _teamAddress) public {
require(
msg.sender == teamAddress,
"set team address: only previous team address can call this method"
);
require(
_teamAddress != address(0),
"set team address: invalid new team address"
);
teamAddress = _teamAddress;
emit SetTeamAddress(msg.sender, _teamAddress);
}
function setTeamPercent(uint256 _newTeamPercent) public onlyOwner {
require(
_newTeamPercent <= 1000,
"set team percent: invalid percent value"
);
require(
treasuryPercent + _newTeamPercent + investorPercent <= 1000,
"set team percent: total percent over max"
);
emit SetTeamPercent(teamPercent, _newTeamPercent);
teamPercent = _newTeamPercent;
}
// Update treasury address by the previous treasury.
function setTreasuryAddress(address _treasuryAddress) public {
require(
msg.sender == treasuryAddress,
"set treasury address: only previous treasury address can call this method"
);
require(
_treasuryAddress != address(0),
"set treasury address: invalid new treasury address"
);
treasuryAddress = _treasuryAddress;
emit SetTreasuryAddress(msg.sender, _treasuryAddress);
}
function setTreasuryPercent(uint256 _newTreasuryPercent) public onlyOwner {
require(
_newTreasuryPercent <= 1000,
"set treasury percent: invalid percent value"
);
require(
teamPercent + _newTreasuryPercent + investorPercent <= 1000,
"set treasury percent: total percent over max"
);
emit SetTreasuryPercent(treasuryPercent, _newTreasuryPercent);
treasuryPercent = _newTreasuryPercent;
}
// Update the investor address by the previous investor.
function setInvestorAddress(address _investorAddress) public {
require(
msg.sender == investorAddress,
"set investor address: only previous investor can call this method"
);
require(
_investorAddress != address(0),
"set investor address: invalid new investor address"
);
investorAddress = _investorAddress;
emit SetInvestorAddress(msg.sender, _investorAddress);
}
function setInvestorPercent(uint256 _newInvestorPercent) public onlyOwner {
require(
_newInvestorPercent <= 1000,
"set investor percent: invalid percent value"
);
require(
teamPercent + _newInvestorPercent + treasuryPercent <= 1000,
"set investor percent: total percent over max"
);
emit SetInvestorPercent(investorPercent, _newInvestorPercent);
investorPercent = _newInvestorPercent;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_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);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @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;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
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;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./IBoringERC20.sol";
interface IComplexRewarder {
function onNovaReward(
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);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
// solhint-disable avoid-low-level-calls
import "../interfaces/IBoringERC20.sol";
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"
);
}
}// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.5.0;
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}{
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [],
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IBoringERC20","name":"_nova","type":"address"},{"internalType":"uint256","name":"_novaPerSec","type":"uint256"},{"internalType":"address","name":"_teamAddress","type":"address"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"address","name":"_investorAddress","type":"address"},{"internalType":"uint256","name":"_teamPercent","type":"uint256"},{"internalType":"uint256","name":"_treasuryPercent","type":"uint256"},{"internalType":"uint256","name":"_investorPercent","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":true,"internalType":"contract IBoringERC20","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"indexed":true,"internalType":"contract IComplexRewarder[]","name":"rewarders","type":"address[]"}],"name":"Add","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"AllocPointsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"previousValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"EmissionRateUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountLockedUp","type":"uint256"}],"name":"RewardLockedUp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"indexed":false,"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"indexed":true,"internalType":"contract IComplexRewarder[]","name":"rewarders","type":"address[]"}],"name":"Set","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetInvestorAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"SetInvestorPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetTeamAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"SetTeamPercent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetTreasuryAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldPercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPercent","type":"uint256"}],"name":"SetTreasuryPercent","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":"accNovaPerShare","type":"uint256"}],"name":"UpdatePool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"MAXIMUM_DEPOSIT_FEE_RATE","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_HARVEST_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IBoringERC20","name":"_lpToken","type":"address"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"contract IComplexRewarder[]","name":"_rewarders","type":"address[]"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"canHarvest","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"depositWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_pids","type":"uint256[]"}],"name":"harvestMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"investorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investorPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nova","outputs":[{"internalType":"contract IBoringERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"novaPerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"address[]","name":"addresses","type":"address[]"},{"internalType":"string[]","name":"symbols","type":"string[]"},{"internalType":"uint256[]","name":"decimals","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IBoringERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accNovaPerShare","type":"uint256"},{"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"internalType":"uint256","name":"totalLp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewarders","outputs":[{"internalType":"address[]","name":"rewarders","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"poolRewardsPerSec","outputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"string[]","name":"symbols","type":"string[]"},{"internalType":"uint256[]","name":"decimals","type":"uint256[]"},{"internalType":"uint256[]","name":"rewardsPerSec","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"poolTotalLp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"contract IComplexRewarder[]","name":"_rewarders","type":"address[]"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_investorAddress","type":"address"}],"name":"setInvestorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newInvestorPercent","type":"uint256"}],"name":"setInvestorPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_teamAddress","type":"address"}],"name":"setTeamAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTeamPercent","type":"uint256"}],"name":"setTeamPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newTreasuryPercent","type":"uint256"}],"name":"setTreasuryPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startFarming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockedUpRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNovaInPools","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":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryPercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"updateAllocPoint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_novaPerSec","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"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"},{"internalType":"uint256","name":"rewardLockedUp","type":"uint256"},{"internalType":"uint256","name":"nextHarvestUntil","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a06040526000600681905560095564e8d4a510006080523480156200002457600080fd5b50604051620050a0380380620050a08339810160408190526200004791620001e1565b6200005b620000556200018d565b62000191565b600180556103e88311156200008d5760405162461bcd60e51b81526004016200008490620002ba565b60405180910390fd5b6103e8821115620000b25760405162461bcd60e51b815260040162000084906200026f565b6103e8811115620000d75760405162461bcd60e51b8152600401620000849062000344565b6103e881620000e784866200038f565b620000f391906200038f565b1115620001145760405162461bcd60e51b8152600401620000849062000301565b62000124426301e133806200038f565b600755600280546001600160a01b03199081166001600160a01b039a8b1617909155600397909755600a8054881696891696909617909555600b8054871694881694909417909355600c80549095169190951617909255600d92909255600e55600f55620003cd565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600080600080600080610100898b031215620001fe578384fd5b88516200020b81620003b4565b60208a015160408b015191995097506200022581620003b4565b60608a01519096506200023881620003b4565b60808a01519095506200024b81620003b4565b60a08a015160c08b015160e0909b0151999c989b5096999598909790945092505050565b6020808252602b908201527f636f6e7374727563746f723a20696e76616c696420747265617375727920706560408201526a7263656e742076616c756560a81b606082015260800190565b60208082526027908201527f636f6e7374727563746f723a20696e76616c6964207465616d2070657263656e604082015266742076616c756560c81b606082015260800190565b60208082526023908201527f636f6e7374727563746f723a20746f74616c2070657263656e74206f766572206040820152620dac2f60eb1b606082015260800190565b6020808252602b908201527f636f6e7374727563746f723a20696e76616c696420696e766573746f7220706560408201526a7263656e742076616c756560a81b606082015260800190565b60008219821115620003af57634e487b7160e01b81526011600452602481fd5b500190565b6001600160a01b0381168114620003ca57600080fd5b50565b608051614c946200040c60003960008181610be101528181612583015281816125d101528181612eaf01528181612fdf01526135f80152614c946000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c8063630b5ba111610151578063afbcfea1116100c3578063e2bbb15811610087578063e2bbb158146104d9578063e6fd48bc146104ec578063eddf9652146104f4578063eff8976b14610507578063f2fde38b14610527578063ffcd42631461053a57610269565b8063afbcfea1146104a6578063c5f956af146104ae578063dc640ac9146104b6578063de73149d146104c9578063e164ac50146104d157610269565b8063812c64f111610115578063812c64f11461042d578063876d3c9c1461044257806389a2bc25146104555780638da5cb5b1461046857806393f1a40b14610470578063949e63021461049357610269565b8063630b5ba1146103e4578063654c9ece146103ec5780636605bfda146103ff5780636690864e14610412578063715018a61461042557610269565b8063214525c6116101ea578063474fa630116101ae578063474fa63014610388578063508593ab14610390578063515bc323146103a357806351eb05a6146103b65780635243e89c146103c95780635312ea8e146103d157610269565b8063214525c6146103175780632e6c998d1461031f57806342602f1e1461033f578063441a3e7014610352578063465e81ec1461036557610269565b80631526fe27116102315780631526fe27146102c657806317caf6f1146102ec5780631c75f085146102f45780631e5ba66c146102fc5780632081ccc41461030457610269565b806304ef9d581461026e5780630735b2081461028c578063081e3eda146102945780630ba84cd21461029c57806312e228fd146102b1575b600080fd5b61027661054d565b6040516102839190614aa1565b60405180910390f35b610276610553565b610276610559565b6102af6102aa366004613e2f565b61055f565b005b6102b96105f9565b6040516102839190614093565b6102d96102d4366004613e2f565b610608565b60405161028397969594939291906141f3565b610276610665565b6102b961066b565b6102b961067a565b6102af610312366004613f26565b610689565b61027661097d565b61033261032d366004613e5f565b610983565b60405161028391906141e8565b6102af61034d366004613cef565b6109ea565b6102af610360366004613f05565b610a86565b610378610373366004613e2f565b610d39565b6040516102839493929190614138565b610276611456565b6102af61039e366004613e8e565b61145c565b6102af6103b1366004613f55565b611757565b6102af6103c4366004613e2f565b61185e565b610276611896565b6102af6103df366004613e2f565b61189c565b6102af611ab1565b6102766103fa366004613e2f565b611ae7565b6102af61040d366004613cef565b611b24565b6102af610420366004613cef565b611bc0565b6102af611c5c565b610435611ca7565b6040516102839190614a92565b6102af610450366004613e2f565b611cad565b6102af610463366004613e2f565b611d8a565b6102b9611e67565b61048361047e366004613e5f565b611e76565b6040516102839493929190614b1e565b6102af6104a1366004613e2f565b611ea8565b6102af611f85565b6102b9612049565b6102af6104c4366004613d12565b612058565b6102766120f6565b6102766120fd565b6102af6104e7366004613f05565b612103565b61027661213d565b6102af610502366004613f05565b612143565b61051a610515366004613e2f565b61228b565b6040516102839190614125565b6102af610535366004613cef565b6123dd565b610378610548366004613e5f565b61244e565b600e5481565b600f5481565b60045490565b610567612b6d565b6001600160a01b0316610578611e67565b6001600160a01b0316146105a75760405162461bcd60e51b815260040161059e9061485e565b60405180910390fd5b6105af612b71565b336001600160a01b03167feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511600354836040516105ec929190614afa565b60405180910390a2600355565b600c546001600160a01b031681565b6004818154811061061857600080fd5b600091825260209091206008909102018054600182015460028301546003840154600485015460058601546006909601546001600160a01b03909516965092949193909261ffff16919087565b60065481565b600a546001600160a01b031681565b6002546001600160a01b031681565b610691612b6d565b6001600160a01b03166106a2611e67565b6001600160a01b0316146106c85760405162461bcd60e51b815260040161059e9061485e565b600454869081106106eb5760405162461bcd60e51b815260040161059e90614495565b600a82111561070c5760405162461bcd60e51b815260040161059e906142f2565b6103e861ffff861611156107325760405162461bcd60e51b815260040161059e90614232565b621275008411156107555760405162461bcd60e51b815260040161059e90614893565b60005b828110156107c95761079d84848381811061078357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906107989190613cef565b612b97565b6107b95760405162461bcd60e51b815260040161059e9061445e565b6107c281614bd3565b9050610758565b506107d2612b71565b85600488815481106107f457634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201600101546006546108139190614b90565b61081d9190614b39565b600681905550856004888154811061084557634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020160010181905550846004888154811061087c57634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020160040160006101000a81548161ffff021916908361ffff16021790555083600488815481106108c957634e487b7160e01b600052603260045260246000fd5b90600052602060002090600802016005018190555082826004898154811061090157634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201600701919061091f929190613bc8565b508282604051610930929190614035565b6040518091039020877f5ed6f0deef9ab49d02900b40d596df4cd637a2a7fbfa56bbcb377389d3ce8d2888888860405161096c93929190614ae0565b60405180910390a350505050505050565b60035481565b600454600090839081106109a95760405162461bcd60e51b815260040161059e90614495565b60008481526005602090815260408083206001600160a01b0387168452909152902060075442108015906109e1575080600301544210155b95945050505050565b600c546001600160a01b03163314610a145760405162461bcd60e51b815260040161059e90614543565b6001600160a01b038116610a3a5760405162461bcd60e51b815260040161059e90614269565b600c80546001600160a01b0319166001600160a01b03831690811790915560405133907f6260cb34f06b782e83bde168f7d74ab2133041cb53b63ce22b127822a92b679190600090a350565b60026001541415610aa95760405162461bcd60e51b815260040161059e906149c4565b600260015560045482908110610ad15760405162461bcd60e51b815260040161059e90614495565b600060048481548110610af457634e487b7160e01b600052603260045260246000fd5b600091825260208083208784526005825260408085203386529092529220805460089092029092019250841115610b3d5760405162461bcd60e51b815260040161059e9061450e565b8382600601541015610b615760405162461bcd60e51b815260040161059e906143dd565b610b6a85612b9d565b610b7385612f5d565b8315610bd85783816000016000828254610b8d9190614b90565b909155505060025482546001600160a01b0390811691161415610bc2578360096000828254610bbc9190614b90565b90915550505b8154610bd8906001600160a01b03163386613125565b600382015481547f000000000000000000000000000000000000000000000000000000000000000091610c0a91614b71565b610c149190614b51565b600182015560005b6007830154811015610ccb57826007018181548110610c4b57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001548254604051635f67b06560e01b81526001600160a01b0390921691635f67b06591610c88918a913391600401614ac1565b600060405180830381600087803b158015610ca257600080fd5b505af1158015610cb6573d6000803e3d6000fd5b5050505080610cc490614bd3565b9050610c1c565b508315610cec5783826006016000828254610ce69190614b90565b90915550505b84336001600160a01b03167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56886604051610d269190614aa1565b60405180910390a3505060018055505050565b606080606080846004805490508110610d645760405162461bcd60e51b815260040161059e90614495565b600060048781548110610d8757634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201905080600701805490506001610dab9190614b39565b6001600160401b03811115610dd057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610df9578160200160208202803683370190505b506007820154909650610e0d906001614b39565b6001600160401b03811115610e3257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e6557816020015b6060815260200190600190039081610e505790505b506007820154909550610e79906001614b39565b6001600160401b03811115610e9e57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610ec7578160200160208202803683370190505b506007820154909450610edb906001614b39565b6001600160401b03811115610f0057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610f29578160200160208202803683370190505b5060025487519194506001600160a01b0316908790600090610f5b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600254610f7e911661321a565b85600081518110610f9f57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152600254610fbf906001600160a01b03166132dd565b60ff1684600081518110610fe357634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060006103e890506000600f54600e54600d548461100c9190614b90565b6110169190614b90565b6110209190614b90565b9050816006548260035486600101546110399190614b71565b6110439190614b71565b61104d9190614b51565b6110579190614b51565b8560008151811061107857634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060005b600784015481101561144a578360070181815481106110b657634e487b7160e01b600052603260045260246000fd5b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c192600480840193829003018186803b1580156110ff57600080fd5b505afa158015611113573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111379190613d71565b89611143836001614b39565b8151811061116157634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250506112368460070182815481106111a757634e487b7160e01b600052603260045260246000fd5b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c192600480840193829003018186803b1580156111f057600080fd5b505afa158015611204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112289190613d71565b6001600160a01b031661321a565b88611242836001614b39565b8151811061126057634e487b7160e01b600052603260045260246000fd5b602002602001018190525061132084600701828154811061129157634e487b7160e01b600052603260045260246000fd5b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c192600480840193829003018186803b1580156112da57600080fd5b505afa1580156112ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113129190613d71565b6001600160a01b03166132dd565b60ff168761132f836001614b39565b8151811061134d57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505083600701818154811061137c57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154604051631197a07b60e21b81526001600160a01b039091169063465e81ec906113b5908d90600401614aa1565b60206040518083038186803b1580156113cd57600080fd5b505afa1580156113e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114059190613e47565b86611411836001614b39565b8151811061142f57634e487b7160e01b600052603260045260246000fd5b602090810291909101015261144381614bd3565b9050611087565b50505050509193509193565b60085481565b611464612b6d565b6001600160a01b0316611475611e67565b6001600160a01b03161461149b5760405162461bcd60e51b815260040161059e9061485e565b600a8111156114bc5760405162461bcd60e51b815260040161059e906145aa565b6103e861ffff851611156114e25760405162461bcd60e51b815260040161059e9061498d565b621275008311156115055760405162461bcd60e51b815260040161059e906143a6565b61150e85612b97565b61152a5760405162461bcd60e51b815260040161059e906148ca565b60005b818110156115845761155883838381811061078357634e487b7160e01b600052603260045260246000fd5b6115745760405162461bcd60e51b815260040161059e906145e1565b61157d81614bd3565b905061152d565b5061158d612b71565b600060075442116115a0576007546115a2565b425b905086600660008282546115b69190614b39565b925050819055506004604051806101000160405280886001600160a01b03168152602001898152602001838152602001600081526020018761ffff168152602001868152602001600081526020018585808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250939094525050835460018082018655948252602091829020845160089092020180546001600160a01b0319166001600160a01b0390921691909117815583820151948101949094556040830151600285015560608301516003850155608083015160048501805461ffff191661ffff90921691909117905560a0830151600585015560c0830151600685015560e083015180519394936116dd935060078501929190910190613c2b565b50505082826040516116f0929190614035565b6040519081900390206004546001600160a01b0388169061171390600190614b90565b7f5ed295c4f5af5aeb1ccd905e1cd55a86ab3bb9fc1fe2346ff64ac47dbef366618a898960405161174693929190614ae0565b60405180910390a450505050505050565b6002600154141561177a5760405162461bcd60e51b815260040161059e906149c4565b6002600155600454869081106117a25760405162461bcd60e51b815260040161059e90614495565b6000600488815481106117c557634e487b7160e01b600052603260045260246000fd5b60009182526020909120600890910201805460405163d505accf60e01b81529192506001600160a01b031690819063d505accf9061181390339030908d908d908d908d908d906004016140cb565b600060405180830381600087803b15801561182d57600080fd5b505af1158015611841573d6000803e3d6000fd5b5050505061184f8989613395565b50506001805550505050505050565b600260015414156118815760405162461bcd60e51b815260040161059e906149c4565b600260015561188f81612b9d565b5060018055565b60095481565b600260015414156118bf5760405162461bcd60e51b815260040161059e906149c4565b60026001819055506000600482815481106118ea57634e487b7160e01b600052603260045260246000fd5b6000918252602080832085845260058252604080852033865290925292208054600892909202909201600681015490935081111561193a5760405162461bcd60e51b815260040161059e90614618565b6000808355600183018190556002830181905560038301819055600684018054839290611968908490614b90565b90915550600090505b6007840154811015611a1e578360070181815481106119a057634e487b7160e01b600052603260045260246000fd5b6000918252602082200154604051635f67b06560e01b81526001600160a01b0390911691635f67b065916119db918991339190600401614ac1565b600060405180830381600087803b1580156119f557600080fd5b505af1158015611a09573d6000803e3d6000fd5b5050505080611a1790614bd3565b9050611971565b5060025483546001600160a01b0390811691161415611a4f578060096000828254611a499190614b90565b90915550505b8254611a65906001600160a01b03163383613125565b83336001600160a01b03167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583604051611a9f9190614aa1565b60405180910390a35050600180555050565b60026001541415611ad45760405162461bcd60e51b815260040161059e906149c4565b6002600155611ae1612b71565b60018055565b600060048281548110611b0a57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600802016006015490505b919050565b600b546001600160a01b03163314611b4e5760405162461bcd60e51b815260040161059e906147a8565b6001600160a01b038116611b745760405162461bcd60e51b815260040161059e90614661565b600b80546001600160a01b0319166001600160a01b03831690811790915560405133907f61885cdba916be748ff3e3f6f15e4206153b8ea3b7acabade9d04b4063a8351090600090a350565b600a546001600160a01b03163314611bea5760405162461bcd60e51b815260040161059e90614741565b6001600160a01b038116611c105760405162461bcd60e51b815260040161059e90614414565b600a80546001600160a01b0319166001600160a01b03831690811790915560405133907f42fbc17d847fdc3e5c82da842a5ef3979c64f3b94cd4e7382310fd5525c6ee0f90600090a350565b611c64612b6d565b6001600160a01b0316611c75611e67565b6001600160a01b031614611c9b5760405162461bcd60e51b815260040161059e9061485e565b611ca5600061374c565b565b6103e881565b611cb5612b6d565b6001600160a01b0316611cc6611e67565b6001600160a01b031614611cec5760405162461bcd60e51b815260040161059e9061485e565b6103e8811115611d0e5760405162461bcd60e51b815260040161059e906149fb565b6103e8600e5482600d54611d229190614b39565b611d2c9190614b39565b1115611d4a5760405162461bcd60e51b815260040161059e906144c2565b7f905b464403a98b455243c8b4d30c545b8fbd70cda670142b9326425b2c039f3b600f5482604051611d7d929190614afa565b60405180910390a1600f55565b611d92612b6d565b6001600160a01b0316611da3611e67565b6001600160a01b031614611dc95760405162461bcd60e51b815260040161059e9061485e565b6103e8811115611deb5760405162461bcd60e51b815260040161059e906146f6565b6103e8600f5482600d54611dff9190614b39565b611e099190614b39565b1115611e275760405162461bcd60e51b815260040161059e90614a46565b7fa565895c0101fca10e6a7b85742e56cf52ac5f58b09ce030425d3555b47069fd600e5482604051611e5a929190614afa565b60405180910390a1600e55565b6000546001600160a01b031690565b600560209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b611eb0612b6d565b6001600160a01b0316611ec1611e67565b6001600160a01b031614611ee75760405162461bcd60e51b815260040161059e9061485e565b6103e8811115611f095760405162461bcd60e51b815260040161059e90614817565b6103e8600f5482600e54611f1d9190614b39565b611f279190614b39565b1115611f455760405162461bcd60e51b815260040161059e90614910565b7f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6600d5482604051611f78929190614afa565b60405180910390a1600d55565b611f8d612b6d565b6001600160a01b0316611f9e611e67565b6001600160a01b031614611fc45760405162461bcd60e51b815260040161059e9061485e565b6007544210611fe55760405162461bcd60e51b815260040161059e906146b3565b60045460005b818110156120415760006004828154811061201657634e487b7160e01b600052603260045260246000fd5b90600052602060002090600802019050428160020181905550508061203a90614bd3565b9050611feb565b505042600755565b600b546001600160a01b031681565b6002600154141561207b5760405162461bcd60e51b815260040161059e906149c4565b6002600155601e8111156120a15760405162461bcd60e51b815260040161059e9061436f565b60005b818110156120ed576120dd8383838181106120cf57634e487b7160e01b600052603260045260246000fd5b905060200201356000613395565b6120e681614bd3565b90506120a4565b50506001805550565b6212750081565b600d5481565b600260015414156121265760405162461bcd60e51b815260040161059e906149c4565b60026001556121358282613395565b505060018055565b60075481565b61214b612b6d565b6001600160a01b031661215c611e67565b6001600160a01b0316146121825760405162461bcd60e51b815260040161059e9061485e565b61218a612b71565b336001600160a01b03167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef3600484815481106121d657634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020160010154836040516121f7929190614afa565b60405180910390a2806004838154811061222157634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201600101546006546122409190614b90565b61224a9190614b39565b600681905550806004838154811061227257634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201600101819055505050565b600454606090829081106122b15760405162461bcd60e51b815260040161059e90614495565b6000600484815481106122d457634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201905080600701805490506001600160401b0381111561231157634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50925060005b60078201548110156123d55781600701818154811061236f57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b03168482815181106123ad57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101526123ce81614bd3565b9050612340565b505050919050565b6123e5612b6d565b6001600160a01b03166123f6611e67565b6001600160a01b03161461241c5760405162461bcd60e51b815260040161059e9061485e565b6001600160a01b0381166124425760405162461bcd60e51b815260040161059e90614329565b61244b8161374c565b50565b6060806060808560048054905081106124795760405162461bcd60e51b815260040161059e90614495565b60006004888154811061249c57634e487b7160e01b600052603260045260246000fd5b600091825260208083208b84526005825260408085206001600160a01b038d16865290925292206003600890920290920190810154600682015460028301549294509091421180156124ed57508015155b156125c35760008460020154426125049190614b90565b905060006103e890506000600f54600e54600d54846125239190614b90565b61252d9190614b90565b6125379190614b90565b9050600082600654838a60010154600354886125539190614b71565b61255d9190614b71565b6125679190614b71565b6125719190614b51565b61257b9190614b51565b9050846125a87f000000000000000000000000000000000000000000000000000000000000000083614b71565b6125b29190614b51565b6125bc9087614b39565b9550505050505b6000836002015484600101547f00000000000000000000000000000000000000000000000000000000000000008587600001546126009190614b71565b61260a9190614b51565b6126149190614b90565b61261e9190614b39565b6007860154909150612631906001614b39565b6001600160401b0381111561265657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561267f578160200160208202803683370190505b506007860154909a50612693906001614b39565b6001600160401b038111156126b857634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156126eb57816020015b60608152602001906001900390816126d65790505b5060078601549099506126ff906001614b39565b6001600160401b0381111561272457634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561274d578160200160208202803683370190505b506007860154909750612761906001614b39565b6001600160401b0381111561278657634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156127af578160200160208202803683370190505b506002548b519199506001600160a01b0316908b906000906127e157634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600254612804911661321a565b8960008151811061282557634e487b7160e01b600052603260045260246000fd5b6020908102919091010152600254612845906001600160a01b03166132dd565b60ff168860008151811061286957634e487b7160e01b600052603260045260246000fd5b602002602001018181525050808760008151811061289757634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060005b6007860154811015612b5d578560070181815481106128d557634e487b7160e01b600052603260045260246000fd5b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c192600480840193829003018186803b15801561291e57600080fd5b505afa158015612932573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129569190613d71565b8b612962836001614b39565b8151811061298057634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250506129c68660070182815481106111a757634e487b7160e01b600052603260045260246000fd5b8a6129d2836001614b39565b815181106129f057634e487b7160e01b600052603260045260246000fd5b6020026020010181905250612a2186600701828154811061129157634e487b7160e01b600052603260045260246000fd5b60ff1689612a30836001614b39565b81518110612a4e57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050856007018181548110612a7d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b031663ffcd42638e8e6040518363ffffffff1660e01b8152600401612ac8929190614aaa565b60206040518083038186803b158015612ae057600080fd5b505afa158015612af4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b189190613e47565b88612b24836001614b39565b81518110612b4257634e487b7160e01b600052603260045260246000fd5b6020908102919091010152612b5681614bd3565b90506128a6565b5050505050505092959194509250565b3390565b60005b60045481101561244b57612b8781612b9d565b612b9081614bd3565b9050612b74565b3b151590565b60045481908110612bc05760405162461bcd60e51b815260040161059e90614495565b600060048381548110612be357634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201905080600201544211612c045750612f59565b6006810154801580612c1857506001820154155b15612c2a575042600290910155612f59565b6000826002015442612c3c9190614b90565b90506000600654846001015460035484612c569190614b71565b612c609190614b71565b612c6a9190614b51565b905060006103e890506000600f54600e54600d5484612c899190614b90565b612c939190614b90565b612c9d9190614b90565b600254600a54600d549293506001600160a01b03918216926340c10f1992909116908590612ccb9088614b71565b612cd59190614b51565b6040518363ffffffff1660e01b8152600401612cf292919061410c565b600060405180830381600087803b158015612d0c57600080fd5b505af1158015612d20573d6000803e3d6000fd5b5050600254600b54600e546001600160a01b0392831694506340c10f1993509116908590612d4e9088614b71565b612d589190614b51565b6040518363ffffffff1660e01b8152600401612d7592919061410c565b600060405180830381600087803b158015612d8f57600080fd5b505af1158015612da3573d6000803e3d6000fd5b5050600254600c54600f546001600160a01b0392831694506340c10f1993509116908590612dd19088614b71565b612ddb9190614b51565b6040518363ffffffff1660e01b8152600401612df892919061410c565b600060405180830381600087803b158015612e1257600080fd5b505af1158015612e26573d6000803e3d6000fd5b50506002546001600160a01b031691506340c10f1990503084612e498588614b71565b612e539190614b51565b6040518363ffffffff1660e01b8152600401612e7092919061410c565b600060405180830381600087803b158015612e8a57600080fd5b505af1158015612e9e573d6000803e3d6000fd5b505050600687015483915082612ed47f000000000000000000000000000000000000000000000000000000000000000087614b71565b612ede9190614b71565b612ee89190614b51565b612ef29190614b51565b866003016000828254612f059190614b39565b9091555050426002870181905560038701546040518a927f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f4692612f4a928a9190614b08565b60405180910390a25050505050505b5050565b600060048281548110612f8057634e487b7160e01b600052603260045260246000fd5b600091825260208083208584526005825260408085203386529092529220600381015460089092029092019250158015612fbc57506007544210155b15612fd6576005820154612fd09042614b39565b60038201555b600081600101547f0000000000000000000000000000000000000000000000000000000000000000846003015484600001546130129190614b71565b61301c9190614b51565b6130269190614b90565b90506130328433610983565b156130aa57600081118061304a575060008260020154115b156130a55760008260020154826130619190614b39565b90508260020154600860008282546130799190614b90565b90915550506000600284015560058401546130949042614b39565b60038401556130a3338261379c565b505b61311f565b801561311f5780600860008282546130c29190614b39565b92505081905550808260020160008282546130dd9190614b39565b9091555050604051849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c190613116908590614aa1565b60405180910390a35b50505050565b600080846001600160a01b031663a9059cbb60e01b858560405160240161314d92919061410c565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161318b9190614077565b6000604051808303816000865af19150503d80600081146131c8576040519150601f19603f3d011682016040523d82523d6000602084013e6131cd565b606091505b50915091508180156131f75750805115806131f75750808060200190518101906131f79190613d51565b6132135760405162461bcd60e51b815260040161059e906142bb565b5050505050565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b038616916132619190614077565b600060405180830381855afa9150503d806000811461329c576040519150601f19603f3d011682016040523d82523d6000602084013e6132a1565b606091505b5091509150816132cc57604051806040016040528060038152602001623f3f3f60e81b8152506132d5565b6132d5816138fb565b949350505050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b038616916133239190614077565b600060405180830381855afa9150503d806000811461335e576040519150601f19603f3d011682016040523d82523d6000602084013e613363565b606091505b5091509150818015613376575080516020145b6133815760126132d5565b808060200190518101906132d59190613fa7565b600454829081106133b85760405162461bcd60e51b815260040161059e90614495565b6000600484815481106133db57634e487b7160e01b600052603260045260246000fd5b6000918252602080832087845260058252604080852033865290925292206008909102909101915061340c85612b9d565b61341585612f5d565b83156135ef5781546040516370a0823160e01b81526000916001600160a01b0316906370a082319061344b903090600401614093565b60206040518083038186803b15801561346357600080fd5b505afa158015613477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349b9190613e47565b83549091506134b5906001600160a01b0316333088613ad0565b82546040516370a0823160e01b81526000916001600160a01b0316906370a08231906134e5903090600401614093565b60206040518083038186803b1580156134fd57600080fd5b505afa158015613511573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135359190613e47565b90506135418282614b90565b600485015490965061ffff16156135a35760048401546000906127109061356c9061ffff1689614b71565b6135769190614b51565b600b548654919250613595916001600160a01b03908116911683613125565b61359f8188614b90565b9650505b858360000160008282546135b79190614b39565b909155505060025484546001600160a01b03908116911614156135ec5785600960008282546135e69190614b39565b90915550505b50505b600382015481547f00000000000000000000000000000000000000000000000000000000000000009161362191614b71565b61362b9190614b51565b600182015560005b60078301548110156136e25782600701818154811061366257634e487b7160e01b600052603260045260246000fd5b6000918252602090912001548254604051635f67b06560e01b81526001600160a01b0390921691635f67b0659161369f918a913391600401614ac1565b600060405180830381600087803b1580156136b957600080fd5b505af11580156136cd573d6000803e3d6000fd5b50505050806136db90614bd3565b9050613633565b50831561370357838260060160008282546136fd9190614b39565b90915550505b84336001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a158660405161373d9190614aa1565b60405180910390a35050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6009546002546040516370a0823160e01b81526001600160a01b03909116906370a08231906137cf903090600401614093565b60206040518083038186803b1580156137e757600080fd5b505afa1580156137fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061381f9190613e47565b1115612f59576009546002546040516370a0823160e01b8152600092916001600160a01b0316906370a082319061385a903090600401614093565b60206040518083038186803b15801561387257600080fd5b505afa158015613886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138aa9190613e47565b6138b49190614b90565b90508082106138d9576002546138d4906001600160a01b03168483613125565b6138f6565b81156138f6576002546138f6906001600160a01b03168484613125565b505050565b60606040825110613921578180602001905181019061391a9190613d8d565b9050611b1f565b815160201415613ab05760005b60208160ff161080156139715750828160ff168151811061395f57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191615155b15613988578061398081614bee565b91505061392e565b60008160ff166001600160401b038111156139b357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156139dd576020820181803683370190505b509050600091505b60208260ff16108015613a285750838260ff1681518110613a1657634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191615155b15613aa757838260ff1681518110613a5057634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b818360ff1681518110613a7e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535081613a9f81614bee565b9250506139e5565b9150611b1f9050565b506040805180820190915260038152623f3f3f60e81b6020820152611b1f565b600080856001600160a01b03166323b872dd60e01b868686604051602401613afa939291906140a7565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051613b389190614077565b6000604051808303816000865af19150503d8060008114613b75576040519150601f19603f3d011682016040523d82523d6000602084013e613b7a565b606091505b5091509150818015613ba4575080511580613ba4575080806020019051810190613ba49190613d51565b613bc05760405162461bcd60e51b815260040161059e90614958565b505050505050565b828054828255906000526020600020908101928215613c1b579160200282015b82811115613c1b5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613be8565b50613c27929150613c80565b5090565b828054828255906000526020600020908101928215613c1b579160200282015b82811115613c1b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613c4b565b5b80821115613c275760008155600101613c81565b60008083601f840112613ca6578081fd5b5081356001600160401b03811115613cbc578182fd5b6020830191508360208083028501011115613cd657600080fd5b9250929050565b803561ffff81168114611b1f57600080fd5b600060208284031215613d00578081fd5b8135613d0b81614c3a565b9392505050565b60008060208385031215613d24578081fd5b82356001600160401b03811115613d39578182fd5b613d4585828601613c95565b90969095509350505050565b600060208284031215613d62578081fd5b81518015158114613d0b578182fd5b600060208284031215613d82578081fd5b8151613d0b81614c3a565b600060208284031215613d9e578081fd5b81516001600160401b0380821115613db4578283fd5b818401915084601f830112613dc7578283fd5b815181811115613dd957613dd9614c24565b604051601f8201601f191681016020018381118282101715613dfd57613dfd614c24565b604052818152838201602001871015613e14578485fd5b613e25826020830160208701614ba7565b9695505050505050565b600060208284031215613e40578081fd5b5035919050565b600060208284031215613e58578081fd5b5051919050565b60008060408385031215613e71578182fd5b823591506020830135613e8381614c3a565b809150509250929050565b60008060008060008060a08789031215613ea6578182fd5b863595506020870135613eb881614c3a565b9450613ec660408801613cdd565b93506060870135925060808701356001600160401b03811115613ee7578283fd5b613ef389828a01613c95565b979a9699509497509295939492505050565b60008060408385031215613f17578182fd5b50508035926020909101359150565b60008060008060008060a08789031215613f3e578182fd5b8635955060208701359450613ec660408801613cdd565b60008060008060008060c08789031215613f6d578384fd5b8635955060208701359450604087013593506060870135613f8d81614c4f565b9598949750929560808101359460a0909101359350915050565b600060208284031215613fb8578081fd5b8151613d0b81614c4f565b6000815180845260208085019450808401835b83811015613ffb5781516001600160a01b031687529582019590820190600101613fd6565b509495945050505050565b6000815180845260208085019450808401835b83811015613ffb57815187529582019590820190600101614019565b60008184825b8581101561406c57813561404e81614c3a565b6001600160a01b03168352602092830192919091019060010161403b565b509095945050505050565b60008251614089818460208701614ba7565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b600060208252613d0b6020830184613fc3565b60006080825261414b6080830187613fc3565b602083820381850152818751808452828401915082838202850101838a01865b838110156141b157601f198088850301865282518051808652614193818a88018b8501614ba7565b96880196601f0190911693909301860192509085019060010161416b565b505086810360408801526141c5818a614006565b94505050505082810360608401526141dd8185614006565b979650505050505050565b901515815260200190565b6001600160a01b0397909716875260208701959095526040860193909352606085019190915261ffff16608084015260a083015260c082015260e00190565b60208082526019908201527f7365743a206465706f7369742066656520746f6f206869676800000000000000604082015260600190565b60208082526032908201527f73657420696e766573746f7220616464726573733a20696e76616c6964206e656040820152717720696e766573746f72206164647265737360701b606082015260800190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526017908201527f7365743a20746f6f206d616e7920726577617264657273000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601f908201527f68617276657374206d616e793a20746f6f206d616e7920706f6f6c2069647300604082015260600190565b6020808252601d908201527f6164643a20696e76616c6964206861727665737420696e74657276616c000000604082015260600190565b6020808252601f908201527f77697468647261773a20706f6f6c20746f74616c206e6f7420656e6f75676800604082015260600190565b6020808252602a908201527f736574207465616d20616464726573733a20696e76616c6964206e6577207465604082015269616d206164647265737360b01b606082015260800190565b6020808252601e908201527f7365743a207265776172646572206d75737420626520636f6e74726163740000604082015260600190565b602080825260139082015272141bdbdb08191bd95cc81b9bdd08195e1a5cdd606a1b604082015260600190565b6020808252602c908201527f73657420696e766573746f722070657263656e743a20746f74616c207065726360408201526b0cadce840deeccae440dac2f60a31b606082015260800190565b6020808252818101527f77697468647261773a207573657220616d6f756e74206e6f7420656e6f756768604082015260600190565b60208082526041908201527f73657420696e766573746f7220616464726573733a206f6e6c7920707265766960408201527f6f757320696e766573746f722063616e2063616c6c2074686973206d6574686f6060820152601960fa1b608082015260a00190565b60208082526017908201527f6164643a20746f6f206d616e7920726577617264657273000000000000000000604082015260600190565b6020808252601e908201527f6164643a207265776172646572206d75737420626520636f6e74726163740000604082015260600190565b60208082526029908201527f656d657267656e63792077697468647261773a20706f6f6c20746f74616c206e6040820152680dee840cadcdeeaced60bb1b606082015260800190565b60208082526032908201527f73657420747265617375727920616464726573733a20696e76616c6964206e6560408201527177207472656173757279206164647265737360701b606082015260800190565b60208082526023908201527f7374617274206661726d696e673a206661726d207374617274656420616c726560408201526261647960e81b606082015260800190565b6020808252602b908201527f7365742074726561737572792070657263656e743a20696e76616c696420706560408201526a7263656e742076616c756560a81b606082015260800190565b60208082526041908201527f736574207465616d20616464726573733a206f6e6c792070726576696f75732060408201527f7465616d20616464726573732063616e2063616c6c2074686973206d6574686f6060820152601960fa1b608082015260a00190565b60208082526049908201527f73657420747265617375727920616464726573733a206f6e6c7920707265766960408201527f6f757320747265617375727920616464726573732063616e2063616c6c2074686060820152681a5cc81b595d1a1bd960ba1b608082015260a00190565b60208082526027908201527f736574207465616d2070657263656e743a20696e76616c69642070657263656e604082015266742076616c756560c81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f7365743a20696e76616c6964206861727665737420696e74657276616c000000604082015260600190565b60208082526026908201527f6164643a204c5020746f6b656e206d75737420626520612076616c696420636f6040820152651b9d1c9858dd60d21b606082015260800190565b60208082526028908201527f736574207465616d2070657263656e743a20746f74616c2070657263656e74206040820152670deeccae440dac2f60c31b606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b60208082526019908201527f6164643a206465706f7369742066656520746f6f206869676800000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602b908201527f73657420696e766573746f722070657263656e743a20696e76616c696420706560408201526a7263656e742076616c756560a81b606082015260800190565b6020808252602c908201527f7365742074726561737572792070657263656e743a20746f74616c207065726360408201526b0cadce840deeccae440dac2f60a31b606082015260800190565b61ffff91909116815260200190565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03919091166020830152604082015260600190565b92835261ffff919091166020830152604082015260600190565b918252602082015260400190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60008219821115614b4c57614b4c614c0e565b500190565b600082614b6c57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614b8b57614b8b614c0e565b500290565b600082821015614ba257614ba2614c0e565b500390565b60005b83811015614bc2578181015183820152602001614baa565b8381111561311f5750506000910152565b6000600019821415614be757614be7614c0e565b5060010190565b600060ff821660ff811415614c0557614c05614c0e565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461244b57600080fd5b60ff8116811461244b57600080fdfea2646970667358221220b36c109ae4f81ba40e3458c97ff955e38ad763179c0cac37bc32a43eebfe0db164736f6c6343000800003300000000000000000000000036e737f1437dc801f68275418a72f9c8e79a96df00000000000000000000000000000000000000000000000002c68af0bb1400000000000000000000000000007365b7a818801ad46984dc767c6921676a3f9fa10000000000000000000000001b6c57702a13da791e3ca92c0d51dae422e4b6440000000000000000000000006ac45bc2f3b9f04baf029908d240d29de65565a600000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102695760003560e01c8063630b5ba111610151578063afbcfea1116100c3578063e2bbb15811610087578063e2bbb158146104d9578063e6fd48bc146104ec578063eddf9652146104f4578063eff8976b14610507578063f2fde38b14610527578063ffcd42631461053a57610269565b8063afbcfea1146104a6578063c5f956af146104ae578063dc640ac9146104b6578063de73149d146104c9578063e164ac50146104d157610269565b8063812c64f111610115578063812c64f11461042d578063876d3c9c1461044257806389a2bc25146104555780638da5cb5b1461046857806393f1a40b14610470578063949e63021461049357610269565b8063630b5ba1146103e4578063654c9ece146103ec5780636605bfda146103ff5780636690864e14610412578063715018a61461042557610269565b8063214525c6116101ea578063474fa630116101ae578063474fa63014610388578063508593ab14610390578063515bc323146103a357806351eb05a6146103b65780635243e89c146103c95780635312ea8e146103d157610269565b8063214525c6146103175780632e6c998d1461031f57806342602f1e1461033f578063441a3e7014610352578063465e81ec1461036557610269565b80631526fe27116102315780631526fe27146102c657806317caf6f1146102ec5780631c75f085146102f45780631e5ba66c146102fc5780632081ccc41461030457610269565b806304ef9d581461026e5780630735b2081461028c578063081e3eda146102945780630ba84cd21461029c57806312e228fd146102b1575b600080fd5b61027661054d565b6040516102839190614aa1565b60405180910390f35b610276610553565b610276610559565b6102af6102aa366004613e2f565b61055f565b005b6102b96105f9565b6040516102839190614093565b6102d96102d4366004613e2f565b610608565b60405161028397969594939291906141f3565b610276610665565b6102b961066b565b6102b961067a565b6102af610312366004613f26565b610689565b61027661097d565b61033261032d366004613e5f565b610983565b60405161028391906141e8565b6102af61034d366004613cef565b6109ea565b6102af610360366004613f05565b610a86565b610378610373366004613e2f565b610d39565b6040516102839493929190614138565b610276611456565b6102af61039e366004613e8e565b61145c565b6102af6103b1366004613f55565b611757565b6102af6103c4366004613e2f565b61185e565b610276611896565b6102af6103df366004613e2f565b61189c565b6102af611ab1565b6102766103fa366004613e2f565b611ae7565b6102af61040d366004613cef565b611b24565b6102af610420366004613cef565b611bc0565b6102af611c5c565b610435611ca7565b6040516102839190614a92565b6102af610450366004613e2f565b611cad565b6102af610463366004613e2f565b611d8a565b6102b9611e67565b61048361047e366004613e5f565b611e76565b6040516102839493929190614b1e565b6102af6104a1366004613e2f565b611ea8565b6102af611f85565b6102b9612049565b6102af6104c4366004613d12565b612058565b6102766120f6565b6102766120fd565b6102af6104e7366004613f05565b612103565b61027661213d565b6102af610502366004613f05565b612143565b61051a610515366004613e2f565b61228b565b6040516102839190614125565b6102af610535366004613cef565b6123dd565b610378610548366004613e5f565b61244e565b600e5481565b600f5481565b60045490565b610567612b6d565b6001600160a01b0316610578611e67565b6001600160a01b0316146105a75760405162461bcd60e51b815260040161059e9061485e565b60405180910390fd5b6105af612b71565b336001600160a01b03167feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511600354836040516105ec929190614afa565b60405180910390a2600355565b600c546001600160a01b031681565b6004818154811061061857600080fd5b600091825260209091206008909102018054600182015460028301546003840154600485015460058601546006909601546001600160a01b03909516965092949193909261ffff16919087565b60065481565b600a546001600160a01b031681565b6002546001600160a01b031681565b610691612b6d565b6001600160a01b03166106a2611e67565b6001600160a01b0316146106c85760405162461bcd60e51b815260040161059e9061485e565b600454869081106106eb5760405162461bcd60e51b815260040161059e90614495565b600a82111561070c5760405162461bcd60e51b815260040161059e906142f2565b6103e861ffff861611156107325760405162461bcd60e51b815260040161059e90614232565b621275008411156107555760405162461bcd60e51b815260040161059e90614893565b60005b828110156107c95761079d84848381811061078357634e487b7160e01b600052603260045260246000fd5b90506020020160208101906107989190613cef565b612b97565b6107b95760405162461bcd60e51b815260040161059e9061445e565b6107c281614bd3565b9050610758565b506107d2612b71565b85600488815481106107f457634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201600101546006546108139190614b90565b61081d9190614b39565b600681905550856004888154811061084557634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020160010181905550846004888154811061087c57634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020160040160006101000a81548161ffff021916908361ffff16021790555083600488815481106108c957634e487b7160e01b600052603260045260246000fd5b90600052602060002090600802016005018190555082826004898154811061090157634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201600701919061091f929190613bc8565b508282604051610930929190614035565b6040518091039020877f5ed6f0deef9ab49d02900b40d596df4cd637a2a7fbfa56bbcb377389d3ce8d2888888860405161096c93929190614ae0565b60405180910390a350505050505050565b60035481565b600454600090839081106109a95760405162461bcd60e51b815260040161059e90614495565b60008481526005602090815260408083206001600160a01b0387168452909152902060075442108015906109e1575080600301544210155b95945050505050565b600c546001600160a01b03163314610a145760405162461bcd60e51b815260040161059e90614543565b6001600160a01b038116610a3a5760405162461bcd60e51b815260040161059e90614269565b600c80546001600160a01b0319166001600160a01b03831690811790915560405133907f6260cb34f06b782e83bde168f7d74ab2133041cb53b63ce22b127822a92b679190600090a350565b60026001541415610aa95760405162461bcd60e51b815260040161059e906149c4565b600260015560045482908110610ad15760405162461bcd60e51b815260040161059e90614495565b600060048481548110610af457634e487b7160e01b600052603260045260246000fd5b600091825260208083208784526005825260408085203386529092529220805460089092029092019250841115610b3d5760405162461bcd60e51b815260040161059e9061450e565b8382600601541015610b615760405162461bcd60e51b815260040161059e906143dd565b610b6a85612b9d565b610b7385612f5d565b8315610bd85783816000016000828254610b8d9190614b90565b909155505060025482546001600160a01b0390811691161415610bc2578360096000828254610bbc9190614b90565b90915550505b8154610bd8906001600160a01b03163386613125565b600382015481547f000000000000000000000000000000000000000000000000000000e8d4a5100091610c0a91614b71565b610c149190614b51565b600182015560005b6007830154811015610ccb57826007018181548110610c4b57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001548254604051635f67b06560e01b81526001600160a01b0390921691635f67b06591610c88918a913391600401614ac1565b600060405180830381600087803b158015610ca257600080fd5b505af1158015610cb6573d6000803e3d6000fd5b5050505080610cc490614bd3565b9050610c1c565b508315610cec5783826006016000828254610ce69190614b90565b90915550505b84336001600160a01b03167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56886604051610d269190614aa1565b60405180910390a3505060018055505050565b606080606080846004805490508110610d645760405162461bcd60e51b815260040161059e90614495565b600060048781548110610d8757634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201905080600701805490506001610dab9190614b39565b6001600160401b03811115610dd057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610df9578160200160208202803683370190505b506007820154909650610e0d906001614b39565b6001600160401b03811115610e3257634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610e6557816020015b6060815260200190600190039081610e505790505b506007820154909550610e79906001614b39565b6001600160401b03811115610e9e57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610ec7578160200160208202803683370190505b506007820154909450610edb906001614b39565b6001600160401b03811115610f0057634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015610f29578160200160208202803683370190505b5060025487519194506001600160a01b0316908790600090610f5b57634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600254610f7e911661321a565b85600081518110610f9f57634e487b7160e01b600052603260045260246000fd5b6020908102919091010152600254610fbf906001600160a01b03166132dd565b60ff1684600081518110610fe357634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060006103e890506000600f54600e54600d548461100c9190614b90565b6110169190614b90565b6110209190614b90565b9050816006548260035486600101546110399190614b71565b6110439190614b71565b61104d9190614b51565b6110579190614b51565b8560008151811061107857634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060005b600784015481101561144a578360070181815481106110b657634e487b7160e01b600052603260045260246000fd5b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c192600480840193829003018186803b1580156110ff57600080fd5b505afa158015611113573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111379190613d71565b89611143836001614b39565b8151811061116157634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250506112368460070182815481106111a757634e487b7160e01b600052603260045260246000fd5b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c192600480840193829003018186803b1580156111f057600080fd5b505afa158015611204573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112289190613d71565b6001600160a01b031661321a565b88611242836001614b39565b8151811061126057634e487b7160e01b600052603260045260246000fd5b602002602001018190525061132084600701828154811061129157634e487b7160e01b600052603260045260246000fd5b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c192600480840193829003018186803b1580156112da57600080fd5b505afa1580156112ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113129190613d71565b6001600160a01b03166132dd565b60ff168761132f836001614b39565b8151811061134d57634e487b7160e01b600052603260045260246000fd5b60200260200101818152505083600701818154811061137c57634e487b7160e01b600052603260045260246000fd5b600091825260209091200154604051631197a07b60e21b81526001600160a01b039091169063465e81ec906113b5908d90600401614aa1565b60206040518083038186803b1580156113cd57600080fd5b505afa1580156113e1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114059190613e47565b86611411836001614b39565b8151811061142f57634e487b7160e01b600052603260045260246000fd5b602090810291909101015261144381614bd3565b9050611087565b50505050509193509193565b60085481565b611464612b6d565b6001600160a01b0316611475611e67565b6001600160a01b03161461149b5760405162461bcd60e51b815260040161059e9061485e565b600a8111156114bc5760405162461bcd60e51b815260040161059e906145aa565b6103e861ffff851611156114e25760405162461bcd60e51b815260040161059e9061498d565b621275008311156115055760405162461bcd60e51b815260040161059e906143a6565b61150e85612b97565b61152a5760405162461bcd60e51b815260040161059e906148ca565b60005b818110156115845761155883838381811061078357634e487b7160e01b600052603260045260246000fd5b6115745760405162461bcd60e51b815260040161059e906145e1565b61157d81614bd3565b905061152d565b5061158d612b71565b600060075442116115a0576007546115a2565b425b905086600660008282546115b69190614b39565b925050819055506004604051806101000160405280886001600160a01b03168152602001898152602001838152602001600081526020018761ffff168152602001868152602001600081526020018585808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250939094525050835460018082018655948252602091829020845160089092020180546001600160a01b0319166001600160a01b0390921691909117815583820151948101949094556040830151600285015560608301516003850155608083015160048501805461ffff191661ffff90921691909117905560a0830151600585015560c0830151600685015560e083015180519394936116dd935060078501929190910190613c2b565b50505082826040516116f0929190614035565b6040519081900390206004546001600160a01b0388169061171390600190614b90565b7f5ed295c4f5af5aeb1ccd905e1cd55a86ab3bb9fc1fe2346ff64ac47dbef366618a898960405161174693929190614ae0565b60405180910390a450505050505050565b6002600154141561177a5760405162461bcd60e51b815260040161059e906149c4565b6002600155600454869081106117a25760405162461bcd60e51b815260040161059e90614495565b6000600488815481106117c557634e487b7160e01b600052603260045260246000fd5b60009182526020909120600890910201805460405163d505accf60e01b81529192506001600160a01b031690819063d505accf9061181390339030908d908d908d908d908d906004016140cb565b600060405180830381600087803b15801561182d57600080fd5b505af1158015611841573d6000803e3d6000fd5b5050505061184f8989613395565b50506001805550505050505050565b600260015414156118815760405162461bcd60e51b815260040161059e906149c4565b600260015561188f81612b9d565b5060018055565b60095481565b600260015414156118bf5760405162461bcd60e51b815260040161059e906149c4565b60026001819055506000600482815481106118ea57634e487b7160e01b600052603260045260246000fd5b6000918252602080832085845260058252604080852033865290925292208054600892909202909201600681015490935081111561193a5760405162461bcd60e51b815260040161059e90614618565b6000808355600183018190556002830181905560038301819055600684018054839290611968908490614b90565b90915550600090505b6007840154811015611a1e578360070181815481106119a057634e487b7160e01b600052603260045260246000fd5b6000918252602082200154604051635f67b06560e01b81526001600160a01b0390911691635f67b065916119db918991339190600401614ac1565b600060405180830381600087803b1580156119f557600080fd5b505af1158015611a09573d6000803e3d6000fd5b5050505080611a1790614bd3565b9050611971565b5060025483546001600160a01b0390811691161415611a4f578060096000828254611a499190614b90565b90915550505b8254611a65906001600160a01b03163383613125565b83336001600160a01b03167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583604051611a9f9190614aa1565b60405180910390a35050600180555050565b60026001541415611ad45760405162461bcd60e51b815260040161059e906149c4565b6002600155611ae1612b71565b60018055565b600060048281548110611b0a57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600802016006015490505b919050565b600b546001600160a01b03163314611b4e5760405162461bcd60e51b815260040161059e906147a8565b6001600160a01b038116611b745760405162461bcd60e51b815260040161059e90614661565b600b80546001600160a01b0319166001600160a01b03831690811790915560405133907f61885cdba916be748ff3e3f6f15e4206153b8ea3b7acabade9d04b4063a8351090600090a350565b600a546001600160a01b03163314611bea5760405162461bcd60e51b815260040161059e90614741565b6001600160a01b038116611c105760405162461bcd60e51b815260040161059e90614414565b600a80546001600160a01b0319166001600160a01b03831690811790915560405133907f42fbc17d847fdc3e5c82da842a5ef3979c64f3b94cd4e7382310fd5525c6ee0f90600090a350565b611c64612b6d565b6001600160a01b0316611c75611e67565b6001600160a01b031614611c9b5760405162461bcd60e51b815260040161059e9061485e565b611ca5600061374c565b565b6103e881565b611cb5612b6d565b6001600160a01b0316611cc6611e67565b6001600160a01b031614611cec5760405162461bcd60e51b815260040161059e9061485e565b6103e8811115611d0e5760405162461bcd60e51b815260040161059e906149fb565b6103e8600e5482600d54611d229190614b39565b611d2c9190614b39565b1115611d4a5760405162461bcd60e51b815260040161059e906144c2565b7f905b464403a98b455243c8b4d30c545b8fbd70cda670142b9326425b2c039f3b600f5482604051611d7d929190614afa565b60405180910390a1600f55565b611d92612b6d565b6001600160a01b0316611da3611e67565b6001600160a01b031614611dc95760405162461bcd60e51b815260040161059e9061485e565b6103e8811115611deb5760405162461bcd60e51b815260040161059e906146f6565b6103e8600f5482600d54611dff9190614b39565b611e099190614b39565b1115611e275760405162461bcd60e51b815260040161059e90614a46565b7fa565895c0101fca10e6a7b85742e56cf52ac5f58b09ce030425d3555b47069fd600e5482604051611e5a929190614afa565b60405180910390a1600e55565b6000546001600160a01b031690565b600560209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b611eb0612b6d565b6001600160a01b0316611ec1611e67565b6001600160a01b031614611ee75760405162461bcd60e51b815260040161059e9061485e565b6103e8811115611f095760405162461bcd60e51b815260040161059e90614817565b6103e8600f5482600e54611f1d9190614b39565b611f279190614b39565b1115611f455760405162461bcd60e51b815260040161059e90614910565b7f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6600d5482604051611f78929190614afa565b60405180910390a1600d55565b611f8d612b6d565b6001600160a01b0316611f9e611e67565b6001600160a01b031614611fc45760405162461bcd60e51b815260040161059e9061485e565b6007544210611fe55760405162461bcd60e51b815260040161059e906146b3565b60045460005b818110156120415760006004828154811061201657634e487b7160e01b600052603260045260246000fd5b90600052602060002090600802019050428160020181905550508061203a90614bd3565b9050611feb565b505042600755565b600b546001600160a01b031681565b6002600154141561207b5760405162461bcd60e51b815260040161059e906149c4565b6002600155601e8111156120a15760405162461bcd60e51b815260040161059e9061436f565b60005b818110156120ed576120dd8383838181106120cf57634e487b7160e01b600052603260045260246000fd5b905060200201356000613395565b6120e681614bd3565b90506120a4565b50506001805550565b6212750081565b600d5481565b600260015414156121265760405162461bcd60e51b815260040161059e906149c4565b60026001556121358282613395565b505060018055565b60075481565b61214b612b6d565b6001600160a01b031661215c611e67565b6001600160a01b0316146121825760405162461bcd60e51b815260040161059e9061485e565b61218a612b71565b336001600160a01b03167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef3600484815481106121d657634e487b7160e01b600052603260045260246000fd5b906000526020600020906008020160010154836040516121f7929190614afa565b60405180910390a2806004838154811061222157634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201600101546006546122409190614b90565b61224a9190614b39565b600681905550806004838154811061227257634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201600101819055505050565b600454606090829081106122b15760405162461bcd60e51b815260040161059e90614495565b6000600484815481106122d457634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201905080600701805490506001600160401b0381111561231157634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561233a578160200160208202803683370190505b50925060005b60078201548110156123d55781600701818154811061236f57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b03168482815181106123ad57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101526123ce81614bd3565b9050612340565b505050919050565b6123e5612b6d565b6001600160a01b03166123f6611e67565b6001600160a01b03161461241c5760405162461bcd60e51b815260040161059e9061485e565b6001600160a01b0381166124425760405162461bcd60e51b815260040161059e90614329565b61244b8161374c565b50565b6060806060808560048054905081106124795760405162461bcd60e51b815260040161059e90614495565b60006004888154811061249c57634e487b7160e01b600052603260045260246000fd5b600091825260208083208b84526005825260408085206001600160a01b038d16865290925292206003600890920290920190810154600682015460028301549294509091421180156124ed57508015155b156125c35760008460020154426125049190614b90565b905060006103e890506000600f54600e54600d54846125239190614b90565b61252d9190614b90565b6125379190614b90565b9050600082600654838a60010154600354886125539190614b71565b61255d9190614b71565b6125679190614b71565b6125719190614b51565b61257b9190614b51565b9050846125a87f000000000000000000000000000000000000000000000000000000e8d4a5100083614b71565b6125b29190614b51565b6125bc9087614b39565b9550505050505b6000836002015484600101547f000000000000000000000000000000000000000000000000000000e8d4a510008587600001546126009190614b71565b61260a9190614b51565b6126149190614b90565b61261e9190614b39565b6007860154909150612631906001614b39565b6001600160401b0381111561265657634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561267f578160200160208202803683370190505b506007860154909a50612693906001614b39565b6001600160401b038111156126b857634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156126eb57816020015b60608152602001906001900390816126d65790505b5060078601549099506126ff906001614b39565b6001600160401b0381111561272457634e487b7160e01b600052604160045260246000fd5b60405190808252806020026020018201604052801561274d578160200160208202803683370190505b506007860154909750612761906001614b39565b6001600160401b0381111561278657634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156127af578160200160208202803683370190505b506002548b519199506001600160a01b0316908b906000906127e157634e487b7160e01b600052603260045260246000fd5b6001600160a01b039283166020918202929092010152600254612804911661321a565b8960008151811061282557634e487b7160e01b600052603260045260246000fd5b6020908102919091010152600254612845906001600160a01b03166132dd565b60ff168860008151811061286957634e487b7160e01b600052603260045260246000fd5b602002602001018181525050808760008151811061289757634e487b7160e01b600052603260045260246000fd5b60200260200101818152505060005b6007860154811015612b5d578560070181815481106128d557634e487b7160e01b600052603260045260246000fd5b600091825260209182902001546040805163f7c618c160e01b815290516001600160a01b039092169263f7c618c192600480840193829003018186803b15801561291e57600080fd5b505afa158015612932573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129569190613d71565b8b612962836001614b39565b8151811061298057634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250506129c68660070182815481106111a757634e487b7160e01b600052603260045260246000fd5b8a6129d2836001614b39565b815181106129f057634e487b7160e01b600052603260045260246000fd5b6020026020010181905250612a2186600701828154811061129157634e487b7160e01b600052603260045260246000fd5b60ff1689612a30836001614b39565b81518110612a4e57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050856007018181548110612a7d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b03166001600160a01b031663ffcd42638e8e6040518363ffffffff1660e01b8152600401612ac8929190614aaa565b60206040518083038186803b158015612ae057600080fd5b505afa158015612af4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b189190613e47565b88612b24836001614b39565b81518110612b4257634e487b7160e01b600052603260045260246000fd5b6020908102919091010152612b5681614bd3565b90506128a6565b5050505050505092959194509250565b3390565b60005b60045481101561244b57612b8781612b9d565b612b9081614bd3565b9050612b74565b3b151590565b60045481908110612bc05760405162461bcd60e51b815260040161059e90614495565b600060048381548110612be357634e487b7160e01b600052603260045260246000fd5b9060005260206000209060080201905080600201544211612c045750612f59565b6006810154801580612c1857506001820154155b15612c2a575042600290910155612f59565b6000826002015442612c3c9190614b90565b90506000600654846001015460035484612c569190614b71565b612c609190614b71565b612c6a9190614b51565b905060006103e890506000600f54600e54600d5484612c899190614b90565b612c939190614b90565b612c9d9190614b90565b600254600a54600d549293506001600160a01b03918216926340c10f1992909116908590612ccb9088614b71565b612cd59190614b51565b6040518363ffffffff1660e01b8152600401612cf292919061410c565b600060405180830381600087803b158015612d0c57600080fd5b505af1158015612d20573d6000803e3d6000fd5b5050600254600b54600e546001600160a01b0392831694506340c10f1993509116908590612d4e9088614b71565b612d589190614b51565b6040518363ffffffff1660e01b8152600401612d7592919061410c565b600060405180830381600087803b158015612d8f57600080fd5b505af1158015612da3573d6000803e3d6000fd5b5050600254600c54600f546001600160a01b0392831694506340c10f1993509116908590612dd19088614b71565b612ddb9190614b51565b6040518363ffffffff1660e01b8152600401612df892919061410c565b600060405180830381600087803b158015612e1257600080fd5b505af1158015612e26573d6000803e3d6000fd5b50506002546001600160a01b031691506340c10f1990503084612e498588614b71565b612e539190614b51565b6040518363ffffffff1660e01b8152600401612e7092919061410c565b600060405180830381600087803b158015612e8a57600080fd5b505af1158015612e9e573d6000803e3d6000fd5b505050600687015483915082612ed47f000000000000000000000000000000000000000000000000000000e8d4a5100087614b71565b612ede9190614b71565b612ee89190614b51565b612ef29190614b51565b866003016000828254612f059190614b39565b9091555050426002870181905560038701546040518a927f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f4692612f4a928a9190614b08565b60405180910390a25050505050505b5050565b600060048281548110612f8057634e487b7160e01b600052603260045260246000fd5b600091825260208083208584526005825260408085203386529092529220600381015460089092029092019250158015612fbc57506007544210155b15612fd6576005820154612fd09042614b39565b60038201555b600081600101547f000000000000000000000000000000000000000000000000000000e8d4a51000846003015484600001546130129190614b71565b61301c9190614b51565b6130269190614b90565b90506130328433610983565b156130aa57600081118061304a575060008260020154115b156130a55760008260020154826130619190614b39565b90508260020154600860008282546130799190614b90565b90915550506000600284015560058401546130949042614b39565b60038401556130a3338261379c565b505b61311f565b801561311f5780600860008282546130c29190614b39565b92505081905550808260020160008282546130dd9190614b39565b9091555050604051849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c190613116908590614aa1565b60405180910390a35b50505050565b600080846001600160a01b031663a9059cbb60e01b858560405160240161314d92919061410c565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b031990941693909317909252905161318b9190614077565b6000604051808303816000865af19150503d80600081146131c8576040519150601f19603f3d011682016040523d82523d6000602084013e6131cd565b606091505b50915091508180156131f75750805115806131f75750808060200190518101906131f79190613d51565b6132135760405162461bcd60e51b815260040161059e906142bb565b5050505050565b60408051600481526024810182526020810180516001600160e01b03166395d89b4160e01b179052905160609160009182916001600160a01b038616916132619190614077565b600060405180830381855afa9150503d806000811461329c576040519150601f19603f3d011682016040523d82523d6000602084013e6132a1565b606091505b5091509150816132cc57604051806040016040528060038152602001623f3f3f60e81b8152506132d5565b6132d5816138fb565b949350505050565b60408051600481526024810182526020810180516001600160e01b031663313ce56760e01b1790529051600091829182916001600160a01b038616916133239190614077565b600060405180830381855afa9150503d806000811461335e576040519150601f19603f3d011682016040523d82523d6000602084013e613363565b606091505b5091509150818015613376575080516020145b6133815760126132d5565b808060200190518101906132d59190613fa7565b600454829081106133b85760405162461bcd60e51b815260040161059e90614495565b6000600484815481106133db57634e487b7160e01b600052603260045260246000fd5b6000918252602080832087845260058252604080852033865290925292206008909102909101915061340c85612b9d565b61341585612f5d565b83156135ef5781546040516370a0823160e01b81526000916001600160a01b0316906370a082319061344b903090600401614093565b60206040518083038186803b15801561346357600080fd5b505afa158015613477573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061349b9190613e47565b83549091506134b5906001600160a01b0316333088613ad0565b82546040516370a0823160e01b81526000916001600160a01b0316906370a08231906134e5903090600401614093565b60206040518083038186803b1580156134fd57600080fd5b505afa158015613511573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135359190613e47565b90506135418282614b90565b600485015490965061ffff16156135a35760048401546000906127109061356c9061ffff1689614b71565b6135769190614b51565b600b548654919250613595916001600160a01b03908116911683613125565b61359f8188614b90565b9650505b858360000160008282546135b79190614b39565b909155505060025484546001600160a01b03908116911614156135ec5785600960008282546135e69190614b39565b90915550505b50505b600382015481547f000000000000000000000000000000000000000000000000000000e8d4a510009161362191614b71565b61362b9190614b51565b600182015560005b60078301548110156136e25782600701818154811061366257634e487b7160e01b600052603260045260246000fd5b6000918252602090912001548254604051635f67b06560e01b81526001600160a01b0390921691635f67b0659161369f918a913391600401614ac1565b600060405180830381600087803b1580156136b957600080fd5b505af11580156136cd573d6000803e3d6000fd5b50505050806136db90614bd3565b9050613633565b50831561370357838260060160008282546136fd9190614b39565b90915550505b84336001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a158660405161373d9190614aa1565b60405180910390a35050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6009546002546040516370a0823160e01b81526001600160a01b03909116906370a08231906137cf903090600401614093565b60206040518083038186803b1580156137e757600080fd5b505afa1580156137fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061381f9190613e47565b1115612f59576009546002546040516370a0823160e01b8152600092916001600160a01b0316906370a082319061385a903090600401614093565b60206040518083038186803b15801561387257600080fd5b505afa158015613886573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138aa9190613e47565b6138b49190614b90565b90508082106138d9576002546138d4906001600160a01b03168483613125565b6138f6565b81156138f6576002546138f6906001600160a01b03168484613125565b505050565b60606040825110613921578180602001905181019061391a9190613d8d565b9050611b1f565b815160201415613ab05760005b60208160ff161080156139715750828160ff168151811061395f57634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191615155b15613988578061398081614bee565b91505061392e565b60008160ff166001600160401b038111156139b357634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156139dd576020820181803683370190505b509050600091505b60208260ff16108015613a285750838260ff1681518110613a1657634e487b7160e01b600052603260045260246000fd5b01602001516001600160f81b03191615155b15613aa757838260ff1681518110613a5057634e487b7160e01b600052603260045260246000fd5b602001015160f81c60f81b818360ff1681518110613a7e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535081613a9f81614bee565b9250506139e5565b9150611b1f9050565b506040805180820190915260038152623f3f3f60e81b6020820152611b1f565b600080856001600160a01b03166323b872dd60e01b868686604051602401613afa939291906140a7565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909416939093179092529051613b389190614077565b6000604051808303816000865af19150503d8060008114613b75576040519150601f19603f3d011682016040523d82523d6000602084013e613b7a565b606091505b5091509150818015613ba4575080511580613ba4575080806020019051810190613ba49190613d51565b613bc05760405162461bcd60e51b815260040161059e90614958565b505050505050565b828054828255906000526020600020908101928215613c1b579160200282015b82811115613c1b5781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613be8565b50613c27929150613c80565b5090565b828054828255906000526020600020908101928215613c1b579160200282015b82811115613c1b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613c4b565b5b80821115613c275760008155600101613c81565b60008083601f840112613ca6578081fd5b5081356001600160401b03811115613cbc578182fd5b6020830191508360208083028501011115613cd657600080fd5b9250929050565b803561ffff81168114611b1f57600080fd5b600060208284031215613d00578081fd5b8135613d0b81614c3a565b9392505050565b60008060208385031215613d24578081fd5b82356001600160401b03811115613d39578182fd5b613d4585828601613c95565b90969095509350505050565b600060208284031215613d62578081fd5b81518015158114613d0b578182fd5b600060208284031215613d82578081fd5b8151613d0b81614c3a565b600060208284031215613d9e578081fd5b81516001600160401b0380821115613db4578283fd5b818401915084601f830112613dc7578283fd5b815181811115613dd957613dd9614c24565b604051601f8201601f191681016020018381118282101715613dfd57613dfd614c24565b604052818152838201602001871015613e14578485fd5b613e25826020830160208701614ba7565b9695505050505050565b600060208284031215613e40578081fd5b5035919050565b600060208284031215613e58578081fd5b5051919050565b60008060408385031215613e71578182fd5b823591506020830135613e8381614c3a565b809150509250929050565b60008060008060008060a08789031215613ea6578182fd5b863595506020870135613eb881614c3a565b9450613ec660408801613cdd565b93506060870135925060808701356001600160401b03811115613ee7578283fd5b613ef389828a01613c95565b979a9699509497509295939492505050565b60008060408385031215613f17578182fd5b50508035926020909101359150565b60008060008060008060a08789031215613f3e578182fd5b8635955060208701359450613ec660408801613cdd565b60008060008060008060c08789031215613f6d578384fd5b8635955060208701359450604087013593506060870135613f8d81614c4f565b9598949750929560808101359460a0909101359350915050565b600060208284031215613fb8578081fd5b8151613d0b81614c4f565b6000815180845260208085019450808401835b83811015613ffb5781516001600160a01b031687529582019590820190600101613fd6565b509495945050505050565b6000815180845260208085019450808401835b83811015613ffb57815187529582019590820190600101614019565b60008184825b8581101561406c57813561404e81614c3a565b6001600160a01b03168352602092830192919091019060010161403b565b509095945050505050565b60008251614089818460208701614ba7565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b03929092168252602082015260400190565b600060208252613d0b6020830184613fc3565b60006080825261414b6080830187613fc3565b602083820381850152818751808452828401915082838202850101838a01865b838110156141b157601f198088850301865282518051808652614193818a88018b8501614ba7565b96880196601f0190911693909301860192509085019060010161416b565b505086810360408801526141c5818a614006565b94505050505082810360608401526141dd8185614006565b979650505050505050565b901515815260200190565b6001600160a01b0397909716875260208701959095526040860193909352606085019190915261ffff16608084015260a083015260c082015260e00190565b60208082526019908201527f7365743a206465706f7369742066656520746f6f206869676800000000000000604082015260600190565b60208082526032908201527f73657420696e766573746f7220616464726573733a20696e76616c6964206e656040820152717720696e766573746f72206164647265737360701b606082015260800190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526017908201527f7365743a20746f6f206d616e7920726577617264657273000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601f908201527f68617276657374206d616e793a20746f6f206d616e7920706f6f6c2069647300604082015260600190565b6020808252601d908201527f6164643a20696e76616c6964206861727665737420696e74657276616c000000604082015260600190565b6020808252601f908201527f77697468647261773a20706f6f6c20746f74616c206e6f7420656e6f75676800604082015260600190565b6020808252602a908201527f736574207465616d20616464726573733a20696e76616c6964206e6577207465604082015269616d206164647265737360b01b606082015260800190565b6020808252601e908201527f7365743a207265776172646572206d75737420626520636f6e74726163740000604082015260600190565b602080825260139082015272141bdbdb08191bd95cc81b9bdd08195e1a5cdd606a1b604082015260600190565b6020808252602c908201527f73657420696e766573746f722070657263656e743a20746f74616c207065726360408201526b0cadce840deeccae440dac2f60a31b606082015260800190565b6020808252818101527f77697468647261773a207573657220616d6f756e74206e6f7420656e6f756768604082015260600190565b60208082526041908201527f73657420696e766573746f7220616464726573733a206f6e6c7920707265766960408201527f6f757320696e766573746f722063616e2063616c6c2074686973206d6574686f6060820152601960fa1b608082015260a00190565b60208082526017908201527f6164643a20746f6f206d616e7920726577617264657273000000000000000000604082015260600190565b6020808252601e908201527f6164643a207265776172646572206d75737420626520636f6e74726163740000604082015260600190565b60208082526029908201527f656d657267656e63792077697468647261773a20706f6f6c20746f74616c206e6040820152680dee840cadcdeeaced60bb1b606082015260800190565b60208082526032908201527f73657420747265617375727920616464726573733a20696e76616c6964206e6560408201527177207472656173757279206164647265737360701b606082015260800190565b60208082526023908201527f7374617274206661726d696e673a206661726d207374617274656420616c726560408201526261647960e81b606082015260800190565b6020808252602b908201527f7365742074726561737572792070657263656e743a20696e76616c696420706560408201526a7263656e742076616c756560a81b606082015260800190565b60208082526041908201527f736574207465616d20616464726573733a206f6e6c792070726576696f75732060408201527f7465616d20616464726573732063616e2063616c6c2074686973206d6574686f6060820152601960fa1b608082015260a00190565b60208082526049908201527f73657420747265617375727920616464726573733a206f6e6c7920707265766960408201527f6f757320747265617375727920616464726573732063616e2063616c6c2074686060820152681a5cc81b595d1a1bd960ba1b608082015260a00190565b60208082526027908201527f736574207465616d2070657263656e743a20696e76616c69642070657263656e604082015266742076616c756560c81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601d908201527f7365743a20696e76616c6964206861727665737420696e74657276616c000000604082015260600190565b60208082526026908201527f6164643a204c5020746f6b656e206d75737420626520612076616c696420636f6040820152651b9d1c9858dd60d21b606082015260800190565b60208082526028908201527f736574207465616d2070657263656e743a20746f74616c2070657263656e74206040820152670deeccae440dac2f60c31b606082015260800190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b60208082526019908201527f6164643a206465706f7369742066656520746f6f206869676800000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252602b908201527f73657420696e766573746f722070657263656e743a20696e76616c696420706560408201526a7263656e742076616c756560a81b606082015260800190565b6020808252602c908201527f7365742074726561737572792070657263656e743a20746f74616c207065726360408201526b0cadce840deeccae440dac2f60a31b606082015260800190565b61ffff91909116815260200190565b90815260200190565b9182526001600160a01b0316602082015260400190565b9283526001600160a01b03919091166020830152604082015260600190565b92835261ffff919091166020830152604082015260600190565b918252602082015260400190565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b60008219821115614b4c57614b4c614c0e565b500190565b600082614b6c57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614b8b57614b8b614c0e565b500290565b600082821015614ba257614ba2614c0e565b500390565b60005b83811015614bc2578181015183820152602001614baa565b8381111561311f5750506000910152565b6000600019821415614be757614be7614c0e565b5060010190565b600060ff821660ff811415614c0557614c05614c0e565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461244b57600080fd5b60ff8116811461244b57600080fdfea2646970667358221220b36c109ae4f81ba40e3458c97ff955e38ad763179c0cac37bc32a43eebfe0db164736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000036e737f1437dc801f68275418a72f9c8e79a96df00000000000000000000000000000000000000000000000002c68af0bb1400000000000000000000000000007365b7a818801ad46984dc767c6921676a3f9fa10000000000000000000000001b6c57702a13da791e3ca92c0d51dae422e4b6440000000000000000000000006ac45bc2f3b9f04baf029908d240d29de65565a600000000000000000000000000000000000000000000000000000000000000c800000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064
-----Decoded View---------------
Arg [0] : _nova (address): 0x36e737F1437DC801f68275418A72f9c8E79A96df
Arg [1] : _novaPerSec (uint256): 200000000000000000
Arg [2] : _teamAddress (address): 0x7365b7A818801ad46984Dc767c6921676A3f9FA1
Arg [3] : _treasuryAddress (address): 0x1b6c57702a13Da791e3ca92C0d51DAE422e4b644
Arg [4] : _investorAddress (address): 0x6ac45BC2F3b9F04baf029908d240d29DE65565a6
Arg [5] : _teamPercent (uint256): 200
Arg [6] : _treasuryPercent (uint256): 100
Arg [7] : _investorPercent (uint256): 100
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 00000000000000000000000036e737f1437dc801f68275418a72f9c8e79a96df
Arg [1] : 00000000000000000000000000000000000000000000000002c68af0bb140000
Arg [2] : 0000000000000000000000007365b7a818801ad46984dc767c6921676a3f9fa1
Arg [3] : 0000000000000000000000001b6c57702a13da791e3ca92c0d51dae422e4b644
Arg [4] : 0000000000000000000000006ac45bc2f3b9f04baf029908d240d29de65565a6
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000064
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.