Source Code
Latest 25 from a total of 56 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Internal Inv... | 8543272 | 2353 days ago | IN | 0 ETH | 0.00079808 | ||||
| Set Internal Inv... | 8543268 | 2353 days ago | IN | 0 ETH | 0.00079808 | ||||
| Set Internal Inv... | 8543243 | 2353 days ago | IN | 0 ETH | 0.00053182 | ||||
| Set Internal Inv... | 8543241 | 2353 days ago | IN | 0 ETH | 0.00053182 | ||||
| Transfer Admin | 8104039 | 2422 days ago | IN | 0 ETH | 0.00122971 | ||||
| Claim Admin | 8104034 | 2422 days ago | IN | 0 ETH | 0.00053146 | ||||
| Withdraw Token | 8047952 | 2431 days ago | IN | 0 ETH | 0.00142371 | ||||
| Withdraw Token | 8047940 | 2431 days ago | IN | 0 ETH | 0.00094283 | ||||
| Withdraw Ether | 7970624 | 2443 days ago | IN | 0 ETH | 0.00066828 | ||||
| Withdraw Ether | 7970606 | 2443 days ago | IN | 0 ETH | 0.00027066 | ||||
| Withdraw Ether | 7795491 | 2470 days ago | IN | 0 ETH | 0.00063811 | ||||
| List Token | 7777115 | 2473 days ago | IN | 0 ETH | 0.00255225 | ||||
| List Token | 7776410 | 2473 days ago | IN | 0 ETH | 0.00219077 | ||||
| Set Fee | 7776403 | 2473 days ago | IN | 0 ETH | 0.00053979 | ||||
| Withdraw Ether | 7776394 | 2473 days ago | IN | 0 ETH | 0.00066828 | ||||
| Transfer Admin | 7776384 | 2473 days ago | IN | 0 ETH | 0.00086535 | ||||
| Claim Admin | 7776374 | 2473 days ago | IN | 0 ETH | 0.00037399 | ||||
| Set Internal Inv... | 7611827 | 2499 days ago | IN | 0 ETH | 0.00033339 | ||||
| Transfer Admin | 7566264 | 2506 days ago | IN | 0 ETH | 0.0004099 | ||||
| Set Internal Inv... | 7535474 | 2511 days ago | IN | 0 ETH | 0.00037044 | ||||
| Set Fee | 7528663 | 2512 days ago | IN | 0 ETH | 0.0002841 | ||||
| Set Internal Inv... | 7527369 | 2512 days ago | IN | 0 ETH | 0.00018522 | ||||
| Set Internal Act... | 7527364 | 2512 days ago | IN | 0 ETH | 0.0001829 | ||||
| Set Internal Act... | 7527348 | 2512 days ago | IN | 0 ETH | 0.0001829 | ||||
| Set Internal Inv... | 7527336 | 2512 days ago | IN | 0 ETH | 0.00018554 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 10904887 | 1980 days ago | 4.38036699 ETH | ||||
| - | 9049361 | 2272 days ago | 0.94275565 ETH | ||||
| - | 9049361 | 2272 days ago | 0.94284993 ETH | ||||
| - | 9049361 | 2272 days ago | 2.36440677 ETH | ||||
| - | 9049361 | 2272 days ago | 2.36464324 ETH | ||||
| - | 9049262 | 2272 days ago | 0.9999 ETH | ||||
| - | 9049262 | 2272 days ago | 1 ETH | ||||
| - | 9049225 | 2272 days ago | 1.01987795 ETH | ||||
| - | 9049225 | 2272 days ago | 1.01997995 ETH | ||||
| - | 9049182 | 2272 days ago | 3.69963 ETH | ||||
| - | 9049182 | 2272 days ago | 3.7 ETH | ||||
| - | 9049137 | 2272 days ago | 0.06428406 ETH | ||||
| - | 9049137 | 2272 days ago | 0.06429048 ETH | ||||
| - | 9049035 | 2272 days ago | 3.40725645 ETH | ||||
| - | 9049035 | 2272 days ago | 3.40759721 ETH | ||||
| - | 9048980 | 2272 days ago | 12.28300055 ETH | ||||
| - | 9048980 | 2272 days ago | 12.28422897 ETH | ||||
| - | 9048882 | 2272 days ago | 3.09511576 ETH | ||||
| - | 9048882 | 2272 days ago | 3.0954253 ETH | ||||
| - | 9048877 | 2272 days ago | 3.09089308 ETH | ||||
| - | 9048877 | 2272 days ago | 3.0912022 ETH | ||||
| - | 9048826 | 2272 days ago | 0.08590677 ETH | ||||
| - | 9048826 | 2272 days ago | 0.08591537 ETH | ||||
| - | 9048767 | 2272 days ago | 2.05525111 ETH | ||||
| - | 9048767 | 2272 days ago | 2.05545666 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
KyberUniswapReserve
Compiler Version
v0.4.18+commit.9cf6e910
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2019-03-14
*/
pragma solidity 0.4.18;
// File: contracts/ERC20Interface.sol
// https://github.com/ethereum/EIPs/issues/20
interface ERC20 {
function totalSupply() public view returns (uint supply);
function balanceOf(address _owner) public view returns (uint balance);
function transfer(address _to, uint _value) public returns (bool success);
function transferFrom(address _from, address _to, uint _value) public returns (bool success);
function approve(address _spender, uint _value) public returns (bool success);
function allowance(address _owner, address _spender) public view returns (uint remaining);
function decimals() public view returns(uint digits);
event Approval(address indexed _owner, address indexed _spender, uint _value);
}
// File: contracts/KyberReserveInterface.sol
/// @title Kyber Reserve contract
interface KyberReserveInterface {
function trade(
ERC20 srcToken,
uint srcAmount,
ERC20 destToken,
address destAddress,
uint conversionRate,
bool validate
)
public
payable
returns(bool);
function getConversionRate(ERC20 src, ERC20 dest, uint srcQty, uint blockNumber) public view returns(uint);
}
// File: contracts/Utils.sol
/// @title Kyber constants contract
contract Utils {
ERC20 constant internal ETH_TOKEN_ADDRESS = ERC20(0x00eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee);
uint constant internal PRECISION = (10**18);
uint constant internal MAX_QTY = (10**28); // 10B tokens
uint constant internal MAX_RATE = (PRECISION * 10**6); // up to 1M tokens per ETH
uint constant internal MAX_DECIMALS = 18;
uint constant internal ETH_DECIMALS = 18;
mapping(address=>uint) internal decimals;
function setDecimals(ERC20 token) internal {
if (token == ETH_TOKEN_ADDRESS) decimals[token] = ETH_DECIMALS;
else decimals[token] = token.decimals();
}
function getDecimals(ERC20 token) internal view returns(uint) {
if (token == ETH_TOKEN_ADDRESS) return ETH_DECIMALS; // save storage access
uint tokenDecimals = decimals[token];
// technically, there might be token with decimals 0
// 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 calcDstQty(uint srcQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) {
require(srcQty <= MAX_QTY);
require(rate <= MAX_RATE);
if (dstDecimals >= srcDecimals) {
require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
return (srcQty * rate * (10**(dstDecimals - srcDecimals))) / PRECISION;
} else {
require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
return (srcQty * rate) / (PRECISION * (10**(srcDecimals - dstDecimals)));
}
}
function calcSrcQty(uint dstQty, uint srcDecimals, uint dstDecimals, uint rate) internal pure returns(uint) {
require(dstQty <= MAX_QTY);
require(rate <= MAX_RATE);
//source quantity is rounded up. to avoid dest quantity being too low.
uint numerator;
uint denominator;
if (srcDecimals >= dstDecimals) {
require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
numerator = (PRECISION * dstQty * (10**(srcDecimals - dstDecimals)));
denominator = rate;
} else {
require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
numerator = (PRECISION * dstQty);
denominator = (rate * (10**(dstDecimals - srcDecimals)));
}
return (numerator + denominator - 1) / denominator; //avoid rounding down errors
}
}
// File: contracts/Utils2.sol
contract Utils2 is Utils {
/// @dev get the balance of a user.
/// @param token The token type
/// @return The balance
function getBalance(ERC20 token, address user) public view returns(uint) {
if (token == ETH_TOKEN_ADDRESS)
return user.balance;
else
return token.balanceOf(user);
}
function getDecimalsSafe(ERC20 token) internal returns(uint) {
if (decimals[token] == 0) {
setDecimals(token);
}
return decimals[token];
}
function calcDestAmount(ERC20 src, ERC20 dest, uint srcAmount, uint rate) internal view returns(uint) {
return calcDstQty(srcAmount, getDecimals(src), getDecimals(dest), rate);
}
function calcSrcAmount(ERC20 src, ERC20 dest, uint destAmount, uint rate) internal view returns(uint) {
return calcSrcQty(destAmount, getDecimals(src), getDecimals(dest), rate);
}
function calcRateFromQty(uint srcAmount, uint destAmount, uint srcDecimals, uint dstDecimals)
internal pure returns(uint)
{
require(srcAmount <= MAX_QTY);
require(destAmount <= MAX_QTY);
if (dstDecimals >= srcDecimals) {
require((dstDecimals - srcDecimals) <= MAX_DECIMALS);
return (destAmount * PRECISION / ((10 ** (dstDecimals - srcDecimals)) * srcAmount));
} else {
require((srcDecimals - dstDecimals) <= MAX_DECIMALS);
return (destAmount * PRECISION * (10 ** (srcDecimals - dstDecimals)) / srcAmount);
}
}
}
// File: contracts/PermissionGroups.sol
contract PermissionGroups {
address public admin;
address public pendingAdmin;
mapping(address=>bool) internal operators;
mapping(address=>bool) internal alerters;
address[] internal operatorsGroup;
address[] internal alertersGroup;
uint constant internal MAX_GROUP_SIZE = 50;
function PermissionGroups() public {
admin = msg.sender;
}
modifier onlyAdmin() {
require(msg.sender == admin);
_;
}
modifier onlyOperator() {
require(operators[msg.sender]);
_;
}
modifier onlyAlerter() {
require(alerters[msg.sender]);
_;
}
function getOperators () external view returns(address[]) {
return operatorsGroup;
}
function getAlerters () external view returns(address[]) {
return alertersGroup;
}
event TransferAdminPending(address pendingAdmin);
/**
* @dev Allows the current admin to set the pendingAdmin address.
* @param newAdmin The address to transfer ownership to.
*/
function transferAdmin(address newAdmin) public onlyAdmin {
require(newAdmin != address(0));
TransferAdminPending(pendingAdmin);
pendingAdmin = newAdmin;
}
/**
* @dev Allows the current admin to set the admin in one tx. Useful initial deployment.
* @param newAdmin The address to transfer ownership to.
*/
function transferAdminQuickly(address newAdmin) public onlyAdmin {
require(newAdmin != address(0));
TransferAdminPending(newAdmin);
AdminClaimed(newAdmin, admin);
admin = newAdmin;
}
event AdminClaimed( address newAdmin, address previousAdmin);
/**
* @dev Allows the pendingAdmin address to finalize the change admin process.
*/
function claimAdmin() public {
require(pendingAdmin == msg.sender);
AdminClaimed(pendingAdmin, admin);
admin = pendingAdmin;
pendingAdmin = address(0);
}
event AlerterAdded (address newAlerter, bool isAdd);
function addAlerter(address newAlerter) public onlyAdmin {
require(!alerters[newAlerter]); // prevent duplicates.
require(alertersGroup.length < MAX_GROUP_SIZE);
AlerterAdded(newAlerter, true);
alerters[newAlerter] = true;
alertersGroup.push(newAlerter);
}
function removeAlerter (address alerter) public onlyAdmin {
require(alerters[alerter]);
alerters[alerter] = false;
for (uint i = 0; i < alertersGroup.length; ++i) {
if (alertersGroup[i] == alerter) {
alertersGroup[i] = alertersGroup[alertersGroup.length - 1];
alertersGroup.length--;
AlerterAdded(alerter, false);
break;
}
}
}
event OperatorAdded(address newOperator, bool isAdd);
function addOperator(address newOperator) public onlyAdmin {
require(!operators[newOperator]); // prevent duplicates.
require(operatorsGroup.length < MAX_GROUP_SIZE);
OperatorAdded(newOperator, true);
operators[newOperator] = true;
operatorsGroup.push(newOperator);
}
function removeOperator (address operator) public onlyAdmin {
require(operators[operator]);
operators[operator] = false;
for (uint i = 0; i < operatorsGroup.length; ++i) {
if (operatorsGroup[i] == operator) {
operatorsGroup[i] = operatorsGroup[operatorsGroup.length - 1];
operatorsGroup.length -= 1;
OperatorAdded(operator, false);
break;
}
}
}
}
// File: contracts/Withdrawable.sol
/**
* @title Contracts that should be able to recover tokens or ethers
* @author Ilan Doron
* @dev This allows to recover any tokens or Ethers received in a contract.
* This will prevent any accidental loss of tokens.
*/
contract Withdrawable is PermissionGroups {
event TokenWithdraw(ERC20 token, uint amount, address sendTo);
/**
* @dev Withdraw all ERC20 compatible tokens
* @param token ERC20 The address of the token contract
*/
function withdrawToken(ERC20 token, uint amount, address sendTo) external onlyAdmin {
require(token.transfer(sendTo, amount));
TokenWithdraw(token, amount, sendTo);
}
event EtherWithdraw(uint amount, address sendTo);
/**
* @dev Withdraw Ethers
*/
function withdrawEther(uint amount, address sendTo) external onlyAdmin {
sendTo.transfer(amount);
EtherWithdraw(amount, sendTo);
}
}
// File: contracts/uniswap/KyberUniswapReserve.sol
interface UniswapExchange {
function ethToTokenSwapInput(
uint256 min_tokens,
uint256 deadline
)
external
payable
returns (uint256 tokens_bought);
function tokenToEthSwapInput(
uint256 tokens_sold,
uint256 min_eth,
uint256 deadline
)
external
returns (uint256 eth_bought);
function getEthToTokenInputPrice(
uint256 eth_sold
)
external
view
returns (uint256 tokens_bought);
function getTokenToEthInputPrice(
uint256 tokens_sold
)
external
view
returns (uint256 eth_bought);
}
interface UniswapFactory {
function getExchange(address token) external view returns (address exchange);
}
/*
* A reserve that connects to Uniswap.
*
* This reserve makes use of an internal inventory for locally filling orders
* using the reserve's inventory when certain conditions are met.
* Conditions are:
* - After trading the inventory will remain within defined limits.
* - Uniswap prices do not display internal arbitrage.
* - Uniswap ask and bid prices meet minimum spread requirements.
*
* An additional premium may be added to the converted price for optional
* promotions.
*/
contract KyberUniswapReserve is KyberReserveInterface, Withdrawable, Utils2 {
// Parts per 10000
uint public constant DEFAULT_FEE_BPS = 25;
UniswapFactory public uniswapFactory;
address public kyberNetwork;
uint public feeBps = DEFAULT_FEE_BPS;
// Uniswap exchange contract for every listed token
// token -> exchange
mapping (address => address) public tokenExchange;
// Internal inventory balance limits
// token -> limit
mapping (address => uint) public internalInventoryMin;
mapping (address => uint) public internalInventoryMax;
// Minimum spread in BPS required for using internal inventory
// token -> limit
mapping (address => uint) public internalActivationMinSpreadBps;
// Premium BPS added to internal price (making it better).
// token -> limit
mapping (address => uint) public internalPricePremiumBps;
bool public tradeEnabled = true;
/**
Constructor
*/
function KyberUniswapReserve(
UniswapFactory _uniswapFactory,
address _admin,
address _kyberNetwork
)
public
{
require(address(_uniswapFactory) != 0);
require(_admin != 0);
require(_kyberNetwork != 0);
uniswapFactory = _uniswapFactory;
admin = _admin;
kyberNetwork = _kyberNetwork;
}
function() public payable {
// anyone can deposit ether
}
/**
Returns dest quantity / source quantity.
Last bit of the rate indicates whether to use internal inventory:
0 - use uniswap
1 - use internal inventory
*/
function getConversionRate(
ERC20 src,
ERC20 dest,
uint srcQty,
uint blockNumber
)
public
view
returns(uint)
{
// This makes the UNUSED warning go away.
blockNumber;
if (!isValidTokens(src, dest)) return 0;
if (!tradeEnabled) return 0;
if (srcQty == 0) return 0;
ERC20 token;
if (src == ETH_TOKEN_ADDRESS) {
token = dest;
} else if (dest == ETH_TOKEN_ADDRESS) {
token = src;
} else {
// Should never arrive here - isValidTokens requires one side to be ETH
revert();
}
uint convertedQuantity;
uint rateSrcDest;
uint rateDestSrc;
(convertedQuantity, rateSrcDest) = calcUniswapConversion(src, dest, srcQty);
(, rateDestSrc) = calcUniswapConversion(dest, src, convertedQuantity);
uint quantityWithPremium = addPremium(token, convertedQuantity);
bool useInternalInventory = shouldUseInternalInventory(
src, /* srcToken */
srcQty, /* srcAmount */
dest, /* destToken */
quantityWithPremium, /* destAmount */
rateSrcDest, /* rateSrcDest */
rateDestSrc /* rateDestSrc */
);
uint rate;
if (useInternalInventory) {
// If using internal inventory add premium to converted quantity
rate = calcRateFromQty(
srcQty, /* srcAmount */
quantityWithPremium, /* destAmount */
getDecimals(src), /* srcDecimals */
getDecimals(dest) /* dstDecimals */
);
} else {
// Use rate calculated from uniswap quantities after fees
rate = rateSrcDest;
}
return applyInternalInventoryHintToRate(rate, useInternalInventory);
}
function applyInternalInventoryHintToRate(
uint rate,
bool useInternalInventory
)
internal
pure
returns(uint)
{
return rate % 2 == (useInternalInventory ? 1 : 0)
? rate
: rate - 1;
}
event TradeExecute(
address indexed sender,
address src,
uint srcAmount,
address destToken,
uint destAmount,
address destAddress,
bool useInternalInventory
);
/**
conversionRate: expected conversion rate should be >= this value.
*/
function trade(
ERC20 srcToken,
uint srcAmount,
ERC20 destToken,
address destAddress,
uint conversionRate,
bool validate
)
public
payable
returns(bool)
{
require(tradeEnabled);
require(msg.sender == kyberNetwork);
require(isValidTokens(srcToken, destToken));
if (validate) {
require(conversionRate > 0);
if (srcToken == ETH_TOKEN_ADDRESS)
require(msg.value == srcAmount);
else
require(msg.value == 0);
}
// Making sure srcAmount has been transfered to the reserve.
// If srcToken is ETH the value has already been transfered by calling
// the function.
if (srcToken != ETH_TOKEN_ADDRESS)
require(srcToken.transferFrom(msg.sender, address(this), srcAmount));
uint expectedDestAmount = calcDestAmount(
srcToken, /* src */
destToken, /* dest */
srcAmount, /* srcAmount */
conversionRate /* rate */
);
bool useInternalInventory = conversionRate % 2 == 1;
uint destAmount;
UniswapExchange exchange;
if (srcToken == ETH_TOKEN_ADDRESS) {
if (!useInternalInventory) {
// Deduct fees (in ETH) before converting
uint quantity = deductFee(srcAmount);
exchange = UniswapExchange(tokenExchange[address(destToken)]);
destAmount = exchange.ethToTokenSwapInput.value(quantity)(
1, /* min_tokens: uniswap requires it to be > 0 */
2 ** 255 /* deadline */
);
require(destAmount >= expectedDestAmount);
}
// Transfer user-expected dest amount
require(destToken.transfer(destAddress, expectedDestAmount));
} else {
if (!useInternalInventory) {
exchange = UniswapExchange(tokenExchange[address(srcToken)]);
destAmount = exchange.tokenToEthSwapInput(
srcAmount,
1, /* min_eth: uniswap requires it to be > 0 */
2 ** 255 /* deadline */
);
// Deduct fees (in ETH) after converting
destAmount = deductFee(destAmount);
require(destAmount >= expectedDestAmount);
}
// Transfer user-expected dest amount
destAddress.transfer(expectedDestAmount);
}
TradeExecute(
msg.sender, /* sender */
srcToken, /* src */
srcAmount, /* srcAmount */
destToken, /* destToken */
expectedDestAmount, /* destAmount */
destAddress, /* destAddress */
useInternalInventory /* useInternalInventory */
);
return true;
}
event FeeUpdated(
uint bps
);
function setFee(
uint bps
)
public
onlyAdmin
{
require(bps <= 10000);
feeBps = bps;
FeeUpdated(bps);
}
event InternalActivationConfigUpdated(
ERC20 token,
uint minSpreadBps,
uint premiumBps
);
function setInternalActivationConfig(
ERC20 token,
uint minSpreadBps,
uint premiumBps
)
public
onlyAdmin
{
require(tokenExchange[address(token)] != address(0));
require(minSpreadBps <= 1000); // min spread <= 10%
require(premiumBps <= 500); // premium <= 5%
internalActivationMinSpreadBps[address(token)] = minSpreadBps;
internalPricePremiumBps[address(token)] = premiumBps;
InternalActivationConfigUpdated(token, minSpreadBps, premiumBps);
}
event InternalInventoryLimitsUpdated(
ERC20 token,
uint minBalance,
uint maxBalance
);
function setInternalInventoryLimits(
ERC20 token,
uint minBalance,
uint maxBalance
)
public
onlyOperator
{
require(tokenExchange[address(token)] != address(0));
internalInventoryMin[address(token)] = minBalance;
internalInventoryMax[address(token)] = maxBalance;
InternalInventoryLimitsUpdated(token, minBalance, maxBalance);
}
event TokenListed(
ERC20 token,
UniswapExchange exchange
);
function listToken(ERC20 token)
public
onlyAdmin
{
require(address(token) != 0);
UniswapExchange uniswapExchange = UniswapExchange(
uniswapFactory.getExchange(token)
);
tokenExchange[address(token)] = address(uniswapExchange);
setDecimals(token);
require(token.approve(uniswapExchange, 2 ** 255));
// internal inventory disabled by default
internalInventoryMin[address(token)] = 2 ** 255;
internalInventoryMax[address(token)] = 0;
internalActivationMinSpreadBps[address(token)] = 0;
internalPricePremiumBps[address(token)] = 0;
TokenListed(token, uniswapExchange);
}
event TokenDelisted(ERC20 token);
function delistToken(ERC20 token)
public
onlyAdmin
{
require(tokenExchange[address(token)] != address(0));
delete tokenExchange[address(token)];
delete internalInventoryMin[address(token)];
delete internalInventoryMax[address(token)];
delete internalActivationMinSpreadBps[address(token)];
delete internalPricePremiumBps[address(token)];
TokenDelisted(token);
}
function isValidTokens(
ERC20 src,
ERC20 dest
)
public
view
returns(bool)
{
return (
(
src == ETH_TOKEN_ADDRESS &&
tokenExchange[address(dest)] != address(0)
) ||
(
tokenExchange[address(src)] != address(0) &&
dest == ETH_TOKEN_ADDRESS
)
);
}
event TradeEnabled(
bool enable
);
function enableTrade()
public
onlyAdmin
returns(bool)
{
tradeEnabled = true;
TradeEnabled(true);
return true;
}
function disableTrade()
public
onlyAlerter
returns(bool)
{
tradeEnabled = false;
TradeEnabled(false);
return true;
}
event KyberNetworkSet(
address kyberNetwork
);
function setKyberNetwork(
address _kyberNetwork
)
public
onlyAdmin
{
require(_kyberNetwork != 0);
kyberNetwork = _kyberNetwork;
KyberNetworkSet(kyberNetwork);
}
/*
* Uses amounts and rates to check if the reserve's internal inventory can
* be used directly.
*
* rateEthToToken and rateTokenToEth are in kyber rate format meaning
* rate as numerator and 1e18 as denominator.
*/
function shouldUseInternalInventory(
ERC20 srcToken,
uint srcAmount,
ERC20 destToken,
uint destAmount,
uint rateSrcDest,
uint rateDestSrc
)
public
view
returns(bool)
{
require(srcAmount < MAX_QTY);
require(destAmount < MAX_QTY);
// Check for internal inventory balance limitations
ERC20 token;
if (srcToken == ETH_TOKEN_ADDRESS) {
token = destToken;
uint tokenBalance = token.balanceOf(this);
if (
tokenBalance < destAmount ||
tokenBalance - destAmount < internalInventoryMin[token]
) {
return false;
}
} else {
token = srcToken;
if (this.balance < destAmount) return false;
if (token.balanceOf(this) + srcAmount > internalInventoryMax[token]) {
return false;
}
}
uint normalizedDestSrc = 10 ** 36 / rateDestSrc;
// Check for arbitrage
if (rateSrcDest > normalizedDestSrc) return false;
uint activationSpread = internalActivationMinSpreadBps[token];
uint spread = uint(calculateSpreadBps(normalizedDestSrc, rateSrcDest));
return spread >= activationSpread;
}
/*
* Spread calculation is (ask - bid) / ((ask + bid) / 2).
* We multiply by 10000 to get result in BPS.
*
* Note: if askRate > bidRate result will be negative indicating
* internal arbitrage.
*/
function calculateSpreadBps(
uint _askRate,
uint _bidRate
)
public
pure
returns(int)
{
int askRate = int(_askRate);
int bidRate = int(_bidRate);
return 10000 * 2 * (askRate - bidRate) / (askRate + bidRate);
}
function deductFee(
uint amount
)
public
view
returns(uint)
{
return amount * (10000 - feeBps) / 10000;
}
function addPremium(
ERC20 token,
uint amount
)
public
view
returns(uint)
{
require(amount <= MAX_QTY);
return amount * (10000 + internalPricePremiumBps[token]) / 10000;
}
function calcUniswapConversion(
ERC20 src,
ERC20 dest,
uint srcQty
)
internal
view
returns(uint destQty, uint rate)
{
UniswapExchange exchange;
if (src == ETH_TOKEN_ADDRESS) {
exchange = UniswapExchange(tokenExchange[address(dest)]);
destQty = exchange.getEthToTokenInputPrice(
deductFee(srcQty)
);
} else {
exchange = UniswapExchange(tokenExchange[address(src)]);
destQty = deductFee(
exchange.getTokenToEthInputPrice(srcQty)
);
}
rate = calcRateFromQty(
srcQty, /* srcAmount */
destQty, /* destAmount */
getDecimals(src), /* srcDecimals */
getDecimals(dest) /* dstDecimals */
);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[],"name":"enableTrade","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"alerter","type":"address"}],"name":"removeAlerter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokenExchange","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"internalPricePremiumBps","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"listToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeBps","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOperators","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DEFAULT_FEE_BPS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"}],"name":"addPremium","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"},{"name":"sendTo","type":"address"}],"name":"withdrawToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newAlerter","type":"address"}],"name":"addAlerter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"internalInventoryMin","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_kyberNetwork","type":"address"}],"name":"setKyberNetwork","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"srcToken","type":"address"},{"name":"srcAmount","type":"uint256"},{"name":"destToken","type":"address"},{"name":"destAmount","type":"uint256"},{"name":"rateSrcDest","type":"uint256"},{"name":"rateDestSrc","type":"uint256"}],"name":"shouldUseInternalInventory","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disableTrade","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"bps","type":"uint256"}],"name":"setFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"srcToken","type":"address"},{"name":"srcAmount","type":"uint256"},{"name":"destToken","type":"address"},{"name":"destAddress","type":"address"},{"name":"conversionRate","type":"uint256"},{"name":"validate","type":"bool"}],"name":"trade","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newAdmin","type":"address"}],"name":"transferAdminQuickly","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"}],"name":"isValidTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"minSpreadBps","type":"uint256"},{"name":"premiumBps","type":"uint256"}],"name":"setInternalActivationConfig","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAlerters","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"},{"name":"srcQty","type":"uint256"},{"name":"blockNumber","type":"uint256"}],"name":"getConversionRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"uniswapFactory","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"internalInventoryMax","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"minBalance","type":"uint256"},{"name":"maxBalance","type":"uint256"}],"name":"setInternalInventoryLimits","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"amount","type":"uint256"}],"name":"deductFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"delistToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"}],"name":"removeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"kyberNetwork","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_askRate","type":"uint256"},{"name":"_bidRate","type":"uint256"}],"name":"calculateSpreadBps","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"internalActivationMinSpreadBps","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"sendTo","type":"address"}],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"getBalance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tradeEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"admin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_uniswapFactory","type":"address"},{"name":"_admin","type":"address"},{"name":"_kyberNetwork","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"src","type":"address"},{"indexed":false,"name":"srcAmount","type":"uint256"},{"indexed":false,"name":"destToken","type":"address"},{"indexed":false,"name":"destAmount","type":"uint256"},{"indexed":false,"name":"destAddress","type":"address"},{"indexed":false,"name":"useInternalInventory","type":"bool"}],"name":"TradeExecute","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"bps","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"minSpreadBps","type":"uint256"},{"indexed":false,"name":"premiumBps","type":"uint256"}],"name":"InternalActivationConfigUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"minBalance","type":"uint256"},{"indexed":false,"name":"maxBalance","type":"uint256"}],"name":"InternalInventoryLimitsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"exchange","type":"address"}],"name":"TokenListed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"}],"name":"TokenDelisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"enable","type":"bool"}],"name":"TradeEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"kyberNetwork","type":"address"}],"name":"KyberNetworkSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"sendTo","type":"address"}],"name":"TokenWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"sendTo","type":"address"}],"name":"EtherWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"pendingAdmin","type":"address"}],"name":"TransferAdminPending","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAdmin","type":"address"},{"indexed":false,"name":"previousAdmin","type":"address"}],"name":"AdminClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAlerter","type":"address"},{"indexed":false,"name":"isAdd","type":"bool"}],"name":"AlerterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOperator","type":"address"},{"indexed":false,"name":"isAdd","type":"bool"}],"name":"OperatorAdded","type":"event"}]Contract Creation Code
60606040526019600955600f805460ff19166001179055341561002157600080fd5b6040516060806125e183398101604052808051919060200180519190602001805160008054600160a060020a03191633600160a060020a039081169190911790915590925084161515905061007557600080fd5b600160a060020a038216151561008a57600080fd5b600160a060020a038116151561009f57600080fd5b60078054600160a060020a03948516600160a060020a0319918216179091556000805493851693821693909317909255600880549190931691161790556124f6806100eb6000396000f3006060604052600436106101c85763ffffffff60e060020a60003504166299d38681146101ca57806301a12fd3146101f15780630dd94b96146102105780631db950781461024b5780631fc1e25f1461027c57806324a9d8531461029b57806326782247146102ae57806327a099d8146102c157806333d8262c146103275780633a6e7d391461033a5780633ccdbb281461035c578063408ee7fe1461038557806348caa206146103a457806354a325a6146103c35780635a65d4c9146103e25780636940030f1461041457806369fe0e2d146104275780636cf698111461043d57806375829def1461046957806377f50f97146104885780637acc86781461049b5780637be98598146104ba5780637bec03aa146104df5780637c423f54146105045780637cd44272146105175780638bdb2afa146105425780639870d7fe14610555578063998614cb146105745780639b9a33ff14610593578063a9afaaaf146105b8578063abffc9ac146105ce578063ac8a584a146105ed578063b78b842d1461060c578063bc91970a1461061f578063c3e0d71214610638578063ce56c45414610657578063d4fac45d14610679578063d621e8131461069e578063f851a440146106b1575b005b34156101d557600080fd5b6101dd6106c4565b604051901515815260200160405180910390f35b34156101fc57600080fd5b6101c8600160a060020a036004351661072c565b341561021b57600080fd5b61022f600160a060020a036004351661089c565b604051600160a060020a03909116815260200160405180910390f35b341561025657600080fd5b61026a600160a060020a03600435166108b7565b60405190815260200160405180910390f35b341561028757600080fd5b6101c8600160a060020a03600435166108c9565b34156102a657600080fd5b61026a610abb565b34156102b957600080fd5b61022f610ac1565b34156102cc57600080fd5b6102d4610ad0565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156103135780820151838201526020016102fb565b505050509050019250505060405180910390f35b341561033257600080fd5b61026a610b38565b341561034557600080fd5b61026a600160a060020a0360043516602435610b3d565b341561036757600080fd5b6101c8600160a060020a036004358116906024359060443516610b82565b341561039057600080fd5b6101c8600160a060020a0360043516610c79565b34156103af57600080fd5b61026a600160a060020a0360043516610d75565b34156103ce57600080fd5b6101c8600160a060020a0360043516610d87565b34156103ed57600080fd5b6101dd600160a060020a03600435811690602435906044351660643560843560a435610e19565b341561041f57600080fd5b6101dd61103d565b341561043257600080fd5b6101c86004356110aa565b6101dd600160a060020a03600435811690602435906044358116906064351660843560a435151561110f565b341561047457600080fd5b6101c8600160a060020a0360043516611537565b341561049357600080fd5b6101c86115d2565b34156104a657600080fd5b6101c8600160a060020a036004351661166c565b34156104c557600080fd5b6101dd600160a060020a036004358116906024351661174e565b34156104ea57600080fd5b6101c8600160a060020a03600435166024356044356117db565b341561050f57600080fd5b6102d46118c4565b341561052257600080fd5b61026a600160a060020a036004358116906024351660443560643561192a565b341561054d57600080fd5b61022f611a4a565b341561056057600080fd5b6101c8600160a060020a0360043516611a59565b341561057f57600080fd5b61026a600160a060020a0360043516611b29565b341561059e57600080fd5b6101c8600160a060020a0360043516602435604435611b3b565b34156105c357600080fd5b61026a600435611c12565b34156105d957600080fd5b6101c8600160a060020a0360043516611c23565b34156105f857600080fd5b6101c8600160a060020a0360043516611cf7565b341561061757600080fd5b61022f611e63565b341561062a57600080fd5b61026a600435602435611e72565b341561064357600080fd5b61026a600160a060020a0360043516611e93565b341561066257600080fd5b6101c8600435600160a060020a0360243516611ea5565b341561068457600080fd5b61026a600160a060020a0360043581169060243516611f38565b34156106a957600080fd5b6101dd611fe3565b34156106bc57600080fd5b61022f611fec565b6000805433600160a060020a039081169116146106e057600080fd5b600f805460ff191660019081179091557f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e73590604051901515815260200160405180910390a15060015b90565b6000805433600160a060020a0390811691161461074857600080fd5b600160a060020a03821660009081526003602052604090205460ff16151561076f57600080fd5b50600160a060020a0381166000908152600360205260408120805460ff191690555b6005548110156108985781600160a060020a03166005828154811015156107b457fe5b600091825260209091200154600160a060020a03161415610890576005805460001981019081106107e157fe5b60009182526020909120015460058054600160a060020a03909216918390811061080757fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556005805490610843906000198301612451565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051600160a060020a039092168252151560208201526040908101905180910390a1610898565b600101610791565b5050565b600a60205260009081526040902054600160a060020a031681565b600e6020526000908152604090205481565b6000805433600160a060020a039081169116146108e557600080fd5b600160a060020a03821615156108fa57600080fd5b600754600160a060020a03166306f2bf628360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561095357600080fd5b6102c65a03f1151561096457600080fd5b5050506040518051600160a060020a038481166000908152600a602052604090208054600160a060020a03191691831691909117905591506109a7905082611ffb565b81600160a060020a031663095ea7b38260ff60020a60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610a0857600080fd5b6102c65a03f11515610a1957600080fd5b505050604051805190501515610a2e57600080fd5b600160a060020a0382166000908152600b6020908152604080832060ff60020a9055600c8252808320839055600d8252808320839055600e909152808220919091557f99d2b755eb38920131acb332adf086ea38d15009f223c21f3aa978d6ab234786908390839051600160a060020a039283168152911660208201526040908101905180910390a15050565b60095481565b600154600160a060020a031681565b610ad861247a565b6004805480602002602001604051908101604052809291908181526020018280548015610b2e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610b10575b5050505050905090565b601981565b60006b204fce5e3e25026110000000821115610b5857600080fd5b50600160a060020a0382166000908152600e60205260409020546127109081018202045b92915050565b60005433600160a060020a03908116911614610b9d57600080fd5b82600160a060020a031663a9059cbb828460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610bfa57600080fd5b6102c65a03f11515610c0b57600080fd5b505050604051805190501515610c2057600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051600160a060020a03938416815260208101929092529091166040808301919091526060909101905180910390a1505050565b60005433600160a060020a03908116911614610c9457600080fd5b600160a060020a03811660009081526003602052604090205460ff1615610cba57600080fd5b60055460329010610cca57600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600360205260409020805460ff191660019081179091556005805490918101610d498382612451565b5060009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055565b600b6020526000908152604090205481565b60005433600160a060020a03908116911614610da257600080fd5b600160a060020a0381161515610db757600080fd5b60088054600160a060020a031916600160a060020a0383811691909117918290557f38622430bb6defd4452b087e8d0b4a6d1c4d35c179c2d7d875d4abb272b9d88b9116604051600160a060020a03909116815260200160405180910390a150565b600080808080806b204fce5e3e250261100000008b10610e3857600080fd5b6b204fce5e3e250261100000008910610e5057600080fd5b600160a060020a038c166000805160206124ab8339815191521415610f1f5789945084600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610ec957600080fd5b6102c65a03f11515610eda57600080fd5b505050604051805194505088841080610f0c5750600160a060020a0385166000908152600b6020526040902054898503105b15610f1a576000955061102e565b610fd2565b8b94508830600160a060020a0316311015610f3d576000955061102e565b600160a060020a0385166000818152600c602052604080822054928e9290916370a08231913091516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610fa757600080fd5b6102c65a03f11515610fb857600080fd5b50505060405180519050011115610fd2576000955061102e565b866ec097ce7bc90715b34b9f1000000000811515610fec57fe5b04925082881115611000576000955061102e565b600160a060020a0385166000908152600d602052604090205491506110258389611e72565b90508181101595505b50505050509695505050505050565b600160a060020a03331660009081526003602052604081205460ff16151561106457600080fd5b600f805460ff191690557f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7356000604051901515815260200160405180910390a150600190565b60005433600160a060020a039081169116146110c557600080fd5b6127108111156110d457600080fd5b60098190557f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c768160405190815260200160405180910390a150565b600f546000908190819081908190819060ff16151561112d57600080fd5b60085433600160a060020a0390811691161461114857600080fd5b6111528c8b61174e565b151561115d57600080fd5b86156111ab576000881161117057600080fd5b600160a060020a038c166000805160206124ab83398151915214156111a057348b1461119b57600080fd5b6111ab565b34156111ab57600080fd5b600160a060020a038c166000805160206124ab83398151915214611259578b600160a060020a03166323b872dd33308e60006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561123357600080fd5b6102c65a03f1151561124457600080fd5b50505060405180519050151561125957600080fd5b6112658c8b8d8b6120b8565b9450600160028906149350600160a060020a038c166000805160206124ab83398151915214156113c75783151561133f5761129f8b611c12565b600160a060020a03808c166000908152600a6020526040808220549092169450919250839163f39b5b9b91849160019160ff60020a9190516020015260405160e060020a63ffffffff8616028152600481019290925260248201526044016020604051808303818588803b151561131557600080fd5b6125ee5a03f1151561132657600080fd5b5050505060405180519350508483101561133f57600080fd5b89600160a060020a031663a9059cbb8a8760006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561139c57600080fd5b6102c65a03f115156113ad57600080fd5b5050506040518051905015156113c257600080fd5b6114af565b83151561147e57600160a060020a03808d166000908152600a602052604080822054909216935083916395e3c50b918e9160019160ff60020a91516020015260405160e060020a63ffffffff8616028152600481019390935260248301919091526044820152606401602060405180830381600087803b151561144957600080fd5b6102c65a03f1151561145a57600080fd5b50505060405180519050925061146f83611c12565b92508483101561147e57600080fd5b600160a060020a03891685156108fc0286604051600060405180830381858888f1935050505015156114af57600080fd5b33600160a060020a03167f3e5691bfb48667c037c1014f0b320bbf4095c37ad5cd1f0b2573366756f54ac68d8d8d898e8a604051600160a060020a039687168152602081019590955292851660408086019190915260608501929092529093166080830152151560a082015260c001905180910390a25060019b9a5050505050505050505050565b60005433600160a060020a0390811691161461155257600080fd5b600160a060020a038116151561156757600080fd5b6001547f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4090600160a060020a0316604051600160a060020a03909116815260200160405180910390a160018054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a039081169116146115ed57600080fd5b6001546000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed91600160a060020a039081169116604051600160a060020a039283168152911660208201526040908101905180910390a16001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b60005433600160a060020a0390811691161461168757600080fd5b600160a060020a038116151561169c57600080fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051600160a060020a03909116815260200160405180910390a16000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a160008054600160a060020a031916600160a060020a0392909216919091179055565b6000600160a060020a0383166000805160206124ab83398151915214801561178f5750600160a060020a038281166000908152600a60205260409020541615155b806117d45750600160a060020a038381166000908152600a602052604090205416158015906117d45750600160a060020a0382166000805160206124ab833981519152145b9392505050565b60005433600160a060020a039081169116146117f657600080fd5b600160a060020a038381166000908152600a602052604090205416151561181c57600080fd5b6103e882111561182b57600080fd5b6101f481111561183a57600080fd5b600160a060020a0383166000908152600d60209081526040808320859055600e909152908190208290557ff32eb6e759557a6efda6830142e2357097b173bc01c7a45d4f409fd9ce87387b90849084908490518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a1505050565b6118cc61247a565b6005805480602002602001604051908101604052809291908181526020018280548015610b2e57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610b10575050505050905090565b6000806000806000806000806119408c8c61174e565b151561194f5760009750611a3b565b600f5460ff1615156119645760009750611a3b565b8915156119745760009750611a3b565b600160a060020a038c166000805160206124ab833981519152141561199b578a96506119c7565b600160a060020a038b166000805160206124ab83398151915214156119c2578b96506119c7565b600080fd5b6119d28c8c8c6120e1565b90965094506119e28b8d886120e1565b94506119f090508787610b3d565b9250611a008c8b8d868989610e19565b91508115611a2b57611a248a84611a168f61223e565b611a1f8f61223e565b6122fc565b9050611a2e565b50835b611a388183612397565b97505b50505050505050949350505050565b600754600160a060020a031681565b60005433600160a060020a03908116911614611a7457600080fd5b600160a060020a03811660009081526002602052604090205460ff1615611a9a57600080fd5b60045460329010611aaa57600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600260205260409020805460ff191660019081179091556004805490918101610d498382612451565b600c6020526000908152604090205481565b600160a060020a03331660009081526002602052604090205460ff161515611b6257600080fd5b600160a060020a038381166000908152600a6020526040902054161515611b8857600080fd5b600160a060020a0383166000908152600b60209081526040808320859055600c909152908190208290557f5421c19be109a988c30678d84f56dd237868f8147ba05c20a6b78726e8f5d8ca90849084908490518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a1505050565b600954612710908103919091020490565b60005433600160a060020a03908116911614611c3e57600080fd5b600160a060020a038181166000908152600a6020526040902054161515611c6457600080fd5b600160a060020a0381166000908152600a602090815260408083208054600160a060020a0319169055600b8252808320839055600c8252808320839055600d8252808320839055600e909152808220919091557f6621c4efc5efa31320394260425b7d14cbb9d7e3754b2c98c04af66b1cbf315b90829051600160a060020a03909116815260200160405180910390a150565b6000805433600160a060020a03908116911614611d1357600080fd5b600160a060020a03821660009081526002602052604090205460ff161515611d3a57600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b6004548110156108985781600160a060020a0316600482815481101515611d7f57fe5b600091825260209091200154600160a060020a03161415611e5b57600480546000198101908110611dac57fe5b60009182526020909120015460048054600160a060020a039092169183908110611dd257fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600480546000190190611e0e9082612451565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051600160a060020a039092168252151560208201526040908101905180910390a1610898565b600101611d5c565b600854600160a060020a031681565b60008282808201614e2082840302811515611e8957fe5b0595945050505050565b600d6020526000908152604090205481565b60005433600160a060020a03908116911614611ec057600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f193505050501515611ef157600080fd5b7fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de8282604051918252600160a060020a031660208201526040908101905180910390a15050565b6000600160a060020a0383166000805160206124ab8339815191521415611f6a5750600160a060020a03811631610b7c565b82600160a060020a03166370a082318360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611fc157600080fd5b6102c65a03f11515611fd257600080fd5b505050604051805190509050610b7c565b600f5460ff1681565b600054600160a060020a031681565b600160a060020a0381166000805160206124ab833981519152141561203b57600160a060020a0381166000908152600660205260409020601290556120b5565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561208157600080fd5b6102c65a03f1151561209257600080fd5b5050506040518051600160a060020a038316600090815260066020526040902055505b50565b60006120d6836120c78761223e565b6120d08761223e565b856123c4565b90505b949350505050565b60008080600160a060020a0386166000805160206124ab83398151915214156121905750600160a060020a038085166000908152600a6020526040902054168063cd7724c361212f86611c12565b60006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561216e57600080fd5b6102c65a03f1151561217f57600080fd5b50505060405180519050925061221c565b50600160a060020a038086166000908152600a602052604080822054909216916122199183916395b68fe7918891516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b15156121f957600080fd5b6102c65a03f1151561220a57600080fd5b50505060405180519050611c12565b92505b612233848461222a8961223e565b611a1f8961223e565b915050935093915050565b600080600160a060020a0383166000805160206124ab833981519152141561226957601291506122f6565b50600160a060020a0382166000908152600660205260409020548015156122f25782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156122d057600080fd5b6102c65a03f115156122e157600080fd5b5050506040518051905091506122f6565b8091505b50919050565b60006b204fce5e3e2502611000000085111561231757600080fd5b6b204fce5e3e2502611000000084111561233057600080fd5b82821061236b576012838303111561234757600080fd5b84838303600a0a02670de0b6b3a7640000850281151561236357fe5b0490506120d9565b6012828403111561237b57600080fd5b84828403600a0a670de0b6b3a764000086020281151561236357fe5b6000816123a55760006123a8565b60015b60ff1660028406146123bd57600183036117d4565b5090919050565b60006b204fce5e3e250261100000008511156123df57600080fd5b69d3c21bcecceda10000008211156123f657600080fd5b838310612425576012848403111561240d57600080fd5b670de0b6b3a7640000858302858503600a0a02612363565b6012838503111561243557600080fd5b828403600a0a670de0b6b3a76400000282860281151561236357fe5b8154818355818115116124755760008381526020902061247591810190830161248c565b505050565b60206040519081016040526000815290565b61072991905b808211156124a65760008155600101612492565b50905600000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea165627a7a7230582097c6f513921c5857a9e8ad9ef611d7455188933278080fe4e9b76d21b0be451b0029000000000000000000000000c0a47dfe034b400b47bdad5fecda2621de6c4d950000000000000000000000002259099897afaf3813fef3284b91d2b227b66ad400000000000000000000000065897adcba42dcca5dd162c647b1cc3e31238490
Deployed Bytecode
0x6060604052600436106101c85763ffffffff60e060020a60003504166299d38681146101ca57806301a12fd3146101f15780630dd94b96146102105780631db950781461024b5780631fc1e25f1461027c57806324a9d8531461029b57806326782247146102ae57806327a099d8146102c157806333d8262c146103275780633a6e7d391461033a5780633ccdbb281461035c578063408ee7fe1461038557806348caa206146103a457806354a325a6146103c35780635a65d4c9146103e25780636940030f1461041457806369fe0e2d146104275780636cf698111461043d57806375829def1461046957806377f50f97146104885780637acc86781461049b5780637be98598146104ba5780637bec03aa146104df5780637c423f54146105045780637cd44272146105175780638bdb2afa146105425780639870d7fe14610555578063998614cb146105745780639b9a33ff14610593578063a9afaaaf146105b8578063abffc9ac146105ce578063ac8a584a146105ed578063b78b842d1461060c578063bc91970a1461061f578063c3e0d71214610638578063ce56c45414610657578063d4fac45d14610679578063d621e8131461069e578063f851a440146106b1575b005b34156101d557600080fd5b6101dd6106c4565b604051901515815260200160405180910390f35b34156101fc57600080fd5b6101c8600160a060020a036004351661072c565b341561021b57600080fd5b61022f600160a060020a036004351661089c565b604051600160a060020a03909116815260200160405180910390f35b341561025657600080fd5b61026a600160a060020a03600435166108b7565b60405190815260200160405180910390f35b341561028757600080fd5b6101c8600160a060020a03600435166108c9565b34156102a657600080fd5b61026a610abb565b34156102b957600080fd5b61022f610ac1565b34156102cc57600080fd5b6102d4610ad0565b60405160208082528190810183818151815260200191508051906020019060200280838360005b838110156103135780820151838201526020016102fb565b505050509050019250505060405180910390f35b341561033257600080fd5b61026a610b38565b341561034557600080fd5b61026a600160a060020a0360043516602435610b3d565b341561036757600080fd5b6101c8600160a060020a036004358116906024359060443516610b82565b341561039057600080fd5b6101c8600160a060020a0360043516610c79565b34156103af57600080fd5b61026a600160a060020a0360043516610d75565b34156103ce57600080fd5b6101c8600160a060020a0360043516610d87565b34156103ed57600080fd5b6101dd600160a060020a03600435811690602435906044351660643560843560a435610e19565b341561041f57600080fd5b6101dd61103d565b341561043257600080fd5b6101c86004356110aa565b6101dd600160a060020a03600435811690602435906044358116906064351660843560a435151561110f565b341561047457600080fd5b6101c8600160a060020a0360043516611537565b341561049357600080fd5b6101c86115d2565b34156104a657600080fd5b6101c8600160a060020a036004351661166c565b34156104c557600080fd5b6101dd600160a060020a036004358116906024351661174e565b34156104ea57600080fd5b6101c8600160a060020a03600435166024356044356117db565b341561050f57600080fd5b6102d46118c4565b341561052257600080fd5b61026a600160a060020a036004358116906024351660443560643561192a565b341561054d57600080fd5b61022f611a4a565b341561056057600080fd5b6101c8600160a060020a0360043516611a59565b341561057f57600080fd5b61026a600160a060020a0360043516611b29565b341561059e57600080fd5b6101c8600160a060020a0360043516602435604435611b3b565b34156105c357600080fd5b61026a600435611c12565b34156105d957600080fd5b6101c8600160a060020a0360043516611c23565b34156105f857600080fd5b6101c8600160a060020a0360043516611cf7565b341561061757600080fd5b61022f611e63565b341561062a57600080fd5b61026a600435602435611e72565b341561064357600080fd5b61026a600160a060020a0360043516611e93565b341561066257600080fd5b6101c8600435600160a060020a0360243516611ea5565b341561068457600080fd5b61026a600160a060020a0360043581169060243516611f38565b34156106a957600080fd5b6101dd611fe3565b34156106bc57600080fd5b61022f611fec565b6000805433600160a060020a039081169116146106e057600080fd5b600f805460ff191660019081179091557f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e73590604051901515815260200160405180910390a15060015b90565b6000805433600160a060020a0390811691161461074857600080fd5b600160a060020a03821660009081526003602052604090205460ff16151561076f57600080fd5b50600160a060020a0381166000908152600360205260408120805460ff191690555b6005548110156108985781600160a060020a03166005828154811015156107b457fe5b600091825260209091200154600160a060020a03161415610890576005805460001981019081106107e157fe5b60009182526020909120015460058054600160a060020a03909216918390811061080757fe5b60009182526020909120018054600160a060020a031916600160a060020a03929092169190911790556005805490610843906000198301612451565b507f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762826000604051600160a060020a039092168252151560208201526040908101905180910390a1610898565b600101610791565b5050565b600a60205260009081526040902054600160a060020a031681565b600e6020526000908152604090205481565b6000805433600160a060020a039081169116146108e557600080fd5b600160a060020a03821615156108fa57600080fd5b600754600160a060020a03166306f2bf628360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b151561095357600080fd5b6102c65a03f1151561096457600080fd5b5050506040518051600160a060020a038481166000908152600a602052604090208054600160a060020a03191691831691909117905591506109a7905082611ffb565b81600160a060020a031663095ea7b38260ff60020a60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610a0857600080fd5b6102c65a03f11515610a1957600080fd5b505050604051805190501515610a2e57600080fd5b600160a060020a0382166000908152600b6020908152604080832060ff60020a9055600c8252808320839055600d8252808320839055600e909152808220919091557f99d2b755eb38920131acb332adf086ea38d15009f223c21f3aa978d6ab234786908390839051600160a060020a039283168152911660208201526040908101905180910390a15050565b60095481565b600154600160a060020a031681565b610ad861247a565b6004805480602002602001604051908101604052809291908181526020018280548015610b2e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610b10575b5050505050905090565b601981565b60006b204fce5e3e25026110000000821115610b5857600080fd5b50600160a060020a0382166000908152600e60205260409020546127109081018202045b92915050565b60005433600160a060020a03908116911614610b9d57600080fd5b82600160a060020a031663a9059cbb828460006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b1515610bfa57600080fd5b6102c65a03f11515610c0b57600080fd5b505050604051805190501515610c2057600080fd5b7f72cb8a894ddb372ceec3d2a7648d86f17d5a15caae0e986c53109b8a9a9385e6838383604051600160a060020a03938416815260208101929092529091166040808301919091526060909101905180910390a1505050565b60005433600160a060020a03908116911614610c9457600080fd5b600160a060020a03811660009081526003602052604090205460ff1615610cba57600080fd5b60055460329010610cca57600080fd5b7f5611bf3e417d124f97bf2c788843ea8bb502b66079fbee02158ef30b172cb762816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600360205260409020805460ff191660019081179091556005805490918101610d498382612451565b5060009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055565b600b6020526000908152604090205481565b60005433600160a060020a03908116911614610da257600080fd5b600160a060020a0381161515610db757600080fd5b60088054600160a060020a031916600160a060020a0383811691909117918290557f38622430bb6defd4452b087e8d0b4a6d1c4d35c179c2d7d875d4abb272b9d88b9116604051600160a060020a03909116815260200160405180910390a150565b600080808080806b204fce5e3e250261100000008b10610e3857600080fd5b6b204fce5e3e250261100000008910610e5057600080fd5b600160a060020a038c166000805160206124ab8339815191521415610f1f5789945084600160a060020a03166370a082313060006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610ec957600080fd5b6102c65a03f11515610eda57600080fd5b505050604051805194505088841080610f0c5750600160a060020a0385166000908152600b6020526040902054898503105b15610f1a576000955061102e565b610fd2565b8b94508830600160a060020a0316311015610f3d576000955061102e565b600160a060020a0385166000818152600c602052604080822054928e9290916370a08231913091516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610fa757600080fd5b6102c65a03f11515610fb857600080fd5b50505060405180519050011115610fd2576000955061102e565b866ec097ce7bc90715b34b9f1000000000811515610fec57fe5b04925082881115611000576000955061102e565b600160a060020a0385166000908152600d602052604090205491506110258389611e72565b90508181101595505b50505050509695505050505050565b600160a060020a03331660009081526003602052604081205460ff16151561106457600080fd5b600f805460ff191690557f7d7f00509dd73ac4449f698ae75ccc797895eff5fa9d446d3df387598a26e7356000604051901515815260200160405180910390a150600190565b60005433600160a060020a039081169116146110c557600080fd5b6127108111156110d457600080fd5b60098190557f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c768160405190815260200160405180910390a150565b600f546000908190819081908190819060ff16151561112d57600080fd5b60085433600160a060020a0390811691161461114857600080fd5b6111528c8b61174e565b151561115d57600080fd5b86156111ab576000881161117057600080fd5b600160a060020a038c166000805160206124ab83398151915214156111a057348b1461119b57600080fd5b6111ab565b34156111ab57600080fd5b600160a060020a038c166000805160206124ab83398151915214611259578b600160a060020a03166323b872dd33308e60006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561123357600080fd5b6102c65a03f1151561124457600080fd5b50505060405180519050151561125957600080fd5b6112658c8b8d8b6120b8565b9450600160028906149350600160a060020a038c166000805160206124ab83398151915214156113c75783151561133f5761129f8b611c12565b600160a060020a03808c166000908152600a6020526040808220549092169450919250839163f39b5b9b91849160019160ff60020a9190516020015260405160e060020a63ffffffff8616028152600481019290925260248201526044016020604051808303818588803b151561131557600080fd5b6125ee5a03f1151561132657600080fd5b5050505060405180519350508483101561133f57600080fd5b89600160a060020a031663a9059cbb8a8760006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561139c57600080fd5b6102c65a03f115156113ad57600080fd5b5050506040518051905015156113c257600080fd5b6114af565b83151561147e57600160a060020a03808d166000908152600a602052604080822054909216935083916395e3c50b918e9160019160ff60020a91516020015260405160e060020a63ffffffff8616028152600481019390935260248301919091526044820152606401602060405180830381600087803b151561144957600080fd5b6102c65a03f1151561145a57600080fd5b50505060405180519050925061146f83611c12565b92508483101561147e57600080fd5b600160a060020a03891685156108fc0286604051600060405180830381858888f1935050505015156114af57600080fd5b33600160a060020a03167f3e5691bfb48667c037c1014f0b320bbf4095c37ad5cd1f0b2573366756f54ac68d8d8d898e8a604051600160a060020a039687168152602081019590955292851660408086019190915260608501929092529093166080830152151560a082015260c001905180910390a25060019b9a5050505050505050505050565b60005433600160a060020a0390811691161461155257600080fd5b600160a060020a038116151561156757600080fd5b6001547f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4090600160a060020a0316604051600160a060020a03909116815260200160405180910390a160018054600160a060020a031916600160a060020a0392909216919091179055565b60015433600160a060020a039081169116146115ed57600080fd5b6001546000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed91600160a060020a039081169116604051600160a060020a039283168152911660208201526040908101905180910390a16001805460008054600160a060020a0319908116600160a060020a03841617909155169055565b60005433600160a060020a0390811691161461168757600080fd5b600160a060020a038116151561169c57600080fd5b7f3b81caf78fa51ecbc8acb482fd7012a277b428d9b80f9d156e8a54107496cc4081604051600160a060020a03909116815260200160405180910390a16000547f65da1cfc2c2e81576ad96afb24a581f8e109b7a403b35cbd3243a1c99efdb9ed908290600160a060020a0316604051600160a060020a039283168152911660208201526040908101905180910390a160008054600160a060020a031916600160a060020a0392909216919091179055565b6000600160a060020a0383166000805160206124ab83398151915214801561178f5750600160a060020a038281166000908152600a60205260409020541615155b806117d45750600160a060020a038381166000908152600a602052604090205416158015906117d45750600160a060020a0382166000805160206124ab833981519152145b9392505050565b60005433600160a060020a039081169116146117f657600080fd5b600160a060020a038381166000908152600a602052604090205416151561181c57600080fd5b6103e882111561182b57600080fd5b6101f481111561183a57600080fd5b600160a060020a0383166000908152600d60209081526040808320859055600e909152908190208290557ff32eb6e759557a6efda6830142e2357097b173bc01c7a45d4f409fd9ce87387b90849084908490518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a1505050565b6118cc61247a565b6005805480602002602001604051908101604052809291908181526020018280548015610b2e57602002820191906000526020600020908154600160a060020a03168152600190910190602001808311610b10575050505050905090565b6000806000806000806000806119408c8c61174e565b151561194f5760009750611a3b565b600f5460ff1615156119645760009750611a3b565b8915156119745760009750611a3b565b600160a060020a038c166000805160206124ab833981519152141561199b578a96506119c7565b600160a060020a038b166000805160206124ab83398151915214156119c2578b96506119c7565b600080fd5b6119d28c8c8c6120e1565b90965094506119e28b8d886120e1565b94506119f090508787610b3d565b9250611a008c8b8d868989610e19565b91508115611a2b57611a248a84611a168f61223e565b611a1f8f61223e565b6122fc565b9050611a2e565b50835b611a388183612397565b97505b50505050505050949350505050565b600754600160a060020a031681565b60005433600160a060020a03908116911614611a7457600080fd5b600160a060020a03811660009081526002602052604090205460ff1615611a9a57600080fd5b60045460329010611aaa57600080fd5b7f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b816001604051600160a060020a039092168252151560208201526040908101905180910390a1600160a060020a0381166000908152600260205260409020805460ff191660019081179091556004805490918101610d498382612451565b600c6020526000908152604090205481565b600160a060020a03331660009081526002602052604090205460ff161515611b6257600080fd5b600160a060020a038381166000908152600a6020526040902054161515611b8857600080fd5b600160a060020a0383166000908152600b60209081526040808320859055600c909152908190208290557f5421c19be109a988c30678d84f56dd237868f8147ba05c20a6b78726e8f5d8ca90849084908490518084600160a060020a0316600160a060020a03168152602001838152602001828152602001935050505060405180910390a1505050565b600954612710908103919091020490565b60005433600160a060020a03908116911614611c3e57600080fd5b600160a060020a038181166000908152600a6020526040902054161515611c6457600080fd5b600160a060020a0381166000908152600a602090815260408083208054600160a060020a0319169055600b8252808320839055600c8252808320839055600d8252808320839055600e909152808220919091557f6621c4efc5efa31320394260425b7d14cbb9d7e3754b2c98c04af66b1cbf315b90829051600160a060020a03909116815260200160405180910390a150565b6000805433600160a060020a03908116911614611d1357600080fd5b600160a060020a03821660009081526002602052604090205460ff161515611d3a57600080fd5b50600160a060020a0381166000908152600260205260408120805460ff191690555b6004548110156108985781600160a060020a0316600482815481101515611d7f57fe5b600091825260209091200154600160a060020a03161415611e5b57600480546000198101908110611dac57fe5b60009182526020909120015460048054600160a060020a039092169183908110611dd257fe5b60009182526020909120018054600160a060020a031916600160a060020a0392909216919091179055600480546000190190611e0e9082612451565b507f091a7a4b85135fdd7e8dbc18b12fabe5cc191ea867aa3c2e1a24a102af61d58b826000604051600160a060020a039092168252151560208201526040908101905180910390a1610898565b600101611d5c565b600854600160a060020a031681565b60008282808201614e2082840302811515611e8957fe5b0595945050505050565b600d6020526000908152604090205481565b60005433600160a060020a03908116911614611ec057600080fd5b600160a060020a03811682156108fc0283604051600060405180830381858888f193505050501515611ef157600080fd5b7fec47e7ed86c86774d1a72c19f35c639911393fe7c1a34031fdbd260890da90de8282604051918252600160a060020a031660208201526040908101905180910390a15050565b6000600160a060020a0383166000805160206124ab8339815191521415611f6a5750600160a060020a03811631610b7c565b82600160a060020a03166370a082318360006040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515611fc157600080fd5b6102c65a03f11515611fd257600080fd5b505050604051805190509050610b7c565b600f5460ff1681565b600054600160a060020a031681565b600160a060020a0381166000805160206124ab833981519152141561203b57600160a060020a0381166000908152600660205260409020601290556120b5565b80600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561208157600080fd5b6102c65a03f1151561209257600080fd5b5050506040518051600160a060020a038316600090815260066020526040902055505b50565b60006120d6836120c78761223e565b6120d08761223e565b856123c4565b90505b949350505050565b60008080600160a060020a0386166000805160206124ab83398151915214156121905750600160a060020a038085166000908152600a6020526040902054168063cd7724c361212f86611c12565b60006040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561216e57600080fd5b6102c65a03f1151561217f57600080fd5b50505060405180519050925061221c565b50600160a060020a038086166000908152600a602052604080822054909216916122199183916395b68fe7918891516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b15156121f957600080fd5b6102c65a03f1151561220a57600080fd5b50505060405180519050611c12565b92505b612233848461222a8961223e565b611a1f8961223e565b915050935093915050565b600080600160a060020a0383166000805160206124ab833981519152141561226957601291506122f6565b50600160a060020a0382166000908152600660205260409020548015156122f25782600160a060020a031663313ce5676000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156122d057600080fd5b6102c65a03f115156122e157600080fd5b5050506040518051905091506122f6565b8091505b50919050565b60006b204fce5e3e2502611000000085111561231757600080fd5b6b204fce5e3e2502611000000084111561233057600080fd5b82821061236b576012838303111561234757600080fd5b84838303600a0a02670de0b6b3a7640000850281151561236357fe5b0490506120d9565b6012828403111561237b57600080fd5b84828403600a0a670de0b6b3a764000086020281151561236357fe5b6000816123a55760006123a8565b60015b60ff1660028406146123bd57600183036117d4565b5090919050565b60006b204fce5e3e250261100000008511156123df57600080fd5b69d3c21bcecceda10000008211156123f657600080fd5b838310612425576012848403111561240d57600080fd5b670de0b6b3a7640000858302858503600a0a02612363565b6012838503111561243557600080fd5b828403600a0a670de0b6b3a76400000282860281151561236357fe5b8154818355818115116124755760008381526020902061247591810190830161248c565b505050565b60206040519081016040526000815290565b61072991905b808211156124a65760008155600101612492565b50905600000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeea165627a7a7230582097c6f513921c5857a9e8ad9ef611d7455188933278080fe4e9b76d21b0be451b0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c0a47dfe034b400b47bdad5fecda2621de6c4d950000000000000000000000002259099897afaf3813fef3284b91d2b227b66ad400000000000000000000000065897adcba42dcca5dd162c647b1cc3e31238490
-----Decoded View---------------
Arg [0] : _uniswapFactory (address): 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95
Arg [1] : _admin (address): 0x2259099897AfAf3813fef3284b91D2B227b66AD4
Arg [2] : _kyberNetwork (address): 0x65897aDCBa42dcCA5DD162c647b1cC3E31238490
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000c0a47dfe034b400b47bdad5fecda2621de6c4d95
Arg [1] : 0000000000000000000000002259099897afaf3813fef3284b91d2b227b66ad4
Arg [2] : 00000000000000000000000065897adcba42dcca5dd162c647b1cc3e31238490
Swarm Source
bzzr://97c6f513921c5857a9e8ad9ef611d7455188933278080fe4e9b76d21b0be451b
Loading...
Loading
Loading...
Loading
Net Worth in USD
$611.49
Net Worth in ETH
0.314844
Token Allocations
SAI
61.16%
BAT
24.74%
TUSD
6.11%
Others
7.98%
Multichain Portfolio | 34 Chains
Loading...
Loading
Loading...
Loading
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.