Source Code
Overview
ETH Balance
0 ETH
ETH Value
$0.00Latest 25 from a total of 2,128 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Create Order Wit... | 397026801 | 89 days ago | IN | 0 ETH | 0.00000146 | ||||
| Create Order Wit... | 397018579 | 89 days ago | IN | 0 ETH | 0.00000239 | ||||
| Create Order Wit... | 397018113 | 89 days ago | IN | 0 ETH | 0.00000167 | ||||
| Create Order Wit... | 397017993 | 89 days ago | IN | 0 ETH | 0.00000172 | ||||
| Create Order Wit... | 397017874 | 89 days ago | IN | 0 ETH | 0.00000183 | ||||
| Create Order Wit... | 397017702 | 89 days ago | IN | 0 ETH | 0.00000178 | ||||
| Create Order Wit... | 397017593 | 89 days ago | IN | 0 ETH | 0.00000172 | ||||
| Create Order Wit... | 397017479 | 89 days ago | IN | 0 ETH | 0.00000174 | ||||
| Create Order Wit... | 397017360 | 89 days ago | IN | 0 ETH | 0.00000181 | ||||
| Create Order Wit... | 397017262 | 89 days ago | IN | 0 ETH | 0.00000182 | ||||
| Create Order Wit... | 397015680 | 89 days ago | IN | 0 ETH | 0.00000166 | ||||
| Create Order Wit... | 397004121 | 89 days ago | IN | 0 ETH | 0.00000263 | ||||
| Create Order Wit... | 396988236 | 89 days ago | IN | 0 ETH | 0.00000191 | ||||
| Create Order Wit... | 396948061 | 89 days ago | IN | 0 ETH | 0.00000166 | ||||
| Create Order Wit... | 396947939 | 89 days ago | IN | 0 ETH | 0.00000166 | ||||
| Create Order Wit... | 396947836 | 89 days ago | IN | 0 ETH | 0.00000145 | ||||
| Create Order Wit... | 396947733 | 89 days ago | IN | 0 ETH | 0.00000145 | ||||
| Create Order Wit... | 396944333 | 89 days ago | IN | 0 ETH | 0.00000199 | ||||
| Create Order Wit... | 396931162 | 89 days ago | IN | 0 ETH | 0.00000159 | ||||
| Create Order Wit... | 396911005 | 89 days ago | IN | 0 ETH | 0.00000396 | ||||
| Create Order Wit... | 396910908 | 89 days ago | IN | 0 ETH | 0.00000421 | ||||
| Create Order Wit... | 396877412 | 89 days ago | IN | 0 ETH | 0.0000027 | ||||
| Create Order Wit... | 396766450 | 90 days ago | IN | 0 ETH | 0.00000756 | ||||
| Create Order Wit... | 396737827 | 90 days ago | IN | 0 ETH | 0.00006343 | ||||
| Create Order Wit... | 396737597 | 90 days ago | IN | 0 ETH | 0.0000676 |
Cross-Chain Transactions
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xd9bda4eE...fec5c799A The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
logicUSDT
Compiler Version
v0.8.24+commit.e11b9ed9
Optimization Enabled:
Yes with 1000 runs
Other Settings:
cancun EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { ReentrancyGuard } from '@openzeppelin/contracts/security/ReentrancyGuard.sol';
import './SysUserContract.sol';
/**
* @title SysUserContract (Gas Optimized)
* @notice 用户和订单管理系统,支持多种资金池管理、订单创建和资金提取功能
* @dev 金额和余额字段默认存储值*10000(保留小数点4位)
*/
contract logicUSDT {
SysUserContract public data;
address dataAddr;
address[] public adminAddrs;
error ServerError();
mapping(address => bool) public admins;
//接收钱包地址 key=地址 value=接收金额
mapping(address => uint256) public receiveAddrs;
//接收钱包地址列表
address[] public receiveAddrsList;
//当前接收钱包下标
uint256 public currentReceiveIndex = 0;
//默认最大接收金额20wU
uint256 public maxReceiveAmount = 300000 * 1000000;
constructor(SysUserContract _data) {
admins[msg.sender] = true;
adminAddrs.push(msg.sender);
data = _data;
dataAddr = address(_data);
}
//添加接收钱包地址
function addReceiveAddr(address _receiveAddr) public {
require(admins[msg.sender], 'must admin');
receiveAddrs[_receiveAddr] = 0;
receiveAddrsList.push(_receiveAddr);
}
//设置最大接收金额
function setMaxReceiveAmount(uint256 _maxReceiveAmount) public {
require(admins[msg.sender], 'must admin');
maxReceiveAmount = _maxReceiveAmount;
}
//设置接收钱包地址的值
function setReceiveAddr(address _receiveAddr, uint256 _receiveAmount) public {
require(admins[msg.sender], 'must admin');
receiveAddrs[_receiveAddr] = _receiveAmount;
}
//设置当前接收钱包下标
function setCurrentReceiveIndex(uint256 _currentReceiveIndex) public {
require(admins[msg.sender], 'must admin');
currentReceiveIndex = _currentReceiveIndex;
}
//获取接收钱包地址列表
function getReceiveAddrList() public view returns (address[] memory) {
return receiveAddrsList;
}
/**
* @notice 使用本金池创建订单(自动计算代币数量)
* @param _tokenIndex 代币索引
* @param _usdAmount 订单美元价值(单位:万分之一)
* @param _period 订单周期(天数)
* @param _orderType 订单类型 1 = 正常订单 2 = 复利订单 3 = 流动性订单
* @dev 自动计算订单对应的代币数量,无需手动传入[5](@ref)
*/
function createOrderWithPrincipalPool(
uint8 _tokenIndex,
uint32 _usdAmount,
uint8 _period,
uint8 _orderType
) external {
uint32 _userId = data.addressToUserId(msg.sender);
SysUserContract.User memory user = data.getUser(_userId);
require(_userId != 0, 'User not exists');
require(_usdAmount >= data.minOrderMoney(), 'Amount too small');
require(_orderType != 2, 'Type err: 2');
require(data.getToken(_tokenIndex).allowIn, 'Invalid token');
uint32 principalUsed = 0;
// 本金池大于0时才使用
if (user.principalPool > 0) {
principalUsed = _usdAmount > user.principalPool
? user.principalPool
: _usdAmount;
user.principalPool -= principalUsed;
data.updateUserProperty(_userId, 3, user.principalPool, false);
}
// 2. 剩余需要支付的美元部分
uint32 remainingUsd = _usdAmount - principalUsed;
uint256 tokenToPay = 0;
if (remainingUsd > 0) {
address tokenAddr = data.getToken(_tokenIndex).tokenAddress;
//代币地址必须是USDT,
require(tokenAddr == address(0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9), "error USDT");
// 3. 计算需支付的代币数量(基于剩余金额),USDT小数点6位
tokenToPay = uint256(remainingUsd)*100;
//根据下标得到接收地址,转账后添加金额计数
address receiveAddr = receiveAddrsList[currentReceiveIndex];
// 4. 安全转账(添加结果检查)
bool success = IERC20(tokenAddr).transferFrom(
msg.sender,
receiveAddr,
tokenToPay
);
require(success, 'Transfer failed');
//转账后添加金额
receiveAddrs[receiveAddr] += tokenToPay;
//如果当前接收地址金额达到最大接收金额,则下标+1
if(receiveAddrs[receiveAddr] >= maxReceiveAmount){
currentReceiveIndex++;
}
}
// if (user.maxOrderId == user.id * 10000 && _orderType == 1) {
// // 首次下单,订单金额奖励10%
// uint32 addMoney = _usdAmount * 10/100;
// if(addMoney > 1000000 ){
// addMoney = 1000000;
// }
// _usdAmount = _usdAmount + addMoney;
// }
// 5. 使用完整tokenAmount创建订单
data._createOrder(
_userId,
tokenToPay,
_tokenIndex,
_usdAmount,
_period,
_orderType
);
//设置最大周期值
if (data.userMaxOrderPeriod(_userId) < _period) {
data.setUserMaxOrderPeriod(_userId, _period);
}
}
/**
* @notice 复利订单
* @param _amount 金额(单位:万分之一)
*/
function orderCompound(uint32 _amount) external {
uint32 _userId = data.addressToUserId(msg.sender);
SysUserContract.User memory user = data.getUser(_userId);
require(
_userId != 0 && user.earnings - user.withdrawn >= _amount,
'Insufficient'
);
user.withdrawn += _amount;
data.updateUserProperty(user.id, 6, user.withdrawn, false);
data._createOrder(
_userId,
0,
0,
_amount,
data.userMaxOrderPeriod(_userId),
2
);
}
/**
* @notice 订单提取功能
* @param _orderId 待提取的订单ID
*/
function orderWithdraw(uint32 _orderId) external {
uint32 _userId = data.addressToUserId(msg.sender);
SysUserContract.Order memory order = data.getOrder(_orderId);
require(
_userId != 0 && order.id != 0 && order.overTime == 0 && order.userId == _userId,
'Invalid order'
);
_userId = order.userId;
uint32 nowTime = uint32(block.timestamp);
if (order.orderType == 1) {
//没到期不能提
require(
order.createdAt + order.period * 86400 < nowTime,
'time error'
);
if (order.period == 90) {
require(data.timeOverCanWithdraw() != 1, 'time error');
}
}
order.overTime = nowTime;
data.updateOrderProperty(
order.id,
order.userId,
order.tokenAmount,
order.tokenIndex,
order.usdAmount,
uint8(order.period),
order.orderType,
order.overTime,
order.isActive
);
SysUserContract.User memory user = data.getUser(_userId);
uint32 amount = order.usdAmount;
if (order.orderType == 1) {
require(order.period != 90, 'period can not Withdraw');
//普通订单 按比例给到本金池
uint32 energyAmount = uint32(
(uint256(amount) * uint256(data.energyPoolEnterBasisPoints())) /
data.PRECISION()
);
user.energyPool += energyAmount;
data.updateUserProperty(user.id, 2, user.energyPool, true);
user.principalPool += amount - energyAmount;
data.updateUserProperty(user.id, 3, user.principalPool, true);
} else if (order.orderType == 2) {
//复利订单 减掉收益提取值
//user.withdrawn -= amount;
//data.updateUserProperty(user.id, 6, user.withdrawn, false);
//复利订单100%进储能池
user.energyPool += amount;
data.updateUserProperty(user.id, 2, user.energyPool, true);
} else if (order.orderType == 3) {
//流动性订单 50%给到本金池,50%储能池
user.principalPool += amount/2;
data.updateUserProperty(user.id, 3, user.principalPool, true);
user.energyPool += amount/2;
data.updateUserProperty(user.id, 2, user.energyPool, true);
}
data.addWithdrawnOrderIds(_orderId);
data._createLog(_userId, order.id, amount, order.orderType, 31);
}
/**
* @notice 用户间内部转账
* @param _targetAddress 目标用户地址
* @param _amount 转账金额(单位:万分之一)
*/
function internalTransfer(address _targetAddress, uint32 _amount) external {
uint32 senderId = data.addressToUserId(msg.sender);
require(senderId != 0, 'Invalid sender');
uint32 receiverId = data.addressToUserId(_targetAddress);
require(receiverId != 0, 'Invalid receiver');
SysUserContract.User memory sender = data.getUser(senderId);
//status为2和3的账户不能提
require(sender.status != 2 && sender.status != 3, 'Invalid user status');
uint32 available = (sender.earnings - sender.withdrawn) +
sender.principalPool;
require(available >= _amount, 'Insufficient');
if (_amount > (sender.earnings - sender.withdrawn)) {
uint32 fromPrincipal = _amount -
(sender.earnings - sender.withdrawn);
sender.principalPool -= fromPrincipal;
data.updateUserProperty(sender.id, 3, sender.principalPool, false);
sender.withdrawn = sender.earnings;
data.updateUserProperty(sender.id, 6, sender.withdrawn, false);
} else {
sender.withdrawn += _amount;
data.updateUserProperty(sender.id, 6, sender.withdrawn, false);
}
SysUserContract.User memory receiver = data.getUser(receiverId);
receiver.principalPool += uint32(
(uint256(_amount) * data.internalTransferBasisPoints()) /
data.PRECISION()
);
data.updateUserProperty(receiver.id, 3, receiver.principalPool, false);
data._createLog(senderId, receiverId, _amount, 0, 16);
}
/**
* @notice 用户资金提取功能
* @param _amount 提取金额(单位:万分之一)
* @param _tokenIndex 代币索引
* @param _withdrawnType 提取类型:1=收益池提取,2=本金池提取
*/
function withdrawFunds(
uint32 _amount,
uint8 _tokenIndex,
uint8 _withdrawnType
) external {
uint32 _userId = data.addressToUserId(msg.sender);
require(_userId != 0, 'User not exists');
require(_withdrawnType == 1 || _withdrawnType == 2, 'Invalid type');
SysUserContract.Token memory t = data.getToken(_tokenIndex);
require(t.tokenAddress != address(0) && t.allowOut, 'Invalid token');
IERC20 token = IERC20(t.tokenAddress);
//代币地址必须是USDT,
require(t.tokenAddress == address(0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9), "error USDT");
uint256 tokenAmount = ((uint256(_amount) *
data.serviceFeeBasisPoints()) / data.PRECISION())*100;
require(
token.balanceOf(address(this)) >= tokenAmount,
'Insufficient balance'
);
SysUserContract.User memory user = data.getUser(_userId);
//status为2和3的账户不能提
require(user.status != 2 && user.status != 3, 'Invalid user status');
if (_withdrawnType == 1) {
require(
(user.earnings - user.withdrawn) >= _amount,
'Insufficient earnings'
);
user.withdrawn += _amount;
data.updateUserProperty(user.id, 6, user.withdrawn, false);
data._createLog(_userId, 0, _amount,uint32(tokenAmount/100),28);
} else {
require(user.principalPool >= _amount, 'Insufficient principal');
user.principalPool -= _amount;
data.updateUserProperty(user.id, 3, user.principalPool, false);
data._createLog(_userId, 0, _amount,uint32(tokenAmount/100),29);
}
token.transfer(user.userAddress, tokenAmount);
}
/**
* @notice 0号线设置下属账号类型为:超级节点和创始节点
* @param _userType 用户类型 3=创始节点 5=超级节点
* @param _userAddress 用户地址
* @param _whileMax 允许最大循环次数
*/
function updateUserType(
uint8 _userType,
address _userAddress,
uint8 _whileMax
) external {
uint32 _userId = data.addressToUserId(msg.sender);
//require(admins[msg.sender], 'must admin');
SysUserContract.User memory user = data.getUser(_userId);
uint32 targetUserId = data.addressToUserId(_userAddress);
require(targetUserId != 0, 'targetUserId == 0');
require(user.userType == 2, 'user own userType != 2');
require(_userType == 3 || _userType == 5, 'userType error');
// if (_userType == 3 && user.foundId != 0) revert ServerError();
// if (_userType == 5 && user.supperId != 0) revert ServerError();
SysUserContract.User memory targetUser = data.getUser(targetUserId);
require(targetUser.userType == 1, 'targetUser must userType == 1 ');
for (uint8 i = 0; i <= _whileMax; i++) {
uint32 referrerId = targetUser.referrerId;
if (referrerId == _userId) {
data._createLog(_userId, targetUserId, _userType,0,30);
data.updateUserProperty(targetUserId, 4, _userType, false);
break;
}
require(referrerId != 0, 'can not find');// 顶层节点
targetUser = data.getUser(referrerId); // 向上查找
}
}
// ----------------------- 管理员函数 -----------------------
function addAdmin(address _adminAddress) external {
if (!admins[msg.sender]) revert ServerError();
admins[_adminAddress] = true;
adminAddrs.push(_adminAddress);
}
function removeAdmin(address _adminAddress) external {
if (!admins[msg.sender]) revert ServerError();
admins[_adminAddress] = false;
}
function getadminAddrs() external view returns (address[] memory) {
uint256 length = adminAddrs.length;
address[] memory result = new address[](length);
uint256 j = 0;
for (uint256 i = 0; i < length; ) {
if (admins[adminAddrs[i]]) {
result[j] = adminAddrs[i];
unchecked {
j++;
}
}
unchecked {
i++;
}
}
return result;
}
/**
* @notice 管理员资金提取
* @param _amount 提取代币数额(单位:万分之一)
* @param _tokenIndex 代币索引
*/
function withdrawMoney(uint32 _amount, uint8 _tokenIndex) external {
if (!admins[msg.sender]) revert ServerError();
SysUserContract.Token memory t = data.getToken(_tokenIndex);
require(t.tokenAddress != address(0), 'Invalid token');
IERC20 token = IERC20(t.tokenAddress);
uint256 tokenAmount = uint256(_amount);
require( token.balanceOf(address(this)) >= tokenAmount, 'Insufficient balance');
token.transfer(msg.sender, tokenAmount);
uint32 amount = uint32(tokenAmount / 100);
data._createLog(
data.addressToUserId(msg.sender),
uint32(_tokenIndex),
0,
amount,
17
);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import { ReentrancyGuard } from '@openzeppelin/contracts/security/ReentrancyGuard.sol';
import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol';
/**
* @title SysUserContract (Gas Optimized)
* @notice 用户和订单管理系统,支持多种资金池管理、订单创建和资金提取功能
* @dev 金额和余额字段默认存储值*10000(保留小数点4位)
*/
contract SysUserContract is ReentrancyGuard {
error ServerError();
event UserTypeUpdated(address indexed user, uint8 userType, bool success);
struct User {
uint32 id; // 用户唯一标识符
address userAddress; // 用户钱包地址
uint32 referrerId; // 推荐人ID
uint32 supperId; // 当前用户设置的下属账号为超级节点的id
uint32 foundId; // 当前用户设置的下属账号为创始节点的id
uint32 earnings; // 累计收益(单位:万分之一)
uint32 withdrawn; // 已提取金额(单位:万分之一)
uint32 energyPool; // 储能池余额(单位:万分之一)
uint32 principalPool; // 本金池余额(单位:万分之一)
uint32 maxOrderId; // 当前最大订单ID
uint8 userType; // 用户类型:1=普通,2=0号线,3=创始节点,4=0号线冻结 5 =超级节点
uint8 status; // 用户状态:1=正常,2=冻结提款,3=禁用
uint32 createdAt; // 用户创建时间戳
}
struct Order {
uint32 id; // 订单唯一标识符
uint256 tokenAmount; // 代币数量(原始单位)
uint8 tokenIndex; // 代币类型索引(代替地址降低gas)
uint32 usdAmount; // 美元价值(单位:万分之一)
uint16 period; // 订单周期(天数)
uint32 createdAt; // 订单创建时间戳
// uint32 orderFreezeTime; // 订单冻结时间
bool isActive; // 订单是否活跃
uint32 userId; // 所属用户ID
uint8 orderType; // 订单类型:1=正常,2=复利 3=流动性 4=提取收益池 5=提取本金池
uint32 overTime; // 订单结束时间戳
}
struct Token {
uint8 tokenIndex; // 代币索引
uint32 tokenPrice; // 代币价格(多少代币等于1U)
address tokenAddress; // 代币地址
string tokenSymbol; // 代币符号
bool allowIn; // 允许下单
bool allowOut; // 允许提款
}
struct Log {
uint256 id; // 日志唯一标识符
uint32 userId; // 用户ID
uint32 num; // 记录一些数值
uint32 oldValue; // 旧值
uint32 newValue; // 新值
uint8 contractType; // 合约类型:1=用户,2=奖励配置 3=变量配置
uint8 operationType; // 操作类型
uint32 createdAt; // 日志创建时间戳
}
// 系统配置参数
uint32 public userIdCounter = 1;
uint32 public orderNumCounter = 1;
uint256 public logCounter = 1;
uint32[] public withdrawnOrderIds;
uint16 public serviceFeeBasisPoints = 8500; // 提取手续费(基点:8500=85%)
uint16 public internalTransferBasisPoints = 9300; // 内部转账手续费(基点:9300=93%)
uint16 public energyPoolEnterBasisPoints = 5000; // 储能池分配比例(基点:5000=50%)
uint16 public liquidityAmountEarningsBasisPoints = 60; // 流动性金额收益比例(基点:60=0.6%)
uint32 public minOrderMoney = 1000000; // 最小订单金额(单位:万分之一)
uint16 public timeOverCanWithdraw = 0; //90天合约顶单,到期1表示不能提,0表示可以提
// 精度常量
uint32 public constant PRECISION = 1e4; // 基点精度(10000)
uint256 public constant TOKEN_PRECISION_FACTOR = 1e14; // 代币精度转换因子(18位→4位)
// 数据存储
mapping(uint32 => Order) public orders;
mapping(uint32 => uint32) public orderNumToOrderId; // 订单流水号→订单id
mapping(address => uint32) public addressToUserId;
mapping(uint32 => address) public userIdToaddress;
mapping(uint32 => User) public users;
mapping(uint32 => uint8) public userMaxOrderPeriod;
mapping(uint8 => Token) public tokens;
uint8 public maxTokenIndex; // 最大token索引
mapping(uint16 => uint16) public userLevels; // 用户等级配置
uint16 public maxLv; // 最大用户等级
mapping(address => bool) public admins;
address[] public adminAddrs;
mapping(uint256 => Log) public logs;
constructor() {
admins[msg.sender] = true;
adminAddrs.push(msg.sender);
setToken(
1,
0x5F008355974c1bcD7aDd77ae47D66bAC711d4d8A,
91000,
'GOF',
true,
true,
1
);
}
function getUser(uint32 _userId) external returns (User memory user) {
return users[_userId];
}
function getToken(uint8 _id) external returns (Token memory token) {
return tokens[_id];
}
function getOrder(uint32 _id) external returns (Order memory order) {
return orders[_id];
}
function addWithdrawnOrderIds(uint32 _orderId) external {
if (!admins[msg.sender]) revert ServerError();
withdrawnOrderIds.push(_orderId);
}
function setUserMaxOrderPeriod(uint32 _id, uint8 _period) external {
if (!admins[msg.sender]) revert ServerError();
userMaxOrderPeriod[_id] = _period;
}
/**
* @notice 更新订单函数
* @param _id 订单id
* @param _userId 用户ID
* @param _tokenAmount 代币数量(原始单位)
* @param _tokenIndex 代币索引
* @param _usdAmount 美元价值(单位:万分之一)
* @param _period 订单周期(天数)
* @param _orderType 订单类型:1=正常,2=复利
* @param _overTime 时间
* @param _isActive 是否生效
*/
function updateOrderProperty(
uint32 _id,
uint32 _userId,
uint256 _tokenAmount,
uint8 _tokenIndex,
uint32 _usdAmount,
uint8 _period,
uint8 _orderType,
uint32 _overTime,
bool _isActive
) external {
if (!admins[msg.sender]) revert ServerError();
if (_id == 0) revert ServerError();
if (orders[_id].userId != _userId) orders[_id].userId = _userId;
if (orders[_id].tokenAmount != _tokenAmount)
orders[_id].tokenAmount = _tokenAmount;
if (orders[_id].tokenIndex != _tokenIndex)
orders[_id].tokenIndex = _tokenIndex;
if (orders[_id].usdAmount != _usdAmount)
orders[_id].usdAmount = _usdAmount;
if (orders[_id].period != _period) orders[_id].period = _period;
if (orders[_id].orderType != _orderType)
orders[_id].orderType = _orderType;
if (orders[_id].overTime != _overTime) orders[_id].overTime = _overTime;
if (orders[_id].isActive != _isActive) orders[_id].isActive = _isActive;
}
/**
* @notice 更新用户属性(仅管理员)
* @param _userId 用户ID
* @param _type 属性类型:1=累计收益,2=储能池,3=本金池,4=用户类型,5=用户状态
* @param _amount 新的属性值
* @param _setLog 是否加日志
*/
function updateUserProperty(
uint32 _userId,
uint8 _type,
uint32 _amount,
bool _setLog
) external {
if (!admins[msg.sender]) revert ServerError();
uint32 adminId = addressToUserId[msg.sender];
User storage user = users[_userId];
require(user.id != 0, 'User not exists');
if (_type == 1) {
if (_setLog)
_createLog(_userId, adminId, user.earnings, _amount, 1);
user.earnings = _amount;
} else if (_type == 2) {
if (_setLog)
_createLog(_userId, adminId, user.energyPool, _amount, 2);
user.energyPool = _amount;
} else if (_type == 3) {
if (_setLog)
_createLog(_userId, adminId, user.principalPool, _amount, 3);
user.principalPool = _amount;
} else if (_type == 4) {
if (_setLog)
_createLog(_userId, adminId, user.userType, _amount, 4);
user.userType = uint8(_amount);
} else if (_type == 5) {
if (_setLog) _createLog(_userId, adminId, user.status, _amount, 5);
user.status = uint8(_amount);
} else if (_type == 6) {
if (_setLog)
_createLog(_userId, adminId, user.withdrawn, _amount, 6);
user.withdrawn = _amount;
} else if (_type == 7) {
user.foundId = _amount;
} else if (_type == 8) {
user.supperId = _amount;
}
}
/**
* @notice 创建日志
* @param _userId 用户ID
* @param _num 记录一些数值
* @param _oldValue 旧值
* @param _newValue 新值
* @param _operationType 操作类型
*/
function _createLog(
uint32 _userId,
uint32 _num,
uint32 _oldValue,
uint32 _newValue,
uint8 _operationType
) public {
if (!admins[msg.sender]) revert ServerError();
uint256 logId = logCounter++;
logs[logId] = Log({
id: logId,
userId: _userId,
num: _num,
oldValue: _oldValue,
newValue: _newValue,
contractType: 1,
operationType: _operationType,
createdAt: uint32(block.timestamp)
});
}
/**
* @notice 更新用户收益
* @param userIds 用户ID数组
* @param amounts 对应的收益金额数组
*/
function updateUserEarnings(
uint32[] calldata userIds,
uint32[] calldata amounts
) external {
if (!admins[msg.sender] || userIds.length != amounts.length)
revert ServerError();
for (uint256 i = 0; i < userIds.length; i++) {
User storage user = users[userIds[i]];
require(user.id != 0, 'User not exists');
user.earnings = amounts[i];
_createLog(userIds[i], 0, user.earnings, amounts[i], 7);
}
}
/**
* @notice 更新系统配置参数
* @param _type 配置类型:1=提现手续费,2=内部转账手续费,3=储能池分配比例,4=最小订单金额,5=流动性金额收益比例,6=到期是否能提走
* @param _num 新的配置值
*/
function setSystemConfig(uint8 _type, uint32 _num) external {
if (!admins[msg.sender]) revert ServerError();
uint32 userId = addressToUserId[msg.sender];
if (_type == 1) {
_createLog(userId, 0, serviceFeeBasisPoints, _num, 8);
serviceFeeBasisPoints = uint16(_num);
} else if (_type == 2) {
_createLog(userId, 0, internalTransferBasisPoints, _num, 9);
internalTransferBasisPoints = uint16(_num);
} else if (_type == 3) {
_createLog(userId, 0, energyPoolEnterBasisPoints, _num, 10);
energyPoolEnterBasisPoints = uint16(_num);
} else if (_type == 4) {
_createLog(userId, 0, minOrderMoney, _num, 11);
minOrderMoney = _num;
} else if (_type == 5) {
_createLog(userId, 0, liquidityAmountEarningsBasisPoints, _num, 12);
liquidityAmountEarningsBasisPoints = uint16(_num);
} else if (_type == 6) {
_createLog(userId, 0, timeOverCanWithdraw, _num, 13);
timeOverCanWithdraw = uint16(_num);
}
}
/**
* @notice 设置代币信息
* @param _index 代币索引(0-255)
* @param _tokenAddr 代币合约地址
* @param _price 代币价格(美分)
* @param _tokenSymbol 代币符号
* @param _allowIn 允许下单
* @param _allowOut 允许提取
*/
function setToken(
uint8 _index,
address _tokenAddr,
uint32 _price,
string memory _tokenSymbol,
bool _allowIn, // 允许下单
bool _allowOut, // 允许提款
uint8 _logSet
) public {
if (!admins[msg.sender]) revert ServerError();
require(_tokenAddr != address(0) && _price > 0, 'Invalid token');
if (_logSet == 0) {
_createLog(
addressToUserId[msg.sender],
_index,
tokens[_index].tokenPrice,
_price,
14
);
}
tokens[_index] = Token({
tokenIndex: _index,
tokenPrice: _price,
tokenAddress: _tokenAddr,
tokenSymbol: _tokenSymbol,
allowIn: _allowIn,
allowOut: _allowOut
});
if (_index > maxTokenIndex) {
maxTokenIndex = _index;
}
}
/**
* @notice 更新代币价格
* @param _index 代币索引(0-255)
* @param _price 代币价格(美分)
*/
function setTokenPrice(uint8 _index, uint32 _price) public {
if (!admins[msg.sender]) revert ServerError();
require(_price > 0, 'Invalid token');
tokens[_index].tokenPrice = _price;
}
/**
* @notice 用户注册功能
* @param _referrerId 推荐人ID(0表示无推荐人)
*/
function registerUser(uint32 _referrerId) external {
address _userAddress = msg.sender;
require(addressToUserId[_userAddress] == 0, 'User exists');
if (_referrerId > 0)
require(users[_referrerId].id != 0, 'Invalid referrer');
uint32 newUserId = userIdCounter++;
users[newUserId] = User({
id: newUserId,
userAddress: _userAddress,
referrerId: _referrerId,
supperId: 0,
foundId: 0,
earnings: 0,
withdrawn: 0,
energyPool: 0,
principalPool: 0,
maxOrderId: newUserId * 10000,
userType: 1,
status: 1,
createdAt: uint32(block.timestamp)
});
addressToUserId[_userAddress] = newUserId;
userIdToaddress[newUserId] = _userAddress;
}
/**
* @notice 内部创建订单函数
* @param _userId 用户ID
* @param _tokenAmount 代币数量(原始单位)
* @param _tokenIndex 代币索引
* @param _usdAmount 美元价值(单位:万分之一)
* @param _period 订单周期(天数)
* @param _orderType 订单类型:1=正常,2=复利
* @return 新订单ID
*/
function _createOrder(
uint32 _userId,
uint256 _tokenAmount,
uint8 _tokenIndex,
uint32 _usdAmount,
uint8 _period,
uint8 _orderType
) public returns (uint32) {
if (!admins[msg.sender]) revert ServerError();
User storage user = users[_userId];
uint32 newOrderId = ++user.maxOrderId;
orders[newOrderId] = Order({
id: newOrderId,
tokenAmount: _tokenAmount,
tokenIndex: _tokenIndex,
usdAmount: _usdAmount,
period: _period,
createdAt: uint32(block.timestamp),
isActive: true,
userId: _userId,
orderType: _orderType,
overTime: 0
});
orderNumToOrderId[orderNumCounter] = newOrderId;
orderNumCounter++;
return newOrderId;
}
/**
* @notice 设置用户等级配置
* @param _level 用户等级(1-65535)
* @param _count 该等级对应的虚拟用户数量
*/
function setUserLevel(uint16 _level, uint16 _count) public {
if (!admins[msg.sender]) revert ServerError();
_createLog(
addressToUserId[msg.sender],
_level,
userLevels[_level],
_count,
15
);
userLevels[_level] = _count;
if (_level > maxLv) maxLv = _level;
}
/**
* @notice 获取已提取的订单ID列表
* @return 已提取订单ID数组
*/
function getWithdrawnOrderIds() external view returns (uint32[] memory) {
return withdrawnOrderIds;
}
// ----------------------- 管理员函数 -----------------------
function addAdmin(address _adminAddress) external {
if (!admins[msg.sender]) revert ServerError();
admins[_adminAddress] = true;
adminAddrs.push(_adminAddress);
}
function removeAdmin(address _adminAddress) external {
if (!admins[msg.sender]) revert ServerError();
admins[_adminAddress] = false;
}
function getadminAddrs() external view returns (address[] memory) {
uint256 length = adminAddrs.length;
address[] memory result = new address[](length);
uint256 j = 0;
for (uint256 i = 0; i < length; ) {
if (admins[adminAddrs[i]]) {
result[j] = adminAddrs[i];
unchecked {
j++;
}
}
unchecked {
i++;
}
}
return result;
}
/**
* @notice 管理员资金提取
* @param _amount 提取代币数额(单位:万分之一)
* @param _tokenIndex 代币索引
*/
function withdrawMoney(
uint32 _amount,
uint8 _tokenIndex
) external nonReentrant {
if (!admins[msg.sender]) revert ServerError();
Token storage t = tokens[_tokenIndex];
require(t.tokenAddress != address(0), 'Invalid token');
IERC20 token = IERC20(t.tokenAddress);
uint256 tokenAmount = uint256(_amount) *
TOKEN_PRECISION_FACTOR *
PRECISION;
require(
token.balanceOf(address(this)) >= tokenAmount,
'Insufficient balance'
);
token.transfer(msg.sender, tokenAmount);
uint32 amount = uint32(tokenAmount / TOKEN_PRECISION_FACTOR);
_createLog(
addressToUserId[msg.sender],
uint32(_tokenIndex),
0,
amount,
17
);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
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 making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}{
"optimizer": {
"enabled": true,
"runs": 1000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"remappings": [],
"evmVersion": "cancun"
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract SysUserContract","name":"_data","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ServerError","type":"error"},{"inputs":[{"internalType":"address","name":"_adminAddress","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiveAddr","type":"address"}],"name":"addReceiveAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"adminAddrs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_tokenIndex","type":"uint8"},{"internalType":"uint32","name":"_usdAmount","type":"uint32"},{"internalType":"uint8","name":"_period","type":"uint8"},{"internalType":"uint8","name":"_orderType","type":"uint8"}],"name":"createOrderWithPrincipalPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentReceiveIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"data","outputs":[{"internalType":"contract SysUserContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReceiveAddrList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getadminAddrs","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_targetAddress","type":"address"},{"internalType":"uint32","name":"_amount","type":"uint32"}],"name":"internalTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxReceiveAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"_amount","type":"uint32"}],"name":"orderCompound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_orderId","type":"uint32"}],"name":"orderWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"receiveAddrs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"receiveAddrsList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_adminAddress","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_currentReceiveIndex","type":"uint256"}],"name":"setCurrentReceiveIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxReceiveAmount","type":"uint256"}],"name":"setMaxReceiveAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiveAddr","type":"address"},{"internalType":"uint256","name":"_receiveAmount","type":"uint256"}],"name":"setReceiveAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_userType","type":"uint8"},{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"uint8","name":"_whileMax","type":"uint8"}],"name":"updateUserType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_amount","type":"uint32"},{"internalType":"uint8","name":"_tokenIndex","type":"uint8"},{"internalType":"uint8","name":"_withdrawnType","type":"uint8"}],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_amount","type":"uint32"},{"internalType":"uint8","name":"_tokenIndex","type":"uint8"}],"name":"withdrawMoney","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
0x60806040525f6006556445d964b8006007553480156200001d575f80fd5b5060405162003da038038062003da08339810160408190526200004091620000c3565b335f818152600360205260408120805460ff191660019081179091556002805480830182559083527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0180546001600160a01b0319908116909417905581546001600160a01b0394909416938316841790915580549091169091179055620000f2565b5f60208284031215620000d4575f80fd5b81516001600160a01b0381168114620000eb575f80fd5b9392505050565b613ca080620001005f395ff3fe608060405234801561000f575f80fd5b5060043610610179575f3560e01c806370480275116100d2578063b72bd4d711610088578063e90946cf11610063578063e90946cf14610329578063eb8274ef1461033e578063eda7dd9414610346575f80fd5b8063b72bd4d7146102f0578063c0a1bb9614610303578063e3bdee2a14610316575f80fd5b806373d4a13a116100b857806373d4a13a146102c2578063aac5c0c2146102d4578063b3ad8d9a146102dd575f80fd5b8063704802751461029c57806370e9d585146102af575f80fd5b80632da47a681161013257806340ef9efe1161010d57806340ef9efe14610238578063429b62e51461024b5780635e2725b81461027d575f80fd5b80632da47a68146101ff5780632e0849cc1461021257806333b64d0514610225575f80fd5b80631e8f64b6116101625780631e8f64b6146101a5578063258b9d97146101d55780632c90a8e3146101e8575f80fd5b806316cf32ca1461017d5780631785f53c14610192575b5f80fd5b61019061018b3660046134b1565b610359565b005b6101906101a03660046134f9565b61088c565b6101b86101b336600461351b565b6108db565b6040516001600160a01b0390911681526020015b60405180910390f35b6101906101e3366004613543565b610903565b6101f160075481565b6040519081526020016101cc565b61019061020d36600461351b565b6110f3565b61019061022036600461359c565b611143565b6101906102333660046135c9565b6119e1565b61019061024636600461351b565b611cf4565b61026d6102593660046134f9565b60036020525f908152604090205460ff1681565b60405190151581526020016101cc565b6101f161028b3660046134f9565b60046020525f908152604090205481565b6101906102aa3660046134f9565b611d44565b6101906102bd366004613600565b611de5565b5f546101b8906001600160a01b031681565b6101f160065481565b6101b86102eb36600461351b565b6120dc565b6101906102fe36600461361b565b6120eb565b6101906103113660046134f9565b612151565b610190610324366004613645565b612203565b61033161296a565b6040516101cc9190613671565b610331612a73565b610190610354366004613600565b612ad3565b5f8054604051632d7feef360e21b81523360048201526001600160a01b039091169063b5ffbbcc90602401602060405180830381865afa15801561039f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c391906136cd565b5f80546040516336dbc79d60e21b815263ffffffff8416600482015292935090916001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af1158015610416573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061043a91906137b4565b5f8054604051632d7feef360e21b81526001600160a01b0388811660048301529394509192169063b5ffbbcc90602401602060405180830381865afa158015610485573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a991906136cd565b90508063ffffffff165f036105055760405162461bcd60e51b815260206004820152601160248201527f746172676574557365724964203d3d203000000000000000000000000000000060448201526064015b60405180910390fd5b81610140015160ff1660021461055d5760405162461bcd60e51b815260206004820152601660248201527f75736572206f776e20757365725479706520213d20320000000000000000000060448201526064016104fc565b8560ff166003148061057257508560ff166005145b6105be5760405162461bcd60e51b815260206004820152600e60248201527f7573657254797065206572726f7200000000000000000000000000000000000060448201526064016104fc565b5f80546040516336dbc79d60e21b815263ffffffff841660048201526001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af115801561060c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063091906137b4565b905080610140015160ff1660011461068a5760405162461bcd60e51b815260206004820152601e60248201527f74617267657455736572206d757374207573657254797065203d3d203120000060448201526064016104fc565b5f5b8560ff168160ff161161088257604082015163ffffffff808716908216036107a6575f80546040516369d8d54960e11b815263ffffffff808a1660048301528716602482015260ff8c1660448201526064810192909252601e60848301526001600160a01b03169063d3b1aa929060a4015f604051808303815f87803b158015610714575f80fd5b505af1158015610726573d5f803e3d5ffd5b50505f805460405163b76a749160e01b815263ffffffff8916600480830191909152602482015260ff8e16604482015260648101929092526001600160a01b0316925063b76a749191506084015f604051808303815f87803b15801561078a575f80fd5b505af115801561079c573d5f803e3d5ffd5b5050505050610882565b8063ffffffff165f036107fb5760405162461bcd60e51b815260206004820152600c60248201527f63616e206e6f742066696e64000000000000000000000000000000000000000060448201526064016104fc565b5f546040516336dbc79d60e21b815263ffffffff831660048201526001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af1158015610848573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061086c91906137b4565b925050808061087a906138c4565b91505061068c565b5050505050505050565b335f9081526003602052604090205460ff166108bb57604051633646ee0560e21b815260040160405180910390fd5b6001600160a01b03165f908152600360205260409020805460ff19169055565b600281815481106108ea575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f8054604051632d7feef360e21b81523360048201526001600160a01b039091169063b5ffbbcc90602401602060405180830381865afa158015610949573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096d91906136cd565b5f80546040516336dbc79d60e21b815263ffffffff8416600482015292935090916001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af11580156109c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e491906137b4565b90508163ffffffff165f03610a3b5760405162461bcd60e51b815260206004820152600f60248201527f55736572206e6f7420657869737473000000000000000000000000000000000060448201526064016104fc565b5f8054906101000a90046001600160a01b03166001600160a01b031663e3be09b46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aad91906136cd565b63ffffffff168563ffffffff161015610b085760405162461bcd60e51b815260206004820152601060248201527f416d6f756e7420746f6f20736d616c6c0000000000000000000000000000000060448201526064016104fc565b8260ff16600203610b5b5760405162461bcd60e51b815260206004820152600b60248201527f54797065206572723a203200000000000000000000000000000000000000000060448201526064016104fc565b5f5460405162415c3360e91b815260ff881660048201526001600160a01b03909116906382b86600906024015f604051808303815f875af1158015610ba2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610bc99190810190613971565b60800151610c095760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b60448201526064016104fc565b6101008101515f9063ffffffff1615610cd75781610100015163ffffffff168663ffffffff1611610c3a5785610c41565b8161010001515b9050808261010001818151610c569190613a34565b63ffffffff9081169091525f805461010086015160405163b76a749160e01b81528885166004820152600360248201529316604484015260648301919091526001600160a01b0316915063b76a7491906084015f604051808303815f87803b158015610cc0575f80fd5b505af1158015610cd2573d5f803e3d5ffd5b505050505b5f610ce28288613a34565b90505f63ffffffff821615610f3a575f805460405162415c3360e91b815260ff8c1660048201526001600160a01b03909116906382b86600906024015f604051808303815f875af1158015610d39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d609190810190613971565b6040015190506001600160a01b03811673fd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb914610dbf5760405162461bcd60e51b815260206004820152600a602482015269195c9c9bdc881554d11560b21b60448201526064016104fc565b610dd063ffffffff84166064613a58565b91505f600560065481548110610de857610de8613a75565b5f9182526020822001546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0391821660248201819052604482018790529350908416906323b872dd906064016020604051808303815f875af1158015610e62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e869190613a89565b905080610ed55760405162461bcd60e51b815260206004820152600f60248201527f5472616e73666572206661696c6564000000000000000000000000000000000060448201526064016104fc565b6001600160a01b0382165f9081526004602052604081208054869290610efc908490613aa2565b90915550506007546001600160a01b0383165f9081526004602052604090205410610f365760068054905f610f3083613ab5565b91905055505b5050505b5f546040517f89807d8d00000000000000000000000000000000000000000000000000000000815263ffffffff80881660048301526024820184905260ff808d166044840152908b166064830152808a166084830152881660a48201526001600160a01b03909116906389807d8d9060c4016020604051808303815f875af1158015610fc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fec91906136cd565b505f54604051637172ca6160e11b815263ffffffff8716600482015260ff8916916001600160a01b03169063e2e594c290602401602060405180830381865afa15801561103b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105f9190613acd565b60ff1610156110e8575f546040517f9deb8cd100000000000000000000000000000000000000000000000000000000815263ffffffff8716600482015260ff891660248201526001600160a01b0390911690639deb8cd1906044015f604051808303815f87803b1580156110d1575f80fd5b505af11580156110e3573d5f803e3d5ffd5b505050505b505050505050505050565b335f9081526003602052604090205460ff1661113e5760405162461bcd60e51b815260206004820152600a60248201526936bab9ba1030b236b4b760b11b60448201526064016104fc565b600755565b5f8054604051632d7feef360e21b81523360048201526001600160a01b039091169063b5ffbbcc90602401602060405180830381865afa158015611189573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ad91906136cd565b90508063ffffffff165f036112045760405162461bcd60e51b815260206004820152600f60248201527f55736572206e6f7420657869737473000000000000000000000000000000000060448201526064016104fc565b8160ff166001148061121957508160ff166002145b6112655760405162461bcd60e51b815260206004820152600c60248201527f496e76616c69642074797065000000000000000000000000000000000000000060448201526064016104fc565b5f805460405162415c3360e91b815260ff861660048201526001600160a01b03909116906382b86600906024015f604051808303815f875af11580156112ad573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112d49190810190613971565b60408101519091506001600160a01b0316158015906112f457508060a001515b6113305760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b60448201526064016104fc565b60408101516001600160a01b03811673fd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb91461138e5760405162461bcd60e51b815260206004820152600a602482015269195c9c9bdc881554d11560b21b60448201526064016104fc565b5f805f9054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113de573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140291906136cd565b63ffffffff165f8054906101000a90046001600160a01b03166001600160a01b031663431fbc686040518163ffffffff1660e01b8152600401602060405180830381865afa158015611456573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147a9190613af9565b61148e9061ffff1663ffffffff8a16613a58565b6114989190613b26565b6114a3906064613a58565b6040516370a0823160e01b815230600482015290915081906001600160a01b038416906370a0823190602401602060405180830381865afa1580156114ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061150e9190613b39565b101561155c5760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742062616c616e636500000000000000000000000060448201526064016104fc565b5f80546040516336dbc79d60e21b815263ffffffff871660048201526001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af11580156115aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ce91906137b4565b905080610160015160ff166002141580156115f2575080610160015160ff16600314155b61163e5760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642075736572207374617475730000000000000000000000000060448201526064016104fc565b8560ff166001036117e2578763ffffffff168160c001518260a001516116649190613a34565b63ffffffff1610156116b85760405162461bcd60e51b815260206004820152601560248201527f496e73756666696369656e74206561726e696e6773000000000000000000000060448201526064016104fc565b878160c0018181516116ca9190613b50565b63ffffffff9081169091525f8054845160c086015160405163b76a749160e01b8152918516600483015260066024830152909316604484015260648301919091526001600160a01b0316915063b76a7491906084015f604051808303815f87803b158015611736575f80fd5b505af1158015611748573d5f803e3d5ffd5b50505f80546001600160a01b0316925063d3b1aa92915087908b61176d606488613b26565b6040516001600160e01b031960e087901b16815263ffffffff9485166004820152928416602484015290831660448301529091166064820152601c608482015260a4015f604051808303815f87803b1580156117c7575f80fd5b505af11580156117d9573d5f803e3d5ffd5b5050505061196b565b8763ffffffff1681610100015163ffffffff1610156118435760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e74207072696e636970616c0000000000000000000060448201526064016104fc565b8781610100018181516118569190613a34565b63ffffffff9081169091525f8054845161010086015160405163b76a749160e01b8152918516600483015260036024830152909316604484015260648301919091526001600160a01b0316915063b76a7491906084015f604051808303815f87803b1580156118c3575f80fd5b505af11580156118d5573d5f803e3d5ffd5b50505f80546001600160a01b0316925063d3b1aa92915087908b6118fa606488613b26565b6040516001600160e01b031960e087901b16815263ffffffff9485166004820152928416602484015290831660448301529091166064820152601d608482015260a4015f604051808303815f87803b158015611954575f80fd5b505af1158015611966573d5f803e3d5ffd5b505050505b602081015160405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490529084169063a9059cbb906044016020604051808303815f875af11580156119bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e89190613a89565b335f9081526003602052604090205460ff16611a1057604051633646ee0560e21b815260040160405180910390fd5b5f805460405162415c3360e91b815260ff841660048201526001600160a01b03909116906382b86600906024015f604051808303815f875af1158015611a58573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a7f9190810190613971565b60408101519091506001600160a01b0316611acc5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b60448201526064016104fc565b60408181015190516370a0823160e01b815230600482015263ffffffff85169081906001600160a01b038416906370a0823190602401602060405180830381865afa158015611b1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b419190613b39565b1015611b8f5760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742062616c616e636500000000000000000000000060448201526064016104fc565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015611bd9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bfd9190613a89565b505f611c0a606483613b26565b5f54604051632d7feef360e21b81523360048201529192506001600160a01b03169063d3b1aa9290829063b5ffbbcc90602401602060405180830381865afa158015611c58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c7c91906136cd565b6040516001600160e01b031960e084901b16815263ffffffff918216600482015260ff891660248201525f604482015290841660648201526011608482015260a4015b5f604051808303815f87803b158015611cd6575f80fd5b505af1158015611ce8573d5f803e3d5ffd5b50505050505050505050565b335f9081526003602052604090205460ff16611d3f5760405162461bcd60e51b815260206004820152600a60248201526936bab9ba1030b236b4b760b11b60448201526064016104fc565b600655565b335f9081526003602052604090205460ff16611d7357604051633646ee0560e21b815260040160405180910390fd5b6001600160a01b03165f818152600360205260408120805460ff191660019081179091556002805491820181559091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b5f8054604051632d7feef360e21b81523360048201526001600160a01b039091169063b5ffbbcc90602401602060405180830381865afa158015611e2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e4f91906136cd565b5f80546040516336dbc79d60e21b815263ffffffff8416600482015292935090916001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af1158015611ea2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ec691906137b4565b905063ffffffff821615801590611efc57508263ffffffff168160c001518260a00151611ef39190613a34565b63ffffffff1610155b611f375760405162461bcd60e51b815260206004820152600c60248201526b125b9cdd59999a58da595b9d60a21b60448201526064016104fc565b828160c001818151611f499190613b50565b63ffffffff9081169091525f8054845160c086015160405163b76a749160e01b8152918516600483015260066024830152909316604484015260648301919091526001600160a01b0316915063b76a7491906084015f604051808303815f87803b158015611fb5575f80fd5b505af1158015611fc7573d5f803e3d5ffd5b50505f8054604051637172ca6160e11b815263ffffffff871660048201526001600160a01b0390911693506389807d8d925085919081908890869063e2e594c290602401602060405180830381865afa158015612026573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061204a9190613acd565b6040516001600160e01b031960e088901b16815263ffffffff9586166004820152602481019490945260ff9283166044850152931660648301529091166084820152600260a482015260c4016020604051808303815f875af11580156120b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120d691906136cd565b50505050565b600581815481106108ea575f80fd5b335f9081526003602052604090205460ff166121365760405162461bcd60e51b815260206004820152600a60248201526936bab9ba1030b236b4b760b11b60448201526064016104fc565b6001600160a01b039091165f90815260046020526040902055565b335f9081526003602052604090205460ff1661219c5760405162461bcd60e51b815260206004820152600a60248201526936bab9ba1030b236b4b760b11b60448201526064016104fc565b6001600160a01b03165f8181526004602052604081208190556005805460018101825591527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db001805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b5f8054604051632d7feef360e21b81523360048201526001600160a01b039091169063b5ffbbcc90602401602060405180830381865afa158015612249573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061226d91906136cd565b90508063ffffffff165f036122c45760405162461bcd60e51b815260206004820152600e60248201527f496e76616c69642073656e64657200000000000000000000000000000000000060448201526064016104fc565b5f8054604051632d7feef360e21b81526001600160a01b0386811660048301529091169063b5ffbbcc90602401602060405180830381865afa15801561230c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061233091906136cd565b90508063ffffffff165f036123875760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642072656365697665720000000000000000000000000000000060448201526064016104fc565b5f80546040516336dbc79d60e21b815263ffffffff851660048201526001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af11580156123d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123f991906137b4565b905080610160015160ff1660021415801561241d575080610160015160ff16600314155b6124695760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642075736572207374617475730000000000000000000000000060448201526064016104fc565b5f8161010001518260c001518360a001516124849190613a34565b61248e9190613b50565b90508463ffffffff168163ffffffff1610156124db5760405162461bcd60e51b815260206004820152600c60248201526b125b9cdd59999a58da595b9d60a21b60448201526064016104fc565b8160c001518260a001516124ef9190613a34565b63ffffffff168563ffffffff161115612640575f8260c001518360a001516125179190613a34565b6125219087613a34565b90508083610100018181516125369190613a34565b63ffffffff9081169091525f8054865161010088015160405163b76a749160e01b8152918516600483015260036024830152909316604484015260648301919091526001600160a01b0316915063b76a7491906084015f604051808303815f87803b1580156125a3575f80fd5b505af11580156125b5573d5f803e3d5ffd5b5050505060a083015163ffffffff90811660c085018190525f8054865160405163b76a749160e01b81529416600485015260066024850152604484019290925260648301526001600160a01b03169063b76a7491906084015f604051808303815f87803b158015612624575f80fd5b505af1158015612636573d5f803e3d5ffd5b50505050506126d5565b848260c0018181516126529190613b50565b63ffffffff9081169091525f8054855160c087015160405163b76a749160e01b8152918516600483015260066024830152909316604484015260648301919091526001600160a01b0316915063b76a7491906084015f604051808303815f87803b1580156126be575f80fd5b505af11580156126d0573d5f803e3d5ffd5b505050505b5f80546040516336dbc79d60e21b815263ffffffff861660048201526001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af1158015612723573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061274791906137b4565b90505f8054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b8152600401602060405180830381865afa158015612797573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127bb91906136cd565b63ffffffff165f8054906101000a90046001600160a01b03166001600160a01b03166341df0ab86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561280f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128339190613af9565b6128479061ffff1663ffffffff8916613a58565b6128519190613b26565b81610100018181516128639190613b50565b63ffffffff9081169091525f8054845161010086015160405163b76a749160e01b8152918516600483015260036024830152909316604484015260648301919091526001600160a01b0316915063b76a7491906084015f604051808303815f87803b1580156128d0575f80fd5b505af11580156128e2573d5f803e3d5ffd5b50505f80546040516369d8d54960e11b815263ffffffff808b166004830152808a1660248301528b1660448201526064810192909252601060848301526001600160a01b0316925063d3b1aa92915060a4015f604051808303815f87803b15801561294b575f80fd5b505af115801561295d573d5f803e3d5ffd5b5050505050505050505050565b6002546060905f8167ffffffffffffffff81111561298a5761298a6136e8565b6040519080825280602002602001820160405280156129b3578160200160208202803683370190505b5090505f805b83811015612a6a5760035f600283815481106129d7576129d7613a75565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205460ff1615612a625760028181548110612a1657612a16613a75565b905f5260205f20015f9054906101000a90046001600160a01b0316838381518110612a4357612a43613a75565b6001600160a01b03909216602092830291909101909101526001909101905b6001016129b9565b50909392505050565b60606005805480602002602001604051908101604052809291908181526020018280548015612ac957602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311612aab575b5050505050905090565b5f8054604051632d7feef360e21b81523360048201526001600160a01b039091169063b5ffbbcc90602401602060405180830381865afa158015612b19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b3d91906136cd565b5f80546040517f899452e500000000000000000000000000000000000000000000000000000000815263ffffffff8616600482015292935090916001600160a01b039091169063899452e590602401610140604051808303815f875af1158015612ba9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bcd9190613b6d565b905063ffffffff821615801590612bea5750805163ffffffff1615155b8015612bff575061012081015163ffffffff16155b8015612c1a57508163ffffffff168160e0015163ffffffff16145b612c665760405162461bcd60e51b815260206004820152600d60248201527f496e76616c6964206f726465720000000000000000000000000000000000000060448201526064016104fc565b60e0810151610100820151909250429060ff16600103612db4578063ffffffff16826080015161ffff1662015180612c9e9190613c21565b62ffffff168360a00151612cb29190613b50565b63ffffffff1610612cf25760405162461bcd60e51b815260206004820152600a6024820152693a34b6b29032b93937b960b11b60448201526064016104fc565b816080015161ffff16605a03612db4575f8054906101000a90046001600160a01b03166001600160a01b031663ccb01b106040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d50573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d749190613af9565b61ffff16600103612db45760405162461bcd60e51b815260206004820152600a6024820152693a34b6b29032b93937b960b11b60448201526064016104fc565b63ffffffff81811661012084018190525f54845160e0860151602087015160408089015160608a015160808b01516101008c015160c08d015194517f2bf4755a000000000000000000000000000000000000000000000000000000008152978b166004890152958a166024880152604487019490945260ff9182166064870152909716608485015290861660a4840152941660c482015260e48101929092529115156101048201526001600160a01b0390911690632bf4755a90610124015f604051808303815f87803b158015612e89575f80fd5b505af1158015612e9b573d5f803e3d5ffd5b50505f80546040516336dbc79d60e21b815263ffffffff881660048201529193506001600160a01b0316915063db6f1e74906024016101a0604051808303815f875af1158015612eed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f1191906137b4565b60608401516101008501519192509060ff166001036131c557836080015161ffff16605a03612f825760405162461bcd60e51b815260206004820152601760248201527f706572696f642063616e206e6f7420576974686472617700000000000000000060448201526064016104fc565b5f805f9054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fd2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ff691906136cd565b63ffffffff165f8054906101000a90046001600160a01b03166001600160a01b0316634b3267516040518163ffffffff1660e01b8152600401602060405180830381865afa15801561304a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061306e9190613af9565b6130829061ffff1663ffffffff8516613a58565b61308c9190613b26565b9050808360e0018181516130a09190613b50565b63ffffffff9081169091525f54855160e087015160405163b76a749160e01b81529184166004830152600260248301529092166044830152600160648301526001600160a01b0316915063b76a7491906084015f604051808303815f87803b15801561310a575f80fd5b505af115801561311c573d5f803e3d5ffd5b50505050808261312c9190613a34565b836101000181815161313e9190613b50565b63ffffffff9081169091525f54855161010087015160405163b76a749160e01b81529184166004830152600360248301529092166044830152600160648301526001600160a01b0316915063b76a7491906084015f604051808303815f87803b1580156131a9575f80fd5b505af11580156131bb573d5f803e3d5ffd5b50505050506133b9565b83610100015160ff1660020361326c57808260e0018181516131e79190613b50565b63ffffffff9081169091525f54845160e086015160405163b76a749160e01b81529184166004830152600260248301529092166044830152600160648301526001600160a01b0316915063b76a7491906084015f604051808303815f87803b158015613251575f80fd5b505af1158015613263573d5f803e3d5ffd5b505050506133b9565b83610100015160ff166003036133b957613287600282613c48565b82610100018181516132999190613b50565b63ffffffff9081169091525f54845161010086015160405163b76a749160e01b81529184166004830152600360248301529092166044830152600160648301526001600160a01b0316915063b76a7491906084015f604051808303815f87803b158015613304575f80fd5b505af1158015613316573d5f803e3d5ffd5b505050506002816133279190613c48565b8260e0018181516133389190613b50565b63ffffffff9081169091525f54845160e086015160405163b76a749160e01b81529184166004830152600260248301529092166044830152600160648301526001600160a01b0316915063b76a7491906084015f604051808303815f87803b1580156133a2575f80fd5b505af11580156133b4573d5f803e3d5ffd5b505050505b5f546040517fdc354ad200000000000000000000000000000000000000000000000000000000815263ffffffff881660048201526001600160a01b039091169063dc354ad2906024015f604051808303815f87803b158015613419575f80fd5b505af115801561342b573d5f803e3d5ffd5b50505f5486516101008801516040516369d8d54960e11b815263ffffffff808c1660048301529283166024820152918616604483015260ff166064820152601f60848201526001600160a01b03909116925063d3b1aa92915060a401611cbf565b60ff8116811461349a575f80fd5b50565b6001600160a01b038116811461349a575f80fd5b5f805f606084860312156134c3575f80fd5b83356134ce8161348c565b925060208401356134de8161349d565b915060408401356134ee8161348c565b809150509250925092565b5f60208284031215613509575f80fd5b81356135148161349d565b9392505050565b5f6020828403121561352b575f80fd5b5035919050565b63ffffffff8116811461349a575f80fd5b5f805f8060808587031215613556575f80fd5b84356135618161348c565b9350602085013561357181613532565b925060408501356135818161348c565b915060608501356135918161348c565b939692955090935050565b5f805f606084860312156135ae575f80fd5b83356135b981613532565b925060208401356134de8161348c565b5f80604083850312156135da575f80fd5b82356135e581613532565b915060208301356135f58161348c565b809150509250929050565b5f60208284031215613610575f80fd5b813561351481613532565b5f806040838503121561362c575f80fd5b82356136378161349d565b946020939093013593505050565b5f8060408385031215613656575f80fd5b82356136618161349d565b915060208301356135f581613532565b602080825282518282018190525f9190848201906040850190845b818110156136b15783516001600160a01b03168352928401929184019160010161368c565b50909695505050505050565b80516136c881613532565b919050565b5f602082840312156136dd575f80fd5b815161351481613532565b634e487b7160e01b5f52604160045260245ffd5b6040516101a0810167ffffffffffffffff81118282101715613720576137206136e8565b60405290565b60405160c0810167ffffffffffffffff81118282101715613720576137206136e8565b604051610140810167ffffffffffffffff81118282101715613720576137206136e8565b604051601f8201601f1916810167ffffffffffffffff81118282101715613796576137966136e8565b604052919050565b80516136c88161349d565b80516136c88161348c565b5f6101a082840312156137c5575f80fd5b6137cd6136fc565b6137d6836136bd565b81526137e46020840161379e565b60208201526137f5604084016136bd565b6040820152613806606084016136bd565b6060820152613817608084016136bd565b608082015261382860a084016136bd565b60a082015261383960c084016136bd565b60c082015261384a60e084016136bd565b60e082015261010061385d8185016136bd565b9082015261012061386f8482016136bd565b908201526101406138818482016137a9565b908201526101606138938482016137a9565b908201526101806138a58482016136bd565b908201529392505050565b634e487b7160e01b5f52601160045260245ffd5b5f60ff821660ff81036138d9576138d96138b0565b60010192915050565b5f82601f8301126138f1575f80fd5b815167ffffffffffffffff81111561390b5761390b6136e8565b602061391f601f8301601f1916820161376d565b8281528582848701011115613932575f80fd5b5f5b8381101561394f578581018301518282018401528201613934565b505f928101909101919091529392505050565b805180151581146136c8575f80fd5b5f60208284031215613981575f80fd5b815167ffffffffffffffff80821115613998575f80fd5b9083019060c082860312156139ab575f80fd5b6139b3613726565b82516139be8161348c565b815260208301516139ce81613532565b602082015260408301516139e18161349d565b60408201526060830151828111156139f7575f80fd5b613a03878286016138e2565b606083015250613a1560808401613962565b6080820152613a2660a08401613962565b60a082015295945050505050565b63ffffffff828116828216039080821115613a5157613a516138b0565b5092915050565b8082028115828204841417613a6f57613a6f6138b0565b92915050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613a99575f80fd5b61351482613962565b80820180821115613a6f57613a6f6138b0565b5f60018201613ac657613ac66138b0565b5060010190565b5f60208284031215613add575f80fd5b81516135148161348c565b805161ffff811681146136c8575f80fd5b5f60208284031215613b09575f80fd5b61351482613ae8565b634e487b7160e01b5f52601260045260245ffd5b5f82613b3457613b34613b12565b500490565b5f60208284031215613b49575f80fd5b5051919050565b63ffffffff818116838216019080821115613a5157613a516138b0565b5f6101408284031215613b7e575f80fd5b613b86613749565b613b8f836136bd565b815260208301516020820152613ba7604084016137a9565b6040820152613bb8606084016136bd565b6060820152613bc960808401613ae8565b6080820152613bda60a084016136bd565b60a0820152613beb60c08401613962565b60c0820152613bfc60e084016136bd565b60e0820152610100613c0f8185016137a9565b908201526101206138a58482016136bd565b62ffffff818116838216028082169190828114613c4057613c406138b0565b505092915050565b5f63ffffffff80841680613c5e57613c5e613b12565b9216919091049291505056fea26469706673582212208da994c3136068de82bbce8233fedc04b967a1e18575e6ce7dba05899d2cfcf364736f6c63430008180033000000000000000000000000d38810b8f980b9d7426467bf88371bd44bae844e
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610179575f3560e01c806370480275116100d2578063b72bd4d711610088578063e90946cf11610063578063e90946cf14610329578063eb8274ef1461033e578063eda7dd9414610346575f80fd5b8063b72bd4d7146102f0578063c0a1bb9614610303578063e3bdee2a14610316575f80fd5b806373d4a13a116100b857806373d4a13a146102c2578063aac5c0c2146102d4578063b3ad8d9a146102dd575f80fd5b8063704802751461029c57806370e9d585146102af575f80fd5b80632da47a681161013257806340ef9efe1161010d57806340ef9efe14610238578063429b62e51461024b5780635e2725b81461027d575f80fd5b80632da47a68146101ff5780632e0849cc1461021257806333b64d0514610225575f80fd5b80631e8f64b6116101625780631e8f64b6146101a5578063258b9d97146101d55780632c90a8e3146101e8575f80fd5b806316cf32ca1461017d5780631785f53c14610192575b5f80fd5b61019061018b3660046134b1565b610359565b005b6101906101a03660046134f9565b61088c565b6101b86101b336600461351b565b6108db565b6040516001600160a01b0390911681526020015b60405180910390f35b6101906101e3366004613543565b610903565b6101f160075481565b6040519081526020016101cc565b61019061020d36600461351b565b6110f3565b61019061022036600461359c565b611143565b6101906102333660046135c9565b6119e1565b61019061024636600461351b565b611cf4565b61026d6102593660046134f9565b60036020525f908152604090205460ff1681565b60405190151581526020016101cc565b6101f161028b3660046134f9565b60046020525f908152604090205481565b6101906102aa3660046134f9565b611d44565b6101906102bd366004613600565b611de5565b5f546101b8906001600160a01b031681565b6101f160065481565b6101b86102eb36600461351b565b6120dc565b6101906102fe36600461361b565b6120eb565b6101906103113660046134f9565b612151565b610190610324366004613645565b612203565b61033161296a565b6040516101cc9190613671565b610331612a73565b610190610354366004613600565b612ad3565b5f8054604051632d7feef360e21b81523360048201526001600160a01b039091169063b5ffbbcc90602401602060405180830381865afa15801561039f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103c391906136cd565b5f80546040516336dbc79d60e21b815263ffffffff8416600482015292935090916001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af1158015610416573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061043a91906137b4565b5f8054604051632d7feef360e21b81526001600160a01b0388811660048301529394509192169063b5ffbbcc90602401602060405180830381865afa158015610485573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a991906136cd565b90508063ffffffff165f036105055760405162461bcd60e51b815260206004820152601160248201527f746172676574557365724964203d3d203000000000000000000000000000000060448201526064015b60405180910390fd5b81610140015160ff1660021461055d5760405162461bcd60e51b815260206004820152601660248201527f75736572206f776e20757365725479706520213d20320000000000000000000060448201526064016104fc565b8560ff166003148061057257508560ff166005145b6105be5760405162461bcd60e51b815260206004820152600e60248201527f7573657254797065206572726f7200000000000000000000000000000000000060448201526064016104fc565b5f80546040516336dbc79d60e21b815263ffffffff841660048201526001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af115801561060c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061063091906137b4565b905080610140015160ff1660011461068a5760405162461bcd60e51b815260206004820152601e60248201527f74617267657455736572206d757374207573657254797065203d3d203120000060448201526064016104fc565b5f5b8560ff168160ff161161088257604082015163ffffffff808716908216036107a6575f80546040516369d8d54960e11b815263ffffffff808a1660048301528716602482015260ff8c1660448201526064810192909252601e60848301526001600160a01b03169063d3b1aa929060a4015f604051808303815f87803b158015610714575f80fd5b505af1158015610726573d5f803e3d5ffd5b50505f805460405163b76a749160e01b815263ffffffff8916600480830191909152602482015260ff8e16604482015260648101929092526001600160a01b0316925063b76a749191506084015f604051808303815f87803b15801561078a575f80fd5b505af115801561079c573d5f803e3d5ffd5b5050505050610882565b8063ffffffff165f036107fb5760405162461bcd60e51b815260206004820152600c60248201527f63616e206e6f742066696e64000000000000000000000000000000000000000060448201526064016104fc565b5f546040516336dbc79d60e21b815263ffffffff831660048201526001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af1158015610848573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061086c91906137b4565b925050808061087a906138c4565b91505061068c565b5050505050505050565b335f9081526003602052604090205460ff166108bb57604051633646ee0560e21b815260040160405180910390fd5b6001600160a01b03165f908152600360205260409020805460ff19169055565b600281815481106108ea575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f8054604051632d7feef360e21b81523360048201526001600160a01b039091169063b5ffbbcc90602401602060405180830381865afa158015610949573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061096d91906136cd565b5f80546040516336dbc79d60e21b815263ffffffff8416600482015292935090916001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af11580156109c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e491906137b4565b90508163ffffffff165f03610a3b5760405162461bcd60e51b815260206004820152600f60248201527f55736572206e6f7420657869737473000000000000000000000000000000000060448201526064016104fc565b5f8054906101000a90046001600160a01b03166001600160a01b031663e3be09b46040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a89573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aad91906136cd565b63ffffffff168563ffffffff161015610b085760405162461bcd60e51b815260206004820152601060248201527f416d6f756e7420746f6f20736d616c6c0000000000000000000000000000000060448201526064016104fc565b8260ff16600203610b5b5760405162461bcd60e51b815260206004820152600b60248201527f54797065206572723a203200000000000000000000000000000000000000000060448201526064016104fc565b5f5460405162415c3360e91b815260ff881660048201526001600160a01b03909116906382b86600906024015f604051808303815f875af1158015610ba2573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610bc99190810190613971565b60800151610c095760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b60448201526064016104fc565b6101008101515f9063ffffffff1615610cd75781610100015163ffffffff168663ffffffff1611610c3a5785610c41565b8161010001515b9050808261010001818151610c569190613a34565b63ffffffff9081169091525f805461010086015160405163b76a749160e01b81528885166004820152600360248201529316604484015260648301919091526001600160a01b0316915063b76a7491906084015f604051808303815f87803b158015610cc0575f80fd5b505af1158015610cd2573d5f803e3d5ffd5b505050505b5f610ce28288613a34565b90505f63ffffffff821615610f3a575f805460405162415c3360e91b815260ff8c1660048201526001600160a01b03909116906382b86600906024015f604051808303815f875af1158015610d39573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610d609190810190613971565b6040015190506001600160a01b03811673fd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb914610dbf5760405162461bcd60e51b815260206004820152600a602482015269195c9c9bdc881554d11560b21b60448201526064016104fc565b610dd063ffffffff84166064613a58565b91505f600560065481548110610de857610de8613a75565b5f9182526020822001546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b0391821660248201819052604482018790529350908416906323b872dd906064016020604051808303815f875af1158015610e62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e869190613a89565b905080610ed55760405162461bcd60e51b815260206004820152600f60248201527f5472616e73666572206661696c6564000000000000000000000000000000000060448201526064016104fc565b6001600160a01b0382165f9081526004602052604081208054869290610efc908490613aa2565b90915550506007546001600160a01b0383165f9081526004602052604090205410610f365760068054905f610f3083613ab5565b91905055505b5050505b5f546040517f89807d8d00000000000000000000000000000000000000000000000000000000815263ffffffff80881660048301526024820184905260ff808d166044840152908b166064830152808a166084830152881660a48201526001600160a01b03909116906389807d8d9060c4016020604051808303815f875af1158015610fc8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fec91906136cd565b505f54604051637172ca6160e11b815263ffffffff8716600482015260ff8916916001600160a01b03169063e2e594c290602401602060405180830381865afa15801561103b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061105f9190613acd565b60ff1610156110e8575f546040517f9deb8cd100000000000000000000000000000000000000000000000000000000815263ffffffff8716600482015260ff891660248201526001600160a01b0390911690639deb8cd1906044015f604051808303815f87803b1580156110d1575f80fd5b505af11580156110e3573d5f803e3d5ffd5b505050505b505050505050505050565b335f9081526003602052604090205460ff1661113e5760405162461bcd60e51b815260206004820152600a60248201526936bab9ba1030b236b4b760b11b60448201526064016104fc565b600755565b5f8054604051632d7feef360e21b81523360048201526001600160a01b039091169063b5ffbbcc90602401602060405180830381865afa158015611189573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111ad91906136cd565b90508063ffffffff165f036112045760405162461bcd60e51b815260206004820152600f60248201527f55736572206e6f7420657869737473000000000000000000000000000000000060448201526064016104fc565b8160ff166001148061121957508160ff166002145b6112655760405162461bcd60e51b815260206004820152600c60248201527f496e76616c69642074797065000000000000000000000000000000000000000060448201526064016104fc565b5f805460405162415c3360e91b815260ff861660048201526001600160a01b03909116906382b86600906024015f604051808303815f875af11580156112ad573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526112d49190810190613971565b60408101519091506001600160a01b0316158015906112f457508060a001515b6113305760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b60448201526064016104fc565b60408101516001600160a01b03811673fd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb91461138e5760405162461bcd60e51b815260206004820152600a602482015269195c9c9bdc881554d11560b21b60448201526064016104fc565b5f805f9054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113de573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140291906136cd565b63ffffffff165f8054906101000a90046001600160a01b03166001600160a01b031663431fbc686040518163ffffffff1660e01b8152600401602060405180830381865afa158015611456573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061147a9190613af9565b61148e9061ffff1663ffffffff8a16613a58565b6114989190613b26565b6114a3906064613a58565b6040516370a0823160e01b815230600482015290915081906001600160a01b038416906370a0823190602401602060405180830381865afa1580156114ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061150e9190613b39565b101561155c5760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742062616c616e636500000000000000000000000060448201526064016104fc565b5f80546040516336dbc79d60e21b815263ffffffff871660048201526001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af11580156115aa573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115ce91906137b4565b905080610160015160ff166002141580156115f2575080610160015160ff16600314155b61163e5760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642075736572207374617475730000000000000000000000000060448201526064016104fc565b8560ff166001036117e2578763ffffffff168160c001518260a001516116649190613a34565b63ffffffff1610156116b85760405162461bcd60e51b815260206004820152601560248201527f496e73756666696369656e74206561726e696e6773000000000000000000000060448201526064016104fc565b878160c0018181516116ca9190613b50565b63ffffffff9081169091525f8054845160c086015160405163b76a749160e01b8152918516600483015260066024830152909316604484015260648301919091526001600160a01b0316915063b76a7491906084015f604051808303815f87803b158015611736575f80fd5b505af1158015611748573d5f803e3d5ffd5b50505f80546001600160a01b0316925063d3b1aa92915087908b61176d606488613b26565b6040516001600160e01b031960e087901b16815263ffffffff9485166004820152928416602484015290831660448301529091166064820152601c608482015260a4015f604051808303815f87803b1580156117c7575f80fd5b505af11580156117d9573d5f803e3d5ffd5b5050505061196b565b8763ffffffff1681610100015163ffffffff1610156118435760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e74207072696e636970616c0000000000000000000060448201526064016104fc565b8781610100018181516118569190613a34565b63ffffffff9081169091525f8054845161010086015160405163b76a749160e01b8152918516600483015260036024830152909316604484015260648301919091526001600160a01b0316915063b76a7491906084015f604051808303815f87803b1580156118c3575f80fd5b505af11580156118d5573d5f803e3d5ffd5b50505f80546001600160a01b0316925063d3b1aa92915087908b6118fa606488613b26565b6040516001600160e01b031960e087901b16815263ffffffff9485166004820152928416602484015290831660448301529091166064820152601d608482015260a4015f604051808303815f87803b158015611954575f80fd5b505af1158015611966573d5f803e3d5ffd5b505050505b602081015160405163a9059cbb60e01b81526001600160a01b039182166004820152602481018490529084169063a9059cbb906044016020604051808303815f875af11580156119bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110e89190613a89565b335f9081526003602052604090205460ff16611a1057604051633646ee0560e21b815260040160405180910390fd5b5f805460405162415c3360e91b815260ff841660048201526001600160a01b03909116906382b86600906024015f604051808303815f875af1158015611a58573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052611a7f9190810190613971565b60408101519091506001600160a01b0316611acc5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b60448201526064016104fc565b60408181015190516370a0823160e01b815230600482015263ffffffff85169081906001600160a01b038416906370a0823190602401602060405180830381865afa158015611b1d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b419190613b39565b1015611b8f5760405162461bcd60e51b815260206004820152601460248201527f496e73756666696369656e742062616c616e636500000000000000000000000060448201526064016104fc565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015611bd9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611bfd9190613a89565b505f611c0a606483613b26565b5f54604051632d7feef360e21b81523360048201529192506001600160a01b03169063d3b1aa9290829063b5ffbbcc90602401602060405180830381865afa158015611c58573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c7c91906136cd565b6040516001600160e01b031960e084901b16815263ffffffff918216600482015260ff891660248201525f604482015290841660648201526011608482015260a4015b5f604051808303815f87803b158015611cd6575f80fd5b505af1158015611ce8573d5f803e3d5ffd5b50505050505050505050565b335f9081526003602052604090205460ff16611d3f5760405162461bcd60e51b815260206004820152600a60248201526936bab9ba1030b236b4b760b11b60448201526064016104fc565b600655565b335f9081526003602052604090205460ff16611d7357604051633646ee0560e21b815260040160405180910390fd5b6001600160a01b03165f818152600360205260408120805460ff191660019081179091556002805491820181559091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace01805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b5f8054604051632d7feef360e21b81523360048201526001600160a01b039091169063b5ffbbcc90602401602060405180830381865afa158015611e2b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e4f91906136cd565b5f80546040516336dbc79d60e21b815263ffffffff8416600482015292935090916001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af1158015611ea2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ec691906137b4565b905063ffffffff821615801590611efc57508263ffffffff168160c001518260a00151611ef39190613a34565b63ffffffff1610155b611f375760405162461bcd60e51b815260206004820152600c60248201526b125b9cdd59999a58da595b9d60a21b60448201526064016104fc565b828160c001818151611f499190613b50565b63ffffffff9081169091525f8054845160c086015160405163b76a749160e01b8152918516600483015260066024830152909316604484015260648301919091526001600160a01b0316915063b76a7491906084015f604051808303815f87803b158015611fb5575f80fd5b505af1158015611fc7573d5f803e3d5ffd5b50505f8054604051637172ca6160e11b815263ffffffff871660048201526001600160a01b0390911693506389807d8d925085919081908890869063e2e594c290602401602060405180830381865afa158015612026573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061204a9190613acd565b6040516001600160e01b031960e088901b16815263ffffffff9586166004820152602481019490945260ff9283166044850152931660648301529091166084820152600260a482015260c4016020604051808303815f875af11580156120b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120d691906136cd565b50505050565b600581815481106108ea575f80fd5b335f9081526003602052604090205460ff166121365760405162461bcd60e51b815260206004820152600a60248201526936bab9ba1030b236b4b760b11b60448201526064016104fc565b6001600160a01b039091165f90815260046020526040902055565b335f9081526003602052604090205460ff1661219c5760405162461bcd60e51b815260206004820152600a60248201526936bab9ba1030b236b4b760b11b60448201526064016104fc565b6001600160a01b03165f8181526004602052604081208190556005805460018101825591527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db001805473ffffffffffffffffffffffffffffffffffffffff19169091179055565b5f8054604051632d7feef360e21b81523360048201526001600160a01b039091169063b5ffbbcc90602401602060405180830381865afa158015612249573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061226d91906136cd565b90508063ffffffff165f036122c45760405162461bcd60e51b815260206004820152600e60248201527f496e76616c69642073656e64657200000000000000000000000000000000000060448201526064016104fc565b5f8054604051632d7feef360e21b81526001600160a01b0386811660048301529091169063b5ffbbcc90602401602060405180830381865afa15801561230c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061233091906136cd565b90508063ffffffff165f036123875760405162461bcd60e51b815260206004820152601060248201527f496e76616c69642072656365697665720000000000000000000000000000000060448201526064016104fc565b5f80546040516336dbc79d60e21b815263ffffffff851660048201526001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af11580156123d5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123f991906137b4565b905080610160015160ff1660021415801561241d575080610160015160ff16600314155b6124695760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642075736572207374617475730000000000000000000000000060448201526064016104fc565b5f8161010001518260c001518360a001516124849190613a34565b61248e9190613b50565b90508463ffffffff168163ffffffff1610156124db5760405162461bcd60e51b815260206004820152600c60248201526b125b9cdd59999a58da595b9d60a21b60448201526064016104fc565b8160c001518260a001516124ef9190613a34565b63ffffffff168563ffffffff161115612640575f8260c001518360a001516125179190613a34565b6125219087613a34565b90508083610100018181516125369190613a34565b63ffffffff9081169091525f8054865161010088015160405163b76a749160e01b8152918516600483015260036024830152909316604484015260648301919091526001600160a01b0316915063b76a7491906084015f604051808303815f87803b1580156125a3575f80fd5b505af11580156125b5573d5f803e3d5ffd5b5050505060a083015163ffffffff90811660c085018190525f8054865160405163b76a749160e01b81529416600485015260066024850152604484019290925260648301526001600160a01b03169063b76a7491906084015f604051808303815f87803b158015612624575f80fd5b505af1158015612636573d5f803e3d5ffd5b50505050506126d5565b848260c0018181516126529190613b50565b63ffffffff9081169091525f8054855160c087015160405163b76a749160e01b8152918516600483015260066024830152909316604484015260648301919091526001600160a01b0316915063b76a7491906084015f604051808303815f87803b1580156126be575f80fd5b505af11580156126d0573d5f803e3d5ffd5b505050505b5f80546040516336dbc79d60e21b815263ffffffff861660048201526001600160a01b039091169063db6f1e74906024016101a0604051808303815f875af1158015612723573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061274791906137b4565b90505f8054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b8152600401602060405180830381865afa158015612797573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127bb91906136cd565b63ffffffff165f8054906101000a90046001600160a01b03166001600160a01b03166341df0ab86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561280f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128339190613af9565b6128479061ffff1663ffffffff8916613a58565b6128519190613b26565b81610100018181516128639190613b50565b63ffffffff9081169091525f8054845161010086015160405163b76a749160e01b8152918516600483015260036024830152909316604484015260648301919091526001600160a01b0316915063b76a7491906084015f604051808303815f87803b1580156128d0575f80fd5b505af11580156128e2573d5f803e3d5ffd5b50505f80546040516369d8d54960e11b815263ffffffff808b166004830152808a1660248301528b1660448201526064810192909252601060848301526001600160a01b0316925063d3b1aa92915060a4015f604051808303815f87803b15801561294b575f80fd5b505af115801561295d573d5f803e3d5ffd5b5050505050505050505050565b6002546060905f8167ffffffffffffffff81111561298a5761298a6136e8565b6040519080825280602002602001820160405280156129b3578160200160208202803683370190505b5090505f805b83811015612a6a5760035f600283815481106129d7576129d7613a75565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205460ff1615612a625760028181548110612a1657612a16613a75565b905f5260205f20015f9054906101000a90046001600160a01b0316838381518110612a4357612a43613a75565b6001600160a01b03909216602092830291909101909101526001909101905b6001016129b9565b50909392505050565b60606005805480602002602001604051908101604052809291908181526020018280548015612ac957602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311612aab575b5050505050905090565b5f8054604051632d7feef360e21b81523360048201526001600160a01b039091169063b5ffbbcc90602401602060405180830381865afa158015612b19573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b3d91906136cd565b5f80546040517f899452e500000000000000000000000000000000000000000000000000000000815263ffffffff8616600482015292935090916001600160a01b039091169063899452e590602401610140604051808303815f875af1158015612ba9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612bcd9190613b6d565b905063ffffffff821615801590612bea5750805163ffffffff1615155b8015612bff575061012081015163ffffffff16155b8015612c1a57508163ffffffff168160e0015163ffffffff16145b612c665760405162461bcd60e51b815260206004820152600d60248201527f496e76616c6964206f726465720000000000000000000000000000000000000060448201526064016104fc565b60e0810151610100820151909250429060ff16600103612db4578063ffffffff16826080015161ffff1662015180612c9e9190613c21565b62ffffff168360a00151612cb29190613b50565b63ffffffff1610612cf25760405162461bcd60e51b815260206004820152600a6024820152693a34b6b29032b93937b960b11b60448201526064016104fc565b816080015161ffff16605a03612db4575f8054906101000a90046001600160a01b03166001600160a01b031663ccb01b106040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d50573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d749190613af9565b61ffff16600103612db45760405162461bcd60e51b815260206004820152600a6024820152693a34b6b29032b93937b960b11b60448201526064016104fc565b63ffffffff81811661012084018190525f54845160e0860151602087015160408089015160608a015160808b01516101008c015160c08d015194517f2bf4755a000000000000000000000000000000000000000000000000000000008152978b166004890152958a166024880152604487019490945260ff9182166064870152909716608485015290861660a4840152941660c482015260e48101929092529115156101048201526001600160a01b0390911690632bf4755a90610124015f604051808303815f87803b158015612e89575f80fd5b505af1158015612e9b573d5f803e3d5ffd5b50505f80546040516336dbc79d60e21b815263ffffffff881660048201529193506001600160a01b0316915063db6f1e74906024016101a0604051808303815f875af1158015612eed573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f1191906137b4565b60608401516101008501519192509060ff166001036131c557836080015161ffff16605a03612f825760405162461bcd60e51b815260206004820152601760248201527f706572696f642063616e206e6f7420576974686472617700000000000000000060448201526064016104fc565b5f805f9054906101000a90046001600160a01b03166001600160a01b031663aaf5eb686040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fd2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ff691906136cd565b63ffffffff165f8054906101000a90046001600160a01b03166001600160a01b0316634b3267516040518163ffffffff1660e01b8152600401602060405180830381865afa15801561304a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061306e9190613af9565b6130829061ffff1663ffffffff8516613a58565b61308c9190613b26565b9050808360e0018181516130a09190613b50565b63ffffffff9081169091525f54855160e087015160405163b76a749160e01b81529184166004830152600260248301529092166044830152600160648301526001600160a01b0316915063b76a7491906084015f604051808303815f87803b15801561310a575f80fd5b505af115801561311c573d5f803e3d5ffd5b50505050808261312c9190613a34565b836101000181815161313e9190613b50565b63ffffffff9081169091525f54855161010087015160405163b76a749160e01b81529184166004830152600360248301529092166044830152600160648301526001600160a01b0316915063b76a7491906084015f604051808303815f87803b1580156131a9575f80fd5b505af11580156131bb573d5f803e3d5ffd5b50505050506133b9565b83610100015160ff1660020361326c57808260e0018181516131e79190613b50565b63ffffffff9081169091525f54845160e086015160405163b76a749160e01b81529184166004830152600260248301529092166044830152600160648301526001600160a01b0316915063b76a7491906084015f604051808303815f87803b158015613251575f80fd5b505af1158015613263573d5f803e3d5ffd5b505050506133b9565b83610100015160ff166003036133b957613287600282613c48565b82610100018181516132999190613b50565b63ffffffff9081169091525f54845161010086015160405163b76a749160e01b81529184166004830152600360248301529092166044830152600160648301526001600160a01b0316915063b76a7491906084015f604051808303815f87803b158015613304575f80fd5b505af1158015613316573d5f803e3d5ffd5b505050506002816133279190613c48565b8260e0018181516133389190613b50565b63ffffffff9081169091525f54845160e086015160405163b76a749160e01b81529184166004830152600260248301529092166044830152600160648301526001600160a01b0316915063b76a7491906084015f604051808303815f87803b1580156133a2575f80fd5b505af11580156133b4573d5f803e3d5ffd5b505050505b5f546040517fdc354ad200000000000000000000000000000000000000000000000000000000815263ffffffff881660048201526001600160a01b039091169063dc354ad2906024015f604051808303815f87803b158015613419575f80fd5b505af115801561342b573d5f803e3d5ffd5b50505f5486516101008801516040516369d8d54960e11b815263ffffffff808c1660048301529283166024820152918616604483015260ff166064820152601f60848201526001600160a01b03909116925063d3b1aa92915060a401611cbf565b60ff8116811461349a575f80fd5b50565b6001600160a01b038116811461349a575f80fd5b5f805f606084860312156134c3575f80fd5b83356134ce8161348c565b925060208401356134de8161349d565b915060408401356134ee8161348c565b809150509250925092565b5f60208284031215613509575f80fd5b81356135148161349d565b9392505050565b5f6020828403121561352b575f80fd5b5035919050565b63ffffffff8116811461349a575f80fd5b5f805f8060808587031215613556575f80fd5b84356135618161348c565b9350602085013561357181613532565b925060408501356135818161348c565b915060608501356135918161348c565b939692955090935050565b5f805f606084860312156135ae575f80fd5b83356135b981613532565b925060208401356134de8161348c565b5f80604083850312156135da575f80fd5b82356135e581613532565b915060208301356135f58161348c565b809150509250929050565b5f60208284031215613610575f80fd5b813561351481613532565b5f806040838503121561362c575f80fd5b82356136378161349d565b946020939093013593505050565b5f8060408385031215613656575f80fd5b82356136618161349d565b915060208301356135f581613532565b602080825282518282018190525f9190848201906040850190845b818110156136b15783516001600160a01b03168352928401929184019160010161368c565b50909695505050505050565b80516136c881613532565b919050565b5f602082840312156136dd575f80fd5b815161351481613532565b634e487b7160e01b5f52604160045260245ffd5b6040516101a0810167ffffffffffffffff81118282101715613720576137206136e8565b60405290565b60405160c0810167ffffffffffffffff81118282101715613720576137206136e8565b604051610140810167ffffffffffffffff81118282101715613720576137206136e8565b604051601f8201601f1916810167ffffffffffffffff81118282101715613796576137966136e8565b604052919050565b80516136c88161349d565b80516136c88161348c565b5f6101a082840312156137c5575f80fd5b6137cd6136fc565b6137d6836136bd565b81526137e46020840161379e565b60208201526137f5604084016136bd565b6040820152613806606084016136bd565b6060820152613817608084016136bd565b608082015261382860a084016136bd565b60a082015261383960c084016136bd565b60c082015261384a60e084016136bd565b60e082015261010061385d8185016136bd565b9082015261012061386f8482016136bd565b908201526101406138818482016137a9565b908201526101606138938482016137a9565b908201526101806138a58482016136bd565b908201529392505050565b634e487b7160e01b5f52601160045260245ffd5b5f60ff821660ff81036138d9576138d96138b0565b60010192915050565b5f82601f8301126138f1575f80fd5b815167ffffffffffffffff81111561390b5761390b6136e8565b602061391f601f8301601f1916820161376d565b8281528582848701011115613932575f80fd5b5f5b8381101561394f578581018301518282018401528201613934565b505f928101909101919091529392505050565b805180151581146136c8575f80fd5b5f60208284031215613981575f80fd5b815167ffffffffffffffff80821115613998575f80fd5b9083019060c082860312156139ab575f80fd5b6139b3613726565b82516139be8161348c565b815260208301516139ce81613532565b602082015260408301516139e18161349d565b60408201526060830151828111156139f7575f80fd5b613a03878286016138e2565b606083015250613a1560808401613962565b6080820152613a2660a08401613962565b60a082015295945050505050565b63ffffffff828116828216039080821115613a5157613a516138b0565b5092915050565b8082028115828204841417613a6f57613a6f6138b0565b92915050565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215613a99575f80fd5b61351482613962565b80820180821115613a6f57613a6f6138b0565b5f60018201613ac657613ac66138b0565b5060010190565b5f60208284031215613add575f80fd5b81516135148161348c565b805161ffff811681146136c8575f80fd5b5f60208284031215613b09575f80fd5b61351482613ae8565b634e487b7160e01b5f52601260045260245ffd5b5f82613b3457613b34613b12565b500490565b5f60208284031215613b49575f80fd5b5051919050565b63ffffffff818116838216019080821115613a5157613a516138b0565b5f6101408284031215613b7e575f80fd5b613b86613749565b613b8f836136bd565b815260208301516020820152613ba7604084016137a9565b6040820152613bb8606084016136bd565b6060820152613bc960808401613ae8565b6080820152613bda60a084016136bd565b60a0820152613beb60c08401613962565b60c0820152613bfc60e084016136bd565b60e0820152610100613c0f8185016137a9565b908201526101206138a58482016136bd565b62ffffff818116838216028082169190828114613c4057613c406138b0565b505092915050565b5f63ffffffff80841680613c5e57613c5e613b12565b9216919091049291505056fea26469706673582212208da994c3136068de82bbce8233fedc04b967a1e18575e6ce7dba05899d2cfcf364736f6c63430008180033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.