- Contract name:
- PioVault
- Optimization enabled
- true
- Compiler version
- v0.8.20+commit.a1b79de6
- Optimization runs
- 200
- EVM Version
- default
- Verified at
- 2026-01-13T12:56:51.553747Z
Constructor Arguments
000000000000000000000000a12a390b3d76173ab1cadc7f32658853be03898600000000000000000000000089f41f502d451997c807a90e3834c1cdbaf79fdd000000000000000000000000cd724dda8098072088b21c8efe5eba3fccbfd3ec
Arg [0] (address) : 0xa12a390b3d76173ab1cadc7f32658853be038986
Arg [1] (address) : 0x89f41f502d451997c807a90e3834c1cdbaf79fdd
Arg [2] (address) : 0xcd724dda8098072088b21c8efe5eba3fccbfd3ec
Contract source code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IGoldNFT {
function mint(address to, string calldata uri) external returns (uint256);
}
contract PioVault {
/* ================= OWNER ================= */
address public owner;
modifier onlyOwner() {
require(msg.sender == owner, "Not owner");
_;
}
uint256 private _status;
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
modifier nonReentrant() {
require(_status != _ENTERED, "Reentrancy");
_status = _ENTERED;
_;
_status = _NOT_ENTERED;
}
constructor(
address _adminWallet,
address _charityWallet,
address _goldNFT
) {
owner = msg.sender;
adminWallet = _adminWallet;
charityWallet = _charityWallet;
goldNFT = IGoldNFT(_goldNFT);
_status = _NOT_ENTERED;
// 👇 ROOT USER
users[owner].exists = true;
users[owner].sponsor = address(0);
users[owner].regDate = block.timestamp;
totalUsers = 1;
}
function transferOwnership(address newOwner) external onlyOwner {
require(newOwner != address(0));
owner = newOwner;
}
/* ================= CONFIG ================= */
address public adminWallet;
address public charityWallet;
IGoldNFT public goldNFT;
uint256 public charityBP = 300; // 3%
uint256 public adminBP = 100; // 1%
uint256 public pioUsdRate; // USD per PIO (1e18)
uint256 public goldRateUSD; // USD per gram (1e18)
function updateWallets(address _admin, address _charity) external onlyOwner {
adminWallet = _admin;
charityWallet = _charity;
}
function updatePercents(uint256 _charityBP, uint256 _adminBP) external onlyOwner {
require(_charityBP + _adminBP <= 1000, "Too high");
charityBP = _charityBP;
adminBP = _adminBP;
}
function updateRates(uint256 _pioUsdRate, uint256 _goldRateUSD) external onlyOwner {
require(_pioUsdRate > 0 && _goldRateUSD > 0, "Invalid rate");
pioUsdRate = _pioUsdRate;
goldRateUSD = _goldRateUSD;
}
/* ================= ENUMS ================= */
enum IncomeType { DailyInterest, ReferralReward, BusinessReward }
enum Rank { None, Executive, SeniorExecutive, Manager, VicePresident, President }
/* ================= STRUCTS ================= */
struct IncomeInfo {
uint256 gross;
uint256 net;
uint256 charity;
uint256 admin;
}
struct StakeInfo {
uint256 usdAmount;
uint256 pioAmount;
uint256 goldGram;
uint256 dailyRoiBP;
uint256 startTime;
uint256 durationMonths;
uint256 lastClaimTime;
uint256 roiClaimed;
uint8 slab;
bool nftClaimed;
}
struct User {
bool exists;
address sponsor;
uint256 regDate;
uint256 totalStake;
uint256 totalWithdraw;
uint256 directBusiness;
uint256 teamBusiness;
Rank rank;
uint256 rankDate;
mapping(uint8 => IncomeInfo) income;
}
mapping(address => User) private users;
mapping(address => StakeInfo[]) private stakes;
mapping(uint256 => uint256) public nftToStake;
mapping(uint256 => address) public nftOwner;
mapping(address => mapping(Rank => bool)) public rankPaid;
uint256 public totalUsers;
uint256 public totalStaked;
uint256 public totalIncome;
/* ================= EVENTS ================= */
event Staked(address indexed user, uint256 usdAmount, uint256 pioAmount);
event ROIWithdrawn(address indexed user, uint256 gross, uint256 net);
event IncomeAdded(address indexed user, IncomeType incomeType, uint256 gross, uint256 net);
event RankAchieved(address indexed user, Rank rank);
event NFTClaimed(address indexed user,uint256 indexed stakeId,uint256 nftId,uint256 goldGram,uint8 slab,uint256 timestamp);
/* =========================================================
STAKE
========================================================= */
function stake(
uint256 usdAmount,
uint256 durationMonths,
address sponsor
) external payable nonReentrant{
require(usdAmount >= 50, "Min $50");
require(usdAmount % 50 == 0, "Only $50 multiples allowed");
require(durationMonths == 3 || durationMonths == 6 || durationMonths == 12 || durationMonths == 48, "Invalid plan");
require(pioUsdRate > 0, "PIO rate not set");
require(goldRateUSD > 0, "Gold rate not set");
if (!users[msg.sender].exists) {
require(sponsor != address(0) && sponsor != msg.sender, "Invalid sponsor");
require(users[sponsor].exists, "Sponsor not registered");
users[msg.sender].exists = true;
users[msg.sender].sponsor = sponsor;
users[msg.sender].regDate = block.timestamp;
totalUsers++;
}
uint256 requiredPIO = (usdAmount * 1e18) / pioUsdRate;
require(msg.value == requiredPIO, "Send exact PIO");
uint256 roiBP =
usdAmount >= 5050 ? 25 :
usdAmount >= 1050 ? 20 :
usdAmount >= 550 ? 15 : 10;
uint256 goldGram = (usdAmount * 1e18) / goldRateUSD;
uint8 slab = _getSlabByUSD(usdAmount);
stakes[msg.sender].push(
StakeInfo({
usdAmount: usdAmount,
pioAmount: msg.value,
goldGram: goldGram,
dailyRoiBP: roiBP,
startTime: block.timestamp,
durationMonths: durationMonths,
lastClaimTime: block.timestamp,
roiClaimed: 0,
slab: slab,
nftClaimed: false
})
);
users[msg.sender].totalStake += msg.value;
users[users[msg.sender].sponsor].directBusiness += msg.value;
totalStaked += msg.value;
_updateBusiness(msg.sender, msg.value);
_payReferralRewards(msg.sender, msg.value);
emit Staked(msg.sender, usdAmount, msg.value);
}
/* =========================================================
DAILY ROI
========================================================= */
function claimDailyROI() external nonReentrant{
uint256 totalGross;
StakeInfo[] storage list = stakes[msg.sender];
for (uint256 i = 0; i < list.length; i++) {
StakeInfo storage s = list[i];
// stake end time
uint256 endTime = s.startTime + (s.durationMonths * 30 days);
uint256 tillTime = block.timestamp < endTime
? block.timestamp
: endTime;
if (tillTime <= s.lastClaimTime) continue;
uint256 daysPassed = (tillTime - s.lastClaimTime) / 1 days;
if (daysPassed == 0) continue;
uint256 gross =
(s.pioAmount * s.dailyRoiBP * daysPassed) / 10000;
s.lastClaimTime += daysPassed * 1 days;
s.roiClaimed += gross;
totalGross += gross;
}
require(totalGross > 0, "No ROI available");
require(address(this).balance >= totalGross, "Vault low");
_distributeAndPay(msg.sender, IncomeType.DailyInterest, totalGross);
emit ROIWithdrawn(
msg.sender,
totalGross,
users[msg.sender].income[uint8(IncomeType.DailyInterest)].net
);
}
function claimROIByStake(uint256 stakeId) external nonReentrant {
require(stakeId < stakes[msg.sender].length, "Invalid stake");
StakeInfo storage s = stakes[msg.sender][stakeId];
// stake end time
uint256 endTime = s.startTime + (s.durationMonths * 30 days);
uint256 tillTime = block.timestamp < endTime
? block.timestamp
: endTime;
require(tillTime > s.lastClaimTime, "No ROI available");
uint256 daysPassed = (tillTime - s.lastClaimTime) / 1 days;
require(daysPassed > 0, "No full day passed");
uint256 gross =
(s.pioAmount * s.dailyRoiBP * daysPassed) / 10000;
s.lastClaimTime += daysPassed * 1 days;
s.roiClaimed += gross;
require(address(this).balance >= gross, "Vault low");
_distributeAndPay(msg.sender, IncomeType.DailyInterest, gross);
emit ROIWithdrawn(
msg.sender,
gross,
users[msg.sender].income[uint8(IncomeType.DailyInterest)].net
);
}
/* =========================================================
NFT CLAIM
========================================================= */
function claimNFT(uint256 stakeId, string calldata uri) external nonReentrant{
require(stakeId < stakes[msg.sender].length, "Invalid stake");
StakeInfo storage s = stakes[msg.sender][stakeId];
require(!s.nftClaimed, "Already claimed");
require(
block.timestamp >= s.startTime + (s.durationMonths * 30 days),
"Stake not matured"
);
s.nftClaimed = true;
uint256 nftId = goldNFT.mint(msg.sender, uri);
nftToStake[nftId] = stakeId;
nftOwner[nftId] = msg.sender;
emit NFTClaimed(msg.sender, stakeId, nftId, s.goldGram, s.slab, block.timestamp);
}
/* ================= INTERNALS ================= */
function _distributeAndPay(address user, IncomeType it, uint256 gross) internal {
uint256 charity = (gross * charityBP) / 10000;
uint256 admin = (gross * adminBP) / 10000;
uint256 net = gross - charity - admin;
IncomeInfo storage info = users[user].income[uint8(it)];
info.gross += gross;
info.net += net;
info.charity += charity;
info.admin += admin;
totalIncome += gross;
if (charity > 0) payable(charityWallet).transfer(charity);
if (admin > 0) payable(adminWallet).transfer(admin);
payable(user).transfer(net);
users[user].totalWithdraw += net;
emit IncomeAdded(user, it, gross, net);
}
function _payReferralRewards(address from, uint256 amount) internal {
address l1 = users[from].sponsor;
address l2 = l1 != address(0) ? users[l1].sponsor : address(0);
address l3 = l2 != address(0) ? users[l2].sponsor : address(0);
_payReferralLevel(l1, (amount * 5) / 100);
_payReferralLevel(l2, (amount * 2) / 100);
_payReferralLevel(l3, (amount * 1) / 100);
}
function _payReferralLevel(address receiver, uint256 gross) internal {
if (gross == 0) return;
receiver == address(0)
? _distributeAndPay(adminWallet, IncomeType.ReferralReward, gross)
: _distributeAndPay(receiver, IncomeType.ReferralReward, gross);
}
function _updateBusiness(address from, uint256 amount) internal {
address upline = users[from].sponsor;
for (uint256 i = 0; i < 7 && upline != address(0); i++) {
users[upline].teamBusiness += amount;
_checkRank(upline);
upline = users[upline].sponsor;
}
}
function _checkRank(address user) internal {
User storage u = users[user];
uint256 biz = u.teamBusiness;
if (biz >= 1000 ether && !rankPaid[user][Rank.Executive]) {
_payRank(user, Rank.Executive, 1000 ether, 500);
}
if (biz >= 3500 ether && !rankPaid[user][Rank.SeniorExecutive]) {
_payRank(user, Rank.SeniorExecutive, 2500 ether, 600);
}
if (biz >= 8500 ether && !rankPaid[user][Rank.Manager]) {
_payRank(user, Rank.Manager, 5000 ether, 720);
}
if (biz >= 18500 ether && !rankPaid[user][Rank.VicePresident]) {
_payRank(user, Rank.VicePresident, 10000 ether, 1000);
}
if (biz >= 28500 ether && !rankPaid[user][Rank.President]) {
_payRank(user, Rank.President, 10000 ether, 1200);
}
}
function _payRank(
address user,
Rank r,
uint256 baseBusiness,
uint256 bp
) internal {
uint256 reward = (baseBusiness * bp) / 10000;
rankPaid[user][r] = true;
users[user].rank = r;
users[user].rankDate = block.timestamp;
_distributeAndPay(user, IncomeType.BusinessReward, reward);
emit RankAchieved(user, r);
}
/* =========================================================
VIEW FUNCTIONS
========================================================= */
function getUser(address user)
external
view
returns (
bool exists,
address sponsor,
uint256 regDate,
uint256 totalStake,
uint256 directBiz,
uint256 teamBiz,
Rank rank,
uint256 rankDate
)
{
User storage u = users[user];
return (
u.exists,
u.sponsor,
u.regDate,
u.totalStake,
u.directBusiness,
u.teamBusiness,
u.rank,
u.rankDate
);
}
function getIncome(address user, IncomeType it)
external
view
returns (IncomeInfo memory)
{
return users[user].income[uint8(it)];
}
function getContractInfo()
external
view
returns (
uint256 usersCount,
uint256 totalStakeAmt,
uint256 totalIncomeAmt,
uint256 balance
)
{
return (
totalUsers,
totalStaked,
totalIncome,
address(this).balance
);
}
function UserStakeSummary(address to, uint256 amount) external onlyOwner {
require(address(this).balance >= amount, "Low balance");
payable(to).transfer(amount);
}
function getNextClaimTime(address user, uint256 stakeId)
external view returns (uint256) {
return stakes[user][stakeId].lastClaimTime + 1 days;
}
function getStakeCount(address user) external view returns (uint256) {
return stakes[user].length;
}
function getStake(address user, uint256 id) external view returns (StakeInfo memory) {
return stakes[user][id];
}
function getNFTDetails(uint256 nftId)
external view
returns (address,uint256,uint256,uint8,uint256)
{
address u = nftOwner[nftId];
uint256 sid = nftToStake[nftId];
StakeInfo storage s = stakes[u][sid];
return (
u,
sid,
s.goldGram,
s.slab,
s.startTime + (s.durationMonths * 30 days)
);
}
function getStakeDetails(address user, uint256 stakeId)
external
view
returns (
uint256 pioAmount,
uint256 goldGram,
uint256 startTime,
uint256 maturityTime,
uint8 slab,
bool nftClaimed
)
{
StakeInfo storage s = stakes[user][stakeId];
return (
s.pioAmount,
s.goldGram,
s.startTime,
s.startTime + (s.durationMonths * 30 days),
s.slab,
s.nftClaimed
);
}
function _getSlabByUSD(uint256 usdAmount) internal pure returns (uint8) {
if (usdAmount >= 5050) return 4;
if (usdAmount >= 1050) return 3;
if (usdAmount >= 550) return 2;
return 1; // 50–500
}
receive() external payable {}
}
Contract ABI
[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_adminWallet","internalType":"address"},{"type":"address","name":"_charityWallet","internalType":"address"},{"type":"address","name":"_goldNFT","internalType":"address"}]},{"type":"event","name":"IncomeAdded","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint8","name":"incomeType","internalType":"enum PioVault.IncomeType","indexed":false},{"type":"uint256","name":"gross","internalType":"uint256","indexed":false},{"type":"uint256","name":"net","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"NFTClaimed","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"stakeId","internalType":"uint256","indexed":true},{"type":"uint256","name":"nftId","internalType":"uint256","indexed":false},{"type":"uint256","name":"goldGram","internalType":"uint256","indexed":false},{"type":"uint8","name":"slab","internalType":"uint8","indexed":false},{"type":"uint256","name":"timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ROIWithdrawn","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"gross","internalType":"uint256","indexed":false},{"type":"uint256","name":"net","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"RankAchieved","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint8","name":"rank","internalType":"enum PioVault.Rank","indexed":false}],"anonymous":false},{"type":"event","name":"Staked","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"usdAmount","internalType":"uint256","indexed":false},{"type":"uint256","name":"pioAmount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"UserStakeSummary","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"adminBP","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"adminWallet","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"charityBP","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"charityWallet","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimDailyROI","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimNFT","inputs":[{"type":"uint256","name":"stakeId","internalType":"uint256"},{"type":"string","name":"uri","internalType":"string"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claimROIByStake","inputs":[{"type":"uint256","name":"stakeId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"usersCount","internalType":"uint256"},{"type":"uint256","name":"totalStakeAmt","internalType":"uint256"},{"type":"uint256","name":"totalIncomeAmt","internalType":"uint256"},{"type":"uint256","name":"balance","internalType":"uint256"}],"name":"getContractInfo","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct PioVault.IncomeInfo","components":[{"type":"uint256","name":"gross","internalType":"uint256"},{"type":"uint256","name":"net","internalType":"uint256"},{"type":"uint256","name":"charity","internalType":"uint256"},{"type":"uint256","name":"admin","internalType":"uint256"}]}],"name":"getIncome","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint8","name":"it","internalType":"enum PioVault.IncomeType"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint256","name":"","internalType":"uint256"},{"type":"uint8","name":"","internalType":"uint8"},{"type":"uint256","name":"","internalType":"uint256"}],"name":"getNFTDetails","inputs":[{"type":"uint256","name":"nftId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getNextClaimTime","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint256","name":"stakeId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct PioVault.StakeInfo","components":[{"type":"uint256","name":"usdAmount","internalType":"uint256"},{"type":"uint256","name":"pioAmount","internalType":"uint256"},{"type":"uint256","name":"goldGram","internalType":"uint256"},{"type":"uint256","name":"dailyRoiBP","internalType":"uint256"},{"type":"uint256","name":"startTime","internalType":"uint256"},{"type":"uint256","name":"durationMonths","internalType":"uint256"},{"type":"uint256","name":"lastClaimTime","internalType":"uint256"},{"type":"uint256","name":"roiClaimed","internalType":"uint256"},{"type":"uint8","name":"slab","internalType":"uint8"},{"type":"bool","name":"nftClaimed","internalType":"bool"}]}],"name":"getStake","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint256","name":"id","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getStakeCount","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"pioAmount","internalType":"uint256"},{"type":"uint256","name":"goldGram","internalType":"uint256"},{"type":"uint256","name":"startTime","internalType":"uint256"},{"type":"uint256","name":"maturityTime","internalType":"uint256"},{"type":"uint8","name":"slab","internalType":"uint8"},{"type":"bool","name":"nftClaimed","internalType":"bool"}],"name":"getStakeDetails","inputs":[{"type":"address","name":"user","internalType":"address"},{"type":"uint256","name":"stakeId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"exists","internalType":"bool"},{"type":"address","name":"sponsor","internalType":"address"},{"type":"uint256","name":"regDate","internalType":"uint256"},{"type":"uint256","name":"totalStake","internalType":"uint256"},{"type":"uint256","name":"directBiz","internalType":"uint256"},{"type":"uint256","name":"teamBiz","internalType":"uint256"},{"type":"uint8","name":"rank","internalType":"enum PioVault.Rank"},{"type":"uint256","name":"rankDate","internalType":"uint256"}],"name":"getUser","inputs":[{"type":"address","name":"user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IGoldNFT"}],"name":"goldNFT","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"goldRateUSD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"nftOwner","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nftToStake","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pioUsdRate","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"rankPaid","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"uint8","name":"","internalType":"enum PioVault.Rank"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"stake","inputs":[{"type":"uint256","name":"usdAmount","internalType":"uint256"},{"type":"uint256","name":"durationMonths","internalType":"uint256"},{"type":"address","name":"sponsor","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalIncome","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalStaked","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalUsers","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updatePercents","inputs":[{"type":"uint256","name":"_charityBP","internalType":"uint256"},{"type":"uint256","name":"_adminBP","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateRates","inputs":[{"type":"uint256","name":"_pioUsdRate","internalType":"uint256"},{"type":"uint256","name":"_goldRateUSD","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updateWallets","inputs":[{"type":"address","name":"_admin","internalType":"address"},{"type":"address","name":"_charity","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
Deployed ByteCode
0x6080604052600436106101dc5760003560e01c80637b20876911610102578063bff1f9e111610095578063f146938211610064578063f146938214610695578063f26d8159146106b5578063f2fde38b146106cb578063fd731837146106eb57600080fd5b8063bff1f9e1146105fc578063cf57ee6914610612578063cfd4766314610648578063e8ba854f1461067557600080fd5b806382260f35116100d157806382260f35146105525780638da5cb5b146105a757806396e86fe0146105c7578063a9510e82146105e757600080fd5b80637b208769146104cf5780637cc1f867146104ef5780637e0171e614610526578063817b1cd21461053c57600080fd5b8063369acab01161017a57806357a676951161014957806357a67695146104085780635f2818001461041e5780636f77926b146104345780637628a37d146104bc57600080fd5b8063369acab01461036757806336b19cd7146103b257806346a6576a146103d2578063522577e9146103f257600080fd5b80631ef3639a116101b65780631ef3639a146102b2578063240bb73c146102d457806325fb9ec71461032757806333662dc41461034757600080fd5b8063054dc4f1146101e85780630cdd230b146102285780630f0a4fef1461026057600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b5061021561020336600461218e565b600b6020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023457600080fd5b50600454610248906001600160a01b031681565b6040516001600160a01b03909116815260200161021f565b34801561026c57600080fd5b5061028061027b3660046121c3565b610721565b60408051968752602087019590955293850192909252606084015260ff166080830152151560a082015260c00161021f565b3480156102be57600080fd5b506102d26102cd36600461218e565b6107ca565b005b3480156102e057600080fd5b506102f46102ef3660046121ed565b610a79565b60405161021f91908151815260208083015190820152604080830151908201526060918201519181019190915260800190565b34801561033357600080fd5b506102d2610342366004612228565b610b22565b34801561035357600080fd5b506102156103623660046121c3565b610b9d565b34801561037357600080fd5b506103a261038236600461224a565b600d60209081526000928352604080842090915290825290205460ff1681565b604051901515815260200161021f565b3480156103be57600080fd5b50600254610248906001600160a01b031681565b3480156103de57600080fd5b506102d26103ed3660046121c3565b610bee565b3480156103fe57600080fd5b5061021560105481565b34801561041457600080fd5b5061021560085481565b34801561042a57600080fd5b5061021560075481565b34801561044057600080fd5b506104a861044f36600461227a565b6001600160a01b03908116600090815260096020526040902080546001820154600283015460048401546005850154600686015460079096015460ff808716996101009097049098169794969395929491939190911691565b60405161021f9897969594939291906122bf565b6102d26104ca366004612314565b610c91565b3480156104db57600080fd5b50600354610248906001600160a01b031681565b3480156104fb57600080fd5b50600e54600f546010544760408051948552602085019390935291830152606082015260800161021f565b34801561053257600080fd5b5061021560055481565b34801561054857600080fd5b50610215600f5481565b34801561055e57600080fd5b5061057261056d36600461218e565b611247565b604080516001600160a01b03909616865260208601949094529284019190915260ff166060830152608082015260a00161021f565b3480156105b357600080fd5b50600054610248906001600160a01b031681565b3480156105d357600080fd5b506102d26105e2366004612349565b6112f4565b3480156105f357600080fd5b506102d2611568565b34801561060857600080fd5b50610215600e5481565b34801561061e57600080fd5b5061021561062d36600461227a565b6001600160a01b03166000908152600a602052604090205490565b34801561065457600080fd5b506106686106633660046121c3565b6117cb565b60405161021f91906123c5565b34801561068157600080fd5b506102d2610690366004612440565b6118e2565b3480156106a157600080fd5b506102d26106b0366004612228565b61193a565b3480156106c157600080fd5b5061021560065481565b3480156106d757600080fd5b506102d26106e636600461227a565b6119ba565b3480156106f757600080fd5b5061024861070636600461218e565b600c602052600090815260409020546001600160a01b031681565b6000806000806000806000600a60008a6001600160a01b03166001600160a01b03168152602001908152602001600020888154811061076257610762612473565b90600052602060002090600902019050806001015481600201548260040154836005015462278d00610794919061249f565b84600401546107a391906124b6565b60089490940154929c919b50995091975060ff808216975061010090910416945092505050565b6002600154036107f55760405162461bcd60e51b81526004016107ec906124c9565b60405180910390fd5b6002600155336000908152600a602052604090205481106108485760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964207374616b6560981b60448201526064016107ec565b336000908152600a6020526040812080548390811061086957610869612473565b906000526020600020906009020190506000816005015462278d0061088e919061249f565b826004015461089d91906124b6565b905060008142106108ae57816108b0565b425b9050826006015481116108f85760405162461bcd60e51b815260206004820152601060248201526f4e6f20524f4920617661696c61626c6560801b60448201526064016107ec565b60006201518084600601548361090e91906124ed565b6109189190612516565b90506000811161095f5760405162461bcd60e51b8152602060048201526012602482015271139bc8199d5b1b0819185e481c185cdcd95960721b60448201526064016107ec565b60006127108286600301548760010154610979919061249f565b610983919061249f565b61098d9190612516565b905061099c826201518061249f565b8560060160008282546109af91906124b6565b92505081905550808560070160008282546109ca91906124b6565b909155505047811115610a0b5760405162461bcd60e51b81526020600482015260096024820152685661756c74206c6f7760b81b60448201526064016107ec565b610a1733600083611a19565b336000818152600960209081526040808320838052600801825291829020600101548251858152918201527f841efd3321774b5a5ba123dcf983d5197208a29bbc201135573056e6c11fcac4910160405180910390a250506001805550505050565b610aa46040518060800160405280600081526020016000815260200160008152602001600081525090565b6001600160a01b038316600090815260096020526040812060080190836002811115610ad257610ad2612295565b60ff1660ff16815260200190815260200160002060405180608001604052908160008201548152602001600182015481526020016002820154815260200160038201548152505090505b92915050565b6000546001600160a01b03163314610b4c5760405162461bcd60e51b81526004016107ec9061252a565b6103e8610b5982846124b6565b1115610b925760405162461bcd60e51b81526020600482015260086024820152670a8dede40d0d2ced60c31b60448201526064016107ec565b600591909155600655565b6001600160a01b0382166000908152600a60205260408120805483908110610bc757610bc7612473565b90600052602060002090600902016006015462015180610be791906124b6565b9392505050565b6000546001600160a01b03163314610c185760405162461bcd60e51b81526004016107ec9061252a565b80471015610c565760405162461bcd60e51b815260206004820152600b60248201526a4c6f772062616c616e636560a81b60448201526064016107ec565b6040516001600160a01b0383169082156108fc029083906000818181858888f19350505050158015610c8c573d6000803e3d6000fd5b505050565b600260015403610cb35760405162461bcd60e51b81526004016107ec906124c9565b60026001556032831015610cf35760405162461bcd60e51b815260206004820152600760248201526604d696e202435360cc1b60448201526064016107ec565b610cfe60328461254d565b15610d4b5760405162461bcd60e51b815260206004820152601a60248201527f4f6e6c7920243530206d756c7469706c657320616c6c6f77656400000000000060448201526064016107ec565b8160031480610d5a5750816006145b80610d65575081600c145b80610d705750816030145b610dab5760405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b210383630b760a11b60448201526064016107ec565b600060075411610df05760405162461bcd60e51b815260206004820152601060248201526f141253c81c985d19481b9bdd081cd95d60821b60448201526064016107ec565b600060085411610e365760405162461bcd60e51b815260206004820152601160248201527011dbdb19081c985d19481b9bdd081cd95d607a1b60448201526064016107ec565b3360009081526009602052604090205460ff16610f57576001600160a01b03811615801590610e6e57506001600160a01b0381163314155b610eac5760405162461bcd60e51b815260206004820152600f60248201526e24b73b30b634b21039b837b739b7b960891b60448201526064016107ec565b6001600160a01b03811660009081526009602052604090205460ff16610f0d5760405162461bcd60e51b815260206004820152601660248201527514dc1bdb9cdbdc881b9bdd081c9959da5cdd195c995960521b60448201526064016107ec565b336000908152600960205260408120805460016001600160a81b03199091166101006001600160a01b03861602178117825542910155600e805491610f5183612561565b91905055505b600754600090610f6f85670de0b6b3a764000061249f565b610f799190612516565b9050803414610fbb5760405162461bcd60e51b815260206004820152600e60248201526d53656e642065786163742050494f60901b60448201526064016107ec565b60006113ba851015610ff05761041a851015610fe957610226851015610fe257600a610ff3565b600f610ff3565b6014610ff3565b60195b60ff169050600060085486670de0b6b3a7640000611011919061249f565b61101b9190612516565b9050600061102887611c74565b9050600a6000336001600160a01b03166001600160a01b03168152602001908152602001600020604051806101400160405280898152602001348152602001848152602001858152602001428152602001888152602001428152602001600081526020018360ff168152602001600015158152509080600181540180825580915050600190039060005260206000209060090201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c0820151816006015560e082015181600701556101008201518160080160006101000a81548160ff021916908360ff1602179055506101208201518160080160016101000a81548160ff02191690831515021790555050503460096000336001600160a01b03166001600160a01b03168152602001908152602001600020600201600082825461119291906124b6565b9091555050336000908152600960205260408082205461010090046001600160a01b03168252812060040180543492906111cd9084906124b6565b9250508190555034600f60008282546111e691906124b6565b909155506111f690503334611cb1565b6112003334611d67565b6040805188815234602082015233917f1449c6dd7851abc30abf37f57715f492010519147cc2652fbc38202c18a6ee90910160405180910390a25050600180555050505050565b6000818152600c6020908152604080832054600b8352818420546001600160a01b03909116808552600a909352908320805484938493849384938491908390811061129457611294612473565b90600052602060002090600902019050828282600201548360080160009054906101000a900460ff16846005015462278d006112d0919061249f565b85600401546112df91906124b6565b939d929c50909a509850909650945050505050565b6002600154036113165760405162461bcd60e51b81526004016107ec906124c9565b6002600155336000908152600a602052604090205483106113695760405162461bcd60e51b815260206004820152600d60248201526c496e76616c6964207374616b6560981b60448201526064016107ec565b336000908152600a6020526040812080548590811061138a5761138a612473565b906000526020600020906009020190508060080160019054906101000a900460ff16156113eb5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b60448201526064016107ec565b60058101546113fd9062278d0061249f565b816004015461140c91906124b6565b42101561144f5760405162461bcd60e51b815260206004820152601160248201527014dd185ad9481b9bdd081b585d1d5c9959607a1b60448201526064016107ec565b60088101805461ff0019166101001790556004805460405163d0def52160e01b81526000926001600160a01b039092169163d0def52191611496913391899189910161257a565b6020604051808303816000875af11580156114b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d991906125ba565b6000818152600b60209081526040808320899055600c8252918290208054336001600160a01b031990911681179091556002860154600887015484518681529384019190915260ff1682840152426060830152915192935087927fb96786233bb6bc33540f7c680cd986e8e91e40821d2a938706dad2e6484822519181900360800190a3505060018055505050565b60026001540361158a5760405162461bcd60e51b81526004016107ec906124c9565b6002600155336000908152600a60205260408120815b81548110156116e15760008282815481106115bd576115bd612473565b906000526020600020906009020190506000816005015462278d006115e2919061249f565b82600401546115f191906124b6565b905060008142106116025781611604565b425b905082600601548111611619575050506116cf565b60006201518084600601548361162f91906124ed565b6116399190612516565b90508060000361164c57505050506116cf565b60006127108286600301548760010154611666919061249f565b611670919061249f565b61167a9190612516565b9050611689826201518061249f565b85600601600082825461169c91906124b6565b92505081905550808560070160008282546116b791906124b6565b909155506116c7905081896124b6565b975050505050505b806116d981612561565b9150506115a0565b50600082116117255760405162461bcd60e51b815260206004820152601060248201526f4e6f20524f4920617661696c61626c6560801b60448201526064016107ec565b814710156117615760405162461bcd60e51b81526020600482015260096024820152685661756c74206c6f7760b81b60448201526064016107ec565b61176d33600084611a19565b336000818152600960209081526040808320838052600801825291829020600101548251868152918201527f841efd3321774b5a5ba123dcf983d5197208a29bbc201135573056e6c11fcac4910160405180910390a2505060018055565b6118266040518061014001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600060ff1681526020016000151581525090565b6001600160a01b0383166000908152600a6020526040902080548390811061185057611850612473565b600091825260209182902060408051610140810182526009909302909101805483526001810154938301939093526002830154908201526003820154606082015260048201546080820152600582015460a0820152600682015460c0820152600782015460e082015260089091015460ff80821661010080850191909152909104161515610120820152905092915050565b6000546001600160a01b0316331461190c5760405162461bcd60e51b81526004016107ec9061252a565b600280546001600160a01b039384166001600160a01b03199182161790915560038054929093169116179055565b6000546001600160a01b031633146119645760405162461bcd60e51b81526004016107ec9061252a565b6000821180156119745750600081115b6119af5760405162461bcd60e51b815260206004820152600c60248201526b496e76616c6964207261746560a01b60448201526064016107ec565b600791909155600855565b6000546001600160a01b031633146119e45760405162461bcd60e51b81526004016107ec9061252a565b6001600160a01b0381166119f757600080fd5b600080546001600160a01b0319166001600160a01b0392909216919091179055565b600061271060055483611a2c919061249f565b611a369190612516565b9050600061271060065484611a4b919061249f565b611a559190612516565b9050600081611a6484866124ed565b611a6e91906124ed565b6001600160a01b03871660009081526009602052604081209192509060080181876002811115611aa057611aa0612295565b60ff1660ff168152602001908152602001600020905084816000016000828254611aca91906124b6565b9250508190555081816001016000828254611ae591906124b6565b9250508190555083816002016000828254611b0091906124b6565b9250508190555082816003016000828254611b1b91906124b6565b925050819055508460106000828254611b3491906124b6565b90915550508315611b7b576003546040516001600160a01b039091169085156108fc029086906000818181858888f19350505050158015611b79573d6000803e3d6000fd5b505b8215611bbd576002546040516001600160a01b039091169084156108fc029085906000818181858888f19350505050158015611bbb573d6000803e3d6000fd5b505b6040516001600160a01b0388169083156108fc029084906000818181858888f19350505050158015611bf3573d6000803e3d6000fd5b506001600160a01b03871660009081526009602052604081206003018054849290611c1f9084906124b6565b92505081905550866001600160a01b03167fc40a4b43695ef32af387658180409241b391d76ab9c46b43276d7d86ac5748b4878785604051611c63939291906125d3565b60405180910390a250505050505050565b60006113ba8210611c8757506004919050565b61041a8210611c9857506003919050565b6102268210611ca957506002919050565b506001919050565b6001600160a01b038083166000908152600960205260408120546101009004909116905b600781108015611ced57506001600160a01b03821615155b15611d61576001600160a01b03821660009081526009602052604081206005018054859290611d1d9084906124b6565b90915550611d2c905082611e3c565b6001600160a01b0391821660009081526009602052604090205461010090049091169080611d5981612561565b915050611cd5565b50505050565b6001600160a01b0380831660009081526009602052604081205461010090049091169081611d96576000611db7565b6001600160a01b038083166000908152600960205260409020546101009004165b905060006001600160a01b038216611dd0576000611df1565b6001600160a01b038083166000908152600960205260409020546101009004165b9050611e13836064611e0487600561249f565b611e0e9190612516565b612026565b611e24826064611e0487600261249f565b611e35816064611e0487600161249f565b5050505050565b6001600160a01b03811660009081526009602052604090206005810154683635c9adc5dea000008110801590611e9757506001600160a01b0383166000908152600d602090815260408083206001845290915290205460ff16155b15611eb457611eb4836001683635c9adc5dea000006101f4612069565b68bdbc41e0348b3000008110158015611ef257506001600160a01b0383166000908152600d602090815260408083206002845290915290205460ff16155b15611f0f57611f0f83600268878678326eac900000610258612069565b6901ccc9324511e45000008110158015611f4e57506001600160a01b0383166000908152600d602090815260408083206003845290915290205460ff16155b15611f6c57611f6c83600369010f0cf064dd592000006102d0612069565b6903eae3130ecc969000008110158015611fab57506001600160a01b0383166000908152600d602090815260408083206004845290915290205460ff16155b15611fc957611fc983600469021e19e0c9bab24000006103e8612069565b690608fcf3d88748d00000811015801561200857506001600160a01b0383166000908152600d602090815260408083206005845290915290205460ff16155b15610c8c57610c8c83600569021e19e0c9bab24000006104b0612069565b80600003612032575050565b6001600160a01b038216156120515761204d82600183611a19565b5050565b60025461204d906001600160a01b0316600183611a19565b6000612710612078838561249f565b6120829190612516565b6001600160a01b0386166000908152600d60205260408120919250600191908660058111156120b3576120b3612295565b60058111156120c4576120c4612295565b815260208082019290925260409081016000908120805494151560ff199586161790556001600160a01b0389168152600990925290206006018054869216600183600581111561211657612116612295565b02179055506001600160a01b03851660009081526009602052604090204260079091015561214685600283611a19565b846001600160a01b03167fbb7bdfdc215fad1b32ff89f4494115dd4d41d8ef621b21c39b948b4b04d578808560405161217f91906125fb565b60405180910390a25050505050565b6000602082840312156121a057600080fd5b5035919050565b80356001600160a01b03811681146121be57600080fd5b919050565b600080604083850312156121d657600080fd5b6121df836121a7565b946020939093013593505050565b6000806040838503121561220057600080fd5b612209836121a7565b915060208301356003811061221d57600080fd5b809150509250929050565b6000806040838503121561223b57600080fd5b50508035926020909101359150565b6000806040838503121561225d57600080fd5b612266836121a7565b915060208301356006811061221d57600080fd5b60006020828403121561228c57600080fd5b610be7826121a7565b634e487b7160e01b600052602160045260246000fd5b600681106122bb576122bb612295565b9052565b88151581526001600160a01b038816602082015260408101879052606081018690526080810185905260a08101849052610100810161230160c08301856122ab565b8260e08301529998505050505050505050565b60008060006060848603121561232957600080fd5b8335925060208401359150612340604085016121a7565b90509250925092565b60008060006040848603121561235e57600080fd5b83359250602084013567ffffffffffffffff8082111561237d57600080fd5b818601915086601f83011261239157600080fd5b8135818111156123a057600080fd5b8760208285010111156123b257600080fd5b6020830194508093505050509250925092565b600061014082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e08301526101008084015161242d8285018260ff169052565b5050610120928301511515919092015290565b6000806040838503121561245357600080fd5b61245c836121a7565b915061246a602084016121a7565b90509250929050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082028115828204841417610b1c57610b1c612489565b80820180821115610b1c57610b1c612489565b6020808252600a90820152695265656e7472616e637960b01b604082015260600190565b81810381811115610b1c57610b1c612489565b634e487b7160e01b600052601260045260246000fd5b60008261252557612525612500565b500490565b6020808252600990820152682737ba1037bbb732b960b91b604082015260600190565b60008261255c5761255c612500565b500690565b60006001820161257357612573612489565b5060010190565b6001600160a01b03841681526040602082018190528101829052818360608301376000818301606090810191909152601f909201601f1916010192915050565b6000602082840312156125cc57600080fd5b5051919050565b60608101600385106125e7576125e7612295565b938152602081019290925260409091015290565b60208101610b1c82846122ab56fea26469706673582212208ac56fecf3de03b65d1f9c6c1e8052aac0635bd82aa0e54311b39fd6f354649164736f6c63430008140033