Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 11 internal transactions
[ Download CSV Export ]
Contract Name:
OkseCard
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 100 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
//SPDX-License-Identifier: LICENSED // Solidity files have to start with this pragma. // It will be used by the Solidity compiler to validate its version. pragma solidity ^0.7.0; pragma abicoder v2; // We import this library to be able to use console.log // import "hardhat/console.sol"; import "./libraries/TransferHelper.sol"; import "./interfaces/PriceOracle.sol"; import "./interfaces/ILimitManager.sol"; import "./interfaces/ILevelManager.sol"; import "./interfaces/IMarketManager.sol"; import "./interfaces/ICashBackManager.sol"; import "./interfaces/IWETH9.sol"; import "./interfaces/ISwapper.sol"; import "./interfaces/ERC20Interface.sol"; import "./interfaces/IConverter.sol"; import "./libraries/SafeMath.sol"; import "./OwnerConstants.sol"; import "./SignerRole.sol"; // This is the main building block for smart contracts. contract OkseCard is OwnerConstants, SignerRole { // bytes4 public constant PAY_MONTHLY_FEE = bytes4(keccak256(bytes('payMonthlyFee'))); bytes4 public constant PAY_MONTHLY_FEE = 0x529a8d6c; // bytes4 public constant WITHDRAW = bytes4(keccak256(bytes('withdraw'))); bytes4 public constant WITHDRAW = 0x855511cc; // bytes4 public constant BUYGOODS = bytes4(keccak256(bytes('buyGoods'))); bytes4 public constant BUYGOODS = 0xa8fd19f2; // bytes4 public constant SET_USER_MAIN_MARKET = bytes4(keccak256(bytes('setUserMainMarket'))); bytes4 public constant SET_USER_MAIN_MARKET = 0x4a22142e; // uint256 public constant CARD_VALIDATION_TIME = 10 minutes; // 30 days in prodcution uint256 public constant CARD_VALIDATION_TIME = 30 days; // 30 days in prodcution using SafeMath for uint256; address public immutable converter; address public swapper; // Price oracle address, which is used for verification of swapping assets amount address public priceOracle; address public limitManager; address public levelManager; address public marketManager; address public cashbackManager; // Governor can set followings: address public governorAddress; // Governance address /*** Main Actions ***/ // user's deposited balance. // user => ( market => balances) mapping(address => mapping(address => uint256)) public usersBalances; mapping(address => uint256) public userValidTimes; //prevent reentrancy attack uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; bool private initialized; // uint256 public timeDiff; struct SignKeys { uint8 v; bytes32 r; bytes32 s; } struct SignData { bytes4 method; uint256 id; address market; address userAddr; uint256 amount; uint256 validTime; } // emit event event UserBalanceChanged( address indexed userAddr, address indexed market, uint256 amount ); event GovernorAddressChanged( address indexed previousGovernor, address indexed newGovernor ); event MonthlyFeePaid( uint256 id, address userAddr, uint256 userValidTime, uint256 usdAmount ); event UserDeposit(address userAddr, address market, uint256 amount); event UserWithdraw( uint256 id, address userAddr, address market, uint256 amount, uint256 remainedBalance ); event SignerBuyGoods( uint256 id, address signer1, address signer2, address market, address userAddr, uint256 usdAmount ); event UserMainMarketChanged( uint256 id, address userAddr, address market, address beforeMarket ); event PriceOracleAndSwapperChanged(address priceOracle, address swapper); event WithdrawTokens(address token, address to, uint256 amount); // verified /** * Contract initialization. * * The `constructor` is executed only once when the contract is created. * The `public` modifier makes a function callable from outside the contract. */ constructor(address _converter, address _initialSigner) SignerRole(_initialSigner) { converter = _converter; // The totalSupply is assigned to transaction sender, which is the account // that is deploying the contract. } // verified receive() external payable { // require(msg.sender == WETH, 'Not WETH9'); } // verified function initialize( address _priceOracle, address _limitManager, address _levelManager, address _marketManager, address _cashbackManager, address _financialAddress, address _masterAddress, address _treasuryAddress, address _governorAddress, address _monthlyFeeAddress, address _stakeContractAddress, address _swapper ) public { require(!initialized, "ai"); // owner = _owner; // _addSigner(_owner); priceOracle = _priceOracle; limitManager = _limitManager; levelManager = _levelManager; marketManager = _marketManager; cashbackManager = _cashbackManager; treasuryAddress = _treasuryAddress; financialAddress = _financialAddress; masterAddress = _masterAddress; governorAddress = _governorAddress; monthlyFeeAddress = _monthlyFeeAddress; stakeContractAddress = _stakeContractAddress; swapper = _swapper; //private variables initialize. _status = _NOT_ENTERED; //initialize OwnerConstants arrays stakePercent = 15 * (100 + 15); buyFeePercent = 100; buyTxFee = 0.7 ether; withdrawFeePercent = 10; monthlyFeeAmount = 6.99 ether; okseMonthlyProfit = 1000; initialized = true; } /// modifier functions // verified modifier onlyGovernor() { require(_msgSender() == governorAddress, "og"); _; } // // verified modifier marketEnabled(address market) { require(IMarketManager(marketManager).marketEnable(market), "mdnd"); _; } // verified modifier noExpired(address userAddr) { require(!getUserExpired(userAddr), "user expired"); _; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ // verified modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "rc"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } modifier validSignOfUser( SignData calldata sign_data, SignKeys calldata sign_key ) { require( sign_data.userAddr == getecrecover(sign_data, sign_key), "ssst" ); _; } modifier noEmergency() { require(!IMarketManager(marketManager).emergencyStop(), "stopped"); _; } function getUserOkseBalance(address userAddr) external view returns (uint256) { return usersBalances[userAddr][IMarketManager(marketManager).OKSE()]; } // verified function getUserExpired(address _userAddr) public view returns (bool) { if (userValidTimes[_userAddr] + 25 days > block.timestamp) { return false; } return true; } // set Governance address function setGovernor(address newGovernor) public onlyGovernor { address oldGovernor = governorAddress; governorAddress = newGovernor; emit GovernorAddressChanged(oldGovernor, newGovernor); } // verified function updateSigner(address _signer, bool bAddOrRemove) public onlyGovernor { if (bAddOrRemove) { _addSigner(_signer); } else { _removeSigner(_signer); } } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function onUpdateUserBalance( address userAddr, address market, uint256 amount, uint256 beforeAmount ) internal returns (bool) { emit UserBalanceChanged(userAddr, market, amount); if (market != IMarketManager(marketManager).OKSE()) return true; return ILevelManager(levelManager).updateUserLevel(userAddr, beforeAmount); } //////////////////////////////////////////////////////////////////////////////////////////////////////////////// // newly verified function deposit(address market, uint256 amount) public marketEnabled(market) nonReentrant noEmergency { TransferHelper.safeTransferFrom( market, msg.sender, address(this), amount ); _addUserBalance(market, msg.sender, amount); emit UserDeposit(msg.sender, market, amount); } // newly verified function depositETH() public payable nonReentrant { address WETH = IMarketManager(marketManager).WETH(); require(IMarketManager(marketManager).marketEnable(WETH), "me"); IWETH9(WETH).deposit{value: msg.value}(); _addUserBalance(WETH, msg.sender, msg.value); emit UserDeposit(msg.sender, WETH, msg.value); } // verified function _addUserBalance( address market, address userAddr, uint256 amount ) internal marketEnabled(market) { uint256 beforeAmount = usersBalances[userAddr][market]; usersBalances[userAddr][market] = usersBalances[userAddr][market].add( amount ); onUpdateUserBalance( userAddr, market, usersBalances[userAddr][market], beforeAmount ); } function setUserMainMarket( uint256 id, address market, uint256 validTime, uint8 v, bytes32 r, bytes32 s ) public { address userAddr = msg.sender; uint256 chainId; assembly { chainId := chainid() } require( isSigner( ecrecover( toEthSignedMessageHash( keccak256( abi.encodePacked( this, SET_USER_MAIN_MARKET, id, userAddr, market, chainId, uint256(0), validTime ) ) ), v, r, s ) ), "summ" ); require(signatureId[id] == false, "pru"); signatureId[id] = true; require(validTime > block.timestamp, "expired"); address beforeMarket = IMarketManager(marketManager).getUserMainMarket( userAddr ); IMarketManager(marketManager).setUserMainMakret(userAddr, market); emit UserMainMarketChanged(id, userAddr, market, beforeMarket); } // verified function payMonthlyFee( uint256 id, SignData calldata _data, SignKeys calldata user_key, address market ) public nonReentrant marketEnabled(market) noEmergency validSignOfUser(_data, user_key) onlySigner { address userAddr = _data.userAddr; require(userValidTimes[userAddr] <= block.timestamp, "e"); require(monthlyFeeAmount <= _data.amount, "over paid"); require( signatureId[id] == false && _data.method == PAY_MONTHLY_FEE, "pru" ); signatureId[id] = true; // increase valid period // extend user's valid time uint256 _monthlyFee = getMonthlyFeeAmount( market == IMarketManager(marketManager).OKSE() ); userValidTimes[userAddr] = block.timestamp + CARD_VALIDATION_TIME; if (stakeContractAddress != address(0)) { _monthlyFee = (_monthlyFee * 10000) / (10000 + stakePercent); } uint256 beforeAmount = usersBalances[userAddr][market]; calculateAmount( market, userAddr, _monthlyFee, monthlyFeeAddress, stakeContractAddress, stakePercent ); onUpdateUserBalance( userAddr, market, usersBalances[userAddr][market], beforeAmount ); emit MonthlyFeePaid( id, userAddr, userValidTimes[userAddr], _monthlyFee ); } // verified function withdraw( uint256 id, address market, uint256 amount, uint256 validTime, uint8 v, bytes32 r, bytes32 s ) public nonReentrant { address userAddr = msg.sender; uint256 chainId; assembly { chainId := chainid() } require( isSigner( ecrecover( toEthSignedMessageHash( keccak256( abi.encodePacked( this, WITHDRAW, id, userAddr, market, chainId, amount, validTime ) ) ), v, r, s ) ), "ssst" ); require(signatureId[id] == false, "pru"); signatureId[id] = true; require(validTime > block.timestamp, "expired"); uint256 beforeAmount = usersBalances[userAddr][market]; // require(beforeAmount >= amount, "ib"); usersBalances[userAddr][market] = beforeAmount.sub(amount); address WETH = IMarketManager(marketManager).WETH(); if (market == WETH) { IWETH9(WETH).withdraw(amount); if (treasuryAddress != address(0)) { uint256 feeAmount = (amount * withdrawFeePercent) / 10000; if (feeAmount > 0) { TransferHelper.safeTransferETH(treasuryAddress, feeAmount); } TransferHelper.safeTransferETH( msg.sender, amount.sub(feeAmount) ); } else { TransferHelper.safeTransferETH(msg.sender, amount); } } else { if (treasuryAddress != address(0)) { uint256 feeAmount = (amount * withdrawFeePercent) / 10000; if (feeAmount > 0) { TransferHelper.safeTransfer( market, treasuryAddress, feeAmount ); } TransferHelper.safeTransfer( market, msg.sender, amount.sub(feeAmount) ); } else { TransferHelper.safeTransfer(market, msg.sender, amount); } } uint256 userBal = usersBalances[userAddr][market]; onUpdateUserBalance(userAddr, market, userBal, beforeAmount); emit UserWithdraw(id, userAddr, market, amount, userBal); } // decimal of usdAmount is 18 function buyGoods(SignData calldata _data, SignKeys[2] calldata signer_key) external nonReentrant marketEnabled(_data.market) noExpired(_data.userAddr) noEmergency { address[2] memory signers = [ getecrecover(_data, signer_key[0]), getecrecover(_data, signer_key[1]) ]; require( isSigner(signers[0]) && isSigner(signers[1]) && (signers[0] != signers[1]), "is" ); require( signatureId[_data.id] == false && _data.method == BUYGOODS, "pru" ); signatureId[_data.id] = true; require(signer_key[0].s != signer_key[1].s, ""); if (_data.market == IMarketManager(marketManager).OKSE()) { require(IMarketManager(marketManager).oksePaymentEnable(), "jsy"); } require( IMarketManager(marketManager).getUserMainMarket(_data.userAddr) == _data.market, "jsy2" ); uint256 spendAmount = _makePayment( _data.market, _data.userAddr, _data.amount ); cashBack(_data.userAddr, spendAmount); emit SignerBuyGoods( _data.id, signers[0], signers[1], _data.market, _data.userAddr, _data.amount ); } // deduce user assets using usd amount // decimal of usdAmount is 18 // verified function _makePayment( address market, address userAddr, uint256 usdAmount ) internal returns (uint256 spendAmount) { uint256 beforeAmount = usersBalances[userAddr][market]; spendAmount = calculateAmount( market, userAddr, usdAmount, masterAddress, treasuryAddress, buyFeePercent ); ILimitManager(limitManager).updateUserSpendAmount(userAddr, usdAmount); onUpdateUserBalance( userAddr, market, usersBalances[userAddr][market], beforeAmount ); } // calculate aseet amount from market and required usd amount // decimal of usdAmount is 18 // spendAmount is decimal 18 function calculateAmount( address market, address userAddr, uint256 usdAmount, address targetAddress, address feeAddress, uint256 feePercent ) internal returns (uint256 spendAmount) { uint256 _amount; address USDC = IMarketManager(marketManager).USDC(); if (feeAddress != address(0)) { _amount = usdAmount + (usdAmount * feePercent) / 10000 + buyTxFee; } else { _amount = usdAmount; } // change _amount to USDC asset amounts uint256 assetAmountIn = IConverter(converter).getAssetAmount( market, _amount, priceOracle ); assetAmountIn = assetAmountIn + (assetAmountIn * IMarketManager(marketManager).slippage()) / 10000; _amount = IConverter(converter).convertUsdAmountToAssetAmount( _amount, USDC ); uint256 userBal = usersBalances[userAddr][market]; if (market != USDC) { // we need to change somehting here, because if there are not pair {market, USDC} , then we have to add another path // so please check the path is exist and if no, please add market, weth, usdc to path address[] memory path = ISwapper(swapper).getOptimumPath( market, USDC ); uint256[] memory amounts = ISwapper(swapper).getAmountsIn( _amount, path ); require(amounts[0] < assetAmountIn, "ua"); usersBalances[userAddr][market] = userBal.sub(amounts[0]); TransferHelper.safeTransfer( path[0], ISwapper(swapper).GetReceiverAddress(path), amounts[0] ); ISwapper(swapper)._swap(amounts, path, address(this)); } else { // require(_amount <= usersBalances[userAddr][market], "uat"); require(_amount < assetAmountIn, "au"); usersBalances[userAddr][market] = userBal.sub(_amount); } require(targetAddress != address(0), "mis"); uint256 usdcAmount = IConverter(converter) .convertUsdAmountToAssetAmount(usdAmount, USDC); require(_amount >= usdcAmount, "sp"); TransferHelper.safeTransfer(USDC, targetAddress, usdcAmount); uint256 fee = _amount.sub(usdcAmount); if (feeAddress != address(0)) TransferHelper.safeTransfer(USDC, feeAddress, fee); spendAmount = IConverter(converter).convertAssetAmountToUsdAmount( _amount, USDC ); } function cashBack(address userAddr, uint256 usdAmount) internal { if (!ICashBackManager(cashbackManager).cashBackEnable()) return; uint256 cashBackPercent = ICashBackManager(cashbackManager) .getCashBackPercent( ILevelManager(levelManager).getUserLevel(userAddr) ); address OKSE = IMarketManager(marketManager).OKSE(); uint256 okseAmount = IConverter(converter).getAssetAmount( OKSE, (usdAmount * cashBackPercent) / 10000, priceOracle ); // require(ERC20Interface(OKSE).balanceOf(address(this)) >= okseAmount , "insufficient OKSE"); if (usersBalances[financialAddress][OKSE] > okseAmount) { usersBalances[financialAddress][OKSE] = usersBalances[financialAddress][OKSE] - okseAmount; //needs extra check that owner deposited how much OKSE for cashBack _addUserBalance(OKSE, userAddr, okseAmount); } } // verified function getUserAssetAmount(address userAddr, address market) public view returns (uint256) { return usersBalances[userAddr][market]; } // verified function encodePackedData(SignData calldata _data) public view returns (bytes32) { uint256 chainId; assembly { chainId := chainid() } return keccak256( abi.encodePacked( this, _data.method, _data.id, _data.userAddr, _data.market, chainId, _data.amount, _data.validTime ) ); } // verified function getecrecover(SignData calldata _data, SignKeys calldata key) public view returns (address) { uint256 chainId; assembly { chainId := chainid() } return ecrecover( toEthSignedMessageHash( keccak256( abi.encodePacked( this, _data.method, _data.id, _data.userAddr, _data.market, chainId, _data.amount, _data.validTime ) ) ), key.v, key.r, key.s ); } // verified function setPriceOracleAndSwapper( bytes calldata signData, bytes calldata keys ) public validSignOfOwner(signData, keys, "setPriceOracleAndSwapper") { (, , , bytes memory params) = abi.decode( signData, (bytes4, uint256, uint256, bytes) ); (address _priceOracle, address _swapper) = abi.decode( params, (address, address) ); priceOracle = _priceOracle; swapper = _swapper; emit PriceOracleAndSwapperChanged(priceOracle, swapper); } // owner function function withdrawTokens(bytes calldata signData, bytes calldata keys) public validSignOfOwner(signData, keys, "withdrawTokens") { (, , , bytes memory params) = abi.decode( signData, (bytes4, uint256, uint256, bytes) ); (address token, address to) = abi.decode(params, (address, address)); require(!IMarketManager(marketManager).isMarketExist(token), "me"); uint256 amount; if (token == address(0)) { amount = address(this).balance; TransferHelper.safeTransferETH(to, amount); } else { amount = ERC20Interface(token).balanceOf(address(this)); TransferHelper.safeTransfer(token, to, amount); } emit WithdrawTokens(token, to, amount); } }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.6.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; library TransferHelper { /// @notice Transfers tokens from the targeted address to the given destination /// @notice Errors with 'STF' if transfer fails /// @param token The contract address of the token to be transferred /// @param from The originating address from which the tokens will be transferred /// @param to The destination address of the transfer /// @param value The amount to be transferred function safeTransferFrom( address token, address from, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'STF'); } /// @notice Transfers tokens from msg.sender to a recipient /// @dev Errors with ST if transfer fails /// @param token The contract address of the token which will be transferred /// @param to The recipient of the transfer /// @param value The value of the transfer function safeTransfer( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'ST'); } /// @notice Approves the stipulated contract to spend the given allowance in the given token /// @dev Errors with 'SA' if transfer fails /// @param token The contract address of the token to be approved /// @param to The target of the approval /// @param value The amount of the given token the target will be allowed to spend function safeApprove( address token, address to, uint256 value ) internal { (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool))), 'SA'); } /// @notice Transfers ETH to the recipient address /// @dev Fails with `STE` /// @param to The destination of the transfer /// @param value The value to be transferred function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'STE'); } }
//SPDX-License-Identifier: UNLICENSED pragma solidity ^0.7.0; abstract contract PriceOracle { /// @notice Indicator that this is a PriceOracle contract (for inspection) bool public constant isPriceOracle = true; /** * @notice Get the underlying price of a cToken asset * @param market The cToken to get the underlying price of * @return The underlying asset price mantissa (scaled by 1e18). * Zero means the price is unavailable. */ function getUnderlyingPrice(address market) external virtual view returns (uint); }
// SPDX-License-Identifier: LICENSED pragma solidity ^0.7.0; interface ILimitManager { function getUserLimit(address userAddr) external view returns (uint256); function getDailyLimit(uint256 level) external view returns (uint256); function getSpendAmountToday(address userAddr) external view returns (uint256); function withinLimits(address userAddr, uint256 usdAmount) external view returns (bool); function updateUserSpendAmount(address userAddr, uint256 usdAmount) external; }
// SPDX-License-Identifier: LICENSED pragma solidity ^0.7.0; interface ILevelManager { function getUserLevel(address userAddr) external view returns (uint256); function getLevel(uint256 _okseAmount) external view returns (uint256); function updateUserLevel( address userAddr, uint256 beforeAmount ) external returns (bool); }
// SPDX-License-Identifier: LICENSED pragma solidity ^0.7.0; interface IMarketManager { function WETH() external view returns (address); function USDC() external view returns (address); function OKSE() external view returns (address); function defaultMarket() external view returns (address); function oksePaymentEnable() external view returns (bool); function emergencyStop() external view returns (bool); function marketEnable(address market) external view returns (bool); function isMarketExist(address market) external view returns (bool); function userMainMarket(address userAddr) external view returns (address); function slippage() external view returns (uint256); function getUserMainMarket(address userAddr) external view returns (address); function setUserMainMakret(address userAddr, address market) external; }
// SPDX-License-Identifier: LICENSED pragma solidity ^0.7.0; interface ICashBackManager { function cashBackEnable() external view returns (bool); function getCashBackPercent(uint256 level) external view returns (uint256); }
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity ^0.7.0; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; /// @title Interface for WETH9 interface IWETH9 is IERC20 { /// @notice Deposit ether to get wrapped ether function deposit() external payable; /// @notice Withdraw wrapped ether to get ether function withdraw(uint256) external; }
// SPDX-License-Identifier: LICENSED pragma solidity ^0.7.0; interface ISwapper { function _swap( uint256[] memory amounts, address[] memory path, address _to ) external; function getAmountsIn( uint256 amountOut, address[] memory path ) external view returns (uint256[] memory amounts); function GetReceiverAddress( address[] memory path ) external view returns (address); function getOptimumPath( address token0, address token1 ) external view returns (address[] memory); }
//SPDX-License-Identifier: UNLICENSED pragma solidity ^0.7.0; interface ERC20Interface { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address _owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: LICENSED pragma solidity ^0.7.0; interface IConverter { function convertUsdAmountToAssetAmount( uint256 usdAmount, address assetAddress ) external view returns (uint256); function convertAssetAmountToUsdAmount( uint256 assetAmount, address assetAddress ) external view returns (uint256); function getUsdAmount( address market, uint256 assetAmount, address priceOracle ) external view returns (uint256 usdAmount); function getAssetAmount( address market, uint256 usdAmount, address priceOracle ) external view returns (uint256 assetAmount); }
//SPDX-License-Identifier: UNLICENSED pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return add(a, b, "SafeMath: addition overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, errorMessage); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
//SPDX-License-Identifier: LICENSED pragma solidity ^0.7.0; import "./MultiSigOwner.sol"; contract OwnerConstants is MultiSigOwner { uint256 public constant HR48 = 10 minutes; //for testing // address public owner; // daily limit contants uint256 public constant MAX_LEVEL = 5; // this is reward address for user's withdraw and payment for goods. address public treasuryAddress; // this address should be deposit okse in his balance and users can get cashback from this address. address public financialAddress; // master address is used to send USDC tokens when user buy goods. address public masterAddress; // monthly fee rewarded address address public monthlyFeeAddress; address public pendingTreasuryAddress; address public pendingFinancialAddress; address public pendingMasterAddress; address public pendingMonthlyFeeAddress; uint256 public requestTimeOfManagerAddressUpdate; // staking contract address, which is used to receive 20% of monthly fee, so staked users can be rewarded from this contract address public stakeContractAddress; // statking amount of monthly fee uint256 public stakePercent; // 15 % // withdraw fee and payment fee should not exeed this amount, 1% is coresponding to 100. uint256 public constant MAX_FEE_AMOUNT = 500; // 5% // buy fee setting. uint256 public buyFeePercent; // 1% // withdraw fee setting. uint256 public withdrawFeePercent; // 0.1 % // set monthly fee of user to use card payment, unit is usd amount ( 1e18) uint256 public monthlyFeeAmount; // 6.99 USD // if user pay monthly fee using okse, then he will pay less amount fro this percent. 0% => 0, 100% => 10000 uint256 public okseMonthlyProfit; // 10% // buy tx fee in usd uint256 public buyTxFee; // 0.7 usd event ManagerAddressChanged( address treasuryAddress, address financialAddress, address masterAddress, address monthlyFeeAddress ); event FeeValuesChanged( uint256 monthlyFeeAmount, uint256 okseMonthlyProfit, uint256 withdrawFeePercent, uint256 buyTxFee, uint256 buyFeePercent ); event StakeContractParamChanged( address stakeContractAddress, uint256 stakePercent ); constructor() {} function getMonthlyFeeAmount(bool payFromOkse) public view returns (uint256) { uint256 result; if (payFromOkse) { result = monthlyFeeAmount - (monthlyFeeAmount * okseMonthlyProfit) / 10000; } else { result = monthlyFeeAmount; } return result; } // I have to add 48 hours delay in this function function setManagerAddresses(bytes calldata signData, bytes calldata keys) public validSignOfOwner(signData, keys, "setManagerAddresses") { require( block.timestamp > requestTimeOfManagerAddressUpdate + HR48 && requestTimeOfManagerAddressUpdate > 0, "need to wait 48hr" ); treasuryAddress = pendingTreasuryAddress; financialAddress = pendingFinancialAddress; masterAddress = pendingMasterAddress; monthlyFeeAddress = pendingMonthlyFeeAddress; requestTimeOfManagerAddressUpdate = 0; emit ManagerAddressChanged( treasuryAddress, financialAddress, masterAddress, monthlyFeeAddress ); } function requestManagerAddressUpdate( bytes calldata signData, bytes calldata keys ) public validSignOfOwner(signData, keys, "requestManagerAddressUpdate") { (, , , bytes memory params) = abi.decode( signData, (bytes4, uint256, uint256, bytes) ); ( address _newTreasuryAddress, address _newFinancialAddress, address _newMasterAddress, address _mothlyFeeAddress ) = abi.decode(params, (address, address, address, address)); pendingTreasuryAddress = _newTreasuryAddress; pendingFinancialAddress = _newFinancialAddress; pendingMasterAddress = _newMasterAddress; pendingMonthlyFeeAddress = _mothlyFeeAddress; requestTimeOfManagerAddressUpdate = block.timestamp; } // verified function setFeeValues(bytes calldata signData, bytes calldata keys) public validSignOfOwner(signData, keys, "setFeeValues") { (, , , bytes memory params) = abi.decode( signData, (bytes4, uint256, uint256, bytes) ); ( uint256 _monthlyFeeAmount, uint256 _okseMonthlyProfit, uint256 _withdrawFeePercent, uint256 newBuyFeePercent, uint256 newBuyTxFee ) = abi.decode(params, (uint256, uint256, uint256, uint256, uint256)); require(_okseMonthlyProfit <= 10000, "over percent"); require(_withdrawFeePercent <= MAX_FEE_AMOUNT, "mfo"); monthlyFeeAmount = _monthlyFeeAmount; okseMonthlyProfit = _okseMonthlyProfit; withdrawFeePercent = _withdrawFeePercent; require(newBuyFeePercent <= MAX_FEE_AMOUNT, "mpo"); buyFeePercent = newBuyFeePercent; buyTxFee = newBuyTxFee; emit FeeValuesChanged( monthlyFeeAmount, okseMonthlyProfit, withdrawFeePercent, buyTxFee, buyFeePercent ); } function setStakeContractParams( bytes calldata signData, bytes calldata keys ) public validSignOfOwner(signData, keys, "setStakeContractParams") { (, , , bytes memory params) = abi.decode( signData, (bytes4, uint256, uint256, bytes) ); (address _stakeContractAddress, uint256 _stakePercent) = abi.decode( params, (address, uint256) ); stakeContractAddress = _stakeContractAddress; stakePercent = _stakePercent; emit StakeContractParamChanged(stakeContractAddress, stakePercent); } }
//SPDX-License-Identifier: UNLICENSED pragma solidity ^0.7.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping(address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { // require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() {} // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } abstract contract SignerRole is Context { using Roles for Roles.Role; event SignerAdded(address indexed account); event SignerRemoved(address indexed account); Roles.Role private _signers; constructor(address _signer) { _addSigner(_signer); } modifier onlySigner() { require( isSigner(_msgSender()), "SignerRole: caller does not have the Signer role" ); _; } function isSigner(address account) public view returns (bool) { return _signers.has(account); } function _addSigner(address account) internal { _signers.add(account); emit SignerAdded(account); } function _removeSigner(address account) internal { _signers.remove(account); emit SignerRemoved(account); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: LICENSED pragma solidity ^0.7.0; pragma abicoder v2; // 2/3 Multi Sig Owner contract MultiSigOwner { address[] public owners; mapping(uint256 => bool) public signatureId; bool private initialized; // events event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); event SignValidTimeChanged(uint256 newValue); modifier validSignOfOwner( bytes calldata signData, bytes calldata keys, string memory functionName ) { require(isOwner(msg.sender), "on"); address signer = getSigner(signData, keys); require(signer != msg.sender && isOwner(signer), "is"); (bytes4 method, uint256 id, uint256 validTime, ) = abi.decode( signData, (bytes4, uint256, uint256, bytes) ); require( signatureId[id] == false && method == bytes4(keccak256(bytes(functionName))), "sru" ); require(validTime > block.timestamp, "ep"); signatureId[id] = true; _; } function isOwner(address addr) public view returns (bool) { bool _isOwner = false; for (uint256 i = 0; i < owners.length; i++) { if (owners[i] == addr) { _isOwner = true; } } return _isOwner; } constructor() {} function initializeOwners(address[3] memory _owners) public { require(!initialized, "ai"); owners = [_owners[0], _owners[1], _owners[2]]; initialized = true; } function getSigner(bytes calldata _data, bytes calldata keys) public view returns (address) { uint256 chainId; assembly { chainId := chainid() } (uint8 v, bytes32 r, bytes32 s) = abi.decode( keys, (uint8, bytes32, bytes32) ); return ecrecover( toEthSignedMessageHash( keccak256(abi.encodePacked(this, chainId, _data)) ), v, r, s ); } function encodePackedData(bytes calldata _data) public view returns (bytes32) { uint256 chainId; assembly { chainId := chainid() } return keccak256(abi.encodePacked(this, chainId, _data)); } function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { return keccak256( abi.encodePacked("\x19Ethereum Signed Message:\n32", hash) ); } // Set functions // verified function transferOwnership(bytes calldata signData, bytes calldata keys) public validSignOfOwner(signData, keys, "transferOwnership") { (, , , bytes memory params) = abi.decode( signData, (bytes4, uint256, uint256, bytes) ); address newOwner = abi.decode(params, (address)); uint256 index; for (uint256 i = 0; i < owners.length; i++) { if (owners[i] == msg.sender) { index = i; } } address oldOwner = owners[index]; owners[index] = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
{ "optimizer": { "enabled": true, "runs": 100 }, "metadata": { "bytecodeHash": "none", "useLiteralContent": true }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_converter","type":"address"},{"internalType":"address","name":"_initialSigner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"monthlyFeeAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"okseMonthlyProfit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawFeePercent","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyTxFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyFeePercent","type":"uint256"}],"name":"FeeValuesChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousGovernor","type":"address"},{"indexed":true,"internalType":"address","name":"newGovernor","type":"address"}],"name":"GovernorAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasuryAddress","type":"address"},{"indexed":false,"internalType":"address","name":"financialAddress","type":"address"},{"indexed":false,"internalType":"address","name":"masterAddress","type":"address"},{"indexed":false,"internalType":"address","name":"monthlyFeeAddress","type":"address"}],"name":"ManagerAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"userValidTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"usdAmount","type":"uint256"}],"name":"MonthlyFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"priceOracle","type":"address"},{"indexed":false,"internalType":"address","name":"swapper","type":"address"}],"name":"PriceOracleAndSwapperChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"SignValidTimeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SignerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"signer1","type":"address"},{"indexed":false,"internalType":"address","name":"signer2","type":"address"},{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"uint256","name":"usdAmount","type":"uint256"}],"name":"SignerBuyGoods","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"SignerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"stakeContractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"stakePercent","type":"uint256"}],"name":"StakeContractParamChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"userAddr","type":"address"},{"indexed":true,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserBalanceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UserDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"address","name":"beforeMarket","type":"address"}],"name":"UserMainMarketChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"userAddr","type":"address"},{"indexed":false,"internalType":"address","name":"market","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"remainedBalance","type":"uint256"}],"name":"UserWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawTokens","type":"event"},{"inputs":[],"name":"BUYGOODS","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CARD_VALIDATION_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"HR48","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FEE_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_LEVEL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAY_MONTHLY_FEE","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SET_USER_MAIN_MARKET","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes4","name":"method","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validTime","type":"uint256"}],"internalType":"struct OkseCard.SignData","name":"_data","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct OkseCard.SignKeys[2]","name":"signer_key","type":"tuple[2]"}],"name":"buyGoods","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTxFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cashbackManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"converter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"market","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"encodePackedData","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes4","name":"method","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validTime","type":"uint256"}],"internalType":"struct OkseCard.SignData","name":"_data","type":"tuple"}],"name":"encodePackedData","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"financialAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"payFromOkse","type":"bool"}],"name":"getMonthlyFeeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"getSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"address","name":"market","type":"address"}],"name":"getUserAssetAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_userAddr","type":"address"}],"name":"getUserExpired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"getUserOkseBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes4","name":"method","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validTime","type":"uint256"}],"internalType":"struct OkseCard.SignData","name":"_data","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct OkseCard.SignKeys","name":"key","type":"tuple"}],"name":"getecrecover","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_priceOracle","type":"address"},{"internalType":"address","name":"_limitManager","type":"address"},{"internalType":"address","name":"_levelManager","type":"address"},{"internalType":"address","name":"_marketManager","type":"address"},{"internalType":"address","name":"_cashbackManager","type":"address"},{"internalType":"address","name":"_financialAddress","type":"address"},{"internalType":"address","name":"_masterAddress","type":"address"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"address","name":"_governorAddress","type":"address"},{"internalType":"address","name":"_monthlyFeeAddress","type":"address"},{"internalType":"address","name":"_stakeContractAddress","type":"address"},{"internalType":"address","name":"_swapper","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[3]","name":"_owners","type":"address[3]"}],"name":"initializeOwners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isSigner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"levelManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limitManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"masterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monthlyFeeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monthlyFeeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"okseMonthlyProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"components":[{"internalType":"bytes4","name":"method","type":"bytes4"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validTime","type":"uint256"}],"internalType":"struct OkseCard.SignData","name":"_data","type":"tuple"},{"components":[{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"internalType":"struct OkseCard.SignKeys","name":"user_key","type":"tuple"},{"internalType":"address","name":"market","type":"address"}],"name":"payMonthlyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pendingFinancialAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingMasterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingMonthlyFeeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingTreasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"requestManagerAddressUpdate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requestTimeOfManagerAddressUpdate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"setFeeValues","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newGovernor","type":"address"}],"name":"setGovernor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"setManagerAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"setPriceOracleAndSwapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"setStakeContractParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"uint256","name":"validTime","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"setUserMainMarket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"signatureId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"},{"internalType":"bool","name":"bAddOrRemove","type":"bool"}],"name":"updateSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userValidTimes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"usersBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"market","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validTime","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFeePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"keys","type":"bytes"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60a06040523480156200001157600080fd5b5060405162005f3738038062005f378339810160408190526200003491620001b4565b80620000408162000058565b505060601b6001600160601b031916608052620001eb565b62000073816012620000aa60201b6200387f1790919060201c565b6040516001600160a01b038216907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a250565b620000b682826200012e565b1562000109576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216620001775760405162461bcd60e51b815260040180806020018281038252602281526020018062005f156022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b80516001600160a01b0381168114620001af57600080fd5b919050565b60008060408385031215620001c7578182fd5b620001d28362000197565b9150620001e26020840162000197565b90509250929050565b60805160601c615cf36200022260003980612f3452806139d55280613afc5280613f5e52806140515280614a2a5250615cf36000f3fe60806040526004361061033c5760003560e01c80636ac7bca0116101b2578063ba55671d116100ed578063d1f21f4f11610090578063d1f21f4f14610933578063d365a08e14610953578063d73d8b9014610968578063e46a3a4f14610988578063e9b786cb1461099d578063f460590b146109b2578063f6326fb3146109d2578063f6e71bc8146109da57610343565b8063ba55671d1461086a578063bd38837b1461088a578063c00599511461089f578063c42cf535146108b4578063c5f956af146108d4578063c8a68c96146108e9578063cc3fdd4c146108fe578063cefd071b1461091357610343565b806389c9cbc01161015557806389c9cbc0146107965780638a0afa77146107ab5780638e0c1040146107cb578063947977a8146107e0578063a49062d414610800578063a89b7ed614610815578063af14944414610835578063b2b9f0ed1461084a57610343565b80636ac7bca0146106b75780636e933c74146106d75780636f1a65e0146106f75780636f9e4f0b1461070c57806373160e231461072c57806375e16b17146107415780637b7b0820146107615780637df73e271461077657610343565b806334a6cdc5116102825780635d70557c116102255780635d70557c146105cd5780635e326047146105e25780635fe65ed41461060257806361e3c5231461062257806362c3c2e5146106425780636309daf51461066257806368af81e61461068257806368d3ae83146106a257610343565b806334a6cdc5146104f95780633d5c26441461050e57806341ed2c121461052e578063459a17821461054357806347e7ef2414610563578063495ef705146105835780634e2412771461059857806356afe84e146105b857610343565b80632630c12f116102ea5780632630c12f14610439578063272caf691461044e578063276f1c41146104635780632a54caba146104785780632a8d950c1461048d5780632b3297f9146104a25780632f54bf6e146104b757806332c2e8d7146104e457610343565b8063025e7c27146103485780630885ad571461037e57806308b14011146103a05780630b800f48146103c057806311073143146103e057806316ba71971461040257806321f8fba71461042457610343565b3661034357005b600080fd5b34801561035457600080fd5b506103686103633660046154b2565b6109ef565b6040516103759190615744565b60405180910390f35b34801561038a57600080fd5b5061039e61039936600461559f565b610a19565b005b3480156103ac57600080fd5b5061039e6103bb3660046153be565b610ebd565b3480156103cc57600080fd5b5061039e6103db366004614f9f565b6111b7565b3480156103ec57600080fd5b506103f56112f8565b6040516103759190615857565b34801561040e57600080fd5b506104176112fe565b604051610375919061587e565b34801561043057600080fd5b50610368611309565b34801561044557600080fd5b50610368611318565b34801561045a57600080fd5b50610368611327565b34801561046f57600080fd5b50610368611336565b34801561048457600080fd5b506103f5611345565b34801561049957600080fd5b5061036861134b565b3480156104ae57600080fd5b5061036861135a565b3480156104c357600080fd5b506104d76104d2366004614f01565b611369565b604051610375919061584c565b3480156104f057600080fd5b506104176113c0565b34801561050557600080fd5b506103f56113cb565b34801561051a57600080fd5b506103f5610529366004614f01565b6113d1565b34801561053a57600080fd5b50610368611482565b34801561054f57600080fd5b5061039e61055e3660046153be565b611491565b34801561056f57600080fd5b5061039e61057e3660046150b3565b6116fb565b34801561058f57600080fd5b506103f56118b5565b3480156105a457600080fd5b506103f56105b3366004615283565b6118bb565b3480156105c457600080fd5b506103f56118ec565b3480156105d957600080fd5b506103686118f2565b3480156105ee57600080fd5b5061039e6105fd366004615441565b611901565b34801561060e57600080fd5b5061039e61061d3660046153be565b611edc565b34801561062e57600080fd5b506103f561063d366004614f72565b612172565b34801561064e57600080fd5b506104d761065d366004614f01565b61219d565b34801561066e57600080fd5b506103f561067d366004614f01565b6121d4565b34801561068e57600080fd5b506103f561069d36600461537f565b6121e6565b3480156106ae57600080fd5b506103f5612221565b3480156106c357600080fd5b5061039e6106d23660046153be565b612227565b3480156106e357600080fd5b506103f56106f2366004615426565b61259c565b34801561070357600080fd5b506103f5612612565b34801561071857600080fd5b5061039e6107273660046150de565b612619565b34801561073857600080fd5b5061036861268c565b34801561074d57600080fd5b5061036861075c3660046153be565b61269b565b34801561076d57600080fd5b50610368612745565b34801561078257600080fd5b506104d7610791366004614f01565b612754565b3480156107a257600080fd5b50610368612761565b3480156107b757600080fd5b5061039e6107c6366004615546565b612770565b3480156107d757600080fd5b506103686129ae565b3480156107ec57600080fd5b5061039e6107fb3660046153be565b6129bd565b34801561080c57600080fd5b506103f5612c54565b34801561082157600080fd5b5061036861083036600461547d565b612c59565b34801561084157600080fd5b50610417612d1f565b34801561085657600080fd5b506104d76108653660046154b2565b612d2a565b34801561087657600080fd5b5061039e6108853660046153be565b612d3f565b34801561089657600080fd5b50610368612f32565b3480156108ab57600080fd5b50610368612f56565b3480156108c057600080fd5b5061039e6108cf366004614f01565b612f65565b3480156108e057600080fd5b50610368612ff1565b3480156108f557600080fd5b506103f5613005565b34801561090a57600080fd5b506103f561300b565b34801561091f57600080fd5b506103f561092e366004614f72565b613011565b34801561093f57600080fd5b5061039e61094e3660046153be565b61302e565b34801561095f57600080fd5b50610368613279565b34801561097457600080fd5b5061039e6109833660046154e2565b613288565b34801561099457600080fd5b50610368613620565b3480156109a957600080fd5b506103f561362f565b3480156109be57600080fd5b5061039e6109cd366004615086565b613635565b61039e613690565b3480156109e657600080fd5b50610417613874565b600081815481106109ff57600080fd5b6000918252602090912001546001600160a01b0316905081565b6002601c541415610a455760405162461bcd60e51b8152600401610a3c90615a67565b60405180910390fd5b6002601c556017546040516301c6e7ff60e11b815282916001600160a01b03169063038dcffe90610a7a908490600401615744565b60206040518083038186803b158015610a9257600080fd5b505afa158015610aa6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aca919061529f565b610ae65760405162461bcd60e51b8152600401610a3c906159f3565b601760009054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b815260040160206040518083038186803b158015610b3457600080fd5b505afa158015610b48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6c919061529f565b15610b895760405162461bcd60e51b8152600401610a3c90615ad6565b8383610b958282612c59565b6001600160a01b0316610bae6080840160608501614f01565b6001600160a01b031614610bd45760405162461bcd60e51b8152600401610a3c90615980565b610bdf610791613900565b610c1a5760405162461bcd60e51b8152600401808060200182810382526030815260200180615cb76030913960400191505060405180910390fd5b6000610c2c6080880160608901614f01565b6001600160a01b0381166000908152601b6020526040902054909150421015610c675760405162461bcd60e51b8152600401610a3c90615a2f565b8660800135600f541115610c8d5760405162461bcd60e51b8152600401610a3c906158af565b60008881526001602052604090205460ff16158015610cc857506314a6a35b60e21b610cbc60208901896152bb565b6001600160e01b031916145b610ce45760405162461bcd60e51b8152600401610a3c90615a4a565b6000888152600160208181526040808420805460ff1916909317909255601754825163dffda16360e01b81529251610d94936001600160a01b039092169263dffda1639260048082019391829003018186803b158015610d4357600080fd5b505afa158015610d57573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7b9190614f1d565b6001600160a01b0316876001600160a01b0316146118bb565b6001600160a01b038084166000908152601b602052604090204262278d00019055600b549192501615610dd857600c5461271001816127100281610dd457fe5b0490505b6001600160a01b038083166000908152601a602090815260408083208a85168452909152902054600554600b54600c549293610e20938b938893889391821692911690613904565b506001600160a01b038084166000908152601a60209081526040808320938b1683529290522054610e559084908990846140e9565b506001600160a01b0383166000908152601b6020526040908190205490517f36468bb69cf35301290533742acb0f5890fc576141b4884532cf11f7b29c240a91610ea4918d9187918790615bf1565b60405180910390a150506001601c555050505050505050565b838383836040518060400160405280600e81526020016d7769746864726177546f6b656e7360901b815250610ef133611369565b610f0d5760405162461bcd60e51b8152600401610a3c90615927565b6000610f1b8686868661269b565b90506001600160a01b0381163314801590610f3a5750610f3a81611369565b610f565760405162461bcd60e51b8152600401610a3c906159d7565b60008080610f66888a018a6152d5565b50600082815260016020526040902054929550909350915060ff16158015610fa05750845160208601206001600160e01b03198481169116145b610fbc5760405162461bcd60e51b8152600401610a3c90615af7565b428111610fdb5760405162461bcd60e51b8152600401610a3c90615964565b60008281526001602081905260408220805460ff191690911790556110028d8f018f6152d5565b93505050506000808280602001905181019061101e9190614f39565b60175460405163c037934760e01b81529294509092506001600160a01b03169063c037934790611052908590600401615744565b60206040518083038186803b15801561106a57600080fd5b505afa15801561107e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a2919061529f565b156110bf5760405162461bcd60e51b8152600401610a3c9061599e565b60006001600160a01b0383166110e05750476110db8282614269565b611169565b6040516370a0823160e01b81526001600160a01b038416906370a082319061110c903090600401615744565b60206040518083038186803b15801561112457600080fd5b505afa158015611138573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115c91906154ca565b905061116983838361435d565b7f70082d08c003c5341f2401bec1c2ae1dbcdc29ae17e9cc5633fa617caa8acd4c83838360405161119c93929190615758565b60405180910390a15050505050505050505050505050505050565b601d5460ff16156111da5760405162461bcd60e51b8152600401610a3c90615a94565b601480546001600160a01b03199081166001600160a01b039e8f16179091556015805482169c8e169c909c17909b55601680548c169a8d169a909a17909955601780548b16988c1698909817909755601880548a16968b169690961790955560028054610100600160a81b031916610100938b16939093029290921790915560038054881693891693909317909255600480548716918816919091179055601980548616918716919091179055600580548516918616919091179055600b805484169185169190911790556013805490921692169190911790556001601c8190556106bd600c556064600d556709b6e64a8ec60000601155600a600e5567610177f723fb0000600f556103e8601055601d805460ff19169091179055565b600a5481565b632155447360e21b81565b6018546001600160a01b031681565b6014546001600160a01b031681565b600b546001600160a01b031681565b6019546001600160a01b031681565b6101f481565b6016546001600160a01b031681565b6013546001600160a01b031681565b600080805b6000548110156113b757836001600160a01b03166000828154811061138f57fe5b6000918252602090912001546001600160a01b031614156113af57600191505b60010161136e565b5090505b919050565b6325110a1760e11b81565b600c5481565b6001600160a01b038082166000908152601a60209081526040808320601754825163dffda16360e01b81529251949591948694919092169263dffda1639260048083019392829003018186803b15801561142a57600080fd5b505afa15801561143e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114629190614f1d565b6001600160a01b0316815260208101919091526040016000205492915050565b6017546001600160a01b031681565b83838383604051806040016040528060138152602001727365744d616e6167657241646472657373657360681b8152506114ca33611369565b6114e65760405162461bcd60e51b8152600401610a3c90615927565b60006114f48686868661269b565b90506001600160a01b0381163314801590611513575061151381611369565b61152f5760405162461bcd60e51b8152600401610a3c906159d7565b6000808061153f888a018a6152d5565b50600082815260016020526040902054929550909350915060ff161580156115795750845160208601206001600160e01b03198481169116145b6115955760405162461bcd60e51b8152600401610a3c90615af7565b4281116115b45760405162461bcd60e51b8152600401610a3c90615964565b6000828152600160208190526040909120805460ff19169091179055600a5461025801421180156115e757506000600a54115b61162c576040805162461bcd60e51b81526020600482015260116024820152703732b2b2103a37903bb0b4ba101a1c343960791b604482015290519081900360640190fd5b60065460028054610100600160a81b0319166101006001600160a01b0393841681029190911791829055600754600380549185166001600160a01b03199283161790819055600854600480549187169184169190911790819055600954600580549188169190941617928390556000600a5560408051949095048616845290851660208401528416828401529092166060830152517f471bd784db5079421761b0728e4d7bd73efe27958f0bc3452bada7799f0d3457916080908290030190a150505050505050505050505050565b6017546040516301c6e7ff60e11b815283916001600160a01b03169063038dcffe9061172b908490600401615744565b60206040518083038186803b15801561174357600080fd5b505afa158015611757573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177b919061529f565b6117975760405162461bcd60e51b8152600401610a3c906159f3565b6002601c5414156117ba5760405162461bcd60e51b8152600401610a3c90615a67565b6002601c55601754604080516318e9666960e21b815290516001600160a01b03909216916363a599a491600480820192602092909190829003018186803b15801561180457600080fd5b505afa158015611818573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183c919061529f565b156118595760405162461bcd60e51b8152600401610a3c90615ad6565b611865833330856144ab565b611870833384614603565b7f3bc57f469ad6d10d7723ea226cd22bd2b9e527def2b529f6ab44645a166895823384846040516118a393929190615758565b60405180910390a150506001601c5550565b600e5481565b60008082156118e157612710601054600f5402816118d557fe5b04600f540390506118e6565b50600f545b92915050565b61025881565b6005546001600160a01b031681565b6002601c5414156119245760405162461bcd60e51b8152600401610a3c90615a67565b6002601c556119396060830160408401614f01565b6017546040516301c6e7ff60e11b81526001600160a01b039091169063038dcffe90611969908490600401615744565b60206040518083038186803b15801561198157600080fd5b505afa158015611995573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b9919061529f565b6119d55760405162461bcd60e51b8152600401610a3c906159f3565b6119e56080840160608501614f01565b6119ee8161219d565b15611a0b5760405162461bcd60e51b8152600401610a3c90615ab0565b601760009054906101000a90046001600160a01b03166001600160a01b03166363a599a46040518163ffffffff1660e01b815260040160206040518083038186803b158015611a5957600080fd5b505afa158015611a6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a91919061529f565b15611aae5760405162461bcd60e51b8152600401610a3c90615ad6565b60006040518060400160405280611ad58787600060028110611acc57fe5b60600201612c59565b6001600160a01b03168152602001611aef87876001611acc565b6001600160a01b031690529050611b0d8160005b6020020151612754565b8015611b1f5750611b1f816001611b03565b8015611b3d5750602081015181516001600160a01b03908116911614155b611b595760405162461bcd60e51b8152600401610a3c906159d7565b60208086013560009081526001909152604090205460ff16158015611b9a575063547e8cf960e11b611b8e60208701876152bb565b6001600160e01b031916145b611bb65760405162461bcd60e51b8152600401610a3c90615a4a565b6020858101356000908152600191829052604090819020805460ff191690921790915584013560a08501351415611bff5760405162461bcd60e51b8152600401610a3c90615a83565b601760009054906101000a90046001600160a01b03166001600160a01b031663dffda1636040518163ffffffff1660e01b815260040160206040518083038186803b158015611c4d57600080fd5b505afa158015611c61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c859190614f1d565b6001600160a01b0316611c9e6060870160408801614f01565b6001600160a01b03161415611d4f57601760009054906101000a90046001600160a01b03166001600160a01b0316638aa7ba676040518163ffffffff1660e01b815260040160206040518083038186803b158015611cfb57600080fd5b505afa158015611d0f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d33919061529f565b611d4f5760405162461bcd60e51b8152600401610a3c906159ba565b611d5f6060860160408701614f01565b6017546001600160a01b03918216911663be2ec3bc611d846080890160608a01614f01565b6040518263ffffffff1660e01b8152600401611da09190615744565b60206040518083038186803b158015611db857600080fd5b505afa158015611dcc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df09190614f1d565b6001600160a01b031614611e165760405162461bcd60e51b8152600401610a3c90615a11565b6000611e45611e2b6060880160408901614f01565b611e3b6080890160608a01614f01565b8860800135614705565b9050611e60611e5a6080880160608901614f01565b826147f6565b81516020838101517f68c88f2d1b180ac31c1b89c8a25db195d669e6d352368be8ae4bb1ade1e7f64792918901359190611ea060608b0160408c01614f01565b611eb060808c0160608d01614f01565b8b60800135604051611ec796959493929190615b8c565b60405180910390a150506001601c5550505050565b838383836040518060400160405280601b81526020017f726571756573744d616e61676572416464726573735570646174650000000000815250611f1f33611369565b611f3b5760405162461bcd60e51b8152600401610a3c90615927565b6000611f498686868661269b565b90506001600160a01b0381163314801590611f685750611f6881611369565b611f845760405162461bcd60e51b8152600401610a3c906159d7565b60008080611f94888a018a6152d5565b50600082815260016020526040902054929550909350915060ff16158015611fce5750845160208601206001600160e01b03198481169116145b611fea5760405162461bcd60e51b8152600401610a3c90615af7565b4281116120095760405162461bcd60e51b8152600401610a3c90615964565b60008281526001602081905260408220805460ff191690911790558d8d608081101561203457600080fd5b6001600160e01b03198235169160208101359160408201359190810190608081016060820135600160201b81111561206b57600080fd5b82018360208201111561207d57600080fd5b803590602001918460018302840111600160201b8311171561209e57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508451949b5099508998508897508796505060208a019450919250505060808110156120fa57600080fd5b50805160208201516040830151606090930151600680546001600160a01b03199081166001600160a01b039586161790915560078054821693851693909317909255600880548316948416949094179093556009805490911691909216179055505042600a5550505050505050505050505050505050565b6001600160a01b039182166000908152601a6020908152604080832093909416825291909152205490565b6001600160a01b0381166000908152601b6020526040812054426220f58090910111156121cc575060006113bb565b506001919050565b601b6020526000908152604090205481565b6040516000904690612202903090839087908790602001615680565b6040516020818303038152906040528051906020012091505092915050565b60105481565b838383836040518060400160405280600c81526020016b73657446656556616c75657360a01b81525061225933611369565b6122755760405162461bcd60e51b8152600401610a3c90615927565b60006122838686868661269b565b90506001600160a01b03811633148015906122a257506122a281611369565b6122be5760405162461bcd60e51b8152600401610a3c906159d7565b600080806122ce888a018a6152d5565b50600082815260016020526040902054929550909350915060ff161580156123085750845160208601206001600160e01b03198481169116145b6123245760405162461bcd60e51b8152600401610a3c90615af7565b4281116123435760405162461bcd60e51b8152600401610a3c90615964565b60008281526001602081905260408220805460ff191690911790558d8d608081101561236e57600080fd5b6001600160e01b03198235169160208101359160408201359190810190608081016060820135600160201b8111156123a557600080fd5b8201836020820111156123b757600080fd5b803590602001918460018302840111600160201b831117156123d857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508451949b5099508998508897508796508695505060208a019350505060a081101561243457600080fd5b5080516020820151604083015160608401516080909401519298509096509450909250905061271084111561249f576040805162461bcd60e51b815260206004820152600c60248201526b1bdd995c881c195c98d95b9d60a21b604482015290519081900360640190fd5b6101f48311156124dc576040805162461bcd60e51b81526020600482015260036024820152626d666f60e81b604482015290519081900360640190fd5b600f8590556010849055600e8390556101f4821115612528576040805162461bcd60e51b81526020600482015260036024820152626d706f60e81b604482015290519081900360640190fd5b600d8290556011819055600f54601054600e54604080519384526020840192909252828201526060820183905260808201849052517fba5e401ce259802da9c7838f9696cd1079b2eb2a0ea245e551c978b5d33069c99181900360a00190a150505050505050505050505050505050505050565b600046306125ad60208501856152bb565b60208501356125c26080870160608801614f01565b6125d26060880160408901614f01565b8588608001358960a001356040516020016125f49897969594939291906156b3565b60405160208183030381529060405280519060200120915050919050565b62278d0081565b60025460ff161561263c5760405162461bcd60e51b8152600401610a3c90615a94565b6040805160608101825282516001600160a01b03908116825260208085015182169083015283830151169181019190915261267b906000906003614de5565b50506002805460ff19166001179055565b6007546001600160a01b031681565b6000468180806126ad8688018861560b565b92509250925060016126ea30868c8c6040516020016126cf9493929190615680565b60405160208183030381529060405280519060200120614b28565b8484846040516000815260200160405260405161270a9493929190615860565b6020604051602081039080840390855afa15801561272c573d6000803e3d6000fd5b505050602060405103519450505050505b949350505050565b6015546001600160a01b031681565b60006118e6601283614b58565b6003546001600160a01b031681565b600033905060004690506127fa60016127a930634a22142e60e01b8c878d8860008f6040516020016126cf9897969594939291906156b3565b878787604051600081526020016040526040516127c99493929190615860565b6020604051602081039080840390855afa1580156127eb573d6000803e3d6000fd5b50505060206040510351612754565b6128165760405162461bcd60e51b8152600401610a3c90615b14565b60008881526001602052604090205460ff16156128455760405162461bcd60e51b8152600401610a3c90615a4a565b6000888152600160208190526040909120805460ff191690911790554286116128805760405162461bcd60e51b8152600401610a3c90615943565b601754604051632f8bb0ef60e21b81526000916001600160a01b03169063be2ec3bc906128b1908690600401615744565b60206040518083038186803b1580156128c957600080fd5b505afa1580156128dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129019190614f1d565b60175460405163e8b624ad60e01b81529192506001600160a01b03169063e8b624ad906129349086908c9060040161577c565b600060405180830381600087803b15801561294e57600080fd5b505af1158015612962573d6000803e3d6000fd5b505050507f6d41219ad121d8734cd4bf7d276c6e3ef10c1a9b4e0e2245dd02ec458599cdb789848a8460405161299b9493929190615b65565b60405180910390a1505050505050505050565b6009546001600160a01b031681565b83838383604051806040016040528060168152602001757365745374616b65436f6e7472616374506172616d7360501b8152506129f933611369565b612a155760405162461bcd60e51b8152600401610a3c90615927565b6000612a238686868661269b565b90506001600160a01b0381163314801590612a425750612a4281611369565b612a5e5760405162461bcd60e51b8152600401610a3c906159d7565b60008080612a6e888a018a6152d5565b50600082815260016020526040902054929550909350915060ff16158015612aa85750845160208601206001600160e01b03198481169116145b612ac45760405162461bcd60e51b8152600401610a3c90615af7565b428111612ae35760405162461bcd60e51b8152600401610a3c90615964565b60008281526001602081905260408220805460ff191690911790558d8d6080811015612b0e57600080fd5b6001600160e01b03198235169160208101359160408201359190810190608081016060820135600160201b811115612b4557600080fd5b820183602082011115612b5757600080fd5b803590602001918460018302840111600160201b83111715612b7857600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052508451949b5099508998505060208a019650919450505060408310159150612bd2905057600080fd5b508051602091820151600b80546001600160a01b0319166001600160a01b038085169190911791829055600c8390556040805192909116825293810182905283519295509093507f81e80fe065ce07af29c0ce5b1c050c0a153937cfc80aade3416745b8d15a24e292908290030190a150505050505050505050505050505050565b600581565b6000466001612cb630612c6f60208801886152bb565b6020880135612c8460808a0160608b01614f01565b612c9460608b0160408c01614f01565b878b608001358c60a001356040516020016126cf9897969594939291906156b3565b612cc360208601866155f1565b8560200135866040013560405160008152602001604052604051612cea9493929190615860565b6020604051602081039080840390855afa158015612d0c573d6000803e3d6000fd5b5050604051601f19015195945050505050565b63547e8cf960e11b81565b60016020526000908152604090205460ff1681565b838383836040518060400160405280601881526020017739b2ba283934b1b2a7b930b1b632a0b73229bbb0b83832b960411b815250612d7d33611369565b612d995760405162461bcd60e51b8152600401610a3c90615927565b6000612da78686868661269b565b90506001600160a01b0381163314801590612dc65750612dc681611369565b612de25760405162461bcd60e51b8152600401610a3c906159d7565b60008080612df2888a018a6152d5565b50600082815260016020526040902054929550909350915060ff16158015612e2c5750845160208601206001600160e01b03198481169116145b612e485760405162461bcd60e51b8152600401610a3c90615af7565b428111612e675760405162461bcd60e51b8152600401610a3c90615964565b60008281526001602081905260408220805460ff19169091179055612e8e8d8f018f6152d5565b935050505060008082806020019051810190612eaa9190614f39565b601480546001600160a01b038085166001600160a01b0319928316179283905560138054828616931692909217918290556040519496509294507f9d8c72e345e22f801ac35d2704764abad619f5718c34bdb4477afa7576e0bde993612f189392831692919091169061577c565b60405180910390a150505050505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6008546001600160a01b031681565b6019546001600160a01b0316612f79613900565b6001600160a01b031614612f9f5760405162461bcd60e51b8152600401610a3c90615b32565b601980546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f92caf80b3b287e058d945a90272035dd5f5eb1fee321aced853a991d9ab315ad90600090a35050565b60025461010090046001600160a01b031681565b600f5481565b600d5481565b601a60209081526000928352604080842090915290825290205481565b838383836040518060400160405280601181526020017007472616e736665724f776e65727368697607c1b81525061306533611369565b6130815760405162461bcd60e51b8152600401610a3c90615927565b600061308f8686868661269b565b90506001600160a01b03811633148015906130ae57506130ae81611369565b6130ca5760405162461bcd60e51b8152600401610a3c906159d7565b600080806130da888a018a6152d5565b50600082815260016020526040902054929550909350915060ff161580156131145750845160208601206001600160e01b03198481169116145b6131305760405162461bcd60e51b8152600401610a3c90615af7565b42811161314f5760405162461bcd60e51b8152600401610a3c90615964565b60008281526001602081905260408220805460ff191690911790556131768d8f018f6152d5565b93505050506000818060200190518101906131919190614f1d565b90506000805b6000548110156131df57336001600160a01b0316600082815481106131b857fe5b6000918252602090912001546001600160a01b031614156131d7578091505b600101613197565b5060008082815481106131ee57fe5b600091825260208220015481546001600160a01b0390911692508491908490811061321557fe5b6000918252602082200180546001600160a01b0319166001600160a01b03938416179055604051858316928416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050505050505050505050505050505050565b6004546001600160a01b031681565b6002601c5414156132ab5760405162461bcd60e51b8152600401610a3c90615a67565b6002601c81905550600033905060004690506132eb60016127a93063855511cc60e01b8d878e888f8f6040516020016126cf9897969594939291906156b3565b6133075760405162461bcd60e51b8152600401610a3c90615980565b60008981526001602052604090205460ff16156133365760405162461bcd60e51b8152600401610a3c90615a4a565b6000898152600160208190526040909120805460ff191690911790554286116133715760405162461bcd60e51b8152600401610a3c90615943565b6001600160a01b038083166000908152601a60209081526040808320938c16835292905220546133a18189614bbf565b6001600160a01b038085166000908152601a602090815260408083208e8516845282528083209490945560175484516315ab88c960e31b81529451929493169263ad5c46489260048083019392829003018186803b15801561340257600080fd5b505afa158015613416573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061343a9190614f1d565b9050806001600160a01b03168a6001600160a01b0316141561352957604051632e1a7d4d60e01b81526001600160a01b03821690632e1a7d4d90613482908c90600401615857565b600060405180830381600087803b15801561349c57600080fd5b505af11580156134b0573d6000803e3d6000fd5b505060025461010090046001600160a01b031615915061351a9050576000612710600e548b02816134dd57fe5b0490508015613501576002546135019061010090046001600160a01b031682614269565b6135143361350f8c84614bbf565b614269565b50613524565b613524338a614269565b61359b565b60025461010090046001600160a01b031615613590576000612710600e548b028161355057fe5b049050801561357657600254613576908c9061010090046001600160a01b03168361435d565b61358a8b336135858d85614bbf565b61435d565b5061359b565b61359b8a338b61435d565b6001600160a01b038085166000908152601a60209081526040808320938e16835292905220546135cd858c83866140e9565b507f43b573ac1c738f28df57dc3e1fea317d5c9d932501be02f3f096f617e3e5c5d78c868d8d85604051613605959493929190615bc2565b60405180910390a150506001601c5550505050505050505050565b6006546001600160a01b031681565b60115481565b6019546001600160a01b0316613649613900565b6001600160a01b03161461366f5760405162461bcd60e51b8152600401610a3c90615b32565b80156136835761367e82614c08565b61368c565b61368c82614c4a565b5050565b6002601c5414156136b35760405162461bcd60e51b8152600401610a3c90615a67565b6002601c55601754604080516315ab88c960e31b815290516000926001600160a01b03169163ad5c4648916004808301926020929190829003018186803b1580156136fd57600080fd5b505afa158015613711573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137359190614f1d565b6017546040516301c6e7ff60e11b81529192506001600160a01b03169063038dcffe90613766908490600401615744565b60206040518083038186803b15801561377e57600080fd5b505afa158015613792573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137b6919061529f565b6137d25760405162461bcd60e51b8152600401610a3c9061599e565b806001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561380d57600080fd5b505af1158015613821573d6000803e3d6000fd5b5050505050613831813334614603565b7f3bc57f469ad6d10d7723ea226cd22bd2b9e527def2b529f6ab44645a1668958233823460405161386493929190615758565b60405180910390a1506001601c55565b6314a6a35b60e21b81565b6138898282614b58565b156138db576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b3390565b6000806000601760009054906101000a90046001600160a01b03166001600160a01b03166389a302716040518163ffffffff1660e01b815260040160206040518083038186803b15801561395757600080fd5b505afa15801561396b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061398f9190614f1d565b90506001600160a01b038516156139b4576011546127108886020488010191506139b8565b8691505b601454604051631228942160e21b81526000916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116926348a2508492613a11928f928992909116906004016157af565b60206040518083038186803b158015613a2957600080fd5b505afa158015613a3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a6191906154ca565b9050612710601760009054906101000a90046001600160a01b03166001600160a01b0316633e032a3b6040518163ffffffff1660e01b815260040160206040518083038186803b158015613ab457600080fd5b505afa158015613ac8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613aec91906154ca565b820281613af557fe5b04810190507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639b4863d284846040518363ffffffff1660e01b8152600401613b48929190615b4e565b60206040518083038186803b158015613b6057600080fd5b505afa158015613b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b9891906154ca565b6001600160a01b03808b166000908152601a602090815260408083208f851680855292529091205492955090841614613ea85760135460405163361b48eb60e11b81526000916001600160a01b031690636c3691d690613bfe908f90889060040161577c565b60006040518083038186803b158015613c1657600080fd5b505afa158015613c2a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613c529190810190615163565b6013546040516307c0329d60e21b81529192506000916001600160a01b0390911690631f00ca7490613c8a9089908690600401615c15565b60006040518083038186803b158015613ca257600080fd5b505afa158015613cb6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613cde9190810190615200565b90508381600081518110613cee57fe5b602002602001015110613d135760405162461bcd60e51b8152600401610a3c906158d2565b613d3a81600081518110613d2357fe5b602002602001015184614bbf90919063ffffffff16565b601a60008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008f6001600160a01b03166001600160a01b0316815260200190815260200160002081905550613e3b82600081518110613d9657fe5b6020908102919091010151601354604051630137e32360e31b81526001600160a01b03909116906309bf191890613dd19087906004016157d2565b60206040518083038186803b158015613de957600080fd5b505afa158015613dfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e219190614f1d565b83600081518110613e2e57fe5b602002602001015161435d565b60135460405163f5901d4d60e01b81526001600160a01b039091169063f5901d4d90613e6f908490869030906004016157e5565b600060405180830381600087803b158015613e8957600080fd5b505af1158015613e9d573d6000803e3d6000fd5b505050505050613f1e565b818410613ec75760405162461bcd60e51b8152600401610a3c90615893565b613ed18185614bbf565b601a60008c6001600160a01b03166001600160a01b0316815260200190815260200160002060008d6001600160a01b03166001600160a01b03168152602001908152602001600020819055505b6001600160a01b038816613f445760405162461bcd60e51b8152600401610a3c906158ee565b604051634da431e960e11b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639b4863d290613f95908d908890600401615b4e565b60206040518083038186803b158015613fad57600080fd5b505afa158015613fc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613fe591906154ca565b9050808510156140075760405162461bcd60e51b8152600401610a3c9061590b565b614012848a8361435d565b600061401e8683614bbf565b90506001600160a01b0389161561403a5761403a858a8361435d565b60405163791f99a560e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063791f99a5906140889089908990600401615b4e565b60206040518083038186803b1580156140a057600080fd5b505afa1580156140b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906140d891906154ca565b9d9c50505050505050505050505050565b6000836001600160a01b0316856001600160a01b03167f47006484f2df633ac2a5063887c3edaae5a0a3cdf585767bc494e1a3180e5d6f8560405161412e9190615857565b60405180910390a3601760009054906101000a90046001600160a01b03166001600160a01b031663dffda1636040518163ffffffff1660e01b815260040160206040518083038186803b15801561418457600080fd5b505afa158015614198573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141bc9190614f1d565b6001600160a01b0316846001600160a01b0316146141dc5750600161273d565b60165460405163256a3ccb60e11b81526001600160a01b0390911690634ad479969061420e9088908690600401615796565b602060405180830381600087803b15801561422857600080fd5b505af115801561423c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614260919061529f565b95945050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106142b55780518252601f199092019160209182019101614296565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114614317576040519150601f19603f3d011682016040523d82523d6000602084013e61431c565b606091505b5050905080614358576040805162461bcd60e51b815260206004820152600360248201526253544560e81b604482015290519081900360640190fd5b505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1781529251825160009485949389169392918291908083835b602083106143d95780518252601f1990920191602091820191016143ba565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461443b576040519150601f19603f3d011682016040523d82523d6000602084013e614440565b606091505b509150915081801561446e57508051158061446e575080806020019051602081101561446b57600080fd5b50515b6144a4576040805162461bcd60e51b815260206004820152600260248201526114d560f21b604482015290519081900360640190fd5b5050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b178152925182516000948594938a169392918291908083835b6020831061452f5780518252601f199092019160209182019101614510565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114614591576040519150601f19603f3d011682016040523d82523d6000602084013e614596565b606091505b50915091508180156145c45750805115806145c457508080602001905160208110156145c157600080fd5b50515b6145fb576040805162461bcd60e51b815260206004820152600360248201526229aa2360e91b604482015290519081900360640190fd5b505050505050565b6017546040516301c6e7ff60e11b815284916001600160a01b03169063038dcffe90614633908490600401615744565b60206040518083038186803b15801561464b57600080fd5b505afa15801561465f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614683919061529f565b61469f5760405162461bcd60e51b8152600401610a3c906159f3565b6001600160a01b038381166000908152601a60209081526040808320938816835292905220546146cf8184614c8c565b6001600160a01b038581166000908152601a60209081526040808320938a168352929052208190556145fb9085908790846140e9565b6001600160a01b038083166000908152601a602090815260408083208785168452909152812054600454600254600d549394929361475493899389938993918316926101009091041690613904565b6015546040516339ec2d6360e21b81529193506001600160a01b03169063e7b0b58c906147879087908790600401615796565b600060405180830381600087803b1580156147a157600080fd5b505af11580156147b5573d6000803e3d6000fd5b5050506001600160a01b038086166000908152601a60209081526040808320938a16835292905220546147ed915085908790846140e9565b50509392505050565b601860009054906101000a90046001600160a01b03166001600160a01b031663f130af696040518163ffffffff1660e01b815260040160206040518083038186803b15801561484457600080fd5b505afa158015614858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061487c919061529f565b6148855761368c565b6018546016546040516310c91def60e11b81526000926001600160a01b03908116926318d885c2929116906321923bde906148c4908890600401615744565b60206040518083038186803b1580156148dc57600080fd5b505afa1580156148f0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061491491906154ca565b6040518263ffffffff1660e01b81526004016149309190615857565b60206040518083038186803b15801561494857600080fd5b505afa15801561495c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061498091906154ca565b90506000601760009054906101000a90046001600160a01b03166001600160a01b031663dffda1636040518163ffffffff1660e01b815260040160206040518083038186803b1580156149d257600080fd5b505afa1580156149e6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a0a9190614f1d565b601454604051631228942160e21b81529192506000916001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116926348a2508492614a6b9287926127108b8b0204929116906004016157af565b60206040518083038186803b158015614a8357600080fd5b505afa158015614a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614abb91906154ca565b6003546001600160a01b039081166000908152601a60209081526040808320938716835292905220549091508110156144a4576003546001600160a01b039081166000908152601a60209081526040808320938616835292905220805482900390556144a4828683614603565b600081604051602001614b3b9190615713565b604051602081830303815290604052805190602001209050919050565b60006001600160a01b038216614b9f5760405162461bcd60e51b8152600401808060200182810382526022815260200180615c956022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6000614c0183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614cce565b9392505050565b614c1360128261387f565b6040516001600160a01b038216907f47d1c22a25bb3a5d4e481b9b1e6944c2eade3181a0a20b495ed61d35b5323f2490600090a250565b614c55601282614d65565b6040516001600160a01b038216907f3525e22824a8a7df2c9a6029941c824cf95b6447f1e13d5128fd3826d35afe8b90600090a250565b6000614c0183836040518060400160405280601b81526020017f536166654d6174683a206164646974696f6e206f766572666c6f770000000000815250614d87565b60008184841115614d5d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015614d22578181015183820152602001614d0a565b50505050905090810190601f168015614d4f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b60008383018285821015614ddc5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315614d22578181015183820152602001614d0a565b50949350505050565b828054828255906000526020600020908101928215614e3a579160200282015b82811115614e3a57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190614e05565b50614e46929150614e4a565b5090565b5b80821115614e465760008155600101614e4b565b80356113bb81615c6e565b80356001600160e01b0319811681146113bb57600080fd5b60008083601f840112614e93578182fd5b5081356001600160401b03811115614ea9578182fd5b602083019150836020828501011115614ec157600080fd5b9250929050565b600060c08284031215614ed9578081fd5b50919050565b600060608284031215614ed9578081fd5b803560ff811681146113bb57600080fd5b600060208284031215614f12578081fd5b8135614c0181615c6e565b600060208284031215614f2e578081fd5b8151614c0181615c6e565b60008060408385031215614f4b578081fd5b8251614f5681615c6e565b6020840151909250614f6781615c6e565b809150509250929050565b60008060408385031215614f84578182fd5b8235614f8f81615c6e565b91506020830135614f6781615c6e565b6000806000806000806000806000806000806101808d8f031215614fc1578788fd5b8c35614fcc81615c6e565b9b5060208d0135614fdc81615c6e565b9a5060408d0135614fec81615c6e565b995060608d0135614ffc81615c6e565b985060808d013561500c81615c6e565b975060a08d013561501c81615c6e565b965061502a60c08e01614e5f565b955061503860e08e01614e5f565b94506150476101008e01614e5f565b93506150566101208e01614e5f565b92506150656101408e01614e5f565b91506150746101608e01614e5f565b90509295989b509295989b509295989b565b60008060408385031215615098578182fd5b82356150a381615c6e565b91506020830135614f6781615c86565b600080604083850312156150c5578182fd5b82356150d081615c6e565b946020939093013593505050565b6000606082840312156150ef578081fd5b82601f8301126150fd578081fd5b604051606081018181106001600160401b038211171561511957fe5b60405280836060810186101561512d578384fd5b835b600381101561515857813561514381615c6e565b8352602092830192919091019060010161512f565b509195945050505050565b60006020808385031215615175578182fd5b82516001600160401b0381111561518a578283fd5b8301601f8101851361519a578283fd5b80516151ad6151a882615c51565b615c2e565b81815283810190838501858402850186018910156151c9578687fd5b8694505b838510156151f45780516151e081615c6e565b8352600194909401939185019185016151cd565b50979650505050505050565b60006020808385031215615212578182fd5b82516001600160401b03811115615227578283fd5b8301601f81018513615237578283fd5b80516152456151a882615c51565b8181528381019083850185840285018601891015615261578687fd5b8694505b838510156151f4578051835260019490940193918501918501615265565b600060208284031215615294578081fd5b8135614c0181615c86565b6000602082840312156152b0578081fd5b8151614c0181615c86565b6000602082840312156152cc578081fd5b614c0182614e6a565b600080600080608085870312156152ea578182fd5b6152f385614e6a565b935060208086013593506040860135925060608601356001600160401b038082111561531d578384fd5b818801915088601f830112615330578384fd5b81358181111561533c57fe5b61534e601f8201601f19168501615c2e565b91508082528984828501011115615363578485fd5b8084840185840137810190920192909252939692955090935050565b60008060208385031215615391578182fd5b82356001600160401b038111156153a6578283fd5b6153b285828601614e82565b90969095509350505050565b600080600080604085870312156153d3578182fd5b84356001600160401b03808211156153e9578384fd5b6153f588838901614e82565b9096509450602087013591508082111561540d578384fd5b5061541a87828801614e82565b95989497509550505050565b600060c08284031215615437578081fd5b614c018383614ec8565b600080610180808486031215615455578283fd5b61545f8585614ec8565b925084818501111561546f578182fd5b5060c0830190509250929050565b6000806101208385031215615490578182fd5b61549a8484614ec8565b91506154a98460c08501614edf565b90509250929050565b6000602082840312156154c3578081fd5b5035919050565b6000602082840312156154db578081fd5b5051919050565b600080600080600080600060e0888a0312156154fc578081fd5b87359650602088013561550e81615c6e565b9550604088013594506060880135935061552a60808901614ef0565b925060a0880135915060c0880135905092959891949750929550565b60008060008060008060c0878903121561555e578384fd5b86359550602087013561557081615c6e565b94506040870135935061558560608801614ef0565b92506080870135915060a087013590509295509295509295565b60008060008061016085870312156155b5578182fd5b843593506155c68660208701614ec8565b92506155d58660e08701614edf565b91506101408501356155e681615c6e565b939692955090935050565b600060208284031215615602578081fd5b614c0182614ef0565b60008060006060848603121561561f578081fd5b61562884614ef0565b95602085013595506040909401359392505050565b6000815180845260208085019450808401835b838110156156755781516001600160a01b031687529582019590820190600101615650565b509495945050505050565b60006bffffffffffffffffffffffff198660601b1682528460148301528284603484013791016034019081529392505050565b6bffffffffffffffffffffffff196060998a1b811682526001600160e01b0319989098166014820152601881019690965293871b8616603886015291861b909416604c84015293820192909252608081019290925260a082015260c00190565b7f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0393841681526020810192909252909116604082015260600190565b600060208252614c01602083018461563d565b606080825284519082018190526000906020906080840190828801845b8281101561581e57815184529284019290840190600101615802565b50505083810382850152615832818761563d565b9250505060018060a01b0383166040830152949350505050565b901515815260200190565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6001600160e01b031991909116815260200190565b602080825260029082015261617560f01b604082015260600190565b6020808252600990820152681bdd995c881c185a5960ba1b604082015260600190565b602080825260029082015261756160f01b604082015260600190565b6020808252600390820152626d697360e81b604082015260600190565b602080825260029082015261073760f41b604082015260600190565b60208082526002908201526137b760f11b604082015260600190565b602080825260079082015266195e1c1a5c995960ca1b604082015260600190565b602080825260029082015261065760f41b604082015260600190565b6020808252600490820152631cdcdcdd60e21b604082015260600190565b6020808252600290820152616d6560f01b604082015260600190565b6020808252600390820152626a737960e81b604082015260600190565b602080825260029082015261697360f01b604082015260600190565b6020808252600490820152631b591b9960e21b604082015260600190565b6020808252600490820152633539bc9960e11b604082015260600190565b6020808252600190820152606560f81b604082015260600190565b60208082526003908201526270727560e81b604082015260600190565b602080825260029082015261726360f01b604082015260600190565b602080825260009082015260400190565b602080825260029082015261616960f01b604082015260600190565b6020808252600c908201526b1d5cd95c88195e1c1a5c995960a21b604082015260600190565b6020808252600790820152661cdd1bdc1c195960ca1b604082015260600190565b60208082526003908201526273727560e81b604082015260600190565b60208082526004908201526373756d6d60e01b604082015260600190565b6020808252600290820152616f6760f01b604082015260600190565b9182526001600160a01b0316602082015260400190565b9384526001600160a01b039283166020850152908216604084015216606082015260800190565b9586526001600160a01b03948516602087015292841660408601529083166060850152909116608083015260a082015260c00190565b9485526001600160a01b0393841660208601529190921660408401526060830191909152608082015260a00190565b9384526001600160a01b039290921660208401526040830152606082015260800190565b60008382526040602083015261273d604083018461563d565b6040518181016001600160401b0381118282101715615c4957fe5b604052919050565b60006001600160401b03821115615c6457fe5b5060209081020190565b6001600160a01b0381168114615c8357600080fd5b50565b8015158114615c8357600080fdfe526f6c65733a206163636f756e7420697320746865207a65726f20616464726573735369676e6572526f6c653a2063616c6c657220646f6573206e6f74206861766520746865205369676e657220726f6c65a164736f6c6343000706000a526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373000000000000000000000000057148324eaf867ecc16e8c1138c6f6c22aa2f720000000000000000000000005126ea3894671e1c6cce47d3fb462e3c270e499e
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000057148324eaf867ecc16e8c1138c6f6c22aa2f720000000000000000000000005126ea3894671e1c6cce47d3fb462e3c270e499e
-----Decoded View---------------
Arg [0] : _converter (address): 0x057148324eaf867ecc16e8c1138c6f6c22aa2f72
Arg [1] : _initialSigner (address): 0x5126ea3894671e1c6cce47d3fb462e3c270e499e
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000057148324eaf867ecc16e8c1138c6f6c22aa2f72
Arg [1] : 0000000000000000000000005126ea3894671e1c6cce47d3fb462e3c270e499e
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.