Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers.
Latest 6 internal transactions
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
MultiSigColdStd
Compiler Version
v0.8.12+commit.f00d7308
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
import "./interfaces/IMultiSigCold.sol";
import "./interfaces/IERC20Minimal.sol";
import "./interfaces/IMultiSigAgent.sol";
import "./interfaces/IAsset.sol";
import "./interfaces/IAggregatedHelper.sol";
import "./interfaces/IPayPool.sol";
import "./MultiSig.sol";
contract MultiSigColdStd is IMultiSigCold,MultiSig{
IPayPool public payPool;
constructor() {
}
/// @dev 资金平衡间隔时间
uint public lastBalancedTime;
/// 商户配置
Merchant public merchant;
/// 项目多签地址
IMultiSigUtc public multiSigUtc;
uint public ownerStatus;
address private _owner;
address public emergencyWithdrawAddr;
//平衡最大数量
mapping(address => uint256) public hotCoinMaxNum;
error OwnableUnauthorizedAccount(address account);
receive() external payable {
}
fallback() external payable {
}
function initOwner() external{
require(ownerStatus!=10,"only init once");
address payPoolImpl;
address impl=0x58833317b38D33F6f27Dd56F4C132e42ac14d82B;
//keccak256(abi.encodePacked("SPayPoolFactory"));
bytes32 salt=0x21622f2554745826ee3002d92aa2b5bc3f03d524d519610ce5d6c103f4a8064e;
assembly {
mstore(0x00, or(shr(0xe8, shl(0x60, impl)), 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000))
mstore(0x20, or(shl(0x78, impl), 0x5af43d82803e903d91602b57fd5bf3))
payPoolImpl := create2(0, 0x09, 0x37, salt)
}
payPool=IPayPool(payPoolImpl);
payPool.initOwner();
ownerStatus=10;
_owner = msg.sender;
}
modifier onlyOwner() {
if (owner() !=msg.sender) {
revert OwnableUnauthorizedAccount(msg.sender);
}
_;
}
function owner() public view returns (address) {
return _owner;
}
/// @dev 初始化冷合约多签管理员列表
/// @param data 商户配置
/// @param _multiSigUtc utc多签地址
/// @param ratio 多签通过比例
/// @param _managers 多签管理员
function initManagers(Merchant memory data,IMultiSigUtc _multiSigUtc,uint ratio,uint expirationTime,address[] memory _managers) external onlyOwner{
require(status!=10,"only init once");
require(ratio >= 60 && ratio <= 100);
status=10;
multiSigUtc=_multiSigUtc;
uint length=_managers.length;
require(length>=3,"Manager cannot be less than three");
for (uint i=1;i<length;++i) {
require(_managers[i] > _managers[i-1]);
}
managerInfo=ManagerInfo(getManagerNumber(length,ratio,1e2),expirationTime,_managers);
merchant = data;
_ratio=ratio;
}
/// @dev 获取商户代理配置
function getMerAgentConfigData() external view returns (uint256 primAgentProfitPerc,uint256 feeRate,address multiSigAgentAddr,address feeAddr){
Merchant memory _merchant=merchant;
return (
_merchant.primAgentProfitPerc,
_merchant.feeRate,
_merchant.multiSigAgentAddr,
multiSigUtc.getUtcFeeAddr()
);
}
/// @dev 费用计算
function _calculateCommission(uint256 _amount,address primAgentFeeAddr,Merchant memory _merchant) internal pure returns (
uint256 totalCommission,
uint256 primCommission,
uint256 web3PayCommission,
uint256 transBalHot
) {
totalCommission = (_amount * _merchant.feeRate) / 1e4;
primCommission = primAgentFeeAddr != address(0)?(totalCommission * _merchant.primAgentProfitPerc) / 1e2:0;
web3PayCommission = totalCommission - primCommission;
transBalHot = _amount - totalCommission;
}
/// @dev 资金平衡
function balFundsToHot(address[] memory erc20s) external nonReentrant {
Merchant memory _merchant=merchant;
require(block.timestamp - lastBalancedTime>_merchant.balancedTime, "Balance funds interval time limit");
lastBalancedTime=block.timestamp;
bytes memory ethTransactions;
uint hotBalance=_merchant.hotPool.balance;
uint coldBalance=_merchant.coldPool.balance;
uint amount=getHotBalanceFunds(hotBalance,coldBalance,hotCoinMaxNum[address(0)]);
uint256 totalCommission;
uint256 primCommission;
uint256 web3PayCommission;
uint256 transBalHot;
address primAgentFeeAddr = address(0);
if(_merchant.multiSigAgentAddr!=address(0)){
primAgentFeeAddr=IMultiSigAgent(_merchant.multiSigAgentAddr).getPrimAgentFeeAddr();
}
address utcFeeAddr=multiSigUtc.getUtcFeeAddr();
/// Tokens are transferred to the hot contract
if(amount > 0){
(totalCommission,primCommission,web3PayCommission,transBalHot) = _calculateCommission(amount,primAgentFeeAddr,_merchant);
ethTransactions=abi.encodePacked(ethTransactions,_merchant.hotPool,transBalHot);
ethTransactions=abi.encodePacked(ethTransactions,utcFeeAddr,web3PayCommission);
if(primAgentFeeAddr!= address(0)){
ethTransactions=abi.encodePacked(ethTransactions,primAgentFeeAddr,primCommission);
}
emit TransferCommissionLogs(address(0), totalCommission, primCommission, web3PayCommission, transBalHot);
IAsset(_merchant.coldPool).sendEths(ethTransactions);
}
bytes memory erc20Transactions;
for(uint i; i<erc20s.length; ++i) {
hotBalance = _balance(erc20s[i],_merchant.hotPool);
coldBalance=_balance(erc20s[i],_merchant.coldPool);
{
address erc20 = erc20s[i];
/// Calculate the balance that needs to be transferred to the hot contract
amount = getHotBalanceFunds(hotBalance,coldBalance, hotCoinMaxNum[erc20]);
}
/// Tokens are transferred to the merchant hot contract
if(amount > 0){
/// commission amount
(totalCommission,primCommission,web3PayCommission,transBalHot) = _calculateCommission(amount,primAgentFeeAddr,_merchant);
/// The balance funds transferred to the hot contract, after deducting the funds after continuing to pay
erc20Transactions=abi.encodePacked(
erc20Transactions,erc20s[i],abi.encodeWithSelector(0xa9059cbb, _merchant.hotPool,transBalHot)
);
/// transfer fee
erc20Transactions=abi.encodePacked(
erc20Transactions,erc20s[i],abi.encodeWithSelector(0xa9059cbb, utcFeeAddr,web3PayCommission)
);
if(primAgentFeeAddr!= address(0)){
erc20Transactions=abi.encodePacked(
erc20Transactions,erc20s[i],abi.encodeWithSelector(0xa9059cbb, primAgentFeeAddr,primCommission)
);
}
emit TransferCommissionLogs(erc20s[i], totalCommission, primCommission, web3PayCommission, transBalHot);
}
}
if(erc20Transactions.length > 0){
IAsset(_merchant.coldPool).sendErc20(erc20Transactions);
}
}
function _balance(address _token,address holder) internal view returns (uint256) {
(bool success, bytes memory data) = _token.staticcall(
abi.encodeWithSelector(IERC20Minimal.balanceOf.selector, holder)
);
require(success && data.length >= 32);
return abi.decode(data, (uint256));
}
/// @dev 资金占比计算
function getHotBalanceFunds(uint256 hotErc20BalanceOf,uint256 coldErc20BalanceOf,uint256 hotCoinMaxBal) internal pure returns(uint256 hotTransferErc20BalanceOf) {
assembly {
hotTransferErc20BalanceOf := 0
if gt (hotCoinMaxBal,hotErc20BalanceOf){
hotTransferErc20BalanceOf := sub(hotCoinMaxBal,hotErc20BalanceOf)
}
if gt (hotTransferErc20BalanceOf, 0) {
if gt (hotTransferErc20BalanceOf,coldErc20BalanceOf) {
hotTransferErc20BalanceOf := coldErc20BalanceOf
}
}
}
}
function _transfer(address token,address to,uint256 amount) internal {
if(token==address(0)){
IAsset(merchant.coldPool).sendEths(abi.encodePacked(
to,amount
));
}else{
IAsset(merchant.coldPool).sendErc20(abi.encodePacked(
token,abi.encodeWithSelector(0xa9059cbb, to,amount)
));
}
}
function getColdPool() external view returns(address) {
return merchant.coldPool;
}
function depositByAave(address token,uint256 assets) external{
address[] memory managers=managerInfo.managers;
uint mlength=managers.length;
address currentOwner=msg.sender;
for (uint i;i<mlength;++i) {
if(currentOwner==managers[i]){
_transfer(token,address(payPool),assets);
payPool.depositByAave(token);
return;
}
}
}
function depositByLido(address token,uint256 assets) external{
address[] memory managers=managerInfo.managers;
uint mlength=managers.length;
address currentOwner=msg.sender;
for (uint i;i<mlength;++i) {
if(currentOwner==managers[i]){
_transfer(token,address(payPool),assets);
payPool.depositByLido(token);
return;
}
}
}
function depositByEthenaStakeUsde(uint assets) external{
address[] memory managers=managerInfo.managers;
uint mlength=managers.length;
address currentOwner=msg.sender;
for (uint i;i<mlength;++i) {
if(currentOwner==managers[i]){
_transfer(payPool.usdeToken(),address(payPool),assets);
payPool.depositByEthenaStakeUsde();
return;
}
}
}
function withdrawByAave(address token,uint256 assets) external{
address[] memory managers=managerInfo.managers;
uint mlength=managers.length;
address currentOwner=msg.sender;
for (uint i;i<mlength;++i) {
if(currentOwner==managers[i]){
payPool.withdrawByAave(token,assets);
return;
}
}
}
// 请求提现
function lidoRequestWithdrawals(address token,uint256[] calldata _amounts)external returns (uint256[] memory requestIds){
address[] memory managers=managerInfo.managers;
uint mlength=managers.length;
address currentOwner=msg.sender;
for (uint i;i<mlength;++i) {
if(currentOwner==managers[i]){
return payPool.lidoRequestWithdrawals(token,_amounts);
}
}
}
function withdrawByLido(uint256[] memory requestIds,address token,uint assets) external{
address[] memory managers=managerInfo.managers;
uint mlength=managers.length;
address currentOwner=msg.sender;
for (uint i;i<mlength;++i) {
if(currentOwner==managers[i]){
payPool.withdrawByLido(requestIds,token,assets);
return;
}
}
}
function cooldownSharesForEthenaStake() external {
address[] memory managers=managerInfo.managers;
uint mlength=managers.length;
address currentOwner=msg.sender;
for (uint i;i<mlength;++i) {
if(currentOwner==managers[i]){
payPool.cooldownSharesForEthenaStake();
return;
}
}
}
function withdrawByEthenaStakeUsde(uint assets) external{
address[] memory managers=managerInfo.managers;
uint mlength=managers.length;
address currentOwner=msg.sender;
for (uint i;i<mlength;++i) {
if(currentOwner==managers[i]){
payPool.withdrawByEthenaStakeUsde(assets);
return;
}
}
}
function setHotCoinMaxRatio(uint hotCoinMaxRatio,bytes memory signatures) external {
require(hotCoinMaxRatio<=100);
ManagerInfo memory _managerInfo=managerInfo;
uint managerNumber= _managerInfo.managerNumber;
uint expirationTime= block.timestamp-_managerInfo.expirationTime;
address[] memory managers=_managerInfo.managers;
bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setHotCoinMaxRatio.selector, hotCoinMaxRatio,new bytes(0)));
address lastOwner = address(0);
address currentOwner;
uint t;uint8 j;uint8 v;bytes32 r;bytes32 s;
for (uint i;i<managerNumber;++i) {
(t,j,v, r, s) = signatureSplit(signatures, i);
require(t > expirationTime);
currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
require(currentOwner > lastOwner);
require(currentOwner==managers[j]);
lastOwner = currentOwner;
}
merchant.hotCoinMaxRatio = hotCoinMaxRatio;
}
function setBalancedTime(uint balancedTime,bytes memory signatures) external {
ManagerInfo memory _managerInfo=managerInfo;
uint managerNumber= _managerInfo.managerNumber;
uint expirationTime= block.timestamp-_managerInfo.expirationTime;
address[] memory managers=_managerInfo.managers;
bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setBalancedTime.selector, balancedTime,new bytes(0)));
address lastOwner = address(0);
address currentOwner;
uint t;uint8 j;uint8 v;bytes32 r;bytes32 s;
for (uint i;i<managerNumber;++i) {
(t,j,v, r, s) = signatureSplit(signatures, i);
require(t > expirationTime);
currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
require(currentOwner > lastOwner);
require(currentOwner==managers[j]);
lastOwner = currentOwner;
}
merchant.balancedTime = balancedTime;
}
// @dev 修改hotpool地址
function setHotPool(address payable hotPool,bytes memory signatures) external {
ManagerInfo memory _managerInfo=managerInfo;
uint managerNumber= _managerInfo.managerNumber;
uint expirationTime= block.timestamp-_managerInfo.expirationTime;
address[] memory managers=_managerInfo.managers;
bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setHotPool.selector, hotPool,new bytes(0)));
address lastOwner = address(0);
address currentOwner;
uint t;uint8 j;uint8 v;bytes32 r;bytes32 s;
for (uint i;i<managerNumber;++i) {
(t,j,v, r, s) = signatureSplit(signatures, i);
require(t > expirationTime);
currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
require(currentOwner > lastOwner);
require(currentOwner==managers[j]);
lastOwner = currentOwner;
}
merchant.hotPool = hotPool;
}
// @dev
function setHotCoinMaxNum(address erc20,uint256 maxNum,bytes memory signatures) external {
ManagerInfo memory _managerInfo=managerInfo;
uint managerNumber= _managerInfo.managerNumber;
uint expirationTime= block.timestamp-_managerInfo.expirationTime;
address[] memory managers=_managerInfo.managers;
bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setHotCoinMaxNum.selector, erc20, maxNum,new bytes(0)));
address lastOwner = address(0);
address currentOwner;
//uint t;uint8 j;uint8 v;bytes32 r;bytes32 s;
for (uint i;i<managerNumber;++i) {
(uint t,uint8 j,uint8 v,bytes32 r,bytes32 s) = signatureSplit(signatures, i);
require(t > expirationTime);
currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
require(currentOwner > lastOwner);
require(currentOwner==managers[j]);
lastOwner = currentOwner;
}
hotCoinMaxNum[erc20] = maxNum;
}
function setPrimAgentProfitPercAndFeeRate(uint primAgentProfitPerc,uint feeRate,bytes memory signatures) external {
{
bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setPrimAgentProfitPercAndFeeRate.selector,
primAgentProfitPerc,feeRate,new bytes(0)));
ManagerInfo memory _managerInfo=managerInfo;
uint managerNumber= _managerInfo.managerNumber;
uint expirationTime= block.timestamp-_managerInfo.expirationTime;
address[] memory managers=_managerInfo.managers;
address lastOwner = address(0);
address currentOwner;
uint t;uint8 j;uint8 v;bytes32 r;bytes32 s;
for (uint i;i<managerNumber;++i) {
(t,j,v, r, s) = signatureSplit(signatures, i);
require(t > expirationTime);
currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
require(currentOwner > lastOwner);
require(currentOwner==managers[j]);
lastOwner = currentOwner;
}
(,uint _expirationTime,address[] memory utcManagers)=multiSigUtc.getManagerInfo();
(t,j,v, r, s) = signatureSplit(signatures, managerNumber);
require(t>_expirationTime);
currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
//The Web3pay administrator is required to participate in a vote
require(currentOwner==utcManagers[j],"Web3 Pay Manager Error");
}
merchant.primAgentProfitPerc =primAgentProfitPerc;
merchant.feeRate =feeRate;
}
function setMultiSigAgentAddr(address multiSigAgentAddr,bytes memory signatures) external {
bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setMultiSigAgentAddr.selector,multiSigAgentAddr,new bytes(0)));
(uint utcManagerNumber,uint _expirationTime,address[] memory utcManagers)=multiSigUtc.getManagerInfo();
uint expirationTime= block.timestamp-_expirationTime;
address lastOwner = address(0);
address currentOwner;
uint t;uint8 j;uint8 v;bytes32 r;bytes32 s;
for (uint i;i<utcManagerNumber;++i) {
(t,j,v, r, s) = signatureSplit(signatures, i);
require(t > expirationTime);
currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
require(currentOwner > lastOwner);
require(currentOwner==utcManagers[j]);
lastOwner = currentOwner;
}
merchant.multiSigAgentAddr=multiSigAgentAddr;
}
function aggregatedHelperSetTokens(uint managerIndex,IAggregatedHelper aggregatedHelper,address[] memory _tokens) external{
require(managerInfo.managers[managerIndex]==msg.sender,"only manager");
aggregatedHelper.setTokens(_tokens);
}
function setEmergencyWithdrawAddr(address emergencyWithdrawAddress,bytes memory signatures) external {
ManagerInfo memory _managerInfo=managerInfo;
uint managerNumber= _managerInfo.managerNumber;
uint expirationTime= block.timestamp-_managerInfo.expirationTime;
address[] memory managers=_managerInfo.managers;
bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setEmergencyWithdrawAddr.selector, emergencyWithdrawAddress,new bytes(0)));
address lastOwner = address(0);
address currentOwner;
//uint t;uint8 j;uint8 v;bytes32 r;bytes32 s;
for (uint i;i<managerNumber;++i) {
(uint t,uint8 j,uint8 v,bytes32 r,bytes32 s) = signatureSplit(signatures, i);
require(t > expirationTime);
currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
require(currentOwner > lastOwner);
require(currentOwner==managers[j]);
lastOwner = currentOwner;
}
emergencyWithdrawAddr=emergencyWithdrawAddress;
}
function EmergencyCall(
bytes calldata data,
uint poolType,
address expectLendingPool
) external returns(bool success,bytes memory returnData){
address[] memory managers=managerInfo.managers;
uint mlength=managers.length;
address currentOwner=msg.sender;
for (uint i;i<mlength;++i) {
if(currentOwner==managers[i]){
return payPool.EmergencyCall(data,poolType,expectLendingPool);
}
}
}
}
//0x291459D95e4c915Ca4922Bd779476e95A05b4c71// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
import "./interfaces/ReentrancyGuard.sol";
import "./interfaces/IMultiSig.sol";
//多签抽象共用合约,被冷合约多签和热合约多签继承的公用方法
abstract contract MultiSig is ReentrancyGuard,IMultiSig{
//多签合约管理员信息
struct ManagerInfo {
uint256 managerNumber; /// 至少需要多签的签名数量
uint256 expirationTime;/// 签名有效期限
address[] managers; ///多签管理员名单列表,地址是有序的,顺序是从小到大
}
ManagerInfo managerInfo;
//为了首次初始化操作使用,如果等于10代表已经初始化过
uint public status;
/// 至少需要多签的签名比例,用于计算至少需要多签的签名数量
uint _ratio;
function getManagerRatio() external view returns(uint){
return _ratio;
}
function getManagerInfo() external virtual view returns(uint managerNumber,uint expirationTime,address[] memory managers){
ManagerInfo memory _managerInfo=managerInfo;
managerNumber= _managerInfo.managerNumber;
expirationTime= _managerInfo.expirationTime;
managers=_managerInfo.managers;
}
//通过多签的签名比例计算出至少需要多签的签名数量
function getManagerNumber(uint managerLength,uint ratio,uint base)internal pure returns (uint managerNumber) {
assembly {
let numerator := mul(managerLength, ratio)
let addendum := sub(base, 1)
managerNumber := div(add(numerator, addendum), base)
}
}
//设置多签的签名比例
//ratio为签名比例,精度为100,比如ratio为70代表百分之七十(70%)
//signatures是签名数据
function setManagerRatio(uint ratio,bytes memory signatures) external virtual nonReentrant{
//获取管理员信息
ManagerInfo memory _managerInfo=managerInfo;
//获取需要多签的签名数量
uint managerNumber= _managerInfo.managerNumber;
//获取签名有效期限(截止时间,单位为妙)
uint expirationTime= block.timestamp-_managerInfo.expirationTime;
//获多签管理员名单列表
address[] memory managers=_managerInfo.managers;
//最近签名过的管理员地址,用于排重用途
address lastOwner = address(0);
//当前签名的管理员地址,用于验签用途
address currentOwner;
uint t;//签名的时间戳(秒为单位)
uint8 j;//签名管理员在合约管理员信息的名单列表里面的位置(下标)
uint8 v;//签名数据V
bytes32 r;//签名数据R
bytes32 s;//签名数据S
//签名的原始数据datahash,满足EIP712并包括合约nonce等信息
bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setManagerRatio.selector, ratio,new bytes(0)));
for (uint i;i<managerNumber;++i) {
(t,j,v, r, s) = signatureSplit(signatures, i);
require(t >expirationTime);//验证是否过期
//获取签名的明文数据来恢复地址信息,其中明文数据是数据datahash和签名时间再次hash完成
currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
require(currentOwner > lastOwner);//保证账户不会重复
require(currentOwner==managers[j]);
lastOwner = currentOwner;
}
managerNumber=getManagerNumber(managers.length,ratio,1e2);
require(managerNumber>=2,"Manager cannot be less than two");
managerInfo.managerNumber=managerNumber;
_ratio=ratio;
}
//设置多签的签名有效时间
//_expirationTime为签名有效时间,单位为秒
//signatures是签名数据
function setManagerExpTime(uint _expirationTime,bytes memory signatures) external virtual nonReentrant{
//获取管理员信息
ManagerInfo memory _managerInfo=managerInfo;
//获取需要多签的签名数量
uint managerNumber= _managerInfo.managerNumber;
//获取签名有效期限(截止时间,单位为妙)
uint expirationTime= block.timestamp-_managerInfo.expirationTime;
//获多签管理员名单列表
address[] memory managers=_managerInfo.managers;
//最近签名过的管理员地址,用于排重用途
address lastOwner = address(0);
//当前签名的管理员地址,用于验签用途
address currentOwner;
uint t;//签名的时间戳(秒为单位)
uint8 j;//签名管理员在合约管理员信息的名单列表里面的位置(下标)
uint8 v;//签名数据V
bytes32 r;//签名数据R
bytes32 s;//签名数据S
//签名的原始数据datahash,满足EIP712并包括合约nonce等信息
bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.setManagerExpTime.selector, _expirationTime,new bytes(0)));
for (uint i;i<managerNumber;++i) {
(t,j,v, r, s) = signatureSplit(signatures, i);
require(t >expirationTime);//验证是否过期
//获取签名的明文数据来恢复地址信息,其中明文数据是数据datahash和签名时间再次hash完成
currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
require(currentOwner > lastOwner);//保证账户不会重复
require(currentOwner==managers[j]);
lastOwner = currentOwner;
}
managerInfo.expirationTime=_expirationTime;
}
//添加新的管理员
//_target为新的管理员地址,_index为提前链下计算好的在管理员数组列表中插入的位置
//signatures是签名数据
function addManager(address _target,uint256 _index,bytes memory signatures) external virtual nonReentrant{
//获取管理员信息
ManagerInfo memory _managerInfo=managerInfo;
//获多签管理员名单列表
address[] memory managers=_managerInfo.managers;
//获取需要多签的签名数量
uint managerNumber= _managerInfo.managerNumber;
{
//签名的原始数据datahash,满足EIP712并包括合约nonce等信息
bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.addManager.selector, _target,_index,new bytes(0)));
//获取签名有效期限(截止时间,单位为妙)
uint expirationTime= block.timestamp-_managerInfo.expirationTime;
//最近签名过的管理员地址,用于排重用途
address lastOwner = address(0);
//当前签名的管理员地址,用于验签用途
address currentOwner;
uint t;//签名的时间戳(秒为单位)
uint8 j;//签名管理员在合约管理员信息的名单列表里面的位置(下标)
uint8 v;//签名数据V
bytes32 r;//签名数据R
bytes32 s;//签名数据S
for (uint i;i<managerNumber;++i) {
(t,j,v, r, s) = signatureSplit(signatures, i);
require(t >expirationTime);//验证是否过期
//获取签名的明文数据来恢复地址信息,其中明文数据是数据datahash和签名时间再次hash完成
currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
require(currentOwner > lastOwner);//保证账户不会重复
require(currentOwner==managers[j]);
lastOwner = currentOwner;
}
}
uint length=managers.length;
//验证新添加地址的位置,保证顺序性
if(_index==0){
require(_target<managers[0]);
}else if(_index<length){
require(
_target<managers[_index]&&
_target>managers[_index-1]
);
}else{
require(_index==length&&_target>managers[_index-1]);
}
//添加新的管理员空间
managerInfo.managers.push();
//重新赋值给临时内存变量managers,便于后面使用从而节省gas费用
managers=managerInfo.managers;
//从数组末尾向前遍列,后一位重新赋值为前一位数据直到需要插入数据的位置
for(uint i=length;i>_index;--i){
managers[i]=managers[i-1];
}
//插入数据位置替换为新添加的管理员
managers[_index]=_target;
managerInfo.managers=managers;
//根据多签的签名比例,计算需要多签的签名数量进而重新设置多签的签名数量
managerInfo.managerNumber=getManagerNumber(managers.length,_ratio,1e2);
}
//删除管理员
//_target为需要删除的管理员地址,_index为提前链下计算好的在管理员数组列表中的位置
//signatures是签名数据
function rmManager(address _target,uint256 _index,bytes memory signatures) external virtual nonReentrant{
//获取管理员信息
ManagerInfo memory _managerInfo=managerInfo;
//获多签管理员名单列表
address[] memory managers=_managerInfo.managers;
//获取需要多签的签名数量
uint managerNumber= _managerInfo.managerNumber;
{
//签名的原始数据datahash,满足EIP712并包括合约nonce等信息
bytes32 dataHash=_getTransactionHash(abi.encodeWithSelector(this.rmManager.selector,_target,_index,new bytes(0)));
//获取签名有效期限(截止时间,单位为妙)
uint expirationTime= block.timestamp-_managerInfo.expirationTime;
//最近签名过的管理员地址,用于排重用途
address lastOwner = address(0);
//当前签名的管理员地址,用于验签用途
address currentOwner;
uint t;//签名的时间戳(秒为单位)
uint8 j;//签名管理员在合约管理员信息的名单列表里面的位置(下标)
uint8 v;//签名数据V
bytes32 r;//签名数据R
bytes32 s;//签名数据S
for (uint i;i<managerNumber;++i) {
(t,j,v, r, s) = signatureSplit(signatures, i);
require(t >expirationTime);//验证是否过期
//获取签名的明文数据来恢复地址信息,其中明文数据是数据datahash和签名时间再次hash完成
currentOwner = ecrecover(getHashWithTimestamp(dataHash,t), v, r, s);
require(currentOwner > lastOwner);//保证账户不会重复
require(currentOwner==managers[j]);
lastOwner = currentOwner;
}
}
uint length=managers.length;
require(length >= 3 , "Manager cannot be less than three");
require(managers[_index]==_target, "address is not exist");
length=length-1;
//从需要删除的管理员数组列表中的位置开始遍列,前一位重新赋值为后一位的数据直到数组末尾
for (uint i=_index; i<length; ++i) {
managers[i]=managers[i+1];
}
managerInfo.managers=managers;
managerInfo.managers.pop();
//根据多签的签名比例,计算需要多签的签名数量进而重新设置多签的签名数量
managerInfo.managerNumber=getManagerNumber(length,_ratio,1e2);
}
//用于防止签名重复使用
uint256 public nonce;
// keccak256(
// "EIP712Domain(uint256 chainId,address verifyingContract)"
// );
bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218;
//满足EIP712以防止多链重入
function _getTransactionHash(bytes memory transactions) internal returns (bytes32 txHash) {
txHash =keccak256(abi.encodePacked(bytes1(0x19),bytes1(0x01),_domainSeparator(),keccak256(abi.encode(transactions,nonce++))));
}
function getTransactionHash(bytes memory transactions) external view returns (bytes32 txHash) {
txHash =keccak256(abi.encodePacked(bytes1(0x19),bytes1(0x01),_domainSeparator(),keccak256(abi.encode(transactions,nonce))));
}
function _domainSeparator() internal view returns (bytes32) {
uint256 chainId;
assembly {
chainId := chainid()
}
return keccak256(abi.encode(DOMAIN_SEPARATOR_TYPEHASH, chainId, this));
}
//解析签名数据
//signatures是签名数据,pos是签名分割的位置
//t;签名的时间戳(秒为单位)
//j;签名管理员在合约管理员信息的名单列表里面的位置(下标)
//v;签名数据V
//r;签名数据R
//s;签名数据S
function signatureSplit(bytes memory signatures, uint256 pos) internal pure returns (
uint t,uint8 j,uint8 v,bytes32 r,bytes32 s
) {
assembly {
let signaturePos := mul(0x62, pos)
r := mload(add(signatures, add(signaturePos, 0x20)))
s := mload(add(signatures, add(signaturePos, 0x40)))
t := mload(add(signatures, add(signaturePos, 0x60)))
j := byte(0, mload(add(signatures, add(signaturePos, 0x80))))
v := byte(0, mload(add(signatures, add(signaturePos, 0x81))))
}
}
//混淆txHash和签名期限t的hash,然后加入以太坊签名前缀串
function getHashWithTimestamp(bytes32 txHash,uint t)internal pure returns (bytes32 digest) {
bytes32 messageHash=keccak256(abi.encodePacked(txHash, t));
assembly {
mstore(0x00, "\x19Ethereum Signed Message:\n32") // 32 is the bytes-length of messageHash
mstore(0x1c, messageHash) // 0x1c (28) is the length of the prefix
digest := keccak256(0x00, 0x3c) // 0x3c is the length of the prefix (0x1c) + messageHash (0x20)
}
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
import "./ILendingPool.sol";
import "./ICommonConfigs.sol";
import "./IWETH.sol";
interface IPayPool{
event DepositByAave(address token,uint assets);
event WithdrawByAave(address token,uint assets,uint amount,uint256 reward);
event DepositByLido(address token,uint assets);
event WithdrawByLido(address token,uint assets,uint amount,uint256 reward);
event DepositByEthena(address token,uint assets);
event WithdrawByEthena(address token,uint assets,uint amount,uint256 reward);
function aaveLendingPool() external pure returns (ILendingPool);
function lidoLendingPool() external pure returns (ILendingPool);
function ethenaLendingPool() external pure returns (ILendingPool);
function commonConfigs() external pure returns (ICommonConfigs);
function usdeToken() external pure returns (address);
function lendingAmount(uint _type,address _user) external view returns (uint);
error OwnableUnauthorizedAccount(address account);
error EthTransfer(address recipient, uint256 amount);
error EthenaCooldownNotStart(address account);
error EthenaCooldownNotEnd(address account);
function initOwner()external;
function depositByAave(address token) external returns (uint assets);
function withdrawByAave(address token,uint assets) external returns(uint amount,uint256 reward);
function depositByLido(address token) external returns (uint assets);
function withdrawByLido(uint256[] memory requestIds,address token,uint assets)external returns(uint amount,uint256 reward);
// 请求提现
function lidoRequestWithdrawals(address token,uint256[] calldata _amounts)external returns (uint256[] memory requestIds);
function depositByEthenaStakeUsde() external returns (uint assets);
function cooldownSharesForEthenaStake() external returns (uint256 assets);
function withdrawByEthenaStakeUsde(uint assets) external returns (uint amount,uint256 reward);
function EmergencyCall(
bytes calldata data,
uint callType,
address callAddr
) external returns(bool success,bytes memory returnData);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
interface IAggregatedHelper{
function aggregateAsset() external payable;
function initConfig(address[] memory _tokens,address payable _coldPool,address _multiSigCold) external;
function setTokens(address[] memory _tokens) external;
event PaymentReceived(address indexed sender, address indexed token, uint256 indexed amount, uint256 orderId);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
interface IAsset{
function sendErc20(bytes memory transactions) external;
function sendEths(bytes memory transactions) external payable;
function initOwner(address initialOwner) external;
event TransferEthTo(address indexed to, uint256 indexed timestamp, uint256 value);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
interface IMultiSigAgent{
function initManagers(uint ratio,uint expirationTime,address _primAgentFeeAddr,address[] memory _managers) external;
function getPrimAgentFeeAddr() external view returns(address);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
interface IERC20Minimal {
function balanceOf(address account) external view returns (uint256);
function transferFrom(address sender,address recipient,uint256 amount) external returns (bool);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
import "./IMultiSigUtc.sol";
struct Merchant {
/// Set the storage balance ratio of each merchant's hot contract
uint256 hotCoinMaxRatio;
/// Fee payment ratio for each merchant
uint256 feeRate;
/// Each merchant balance funds limit time
uint256 balancedTime;
/// The minimum voting ratio for multiple signatures for each merchant is at least 50 and the maximum is 100
uint256 primAgentProfitPerc;
/// Hot contract storage pool address
address payable hotPool;
/// Cold contract storage pool address
address payable coldPool;
/// Agent’s multi-signature address
address multiSigAgentAddr;
}
interface IMultiSigCold{
function initManagers(Merchant memory data,IMultiSigUtc _multiSigUtc,uint ratio,uint expirationTime,address[] memory _managers) external;
function initOwner() external;
event TransferCommissionLogs(address indexed token, uint256 indexed totalCommission,uint256 indexed primCommission,uint256 web3PayCommission,uint256 transBalHot);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
interface IWETH {
function deposit() external payable;
function withdraw(uint256) external;
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
import "./IMultiSigCold.sol";
interface ICommonConfigs{
struct FeeInfo{
address feeTo;
uint16 feeRate;
}
function getFeeInfo(IMultiSigCold user)external view returns(uint,address);
function setSupportEmergencyCalls(uint callType,address callAddr,bytes4 methodId,bytes memory signatures) external ;
function setFeeRate(uint16 _feeRate,IMultiSigCold user,bytes memory signatures) external ;
function setFreeFeeRate(IMultiSigCold user,bytes memory signatures) external ;
function checkEmergencyCall(bytes memory data,uint callType,address callAddr)external view;
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
import "./ILidoWithdrawalQueueERC721.sol";
interface ILendingPool {
function withdraw(
address asset,
uint256 amount,
address to
) external returns (uint256);
function supply(
address asset,
uint256 amount,
address onBehalfOf,
uint16 referralCode
) external;
//ethena---start
function cooldownShares(uint256 shares) external returns (uint256 assets);
function unstake(address receiver) external;
function deposit(uint256 assets, address receiver) external returns (uint256 shares);
function cooldowns(address receiver) external view returns(uint104 cooldownEnd,uint152 underlyingAmount);
function cooldownDuration() external view returns(uint24);
//ethena---end
// 质押到指定模块
function submit(address _referral) external payable returns (uint256);//ldo
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
interface IMultiSigUtc{
function getManagerInfo()external view returns(uint managerNumber,uint expirationTime,address[] memory managers);
function getUtcFeeAddr() external view returns(address);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
interface IMultiSig {
function getManagerInfo() external view returns(uint managerNumber,uint expirationTime,address[] memory managers);
function getTransactionHash(bytes memory transactions) external view returns (bytes32 txHash);
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
abstract contract ReentrancyGuard {
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// 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;
}
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.12;
interface ILidoWithdrawalQueueERC721{
// 请求提现
function requestWithdrawals(uint256[] calldata _amounts, address _owner)external returns (uint256[] memory requestIds);
// 领取提现
function claimWithdrawals(uint256[] calldata _requestIds, uint256[] calldata _hints) external;
//获取提款请求
function getWithdrawalRequests(address _owner)external view returns (uint256[] memory requestsIds);
function findCheckpointHints(uint256[] calldata _requestIds,uint256 _firstIndex,uint256 _lastIndex) external view returns (uint256[] memory hintIds);
function getLastCheckpointIndex() external view returns (uint256);
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"remappings": []
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"totalCommission","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"primCommission","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"web3PayCommission","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"transBalHot","type":"uint256"}],"name":"TransferCommissionLogs","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"uint256","name":"poolType","type":"uint256"},{"internalType":"address","name":"expectLendingPool","type":"address"}],"name":"EmergencyCall","outputs":[{"internalType":"bool","name":"success","type":"bool"},{"internalType":"bytes","name":"returnData","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"addManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"managerIndex","type":"uint256"},{"internalType":"contract IAggregatedHelper","name":"aggregatedHelper","type":"address"},{"internalType":"address[]","name":"_tokens","type":"address[]"}],"name":"aggregatedHelperSetTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"erc20s","type":"address[]"}],"name":"balFundsToHot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldownSharesForEthenaStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"depositByAave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"depositByEthenaStakeUsde","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"depositByLido","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdrawAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getColdPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getManagerInfo","outputs":[{"internalType":"uint256","name":"managerNumber","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"internalType":"address[]","name":"managers","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getManagerRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMerAgentConfigData","outputs":[{"internalType":"uint256","name":"primAgentProfitPerc","type":"uint256"},{"internalType":"uint256","name":"feeRate","type":"uint256"},{"internalType":"address","name":"multiSigAgentAddr","type":"address"},{"internalType":"address","name":"feeAddr","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"transactions","type":"bytes"}],"name":"getTransactionHash","outputs":[{"internalType":"bytes32","name":"txHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hotCoinMaxNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"hotCoinMaxRatio","type":"uint256"},{"internalType":"uint256","name":"feeRate","type":"uint256"},{"internalType":"uint256","name":"balancedTime","type":"uint256"},{"internalType":"uint256","name":"primAgentProfitPerc","type":"uint256"},{"internalType":"address payable","name":"hotPool","type":"address"},{"internalType":"address payable","name":"coldPool","type":"address"},{"internalType":"address","name":"multiSigAgentAddr","type":"address"}],"internalType":"struct Merchant","name":"data","type":"tuple"},{"internalType":"contract IMultiSigUtc","name":"_multiSigUtc","type":"address"},{"internalType":"uint256","name":"ratio","type":"uint256"},{"internalType":"uint256","name":"expirationTime","type":"uint256"},{"internalType":"address[]","name":"_managers","type":"address[]"}],"name":"initManagers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lastBalancedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"lidoRequestWithdrawals","outputs":[{"internalType":"uint256[]","name":"requestIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"merchant","outputs":[{"internalType":"uint256","name":"hotCoinMaxRatio","type":"uint256"},{"internalType":"uint256","name":"feeRate","type":"uint256"},{"internalType":"uint256","name":"balancedTime","type":"uint256"},{"internalType":"uint256","name":"primAgentProfitPerc","type":"uint256"},{"internalType":"address payable","name":"hotPool","type":"address"},{"internalType":"address payable","name":"coldPool","type":"address"},{"internalType":"address","name":"multiSigAgentAddr","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiSigUtc","outputs":[{"internalType":"contract IMultiSigUtc","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"payPool","outputs":[{"internalType":"contract IPayPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"rmManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"balancedTime","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setBalancedTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"emergencyWithdrawAddress","type":"address"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setEmergencyWithdrawAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20","type":"address"},{"internalType":"uint256","name":"maxNum","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setHotCoinMaxNum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"hotCoinMaxRatio","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setHotCoinMaxRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"hotPool","type":"address"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setHotPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_expirationTime","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setManagerExpTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ratio","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setManagerRatio","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"multiSigAgentAddr","type":"address"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setMultiSigAgentAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"primAgentProfitPerc","type":"uint256"},{"internalType":"uint256","name":"feeRate","type":"uint256"},{"internalType":"bytes","name":"signatures","type":"bytes"}],"name":"setPrimAgentProfitPercAndFeeRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"withdrawByAave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"withdrawByEthenaStakeUsde","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"requestIds","type":"uint256[]"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"assets","type":"uint256"}],"name":"withdrawByLido","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405234801561001057600080fd5b506001600055614c8d806100256000396000f3fe60806040526004361061021c5760003560e01c80638e83e0ab11610122578063cd19f95f116100a5578063ec797d251161006c578063ec797d25146106d0578063ef0b792214610714578063f42c660314610734578063f72a60fd14610754578063fa378a4f1461077457005b8063cd19f95f1461062c578063d0efff9614610650578063d163642114610670578063d890bdf414610690578063e1c32502146106b057005b8063affed0e0116100e9578063affed0e0146105a3578063b5e1e3bf146105b9578063c2d53eb4146105d7578063c39bf23e146105ec578063cd119ca91461060c57005b80638e83e0ab146104a257806395722e66146104c2578063a2deadbd146104e2578063a5ff765114610502578063aa2651381461058357005b806345e06903116101aa5780635c21b103116101715780635c21b103146103f4578063606dbcbf14610422578063822dd9a41461044f57806384e7fc8b1461046f5780638da5cb5b1461048457005b806345e069031461032f57806347a131f91461034f578063495069e21461036f57806351165755146103a757806357a98b7a146103c757005b80632c35ec4e116101ee5780632c35ec4e146102995780632c49d169146102b957806337ba1dbd146102d95780633b4a0032146102f95780633d5ec7691461030f57005b806312a69b48146102255780631902fe6f1461024e578063200d2ed2146102635780632b8b19901461027957005b3661022357005b005b34801561023157600080fd5b5061023b60085481565b6040519081526020015b60405180910390f35b34801561025a57600080fd5b5060055461023b565b34801561026f57600080fd5b5061023b60045481565b34801561028557600080fd5b5061022361029436600461402f565b610794565b3480156102a557600080fd5b506102236102b4366004614087565b610c15565b3480156102c557600080fd5b506102236102d43660046140d6565b610e36565b3480156102e557600080fd5b506102236102f4366004614194565b610f86565b34801561030557600080fd5b5061023b60115481565b34801561031b57600080fd5b5061022361032a3660046141e2565b61104d565b34801561033b57600080fd5b5061022361034a366004614087565b611724565b34801561035b57600080fd5b5061022361036a3660046140d6565b61190f565b34801561037b57600080fd5b5060105461038f906001600160a01b031681565b6040516001600160a01b039091168152602001610245565b3480156103b357600080fd5b506102236103c236600461421e565b611a0f565b3480156103d357600080fd5b5061023b6103e23660046142c9565b60146020526000908152604090205481565b34801561040057600080fd5b5061041461040f3660046142e6565b611b46565b6040516102459291906143c8565b34801561042e57600080fd5b5061044261043d3660046143e3565b611c91565b60405161024591906144a5565b34801561045b57600080fd5b5061022361046a3660046144b8565b611ddb565b34801561047b57600080fd5b50610223612156565b34801561049057600080fd5b506012546001600160a01b031661038f565b3480156104ae57600080fd5b506102236104bd3660046144f1565b612292565b3480156104ce57600080fd5b5060075461038f906001600160a01b031681565b3480156104ee57600080fd5b5061023b6104fd366004614521565b6124a9565b34801561050e57600080fd5b50600954600a54600b54600c54600d54600e54600f5461053f96959493926001600160a01b03908116928116911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e001610245565b34801561058f57600080fd5b5061022361059e3660046140d6565b612530565b3480156105af57600080fd5b5061023b60065481565b3480156105c557600080fd5b50600e546001600160a01b031661038f565b3480156105e357600080fd5b50610223612666565b3480156105f857600080fd5b50610223610607366004614087565b6127b6565b34801561061857600080fd5b506102236106273660046144f1565b61299b565b34801561063857600080fd5b50610641612b6b565b6040516102459392919061458e565b34801561065c57600080fd5b5061022361066b3660046145ad565b612c10565b34801561067c57600080fd5b5061022361068b3660046145ad565b612dc0565b34801561069c57600080fd5b506102236106ab36600461402f565b612ee4565b3480156106bc57600080fd5b506102236106cb3660046144f1565b6130ca565b3480156106dc57600080fd5b506106e56132a8565b6040805194855260208501939093526001600160a01b0391821692840192909252166060820152608001610245565b34801561072057600080fd5b5061022361072f3660046144f1565b613378565b34801561074057600080fd5b5060135461038f906001600160a01b031681565b34801561076057600080fd5b5061022361076f3660046145c6565b6135bf565b34801561078057600080fd5b5061022361078f36600461402f565b6137cb565b61079c613afd565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561080d57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107ef575b50505091909252505050604081015181519192509060006108a76302b8b19960e41b8888845b6040519080825280601f01601f19166020018201604052801561085d576020820181803683370190505b50604051602401610870939291906146a5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613b28565b905060008460200151426108bb91906146e2565b90506000808060008060008060005b8a8110156109c6576108dc8e82613b62565b9399509197509550935091508886116108f457600080fd5b60016109008b88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561094e573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161097857600080fd5b8b8560ff168151811061098d5761098d6146f9565b60200260200101516001600160a01b0316876001600160a01b0316146109b257600080fd5b869750806109bf9061470f565b90506108ca565b50508951975050508a15159450610a19935050505057826000815181106109ef576109ef6146f9565b60200260200101516001600160a01b0316876001600160a01b031610610a1457600080fd5b610ae4565b80861015610a9857828681518110610a3357610a336146f9565b60200260200101516001600160a01b0316876001600160a01b0316108015610a8f575082610a626001886146e2565b81518110610a7257610a726146f9565b60200260200101516001600160a01b0316876001600160a01b0316115b610a1457600080fd5b8086148015610adb575082610aae6001886146e2565b81518110610abe57610abe6146f9565b60200260200101516001600160a01b0316876001600160a01b0316115b610ae457600080fd5b60038054600101808255600082905260408051602080840282018101909252828152929190830182828015610b4257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b24575b509396508493505050505b86811115610bb35783610b616001836146e2565b81518110610b7157610b716146f9565b6020026020010151848281518110610b8b57610b8b6146f9565b6001600160a01b0390921660209283029190910190910152610bac8161472a565b9050610b4d565b5086838781518110610bc757610bc76146f9565b6001600160a01b039092166020928302919091018201528351610bf09160039190860190613ea5565b50825160055460649102606301045b60015550610c109250613bfe915050565b505050565b6040805160608101825260018054825260025460208084019190915260038054855181840281018401875281815260009686019390929190830182828015610c8657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c68575b505050919092525050815160208301519293509160009150610ca890426146e2565b60408401519091506000610cfc63161af62760e11b88835b6040519080825280601f01601f191660200182016040528015610cea576020820181803683370190505b50604051602401610870929190614741565b9050600080805b86811015610e0a576000806000806000610d1d8e87613b62565b945094509450945094508a8511610d3357600080fd5b6001610d3f8a87613b91565b6040805160008152602081018083529290925260ff861690820152606081018490526080810183905260a0016020604051602081039080840390855afa158015610d8d573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b031611610db757600080fd5b898460ff1681518110610dcc57610dcc6146f9565b60200260200101516001600160a01b0316876001600160a01b031614610df157600080fd5b869750505050505080610e039061470f565b9050610d03565b5050601380546001600160a01b0319166001600160a01b03999099169890981790975550505050505050565b60006001600201805480602002602001604051908101604052809291908181526020018280548015610e9157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e73575b5050835193945033925060009150505b82811015610f7e57838181518110610ebb57610ebb6146f9565b60200260200101516001600160a01b0316826001600160a01b03161415610f6e57600754610ef49087906001600160a01b031687613c05565b600754604051631c05ca9160e21b81526001600160a01b038881166004830152909116906370172a44906024015b6020604051808303816000875af1158015610f41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190614765565b50505050505050565b610f778161470f565b9050610ea1565b505050505050565b6003805433919085908110610f9d57610f9d6146f9565b6000918252602090912001546001600160a01b031614610ff35760405162461bcd60e51b815260206004820152600c60248201526b37b7363c9036b0b730b3b2b960a11b60448201526064015b60405180910390fd5b60405163312d6d7960e11b81526001600160a01b0383169063625adaf29061101f90849060040161477e565b600060405180830381600087803b15801561103957600080fd5b505af1158015610f65573d6000803e3d6000fd5b611055613afd565b6040805160e0810182526009548152600a546020820152600b54918101829052600c546060820152600d546001600160a01b039081166080830152600e54811660a0830152600f541660c08201526008549091906110b390426146e2565b1161110a5760405162461bcd60e51b815260206004820152602160248201527f42616c616e63652066756e647320696e74657276616c2074696d65206c696d696044820152601d60fa1b6064820152608401610fea565b42600855608081015160a0820151600080805260146020527f4f26c3876aa9f4b92579780beea1161a61f87ebf1ec6ee865b299e447ecba99c546060936001600160a01b039081163193163191906111659084908490613cd9565b90506000806000806000806001600160a01b03168a60c001516001600160a01b0316146111f5578960c001516001600160a01b031663dfdf3c0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f29190614791565b90505b601054604080516321d5e88b60e11b815290516000926001600160a01b0316916343abd1169160048083019260209291908290030181865afa15801561123f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112639190614791565b905086156113ab5761127687838d613cfe565b60808f0151604051949a50929850909650945061129a918c919086906020016147ae565b60405160208183030381529060405299508981856040516020016112c0939291906147ae565b60408051601f1981840301815291905299506001600160a01b03821615611308578982866040516020016112f6939291906147ae565b60405160208183030381529060405299505b6040805185815260208101859052869188916000917f997949b68a7acda536ce262804beb274a3112dd32918fcf92c3dee2f13995f4e910160405180910390a48a60a001516001600160a01b031663baaad1be8b6040518263ffffffff1660e01b815260040161137891906147e8565b600060405180830381600087803b15801561139257600080fd5b505af11580156113a6573d6000803e3d6000fd5b505050505b606060005b8d518110156116a0576113e08e82815181106113ce576113ce6146f9565b60200260200101518e60800151613d77565b9a506114098e82815181106113f7576113f76146f9565b60200260200101518e60a00151613d77565b995060008e828151811061141f5761141f6146f9565b602002602001015190506114598c8c60146000856001600160a01b03166001600160a01b0316815260200190815260200160002054613cd9565b99505088156116905761146d89858f613cfe565b809850819950829a50839b5050505050818e8281518110611490576114906146f9565b602002602001015163a9059cbb8f60800151886040516024016114c89291906001600160a01b03929092168252602082015260400190565b60408051601f19818403018152918152602080830180516001600160e01b031660e09590951b9490941790935251611502949392016147fb565b6040516020818303038152906040529150818e8281518110611526576115266146f9565b602090810291909101810151604080516001600160a01b038816602482015260448082018c9052825180830390910181526064909101825280840180516001600160e01b031663a9059cbb60e01b17905290516115849493016147fb565b60408051601f1981840301815291905291506001600160a01b0384161561162857818e82815181106115b8576115b86146f9565b602090810291909101810151604080516001600160a01b038916602482015260448082018d9052825180830390910181526064909101825280840180516001600160e01b031663a9059cbb60e01b17905290516116169493016147fb565b60405160208183030381529060405291505b86888f838151811061163c5761163c6146f9565b60200260200101516001600160a01b03167f997949b68a7acda536ce262804beb274a3112dd32918fcf92c3dee2f13995f4e8989604051611687929190918252602082015260400190565b60405180910390a45b6116998161470f565b90506113b0565b5080511561170b578b60a001516001600160a01b0316637dd393ea826040518263ffffffff1660e01b81526004016116d891906147e8565b600060405180830381600087803b1580156116f257600080fd5b505af1158015611706573d6000803e3d6000fd5b505050505b5050505050505050505050506117216001600055565b50565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561179557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611777575b5050509190925250508151602083015192935091600091506117b790426146e2565b604084015190915060006117d36345e0690360e01b8883610cc0565b90506000808060008060008060005b8b8110156118de576117f48e82613b62565b9399509197509550935091508a861161180c57600080fd5b60016118188a88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611866573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161189057600080fd5b898560ff16815181106118a5576118a56146f9565b60200260200101516001600160a01b0316876001600160a01b0316146118ca57600080fd5b869750806118d79061470f565b90506117e2565b5050600d80546001600160a01b0319166001600160a01b039e909e169d909d17909c55505050505050505050505050565b6000600160020180548060200260200160405190810160405280929190818152602001828054801561196a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161194c575b5050835193945033925060009150505b82811015610f7e57838181518110611994576119946146f9565b60200260200101516001600160a01b0316826001600160a01b031614156119ff576007546119cd9087906001600160a01b031687613c05565b600754604051632c0856db60e21b81526001600160a01b0388811660048301529091169063b0215b6c90602401610f22565b611a088161470f565b905061197a565b60006001600201805480602002602001604051908101604052809291908181526020018280548015611a6a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a4c575b5050835193945033925060009150505b82811015610f6557838181518110611a9457611a946146f9565b60200260200101516001600160a01b0316826001600160a01b03161415611b3657600754604051635116575560e01b81526001600160a01b0390911690635116575590611ae9908a908a908a90600401614842565b60408051808303816000875af1158015611b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2b9190614870565b505050505050505050565b611b3f8161470f565b9050611a7a565b60038054604080516020808402820181019092528281526000936060938593830182828015611b9e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b80575b5050835193945033925060009150505b82811015611c8357838181518110611bc857611bc86146f9565b60200260200101516001600160a01b0316826001600160a01b03161415611c7357600754604051635c21b10360e01b81526001600160a01b0390911690635c21b10390611c1f908d908d908d908d90600401614894565b6000604051808303816000875af1158015611c3e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c6691908101906148dd565b9550955050505050611c88565b611c7c8161470f565b9050611bae565b505050505b94509492505050565b606060006001600201805480602002602001604051908101604052809291908181526020018280548015611cee57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611cd0575b5050835193945033925060009150505b82811015611dcf57838181518110611d1857611d186146f9565b60200260200101516001600160a01b0316826001600160a01b03161415611dbf5760075460405163606dbcbf60e01b81526001600160a01b039091169063606dbcbf90611d6d908b908b908b9060040161496e565b6000604051808303816000875af1158015611d8c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611db491908101906149bb565b945050505050611dd4565b611dc88161470f565b9050611cfe565b505050505b9392505050565b60408051600080825260208201909252611e099063208b766960e21b90610870908790879060448101614a4b565b905060006001604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015611e8757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611e69575b505050919092525050815160208301519293509160009150611ea990426146e2565b60408401519091506000808080808080805b8a811015611fb757611ecd8e82613b62565b939950919750955093509150898611611ee557600080fd5b6001611ef18e88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611f3f573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b031611611f6957600080fd5b888560ff1681518110611f7e57611f7e6146f9565b60200260200101516001600160a01b0316876001600160a01b031614611fa357600080fd5b86975080611fb09061470f565b9050611ebb565b50600080601060009054906101000a90046001600160a01b03166001600160a01b031663cd19f95f6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561200e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120369190810190614a6a565b92509250506120458f8d613b62565b939a5091985096509450925081871161205d57600080fd5b60016120698f89613b91565b6040805160008152602081018083529290925260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156120b7573d6000803e3d6000fd5b505050602060405103519750808660ff16815181106120d8576120d86146f9565b60200260200101516001600160a01b0316886001600160a01b0316146121395760405162461bcd60e51b81526020600482015260166024820152752bb2b119902830bc9026b0b730b3b2b91022b93937b960511b6044820152606401610fea565b505050600c9d909d55505050600a98909855505050505050505050565b600060016002018054806020026020016040519081016040528092919081815260200182805480156121b157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612193575b5050835193945033925060009150505b8281101561228c578381815181106121db576121db6146f9565b60200260200101516001600160a01b0316826001600160a01b0316141561227c57600760009054906101000a90046001600160a01b03166001600160a01b03166384e7fc8b6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122759190614765565b5050505050565b6122858161470f565b90506121c1565b50505050565b61229a613afd565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561230b57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116122ed575b50505091909252505081516020830151929350916000915061232d90426146e2565b6040840151909150600080808080808080612388638e83e0ab60e01b8f835b6040519080825280601f01601f191660200182016040528015612376576020820181803683370190505b50604051602401610870929190614b18565b905060005b8b8110156124895761239f8e82613b62565b939a509198509650945092508a87116123b757600080fd5b60016123c38389613b91565b6040805160008152602081018083529290925260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612411573d6000803e3d6000fd5b505050602060405103519750886001600160a01b0316886001600160a01b03161161243b57600080fd5b898660ff1681518110612450576124506146f9565b60200260200101516001600160a01b0316886001600160a01b03161461247557600080fd5b879850806124829061470f565b905061238d565b50505060028c9055506124a59850613bfe975050505050505050565b5050565b6000601960f81b600160f81b6124bd613e4b565b6006546040516124d1918791602001614b31565b60408051808303601f190181529082905280516020918201206001600160f81b03199586169183019190915292909316602184015260228301526042820152606201604051602081830303815290604052805190602001209050919050565b6000600160020180548060200260200160405190810160405280929190818152602001828054801561258b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161256d575b5050835193945033925060009150505b82811015610f7e578381815181106125b5576125b56146f9565b60200260200101516001600160a01b0316826001600160a01b0316141561265657600754604051631544ca2760e31b81526001600160a01b038881166004830152602482018890529091169063aa2651389060440160408051808303816000875af1158015612628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264c9190614870565b5050505050505050565b61265f8161470f565b905061259b565b601154600a14156126aa5760405162461bcd60e51b815260206004820152600e60248201526d6f6e6c7920696e6974206f6e636560901b6044820152606401610fea565b763d602d80600a3d3981f3363d3d373d3d3d363d7358833360009081527f17b38d33f6f27dd56f4c132e42ac14d82b5af43d82803e903d91602b57fd5bf36020527358833317b38d33f6f27dd56f4c132e42ac14d82b7f21622f2554745826ee3002d92aa2b5bc3f03d524d519610ce5d6c103f4a8064e806037600985f5600780546001600160a01b0319166001600160a01b038316908117909155604080516330b54fad60e21b81529051929550909163c2d53eb49160048082019260009290919082900301818387803b15801561278257600080fd5b505af1158015612796573d6000803e3d6000fd5b5050600a6011555050601280546001600160a01b03191633179055505050565b60006127ca6361cdf91f60e11b8483610cc0565b90506000806000601060009054906101000a90046001600160a01b03166001600160a01b031663cd19f95f6040518163ffffffff1660e01b8152600401600060405180830381865afa158015612824573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261284c9190810190614a6a565b91945092509050600061285f83426146e2565b90506000808060008060008060005b8b81101561296a576128808e82613b62565b93995091975095509350915088861161289857600080fd5b60016128a48e88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156128f2573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161291c57600080fd5b898560ff1681518110612931576129316146f9565b60200260200101516001600160a01b0316876001600160a01b03161461295657600080fd5b869750806129639061470f565b905061286e565b5050600f80546001600160a01b0319166001600160a01b039e909e169d909d17909c55505050505050505050505050565b6040805160608101825260018054825260025460208084019190915260038054855181840281018401875281815260009686019390929190830182828015612a0c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129ee575b505050919092525050815160208301519293509160009150612a2e90426146e2565b60408401519091506000612a4a63cd119ca960e01b888361234c565b90506000808060008060008060005b8b811015612b5557612a6b8e82613b62565b9399509197509550935091508a8611612a8357600080fd5b6001612a8f8a88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015612add573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b031611612b0757600080fd5b898560ff1681518110612b1c57612b1c6146f9565b60200260200101516001600160a01b0316876001600160a01b031614612b4157600080fd5b86975080612b4e9061470f565b9050612a59565b505050600b9b909b555050505050505050505050565b600080606060006001604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015612bec57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612bce575b50505091909252505081516020830151604090930151909792965094509092505050565b60006001600201805480602002602001604051908101604052809291908181526020018280548015612c6b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c4d575b5050835193945033925060009150505b8281101561227557838181518110612c9557612c956146f9565b60200260200101516001600160a01b0316826001600160a01b03161415612db0576007546040805163bc14ebe760e01b81529051612d37926001600160a01b03169163bc14ebe79160048083019260209291908290030181865afa158015612d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d259190614791565b6007546001600160a01b031687613c05565b600760009054906101000a90046001600160a01b03166001600160a01b03166358e8d3006040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7e9190614765565b612db98161470f565b9050612c7b565b60006001600201805480602002602001604051908101604052809291908181526020018280548015612e1b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612dfd575b5050835193945033925060009150505b8281101561227557838181518110612e4557612e456146f9565b60200260200101516001600160a01b0316826001600160a01b03161415612ed45760075460405163d163642160e01b8152600481018790526001600160a01b039091169063d16364219060240160408051808303816000875af1158015612eb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190614870565b612edd8161470f565b9050612e2b565b6040805160608101825260018054825260025460208084019190915260038054855181840281018401875281815260009686019390929190830182828015612f5557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612f37575b505050919092525050815160208301519293509160009150612f7790426146e2565b60408401519091506000612f946336242f7d60e21b898984610833565b9050600080805b868110156130a2576000806000806000612fb58e87613b62565b945094509450945094508a8511612fcb57600080fd5b6001612fd78a87613b91565b6040805160008152602081018083529290925260ff861690820152606081018490526080810183905260a0016020604051602081039080840390855afa158015613025573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161304f57600080fd5b898460ff1681518110613064576130646146f9565b60200260200101516001600160a01b0316876001600160a01b03161461308957600080fd5b86975050505050508061309b9061470f565b9050612f9b565b5050506001600160a01b03909716600090815260146020526040902095909555505050505050565b60648211156130d857600080fd5b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561314957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161312b575b50505091909252505081516020830151929350916000915061316b90426146e2565b604084015190915060006131876370e1928160e11b888361234c565b90506000808060008060008060005b8b811015613292576131a88e82613b62565b9399509197509550935091508a86116131c057600080fd5b60016131cc8a88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561321a573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161324457600080fd5b898560ff1681518110613259576132596146f9565b60200260200101516001600160a01b0316876001600160a01b03161461327e57600080fd5b8697508061328b9061470f565b9050613196565b50505060099b909b555050505050505050505050565b6040805160e0810182526009548152600a546020808301829052600b5483850152600c5460608401819052600d546001600160a01b039081166080860152600e54811660a0860152600f54811660c0860181905260105487516321d5e88b60e11b8152975160009889988998899891979690959416926343abd1169260048181019392918290030181865afa158015613345573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133699190614791565b94509450945094505090919293565b613380613afd565b60408051606081018252600180548252600254602080840191909152600380548551818402810184018752818152600096860193909291908301828280156133f157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116133d3575b50505091909252505081516020830151929350916000915061341390426146e2565b6040840151909150600080808080808080613436637785bc9160e11b8f8361234c565b905060005b8b8110156135375761344d8e82613b62565b939a509198509650945092508a871161346557600080fd5b60016134718389613b91565b6040805160008152602081018083529290925260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156134bf573d6000803e3d6000fd5b505050602060405103519750886001600160a01b0316886001600160a01b0316116134e957600080fd5b898660ff16815181106134fe576134fe6146f9565b60200260200101516001600160a01b0316886001600160a01b03161461352357600080fd5b879850806135309061470f565b905061343b565b5061354c89518f606491028101600019010490565b9a5060028b101561359f5760405162461bcd60e51b815260206004820152601f60248201527f4d616e616765722063616e6e6f74206265206c657373207468616e2074776f006044820152606401610fea565b5050506001979097555050506005879055506124a59350613bfe92505050565b336135d26012546001600160a01b031690565b6001600160a01b0316146135fb5760405163118cdaa760e01b8152336004820152602401610fea565b600454600a141561363f5760405162461bcd60e51b815260206004820152600e60248201526d6f6e6c7920696e6974206f6e636560901b6044820152606401610fea565b603c8310158015613651575060648311155b61365a57600080fd5b600a600455601080546001600160a01b0319166001600160a01b0386161790558051600381101561369d5760405162461bcd60e51b8152600401610fea90614b53565b60015b8181101561371257826136b46001836146e2565b815181106136c4576136c46146f9565b60200260200101516001600160a01b03168382815181106136e7576136e76146f9565b60200260200101516001600160a01b03161161370257600080fd5b61370b8161470f565b90506136a0565b50604080516060810182526064838702606301048082526020808301879052928201859052600190815560028690558451919290916137579160039190870190613ea5565b505086516009555050506020840151600a55506040830151600b556060830151600c556080830151600d80546001600160a01b03199081166001600160a01b039384161790915560a0850151600e8054831691841691909117905560c090940151600f805490951691161790925550600555565b6137d3613afd565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561384457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613826575b505050919092525050506040810151815191925090600061386e63fa378a4f60e01b888884610833565b9050600084602001514261388291906146e2565b90506000808060008060008060005b8a81101561398d576138a38e82613b62565b9399509197509550935091508886116138bb57600080fd5b60016138c78b88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015613915573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161393f57600080fd5b8b8560ff1681518110613954576139546146f9565b60200260200101516001600160a01b0316876001600160a01b03161461397957600080fd5b869750806139869061470f565b9050613891565b5050505050505050505060008251905060038110156139be5760405162461bcd60e51b8152600401610fea90614b53565b866001600160a01b03168387815181106139da576139da6146f9565b60200260200101516001600160a01b031614613a2f5760405162461bcd60e51b81526020600482015260146024820152731859191c995cdcc81a5cc81b9bdd08195e1a5cdd60621b6044820152606401610fea565b613a3a6001826146e2565b9050855b81811015613aa45783613a52826001614b94565b81518110613a6257613a626146f9565b6020026020010151848281518110613a7c57613a7c6146f9565b6001600160a01b0390921660209283029190910190910152613a9d8161470f565b9050613a3e565b508251613ab8906003906020860190613ea5565b506003805480613aca57613aca614bac565b600082815260209020810160001990810180546001600160a01b0319169055019055600554606490820260630104610bff565b60026000541415613b2157604051633ee5aeb560e01b815260040160405180910390fd5b6002600055565b6000601960f81b600160f81b613b3c613e4b565b6006805486916000613b4d8361470f565b919050556040516020016124d1929190614b31565b6062020160208101516040820151606083015160808401516081909401519094600094851a949190911a929190565b6000808383604051602001613bb0929190918252602082015260400190565b6040516020818303038152906040528051906020012090507f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005280601c52603c60002091505092915050565b6001600055565b6001600160a01b038316613c7557600e546040516001600160601b0319606085901b166020820152603481018390526001600160a01b039091169063baaad1be906054015b6040516020818303038152906040526040518263ffffffff1660e01b815260040161101f91906147e8565b600e54604080516001600160a01b03858116602483015260448083018690528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b1790529251931692637dd393ea92613c4a928892909101614bc2565b600083821115613ce857508281035b8015611dd45782811115611dd457509092915050565b600080600080612710856020015188613d179190614bfa565b613d219190614c19565b93506001600160a01b038616613d38576000613d54565b6064856060015185613d4a9190614bfa565b613d549190614c19565b9250613d6083856146e2565b9150613d6c84886146e2565b905093509350935093565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b17905291516000928392839291871691613dd19190614c3b565b600060405180830381855afa9150503d8060008114613e0c576040519150601f19603f3d011682016040523d82523d6000602084013e613e11565b606091505b5091509150818015613e2557506020815110155b613e2e57600080fd5b80806020019051810190613e429190614765565b95945050505050565b604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218602082015246918101829052306060820152600091906080016040516020818303038152906040528051906020012091505090565b828054828255906000526020600020908101928215613efa579160200282015b82811115613efa57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613ec5565b50613f06929150613f0a565b5090565b5b80821115613f065760008155600101613f0b565b6001600160a01b038116811461172157600080fd5b8035613f3f81613f1f565b919050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715613f7c57613f7c613f44565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613faa57613faa613f44565b604052919050565b60006001600160401b03821115613fcb57613fcb613f44565b50601f01601f191660200190565b600082601f830112613fea57600080fd5b8135613ffd613ff882613fb2565b613f82565b81815284602083860101111561401257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561404457600080fd5b833561404f81613f1f565b92506020840135915060408401356001600160401b0381111561407157600080fd5b61407d86828701613fd9565b9150509250925092565b6000806040838503121561409a57600080fd5b82356140a581613f1f565b915060208301356001600160401b038111156140c057600080fd5b6140cc85828601613fd9565b9150509250929050565b600080604083850312156140e957600080fd5b82356140f481613f1f565b946020939093013593505050565b60006001600160401b0382111561411b5761411b613f44565b5060051b60200190565b600082601f83011261413657600080fd5b81356020614146613ff883614102565b82815260059290921b8401810191818101908684111561416557600080fd5b8286015b8481101561418957803561417c81613f1f565b8352918301918301614169565b509695505050505050565b6000806000606084860312156141a957600080fd5b8335925060208401356141bb81613f1f565b915060408401356001600160401b038111156141d657600080fd5b61407d86828701614125565b6000602082840312156141f457600080fd5b81356001600160401b0381111561420a57600080fd5b61421684828501614125565b949350505050565b60008060006060848603121561423357600080fd5b83356001600160401b0381111561424957600080fd5b8401601f8101861361425a57600080fd5b8035602061426a613ff883614102565b82815260059290921b8301810191818101908984111561428957600080fd5b938201935b838510156142a75784358252938201939082019061428e565b96506142b69050878201613f34565b9450505050604084013590509250925092565b6000602082840312156142db57600080fd5b8135611dd481613f1f565b600080600080606085870312156142fc57600080fd5b84356001600160401b038082111561431357600080fd5b818701915087601f83011261432757600080fd5b81358181111561433657600080fd5b88602082850101111561434857600080fd5b602092830196509450508501359150604085013561436581613f1f565b939692955090935050565b60005b8381101561438b578181015183820152602001614373565b8381111561228c5750506000910152565b600081518084526143b4816020860160208601614370565b601f01601f19169290920160200192915050565b8215158152604060208201526000614216604083018461439c565b6000806000604084860312156143f857600080fd5b833561440381613f1f565b925060208401356001600160401b038082111561441f57600080fd5b818601915086601f83011261443357600080fd5b81358181111561444257600080fd5b8760208260051b850101111561445757600080fd5b6020830194508093505050509250925092565b600081518084526020808501945080840160005b8381101561449a5781518752958201959082019060010161447e565b509495945050505050565b602081526000611dd4602083018461446a565b6000806000606084860312156144cd57600080fd5b833592506020840135915060408401356001600160401b0381111561407157600080fd5b6000806040838503121561450457600080fd5b8235915060208301356001600160401b038111156140c057600080fd5b60006020828403121561453357600080fd5b81356001600160401b0381111561454957600080fd5b61421684828501613fd9565b600081518084526020808501945080840160005b8381101561449a5781516001600160a01b031687529582019590820190600101614569565b838152826020820152606060408201526000613e426060830184614555565b6000602082840312156145bf57600080fd5b5035919050565b60008060008060008587036101608112156145e057600080fd5b60e08112156145ee57600080fd5b506145f7613f5a565b86358152602087013560208201526040870135604082015260608701356060820152608087013561462781613f1f565b608082015260a087013561463a81613f1f565b60a082015260c087013561464d81613f1f565b60c0820152945061466060e08701613f34565b9350610100860135925061012086013591506101408601356001600160401b0381111561468c57600080fd5b61469888828901614125565b9150509295509295909350565b60018060a01b0384168152826020820152606060408201526000613e42606083018461439c565b634e487b7160e01b600052601160045260246000fd5b6000828210156146f4576146f46146cc565b500390565b634e487b7160e01b600052603260045260246000fd5b6000600019821415614723576147236146cc565b5060010190565b600081614739576147396146cc565b506000190190565b6001600160a01b03831681526040602082018190526000906142169083018461439c565b60006020828403121561477757600080fd5b5051919050565b602081526000611dd46020830184614555565b6000602082840312156147a357600080fd5b8151611dd481613f1f565b600084516147c0818460208901614370565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b602081526000611dd4602083018461439c565b6000845161480d818460208901614370565b606085901b6001600160601b0319169083019081528351614835816014840160208801614370565b0160140195945050505050565b606081526000614855606083018661446a565b6001600160a01b039490941660208301525060400152919050565b6000806040838503121561488357600080fd5b505080516020909101519092909150565b60608152836060820152838560808301376000608085830181019190915260208201939093526001600160a01b03919091166040820152601f909201601f191690910101919050565b600080604083850312156148f057600080fd5b8251801515811461490057600080fd5b60208401519092506001600160401b0381111561491c57600080fd5b8301601f8101851361492d57600080fd5b805161493b613ff882613fb2565b81815286602083850101111561495057600080fd5b614961826020830160208601614370565b8093505050509250929050565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b0383111561499e57600080fd5b8260051b8085606085013760009201606001918252509392505050565b600060208083850312156149ce57600080fd5b82516001600160401b038111156149e457600080fd5b8301601f810185136149f557600080fd5b8051614a03613ff882614102565b81815260059190911b82018301908381019087831115614a2257600080fd5b928401925b82841015614a4057835182529284019290840190614a27565b979650505050505050565b838152826020820152606060408201526000613e42606083018461439c565b600080600060608486031215614a7f57600080fd5b83519250602080850151925060408501516001600160401b03811115614aa457600080fd5b8501601f81018713614ab557600080fd5b8051614ac3613ff882614102565b81815260059190911b82018301908381019089831115614ae257600080fd5b928401925b82841015614b09578351614afa81613f1f565b82529284019290840190614ae7565b80955050505050509250925092565b828152604060208201526000614216604083018461439c565b604081526000614b44604083018561439c565b90508260208301529392505050565b60208082526021908201527f4d616e616765722063616e6e6f74206265206c657373207468616e20746872656040820152606560f81b606082015260800190565b60008219821115614ba757614ba76146cc565b500190565b634e487b7160e01b600052603160045260246000fd5b6bffffffffffffffffffffffff198360601b16815260008251614bec816014850160208701614370565b919091016014019392505050565b6000816000190483118215151615614c1457614c146146cc565b500290565b600082614c3657634e487b7160e01b600052601260045260246000fd5b500490565b60008251614c4d818460208701614370565b919091019291505056fea26469706673582212202a2692f32a12b9c2506b095ed9baedc9aa85e16dbfa3604372af967c23236cf764736f6c634300080c0033
Deployed Bytecode
0x60806040526004361061021c5760003560e01c80638e83e0ab11610122578063cd19f95f116100a5578063ec797d251161006c578063ec797d25146106d0578063ef0b792214610714578063f42c660314610734578063f72a60fd14610754578063fa378a4f1461077457005b8063cd19f95f1461062c578063d0efff9614610650578063d163642114610670578063d890bdf414610690578063e1c32502146106b057005b8063affed0e0116100e9578063affed0e0146105a3578063b5e1e3bf146105b9578063c2d53eb4146105d7578063c39bf23e146105ec578063cd119ca91461060c57005b80638e83e0ab146104a257806395722e66146104c2578063a2deadbd146104e2578063a5ff765114610502578063aa2651381461058357005b806345e06903116101aa5780635c21b103116101715780635c21b103146103f4578063606dbcbf14610422578063822dd9a41461044f57806384e7fc8b1461046f5780638da5cb5b1461048457005b806345e069031461032f57806347a131f91461034f578063495069e21461036f57806351165755146103a757806357a98b7a146103c757005b80632c35ec4e116101ee5780632c35ec4e146102995780632c49d169146102b957806337ba1dbd146102d95780633b4a0032146102f95780633d5ec7691461030f57005b806312a69b48146102255780631902fe6f1461024e578063200d2ed2146102635780632b8b19901461027957005b3661022357005b005b34801561023157600080fd5b5061023b60085481565b6040519081526020015b60405180910390f35b34801561025a57600080fd5b5060055461023b565b34801561026f57600080fd5b5061023b60045481565b34801561028557600080fd5b5061022361029436600461402f565b610794565b3480156102a557600080fd5b506102236102b4366004614087565b610c15565b3480156102c557600080fd5b506102236102d43660046140d6565b610e36565b3480156102e557600080fd5b506102236102f4366004614194565b610f86565b34801561030557600080fd5b5061023b60115481565b34801561031b57600080fd5b5061022361032a3660046141e2565b61104d565b34801561033b57600080fd5b5061022361034a366004614087565b611724565b34801561035b57600080fd5b5061022361036a3660046140d6565b61190f565b34801561037b57600080fd5b5060105461038f906001600160a01b031681565b6040516001600160a01b039091168152602001610245565b3480156103b357600080fd5b506102236103c236600461421e565b611a0f565b3480156103d357600080fd5b5061023b6103e23660046142c9565b60146020526000908152604090205481565b34801561040057600080fd5b5061041461040f3660046142e6565b611b46565b6040516102459291906143c8565b34801561042e57600080fd5b5061044261043d3660046143e3565b611c91565b60405161024591906144a5565b34801561045b57600080fd5b5061022361046a3660046144b8565b611ddb565b34801561047b57600080fd5b50610223612156565b34801561049057600080fd5b506012546001600160a01b031661038f565b3480156104ae57600080fd5b506102236104bd3660046144f1565b612292565b3480156104ce57600080fd5b5060075461038f906001600160a01b031681565b3480156104ee57600080fd5b5061023b6104fd366004614521565b6124a9565b34801561050e57600080fd5b50600954600a54600b54600c54600d54600e54600f5461053f96959493926001600160a01b03908116928116911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e001610245565b34801561058f57600080fd5b5061022361059e3660046140d6565b612530565b3480156105af57600080fd5b5061023b60065481565b3480156105c557600080fd5b50600e546001600160a01b031661038f565b3480156105e357600080fd5b50610223612666565b3480156105f857600080fd5b50610223610607366004614087565b6127b6565b34801561061857600080fd5b506102236106273660046144f1565b61299b565b34801561063857600080fd5b50610641612b6b565b6040516102459392919061458e565b34801561065c57600080fd5b5061022361066b3660046145ad565b612c10565b34801561067c57600080fd5b5061022361068b3660046145ad565b612dc0565b34801561069c57600080fd5b506102236106ab36600461402f565b612ee4565b3480156106bc57600080fd5b506102236106cb3660046144f1565b6130ca565b3480156106dc57600080fd5b506106e56132a8565b6040805194855260208501939093526001600160a01b0391821692840192909252166060820152608001610245565b34801561072057600080fd5b5061022361072f3660046144f1565b613378565b34801561074057600080fd5b5060135461038f906001600160a01b031681565b34801561076057600080fd5b5061022361076f3660046145c6565b6135bf565b34801561078057600080fd5b5061022361078f36600461402f565b6137cb565b61079c613afd565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561080d57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116107ef575b50505091909252505050604081015181519192509060006108a76302b8b19960e41b8888845b6040519080825280601f01601f19166020018201604052801561085d576020820181803683370190505b50604051602401610870939291906146a5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613b28565b905060008460200151426108bb91906146e2565b90506000808060008060008060005b8a8110156109c6576108dc8e82613b62565b9399509197509550935091508886116108f457600080fd5b60016109008b88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561094e573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161097857600080fd5b8b8560ff168151811061098d5761098d6146f9565b60200260200101516001600160a01b0316876001600160a01b0316146109b257600080fd5b869750806109bf9061470f565b90506108ca565b50508951975050508a15159450610a19935050505057826000815181106109ef576109ef6146f9565b60200260200101516001600160a01b0316876001600160a01b031610610a1457600080fd5b610ae4565b80861015610a9857828681518110610a3357610a336146f9565b60200260200101516001600160a01b0316876001600160a01b0316108015610a8f575082610a626001886146e2565b81518110610a7257610a726146f9565b60200260200101516001600160a01b0316876001600160a01b0316115b610a1457600080fd5b8086148015610adb575082610aae6001886146e2565b81518110610abe57610abe6146f9565b60200260200101516001600160a01b0316876001600160a01b0316115b610ae457600080fd5b60038054600101808255600082905260408051602080840282018101909252828152929190830182828015610b4257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610b24575b509396508493505050505b86811115610bb35783610b616001836146e2565b81518110610b7157610b716146f9565b6020026020010151848281518110610b8b57610b8b6146f9565b6001600160a01b0390921660209283029190910190910152610bac8161472a565b9050610b4d565b5086838781518110610bc757610bc76146f9565b6001600160a01b039092166020928302919091018201528351610bf09160039190860190613ea5565b50825160055460649102606301045b60015550610c109250613bfe915050565b505050565b6040805160608101825260018054825260025460208084019190915260038054855181840281018401875281815260009686019390929190830182828015610c8657602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610c68575b505050919092525050815160208301519293509160009150610ca890426146e2565b60408401519091506000610cfc63161af62760e11b88835b6040519080825280601f01601f191660200182016040528015610cea576020820181803683370190505b50604051602401610870929190614741565b9050600080805b86811015610e0a576000806000806000610d1d8e87613b62565b945094509450945094508a8511610d3357600080fd5b6001610d3f8a87613b91565b6040805160008152602081018083529290925260ff861690820152606081018490526080810183905260a0016020604051602081039080840390855afa158015610d8d573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b031611610db757600080fd5b898460ff1681518110610dcc57610dcc6146f9565b60200260200101516001600160a01b0316876001600160a01b031614610df157600080fd5b869750505050505080610e039061470f565b9050610d03565b5050601380546001600160a01b0319166001600160a01b03999099169890981790975550505050505050565b60006001600201805480602002602001604051908101604052809291908181526020018280548015610e9157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e73575b5050835193945033925060009150505b82811015610f7e57838181518110610ebb57610ebb6146f9565b60200260200101516001600160a01b0316826001600160a01b03161415610f6e57600754610ef49087906001600160a01b031687613c05565b600754604051631c05ca9160e21b81526001600160a01b038881166004830152909116906370172a44906024015b6020604051808303816000875af1158015610f41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190614765565b50505050505050565b610f778161470f565b9050610ea1565b505050505050565b6003805433919085908110610f9d57610f9d6146f9565b6000918252602090912001546001600160a01b031614610ff35760405162461bcd60e51b815260206004820152600c60248201526b37b7363c9036b0b730b3b2b960a11b60448201526064015b60405180910390fd5b60405163312d6d7960e11b81526001600160a01b0383169063625adaf29061101f90849060040161477e565b600060405180830381600087803b15801561103957600080fd5b505af1158015610f65573d6000803e3d6000fd5b611055613afd565b6040805160e0810182526009548152600a546020820152600b54918101829052600c546060820152600d546001600160a01b039081166080830152600e54811660a0830152600f541660c08201526008549091906110b390426146e2565b1161110a5760405162461bcd60e51b815260206004820152602160248201527f42616c616e63652066756e647320696e74657276616c2074696d65206c696d696044820152601d60fa1b6064820152608401610fea565b42600855608081015160a0820151600080805260146020527f4f26c3876aa9f4b92579780beea1161a61f87ebf1ec6ee865b299e447ecba99c546060936001600160a01b039081163193163191906111659084908490613cd9565b90506000806000806000806001600160a01b03168a60c001516001600160a01b0316146111f5578960c001516001600160a01b031663dfdf3c0f6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f29190614791565b90505b601054604080516321d5e88b60e11b815290516000926001600160a01b0316916343abd1169160048083019260209291908290030181865afa15801561123f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112639190614791565b905086156113ab5761127687838d613cfe565b60808f0151604051949a50929850909650945061129a918c919086906020016147ae565b60405160208183030381529060405299508981856040516020016112c0939291906147ae565b60408051601f1981840301815291905299506001600160a01b03821615611308578982866040516020016112f6939291906147ae565b60405160208183030381529060405299505b6040805185815260208101859052869188916000917f997949b68a7acda536ce262804beb274a3112dd32918fcf92c3dee2f13995f4e910160405180910390a48a60a001516001600160a01b031663baaad1be8b6040518263ffffffff1660e01b815260040161137891906147e8565b600060405180830381600087803b15801561139257600080fd5b505af11580156113a6573d6000803e3d6000fd5b505050505b606060005b8d518110156116a0576113e08e82815181106113ce576113ce6146f9565b60200260200101518e60800151613d77565b9a506114098e82815181106113f7576113f76146f9565b60200260200101518e60a00151613d77565b995060008e828151811061141f5761141f6146f9565b602002602001015190506114598c8c60146000856001600160a01b03166001600160a01b0316815260200190815260200160002054613cd9565b99505088156116905761146d89858f613cfe565b809850819950829a50839b5050505050818e8281518110611490576114906146f9565b602002602001015163a9059cbb8f60800151886040516024016114c89291906001600160a01b03929092168252602082015260400190565b60408051601f19818403018152918152602080830180516001600160e01b031660e09590951b9490941790935251611502949392016147fb565b6040516020818303038152906040529150818e8281518110611526576115266146f9565b602090810291909101810151604080516001600160a01b038816602482015260448082018c9052825180830390910181526064909101825280840180516001600160e01b031663a9059cbb60e01b17905290516115849493016147fb565b60408051601f1981840301815291905291506001600160a01b0384161561162857818e82815181106115b8576115b86146f9565b602090810291909101810151604080516001600160a01b038916602482015260448082018d9052825180830390910181526064909101825280840180516001600160e01b031663a9059cbb60e01b17905290516116169493016147fb565b60405160208183030381529060405291505b86888f838151811061163c5761163c6146f9565b60200260200101516001600160a01b03167f997949b68a7acda536ce262804beb274a3112dd32918fcf92c3dee2f13995f4e8989604051611687929190918252602082015260400190565b60405180910390a45b6116998161470f565b90506113b0565b5080511561170b578b60a001516001600160a01b0316637dd393ea826040518263ffffffff1660e01b81526004016116d891906147e8565b600060405180830381600087803b1580156116f257600080fd5b505af1158015611706573d6000803e3d6000fd5b505050505b5050505050505050505050506117216001600055565b50565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561179557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611777575b5050509190925250508151602083015192935091600091506117b790426146e2565b604084015190915060006117d36345e0690360e01b8883610cc0565b90506000808060008060008060005b8b8110156118de576117f48e82613b62565b9399509197509550935091508a861161180c57600080fd5b60016118188a88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611866573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161189057600080fd5b898560ff16815181106118a5576118a56146f9565b60200260200101516001600160a01b0316876001600160a01b0316146118ca57600080fd5b869750806118d79061470f565b90506117e2565b5050600d80546001600160a01b0319166001600160a01b039e909e169d909d17909c55505050505050505050505050565b6000600160020180548060200260200160405190810160405280929190818152602001828054801561196a57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161194c575b5050835193945033925060009150505b82811015610f7e57838181518110611994576119946146f9565b60200260200101516001600160a01b0316826001600160a01b031614156119ff576007546119cd9087906001600160a01b031687613c05565b600754604051632c0856db60e21b81526001600160a01b0388811660048301529091169063b0215b6c90602401610f22565b611a088161470f565b905061197a565b60006001600201805480602002602001604051908101604052809291908181526020018280548015611a6a57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611a4c575b5050835193945033925060009150505b82811015610f6557838181518110611a9457611a946146f9565b60200260200101516001600160a01b0316826001600160a01b03161415611b3657600754604051635116575560e01b81526001600160a01b0390911690635116575590611ae9908a908a908a90600401614842565b60408051808303816000875af1158015611b07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2b9190614870565b505050505050505050565b611b3f8161470f565b9050611a7a565b60038054604080516020808402820181019092528281526000936060938593830182828015611b9e57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611b80575b5050835193945033925060009150505b82811015611c8357838181518110611bc857611bc86146f9565b60200260200101516001600160a01b0316826001600160a01b03161415611c7357600754604051635c21b10360e01b81526001600160a01b0390911690635c21b10390611c1f908d908d908d908d90600401614894565b6000604051808303816000875af1158015611c3e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611c6691908101906148dd565b9550955050505050611c88565b611c7c8161470f565b9050611bae565b505050505b94509492505050565b606060006001600201805480602002602001604051908101604052809291908181526020018280548015611cee57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611cd0575b5050835193945033925060009150505b82811015611dcf57838181518110611d1857611d186146f9565b60200260200101516001600160a01b0316826001600160a01b03161415611dbf5760075460405163606dbcbf60e01b81526001600160a01b039091169063606dbcbf90611d6d908b908b908b9060040161496e565b6000604051808303816000875af1158015611d8c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611db491908101906149bb565b945050505050611dd4565b611dc88161470f565b9050611cfe565b505050505b9392505050565b60408051600080825260208201909252611e099063208b766960e21b90610870908790879060448101614a4b565b905060006001604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015611e8757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611e69575b505050919092525050815160208301519293509160009150611ea990426146e2565b60408401519091506000808080808080805b8a811015611fb757611ecd8e82613b62565b939950919750955093509150898611611ee557600080fd5b6001611ef18e88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015611f3f573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b031611611f6957600080fd5b888560ff1681518110611f7e57611f7e6146f9565b60200260200101516001600160a01b0316876001600160a01b031614611fa357600080fd5b86975080611fb09061470f565b9050611ebb565b50600080601060009054906101000a90046001600160a01b03166001600160a01b031663cd19f95f6040518163ffffffff1660e01b8152600401600060405180830381865afa15801561200e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120369190810190614a6a565b92509250506120458f8d613b62565b939a5091985096509450925081871161205d57600080fd5b60016120698f89613b91565b6040805160008152602081018083529290925260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156120b7573d6000803e3d6000fd5b505050602060405103519750808660ff16815181106120d8576120d86146f9565b60200260200101516001600160a01b0316886001600160a01b0316146121395760405162461bcd60e51b81526020600482015260166024820152752bb2b119902830bc9026b0b730b3b2b91022b93937b960511b6044820152606401610fea565b505050600c9d909d55505050600a98909855505050505050505050565b600060016002018054806020026020016040519081016040528092919081815260200182805480156121b157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612193575b5050835193945033925060009150505b8281101561228c578381815181106121db576121db6146f9565b60200260200101516001600160a01b0316826001600160a01b0316141561227c57600760009054906101000a90046001600160a01b03166001600160a01b03166384e7fc8b6040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612251573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122759190614765565b5050505050565b6122858161470f565b90506121c1565b50505050565b61229a613afd565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561230b57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116122ed575b50505091909252505081516020830151929350916000915061232d90426146e2565b6040840151909150600080808080808080612388638e83e0ab60e01b8f835b6040519080825280601f01601f191660200182016040528015612376576020820181803683370190505b50604051602401610870929190614b18565b905060005b8b8110156124895761239f8e82613b62565b939a509198509650945092508a87116123b757600080fd5b60016123c38389613b91565b6040805160008152602081018083529290925260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612411573d6000803e3d6000fd5b505050602060405103519750886001600160a01b0316886001600160a01b03161161243b57600080fd5b898660ff1681518110612450576124506146f9565b60200260200101516001600160a01b0316886001600160a01b03161461247557600080fd5b879850806124829061470f565b905061238d565b50505060028c9055506124a59850613bfe975050505050505050565b5050565b6000601960f81b600160f81b6124bd613e4b565b6006546040516124d1918791602001614b31565b60408051808303601f190181529082905280516020918201206001600160f81b03199586169183019190915292909316602184015260228301526042820152606201604051602081830303815290604052805190602001209050919050565b6000600160020180548060200260200160405190810160405280929190818152602001828054801561258b57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161256d575b5050835193945033925060009150505b82811015610f7e578381815181106125b5576125b56146f9565b60200260200101516001600160a01b0316826001600160a01b0316141561265657600754604051631544ca2760e31b81526001600160a01b038881166004830152602482018890529091169063aa2651389060440160408051808303816000875af1158015612628573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061264c9190614870565b5050505050505050565b61265f8161470f565b905061259b565b601154600a14156126aa5760405162461bcd60e51b815260206004820152600e60248201526d6f6e6c7920696e6974206f6e636560901b6044820152606401610fea565b763d602d80600a3d3981f3363d3d373d3d3d363d7358833360009081527f17b38d33f6f27dd56f4c132e42ac14d82b5af43d82803e903d91602b57fd5bf36020527358833317b38d33f6f27dd56f4c132e42ac14d82b7f21622f2554745826ee3002d92aa2b5bc3f03d524d519610ce5d6c103f4a8064e806037600985f5600780546001600160a01b0319166001600160a01b038316908117909155604080516330b54fad60e21b81529051929550909163c2d53eb49160048082019260009290919082900301818387803b15801561278257600080fd5b505af1158015612796573d6000803e3d6000fd5b5050600a6011555050601280546001600160a01b03191633179055505050565b60006127ca6361cdf91f60e11b8483610cc0565b90506000806000601060009054906101000a90046001600160a01b03166001600160a01b031663cd19f95f6040518163ffffffff1660e01b8152600401600060405180830381865afa158015612824573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261284c9190810190614a6a565b91945092509050600061285f83426146e2565b90506000808060008060008060005b8b81101561296a576128808e82613b62565b93995091975095509350915088861161289857600080fd5b60016128a48e88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa1580156128f2573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161291c57600080fd5b898560ff1681518110612931576129316146f9565b60200260200101516001600160a01b0316876001600160a01b03161461295657600080fd5b869750806129639061470f565b905061286e565b5050600f80546001600160a01b0319166001600160a01b039e909e169d909d17909c55505050505050505050505050565b6040805160608101825260018054825260025460208084019190915260038054855181840281018401875281815260009686019390929190830182828015612a0c57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116129ee575b505050919092525050815160208301519293509160009150612a2e90426146e2565b60408401519091506000612a4a63cd119ca960e01b888361234c565b90506000808060008060008060005b8b811015612b5557612a6b8e82613b62565b9399509197509550935091508a8611612a8357600080fd5b6001612a8f8a88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015612add573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b031611612b0757600080fd5b898560ff1681518110612b1c57612b1c6146f9565b60200260200101516001600160a01b0316876001600160a01b031614612b4157600080fd5b86975080612b4e9061470f565b9050612a59565b505050600b9b909b555050505050505050505050565b600080606060006001604051806060016040529081600082015481526020016001820154815260200160028201805480602002602001604051908101604052809291908181526020018280548015612bec57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612bce575b50505091909252505081516020830151604090930151909792965094509092505050565b60006001600201805480602002602001604051908101604052809291908181526020018280548015612c6b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612c4d575b5050835193945033925060009150505b8281101561227557838181518110612c9557612c956146f9565b60200260200101516001600160a01b0316826001600160a01b03161415612db0576007546040805163bc14ebe760e01b81529051612d37926001600160a01b03169163bc14ebe79160048083019260209291908290030181865afa158015612d01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d259190614791565b6007546001600160a01b031687613c05565b600760009054906101000a90046001600160a01b03166001600160a01b03166358e8d3006040518163ffffffff1660e01b81526004016020604051808303816000875af1158015612d8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f7e9190614765565b612db98161470f565b9050612c7b565b60006001600201805480602002602001604051908101604052809291908181526020018280548015612e1b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612dfd575b5050835193945033925060009150505b8281101561227557838181518110612e4557612e456146f9565b60200260200101516001600160a01b0316826001600160a01b03161415612ed45760075460405163d163642160e01b8152600481018790526001600160a01b039091169063d16364219060240160408051808303816000875af1158015612eb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f659190614870565b612edd8161470f565b9050612e2b565b6040805160608101825260018054825260025460208084019190915260038054855181840281018401875281815260009686019390929190830182828015612f5557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612f37575b505050919092525050815160208301519293509160009150612f7790426146e2565b60408401519091506000612f946336242f7d60e21b898984610833565b9050600080805b868110156130a2576000806000806000612fb58e87613b62565b945094509450945094508a8511612fcb57600080fd5b6001612fd78a87613b91565b6040805160008152602081018083529290925260ff861690820152606081018490526080810183905260a0016020604051602081039080840390855afa158015613025573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161304f57600080fd5b898460ff1681518110613064576130646146f9565b60200260200101516001600160a01b0316876001600160a01b03161461308957600080fd5b86975050505050508061309b9061470f565b9050612f9b565b5050506001600160a01b03909716600090815260146020526040902095909555505050505050565b60648211156130d857600080fd5b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561314957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161312b575b50505091909252505081516020830151929350916000915061316b90426146e2565b604084015190915060006131876370e1928160e11b888361234c565b90506000808060008060008060005b8b811015613292576131a88e82613b62565b9399509197509550935091508a86116131c057600080fd5b60016131cc8a88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa15801561321a573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161324457600080fd5b898560ff1681518110613259576132596146f9565b60200260200101516001600160a01b0316876001600160a01b03161461327e57600080fd5b8697508061328b9061470f565b9050613196565b50505060099b909b555050505050505050505050565b6040805160e0810182526009548152600a546020808301829052600b5483850152600c5460608401819052600d546001600160a01b039081166080860152600e54811660a0860152600f54811660c0860181905260105487516321d5e88b60e11b8152975160009889988998899891979690959416926343abd1169260048181019392918290030181865afa158015613345573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133699190614791565b94509450945094505090919293565b613380613afd565b60408051606081018252600180548252600254602080840191909152600380548551818402810184018752818152600096860193909291908301828280156133f157602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116133d3575b50505091909252505081516020830151929350916000915061341390426146e2565b6040840151909150600080808080808080613436637785bc9160e11b8f8361234c565b905060005b8b8110156135375761344d8e82613b62565b939a509198509650945092508a871161346557600080fd5b60016134718389613b91565b6040805160008152602081018083529290925260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156134bf573d6000803e3d6000fd5b505050602060405103519750886001600160a01b0316886001600160a01b0316116134e957600080fd5b898660ff16815181106134fe576134fe6146f9565b60200260200101516001600160a01b0316886001600160a01b03161461352357600080fd5b879850806135309061470f565b905061343b565b5061354c89518f606491028101600019010490565b9a5060028b101561359f5760405162461bcd60e51b815260206004820152601f60248201527f4d616e616765722063616e6e6f74206265206c657373207468616e2074776f006044820152606401610fea565b5050506001979097555050506005879055506124a59350613bfe92505050565b336135d26012546001600160a01b031690565b6001600160a01b0316146135fb5760405163118cdaa760e01b8152336004820152602401610fea565b600454600a141561363f5760405162461bcd60e51b815260206004820152600e60248201526d6f6e6c7920696e6974206f6e636560901b6044820152606401610fea565b603c8310158015613651575060648311155b61365a57600080fd5b600a600455601080546001600160a01b0319166001600160a01b0386161790558051600381101561369d5760405162461bcd60e51b8152600401610fea90614b53565b60015b8181101561371257826136b46001836146e2565b815181106136c4576136c46146f9565b60200260200101516001600160a01b03168382815181106136e7576136e76146f9565b60200260200101516001600160a01b03161161370257600080fd5b61370b8161470f565b90506136a0565b50604080516060810182526064838702606301048082526020808301879052928201859052600190815560028690558451919290916137579160039190870190613ea5565b505086516009555050506020840151600a55506040830151600b556060830151600c556080830151600d80546001600160a01b03199081166001600160a01b039384161790915560a0850151600e8054831691841691909117905560c090940151600f805490951691161790925550600555565b6137d3613afd565b604080516060810182526001805482526002546020808401919091526003805485518184028101840187528181526000968601939092919083018282801561384457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613826575b505050919092525050506040810151815191925090600061386e63fa378a4f60e01b888884610833565b9050600084602001514261388291906146e2565b90506000808060008060008060005b8a81101561398d576138a38e82613b62565b9399509197509550935091508886116138bb57600080fd5b60016138c78b88613b91565b6040805160008152602081018083529290925260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015613915573d6000803e3d6000fd5b505050602060405103519650876001600160a01b0316876001600160a01b03161161393f57600080fd5b8b8560ff1681518110613954576139546146f9565b60200260200101516001600160a01b0316876001600160a01b03161461397957600080fd5b869750806139869061470f565b9050613891565b5050505050505050505060008251905060038110156139be5760405162461bcd60e51b8152600401610fea90614b53565b866001600160a01b03168387815181106139da576139da6146f9565b60200260200101516001600160a01b031614613a2f5760405162461bcd60e51b81526020600482015260146024820152731859191c995cdcc81a5cc81b9bdd08195e1a5cdd60621b6044820152606401610fea565b613a3a6001826146e2565b9050855b81811015613aa45783613a52826001614b94565b81518110613a6257613a626146f9565b6020026020010151848281518110613a7c57613a7c6146f9565b6001600160a01b0390921660209283029190910190910152613a9d8161470f565b9050613a3e565b508251613ab8906003906020860190613ea5565b506003805480613aca57613aca614bac565b600082815260209020810160001990810180546001600160a01b0319169055019055600554606490820260630104610bff565b60026000541415613b2157604051633ee5aeb560e01b815260040160405180910390fd5b6002600055565b6000601960f81b600160f81b613b3c613e4b565b6006805486916000613b4d8361470f565b919050556040516020016124d1929190614b31565b6062020160208101516040820151606083015160808401516081909401519094600094851a949190911a929190565b6000808383604051602001613bb0929190918252602082015260400190565b6040516020818303038152906040528051906020012090507f19457468657265756d205369676e6564204d6573736167653a0a33320000000060005280601c52603c60002091505092915050565b6001600055565b6001600160a01b038316613c7557600e546040516001600160601b0319606085901b166020820152603481018390526001600160a01b039091169063baaad1be906054015b6040516020818303038152906040526040518263ffffffff1660e01b815260040161101f91906147e8565b600e54604080516001600160a01b03858116602483015260448083018690528351808403909101815260649092018352602080830180516001600160e01b031663a9059cbb60e01b1790529251931692637dd393ea92613c4a928892909101614bc2565b600083821115613ce857508281035b8015611dd45782811115611dd457509092915050565b600080600080612710856020015188613d179190614bfa565b613d219190614c19565b93506001600160a01b038616613d38576000613d54565b6064856060015185613d4a9190614bfa565b613d549190614c19565b9250613d6083856146e2565b9150613d6c84886146e2565b905093509350935093565b604080516001600160a01b0383811660248084019190915283518084039091018152604490920183526020820180516001600160e01b03166370a0823160e01b17905291516000928392839291871691613dd19190614c3b565b600060405180830381855afa9150503d8060008114613e0c576040519150601f19603f3d011682016040523d82523d6000602084013e613e11565b606091505b5091509150818015613e2557506020815110155b613e2e57600080fd5b80806020019051810190613e429190614765565b95945050505050565b604080517f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a79469218602082015246918101829052306060820152600091906080016040516020818303038152906040528051906020012091505090565b828054828255906000526020600020908101928215613efa579160200282015b82811115613efa57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190613ec5565b50613f06929150613f0a565b5090565b5b80821115613f065760008155600101613f0b565b6001600160a01b038116811461172157600080fd5b8035613f3f81613f1f565b919050565b634e487b7160e01b600052604160045260246000fd5b60405160e081016001600160401b0381118282101715613f7c57613f7c613f44565b60405290565b604051601f8201601f191681016001600160401b0381118282101715613faa57613faa613f44565b604052919050565b60006001600160401b03821115613fcb57613fcb613f44565b50601f01601f191660200190565b600082601f830112613fea57600080fd5b8135613ffd613ff882613fb2565b613f82565b81815284602083860101111561401257600080fd5b816020850160208301376000918101602001919091529392505050565b60008060006060848603121561404457600080fd5b833561404f81613f1f565b92506020840135915060408401356001600160401b0381111561407157600080fd5b61407d86828701613fd9565b9150509250925092565b6000806040838503121561409a57600080fd5b82356140a581613f1f565b915060208301356001600160401b038111156140c057600080fd5b6140cc85828601613fd9565b9150509250929050565b600080604083850312156140e957600080fd5b82356140f481613f1f565b946020939093013593505050565b60006001600160401b0382111561411b5761411b613f44565b5060051b60200190565b600082601f83011261413657600080fd5b81356020614146613ff883614102565b82815260059290921b8401810191818101908684111561416557600080fd5b8286015b8481101561418957803561417c81613f1f565b8352918301918301614169565b509695505050505050565b6000806000606084860312156141a957600080fd5b8335925060208401356141bb81613f1f565b915060408401356001600160401b038111156141d657600080fd5b61407d86828701614125565b6000602082840312156141f457600080fd5b81356001600160401b0381111561420a57600080fd5b61421684828501614125565b949350505050565b60008060006060848603121561423357600080fd5b83356001600160401b0381111561424957600080fd5b8401601f8101861361425a57600080fd5b8035602061426a613ff883614102565b82815260059290921b8301810191818101908984111561428957600080fd5b938201935b838510156142a75784358252938201939082019061428e565b96506142b69050878201613f34565b9450505050604084013590509250925092565b6000602082840312156142db57600080fd5b8135611dd481613f1f565b600080600080606085870312156142fc57600080fd5b84356001600160401b038082111561431357600080fd5b818701915087601f83011261432757600080fd5b81358181111561433657600080fd5b88602082850101111561434857600080fd5b602092830196509450508501359150604085013561436581613f1f565b939692955090935050565b60005b8381101561438b578181015183820152602001614373565b8381111561228c5750506000910152565b600081518084526143b4816020860160208601614370565b601f01601f19169290920160200192915050565b8215158152604060208201526000614216604083018461439c565b6000806000604084860312156143f857600080fd5b833561440381613f1f565b925060208401356001600160401b038082111561441f57600080fd5b818601915086601f83011261443357600080fd5b81358181111561444257600080fd5b8760208260051b850101111561445757600080fd5b6020830194508093505050509250925092565b600081518084526020808501945080840160005b8381101561449a5781518752958201959082019060010161447e565b509495945050505050565b602081526000611dd4602083018461446a565b6000806000606084860312156144cd57600080fd5b833592506020840135915060408401356001600160401b0381111561407157600080fd5b6000806040838503121561450457600080fd5b8235915060208301356001600160401b038111156140c057600080fd5b60006020828403121561453357600080fd5b81356001600160401b0381111561454957600080fd5b61421684828501613fd9565b600081518084526020808501945080840160005b8381101561449a5781516001600160a01b031687529582019590820190600101614569565b838152826020820152606060408201526000613e426060830184614555565b6000602082840312156145bf57600080fd5b5035919050565b60008060008060008587036101608112156145e057600080fd5b60e08112156145ee57600080fd5b506145f7613f5a565b86358152602087013560208201526040870135604082015260608701356060820152608087013561462781613f1f565b608082015260a087013561463a81613f1f565b60a082015260c087013561464d81613f1f565b60c0820152945061466060e08701613f34565b9350610100860135925061012086013591506101408601356001600160401b0381111561468c57600080fd5b61469888828901614125565b9150509295509295909350565b60018060a01b0384168152826020820152606060408201526000613e42606083018461439c565b634e487b7160e01b600052601160045260246000fd5b6000828210156146f4576146f46146cc565b500390565b634e487b7160e01b600052603260045260246000fd5b6000600019821415614723576147236146cc565b5060010190565b600081614739576147396146cc565b506000190190565b6001600160a01b03831681526040602082018190526000906142169083018461439c565b60006020828403121561477757600080fd5b5051919050565b602081526000611dd46020830184614555565b6000602082840312156147a357600080fd5b8151611dd481613f1f565b600084516147c0818460208901614370565b60609490941b6001600160601b03191691909301908152601481019190915260340192915050565b602081526000611dd4602083018461439c565b6000845161480d818460208901614370565b606085901b6001600160601b0319169083019081528351614835816014840160208801614370565b0160140195945050505050565b606081526000614855606083018661446a565b6001600160a01b039490941660208301525060400152919050565b6000806040838503121561488357600080fd5b505080516020909101519092909150565b60608152836060820152838560808301376000608085830181019190915260208201939093526001600160a01b03919091166040820152601f909201601f191690910101919050565b600080604083850312156148f057600080fd5b8251801515811461490057600080fd5b60208401519092506001600160401b0381111561491c57600080fd5b8301601f8101851361492d57600080fd5b805161493b613ff882613fb2565b81815286602083850101111561495057600080fd5b614961826020830160208601614370565b8093505050509250929050565b6001600160a01b0384168152604060208201819052810182905260006001600160fb1b0383111561499e57600080fd5b8260051b8085606085013760009201606001918252509392505050565b600060208083850312156149ce57600080fd5b82516001600160401b038111156149e457600080fd5b8301601f810185136149f557600080fd5b8051614a03613ff882614102565b81815260059190911b82018301908381019087831115614a2257600080fd5b928401925b82841015614a4057835182529284019290840190614a27565b979650505050505050565b838152826020820152606060408201526000613e42606083018461439c565b600080600060608486031215614a7f57600080fd5b83519250602080850151925060408501516001600160401b03811115614aa457600080fd5b8501601f81018713614ab557600080fd5b8051614ac3613ff882614102565b81815260059190911b82018301908381019089831115614ae257600080fd5b928401925b82841015614b09578351614afa81613f1f565b82529284019290840190614ae7565b80955050505050509250925092565b828152604060208201526000614216604083018461439c565b604081526000614b44604083018561439c565b90508260208301529392505050565b60208082526021908201527f4d616e616765722063616e6e6f74206265206c657373207468616e20746872656040820152606560f81b606082015260800190565b60008219821115614ba757614ba76146cc565b500190565b634e487b7160e01b600052603160045260246000fd5b6bffffffffffffffffffffffff198360601b16815260008251614bec816014850160208701614370565b919091016014019392505050565b6000816000190483118215151615614c1457614c146146cc565b500290565b600082614c3657634e487b7160e01b600052601260045260246000fd5b500490565b60008251614c4d818460208701614370565b919091019291505056fea26469706673582212202a2692f32a12b9c2506b095ed9baedc9aa85e16dbfa3604372af967c23236cf764736f6c634300080c0033
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.