Overview
ETH Balance
60.955409741289961196 ETH
Eth Value
$202,581.76 (@ $3,323.44/ETH)Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 10 from a total of 10 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Platform F... | 21263816 | 35 hrs ago | IN | 0 ETH | 0.00051392 | ||||
Claim Platform F... | 21263814 | 35 hrs ago | IN | 0 ETH | 0.00051135 | ||||
Claim Platform F... | 21263811 | 35 hrs ago | IN | 0 ETH | 0.0005068 | ||||
Claim Reserve Re... | 14074295 | 1036 days ago | IN | 0 ETH | 0.00331324 | ||||
Claim Reserve Re... | 13802064 | 1078 days ago | IN | 0 ETH | 0.00320367 | ||||
Claim Reserve Re... | 12822123 | 1231 days ago | IN | 0 ETH | 0.00171791 | ||||
Claim Reserve Re... | 12605655 | 1265 days ago | IN | 0 ETH | 0.00060359 | ||||
Claim Reserve Re... | 12605403 | 1265 days ago | IN | 0 ETH | 0.0004393 | ||||
Claim Reserve Re... | 12472629 | 1286 days ago | IN | 0 ETH | 0.00673235 | ||||
0x60c06040 | 12263114 | 1318 days ago | IN | 0 ETH | 0.35186444 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
21274473 | 5 mins ago | 0.00105974 ETH | ||||
21274473 | 5 mins ago | 0.00145669 ETH | ||||
21274031 | 1 hr ago | 0.00079546 ETH | ||||
21274031 | 1 hr ago | 0.00109342 ETH | ||||
21273664 | 2 hrs ago | 0.0008023 ETH | ||||
21273664 | 2 hrs ago | 0.00110282 ETH | ||||
21272868 | 5 hrs ago | 0.00123382 ETH | ||||
21272868 | 5 hrs ago | 0.00169598 ETH | ||||
21271670 | 9 hrs ago | 0.00086976 ETH | ||||
21271670 | 9 hrs ago | 0.00119554 ETH | ||||
21271293 | 10 hrs ago | 0.0004978 ETH | ||||
21271293 | 10 hrs ago | 0.00068427 ETH | ||||
21269930 | 15 hrs ago | 0.00047323 ETH | ||||
21269930 | 15 hrs ago | 0.00065049 ETH | ||||
21269703 | 16 hrs ago | 0.00098216 ETH | ||||
21269703 | 16 hrs ago | 0.00135005 ETH | ||||
21269624 | 16 hrs ago | 0.00066338 ETH | ||||
21269624 | 16 hrs ago | 0.00091186 ETH | ||||
21269358 | 17 hrs ago | 0.00049865 ETH | ||||
21269358 | 17 hrs ago | 0.00068542 ETH | ||||
21267793 | 22 hrs ago | 0.00068792 ETH | ||||
21267793 | 22 hrs ago | 0.00094559 ETH | ||||
21265965 | 28 hrs ago | 0.00086453 ETH | ||||
21265965 | 28 hrs ago | 0.00118836 ETH | ||||
21265812 | 29 hrs ago | 0.00169496 ETH |
Loading...
Loading
Contract Name:
KatanaFeeHandler
Compiler Version
v0.6.6+commit.6c089d02
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.6.6; import "../utils/Utils5.sol"; import "../utils/zeppelin/ReentrancyGuard.sol"; import "../utils/zeppelin/SafeMath.sol"; import "../IKyberFeeHandler.sol"; import "../IKyberNetworkProxy.sol"; import "../ISimpleKyberProxy.sol"; import "../mock/reserves/ISanityRate.sol"; import "../mock/dao/IBurnableToken.sol"; import "../mock/dao/DaoOperator.sol"; /** * @title IKyberProxy * This interface combines two interfaces. * It is needed since we use one function from each of the interfaces. * */ interface IKyberProxy is IKyberNetworkProxy, ISimpleKyberProxy { // empty block } /** * @title kyberFeeHandler * * @dev kyberFeeHandler works tightly with contracts kyberNetwork and kyberDao. * Some events are moved to interface, for easier usage * @dev Terminology: * Epoch - Voting campaign time frame in kyberDao. * kyberDao voting campaigns are in the scope of epochs. * BRR - Burn / Reward / Rebate. kyberNetwork fee is used for 3 purposes: * Burning KNC * Reward an address that staked knc in kyberStaking contract. AKA - stakers * Rebate reserves for supporting trades. * @dev Code flow: * Per trade on kyberNetwork, it calls handleFees() function which * internally accounts for network & platform fees from the trade. * Fee distribution: * rewards: send to fee pool * rebates: accumulated per rebate wallet, can be claimed any time. * burn: accumulated in the contract. Burned value and interval limited with safe check using * sanity rate. * Platfrom fee: accumulated per platform wallet, can be claimed any time. */ contract KatanaFeeHandler is Utils5, DaoOperator, ReentrancyGuard, IKyberFeeHandler { using SafeMath for uint256; uint256 internal constant SANITY_RATE_DIFF_BPS = 1000; // 10% struct BRRData { uint16 rewardBps; uint16 rebateBps; } struct BRRWei { uint256 rewardWei; uint256 fullRebateWei; uint256 paidRebateWei; uint256 burnWei; } IKyberProxy public kyberProxy; address public feePool; IERC20 public immutable knc; uint256 public immutable burnBlockInterval; uint256 public lastBurnBlock; BRRData public brrData; /// @dev amount of eth to burn for each burn knc call uint256 public weiToBurn = 2 ether; mapping(address => uint256) public feePerPlatformWallet; mapping(address => uint256) public rebatePerWallet; // total balance in the contract that is for rebate, reward, platform fee uint256 public totalPayoutBalance; /// @dev use to get rate of KNC/ETH to check if rate to burn knc is normal /// @dev index 0 is currently used contract address, indexes > 0 are older versions ISanityRate[] internal sanityRateContract; event FeeDistributed( IERC20 indexed token, address indexed sender, address indexed platformWallet, uint256 platformFeeWei, uint256 rewardWei, uint256 rebateWei, address[] rebateWallets, uint256[] rebatePercentBpsPerWallet, uint256 burnAmtWei ); event BRRUpdated(uint256 rewardBps, uint256 rebateBps, uint256 burnBps); event FeePoolUpdated(address feePool); event RebatePaid(address indexed rebateWallet, IERC20 indexed token, uint256 amount); event PlatformFeePaid(address indexed platformWallet, IERC20 indexed token, uint256 amount); event KncBurned(uint256 kncTWei, IERC20 indexed token, uint256 amount); event EthReceived(uint256 amount); event BurnConfigSet(ISanityRate sanityRate, uint256 weiToBurn); event DaoOperatorUpdated(address daoOperator); event KyberProxyUpdated(IKyberProxy kyberProxy); constructor( IKyberProxy _kyberProxy, IERC20 _knc, uint256 _burnBlockInterval, address _daoOperator, address _feePool, uint256 _rewardBps, uint256 _rebateBps ) public DaoOperator(_daoOperator) { require(_kyberProxy != IKyberProxy(0), "kyberNetworkProxy 0"); require(_knc != IERC20(0), "knc 0"); require(_burnBlockInterval != 0, "_burnBlockInterval 0"); require(_feePool != address(0), "feePool 0"); kyberProxy = _kyberProxy; knc = _knc; burnBlockInterval = _burnBlockInterval; feePool = _feePool; // set default brrData require(_rewardBps.add(_rebateBps) <= BPS, "Bad BRR values"); brrData.rewardBps = uint16(_rewardBps); brrData.rebateBps = uint16(_rebateBps); } modifier onlyNonContract { require(tx.origin == msg.sender, "only non-contract"); _; } receive() external payable { emit EthReceived(msg.value); } function setDaoOperator(address _daoOperator) external onlyDaoOperator { require(_daoOperator != address(0), "daoOperator 0"); daoOperator = _daoOperator; emit DaoOperatorUpdated(_daoOperator); } /// @dev only call by daoOperator function setBRRData( uint256 _burnBps, uint256 _rewardBps, uint256 _rebateBps ) external onlyDaoOperator { require(_burnBps.add(_rewardBps).add(_rebateBps) == BPS, "Bad BRR values"); brrData.rewardBps = uint16(_rewardBps); brrData.rebateBps = uint16(_rebateBps); emit BRRUpdated(_rewardBps, _rebateBps, _burnBps); } function setFeePool(address _feePool) external onlyDaoOperator { require(_feePool != address(0), "feePool 0"); feePool = _feePool; emit FeePoolUpdated(_feePool); } /// @dev handleFees function is called per trade on kyberNetwork /// @dev unless the trade is not involving any fees. /// @param token Token currency of fees /// @param rebateWallets a list of rebate wallets that will get rebate for this trade. /// @param rebateBpsPerWallet percentage of rebate for each wallet, out of total rebate. /// @param platformWallet Wallet address that will receive the platfrom fee. /// @param platformFee Fee amount (in wei) the platfrom wallet is entitled to. /// @param networkFee Fee amount (in wei) to be allocated for BRR function handleFees( IERC20 token, address[] calldata rebateWallets, uint256[] calldata rebateBpsPerWallet, address platformWallet, uint256 platformFee, uint256 networkFee ) external payable override nonReentrant { require(token == ETH_TOKEN_ADDRESS, "token not eth"); require(msg.value == platformFee.add(networkFee), "msg.value != total fees"); // handle platform fee feePerPlatformWallet[platformWallet] = feePerPlatformWallet[platformWallet].add( platformFee ); if (networkFee == 0) { // only platform fee paid totalPayoutBalance = totalPayoutBalance.add(platformFee); emit FeeDistributed( ETH_TOKEN_ADDRESS, msg.sender, platformWallet, platformFee, 0, 0, rebateWallets, rebateBpsPerWallet, 0 ); return; } BRRWei memory brrAmounts; // Decoding BRR data (brrAmounts.rewardWei, brrAmounts.fullRebateWei) = getRRWeiValues(networkFee); brrAmounts.paidRebateWei = updateRebateValues( brrAmounts.fullRebateWei, rebateWallets, rebateBpsPerWallet ); brrAmounts.burnWei = networkFee.sub(brrAmounts.rewardWei).sub(brrAmounts.paidRebateWei); // update total balance of rebates & platform fee totalPayoutBalance = totalPayoutBalance.add(platformFee).add(brrAmounts.paidRebateWei); //TODO: transfer reward to fee pool (bool success, ) = feePool.call{value: brrAmounts.rewardWei}(""); require(success, "send fee failed"); emit FeeDistributed( ETH_TOKEN_ADDRESS, msg.sender, platformWallet, platformFee, brrAmounts.rewardWei, brrAmounts.paidRebateWei, rebateWallets, rebateBpsPerWallet, brrAmounts.burnWei ); } /// @dev claim rebate per reserve wallet. called by any address /// @param rebateWallet the wallet to claim rebates for. /// @dev Total accumulated rebate sent to this wallet. /// @return amountWei amount of rebate claimed function claimReserveRebate(address rebateWallet) external override nonReentrant returns (uint256 amountWei) { require(rebatePerWallet[rebateWallet] > 1, "no rebate to claim"); // Get total amount of rebate accumulated amountWei = rebatePerWallet[rebateWallet].sub(1); // redundant check, can't happen assert(totalPayoutBalance >= amountWei); totalPayoutBalance = totalPayoutBalance.sub(amountWei); rebatePerWallet[rebateWallet] = 1; // avoid zero to non zero storage cost // send rebate to rebate wallet (bool success, ) = rebateWallet.call{value: amountWei}(""); require(success, "rebate transfer failed"); emit RebatePaid(rebateWallet, ETH_TOKEN_ADDRESS, amountWei); return amountWei; } /// @dev implement so this contract is not marked as abstract function claimStakerReward( address, /*staker*/ uint256 /*epoch*/ ) external override returns (uint256) { revert(); } /// @dev claim accumulated fee per platform wallet. Called by any address /// @param platformWallet the wallet to claim fee for. /// @dev Total accumulated fee sent to this wallet. /// @return amountWei amount of fee claimed function claimPlatformFee(address platformWallet) external override nonReentrant returns (uint256 amountWei) { require(feePerPlatformWallet[platformWallet] > 1, "no fee to claim"); // Get total amount of fees accumulated amountWei = feePerPlatformWallet[platformWallet].sub(1); // redundant check, can't happen assert(totalPayoutBalance >= amountWei); totalPayoutBalance = totalPayoutBalance.sub(amountWei); feePerPlatformWallet[platformWallet] = 1; // avoid zero to non zero storage cost (bool success, ) = platformWallet.call{value: amountWei}(""); require(success, "platform fee transfer failed"); emit PlatformFeePaid(platformWallet, ETH_TOKEN_ADDRESS, amountWei); return amountWei; } /// @dev Allow to set kyberNetworkProxy address by daoOperator /// @param _newProxy new kyberNetworkProxy contract function setKyberProxy(IKyberProxy _newProxy) external onlyDaoOperator { require(_newProxy != IKyberProxy(0), "kyberNetworkProxy 0"); if (_newProxy != kyberProxy) { kyberProxy = _newProxy; emit KyberProxyUpdated(_newProxy); } } /// @dev set knc sanity rate contract and amount wei to burn /// @param _sanityRate new sanity rate contract /// @param _weiToBurn new amount of wei to burn function setBurnConfigParams(ISanityRate _sanityRate, uint256 _weiToBurn) external onlyDaoOperator { require(_weiToBurn > 0, "_weiToBurn is 0"); if (sanityRateContract.length == 0 || (_sanityRate != sanityRateContract[0])) { // it is a new sanity rate contract if (sanityRateContract.length == 0) { sanityRateContract.push(_sanityRate); } else { sanityRateContract.push(sanityRateContract[0]); sanityRateContract[0] = _sanityRate; } } weiToBurn = _weiToBurn; emit BurnConfigSet(_sanityRate, _weiToBurn); } /// @dev Burn knc. The burn amount is limited. Forces block delay between burn calls. /// @dev only none ontract can call this function /// @return kncBurnAmount amount of knc burned function burnKnc() external onlyNonContract returns (uint256 kncBurnAmount) { // check if current block > last burn block number + num block interval require(block.number > lastBurnBlock + burnBlockInterval, "wait more blocks to burn"); // update last burn block number lastBurnBlock = block.number; // Get amount to burn, if greater than weiToBurn, burn only weiToBurn per function call. uint256 balance = address(this).balance; // redundant check, can't happen assert(balance >= totalPayoutBalance); uint256 srcAmount = balance.sub(totalPayoutBalance); srcAmount = srcAmount > weiToBurn ? weiToBurn : srcAmount; // Get rate uint256 kyberEthKncRate = kyberProxy.getExpectedRateAfterFee(ETH_TOKEN_ADDRESS, knc, srcAmount, 0, ""); validateEthToKncRateToBurn(kyberEthKncRate); // Buy some knc and burn kncBurnAmount = kyberProxy.swapEtherToToken{value: srcAmount}(knc, kyberEthKncRate); require(IBurnableToken(address(knc)).burn(kncBurnAmount), "knc burn failed"); emit KncBurned(kncBurnAmount, ETH_TOKEN_ADDRESS, srcAmount); return kncBurnAmount; } /// @notice should be called off chain /// @dev returns list of sanity rate contracts /// @dev index 0 is currently used contract address, indexes > 0 are older versions function getSanityRateContracts() external view returns (ISanityRate[] memory sanityRates) { sanityRates = sanityRateContract; } /// @dev return latest knc/eth rate from sanity rate contract function getLatestSanityRate() external view returns (uint256 kncToEthSanityRate) { if (sanityRateContract.length > 0 && sanityRateContract[0] != ISanityRate(0)) { kncToEthSanityRate = sanityRateContract[0].latestAnswer(); } else { kncToEthSanityRate = 0; } } function readBRRData() external view returns (uint256 rewardBps, uint256 rebateBps) { rewardBps = uint256(brrData.rewardBps); rebateBps = uint256(brrData.rebateBps); } function updateRebateValues( uint256 rebateWei, address[] memory rebateWallets, uint256[] memory rebateBpsPerWallet ) internal returns (uint256 totalRebatePaidWei) { uint256 totalRebateBps; uint256 walletRebateWei; for (uint256 i = 0; i < rebateWallets.length; i++) { require(rebateWallets[i] != address(0), "rebate wallet address 0"); walletRebateWei = rebateWei.mul(rebateBpsPerWallet[i]).div(BPS); rebatePerWallet[rebateWallets[i]] = rebatePerWallet[rebateWallets[i]].add( walletRebateWei ); // a few wei could be left out due to rounding down. so count only paid wei totalRebatePaidWei = totalRebatePaidWei.add(walletRebateWei); totalRebateBps = totalRebateBps.add(rebateBpsPerWallet[i]); } require(totalRebateBps <= BPS, "totalRebateBps > 100%"); } function getRRWeiValues(uint256 rrAmountWei) internal view returns (uint256 rewardWei, uint256 rebateWei) { // Decoding BRR data uint256 rewardInBps = uint256(brrData.rewardBps); uint256 rebateInBps = uint256(brrData.rebateBps); rebateWei = rrAmountWei.mul(rebateInBps).div(BPS); rewardWei = rrAmountWei.mul(rewardInBps).div(BPS); } function validateEthToKncRateToBurn(uint256 rateEthToKnc) internal view { require(rateEthToKnc <= MAX_RATE, "ethToKnc rate out of bounds"); require(rateEthToKnc > 0, "ethToKnc rate is 0"); require(sanityRateContract.length > 0, "no sanity rate contract"); require(sanityRateContract[0] != ISanityRate(0), "sanity rate is 0x0, burning is blocked"); // get latest knc/eth rate from sanity contract uint256 kncToEthRate = sanityRateContract[0].latestAnswer(); require(kncToEthRate > 0, "sanity rate is 0"); require(kncToEthRate <= MAX_RATE, "sanity rate out of bounds"); uint256 sanityEthToKncRate = PRECISION.mul(PRECISION).div(kncToEthRate); // rate shouldn't be SANITY_RATE_DIFF_BPS lower than sanity rate require( rateEthToKnc.mul(BPS) >= sanityEthToKncRate.mul(BPS.sub(SANITY_RATE_DIFF_BPS)), "kyberNetwork eth to knc rate too low" ); } }
pragma solidity 0.6.6; import "../IERC20.sol"; /** * @title Kyber utility file * mostly shared constants and rate calculation helpers * inherited by most of kyber contracts. * previous utils implementations are for previous solidity versions. */ contract Utils5 { IERC20 internal constant ETH_TOKEN_ADDRESS = IERC20( 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ); uint256 internal constant PRECISION = (10**18); uint256 internal constant MAX_QTY = (10**28); // 10B tokens uint256 internal constant MAX_RATE = (PRECISION * 10**7); // up to 10M tokens per eth uint256 internal constant MAX_DECIMALS = 18; uint256 internal constant ETH_DECIMALS = 18; uint256 constant BPS = 10000; // Basic Price Steps. 1 step = 0.01% uint256 internal constant MAX_ALLOWANCE = uint256(-1); // token.approve inifinite mapping(IERC20 => uint256) internal decimals; function getUpdateDecimals(IERC20 token) internal returns (uint256) { if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access uint256 tokenDecimals = decimals[token]; // moreover, very possible that old tokens have decimals 0 // these tokens will just have higher gas fees. if (tokenDecimals == 0) { tokenDecimals = token.decimals(); decimals[token] = tokenDecimals; } return tokenDecimals; } function setDecimals(IERC20 token) internal { if (decimals[token] != 0) return; //already set if (token == ETH_TOKEN_ADDRESS) { decimals[token] = ETH_DECIMALS; } else { decimals[token] = token.decimals(); } } /// @dev get the balance of a user. /// @param token The token type /// @return The balance function getBalance(IERC20 token, address user) internal view returns (uint256) { if (token == ETH_TOKEN_ADDRESS) { return user.balance; } else { return token.balanceOf(user); } } function getDecimals(IERC20 token) internal view returns (uint256) { if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access uint256 tokenDecimals = decimals[token]; // moreover, very possible that old tokens have decimals 0 // these tokens will just have higher gas fees. if (tokenDecimals == 0) return token.decimals(); return tokenDecimals; } function calcDestAmount( IERC20 src, IERC20 dest, uint256 srcAmount, uint256 rate ) internal view returns (uint256) { return calcDstQty(srcAmount, getDecimals(src), getDecimals(dest), rate); } function calcSrcAmount( IERC20 src, IERC20 dest, uint256 destAmount, uint256 rate ) internal view returns (uint256) { return calcSrcQty(destAmount, getDecimals(src), getDecimals(dest), rate); } function calcDstQty( uint256 srcQty, uint256 srcDecimals, uint256 dstDecimals, uint256 rate ) internal pure returns (uint256) { require(srcQty <= MAX_QTY, "srcQty > MAX_QTY"); require(rate <= MAX_RATE, "rate > MAX_RATE"); if (dstDecimals >= srcDecimals) { require((dstDecimals - srcDecimals) <= MAX_DECIMALS, "dst - src > MAX_DECIMALS"); return (srcQty * rate * (10**(dstDecimals - srcDecimals))) / PRECISION; } else { require((srcDecimals - dstDecimals) <= MAX_DECIMALS, "src - dst > MAX_DECIMALS"); return (srcQty * rate) / (PRECISION * (10**(srcDecimals - dstDecimals))); } } function calcSrcQty( uint256 dstQty, uint256 srcDecimals, uint256 dstDecimals, uint256 rate ) internal pure returns (uint256) { require(dstQty <= MAX_QTY, "dstQty > MAX_QTY"); require(rate <= MAX_RATE, "rate > MAX_RATE"); //source quantity is rounded up. to avoid dest quantity being too low. uint256 numerator; uint256 denominator; if (srcDecimals >= dstDecimals) { require((srcDecimals - dstDecimals) <= MAX_DECIMALS, "src - dst > MAX_DECIMALS"); numerator = (PRECISION * dstQty * (10**(srcDecimals - dstDecimals))); denominator = rate; } else { require((dstDecimals - srcDecimals) <= MAX_DECIMALS, "dst - src > MAX_DECIMALS"); numerator = (PRECISION * dstQty); denominator = (rate * (10**(dstDecimals - srcDecimals))); } return (numerator + denominator - 1) / denominator; //avoid rounding down errors } function calcRateFromQty( uint256 srcAmount, uint256 destAmount, uint256 srcDecimals, uint256 dstDecimals ) internal pure returns (uint256) { require(srcAmount <= MAX_QTY, "srcAmount > MAX_QTY"); require(destAmount <= MAX_QTY, "destAmount > MAX_QTY"); if (dstDecimals >= srcDecimals) { require((dstDecimals - srcDecimals) <= MAX_DECIMALS, "dst - src > MAX_DECIMALS"); return ((destAmount * PRECISION) / ((10**(dstDecimals - srcDecimals)) * srcAmount)); } else { require((srcDecimals - dstDecimals) <= MAX_DECIMALS, "src - dst > MAX_DECIMALS"); return ((destAmount * PRECISION * (10**(srcDecimals - dstDecimals))) / srcAmount); } } function minOf(uint256 x, uint256 y) internal pure returns (uint256) { return x > y ? y : x; } }
pragma solidity 0.6.6; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { bool private _notEntered; constructor () internal { // Storing an initial non-zero value makes deployment a bit more // expensive, but in exchange the refund on every call to nonReentrant // will be lower in amount. Since refunds are capped to a percetange of // the total transaction's gas, it is best to keep them low in cases // like this one, to increase the likelihood of the full refund coming // into effect. _notEntered = true; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_notEntered, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _notEntered = false; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _notEntered = true; } }
pragma solidity 0.6.6; /** * @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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); 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; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } }
pragma solidity 0.6.6; import "./IERC20.sol"; interface IKyberFeeHandler { event RewardPaid(address indexed staker, uint256 indexed epoch, IERC20 indexed token, uint256 amount); event RebatePaid(address indexed rebateWallet, IERC20 indexed token, uint256 amount); event PlatformFeePaid(address indexed platformWallet, IERC20 indexed token, uint256 amount); event KncBurned(uint256 kncTWei, IERC20 indexed token, uint256 amount); function handleFees( IERC20 token, address[] calldata eligibleWallets, uint256[] calldata rebatePercentages, address platformWallet, uint256 platformFee, uint256 networkFee ) external payable; function claimReserveRebate(address rebateWallet) external returns (uint256); function claimPlatformFee(address platformWallet) external returns (uint256); function claimStakerReward( address staker, uint256 epoch ) external returns(uint amount); }
pragma solidity 0.6.6; import "./IERC20.sol"; interface IKyberNetworkProxy { event ExecuteTrade( address indexed trader, IERC20 src, IERC20 dest, address destAddress, uint256 actualSrcAmount, uint256 actualDestAmount, address platformWallet, uint256 platformFeeBps ); /// @notice backward compatible function tradeWithHint( ERC20 src, uint256 srcAmount, ERC20 dest, address payable destAddress, uint256 maxDestAmount, uint256 minConversionRate, address payable walletId, bytes calldata hint ) external payable returns (uint256); function tradeWithHintAndFee( IERC20 src, uint256 srcAmount, IERC20 dest, address payable destAddress, uint256 maxDestAmount, uint256 minConversionRate, address payable platformWallet, uint256 platformFeeBps, bytes calldata hint ) external payable returns (uint256 destAmount); function trade( IERC20 src, uint256 srcAmount, IERC20 dest, address payable destAddress, uint256 maxDestAmount, uint256 minConversionRate, address payable platformWallet ) external payable returns (uint256); /// @notice backward compatible /// @notice Rate units (10 ** 18) => destQty (twei) / srcQty (twei) * 10 ** 18 function getExpectedRate( ERC20 src, ERC20 dest, uint256 srcQty ) external view returns (uint256 expectedRate, uint256 worstRate); function getExpectedRateAfterFee( IERC20 src, IERC20 dest, uint256 srcQty, uint256 platformFeeBps, bytes calldata hint ) external view returns (uint256 expectedRate); }
pragma solidity 0.6.6; import "./IERC20.sol"; /* * @title simple Kyber Network proxy interface * add convenient functions to help with kyber proxy API */ interface ISimpleKyberProxy { function swapTokenToEther( IERC20 token, uint256 srcAmount, uint256 minConversionRate ) external returns (uint256 destAmount); function swapEtherToToken(IERC20 token, uint256 minConversionRate) external payable returns (uint256 destAmount); function swapTokenToToken( IERC20 src, uint256 srcAmount, IERC20 dest, uint256 minConversionRate ) external returns (uint256 destAmount); }
pragma solidity 0.6.6; /// @title Sanity Rate check to prevent burning knc with too expensive or cheap price /// @dev Using ChainLink as the provider for current knc/eth price interface ISanityRate { // return latest rate of knc/eth function latestAnswer() external view returns (uint256); }
pragma solidity 0.6.6; interface IBurnableToken { function burn(uint256 _value) external returns (bool); }
pragma solidity 0.6.6; contract DaoOperator { address public daoOperator; constructor(address _daoOperator) public { require(_daoOperator != address(0), "daoOperator is 0"); daoOperator = _daoOperator; } modifier onlyDaoOperator() { require(msg.sender == daoOperator, "only daoOperator"); _; } }
pragma solidity 0.6.6; interface IERC20 { event Approval(address indexed _owner, address indexed _spender, uint256 _value); function approve(address _spender, uint256 _value) external returns (bool success); function transfer(address _to, uint256 _value) external returns (bool success); function transferFrom( address _from, address _to, uint256 _value ) external returns (bool success); function allowance(address _owner, address _spender) external view returns (uint256 remaining); function balanceOf(address _owner) external view returns (uint256 balance); function decimals() external view returns (uint8 digits); function totalSupply() external view returns (uint256 supply); } // to support backward compatible contract name -- so function signature remains same abstract contract ERC20 is IERC20 { }
{ "optimizer": { "enabled": true, "runs": 1000000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IKyberProxy","name":"_kyberProxy","type":"address"},{"internalType":"contract IERC20","name":"_knc","type":"address"},{"internalType":"uint256","name":"_burnBlockInterval","type":"uint256"},{"internalType":"address","name":"_daoOperator","type":"address"},{"internalType":"address","name":"_feePool","type":"address"},{"internalType":"uint256","name":"_rewardBps","type":"uint256"},{"internalType":"uint256","name":"_rebateBps","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardBps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rebateBps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnBps","type":"uint256"}],"name":"BRRUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract ISanityRate","name":"sanityRate","type":"address"},{"indexed":false,"internalType":"uint256","name":"weiToBurn","type":"uint256"}],"name":"BurnConfigSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"daoOperator","type":"address"}],"name":"DaoOperatorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EthReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"platformWallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"platformFeeWei","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rewardWei","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"rebateWei","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"rebateWallets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"rebatePercentBpsPerWallet","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"burnAmtWei","type":"uint256"}],"name":"FeeDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feePool","type":"address"}],"name":"FeePoolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"kncTWei","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"KncBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IKyberProxy","name":"kyberProxy","type":"address"}],"name":"KyberProxyUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"platformWallet","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PlatformFeePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rebateWallet","type":"address"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RebatePaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"staker","type":"address"},{"indexed":true,"internalType":"uint256","name":"epoch","type":"uint256"},{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardPaid","type":"event"},{"inputs":[],"name":"brrData","outputs":[{"internalType":"uint16","name":"rewardBps","type":"uint16"},{"internalType":"uint16","name":"rebateBps","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnBlockInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnKnc","outputs":[{"internalType":"uint256","name":"kncBurnAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"platformWallet","type":"address"}],"name":"claimPlatformFee","outputs":[{"internalType":"uint256","name":"amountWei","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"rebateWallet","type":"address"}],"name":"claimReserveRebate","outputs":[{"internalType":"uint256","name":"amountWei","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimStakerReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"daoOperator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feePerPlatformWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLatestSanityRate","outputs":[{"internalType":"uint256","name":"kncToEthSanityRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSanityRateContracts","outputs":[{"internalType":"contract ISanityRate[]","name":"sanityRates","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address[]","name":"rebateWallets","type":"address[]"},{"internalType":"uint256[]","name":"rebateBpsPerWallet","type":"uint256[]"},{"internalType":"address","name":"platformWallet","type":"address"},{"internalType":"uint256","name":"platformFee","type":"uint256"},{"internalType":"uint256","name":"networkFee","type":"uint256"}],"name":"handleFees","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"knc","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"kyberProxy","outputs":[{"internalType":"contract IKyberProxy","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBurnBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readBRRData","outputs":[{"internalType":"uint256","name":"rewardBps","type":"uint256"},{"internalType":"uint256","name":"rebateBps","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rebatePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnBps","type":"uint256"},{"internalType":"uint256","name":"_rewardBps","type":"uint256"},{"internalType":"uint256","name":"_rebateBps","type":"uint256"}],"name":"setBRRData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ISanityRate","name":"_sanityRate","type":"address"},{"internalType":"uint256","name":"_weiToBurn","type":"uint256"}],"name":"setBurnConfigParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_daoOperator","type":"address"}],"name":"setDaoOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feePool","type":"address"}],"name":"setFeePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IKyberProxy","name":"_newProxy","type":"address"}],"name":"setKyberProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalPayoutBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weiToBurn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c0604052671bc16d674ec800006006553480156200001d57600080fd5b506040516200327738038062003277833981810160405260e08110156200004357600080fd5b508051602082015160408301516060840151608085015160a086015160c0909601519495939492939192909190836001600160a01b038116620000c0576040805162461bcd60e51b815260206004820152601060248201526f064616f4f70657261746f7220697320360841b604482015290519081900360640190fd5b60018054600160a01b6001600160a01b03199091166001600160a01b039384161760ff60a01b191617905587166200013f576040805162461bcd60e51b815260206004820152601360248201527f6b796265724e6574776f726b50726f7879203000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b03861662000183576040805162461bcd60e51b815260206004820152600560248201526406b6e6320360dc1b604482015290519081900360640190fd5b84620001d6576040805162461bcd60e51b815260206004820152601460248201527f5f6275726e426c6f636b496e74657276616c2030000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0383166200021e576040805162461bcd60e51b81526020600482015260096024820152680666565506f6f6c20360bc1b604482015290519081900360640190fd5b600280546001600160a01b03199081166001600160a01b038a811691909117909255606088901b6001600160601b03191660805260a087905260038054909116918516919091179055612710620002828383620002fb602090811b6200249417901c565b1115620002c7576040805162461bcd60e51b815260206004820152600e60248201526d426164204252522076616c75657360901b604482015290519081900360640190fd5b6005805461ffff928316620100000263ffff0000199490931661ffff199091161792909216179055506200035d9350505050565b60008282018381101562000356576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60805160601c60a051612edf620003986000398061133d528061188f5250806114665280611553528061162752806124565250612edf6000f3fe60806040526004361061018f5760003560e01c806394427da9116100d6578063b7c5ab411161007f578063c6c3f3f911610059578063c6c3f3f9146106bf578063e61387e0146106ff578063f0eeed8114610714576101c9565b8063b7c5ab4114610569578063c01bdf041461066a578063c03e798c146106aa576101c9565b8063a840874f116100b0578063a840874f1461052a578063ae2e933b1461053f578063b45782c714610554576101c9565b806394427da91461049f5780639907672a146104d5578063a636a8a214610515576101c9565b806364354d6511610138578063770ba56111610112578063770ba5611461041e57806380feeef31461044c5780638c9bc20814610461576101c9565b806364354d651461033357806366ab3fe614610373578063692bdfd5146103d8576101c9565b80632e4da25c116101695780632e4da25c1461027757806353fa2eb7146102ad578063579d6b74146102f3576101c9565b806303339513146101ce57806312efe8341461022057806319db222814610235576101c9565b366101c9576040805134815290517f353bcaaf167a6add95a753d39727e3d3beb865129a69a10ed774b0b8996714039181900360200190a1005b600080fd5b3480156101da57600080fd5b5061020e600480360360208110156101f157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610729565b60408051918252519081900360200190f35b34801561022c57600080fd5b5061020e61073b565b34801561024157600080fd5b506102756004803603602081101561025857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610741565b005b34801561028357600080fd5b5061028c6108c2565b6040805161ffff938416815291909216602082015281519081900390910190f35b3480156102b957600080fd5b5061020e600480360360408110156102d057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356108d6565b3480156102ff57600080fd5b5061020e6004803603602081101561031657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166108dd565b34801561033f57600080fd5b506102756004803603602081101561035657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166108ef565b34801561037f57600080fd5b50610388610a70565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103c45781810151838201526020016103ac565b505050509050019250505060405180910390f35b3480156103e457600080fd5b50610275600480360360408110156103fb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610adf565b34801561042a57600080fd5b50610433610db7565b6040805192835260208301919091528051918290030190f35b34801561045857600080fd5b5061020e610dcc565b34801561046d57600080fd5b50610476610dd2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156104ab57600080fd5b50610275600480360360608110156104c257600080fd5b5080359060208101359060400135610dee565b3480156104e157600080fd5b5061020e600480360360208110156104f857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610fa7565b34801561052157600080fd5b5061020e6112cb565b34801561053657600080fd5b5061020e61175c565b34801561054b57600080fd5b50610476611871565b34801561056057600080fd5b5061020e61188d565b610275600480360360c081101561057f57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691908101906040810160208201356401000000008111156105b757600080fd5b8201836020820111156105c957600080fd5b803590602001918460208302840111640100000000831117156105eb57600080fd5b91939092909160208101903564010000000081111561060957600080fd5b82018360208201111561061b57600080fd5b8035906020019184602083028401116401000000008311171561063d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602081013590604001356118b1565b34801561067657600080fd5b5061020e6004803603602081101561068d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611f86565b3480156106b657600080fd5b5061020e6122aa565b3480156106cb57600080fd5b50610275600480360360208110156106e257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166122b0565b34801561070b57600080fd5b50610476612454565b34801561072057600080fd5b50610476612478565b60076020526000908152604090205481565b60095481565b60015473ffffffffffffffffffffffffffffffffffffffff1633146107c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661084957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f666565506f6f6c20300000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6003805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517f6d1d088acfe4f30d6014f6f693c61c16258f9784a6ed8439b2c59213eecb62959181900360200190a150565b60055461ffff808216916201000090041682565b6000806000fd5b60086020526000908152604090205481565b60015473ffffffffffffffffffffffffffffffffffffffff16331461097557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166109f757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f64616f4f70657261746f72203000000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517fadf9b628cb2a4e665382961f42205fce0577c0bb2c0e31ef9f87f4a35033c6919181900360200190a150565b6060600a805480602002602001604051908101604052809291908181526020018280548015610ad557602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610aaa575b5050505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b6557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b60008111610bd457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5f776569546f4275726e20697320300000000000000000000000000000000000604482015290519081900360640190fd5b600a541580610c155750600a600081548110610bec57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff838116911614155b15610d5d57600a54610c9657600a80546001810182556000919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055610d5d565b600a80600081548110610ca557fe5b6000918252602080832090910154835460018101855593835290822090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90931692909217909155600a8054849290610d1457fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60068190556040805173ffffffffffffffffffffffffffffffffffffffff841681526020810183905281517fe40f97f23269c4682610e9b2522d6d4272ee56f115906d71fcb3da82a860f755929181900390910190a15050565b60055461ffff80821692620100009092041690565b60065481565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e7457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b612710610e9782610e8b868663ffffffff61249416565b9063ffffffff61249416565b14610f0357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f426164204252522076616c756573000000000000000000000000000000000000604482015290519081900360640190fd5b6005805461ffff83811662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9186167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921716179055604080518381526020810183905280820185905290517f7806a23da6d7c83c8caf5e3fc8ec22c30900a5fcf10e266ac158ad3c9e3384c49181900360600190a1505050565b60015460009074010000000000000000000000000000000000000000900460ff1661103357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815573ffffffffffffffffffffffffffffffffffffffff8316600090815260076020526040902054116110ed57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6e6f2066656520746f20636c61696d0000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205461112490600163ffffffff61251116565b905080600954101561113257fe5b600954611145908263ffffffff61251116565b60095573ffffffffffffffffffffffffffffffffffffffff8216600081815260076020526040808220600190555190919083908381818185875af1925050503d80600081146111b0576040519150601f19603f3d011682016040523d82523d6000602084013e6111b5565b606091505b505090508061122557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f706c6174666f726d20666565207472616e73666572206661696c656400000000604482015290519081900360640190fd5b60408051838152905173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9173ffffffffffffffffffffffffffffffffffffffff8616917febe3db09f5650582b4782506e0d272262129183570e55fcf8768dd6e91f8c0f69181900360200190a350600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055919050565b600032331461133b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6f6e6c79206e6f6e2d636f6e7472616374000000000000000000000000000000604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006004540143116113cd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f77616974206d6f726520626c6f636b7320746f206275726e0000000000000000604482015290519081900360640190fd5b4360045560095447908110156113df57fe5b60006113f66009548361251190919063ffffffff16565b90506006548111611407578061140b565b6006545b600254604080517f418436bc00000000000000000000000000000000000000000000000000000000815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660248301526044820185905260006064830181905260a0608484015260a4830181905292519495509193919092169163418436bc9160e4808301926020929190829003018186803b1580156114db57600080fd5b505afa1580156114ef573d6000803e3d6000fd5b505050506040513d602081101561150557600080fd5b5051905061151281612553565b600254604080517f7a2a045600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820185905291519190921691637a2a045691859160448082019260209290919082900301818588803b1580156115b057600080fd5b505af11580156115c4573d6000803e3d6000fd5b50505050506040513d60208110156115db57600080fd5b5051604080517f42966c6800000000000000000000000000000000000000000000000000000000815260048101839052905191955073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016916342966c68916024808201926020929091908290030181600087803b15801561167057600080fd5b505af1158015611684573d6000803e3d6000fd5b505050506040513d602081101561169a57600080fd5b505161170757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6b6e63206275726e206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b6040805185815260208101849052815173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee927fa0fcef56e2b45fcbeb91d5e629ef6b2b6e982d0768f02d1232610315cd23ea10928290030190a25050505b90565b600a54600090158015906117b65750600073ffffffffffffffffffffffffffffffffffffffff16600a60008154811061179157fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614155b1561186b57600a6000815481106117c957fe5b60009182526020918290200154604080517f50d25bcd000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926350d25bcd92600480840193829003018186803b15801561183857600080fd5b505afa15801561184c573d6000803e3d6000fd5b505050506040513d602081101561186257600080fd5b50519050611759565b50600090565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60015474010000000000000000000000000000000000000000900460ff1661193a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16905573ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146119fa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f746f6b656e206e6f742065746800000000000000000000000000000000000000604482015290519081900360640190fd5b611a0a828263ffffffff61249416565b3414611a7757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6d73672e76616c756520213d20746f74616c2066656573000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260076020526040902054611aad908363ffffffff61249416565b73ffffffffffffffffffffffffffffffffffffffff841660009081526007602052604090205580611c4057600954611aeb908363ffffffff61249416565b6009819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff167fc207a63c18c4070ce1e33e5fcc02efb09ac984caa6a2046e2b1d2811723846f1856000808d8d8d8d60006040518089815260200188815260200187815260200180602001806020018481526020018381038352888882818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018481038352868152602090810191508790870280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039c50909a5050505050505050505050a4611f3d565b611c48612e16565b611c518261299a565b6020808401829052918352604080518a840281810185019092528a8152611cc69390918c918c91829185019084908082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152506129e792505050565b604082018190528151611cf19190611ce590859063ffffffff61251116565b9063ffffffff61251116565b60608201526040810151600954611d139190610e8b908663ffffffff61249416565b600955600354815160405160009273ffffffffffffffffffffffffffffffffffffffff1691908381818185875af1925050503d8060008114611d71576040519150601f19603f3d011682016040523d82523d6000602084013e611d76565b606091505b5050905080611de657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f73656e6420666565206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff167fc207a63c18c4070ce1e33e5fcc02efb09ac984caa6a2046e2b1d2811723846f187866000015187604001518f8f8f8f8c606001516040518089815260200188815260200187815260200180602001806020018481526020018381038352888882818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018481038352868152602090810191508790870280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039c50909a5050505050505050505050a450505b5050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055505050505050565b60015460009074010000000000000000000000000000000000000000900460ff1661201257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815573ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040902054116120cc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f2072656261746520746f20636c61696d0000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205461210390600163ffffffff61251116565b905080600954101561211157fe5b600954612124908263ffffffff61251116565b60095573ffffffffffffffffffffffffffffffffffffffff8216600081815260086020526040808220600190555190919083908381818185875af1925050503d806000811461218f576040519150601f19603f3d011682016040523d82523d6000602084013e612194565b606091505b505090508061220457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f726562617465207472616e73666572206661696c656400000000000000000000604482015290519081900360640190fd5b60408051838152905173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9173ffffffffffffffffffffffffffffffffffffffff8616917fb5ec5e03662403108373ab6431d3e834cb1011fca164541aef315fc7dea7b3b69181900360200190a350600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055919050565b60045481565b60015473ffffffffffffffffffffffffffffffffffffffff16331461233657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166123b857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6b796265724e6574776f726b50726f7879203000000000000000000000000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff828116911614612451576002805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517f8457f9bd0d13488a6c265af376d291f3c6bd2311d9e8dee5671d4169ca6e0ae09181900360200190a15b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60008282018381101561250857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b600061250883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c36565b6a084595161401484a0000008111156125cd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f657468546f4b6e632072617465206f7574206f6620626f756e64730000000000604482015290519081900360640190fd5b6000811161263c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f657468546f4b6e63207261746520697320300000000000000000000000000000604482015290519081900360640190fd5b600a546126aa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6e6f2073616e697479207261746520636f6e7472616374000000000000000000604482015290519081900360640190fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a6000815481106126d057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415612749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612e846026913960400191505060405180910390fd5b6000600a60008154811061275957fe5b60009182526020918290200154604080517f50d25bcd000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926350d25bcd92600480840193829003018186803b1580156127c857600080fd5b505afa1580156127dc573d6000803e3d6000fd5b505050506040513d60208110156127f257600080fd5b505190508061286257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f73616e6974792072617465206973203000000000000000000000000000000000604482015290519081900360640190fd5b6a084595161401484a0000008111156128dc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f73616e6974792072617465206f7574206f6620626f756e647300000000000000604482015290519081900360640190fd5b6000612906826128fa670de0b6b3a76400008063ffffffff612ce716565b9063ffffffff612d5a16565b905061292c61291f6127106103e863ffffffff61251116565b829063ffffffff612ce716565b61293e8461271063ffffffff612ce716565b1015612995576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612e3f6024913960400191505060405180910390fd5b505050565b600554600090819061ffff80821691620100009004166129c66127106128fa878463ffffffff612ce716565b92506129de6127106128fa878563ffffffff612ce716565b93505050915091565b60008080805b8551811015612bbb57600073ffffffffffffffffffffffffffffffffffffffff16868281518110612a1a57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415612aa557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7265626174652077616c6c657420616464726573732030000000000000000000604482015290519081900360640190fd5b612ad16127106128fa878481518110612aba57fe5b60200260200101518a612ce790919063ffffffff16565b9150612b388260086000898581518110612ae757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461249490919063ffffffff16565b60086000888481518110612b4857fe5b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002055612b89848363ffffffff61249416565b9350612bb1858281518110612b9a57fe5b60200260200101518461249490919063ffffffff16565b92506001016129ed565b50612710821115612c2d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f74616c526562617465427073203e20313030250000000000000000000000604482015290519081900360640190fd5b50509392505050565b60008184841115612cdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ca4578181015183820152602001612c8c565b50505050905090810190601f168015612cd15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082612cf65750600061250b565b82820282848281612d0357fe5b0414612508576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612e636021913960400191505060405180910390fd5b600061250883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008183612e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315612ca4578181015183820152602001612c8c565b506000838581612e0c57fe5b0495945050505050565b604051806080016040528060008152602001600081526020016000815260200160008152509056fe6b796265724e6574776f726b2065746820746f206b6e63207261746520746f6f206c6f77536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7773616e6974792072617465206973203078302c206275726e696e6720697320626c6f636b6564a26469706673582212206c2983954afdb0c49f4334d3280313d0999ea1b6fc5b40734cf6bae62e7f52ef64736f6c634300060600330000000000000000000000009aab3f75489902f3a48495025729a0af77d4b11e000000000000000000000000defa4e8a7bcba345f687a2f1456f5edd9ce97202000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000e6a7338cba0a1070adfb22c071152996054547130000000000000000000000000e590bb5f02a0c38888bffb45dee050b8fb60bda0000000000000000000000000000000000000000000000000000000000001c6b0000000000000000000000000000000000000000000000000000000000000900
Deployed Bytecode
0x60806040526004361061018f5760003560e01c806394427da9116100d6578063b7c5ab411161007f578063c6c3f3f911610059578063c6c3f3f9146106bf578063e61387e0146106ff578063f0eeed8114610714576101c9565b8063b7c5ab4114610569578063c01bdf041461066a578063c03e798c146106aa576101c9565b8063a840874f116100b0578063a840874f1461052a578063ae2e933b1461053f578063b45782c714610554576101c9565b806394427da91461049f5780639907672a146104d5578063a636a8a214610515576101c9565b806364354d6511610138578063770ba56111610112578063770ba5611461041e57806380feeef31461044c5780638c9bc20814610461576101c9565b806364354d651461033357806366ab3fe614610373578063692bdfd5146103d8576101c9565b80632e4da25c116101695780632e4da25c1461027757806353fa2eb7146102ad578063579d6b74146102f3576101c9565b806303339513146101ce57806312efe8341461022057806319db222814610235576101c9565b366101c9576040805134815290517f353bcaaf167a6add95a753d39727e3d3beb865129a69a10ed774b0b8996714039181900360200190a1005b600080fd5b3480156101da57600080fd5b5061020e600480360360208110156101f157600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610729565b60408051918252519081900360200190f35b34801561022c57600080fd5b5061020e61073b565b34801561024157600080fd5b506102756004803603602081101561025857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610741565b005b34801561028357600080fd5b5061028c6108c2565b6040805161ffff938416815291909216602082015281519081900390910190f35b3480156102b957600080fd5b5061020e600480360360408110156102d057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81351690602001356108d6565b3480156102ff57600080fd5b5061020e6004803603602081101561031657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166108dd565b34801561033f57600080fd5b506102756004803603602081101561035657600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166108ef565b34801561037f57600080fd5b50610388610a70565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156103c45781810151838201526020016103ac565b505050509050019250505060405180910390f35b3480156103e457600080fd5b50610275600480360360408110156103fb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610adf565b34801561042a57600080fd5b50610433610db7565b6040805192835260208301919091528051918290030190f35b34801561045857600080fd5b5061020e610dcc565b34801561046d57600080fd5b50610476610dd2565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156104ab57600080fd5b50610275600480360360608110156104c257600080fd5b5080359060208101359060400135610dee565b3480156104e157600080fd5b5061020e600480360360208110156104f857600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610fa7565b34801561052157600080fd5b5061020e6112cb565b34801561053657600080fd5b5061020e61175c565b34801561054b57600080fd5b50610476611871565b34801561056057600080fd5b5061020e61188d565b610275600480360360c081101561057f57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82351691908101906040810160208201356401000000008111156105b757600080fd5b8201836020820111156105c957600080fd5b803590602001918460208302840111640100000000831117156105eb57600080fd5b91939092909160208101903564010000000081111561060957600080fd5b82018360208201111561061b57600080fd5b8035906020019184602083028401116401000000008311171561063d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602081013590604001356118b1565b34801561067657600080fd5b5061020e6004803603602081101561068d57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611f86565b3480156106b657600080fd5b5061020e6122aa565b3480156106cb57600080fd5b50610275600480360360208110156106e257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166122b0565b34801561070b57600080fd5b50610476612454565b34801561072057600080fd5b50610476612478565b60076020526000908152604090205481565b60095481565b60015473ffffffffffffffffffffffffffffffffffffffff1633146107c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661084957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f666565506f6f6c20300000000000000000000000000000000000000000000000604482015290519081900360640190fd5b6003805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517f6d1d088acfe4f30d6014f6f693c61c16258f9784a6ed8439b2c59213eecb62959181900360200190a150565b60055461ffff808216916201000090041682565b6000806000fd5b60086020526000908152604090205481565b60015473ffffffffffffffffffffffffffffffffffffffff16331461097557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166109f757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f64616f4f70657261746f72203000000000000000000000000000000000000000604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517fadf9b628cb2a4e665382961f42205fce0577c0bb2c0e31ef9f87f4a35033c6919181900360200190a150565b6060600a805480602002602001604051908101604052809291908181526020018280548015610ad557602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610aaa575b5050505050905090565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b6557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b60008111610bd457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5f776569546f4275726e20697320300000000000000000000000000000000000604482015290519081900360640190fd5b600a541580610c155750600a600081548110610bec57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff838116911614155b15610d5d57600a54610c9657600a80546001810182556000919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8416179055610d5d565b600a80600081548110610ca557fe5b6000918252602080832090910154835460018101855593835290822090920180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff90931692909217909155600a8054849290610d1457fe5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60068190556040805173ffffffffffffffffffffffffffffffffffffffff841681526020810183905281517fe40f97f23269c4682610e9b2522d6d4272ee56f115906d71fcb3da82a860f755929181900390910190a15050565b60055461ffff80821692620100009092041690565b60065481565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff163314610e7457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b612710610e9782610e8b868663ffffffff61249416565b9063ffffffff61249416565b14610f0357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f426164204252522076616c756573000000000000000000000000000000000000604482015290519081900360640190fd5b6005805461ffff83811662010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff9186167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921716179055604080518381526020810183905280820185905290517f7806a23da6d7c83c8caf5e3fc8ec22c30900a5fcf10e266ac158ad3c9e3384c49181900360600190a1505050565b60015460009074010000000000000000000000000000000000000000900460ff1661103357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815573ffffffffffffffffffffffffffffffffffffffff8316600090815260076020526040902054116110ed57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6e6f2066656520746f20636c61696d0000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526007602052604090205461112490600163ffffffff61251116565b905080600954101561113257fe5b600954611145908263ffffffff61251116565b60095573ffffffffffffffffffffffffffffffffffffffff8216600081815260076020526040808220600190555190919083908381818185875af1925050503d80600081146111b0576040519150601f19603f3d011682016040523d82523d6000602084013e6111b5565b606091505b505090508061122557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f706c6174666f726d20666565207472616e73666572206661696c656400000000604482015290519081900360640190fd5b60408051838152905173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9173ffffffffffffffffffffffffffffffffffffffff8616917febe3db09f5650582b4782506e0d272262129183570e55fcf8768dd6e91f8c0f69181900360200190a350600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055919050565b600032331461133b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f6f6e6c79206e6f6e2d636f6e7472616374000000000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000001e6004540143116113cd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f77616974206d6f726520626c6f636b7320746f206275726e0000000000000000604482015290519081900360640190fd5b4360045560095447908110156113df57fe5b60006113f66009548361251190919063ffffffff16565b90506006548111611407578061140b565b6006545b600254604080517f418436bc00000000000000000000000000000000000000000000000000000000815273eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee600482015273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000defa4e8a7bcba345f687a2f1456f5edd9ce97202811660248301526044820185905260006064830181905260a0608484015260a4830181905292519495509193919092169163418436bc9160e4808301926020929190829003018186803b1580156114db57600080fd5b505afa1580156114ef573d6000803e3d6000fd5b505050506040513d602081101561150557600080fd5b5051905061151281612553565b600254604080517f7a2a045600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000defa4e8a7bcba345f687a2f1456f5edd9ce97202811660048301526024820185905291519190921691637a2a045691859160448082019260209290919082900301818588803b1580156115b057600080fd5b505af11580156115c4573d6000803e3d6000fd5b50505050506040513d60208110156115db57600080fd5b5051604080517f42966c6800000000000000000000000000000000000000000000000000000000815260048101839052905191955073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000defa4e8a7bcba345f687a2f1456f5edd9ce9720216916342966c68916024808201926020929091908290030181600087803b15801561167057600080fd5b505af1158015611684573d6000803e3d6000fd5b505050506040513d602081101561169a57600080fd5b505161170757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6b6e63206275726e206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b6040805185815260208101849052815173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee927fa0fcef56e2b45fcbeb91d5e629ef6b2b6e982d0768f02d1232610315cd23ea10928290030190a25050505b90565b600a54600090158015906117b65750600073ffffffffffffffffffffffffffffffffffffffff16600a60008154811061179157fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614155b1561186b57600a6000815481106117c957fe5b60009182526020918290200154604080517f50d25bcd000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926350d25bcd92600480840193829003018186803b15801561183857600080fd5b505afa15801561184c573d6000803e3d6000fd5b505050506040513d602081101561186257600080fd5b50519050611759565b50600090565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000001e81565b60015474010000000000000000000000000000000000000000900460ff1661193a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16905573ffffffffffffffffffffffffffffffffffffffff881673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee146119fa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f746f6b656e206e6f742065746800000000000000000000000000000000000000604482015290519081900360640190fd5b611a0a828263ffffffff61249416565b3414611a7757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6d73672e76616c756520213d20746f74616c2066656573000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260076020526040902054611aad908363ffffffff61249416565b73ffffffffffffffffffffffffffffffffffffffff841660009081526007602052604090205580611c4057600954611aeb908363ffffffff61249416565b6009819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff167fc207a63c18c4070ce1e33e5fcc02efb09ac984caa6a2046e2b1d2811723846f1856000808d8d8d8d60006040518089815260200188815260200187815260200180602001806020018481526020018381038352888882818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018481038352868152602090810191508790870280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039c50909a5050505050505050505050a4611f3d565b611c48612e16565b611c518261299a565b6020808401829052918352604080518a840281810185019092528a8152611cc69390918c918c91829185019084908082843760009201919091525050604080516020808d0282810182019093528c82529093508c92508b9182918501908490808284376000920191909152506129e792505050565b604082018190528151611cf19190611ce590859063ffffffff61251116565b9063ffffffff61251116565b60608201526040810151600954611d139190610e8b908663ffffffff61249416565b600955600354815160405160009273ffffffffffffffffffffffffffffffffffffffff1691908381818185875af1925050503d8060008114611d71576040519150601f19603f3d011682016040523d82523d6000602084013e611d76565b606091505b5050905080611de657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f73656e6420666565206661696c65640000000000000000000000000000000000604482015290519081900360640190fd5b8473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff167fc207a63c18c4070ce1e33e5fcc02efb09ac984caa6a2046e2b1d2811723846f187866000015187604001518f8f8f8f8c606001516040518089815260200188815260200187815260200180602001806020018481526020018381038352888882818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018481038352868152602090810191508790870280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039c50909a5050505050505050505050a450505b5050600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055505050505050565b60015460009074010000000000000000000000000000000000000000900460ff1661201257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16815573ffffffffffffffffffffffffffffffffffffffff8316600090815260086020526040902054116120cc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6e6f2072656261746520746f20636c61696d0000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821660009081526008602052604090205461210390600163ffffffff61251116565b905080600954101561211157fe5b600954612124908263ffffffff61251116565b60095573ffffffffffffffffffffffffffffffffffffffff8216600081815260086020526040808220600190555190919083908381818185875af1925050503d806000811461218f576040519150601f19603f3d011682016040523d82523d6000602084013e612194565b606091505b505090508061220457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f726562617465207472616e73666572206661696c656400000000000000000000604482015290519081900360640190fd5b60408051838152905173eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee9173ffffffffffffffffffffffffffffffffffffffff8616917fb5ec5e03662403108373ab6431d3e834cb1011fca164541aef315fc7dea7b3b69181900360200190a350600180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1674010000000000000000000000000000000000000000179055919050565b60045481565b60015473ffffffffffffffffffffffffffffffffffffffff16331461233657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6f6e6c792064616f4f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff81166123b857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6b796265724e6574776f726b50726f7879203000000000000000000000000000604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff828116911614612451576002805473ffffffffffffffffffffffffffffffffffffffff83167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116811790915560408051918252517f8457f9bd0d13488a6c265af376d291f3c6bd2311d9e8dee5671d4169ca6e0ae09181900360200190a15b50565b7f000000000000000000000000defa4e8a7bcba345f687a2f1456f5edd9ce9720281565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b60008282018381101561250857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b90505b92915050565b600061250883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c36565b6a084595161401484a0000008111156125cd57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f657468546f4b6e632072617465206f7574206f6620626f756e64730000000000604482015290519081900360640190fd5b6000811161263c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f657468546f4b6e63207261746520697320300000000000000000000000000000604482015290519081900360640190fd5b600a546126aa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6e6f2073616e697479207261746520636f6e7472616374000000000000000000604482015290519081900360640190fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a6000815481106126d057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415612749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612e846026913960400191505060405180910390fd5b6000600a60008154811061275957fe5b60009182526020918290200154604080517f50d25bcd000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff909216926350d25bcd92600480840193829003018186803b1580156127c857600080fd5b505afa1580156127dc573d6000803e3d6000fd5b505050506040513d60208110156127f257600080fd5b505190508061286257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f73616e6974792072617465206973203000000000000000000000000000000000604482015290519081900360640190fd5b6a084595161401484a0000008111156128dc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f73616e6974792072617465206f7574206f6620626f756e647300000000000000604482015290519081900360640190fd5b6000612906826128fa670de0b6b3a76400008063ffffffff612ce716565b9063ffffffff612d5a16565b905061292c61291f6127106103e863ffffffff61251116565b829063ffffffff612ce716565b61293e8461271063ffffffff612ce716565b1015612995576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180612e3f6024913960400191505060405180910390fd5b505050565b600554600090819061ffff80821691620100009004166129c66127106128fa878463ffffffff612ce716565b92506129de6127106128fa878563ffffffff612ce716565b93505050915091565b60008080805b8551811015612bbb57600073ffffffffffffffffffffffffffffffffffffffff16868281518110612a1a57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415612aa557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f7265626174652077616c6c657420616464726573732030000000000000000000604482015290519081900360640190fd5b612ad16127106128fa878481518110612aba57fe5b60200260200101518a612ce790919063ffffffff16565b9150612b388260086000898581518110612ae757fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461249490919063ffffffff16565b60086000888481518110612b4857fe5b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff16825281019190915260400160002055612b89848363ffffffff61249416565b9350612bb1858281518110612b9a57fe5b60200260200101518461249490919063ffffffff16565b92506001016129ed565b50612710821115612c2d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f74616c526562617465427073203e20313030250000000000000000000000604482015290519081900360640190fd5b50509392505050565b60008184841115612cdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612ca4578181015183820152602001612c8c565b50505050905090810190601f168015612cd15780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082612cf65750600061250b565b82820282848281612d0357fe5b0414612508576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612e636021913960400191505060405180910390fd5b600061250883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008183612e00576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315612ca4578181015183820152602001612c8c565b506000838581612e0c57fe5b0495945050505050565b604051806080016040528060008152602001600081526020016000815260200160008152509056fe6b796265724e6574776f726b2065746820746f206b6e63207261746520746f6f206c6f77536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7773616e6974792072617465206973203078302c206275726e696e6720697320626c6f636b6564a26469706673582212206c2983954afdb0c49f4334d3280313d0999ea1b6fc5b40734cf6bae62e7f52ef64736f6c63430006060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009aab3f75489902f3a48495025729a0af77d4b11e000000000000000000000000defa4e8a7bcba345f687a2f1456f5edd9ce97202000000000000000000000000000000000000000000000000000000000000001e000000000000000000000000e6a7338cba0a1070adfb22c071152996054547130000000000000000000000000e590bb5f02a0c38888bffb45dee050b8fb60bda0000000000000000000000000000000000000000000000000000000000001c6b0000000000000000000000000000000000000000000000000000000000000900
-----Decoded View---------------
Arg [0] : _kyberProxy (address): 0x9AAb3f75489902f3a48495025729a0AF77d4b11e
Arg [1] : _knc (address): 0xdeFA4e8a7bcBA345F687a2f1456F5Edd9CE97202
Arg [2] : _burnBlockInterval (uint256): 30
Arg [3] : _daoOperator (address): 0xE6A7338cba0A1070AdfB22c07115299605454713
Arg [4] : _feePool (address): 0x0E590bB5F02A0c38888bFFb45DeE050b8fB60Bda
Arg [5] : _rewardBps (uint256): 7275
Arg [6] : _rebateBps (uint256): 2304
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000009aab3f75489902f3a48495025729a0af77d4b11e
Arg [1] : 000000000000000000000000defa4e8a7bcba345f687a2f1456f5edd9ce97202
Arg [2] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [3] : 000000000000000000000000e6a7338cba0a1070adfb22c07115299605454713
Arg [4] : 0000000000000000000000000e590bb5f02a0c38888bffb45dee050b8fb60bda
Arg [5] : 0000000000000000000000000000000000000000000000000000000000001c6b
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000900
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,321.93 | 60.9554 | $202,489.47 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.