Source Code
Latest 25 from a total of 24,817 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw | 11315786 | 275 days ago | IN | 0 MOVR | 0.00009797 | ||||
| Withdraw | 10997543 | 297 days ago | IN | 0 MOVR | 0.0002615 | ||||
| Deposit | 10997539 | 297 days ago | IN | 0 MOVR | 0.00018984 | ||||
| Deposit | 10997536 | 297 days ago | IN | 0 MOVR | 0.00019409 | ||||
| Withdraw | 9961266 | 371 days ago | IN | 0 MOVR | 0.00025337 | ||||
| Withdraw | 9214881 | 424 days ago | IN | 0 MOVR | 0.00206564 | ||||
| Deposit | 9214856 | 424 days ago | IN | 0 MOVR | 0.00059246 | ||||
| Deposit | 9214850 | 424 days ago | IN | 0 MOVR | 0.00087175 | ||||
| Withdraw | 8717614 | 460 days ago | IN | 0 MOVR | 0.0010135 | ||||
| Deposit | 8491157 | 476 days ago | IN | 0 MOVR | 0.00159962 | ||||
| Withdraw | 6985463 | 588 days ago | IN | 0 MOVR | 0.00026527 | ||||
| Withdraw | 6358493 | 679 days ago | IN | 0 MOVR | 0.00043066 | ||||
| Deposit | 6358482 | 679 days ago | IN | 0 MOVR | 0.0004709 | ||||
| Withdraw | 6339036 | 682 days ago | IN | 0 MOVR | 0.00049782 | ||||
| Withdraw | 6317170 | 685 days ago | IN | 0 MOVR | 0.00067636 | ||||
| Withdraw | 6317160 | 685 days ago | IN | 0 MOVR | 0.00043146 | ||||
| Deposit | 6317157 | 685 days ago | IN | 0 MOVR | 0.00044168 | ||||
| Withdraw | 6290810 | 689 days ago | IN | 0 MOVR | 0.00043066 | ||||
| Deposit | 6290807 | 689 days ago | IN | 0 MOVR | 0.00039987 | ||||
| Withdraw | 6245186 | 696 days ago | IN | 0 MOVR | 0.00057434 | ||||
| Deposit | 6245174 | 696 days ago | IN | 0 MOVR | 0.00052014 | ||||
| Deposit With Per... | 6173199 | 707 days ago | IN | 0 MOVR | 0.00076587 | ||||
| Deposit | 6171970 | 707 days ago | IN | 0 MOVR | 0.00049086 | ||||
| Withdraw | 5924513 | 745 days ago | IN | 0 MOVR | 0.00057434 | ||||
| Deposit | 5924509 | 745 days ago | IN | 0 MOVR | 0.00047523 |
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SolarDistributorV2
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "./rewarders/IComplexRewarder.sol";
import "./libraries/BoringERC20.sol";
import "./ISolarPair.sol";
contract SolarDistributorV2 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. Solar to distribute per block.
uint256 lastRewardTimestamp; // Last block number that Solar distribution occurs.
uint256 accSolarPerShare; // Accumulated Solar 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 solar;
// Solar tokens created per second
uint256 public solarPerSec;
// 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 Solar mining starts.
uint256 public startTimestamp;
// Total locked up rewards
uint256 public totalLockedUpRewards;
// Total Solar in Solar Pools (can be multiple pools)
uint256 public totalSolarInPools = 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 accSolarPerShare
);
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 _solar,
uint256 _solarPerSec,
address _teamAddress,
address _treasuryAddress,
address _investorAddress,
uint256 _teamPercent,
uint256 _treasuryPercent,
uint256 _investorPercent
) {
require(
0 <= _teamPercent && _teamPercent <= 1000,
"constructor: invalid team percent value"
);
require(
0 <= _treasuryPercent && _treasuryPercent <= 1000,
"constructor: invalid treasury percent value"
);
require(
0 <= _investorPercent && _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);
solar = _solar;
solarPerSec = _solarPerSec;
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,
accSolarPerShare: 0,
depositFeeBP: _depositFeeBP,
harvestInterval: _harvestInterval,
totalLp: 0,
rewarders: _rewarders
})
);
emit Add(
poolInfo.length - 1,
_allocPoint,
_lpToken,
_depositFeeBP,
_harvestInterval,
_rewarders
);
}
// Update the given pool's Solar 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])),
"add: 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 accSolarPerShare = pool.accSolarPerShare;
uint256 lpSupply = pool.totalLp;
if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) {
uint256 multiplier = block.timestamp - pool.lastRewardTimestamp;
uint256 lpPercent = 1000 -
teamPercent -
treasuryPercent -
investorPercent;
uint256 solarReward = ((((multiplier * solarPerSec) *
pool.allocPoint) / totalAllocPoint) * lpPercent) / 1000;
accSolarPerShare += (
((solarReward * ACC_TOKEN_PRECISION) / lpSupply)
);
}
uint256 pendingSolar = (((user.amount * accSolarPerShare) /
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(solar);
symbols[0] = IBoringERC20(solar).safeSymbol();
decimals[0] = IBoringERC20(solar).safeDecimals();
amounts[0] = pendingSolar;
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(solar);
symbols[0] = IBoringERC20(solar).safeSymbol();
decimals[0] = IBoringERC20(solar).safeDecimals();
rewardsPerSec[0] = (pool.allocPoint * solarPerSec) / totalAllocPoint;
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];
for (
uint256 rewarderId = 0;
rewarderId < pool.rewarders.length;
++rewarderId
) {
rewarders[rewarderId] = address(pool.rewarders[rewarderId]);
}
}
// View function to see if user can harvest Solar.
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 solarReward = ((multiplier * solarPerSec) * pool.allocPoint) /
totalAllocPoint;
uint256 lpPercent = 1000 -
teamPercent -
treasuryPercent -
investorPercent;
solar.mint(teamAddress, (solarReward * teamPercent) / 1000);
solar.mint(treasuryAddress, (solarReward * treasuryPercent) / 1000);
solar.mint(investorAddress, (solarReward * investorPercent) / 1000);
solar.mint(address(this), (solarReward * lpPercent) / 1000);
pool.accSolarPerShare +=
(((solarReward * ACC_TOKEN_PRECISION) / pool.totalLp) * lpPercent) /
1000;
pool.lastRewardTimestamp = block.timestamp;
emit UpdatePool(
_pid,
pool.lastRewardTimestamp,
lpSupply,
pool.accSolarPerShare
);
}
function depositWithPermit(
uint256 pid,
uint256 amount,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) public nonReentrant validatePoolByPid(pid) {
PoolInfo storage pool = poolInfo[pid];
ISolarPair pair = ISolarPair(address(pool.lpToken));
pair.permit(msg.sender, address(this), amount, deadline, v, r, s);
_deposit(pid, amount);
}
// Deposit tokens for Solar allocation.
function deposit(uint256 _pid, uint256 _amount) public nonReentrant {
_deposit(_pid, _amount);
}
// Deposit tokens for Solar allocation.
function _deposit(uint256 _pid, uint256 _amount)
internal
validatePoolByPid(_pid)
{
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
_updatePool(_pid);
payOrLockupPendingSolar(_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(solar)) {
totalSolarInPools += _amount;
}
}
user.rewardDebt =
(user.amount * pool.accSolarPerShare) /
ACC_TOKEN_PRECISION;
for (
uint256 rewarderId = 0;
rewarderId < pool.rewarders.length;
++rewarderId
) {
pool.rewarders[rewarderId].onSolarReward(
_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);
payOrLockupPendingSolar(_pid);
if (_amount > 0) {
user.amount -= _amount;
if (address(pool.lpToken) == address(solar)) {
totalSolarInPools -= _amount;
}
pool.lpToken.safeTransfer(msg.sender, _amount);
}
user.rewardDebt =
(user.amount * pool.accSolarPerShare) /
ACC_TOKEN_PRECISION;
for (
uint256 rewarderId = 0;
rewarderId < pool.rewarders.length;
++rewarderId
) {
pool.rewarders[rewarderId].onSolarReward(
_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].onSolarReward(_pid, msg.sender, 0);
}
if (address(pool.lpToken) == address(solar)) {
totalSolarInPools -= amount;
}
pool.lpToken.safeTransfer(msg.sender, amount);
emit EmergencyWithdraw(msg.sender, _pid, amount);
}
// Pay or lockup pending Solar.
function payOrLockupPendingSolar(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.accSolarPerShare) /
ACC_TOKEN_PRECISION) - user.rewardDebt;
if (canHarvest(_pid, msg.sender)) {
if (pending > 0 || user.rewardLockedUp > 0) {
// reset lockup
totalLockedUpRewards -= user.rewardLockedUp;
user.rewardLockedUp = 0;
user.nextHarvestUntil = block.timestamp + pool.harvestInterval;
// send rewards
safeSolarTransfer(msg.sender, pending + user.rewardLockedUp);
}
} else if (pending > 0) {
totalLockedUpRewards += pending;
user.rewardLockedUp += pending;
emit RewardLockedUp(msg.sender, _pid, pending);
}
}
// Safe Solar transfer function, just in case if rounding error causes pool do not have enough Solar.
function safeSolarTransfer(address _to, uint256 _amount) internal {
if (solar.balanceOf(address(this)) > totalSolarInPools) {
//solarBal = total Solar in SolarDistributor - total Solar in Solar pools, this will make sure that SolarDistributor never transfer rewards from deposited Solar pools
uint256 solarBal = solar.balanceOf(address(this)) -
totalSolarInPools;
if (_amount >= solarBal) {
solar.safeTransfer(_to, solarBal);
} else if (_amount > 0) {
solar.safeTransfer(_to, _amount);
}
}
}
function updateEmissionRate(uint256 _solarPerSec) public onlyOwner {
_massUpdatePools();
emit EmissionRateUpdated(msg.sender, solarPerSec, _solarPerSec);
solarPerSec = _solarPerSec;
}
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) {
// check if pool exists
if (index < poolInfo.length) {
_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"
);
teamAddress = _teamAddress;
emit SetTeamAddress(msg.sender, _teamAddress);
}
function setTeamPercent(uint256 _newTeamPercent) public onlyOwner {
require(
0 <= _newTeamPercent && _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"
);
treasuryAddress = _treasuryAddress;
emit SetTreasuryAddress(msg.sender, _treasuryAddress);
}
function setTreasuryPercent(uint256 _newTreasuryPercent) public onlyOwner {
require(
0 <= _newTreasuryPercent && _newTreasuryPercent <= 1000,
"set treasury percent: invalid percent value"
);
require(
teamPercent + _newTreasuryPercent + investorPercent <= 1000,
"set treasury percent: total percent over max"
);
emit SetTeamPercent(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"
);
investorAddress = _investorAddress;
emit SetInvestorAddress(msg.sender, _investorAddress);
}
function setInvestorPercent(uint256 _newInvestorPercent) public onlyOwner {
require(
0 <= _newInvestorPercent && _newInvestorPercent <= 1000,
"set investor percent: invalid percent value"
);
require(
teamPercent + _newInvestorPercent + treasuryPercent <= 1000,
"set investor percent: total percent over max"
);
emit SetTeamPercent(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);
}
function _verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) private pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import "../libraries/IBoringERC20.sol";
interface IComplexRewarder {
function onSolarReward(
uint256 pid,
address user,
uint256 newLpAmount
) external;
function pendingTokens(uint256 pid, address user)
external
view
returns (uint256 pending);
function rewardToken() external view returns (IBoringERC20);
function poolRewardsPerSec(uint256 pid) external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
// solhint-disable avoid-low-level-calls
import "./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: MIT
pragma solidity ^0.8.7;
interface ISolarPair {
function initialize(address, address) external;
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;
/*
* @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.7;
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;
}{
"optimizer": {
"enabled": true,
"runs": 999999
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"metadata": {
"useLiteralContent": true
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IBoringERC20","name":"_solar","type":"address"},{"internalType":"uint256","name":"_solarPerSec","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":"accSolarPerShare","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":"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":"accSolarPerShare","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":"solar","outputs":[{"internalType":"contract IBoringERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"solarPerSec","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"totalSolarInPools","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":"_solarPerSec","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
60a06040526000600681905560095564e8d4a510006080523480156200002457600080fd5b5060405162005c4738038062005c478339810160408190526200004791620002cf565b62000052336200027f565b600180556103e8831115620000be5760405162461bcd60e51b815260206004820152602760248201527f636f6e7374727563746f723a20696e76616c6964207465616d2070657263656e604482015266742076616c756560c81b60648201526084015b60405180910390fd5b6103e8821115620001265760405162461bcd60e51b815260206004820152602b60248201527f636f6e7374727563746f723a20696e76616c696420747265617375727920706560448201526a7263656e742076616c756560a81b6064820152608401620000b5565b6103e88111156200018e5760405162461bcd60e51b815260206004820152602b60248201527f636f6e7374727563746f723a20696e76616c696420696e766573746f7220706560448201526a7263656e742076616c756560a81b6064820152608401620000b5565b6103e8816200019e84866200035e565b620001aa91906200035e565b1115620002065760405162461bcd60e51b815260206004820152602360248201527f636f6e7374727563746f723a20746f74616c2070657263656e74206f766572206044820152620dac2f60eb1b6064820152608401620000b5565b62000216426301e133806200035e565b600755600280546001600160a01b03199081166001600160a01b039a8b1617909155600397909755600a8054881696891696909617909555600b8054871694881694909417909355600c80549095169190951617909255600d92909255600e55600f556200039e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600080600080600080610100898b031215620002ed57600080fd5b8851620002fa8162000385565b60208a015160408b01519199509750620003148162000385565b60608a0151909650620003278162000385565b60808a01519095506200033a8162000385565b60a08a015160c08b015160e0909b0151999c989b5096999598909790945092505050565b600082198211156200038057634e487b7160e01b600052601160045260246000fd5b500190565b6001600160a01b03811681146200039b57600080fd5b50565b60805161586a620003dd6000396000818161110a0152818161361e0152818161366b015281816140210152818161414c015261490a015261586a6000f3fe608060405234801561001057600080fd5b50600436106102e95760003560e01c80636690864e11610191578063d761595c116100e3578063e6fa6d6d11610097578063eff8976b11610071578063eff8976b146106a0578063f2fde38b146106c0578063ffcd4263146106d357600080fd5b8063e6fa6d6d14610664578063e6fd48bc14610684578063eddf96521461068d57600080fd5b8063de73149d116100c8578063de73149d1461063e578063e164ac5014610648578063e2bbb1581461065157600080fd5b8063d761595c14610622578063dc640ac91461062b57600080fd5b80638da5cb5b116101455780639a26c2fa1161011f5780639a26c2fa146105f1578063afbcfea1146105fa578063c5f956af1461060257600080fd5b80638da5cb5b1461056057806393f1a40b1461057e578063949e6302146105de57600080fd5b8063812c64f111610176578063812c64f11461051e578063876d3c9c1461053a57806389a2bc251461054d57600080fd5b80636690864e14610503578063715018a61461051657600080fd5b806342602f1e1161024a578063515bc323116101fe578063630b5ba1116101d8578063630b5ba1146104d5578063654c9ece146104dd5780636605bfda146104f057600080fd5b8063515bc3231461049c57806351eb05a6146104af5780635312ea8e146104c257600080fd5b8063465e81ec1161022f578063465e81ec1461045d578063474fa63014610480578063508593ab1461048957600080fd5b806342602f1e14610437578063441a3e701461044a57600080fd5b80631526fe27116102a15780631c75f085116102865780631c75f085146103e15780632081ccc4146104015780632e6c998d1461041457600080fd5b80631526fe271461037557806317caf6f1146103d857600080fd5b8063081e3eda116102d2578063081e3eda146103135780630ba84cd21461031b57806312e228fd1461033057600080fd5b806304ef9d58146102ee5780630735b2081461030a575b600080fd5b6102f7600e5481565b6040519081526020015b60405180910390f35b6102f7600f5481565b6004546102f7565b61032e6103293660046152e8565b6106e6565b005b600c546103509073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610301565b6103886103833660046152e8565b6107b7565b6040805173ffffffffffffffffffffffffffffffffffffffff9098168852602088019690965294860193909352606085019190915261ffff16608084015260a083015260c082015260e001610301565b6102f760065481565b600a546103509073ffffffffffffffffffffffffffffffffffffffff1681565b61032e61040f3660046153e6565b610821565b61042761042236600461531a565b610c7f565b6040519015158152602001610301565b61032e61044536600461517f565b610d3d565b61032e6104583660046153c4565b610e7b565b61047061046b3660046152e8565b611277565b6040516103019493929190615585565b6102f760085481565b61032e61049736600461534a565b611998565b61032e6104aa366004615416565b611ebd565b61032e6104bd3660046152e8565b61208a565b61032e6104d03660046152e8565b61210c565b61032e6123f9565b6102f76104eb3660046152e8565b612479565b61032e6104fe36600461517f565b6124a7565b61032e61051136600461517f565b6125e5565b61032e612723565b6105276103e881565b60405161ffff9091168152602001610301565b61032e6105483660046152e8565b6127b0565b61032e61055b3660046152e8565b6129b0565b60005473ffffffffffffffffffffffffffffffffffffffff16610350565b6105be61058c36600461531a565b600560209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610301565b61032e6105ec3660046152e8565b612bb0565b6102f760035481565b61032e612db0565b600b546103509073ffffffffffffffffffffffffffffffffffffffff1681565b6102f760095481565b61032e61063936600461519c565b612f18565b6102f76212750081565b6102f7600d5481565b61032e61065f3660046153c4565b613046565b6002546103509073ffffffffffffffffffffffffffffffffffffffff1681565b6102f760075481565b61032e61069b3660046153c4565b6130ca565b6106b36106ae3660046152e8565b613240565b6040516103019190615572565b61032e6106ce36600461517f565b613373565b6104706106e136600461531a565b6134a3565b60005473ffffffffffffffffffffffffffffffffffffffff16331461076c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610774613baa565b600354604080519182526020820183905233917feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511910160405180910390a2600355565b600481815481106107c757600080fd5b6000918252602090912060089091020180546001820154600283015460038401546004850154600586015460069096015473ffffffffffffffffffffffffffffffffffffffff909516965092949193909261ffff16919087565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6004548690811061090f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600a82111561097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7365743a20746f6f206d616e79207265776172646572730000000000000000006044820152606401610763565b6103e861ffff861611156109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f7365743a206465706f7369742066656520746f6f2068696768000000000000006044820152606401610763565b62127500841115610a57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7365743a20696e76616c6964206861727665737420696e74657276616c0000006044820152606401610763565b60005b82811015610b0857610a92848483818110610a7757610a776157a5565b9050602002016020810190610a8c919061517f565b3b151590565b610af8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f6164643a207265776172646572206d75737420626520636f6e747261637400006044820152606401610763565b610b018161571d565b9050610a5a565b50610b11613baa565b8560048881548110610b2557610b256157a5565b906000526020600020906008020160010154600654610b4491906156da565b610b4e919061564a565b6006819055508560048881548110610b6857610b686157a5565b9060005260206000209060080201600101819055508460048881548110610b9157610b916157a5565b906000526020600020906008020160040160006101000a81548161ffff021916908361ffff1602179055508360048881548110610bd057610bd06157a5565b906000526020600020906008020160050181905550828260048981548110610bfa57610bfa6157a5565b90600052602060002090600802016007019190610c1892919061500a565b508282604051610c29929190615507565b6040805191829003822088835261ffff881660208401529082018690529088907f5ed6f0deef9ab49d02900b40d596df4cd637a2a7fbfa56bbcb377389d3ce8d289060600160405180910390a350505050505050565b60045460009083908110610cef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600084815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290206007544210801590610d34575080600301544210155b95945050505050565b600c5473ffffffffffffffffffffffffffffffffffffffff163314610e0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f73657420696e766573746f7220616464726573733a206f6e6c7920707265766960448201527f6f757320696e766573746f722063616e2063616c6c2074686973206d6574686f60648201527f6400000000000000000000000000000000000000000000000000000000000000608482015260a401610763565b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f6260cb34f06b782e83bde168f7d74ab2133041cb53b63ce22b127822a92b679190600090a350565b60026001541415610ee8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b600260015560045482908110610f5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048481548110610f6f57610f6f6157a5565b600091825260208083208784526005825260408085203386529092529220805460089092029092019250841115611002576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f77697468647261773a207573657220616d6f756e74206e6f7420656e6f7567686044820152606401610763565b8382600601541015611070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f77697468647261773a20706f6f6c20746f74616c206e6f7420656e6f756768006044820152606401610763565b61107985613bd0565b611082856140d8565b8315611101578381600001600082825461109c91906156da565b9091555050600254825473ffffffffffffffffffffffffffffffffffffffff908116911614156110de5783600960008282546110d891906156da565b90915550505b81546111019073ffffffffffffffffffffffffffffffffffffffff163386614287565b600382015481547f0000000000000000000000000000000000000000000000000000000000000000916111339161569d565b61113d9190615662565b600182015560005b600783015481101561121457826007018181548110611166576111666157a5565b60009182526020909120015482546040517ffe8343fb00000000000000000000000000000000000000000000000000000000815260048101899052336024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff9091169063fe8343fb90606401600060405180830381600087803b1580156111eb57600080fd5b505af11580156111ff573d6000803e3d6000fd5b505050508061120d9061571d565b9050611145565b508315611235578382600601600082825461122f91906156da565b90915550505b604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a3505060018055505050565b6060806060808460048054905081106112ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048781548110611301576113016157a5565b9060005260206000209060080201905080600701805490506001611325919061564a565b67ffffffffffffffff81111561133d5761133d6157d4565b604051908082528060200260200182016040528015611366578160200160208202803683370190505b50600782015490965061137a90600161564a565b67ffffffffffffffff811115611392576113926157d4565b6040519080825280602002602001820160405280156113c557816020015b60608152602001906001900390816113b05790505b5060078201549095506113d990600161564a565b67ffffffffffffffff8111156113f1576113f16157d4565b60405190808252806020026020018201604052801561141a578160200160208202803683370190505b50600782015490945061142e90600161564a565b67ffffffffffffffff811115611446576114466157d4565b60405190808252806020026020018201604052801561146f578160200160208202803683370190505b50600254875191945073ffffffffffffffffffffffffffffffffffffffff169087906000906114a0576114a06157a5565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526002546114d091166143f7565b856000815181106114e3576114e36157a5565b60209081029190910101526002546115109073ffffffffffffffffffffffffffffffffffffffff1661450f565b60ff1684600081518110611526576115266157a5565b6020026020010181815250506006546003548260010154611547919061569d565b6115519190615662565b83600081518110611564576115646157a5565b60200260200101818152505060005b600782015481101561198e57816007018181548110611594576115946157a5565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b15801561160357600080fd5b505afa158015611617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163b9190615200565b8761164783600161564a565b81518110611657576116576157a5565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061176b8260070182815481106116a9576116a96157a5565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b15801561171857600080fd5b505afa15801561172c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117509190615200565b73ffffffffffffffffffffffffffffffffffffffff166143f7565b8661177783600161564a565b81518110611787576117876157a5565b602002602001018190525061186c8260070182815481106117aa576117aa6157a5565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b15801561181957600080fd5b505afa15801561182d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118519190615200565b73ffffffffffffffffffffffffffffffffffffffff1661450f565b60ff168561187b83600161564a565b8151811061188b5761188b6157a5565b6020026020010181815250508160070181815481106118ac576118ac6157a5565b6000918252602090912001546040517f465e81ec000000000000000000000000000000000000000000000000000000008152600481018a905273ffffffffffffffffffffffffffffffffffffffff9091169063465e81ec9060240160206040518083038186803b15801561191f57600080fd5b505afa158015611933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119579190615301565b8461196383600161564a565b81518110611973576119736157a5565b60209081029190910101526119878161571d565b9050611573565b5050509193509193565b60005473ffffffffffffffffffffffffffffffffffffffff163314611a19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b600a811115611a84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6164643a20746f6f206d616e79207265776172646572730000000000000000006044820152606401610763565b6103e861ffff85161115611af4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6164643a206465706f7369742066656520746f6f2068696768000000000000006044820152606401610763565b62127500831115611b61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c0000006044820152606401610763565b843b611bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f6164643a204c5020746f6b656e206d75737420626520612076616c696420636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610763565b60005b81811015611c8557611c0f838383818110610a7757610a776157a5565b611c75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f6164643a207265776172646572206d75737420626520636f6e747261637400006044820152606401610763565b611c7e8161571d565b9050611bf2565b50611c8e613baa565b60006007544211611ca157600754611ca3565b425b90508660066000828254611cb7919061564a565b9250508190555060046040518061010001604052808873ffffffffffffffffffffffffffffffffffffffff168152602001898152602001838152602001600081526020018761ffff168152602001868152602001600081526020018585808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250939094525050835460018082018655948252602091829020845160089092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911781558382015194810194909455604083015160028501556060830151600385015560808301516004850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff90921691909117905560a0830151600585015560c0830151600685015560e08301518051939493611e2d935060078501929190910190615092565b5050508282604051611e40929190615507565b60405190819003902060045473ffffffffffffffffffffffffffffffffffffffff881690611e70906001906156da565b604080518b815261ffff8a1660208201529081018890527f5ed295c4f5af5aeb1ccd905e1cd55a86ab3bb9fc1fe2346ff64ac47dbef366619060600160405180910390a450505050505050565b60026001541415611f2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b600260015560045486908110611f9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048881548110611fb157611fb16157a5565b6000918252602090912060089091020180546040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018a90526064810189905260ff8816608482015260a4810187905260c4810186905291925073ffffffffffffffffffffffffffffffffffffffff1690819063d505accf9060e401600060405180830381600087803b15801561205957600080fd5b505af115801561206d573d6000803e3d6000fd5b5050505061207b8989614602565b50506001805550505050505050565b600260015414156120f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b600260015561210581613bd0565b5060018055565b60026001541415612179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b6002600181905550600060048281548110612196576121966157a5565b60009182526020808320858452600582526040808520338652909252922080546008929092029092016006810154909350811115612256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f656d657267656e63792077697468647261773a20706f6f6c20746f74616c206e60448201527f6f7420656e6f75676800000000000000000000000000000000000000000000006064820152608401610763565b60008083556001830181905560028301819055600383018190556006840180548392906122849084906156da565b90915550600090505b6007840154811015612357578360070181815481106122ae576122ae6157a5565b60009182526020822001546040517ffe8343fb00000000000000000000000000000000000000000000000000000000815260048101889052336024820152604481019290925273ffffffffffffffffffffffffffffffffffffffff169063fe8343fb90606401600060405180830381600087803b15801561232e57600080fd5b505af1158015612342573d6000803e3d6000fd5b50505050806123509061571d565b905061228d565b50600254835473ffffffffffffffffffffffffffffffffffffffff9081169116141561239557806009600082825461238f91906156da565b90915550505b82546123b89073ffffffffffffffffffffffffffffffffffffffff163383614287565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a35050600180555050565b60026001541415612466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b6002600155612473613baa565b60018055565b60006004828154811061248e5761248e6157a5565b9060005260206000209060080201600601549050919050565b600b5473ffffffffffffffffffffffffffffffffffffffff163314612574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f73657420747265617375727920616464726573733a206f6e6c7920707265766960448201527f6f757320747265617375727920616464726573732063616e2063616c6c20746860648201527f6973206d6574686f640000000000000000000000000000000000000000000000608482015260a401610763565b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f61885cdba916be748ff3e3f6f15e4206153b8ea3b7acabade9d04b4063a8351090600090a350565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146126b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f736574207465616d20616464726573733a206f6e6c792070726576696f75732060448201527f7465616d20616464726573732063616e2063616c6c2074686973206d6574686f60648201527f6400000000000000000000000000000000000000000000000000000000000000608482015260a401610763565b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f42fbc17d847fdc3e5c82da842a5ef3979c64f3b94cd4e7382310fd5525c6ee0f90600090a350565b60005473ffffffffffffffffffffffffffffffffffffffff1633146127a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6127ae6000614a73565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314612831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6103e88111156128c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f73657420696e766573746f722070657263656e743a20696e76616c696420706560448201527f7263656e742076616c75650000000000000000000000000000000000000000006064820152608401610763565b6103e8600e5482600d546128d7919061564a565b6128e1919061564a565b111561296f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f73657420696e766573746f722070657263656e743a20746f74616c207065726360448201527f656e74206f766572206d617800000000000000000000000000000000000000006064820152608401610763565b600f5460408051918252602082018390527f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6910160405180910390a1600f55565b60005473ffffffffffffffffffffffffffffffffffffffff163314612a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6103e8811115612ac3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f7365742074726561737572792070657263656e743a20696e76616c696420706560448201527f7263656e742076616c75650000000000000000000000000000000000000000006064820152608401610763565b6103e8600f5482600d54612ad7919061564a565b612ae1919061564a565b1115612b6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f7365742074726561737572792070657263656e743a20746f74616c207065726360448201527f656e74206f766572206d617800000000000000000000000000000000000000006064820152608401610763565b600e5460408051918252602082018390527f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6910160405180910390a1600e55565b60005473ffffffffffffffffffffffffffffffffffffffff163314612c31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6103e8811115612cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f736574207465616d2070657263656e743a20696e76616c69642070657263656e60448201527f742076616c7565000000000000000000000000000000000000000000000000006064820152608401610763565b6103e8600f5482600e54612cd7919061564a565b612ce1919061564a565b1115612d6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f736574207465616d2070657263656e743a20746f74616c2070657263656e742060448201527f6f766572206d61780000000000000000000000000000000000000000000000006064820152608401610763565b600d5460408051918252602082018390527f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6910160405180910390a1600d55565b60005473ffffffffffffffffffffffffffffffffffffffff163314612e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6007544210612ec2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f7374617274206661726d696e673a206661726d207374617274656420616c726560448201527f61647900000000000000000000000000000000000000000000000000000000006064820152608401610763565b60045460005b81811015612f1057600060048281548110612ee557612ee56157a5565b906000526020600020906008020190504281600201819055505080612f099061571d565b9050612ec8565b505042600755565b60026001541415612f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b6002600155601e811115612ff5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f68617276657374206d616e793a20746f6f206d616e7920706f6f6c20696473006044820152606401610763565b60005b8181101561303d5760045481101561302d5761302d83838381811061301f5761301f6157a5565b905060200201356000614602565b6130368161571d565b9050612ff8565b50506001805550565b600260015414156130b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b60026001556130c28282614602565b505060018055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461314b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b613153613baa565b3373ffffffffffffffffffffffffffffffffffffffff167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef36004848154811061319e5761319e6157a5565b906000526020600020906008020160010154836040516131c8929190918252602082015260400190565b60405180910390a280600483815481106131e4576131e46157a5565b90600052602060002090600802016001015460065461320391906156da565b61320d919061564a565b6006819055508060048381548110613227576132276157a5565b9060005260206000209060080201600101819055505050565b600454606090829081106132b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b6000600484815481106132c5576132c56157a5565b9060005260206000209060080201905060005b600782015481101561336b578160070181815481106132f9576132f96157a5565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848281518110613336576133366157a5565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526133648161571d565b90506132d8565b505050919050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146133f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b73ffffffffffffffffffffffffffffffffffffffff8116613497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610763565b6134a081614a73565b50565b606080606080856004805490508110613518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b60006004888154811061352d5761352d6157a5565b600091825260208083208b845260058252604080852073ffffffffffffffffffffffffffffffffffffffff8d168652909252922060036008909202909201908101546006820154600283015492945090914211801561358b57508015155b1561365d5760008460020154426135a291906156da565b90506000600f54600e54600d546103e86135bc91906156da565b6135c691906156da565b6135d091906156da565b905060006103e8826006548960010154600354876135ee919061569d565b6135f8919061569d565b6136029190615662565b61360c919061569d565b6136169190615662565b9050836136437f00000000000000000000000000000000000000000000000000000000000000008361569d565b61364d9190615662565b613657908661564a565b94505050505b6000836002015484600101547f000000000000000000000000000000000000000000000000000000000000000085876000015461369a919061569d565b6136a49190615662565b6136ae91906156da565b6136b8919061564a565b60078601549091506136cb90600161564a565b67ffffffffffffffff8111156136e3576136e36157d4565b60405190808252806020026020018201604052801561370c578160200160208202803683370190505b506007860154909a5061372090600161564a565b67ffffffffffffffff811115613738576137386157d4565b60405190808252806020026020018201604052801561376b57816020015b60608152602001906001900390816137565790505b50600786015490995061377f90600161564a565b67ffffffffffffffff811115613797576137976157d4565b6040519080825280602002602001820160405280156137c0578160200160208202803683370190505b5060078601549097506137d490600161564a565b67ffffffffffffffff8111156137ec576137ec6157d4565b604051908082528060200260200182016040528015613815578160200160208202803683370190505b506002548b5191995073ffffffffffffffffffffffffffffffffffffffff16908b90600090613846576138466157a5565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201015260025461387691166143f7565b89600081518110613889576138896157a5565b60209081029190910101526002546138b69073ffffffffffffffffffffffffffffffffffffffff1661450f565b60ff16886000815181106138cc576138cc6157a5565b60200260200101818152505080876000815181106138ec576138ec6157a5565b60200260200101818152505060005b6007860154811015613b9a5785600701818154811061391c5761391c6157a5565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b15801561398b57600080fd5b505afa15801561399f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139c39190615200565b8b6139cf83600161564a565b815181106139df576139df6157a5565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613a318660070182815481106116a9576116a96157a5565b8a613a3d83600161564a565b81518110613a4d57613a4d6157a5565b6020026020010181905250613a708660070182815481106117aa576117aa6157a5565b60ff1689613a7f83600161564a565b81518110613a8f57613a8f6157a5565b602002602001018181525050856007018181548110613ab057613ab06157a5565b6000918252602090912001546040517fffcd4263000000000000000000000000000000000000000000000000000000008152600481018f905273ffffffffffffffffffffffffffffffffffffffff8e811660248301529091169063ffcd42639060440160206040518083038186803b158015613b2b57600080fd5b505afa158015613b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b639190615301565b88613b6f83600161564a565b81518110613b7f57613b7f6157a5565b6020908102919091010152613b938161571d565b90506138fb565b5050505050505092959194509250565b60005b6004548110156134a057613bc081613bd0565b613bc98161571d565b9050613bad565b60045481908110613c3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048381548110613c5257613c526157a5565b9060005260206000209060080201905080600201544211613c7257505050565b6006810154801580613c8657506001820154155b15613c975750426002909101555050565b6000826002015442613ca991906156da565b90506000600654846001015460035484613cc3919061569d565b613ccd919061569d565b613cd79190615662565b90506000600f54600e54600d546103e8613cf191906156da565b613cfb91906156da565b613d0591906156da565b600254600a54600d5492935073ffffffffffffffffffffffffffffffffffffffff918216926340c10f1992909116906103e890613d42908761569d565b613d4c9190615662565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613db757600080fd5b505af1158015613dcb573d6000803e3d6000fd5b5050600254600b54600e5473ffffffffffffffffffffffffffffffffffffffff92831694506340c10f1993509116906103e890613e08908761569d565b613e129190615662565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613e7d57600080fd5b505af1158015613e91573d6000803e3d6000fd5b5050600254600c54600f5473ffffffffffffffffffffffffffffffffffffffff92831694506340c10f1993509116906103e890613ece908761569d565b613ed89190615662565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613f4357600080fd5b505af1158015613f57573d6000803e3d6000fd5b505060025473ffffffffffffffffffffffffffffffffffffffff1691506340c10f199050306103e8613f89858761569d565b613f939190615662565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613ffe57600080fd5b505af1158015614012573d6000803e3d6000fd5b505050506103e88186600601547f00000000000000000000000000000000000000000000000000000000000000008561404b919061569d565b6140559190615662565b61405f919061569d565b6140699190615662565b85600301600082825461407c919061564a565b909155505042600286018190556003860154604080519283526020830187905282015287907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469060600160405180910390a250505050505b5050565b6000600482815481106140ed576140ed6157a5565b60009182526020808320858452600582526040808520338652909252922060038101546008909202909201925015801561412957506007544210155b1561414357600582015461413d904261564a565b60038201555b600081600101547f00000000000000000000000000000000000000000000000000000000000000008460030154846000015461417f919061569d565b6141899190615662565b61419391906156da565b905061419f8433610c7f565b156142115760008111806141b7575060008260020154115b1561420c578160020154600860008282546141d291906156da565b90915550506000600283015560058301546141ed904261564a565b6003830155600282015461420c903390614207908461564a565b614ae8565b614281565b8015614281578060086000828254614229919061564a565b9250508190555080826002016000828254614244919061564a565b9091555050604051818152849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c19060200160405180910390a35b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052915160009283929087169161431e9190615556565b6000604051808303816000865af19150503d806000811461435b576040519150601f19603f3d011682016040523d82523d6000602084013e614360565b606091505b509150915081801561438a57508051158061438a57508080602001905181019061438a91906151de565b6143f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c6564000000006044820152606401610763565b5050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916144799190615556565b600060405180830381855afa9150503d80600081146144b4576040519150601f19603f3d011682016040523d82523d6000602084013e6144b9565b606091505b5091509150816144fe576040518060400160405280600381526020017f3f3f3f0000000000000000000000000000000000000000000000000000000000815250614507565b61450781614c9e565b949350505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916145909190615556565b600060405180830381855afa9150503d80600081146145cb576040519150601f19603f3d011682016040523d82523d6000602084013e6145d0565b606091505b50915091508180156145e3575080516020145b6145ee576012614507565b808060200190518101906145079190615469565b6004548290811061466f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048481548110614684576146846157a5565b600091825260208083208784526005825260408085203386529092529220600890910290910191506146b585613bd0565b6146be856140d8565b83156149015781546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561472d57600080fd5b505afa158015614741573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147659190615301565b835490915061478c9073ffffffffffffffffffffffffffffffffffffffff16333088614e91565b82546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b1580156147f557600080fd5b505afa158015614809573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061482d9190615301565b905061483982826156da565b600485015490965061ffff16156148a8576004840154600090612710906148649061ffff168961569d565b61486e9190615662565b600b54865491925061489a9173ffffffffffffffffffffffffffffffffffffffff908116911683614287565b6148a481886156da565b9650505b858360000160008282546148bc919061564a565b9091555050600254845473ffffffffffffffffffffffffffffffffffffffff908116911614156148fe5785600960008282546148f8919061564a565b90915550505b50505b600382015481547f0000000000000000000000000000000000000000000000000000000000000000916149339161569d565b61493d9190615662565b600182015560005b6007830154811015614a1457826007018181548110614966576149666157a5565b60009182526020909120015482546040517ffe8343fb00000000000000000000000000000000000000000000000000000000815260048101899052336024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff9091169063fe8343fb90606401600060405180830381600087803b1580156149eb57600080fd5b505af11580156149ff573d6000803e3d6000fd5b5050505080614a0d9061571d565b9050614945565b508315614a355783826006016000828254614a2f919061564a565b90915550505b604051848152859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a35050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6009546002546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b158015614b5457600080fd5b505afa158015614b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b8c9190615301565b11156140d4576009546002546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000929173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015614c0057600080fd5b505afa158015614c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c389190615301565b614c4291906156da565b9050808210614c7457600254614c6f9073ffffffffffffffffffffffffffffffffffffffff168483614287565b505050565b8115614c6f57600254614c6f9073ffffffffffffffffffffffffffffffffffffffff168484614287565b60606040825110614cc35781806020019051810190614cbd919061521d565b92915050565b815160201415614e535760005b60208160ff16108015614d1d5750828160ff1681518110614cf357614cf36157a5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15614d345780614d2c81615756565b915050614cd0565b60008160ff1667ffffffffffffffff811115614d5257614d526157d4565b6040519080825280601f01601f191660200182016040528015614d7c576020820181803683370190505b509050600091505b60208260ff16108015614dd15750838260ff1681518110614da757614da76157a5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15614e4c57838260ff1681518110614deb57614deb6157a5565b602001015160f81c60f81b818360ff1681518110614e0b57614e0b6157a5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081614e4481615756565b925050614d84565b9392505050565b505060408051808201909152600381527f3f3f3f0000000000000000000000000000000000000000000000000000000000602082015290565b919050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691614f309190615556565b6000604051808303816000865af19150503d8060008114614f6d576040519150601f19603f3d011682016040523d82523d6000602084013e614f72565b606091505b5091509150818015614f9c575080511580614f9c575080806020019051810190614f9c91906151de565b615002576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646044820152606401610763565b505050505050565b828054828255906000526020600020908101928215615082579160200282015b828111156150825781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84351617825560209092019160019091019061502a565b5061508e92915061510c565b5090565b828054828255906000526020600020908101928215615082579160200282015b8281111561508257825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906150b2565b5b8082111561508e576000815560010161510d565b60008083601f84011261513357600080fd5b50813567ffffffffffffffff81111561514b57600080fd5b6020830191508360208260051b850101111561516657600080fd5b9250929050565b803561ffff81168114614e8c57600080fd5b60006020828403121561519157600080fd5b8135614e4c81615803565b600080602083850312156151af57600080fd5b823567ffffffffffffffff8111156151c657600080fd5b6151d285828601615121565b90969095509350505050565b6000602082840312156151f057600080fd5b81518015158114614e4c57600080fd5b60006020828403121561521257600080fd5b8151614e4c81615803565b60006020828403121561522f57600080fd5b815167ffffffffffffffff8082111561524757600080fd5b818401915084601f83011261525b57600080fd5b81518181111561526d5761526d6157d4565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156152b3576152b36157d4565b816040528281528760208487010111156152cc57600080fd5b6152dd8360208301602088016156f1565b979650505050505050565b6000602082840312156152fa57600080fd5b5035919050565b60006020828403121561531357600080fd5b5051919050565b6000806040838503121561532d57600080fd5b82359150602083013561533f81615803565b809150509250929050565b60008060008060008060a0878903121561536357600080fd5b86359550602087013561537581615803565b94506153836040880161516d565b935060608701359250608087013567ffffffffffffffff8111156153a657600080fd5b6153b289828a01615121565b979a9699509497509295939492505050565b600080604083850312156153d757600080fd5b50508035926020909101359150565b60008060008060008060a087890312156153ff57600080fd5b86359550602087013594506153836040880161516d565b60008060008060008060c0878903121561542f57600080fd5b863595506020870135945060408701359350606087013561544f81615825565b9598949750929560808101359460a0909101359350915050565b60006020828403121561547b57600080fd5b8151614e4c81615825565b600081518084526020808501945080840160005b838110156154cc57815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161549a565b509495945050505050565b600081518084526020808501945080840160005b838110156154cc578151875295820195908201906001016154eb565b60008184825b8581101561554b57813561552081615803565b73ffffffffffffffffffffffffffffffffffffffff168352602092830192919091019060010161550d565b509095945050505050565b600082516155688184602087016156f1565b9190910192915050565b602081526000614e4c6020830184615486565b6080815260006155986080830187615486565b6020838203818501528187518084528284019150828160051b850101838a0160005b8381101561561e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08088850301865282518051808652615600818a88018b85016156f1565b96880196601f019091169390930186019250908501906001016155ba565b50508681036040880152615632818a6154d7565b94505050505082810360608401526152dd81856154d7565b6000821982111561565d5761565d615776565b500190565b600082615698577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156d5576156d5615776565b500290565b6000828210156156ec576156ec615776565b500390565b60005b8381101561570c5781810151838201526020016156f4565b838111156142815750506000910152565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561574f5761574f615776565b5060010190565b600060ff821660ff81141561576d5761576d615776565b60010192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146134a057600080fd5b60ff811681146134a057600080fdfea2646970667358221220b083ffec018d73e7aeeae6ec475da21ffe3d18527400829aaf582e09582805dd64736f6c634300080700330000000000000000000000006bd193ee6d2104f14f94e2ca6efefae561a4334b0000000000000000000000000000000000000000000000000149af4a11dde0000000000000000000000000001375d820e32eec62cdd75c3e95b1e71a830b2149000000000000000000000000cf7cebc20baca0fac5be6dd665feb8962e5d4e67000000000000000000000000be0d20bb3cb8766e74b3b5f9382eae56cdade492000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102e95760003560e01c80636690864e11610191578063d761595c116100e3578063e6fa6d6d11610097578063eff8976b11610071578063eff8976b146106a0578063f2fde38b146106c0578063ffcd4263146106d357600080fd5b8063e6fa6d6d14610664578063e6fd48bc14610684578063eddf96521461068d57600080fd5b8063de73149d116100c8578063de73149d1461063e578063e164ac5014610648578063e2bbb1581461065157600080fd5b8063d761595c14610622578063dc640ac91461062b57600080fd5b80638da5cb5b116101455780639a26c2fa1161011f5780639a26c2fa146105f1578063afbcfea1146105fa578063c5f956af1461060257600080fd5b80638da5cb5b1461056057806393f1a40b1461057e578063949e6302146105de57600080fd5b8063812c64f111610176578063812c64f11461051e578063876d3c9c1461053a57806389a2bc251461054d57600080fd5b80636690864e14610503578063715018a61461051657600080fd5b806342602f1e1161024a578063515bc323116101fe578063630b5ba1116101d8578063630b5ba1146104d5578063654c9ece146104dd5780636605bfda146104f057600080fd5b8063515bc3231461049c57806351eb05a6146104af5780635312ea8e146104c257600080fd5b8063465e81ec1161022f578063465e81ec1461045d578063474fa63014610480578063508593ab1461048957600080fd5b806342602f1e14610437578063441a3e701461044a57600080fd5b80631526fe27116102a15780631c75f085116102865780631c75f085146103e15780632081ccc4146104015780632e6c998d1461041457600080fd5b80631526fe271461037557806317caf6f1146103d857600080fd5b8063081e3eda116102d2578063081e3eda146103135780630ba84cd21461031b57806312e228fd1461033057600080fd5b806304ef9d58146102ee5780630735b2081461030a575b600080fd5b6102f7600e5481565b6040519081526020015b60405180910390f35b6102f7600f5481565b6004546102f7565b61032e6103293660046152e8565b6106e6565b005b600c546103509073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610301565b6103886103833660046152e8565b6107b7565b6040805173ffffffffffffffffffffffffffffffffffffffff9098168852602088019690965294860193909352606085019190915261ffff16608084015260a083015260c082015260e001610301565b6102f760065481565b600a546103509073ffffffffffffffffffffffffffffffffffffffff1681565b61032e61040f3660046153e6565b610821565b61042761042236600461531a565b610c7f565b6040519015158152602001610301565b61032e61044536600461517f565b610d3d565b61032e6104583660046153c4565b610e7b565b61047061046b3660046152e8565b611277565b6040516103019493929190615585565b6102f760085481565b61032e61049736600461534a565b611998565b61032e6104aa366004615416565b611ebd565b61032e6104bd3660046152e8565b61208a565b61032e6104d03660046152e8565b61210c565b61032e6123f9565b6102f76104eb3660046152e8565b612479565b61032e6104fe36600461517f565b6124a7565b61032e61051136600461517f565b6125e5565b61032e612723565b6105276103e881565b60405161ffff9091168152602001610301565b61032e6105483660046152e8565b6127b0565b61032e61055b3660046152e8565b6129b0565b60005473ffffffffffffffffffffffffffffffffffffffff16610350565b6105be61058c36600461531a565b600560209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610301565b61032e6105ec3660046152e8565b612bb0565b6102f760035481565b61032e612db0565b600b546103509073ffffffffffffffffffffffffffffffffffffffff1681565b6102f760095481565b61032e61063936600461519c565b612f18565b6102f76212750081565b6102f7600d5481565b61032e61065f3660046153c4565b613046565b6002546103509073ffffffffffffffffffffffffffffffffffffffff1681565b6102f760075481565b61032e61069b3660046153c4565b6130ca565b6106b36106ae3660046152e8565b613240565b6040516103019190615572565b61032e6106ce36600461517f565b613373565b6104706106e136600461531a565b6134a3565b60005473ffffffffffffffffffffffffffffffffffffffff16331461076c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610774613baa565b600354604080519182526020820183905233917feedc6338c9c1ad8f3cd6c90dd09dbe98dbd57e610d3e59a17996d07acb0d9511910160405180910390a2600355565b600481815481106107c757600080fd5b6000918252602090912060089091020180546001820154600283015460038401546004850154600586015460069096015473ffffffffffffffffffffffffffffffffffffffff909516965092949193909261ffff16919087565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6004548690811061090f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600a82111561097a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7365743a20746f6f206d616e79207265776172646572730000000000000000006044820152606401610763565b6103e861ffff861611156109ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f7365743a206465706f7369742066656520746f6f2068696768000000000000006044820152606401610763565b62127500841115610a57576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7365743a20696e76616c6964206861727665737420696e74657276616c0000006044820152606401610763565b60005b82811015610b0857610a92848483818110610a7757610a776157a5565b9050602002016020810190610a8c919061517f565b3b151590565b610af8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f6164643a207265776172646572206d75737420626520636f6e747261637400006044820152606401610763565b610b018161571d565b9050610a5a565b50610b11613baa565b8560048881548110610b2557610b256157a5565b906000526020600020906008020160010154600654610b4491906156da565b610b4e919061564a565b6006819055508560048881548110610b6857610b686157a5565b9060005260206000209060080201600101819055508460048881548110610b9157610b916157a5565b906000526020600020906008020160040160006101000a81548161ffff021916908361ffff1602179055508360048881548110610bd057610bd06157a5565b906000526020600020906008020160050181905550828260048981548110610bfa57610bfa6157a5565b90600052602060002090600802016007019190610c1892919061500a565b508282604051610c29929190615507565b6040805191829003822088835261ffff881660208401529082018690529088907f5ed6f0deef9ab49d02900b40d596df4cd637a2a7fbfa56bbcb377389d3ce8d289060600160405180910390a350505050505050565b60045460009083908110610cef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600084815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915290206007544210801590610d34575080600301544210155b95945050505050565b600c5473ffffffffffffffffffffffffffffffffffffffff163314610e0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f73657420696e766573746f7220616464726573733a206f6e6c7920707265766960448201527f6f757320696e766573746f722063616e2063616c6c2074686973206d6574686f60648201527f6400000000000000000000000000000000000000000000000000000000000000608482015260a401610763565b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f6260cb34f06b782e83bde168f7d74ab2133041cb53b63ce22b127822a92b679190600090a350565b60026001541415610ee8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b600260015560045482908110610f5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048481548110610f6f57610f6f6157a5565b600091825260208083208784526005825260408085203386529092529220805460089092029092019250841115611002576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f77697468647261773a207573657220616d6f756e74206e6f7420656e6f7567686044820152606401610763565b8382600601541015611070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f77697468647261773a20706f6f6c20746f74616c206e6f7420656e6f756768006044820152606401610763565b61107985613bd0565b611082856140d8565b8315611101578381600001600082825461109c91906156da565b9091555050600254825473ffffffffffffffffffffffffffffffffffffffff908116911614156110de5783600960008282546110d891906156da565b90915550505b81546111019073ffffffffffffffffffffffffffffffffffffffff163386614287565b600382015481547f000000000000000000000000000000000000000000000000000000e8d4a51000916111339161569d565b61113d9190615662565b600182015560005b600783015481101561121457826007018181548110611166576111666157a5565b60009182526020909120015482546040517ffe8343fb00000000000000000000000000000000000000000000000000000000815260048101899052336024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff9091169063fe8343fb90606401600060405180830381600087803b1580156111eb57600080fd5b505af11580156111ff573d6000803e3d6000fd5b505050508061120d9061571d565b9050611145565b508315611235578382600601600082825461122f91906156da565b90915550505b604051848152859033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a3505060018055505050565b6060806060808460048054905081106112ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048781548110611301576113016157a5565b9060005260206000209060080201905080600701805490506001611325919061564a565b67ffffffffffffffff81111561133d5761133d6157d4565b604051908082528060200260200182016040528015611366578160200160208202803683370190505b50600782015490965061137a90600161564a565b67ffffffffffffffff811115611392576113926157d4565b6040519080825280602002602001820160405280156113c557816020015b60608152602001906001900390816113b05790505b5060078201549095506113d990600161564a565b67ffffffffffffffff8111156113f1576113f16157d4565b60405190808252806020026020018201604052801561141a578160200160208202803683370190505b50600782015490945061142e90600161564a565b67ffffffffffffffff811115611446576114466157d4565b60405190808252806020026020018201604052801561146f578160200160208202803683370190505b50600254875191945073ffffffffffffffffffffffffffffffffffffffff169087906000906114a0576114a06157a5565b73ffffffffffffffffffffffffffffffffffffffff92831660209182029290920101526002546114d091166143f7565b856000815181106114e3576114e36157a5565b60209081029190910101526002546115109073ffffffffffffffffffffffffffffffffffffffff1661450f565b60ff1684600081518110611526576115266157a5565b6020026020010181815250506006546003548260010154611547919061569d565b6115519190615662565b83600081518110611564576115646157a5565b60200260200101818152505060005b600782015481101561198e57816007018181548110611594576115946157a5565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b15801561160357600080fd5b505afa158015611617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163b9190615200565b8761164783600161564a565b81518110611657576116576157a5565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505061176b8260070182815481106116a9576116a96157a5565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b15801561171857600080fd5b505afa15801561172c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117509190615200565b73ffffffffffffffffffffffffffffffffffffffff166143f7565b8661177783600161564a565b81518110611787576117876157a5565b602002602001018190525061186c8260070182815481106117aa576117aa6157a5565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b15801561181957600080fd5b505afa15801561182d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118519190615200565b73ffffffffffffffffffffffffffffffffffffffff1661450f565b60ff168561187b83600161564a565b8151811061188b5761188b6157a5565b6020026020010181815250508160070181815481106118ac576118ac6157a5565b6000918252602090912001546040517f465e81ec000000000000000000000000000000000000000000000000000000008152600481018a905273ffffffffffffffffffffffffffffffffffffffff9091169063465e81ec9060240160206040518083038186803b15801561191f57600080fd5b505afa158015611933573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119579190615301565b8461196383600161564a565b81518110611973576119736157a5565b60209081029190910101526119878161571d565b9050611573565b5050509193509193565b60005473ffffffffffffffffffffffffffffffffffffffff163314611a19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b600a811115611a84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6164643a20746f6f206d616e79207265776172646572730000000000000000006044820152606401610763565b6103e861ffff85161115611af4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6164643a206465706f7369742066656520746f6f2068696768000000000000006044820152606401610763565b62127500831115611b61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c0000006044820152606401610763565b843b611bef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f6164643a204c5020746f6b656e206d75737420626520612076616c696420636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401610763565b60005b81811015611c8557611c0f838383818110610a7757610a776157a5565b611c75576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f6164643a207265776172646572206d75737420626520636f6e747261637400006044820152606401610763565b611c7e8161571d565b9050611bf2565b50611c8e613baa565b60006007544211611ca157600754611ca3565b425b90508660066000828254611cb7919061564a565b9250508190555060046040518061010001604052808873ffffffffffffffffffffffffffffffffffffffff168152602001898152602001838152602001600081526020018761ffff168152602001868152602001600081526020018585808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250939094525050835460018082018655948252602091829020845160089092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9092169190911781558382015194810194909455604083015160028501556060830151600385015560808301516004850180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001661ffff90921691909117905560a0830151600585015560c0830151600685015560e08301518051939493611e2d935060078501929190910190615092565b5050508282604051611e40929190615507565b60405190819003902060045473ffffffffffffffffffffffffffffffffffffffff881690611e70906001906156da565b604080518b815261ffff8a1660208201529081018890527f5ed295c4f5af5aeb1ccd905e1cd55a86ab3bb9fc1fe2346ff64ac47dbef366619060600160405180910390a450505050505050565b60026001541415611f2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b600260015560045486908110611f9c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048881548110611fb157611fb16157a5565b6000918252602090912060089091020180546040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018a90526064810189905260ff8816608482015260a4810187905260c4810186905291925073ffffffffffffffffffffffffffffffffffffffff1690819063d505accf9060e401600060405180830381600087803b15801561205957600080fd5b505af115801561206d573d6000803e3d6000fd5b5050505061207b8989614602565b50506001805550505050505050565b600260015414156120f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b600260015561210581613bd0565b5060018055565b60026001541415612179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b6002600181905550600060048281548110612196576121966157a5565b60009182526020808320858452600582526040808520338652909252922080546008929092029092016006810154909350811115612256576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f656d657267656e63792077697468647261773a20706f6f6c20746f74616c206e60448201527f6f7420656e6f75676800000000000000000000000000000000000000000000006064820152608401610763565b60008083556001830181905560028301819055600383018190556006840180548392906122849084906156da565b90915550600090505b6007840154811015612357578360070181815481106122ae576122ae6157a5565b60009182526020822001546040517ffe8343fb00000000000000000000000000000000000000000000000000000000815260048101889052336024820152604481019290925273ffffffffffffffffffffffffffffffffffffffff169063fe8343fb90606401600060405180830381600087803b15801561232e57600080fd5b505af1158015612342573d6000803e3d6000fd5b50505050806123509061571d565b905061228d565b50600254835473ffffffffffffffffffffffffffffffffffffffff9081169116141561239557806009600082825461238f91906156da565b90915550505b82546123b89073ffffffffffffffffffffffffffffffffffffffff163383614287565b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959060200160405180910390a35050600180555050565b60026001541415612466576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b6002600155612473613baa565b60018055565b60006004828154811061248e5761248e6157a5565b9060005260206000209060080201600601549050919050565b600b5473ffffffffffffffffffffffffffffffffffffffff163314612574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604960248201527f73657420747265617375727920616464726573733a206f6e6c7920707265766960448201527f6f757320747265617375727920616464726573732063616e2063616c6c20746860648201527f6973206d6574686f640000000000000000000000000000000000000000000000608482015260a401610763565b600b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f61885cdba916be748ff3e3f6f15e4206153b8ea3b7acabade9d04b4063a8351090600090a350565b600a5473ffffffffffffffffffffffffffffffffffffffff1633146126b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604160248201527f736574207465616d20616464726573733a206f6e6c792070726576696f75732060448201527f7465616d20616464726573732063616e2063616c6c2074686973206d6574686f60648201527f6400000000000000000000000000000000000000000000000000000000000000608482015260a401610763565b600a80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907f42fbc17d847fdc3e5c82da842a5ef3979c64f3b94cd4e7382310fd5525c6ee0f90600090a350565b60005473ffffffffffffffffffffffffffffffffffffffff1633146127a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6127ae6000614a73565b565b60005473ffffffffffffffffffffffffffffffffffffffff163314612831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6103e88111156128c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f73657420696e766573746f722070657263656e743a20696e76616c696420706560448201527f7263656e742076616c75650000000000000000000000000000000000000000006064820152608401610763565b6103e8600e5482600d546128d7919061564a565b6128e1919061564a565b111561296f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f73657420696e766573746f722070657263656e743a20746f74616c207065726360448201527f656e74206f766572206d617800000000000000000000000000000000000000006064820152608401610763565b600f5460408051918252602082018390527f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6910160405180910390a1600f55565b60005473ffffffffffffffffffffffffffffffffffffffff163314612a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6103e8811115612ac3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f7365742074726561737572792070657263656e743a20696e76616c696420706560448201527f7263656e742076616c75650000000000000000000000000000000000000000006064820152608401610763565b6103e8600f5482600d54612ad7919061564a565b612ae1919061564a565b1115612b6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f7365742074726561737572792070657263656e743a20746f74616c207065726360448201527f656e74206f766572206d617800000000000000000000000000000000000000006064820152608401610763565b600e5460408051918252602082018390527f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6910160405180910390a1600e55565b60005473ffffffffffffffffffffffffffffffffffffffff163314612c31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6103e8811115612cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f736574207465616d2070657263656e743a20696e76616c69642070657263656e60448201527f742076616c7565000000000000000000000000000000000000000000000000006064820152608401610763565b6103e8600f5482600e54612cd7919061564a565b612ce1919061564a565b1115612d6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f736574207465616d2070657263656e743a20746f74616c2070657263656e742060448201527f6f766572206d61780000000000000000000000000000000000000000000000006064820152608401610763565b600d5460408051918252602082018390527f204a076f4a2e4e5e646bb8841cc285306bf747e277f40dbfd5750e782e17b7a6910160405180910390a1600d55565b60005473ffffffffffffffffffffffffffffffffffffffff163314612e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b6007544210612ec2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f7374617274206661726d696e673a206661726d207374617274656420616c726560448201527f61647900000000000000000000000000000000000000000000000000000000006064820152608401610763565b60045460005b81811015612f1057600060048281548110612ee557612ee56157a5565b906000526020600020906008020190504281600201819055505080612f099061571d565b9050612ec8565b505042600755565b60026001541415612f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b6002600155601e811115612ff5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f68617276657374206d616e793a20746f6f206d616e7920706f6f6c20696473006044820152606401610763565b60005b8181101561303d5760045481101561302d5761302d83838381811061301f5761301f6157a5565b905060200201356000614602565b6130368161571d565b9050612ff8565b50506001805550565b600260015414156130b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610763565b60026001556130c28282614602565b505060018055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461314b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b613153613baa565b3373ffffffffffffffffffffffffffffffffffffffff167f802633c8d26237616d81bdac01bc40fcdf36e098832601582ec19d7e431c5ef36004848154811061319e5761319e6157a5565b906000526020600020906008020160010154836040516131c8929190918252602082015260400190565b60405180910390a280600483815481106131e4576131e46157a5565b90600052602060002090600802016001015460065461320391906156da565b61320d919061564a565b6006819055508060048381548110613227576132276157a5565b9060005260206000209060080201600101819055505050565b600454606090829081106132b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b6000600484815481106132c5576132c56157a5565b9060005260206000209060080201905060005b600782015481101561336b578160070181815481106132f9576132f96157a5565b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16848281518110613336576133366157a5565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526133648161571d565b90506132d8565b505050919050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146133f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610763565b73ffffffffffffffffffffffffffffffffffffffff8116613497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610763565b6134a081614a73565b50565b606080606080856004805490508110613518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b60006004888154811061352d5761352d6157a5565b600091825260208083208b845260058252604080852073ffffffffffffffffffffffffffffffffffffffff8d168652909252922060036008909202909201908101546006820154600283015492945090914211801561358b57508015155b1561365d5760008460020154426135a291906156da565b90506000600f54600e54600d546103e86135bc91906156da565b6135c691906156da565b6135d091906156da565b905060006103e8826006548960010154600354876135ee919061569d565b6135f8919061569d565b6136029190615662565b61360c919061569d565b6136169190615662565b9050836136437f000000000000000000000000000000000000000000000000000000e8d4a510008361569d565b61364d9190615662565b613657908661564a565b94505050505b6000836002015484600101547f000000000000000000000000000000000000000000000000000000e8d4a5100085876000015461369a919061569d565b6136a49190615662565b6136ae91906156da565b6136b8919061564a565b60078601549091506136cb90600161564a565b67ffffffffffffffff8111156136e3576136e36157d4565b60405190808252806020026020018201604052801561370c578160200160208202803683370190505b506007860154909a5061372090600161564a565b67ffffffffffffffff811115613738576137386157d4565b60405190808252806020026020018201604052801561376b57816020015b60608152602001906001900390816137565790505b50600786015490995061377f90600161564a565b67ffffffffffffffff811115613797576137976157d4565b6040519080825280602002602001820160405280156137c0578160200160208202803683370190505b5060078601549097506137d490600161564a565b67ffffffffffffffff8111156137ec576137ec6157d4565b604051908082528060200260200182016040528015613815578160200160208202803683370190505b506002548b5191995073ffffffffffffffffffffffffffffffffffffffff16908b90600090613846576138466157a5565b73ffffffffffffffffffffffffffffffffffffffff928316602091820292909201015260025461387691166143f7565b89600081518110613889576138896157a5565b60209081029190910101526002546138b69073ffffffffffffffffffffffffffffffffffffffff1661450f565b60ff16886000815181106138cc576138cc6157a5565b60200260200101818152505080876000815181106138ec576138ec6157a5565b60200260200101818152505060005b6007860154811015613b9a5785600701818154811061391c5761391c6157a5565b60009182526020918290200154604080517ff7c618c1000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff9092169263f7c618c192600480840193829003018186803b15801561398b57600080fd5b505afa15801561399f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139c39190615200565b8b6139cf83600161564a565b815181106139df576139df6157a5565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613a318660070182815481106116a9576116a96157a5565b8a613a3d83600161564a565b81518110613a4d57613a4d6157a5565b6020026020010181905250613a708660070182815481106117aa576117aa6157a5565b60ff1689613a7f83600161564a565b81518110613a8f57613a8f6157a5565b602002602001018181525050856007018181548110613ab057613ab06157a5565b6000918252602090912001546040517fffcd4263000000000000000000000000000000000000000000000000000000008152600481018f905273ffffffffffffffffffffffffffffffffffffffff8e811660248301529091169063ffcd42639060440160206040518083038186803b158015613b2b57600080fd5b505afa158015613b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b639190615301565b88613b6f83600161564a565b81518110613b7f57613b7f6157a5565b6020908102919091010152613b938161571d565b90506138fb565b5050505050505092959194509250565b60005b6004548110156134a057613bc081613bd0565b613bc98161571d565b9050613bad565b60045481908110613c3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048381548110613c5257613c526157a5565b9060005260206000209060080201905080600201544211613c7257505050565b6006810154801580613c8657506001820154155b15613c975750426002909101555050565b6000826002015442613ca991906156da565b90506000600654846001015460035484613cc3919061569d565b613ccd919061569d565b613cd79190615662565b90506000600f54600e54600d546103e8613cf191906156da565b613cfb91906156da565b613d0591906156da565b600254600a54600d5492935073ffffffffffffffffffffffffffffffffffffffff918216926340c10f1992909116906103e890613d42908761569d565b613d4c9190615662565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613db757600080fd5b505af1158015613dcb573d6000803e3d6000fd5b5050600254600b54600e5473ffffffffffffffffffffffffffffffffffffffff92831694506340c10f1993509116906103e890613e08908761569d565b613e129190615662565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613e7d57600080fd5b505af1158015613e91573d6000803e3d6000fd5b5050600254600c54600f5473ffffffffffffffffffffffffffffffffffffffff92831694506340c10f1993509116906103e890613ece908761569d565b613ed89190615662565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613f4357600080fd5b505af1158015613f57573d6000803e3d6000fd5b505060025473ffffffffffffffffffffffffffffffffffffffff1691506340c10f199050306103e8613f89858761569d565b613f939190615662565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401600060405180830381600087803b158015613ffe57600080fd5b505af1158015614012573d6000803e3d6000fd5b505050506103e88186600601547f000000000000000000000000000000000000000000000000000000e8d4a510008561404b919061569d565b6140559190615662565b61405f919061569d565b6140699190615662565b85600301600082825461407c919061564a565b909155505042600286018190556003860154604080519283526020830187905282015287907f3be3541fc42237d611b30329040bfa4569541d156560acdbbae57640d20b8f469060600160405180910390a250505050505b5050565b6000600482815481106140ed576140ed6157a5565b60009182526020808320858452600582526040808520338652909252922060038101546008909202909201925015801561412957506007544210155b1561414357600582015461413d904261564a565b60038201555b600081600101547f000000000000000000000000000000000000000000000000000000e8d4a510008460030154846000015461417f919061569d565b6141899190615662565b61419391906156da565b905061419f8433610c7f565b156142115760008111806141b7575060008260020154115b1561420c578160020154600860008282546141d291906156da565b90915550506000600283015560058301546141ed904261564a565b6003830155600282015461420c903390614207908461564a565b614ae8565b614281565b8015614281578060086000828254614229919061564a565b9250508190555080826002016000828254614244919061564a565b9091555050604051818152849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c19060200160405180910390a35b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052915160009283929087169161431e9190615556565b6000604051808303816000865af19150503d806000811461435b576040519150601f19603f3d011682016040523d82523d6000602084013e614360565b606091505b509150915081801561438a57508051158061438a57508080602001905181019061438a91906151de565b6143f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f72696e6745524332303a205472616e73666572206661696c6564000000006044820152606401610763565b5050505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f95d89b41000000000000000000000000000000000000000000000000000000001790529051606091600091829173ffffffffffffffffffffffffffffffffffffffff8616916144799190615556565b600060405180830381855afa9150503d80600081146144b4576040519150601f19603f3d011682016040523d82523d6000602084013e6144b9565b606091505b5091509150816144fe576040518060400160405280600381526020017f3f3f3f0000000000000000000000000000000000000000000000000000000000815250614507565b61450781614c9e565b949350505050565b60408051600481526024810182526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f313ce5670000000000000000000000000000000000000000000000000000000017905290516000918291829173ffffffffffffffffffffffffffffffffffffffff8616916145909190615556565b600060405180830381855afa9150503d80600081146145cb576040519150601f19603f3d011682016040523d82523d6000602084013e6145d0565b606091505b50915091508180156145e3575080516020145b6145ee576012614507565b808060200190518101906145079190615469565b6004548290811061466f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f506f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610763565b600060048481548110614684576146846157a5565b600091825260208083208784526005825260408085203386529092529220600890910290910191506146b585613bd0565b6146be856140d8565b83156149015781546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b15801561472d57600080fd5b505afa158015614741573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906147659190615301565b835490915061478c9073ffffffffffffffffffffffffffffffffffffffff16333088614e91565b82546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b1580156147f557600080fd5b505afa158015614809573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061482d9190615301565b905061483982826156da565b600485015490965061ffff16156148a8576004840154600090612710906148649061ffff168961569d565b61486e9190615662565b600b54865491925061489a9173ffffffffffffffffffffffffffffffffffffffff908116911683614287565b6148a481886156da565b9650505b858360000160008282546148bc919061564a565b9091555050600254845473ffffffffffffffffffffffffffffffffffffffff908116911614156148fe5785600960008282546148f8919061564a565b90915550505b50505b600382015481547f000000000000000000000000000000000000000000000000000000e8d4a51000916149339161569d565b61493d9190615662565b600182015560005b6007830154811015614a1457826007018181548110614966576149666157a5565b60009182526020909120015482546040517ffe8343fb00000000000000000000000000000000000000000000000000000000815260048101899052336024820152604481019190915273ffffffffffffffffffffffffffffffffffffffff9091169063fe8343fb90606401600060405180830381600087803b1580156149eb57600080fd5b505af11580156149ff573d6000803e3d6000fd5b5050505080614a0d9061571d565b9050614945565b508315614a355783826006016000828254614a2f919061564a565b90915550505b604051848152859033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a35050505050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6009546002546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b158015614b5457600080fd5b505afa158015614b68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b8c9190615301565b11156140d4576009546002546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000929173ffffffffffffffffffffffffffffffffffffffff16906370a082319060240160206040518083038186803b158015614c0057600080fd5b505afa158015614c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c389190615301565b614c4291906156da565b9050808210614c7457600254614c6f9073ffffffffffffffffffffffffffffffffffffffff168483614287565b505050565b8115614c6f57600254614c6f9073ffffffffffffffffffffffffffffffffffffffff168484614287565b60606040825110614cc35781806020019051810190614cbd919061521d565b92915050565b815160201415614e535760005b60208160ff16108015614d1d5750828160ff1681518110614cf357614cf36157a5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15614d345780614d2c81615756565b915050614cd0565b60008160ff1667ffffffffffffffff811115614d5257614d526157d4565b6040519080825280601f01601f191660200182016040528015614d7c576020820181803683370190505b509050600091505b60208260ff16108015614dd15750838260ff1681518110614da757614da76157a5565b01602001517fff000000000000000000000000000000000000000000000000000000000000001615155b15614e4c57838260ff1681518110614deb57614deb6157a5565b602001015160f81c60f81b818360ff1681518110614e0b57614e0b6157a5565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081614e4481615756565b925050614d84565b9392505050565b505060408051808201909152600381527f3f3f3f0000000000000000000000000000000000000000000000000000000000602082015290565b919050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691614f309190615556565b6000604051808303816000865af19150503d8060008114614f6d576040519150601f19603f3d011682016040523d82523d6000602084013e614f72565b606091505b5091509150818015614f9c575080511580614f9c575080806020019051810190614f9c91906151de565b615002576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f426f72696e6745524332303a205472616e7366657246726f6d206661696c65646044820152606401610763565b505050505050565b828054828255906000526020600020908101928215615082579160200282015b828111156150825781547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84351617825560209092019160019091019061502a565b5061508e92915061510c565b5090565b828054828255906000526020600020908101928215615082579160200282015b8281111561508257825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906150b2565b5b8082111561508e576000815560010161510d565b60008083601f84011261513357600080fd5b50813567ffffffffffffffff81111561514b57600080fd5b6020830191508360208260051b850101111561516657600080fd5b9250929050565b803561ffff81168114614e8c57600080fd5b60006020828403121561519157600080fd5b8135614e4c81615803565b600080602083850312156151af57600080fd5b823567ffffffffffffffff8111156151c657600080fd5b6151d285828601615121565b90969095509350505050565b6000602082840312156151f057600080fd5b81518015158114614e4c57600080fd5b60006020828403121561521257600080fd5b8151614e4c81615803565b60006020828403121561522f57600080fd5b815167ffffffffffffffff8082111561524757600080fd5b818401915084601f83011261525b57600080fd5b81518181111561526d5761526d6157d4565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156152b3576152b36157d4565b816040528281528760208487010111156152cc57600080fd5b6152dd8360208301602088016156f1565b979650505050505050565b6000602082840312156152fa57600080fd5b5035919050565b60006020828403121561531357600080fd5b5051919050565b6000806040838503121561532d57600080fd5b82359150602083013561533f81615803565b809150509250929050565b60008060008060008060a0878903121561536357600080fd5b86359550602087013561537581615803565b94506153836040880161516d565b935060608701359250608087013567ffffffffffffffff8111156153a657600080fd5b6153b289828a01615121565b979a9699509497509295939492505050565b600080604083850312156153d757600080fd5b50508035926020909101359150565b60008060008060008060a087890312156153ff57600080fd5b86359550602087013594506153836040880161516d565b60008060008060008060c0878903121561542f57600080fd5b863595506020870135945060408701359350606087013561544f81615825565b9598949750929560808101359460a0909101359350915050565b60006020828403121561547b57600080fd5b8151614e4c81615825565b600081518084526020808501945080840160005b838110156154cc57815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161549a565b509495945050505050565b600081518084526020808501945080840160005b838110156154cc578151875295820195908201906001016154eb565b60008184825b8581101561554b57813561552081615803565b73ffffffffffffffffffffffffffffffffffffffff168352602092830192919091019060010161550d565b509095945050505050565b600082516155688184602087016156f1565b9190910192915050565b602081526000614e4c6020830184615486565b6080815260006155986080830187615486565b6020838203818501528187518084528284019150828160051b850101838a0160005b8381101561561e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08088850301865282518051808652615600818a88018b85016156f1565b96880196601f019091169390930186019250908501906001016155ba565b50508681036040880152615632818a6154d7565b94505050505082810360608401526152dd81856154d7565b6000821982111561565d5761565d615776565b500190565b600082615698577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156156d5576156d5615776565b500290565b6000828210156156ec576156ec615776565b500390565b60005b8381101561570c5781810151838201526020016156f4565b838111156142815750506000910152565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561574f5761574f615776565b5060010190565b600060ff821660ff81141561576d5761576d615776565b60010192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146134a057600080fd5b60ff811681146134a057600080fdfea2646970667358221220b083ffec018d73e7aeeae6ec475da21ffe3d18527400829aaf582e09582805dd64736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006bd193ee6d2104f14f94e2ca6efefae561a4334b0000000000000000000000000000000000000000000000000149af4a11dde0000000000000000000000000001375d820e32eec62cdd75c3e95b1e71a830b2149000000000000000000000000cf7cebc20baca0fac5be6dd665feb8962e5d4e67000000000000000000000000be0d20bb3cb8766e74b3b5f9382eae56cdade492000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000640000000000000000000000000000000000000000000000000000000000000064
-----Decoded View---------------
Arg [0] : _solar (address): 0x6bD193Ee6D2104F14F94E2cA6efefae561A4334B
Arg [1] : _solarPerSec (uint256): 92798000000000000
Arg [2] : _teamAddress (address): 0x1375D820e32Eec62cDd75c3e95b1E71A830B2149
Arg [3] : _treasuryAddress (address): 0xcF7cEBC20baca0fAc5be6dD665fEb8962E5d4e67
Arg [4] : _investorAddress (address): 0xBE0d20Bb3cB8766E74b3B5f9382Eae56cdADe492
Arg [5] : _teamPercent (uint256): 100
Arg [6] : _treasuryPercent (uint256): 100
Arg [7] : _investorPercent (uint256): 100
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000006bd193ee6d2104f14f94e2ca6efefae561a4334b
Arg [1] : 0000000000000000000000000000000000000000000000000149af4a11dde000
Arg [2] : 0000000000000000000000001375d820e32eec62cdd75c3e95b1e71a830b2149
Arg [3] : 000000000000000000000000cf7cebc20baca0fac5be6dd665feb8962e5d4e67
Arg [4] : 000000000000000000000000be0d20bb3cb8766e74b3b5f9382eae56cdade492
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000064
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$1.76
Net Worth in MOVR
Token Allocations
SOLAR
100.00%
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| MOVR | 100.00% | $0.000735 | 2,398.3133 | $1.76 |
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.