Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 19 from a total of 19 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Execute Orders | 5976885 | 2815 days ago | IN | 0 ETH | 0.020382 | ||||
| Execute Orders | 5976875 | 2815 days ago | IN | 0.29508948 ETH | 0.00582407 | ||||
| Execute Orders | 5976852 | 2815 days ago | IN | 0.00056059 ETH | 0.0039123 | ||||
| Execute Orders | 5976826 | 2815 days ago | IN | 0 ETH | 0.00633952 | ||||
| Set Handler | 5976761 | 2815 days ago | IN | 0 ETH | 0.00014359 | ||||
| Set Handler | 5976759 | 2815 days ago | IN | 0 ETH | 0.00014359 | ||||
| Set Handler | 5976756 | 2815 days ago | IN | 0 ETH | 0.00043781 | ||||
| Set Handler | 5976753 | 2815 days ago | IN | 0 ETH | 0.00043781 | ||||
| Execute Orders | 5976580 | 2815 days ago | IN | 0 ETH | 0.0009267 | ||||
| Execute Orders | 5976559 | 2815 days ago | IN | 0 ETH | 0.00106334 | ||||
| Execute Orders | 5976539 | 2815 days ago | IN | 0 ETH | 0.0020355 | ||||
| Execute Orders | 5976510 | 2815 days ago | IN | 0 ETH | 0.00245952 | ||||
| Execute Orders | 5976448 | 2815 days ago | IN | 0.02179043 ETH | 0.0051156 | ||||
| Execute Orders | 5976391 | 2815 days ago | IN | 0.02181308 ETH | 0.0051156 | ||||
| Set Handler | 5975197 | 2815 days ago | IN | 0 ETH | 0.00043781 | ||||
| Set Handler | 5975194 | 2815 days ago | IN | 0 ETH | 0.00043781 | ||||
| Set Handler | 5975191 | 2815 days ago | IN | 0 ETH | 0.00043781 | ||||
| Set Handler | 5975188 | 2815 days ago | IN | 0 ETH | 0.00043781 | ||||
| Set Handler | 5975184 | 2815 days ago | IN | 0 ETH | 0.00043781 |
Latest 11 internal transactions
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 5976875 | 2815 days ago | 0.01598501 ETH | ||||
| Transfer | 5976875 | 2815 days ago | 0.21157376 ETH | ||||
| Transfer | 5976875 | 2815 days ago | 0.19439539 ETH | ||||
| Transfer | 5976875 | 2815 days ago | 0.12686469 ETH | ||||
| Transfer | 5976852 | 2815 days ago | 0.00131777 ETH | ||||
| Transfer | 5976852 | 2815 days ago | 0.02158431 ETH | ||||
| Transfer | 5976852 | 2815 days ago | 0.02234149 ETH | ||||
| Transfer | 5976826 | 2815 days ago | 0.01634507 ETH | ||||
| Transfer | 5976826 | 2815 days ago | 0.02234149 ETH | ||||
| Transfer | 5976448 | 2815 days ago | 0.02115576 ETH | ||||
| Transfer | 5976391 | 2815 days ago | 0.02117775 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
TotlePrimary
Compiler Version
v0.4.24+commit.e67f0147
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2018-07-16
*/
pragma solidity 0.4.24;
// File: contracts/ExchangeHandler.sol
/// @title Interface for all exchange handler contracts
interface ExchangeHandler {
/// @dev Get the available amount left to fill for an order
/// @param orderAddresses Array of address values needed for this DEX order
/// @param orderValues Array of uint values needed for this DEX order
/// @param exchangeFee Value indicating the fee for this DEX order
/// @param v ECDSA signature parameter v
/// @param r ECDSA signature parameter r
/// @param s ECDSA signature parameter s
/// @return Available amount left to fill for this order
function getAvailableAmount(
address[8] orderAddresses,
uint256[6] orderValues,
uint256 exchangeFee,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256);
/// @dev Perform a buy order at the exchange
/// @param orderAddresses Array of address values needed for each DEX order
/// @param orderValues Array of uint values needed for each DEX order
/// @param exchangeFee Value indicating the fee for this DEX order
/// @param amountToFill Amount to fill in this order
/// @param v ECDSA signature parameter v
/// @param r ECDSA signature parameter r
/// @param s ECDSA signature parameter s
/// @return Amount filled in this order
function performBuy(
address[8] orderAddresses,
uint256[6] orderValues,
uint256 exchangeFee,
uint256 amountToFill,
uint8 v,
bytes32 r,
bytes32 s
) external payable returns (uint256);
/// @dev Perform a sell order at the exchange
/// @param orderAddresses Array of address values needed for each DEX order
/// @param orderValues Array of uint values needed for each DEX order
/// @param exchangeFee Value indicating the fee for this DEX order
/// @param amountToFill Amount to fill in this order
/// @param v ECDSA signature parameter v
/// @param r ECDSA signature parameter r
/// @param s ECDSA signature parameter s
/// @return Amount filled in this order
function performSell(
address[8] orderAddresses,
uint256[6] orderValues,
uint256 exchangeFee,
uint256 amountToFill,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256);
}
// File: openzeppelin-solidity/contracts/ownership/Ownable.sol
/**
* @title Ownable
* @dev The Ownable contract has an owner address, and provides basic authorization control
* functions, this simplifies the implementation of "user permissions".
*/
contract Ownable {
address public owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev The Ownable constructor sets the original `owner` of the contract to the sender
* account.
*/
function Ownable() public {
owner = msg.sender;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
emit OwnershipTransferred(owner, newOwner);
owner = newOwner;
}
}
// File: openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol
/**
* @title ERC20Basic
* @dev Simpler version of ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/179
*/
contract ERC20Basic {
function totalSupply() public view returns (uint256);
function balanceOf(address who) public view returns (uint256);
function transfer(address to, uint256 value) public returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
}
// File: openzeppelin-solidity/contracts/token/ERC20/ERC20.sol
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
contract Token is ERC20Basic {
function allowance(address owner, address spender) public view returns (uint256);
function transferFrom(address from, address to, uint256 value) public returns (bool);
function approve(address spender, uint256 value) public returns (bool);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: contracts/TokenTransferProxy.sol
/*
Notice - This code is copyright 2017 ZeroEx Intl and licensed
under the Apache License, Version 2.0;
*/
contract TokenTransferProxy is Ownable {
/// @dev Only authorized addresses can invoke functions with this modifier.
modifier onlyAuthorized {
require(authorized[msg.sender]);
_;
}
modifier targetAuthorized(address target) {
require(authorized[target]);
_;
}
modifier targetNotAuthorized(address target) {
require(!authorized[target]);
_;
}
mapping (address => bool) public authorized;
address[] public authorities;
event LogAuthorizedAddressAdded(address indexed target, address indexed caller);
event LogAuthorizedAddressRemoved(address indexed target, address indexed caller);
/*
* Public functions
*/
/// @dev Authorizes an address.
/// @param target Address to authorize.
function addAuthorizedAddress(address target)
public
onlyOwner
targetNotAuthorized(target)
{
authorized[target] = true;
authorities.push(target);
emit LogAuthorizedAddressAdded(target, msg.sender);
}
/// @dev Removes authorizion of an address.
/// @param target Address to remove authorization from.
function removeAuthorizedAddress(address target)
public
onlyOwner
targetAuthorized(target)
{
delete authorized[target];
for (uint i = 0; i < authorities.length; i++) {
if (authorities[i] == target) {
authorities[i] = authorities[authorities.length - 1];
authorities.length -= 1;
break;
}
}
emit LogAuthorizedAddressRemoved(target, msg.sender);
}
/// @dev Calls into ERC20 Token contract, invoking transferFrom.
/// @param token Address of token to transfer.
/// @param from Address to transfer token from.
/// @param to Address to transfer token to.
/// @param value Amount of token to transfer.
/// @return Success of transfer.
function transferFrom(
address token,
address from,
address to,
uint value)
public
onlyAuthorized
returns (bool)
{
return Token(token).transferFrom(from, to, value);
}
/*
* Public constant functions
*/
/// @dev Gets all authorized addresses.
/// @return Array of authorized addresses.
function getAuthorizedAddresses()
public
constant
returns (address[])
{
return authorities;
}
}
// File: openzeppelin-solidity/contracts/math/Math.sol
/**
* @title Math
* @dev Assorted math operations
*/
library Math {
function max64(uint64 a, uint64 b) internal pure returns (uint64) {
return a >= b ? a : b;
}
function min64(uint64 a, uint64 b) internal pure returns (uint64) {
return a < b ? a : b;
}
function max256(uint256 a, uint256 b) internal pure returns (uint256) {
return a >= b ? a : b;
}
function min256(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
}
// File: openzeppelin-solidity/contracts/math/SafeMath.sol
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
// uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return a / b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a);
return c;
}
}
/// @title The primary contract for Totle Inc
contract TotlePrimary is Ownable {
// Constants
uint256 public constant MAX_EXCHANGE_FEE_PERCENTAGE = 0.01 * 10**18; // 1%
bool constant BUY = false;
bool constant SELL = true;
// State variables
mapping(address => bool) public handlerWhitelist;
address tokenTransferProxy;
// Structs
struct Tokens {
address[] tokenAddresses;
bool[] buyOrSell;
uint256[] amountToObtain;
uint256[] amountToGive;
}
struct DEXOrders {
address[] tokenForOrder;
address[] exchanges;
address[8][] orderAddresses;
uint256[6][] orderValues;
uint256[] exchangeFees;
uint8[] v;
bytes32[] r;
bytes32[] s;
}
/// @dev Constructor
/// @param proxy Address of the TokenTransferProxy
constructor(address proxy) public {
tokenTransferProxy = proxy;
}
/*
* Public functions
*/
/// @dev Set an exchange handler address to true/false
/// @notice - onlyOwner modifier only allows the contract owner to run the code
/// @param handler Address of the exchange handler which permission needs changing
/// @param allowed Boolean value to set whether an exchange handler is allowed/denied
function setHandler(address handler, bool allowed) public onlyOwner {
handlerWhitelist[handler] = allowed;
}
/// @dev Synchronously executes an array of orders
/// @notice The first four parameters relate to Token orders, the last eight relate to DEX orders
/// @param tokenAddresses Array of addresses of ERC20 Token contracts for each Token order
/// @param buyOrSell Array indicating whether each Token order is a buy or sell
/// @param amountToObtain Array indicating the amount (in ether or tokens) to obtain in the order
/// @param amountToGive Array indicating the amount (in ether or tokens) to give in the order
/// @param tokenForOrder Array of addresses of ERC20 Token contracts for each DEX order
/// @param exchanges Array of addresses of exchange handler contracts
/// @param orderAddresses Array of address values needed for each DEX order
/// @param orderValues Array of uint values needed for each DEX order
/// @param exchangeFees Array indicating the fee for each DEX order (percentage of fill amount as decimal * 10**18)
/// @param v ECDSA signature parameter v
/// @param r ECDSA signature parameter r
/// @param s ECDSA signature parameter s
function executeOrders(
// Tokens
address[] tokenAddresses,
bool[] buyOrSell,
uint256[] amountToObtain,
uint256[] amountToGive,
// DEX Orders
address[] tokenForOrder,
address[] exchanges,
address[8][] orderAddresses,
uint256[6][] orderValues,
uint256[] exchangeFees,
uint8[] v,
bytes32[] r,
bytes32[] s,
// Unique ID
uint256 uniqueID
) public payable {
require(
tokenAddresses.length == buyOrSell.length &&
buyOrSell.length == amountToObtain.length &&
amountToObtain.length == amountToGive.length,
"TotlePrimary - trade length check failed"
);
require(
tokenForOrder.length == exchanges.length &&
exchanges.length == orderAddresses.length &&
orderAddresses.length == orderValues.length &&
orderValues.length == exchangeFees.length &&
exchangeFees.length == v.length &&
v.length == r.length &&
r.length == s.length,
"TotlePrimary - order length check failed"
);
// Wrapping order in structs to reduce local variable count
internalOrderExecution(
Tokens(
tokenAddresses,
buyOrSell,
amountToObtain,
amountToGive
),
DEXOrders(
tokenForOrder,
exchanges,
orderAddresses,
orderValues,
exchangeFees,
v,
r,
s
)
);
}
/*
* Internal functions
*/
/// @dev Synchronously executes an array of orders
/// @notice The orders in this function have been wrapped in structs to reduce the local variable count
/// @param tokens Struct containing the arrays of token orders
/// @param orders Struct containing the arrays of DEX orders
function internalOrderExecution(Tokens tokens, DEXOrders orders) internal {
transferTokens(tokens);
uint256 tokensLength = tokens.tokenAddresses.length;
uint256 ordersLength = orders.tokenForOrder.length;
uint256 etherBalance = msg.value;
uint256 orderIndex = 0;
for(uint256 tokenIndex = 0; tokenIndex < tokensLength; tokenIndex++) {
// NOTE - check for repetitions in the token list?
uint256 amountRemaining = tokens.amountToGive[tokenIndex];
uint256 amountObtained = 0;
while(orderIndex < ordersLength) {
require(
tokens.tokenAddresses[tokenIndex] == orders.tokenForOrder[orderIndex],
"TotlePrimary - tokenAddress != tokenForOrder"
);
require(
handlerWhitelist[orders.exchanges[orderIndex]],
"TotlePrimary - handler not in whitelist"
);
if(amountRemaining > 0) {
if(tokens.buyOrSell[tokenIndex] == BUY) {
require(
etherBalance >= amountRemaining,
"TotlePrimary - not enough ether left to fill next order"
);
}
(amountRemaining, amountObtained) = performTrade(
tokens.buyOrSell[tokenIndex],
amountRemaining,
amountObtained,
orders, // NOTE - unable to send pointer to order values individually, as run out of stack space!
orderIndex
);
}
orderIndex = SafeMath.add(orderIndex, 1);
// If this is the last order for this token
if(orderIndex == ordersLength || orders.tokenForOrder[SafeMath.sub(orderIndex, 1)] != orders.tokenForOrder[orderIndex]) {
break;
}
}
uint256 amountGiven = SafeMath.sub(tokens.amountToGive[tokenIndex], amountRemaining);
require(
orderWasValid(amountObtained, amountGiven, tokens.amountToObtain[tokenIndex], tokens.amountToGive[tokenIndex]),
"TotlePrimary - amount obtained for was not high enough"
);
if(tokens.buyOrSell[tokenIndex] == BUY) {
// Take away spent ether from refund balance
etherBalance = SafeMath.sub(etherBalance, amountGiven);
// Transfer back tokens acquired
if(amountObtained > 0) {
require(
Token(tokens.tokenAddresses[tokenIndex]).transfer(msg.sender, amountObtained),
"TotlePrimary - failed to transfer tokens bought to msg.sender"
);
}
} else {
// Add ether to refund balance
etherBalance = SafeMath.add(etherBalance, amountObtained);
// Transfer back un-sold tokens
if(amountRemaining > 0) {
require(
Token(tokens.tokenAddresses[tokenIndex]).transfer(msg.sender, amountRemaining),
"TotlePrimary - failed to transfer remaining tokens to msg.sender after sell"
);
}
}
}
// Send back acquired/unspent ether - throw on failure
if(etherBalance > 0) {
msg.sender.transfer(etherBalance);
}
}
/// @dev Iterates through a list of token orders, transfer the SELL orders to this contract & calculates if we have the ether needed
/// @param tokens Struct containing the arrays of token orders
function transferTokens(Tokens tokens) internal {
uint256 expectedEtherAvailable = msg.value;
uint256 totalEtherNeeded = 0;
for(uint256 i = 0; i < tokens.tokenAddresses.length; i++) {
if(tokens.buyOrSell[i] == BUY) {
totalEtherNeeded = SafeMath.add(totalEtherNeeded, tokens.amountToGive[i]);
} else {
expectedEtherAvailable = SafeMath.add(expectedEtherAvailable, tokens.amountToObtain[i]);
require(
TokenTransferProxy(tokenTransferProxy).transferFrom(
tokens.tokenAddresses[i],
msg.sender,
this,
tokens.amountToGive[i]
),
"TotlePrimary - proxy failed to transfer tokens from user"
);
}
}
// Make sure we have will have enough ETH after SELLs to cover our BUYs
require(
expectedEtherAvailable >= totalEtherNeeded,
"TotlePrimary - not enough ether available to fill all orders"
);
}
/// @dev Performs a single trade via the requested exchange handler
/// @param buyOrSell Boolean value stating whether this is a buy or sell order
/// @param initialRemaining The remaining value we have left to trade
/// @param totalObtained The total amount we have obtained so far
/// @param orders Struct containing all DEX orders
/// @param index Value indicating the index of the specific DEX order we wish to execute
/// @return Remaining value left after trade
/// @return Total value obtained after trade
function performTrade(bool buyOrSell, uint256 initialRemaining, uint256 totalObtained, DEXOrders orders, uint256 index)
internal returns (uint256, uint256) {
uint256 obtained = 0;
uint256 remaining = initialRemaining;
require(
orders.exchangeFees[index] < MAX_EXCHANGE_FEE_PERCENTAGE,
"TotlePrimary - exchange fee was above maximum"
);
uint256 amountToFill = getAmountToFill(remaining, orders, index);
if(amountToFill > 0) {
remaining = SafeMath.sub(remaining, amountToFill);
if(buyOrSell == BUY) {
obtained = ExchangeHandler(orders.exchanges[index]).performBuy.value(amountToFill)(
orders.orderAddresses[index],
orders.orderValues[index],
orders.exchangeFees[index],
amountToFill,
orders.v[index],
orders.r[index],
orders.s[index]
);
} else {
require(
Token(orders.tokenForOrder[index]).transfer(
orders.exchanges[index],
amountToFill
),
"TotlePrimary - token transfer to handler failed for sell"
);
obtained = ExchangeHandler(orders.exchanges[index]).performSell(
orders.orderAddresses[index],
orders.orderValues[index],
orders.exchangeFees[index],
amountToFill,
orders.v[index],
orders.r[index],
orders.s[index]
);
}
}
return (obtained == 0 ? initialRemaining: remaining, SafeMath.add(totalObtained, obtained));
}
/// @dev Get the amount of this order we are able to fill
/// @param remaining Amount we have left to spend
/// @param orders Struct containing all DEX orders
/// @param index Value indicating the index of the specific DEX order we wish to execute
/// @return Minimum of the amount we have left to spend and the available amount at the exchange
function getAmountToFill(uint256 remaining, DEXOrders orders, uint256 index) internal returns (uint256) {
uint256 availableAmount = ExchangeHandler(orders.exchanges[index]).getAvailableAmount(
orders.orderAddresses[index],
orders.orderValues[index],
orders.exchangeFees[index],
orders.v[index],
orders.r[index],
orders.s[index]
);
return Math.min256(remaining, availableAmount);
}
/// @dev Checks whether a given order was valid
/// @param amountObtained Amount of the order which was obtained
/// @param amountGiven Amount given in return for amountObtained
/// @param amountToObtain Amount we intended to obtain
/// @param amountToGive Amount we intended to give in return for amountToObtain
/// @return Boolean value indicating whether this order was valid
function orderWasValid(uint256 amountObtained, uint256 amountGiven, uint256 amountToObtain, uint256 amountToGive) internal pure returns (bool) {
if(amountObtained > 0 && amountGiven > 0) {
// NOTE - Check the edge cases here
if(amountObtained > amountGiven) {
return SafeMath.div(amountToObtain, amountToGive) <= SafeMath.div(amountObtained, amountGiven);
} else {
return SafeMath.div(amountToGive, amountToObtain) >= SafeMath.div(amountGiven, amountObtained);
}
}
return false;
}
function() public payable {
// Check in here that the sender is a contract! (to stop accidents)
uint256 size;
address sender = msg.sender;
assembly {
size := extcodesize(sender)
}
require(size > 0, "TotlePrimary - can only send ether from another contract");
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":false,"inputs":[{"name":"tokenAddresses","type":"address[]"},{"name":"buyOrSell","type":"bool[]"},{"name":"amountToObtain","type":"uint256[]"},{"name":"amountToGive","type":"uint256[]"},{"name":"tokenForOrder","type":"address[]"},{"name":"exchanges","type":"address[]"},{"name":"orderAddresses","type":"address[8][]"},{"name":"orderValues","type":"uint256[6][]"},{"name":"exchangeFees","type":"uint256[]"},{"name":"v","type":"uint8[]"},{"name":"r","type":"bytes32[]"},{"name":"s","type":"bytes32[]"},{"name":"uniqueID","type":"uint256"}],"name":"executeOrders","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"handler","type":"address"},{"name":"allowed","type":"bool"}],"name":"setHandler","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"handlerWhitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_EXCHANGE_FEE_PERCENTAGE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"proxy","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]Contract Creation Code
608060405234801561001057600080fd5b506040516020806121f983398101806040528101908080519060200190929190505050336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050612135806100c46000396000f300608060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806364584b14146101245780638da5cb5b146104e15780639cb7de4b14610538578063c792433f14610587578063cb96b0d6146105e2578063f2fde38b1461060d575b600080339050803b9150600082111515610120576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f546f746c655072696d617279202d2063616e206f6e6c792073656e642065746881526020017f65722066726f6d20616e6f7468657220636f6e7472616374000000000000000081525060400191505060405180910390fd5b5050005b6104df60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610338578484839050610100020160088060200260405190810160405280929190826008602002808284378201915050505050815260200190600101906102f2565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156103b757848483905060c002016006806020026040519081016040528092919082600660200280828437820191505050505081526020019060010190610372565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190929190505050610650565b005b3480156104ed57600080fd5b506104f661086a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561054457600080fd5b50610585600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061088f565b005b34801561059357600080fd5b506105c8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610945565b604051808215151515815260200191505060405180910390f35b3480156105ee57600080fd5b506105f7610965565b6040518082815260200191505060405180910390f35b34801561061957600080fd5b5061064e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610970565b005b8b518d5114801561066257508a518c51145b801561066f575089518b51145b1515610709576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f546f746c655072696d617279202d207472616465206c656e677468206368656381526020017f6b206661696c656400000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8751895114801561071b575086518851145b8015610728575085518751145b8015610735575084518651145b8015610742575083518551145b801561074f575082518451145b801561075c575081518351145b15156107f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f546f746c655072696d617279202d206f72646572206c656e677468206368656381526020017f6b206661696c656400000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61085b6080604051908101604052808f81526020018e81526020018d81526020018c815250610100604051908101604052808c81526020018b81526020018a815260200189815260200188815260200187815260200186815260200185815250610ac5565b50505050505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108ea57600080fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60016020528060005260406000206000915054906101000a900460ff1681565b662386f26fc1000081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109cb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610a0757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080610ada8a6113d4565b8960000151519750886000015151965034955060009450600093505b8784101561137757896060015184815181101515610b1057fe5b906020019060200201519250600091505b86851015610ec157886000015185815181101515610b3b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff168a6000015185815181101515610b6d57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16141515610c28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f546f746c655072696d617279202d20746f6b656e4164647265737320213d207481526020017f6f6b656e466f724f72646572000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008a6020015187815181101515610c3e57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610d2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f546f746c655072696d617279202d2068616e646c6572206e6f7420696e20776881526020017f6974656c6973740000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000831115610e2b57600015158a6020015185815181101515610d4957fe5b9060200190602002015115151415610dfa57828610151515610df9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001807f546f746c655072696d617279202d206e6f7420656e6f7567682065746865722081526020017f6c65667420746f2066696c6c206e657874206f7264657200000000000000000081525060400191505060405180910390fd5b5b610e228a6020015185815181101515610e0f57fe5b9060200190602002015184848c89611757565b80935081945050505b610e36856001611e32565b945086851480610eb25750886000015185815181101515610e5357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff168960000151610e83876001611e4e565b815181101515610e8f57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15610ebc57610ec1565b610b21565b610ee68a6060015185815181101515610ed657fe5b9060200190602002015184611e4e565b9050610f2a82828c6040015187815181101515610eff57fe5b906020019060200201518d6060015188815181101515610f1b57fe5b90602001906020020151611e67565b1515610fc4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001807f546f746c655072696d617279202d20616d6f756e74206f627461696e6564206681526020017f6f7220776173206e6f74206869676820656e6f7567680000000000000000000081525060400191505060405180910390fd5b600015158a6020015185815181101515610fda57fe5b906020019060200201511515141561119a57610ff68682611e4e565b955060008211156111955789600001518481518110151561101357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110bf57600080fd5b505af11580156110d3573d6000803e3d6000fd5b505050506040513d60208110156110e957600080fd5b81019080805190602001909291905050501515611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f546f746c655072696d617279202d206661696c656420746f207472616e73666581526020017f7220746f6b656e7320626f7567687420746f206d73672e73656e64657200000081525060400191505060405180910390fd5b5b61136a565b6111a48683611e32565b95506000831115611369578960000151848151811015156111c157fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561126d57600080fd5b505af1158015611281573d6000803e3d6000fd5b505050506040513d602081101561129757600080fd5b81019080805190602001909291905050501515611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604b8152602001807f546f746c655072696d617279202d206661696c656420746f207472616e73666581526020017f722072656d61696e696e6720746f6b656e7320746f206d73672e73656e64657281526020017f2061667465722073656c6c00000000000000000000000000000000000000000081525060600191505060405180910390fd5b5b5b8380600101945050610af6565b60008611156113c8573373ffffffffffffffffffffffffffffffffffffffff166108fc879081150290604051600060405180830381858888f193505050501580156113c6573d6000803e3d6000fd5b505b50505050505050505050565b600080600034925060009150600090505b8360000151518110156116b3576000151584602001518281518110151561140857fe5b90602001906020020151151514156114465761143f8285606001518381518110151561143057fe5b90602001906020020151611e32565b91506116a6565b61146b8385604001518381518110151561145c57fe5b90602001906020020151611e32565b9250600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea8560000151838151811015156114bd57fe5b9060200190602002015133308860600151868151811015156114db57fe5b906020019060200201516040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1580156115d057600080fd5b505af11580156115e4573d6000803e3d6000fd5b505050506040513d60208110156115fa57600080fd5b810190808051906020019092919050505015156116a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f546f746c655072696d617279202d2070726f7879206661696c656420746f207481526020017f72616e7366657220746f6b656e732066726f6d2075736572000000000000000081525060400191505060405180910390fd5b5b80806001019150506113e5565b818310151515611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001807f546f746c655072696d617279202d206e6f7420656e6f7567682065746865722081526020017f617661696c61626c6520746f2066696c6c20616c6c206f72646572730000000081525060400191505060405180910390fd5b50505050565b6000806000806000809250889150662386f26fc1000087608001518781518110151561177f57fe5b90602001906020020151101515611824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f746c655072696d617279202d2065786368616e676520666565207761732081526020017f61626f7665206d6178696d756d0000000000000000000000000000000000000081525060400191505060405180910390fd5b61182f828888611ecc565b90506000811115611e07576118448282611e4e565b9150600015158a15151415611a585786602001518681518110151561186557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663bdd5be2f8289604001518981518110151561189d57fe5b906020019060200201518a606001518a8151811015156118b957fe5b906020019060200201518b608001518b8151811015156118d557fe5b90602001906020020151868d60a001518d8151811015156118f257fe5b906020019060200201518e60c001518e81518110151561190e57fe5b906020019060200201518f60e001518f81518110151561192a57fe5b906020019060200201516040518963ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018088600860200280838360005b8381101561198a57808201518184015260208101905061196f565b5050505090500187600660200280838360005b838110156119b857808201518184015260208101905061199d565b505050509050018681526020018581526020018460ff1660ff168152602001836000191660001916815260200182600019166000191681526020019750505050505050506020604051808303818588803b158015611a1557600080fd5b505af1158015611a29573d6000803e3d6000fd5b50505050506040513d6020811015611a4057600080fd5b81019080805190602001909291905050509250611e06565b866000015186815181101515611a6a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb886020015188815181101515611aa157fe5b90602001906020020151836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611b3157600080fd5b505af1158015611b45573d6000803e3d6000fd5b505050506040513d6020811015611b5b57600080fd5b81019080805190602001909291905050501515611c06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f546f746c655072696d617279202d20746f6b656e207472616e7366657220746f81526020017f2068616e646c6572206661696c656420666f722073656c6c000000000000000081525060400191505060405180910390fd5b866020015186815181101515611c1857fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16634981b3ca886040015188815181101515611c4f57fe5b90602001906020020151896060015189815181101515611c6b57fe5b906020019060200201518a608001518a815181101515611c8757fe5b90602001906020020151858c60a001518c815181101515611ca457fe5b906020019060200201518d60c001518d815181101515611cc057fe5b906020019060200201518e60e001518e815181101515611cdc57fe5b906020019060200201516040518863ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018088600860200280838360005b83811015611d3c578082015181840152602081019050611d21565b5050505090500187600660200280838360005b83811015611d6a578082015181840152602081019050611d4f565b505050509050018681526020018581526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001975050505050505050602060405180830381600087803b158015611dc857600080fd5b505af1158015611ddc573d6000803e3d6000fd5b505050506040513d6020811015611df257600080fd5b810190808051906020019092919050505092505b5b60008314611e155781611e17565b885b611e218985611e32565b945094505050509550959350505050565b60008183019050828110151515611e4557fe5b80905092915050565b6000828211151515611e5c57fe5b818303905092915050565b60008085118015611e785750600084115b15611ebf5783851115611ea257611e8f85856120da565b611e9984846120da565b11159050611ec4565b611eac84866120da565b611eb683856120da565b10159050611ec4565b600090505b949350505050565b600080836020015183815181101515611ee157fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16634102bf5c856040015185815181101515611f1857fe5b90602001906020020151866060015186815181101515611f3457fe5b90602001906020020151876080015187815181101515611f5057fe5b906020019060200201518860a0015188815181101515611f6c57fe5b906020019060200201518960c0015189815181101515611f8857fe5b906020019060200201518a60e001518a815181101515611fa457fe5b906020019060200201516040518763ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018087600860200280838360005b83811015612004578082015181840152602081019050611fe9565b5050505090500186600660200280838360005b83811015612032578082015181840152602081019050612017565b505050509050018581526020018460ff1660ff168152602001836000191660001916815260200182600019166000191681526020019650505050505050602060405180830381600087803b15801561208957600080fd5b505af115801561209d573d6000803e3d6000fd5b505050506040513d60208110156120b357600080fd5b810190808051906020019092919050505090506120d085826120f0565b9150509392505050565b600081838115156120e757fe5b04905092915050565b60008183106120ff5781612101565b825b9050929150505600a165627a7a7230582042e5b1df16b8cccfab1a23ffb90dd4b115b24adba14e9d8305165f6ac9e5a2fe0029000000000000000000000000ca0ca9c0bafac4724daa5bdfccd105f63b194830
Deployed Bytecode
0x608060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806364584b14146101245780638da5cb5b146104e15780639cb7de4b14610538578063c792433f14610587578063cb96b0d6146105e2578063f2fde38b1461060d575b600080339050803b9150600082111515610120576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f546f746c655072696d617279202d2063616e206f6e6c792073656e642065746881526020017f65722066726f6d20616e6f7468657220636f6e7472616374000000000000000081525060400191505060405180910390fd5b5050005b6104df60048036038101908080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b82821015610338578484839050610100020160088060200260405190810160405280929190826008602002808284378201915050505050815260200190600101906102f2565b5050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020016000905b828210156103b757848483905060c002016006806020026040519081016040528092919082600660200280828437820191505050505081526020019060010190610372565b505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290803590602001908201803590602001908080602002602001604051908101604052809392919081815260200183836020028082843782019150505050505091929192908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190929190505050610650565b005b3480156104ed57600080fd5b506104f661086a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561054457600080fd5b50610585600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080351515906020019092919050505061088f565b005b34801561059357600080fd5b506105c8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610945565b604051808215151515815260200191505060405180910390f35b3480156105ee57600080fd5b506105f7610965565b6040518082815260200191505060405180910390f35b34801561061957600080fd5b5061064e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610970565b005b8b518d5114801561066257508a518c51145b801561066f575089518b51145b1515610709576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f546f746c655072696d617279202d207472616465206c656e677468206368656381526020017f6b206661696c656400000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8751895114801561071b575086518851145b8015610728575085518751145b8015610735575084518651145b8015610742575083518551145b801561074f575082518451145b801561075c575081518351145b15156107f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001807f546f746c655072696d617279202d206f72646572206c656e677468206368656381526020017f6b206661696c656400000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b61085b6080604051908101604052808f81526020018e81526020018d81526020018c815250610100604051908101604052808c81526020018b81526020018a815260200189815260200188815260200187815260200186815260200185815250610ac5565b50505050505050505050505050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156108ea57600080fd5b80600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60016020528060005260406000206000915054906101000a900460ff1681565b662386f26fc1000081565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156109cb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515610a0757600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080600080600080600080610ada8a6113d4565b8960000151519750886000015151965034955060009450600093505b8784101561137757896060015184815181101515610b1057fe5b906020019060200201519250600091505b86851015610ec157886000015185815181101515610b3b57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff168a6000015185815181101515610b6d57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16141515610c28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f546f746c655072696d617279202d20746f6b656e4164647265737320213d207481526020017f6f6b656e466f724f72646572000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008a6020015187815181101515610c3e57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515610d2a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f546f746c655072696d617279202d2068616e646c6572206e6f7420696e20776881526020017f6974656c6973740000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000831115610e2b57600015158a6020015185815181101515610d4957fe5b9060200190602002015115151415610dfa57828610151515610df9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001807f546f746c655072696d617279202d206e6f7420656e6f7567682065746865722081526020017f6c65667420746f2066696c6c206e657874206f7264657200000000000000000081525060400191505060405180910390fd5b5b610e228a6020015185815181101515610e0f57fe5b9060200190602002015184848c89611757565b80935081945050505b610e36856001611e32565b945086851480610eb25750886000015185815181101515610e5357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff168960000151610e83876001611e4e565b815181101515610e8f57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1614155b15610ebc57610ec1565b610b21565b610ee68a6060015185815181101515610ed657fe5b9060200190602002015184611e4e565b9050610f2a82828c6040015187815181101515610eff57fe5b906020019060200201518d6060015188815181101515610f1b57fe5b90602001906020020151611e67565b1515610fc4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001807f546f746c655072696d617279202d20616d6f756e74206f627461696e6564206681526020017f6f7220776173206e6f74206869676820656e6f7567680000000000000000000081525060400191505060405180910390fd5b600015158a6020015185815181101515610fda57fe5b906020019060200201511515141561119a57610ff68682611e4e565b955060008211156111955789600001518481518110151561101357fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33846040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110bf57600080fd5b505af11580156110d3573d6000803e3d6000fd5b505050506040513d60208110156110e957600080fd5b81019080805190602001909291905050501515611194576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603d8152602001807f546f746c655072696d617279202d206661696c656420746f207472616e73666581526020017f7220746f6b656e7320626f7567687420746f206d73672e73656e64657200000081525060400191505060405180910390fd5b5b61136a565b6111a48683611e32565b95506000831115611369578960000151848151811015156111c157fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33856040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561126d57600080fd5b505af1158015611281573d6000803e3d6000fd5b505050506040513d602081101561129757600080fd5b81019080805190602001909291905050501515611368576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252604b8152602001807f546f746c655072696d617279202d206661696c656420746f207472616e73666581526020017f722072656d61696e696e6720746f6b656e7320746f206d73672e73656e64657281526020017f2061667465722073656c6c00000000000000000000000000000000000000000081525060600191505060405180910390fd5b5b5b8380600101945050610af6565b60008611156113c8573373ffffffffffffffffffffffffffffffffffffffff166108fc879081150290604051600060405180830381858888f193505050501580156113c6573d6000803e3d6000fd5b505b50505050505050505050565b600080600034925060009150600090505b8360000151518110156116b3576000151584602001518281518110151561140857fe5b90602001906020020151151514156114465761143f8285606001518381518110151561143057fe5b90602001906020020151611e32565b91506116a6565b61146b8385604001518381518110151561145c57fe5b90602001906020020151611e32565b9250600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166315dacbea8560000151838151811015156114bd57fe5b9060200190602002015133308860600151868151811015156114db57fe5b906020019060200201516040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001828152602001945050505050602060405180830381600087803b1580156115d057600080fd5b505af11580156115e4573d6000803e3d6000fd5b505050506040513d60208110156115fa57600080fd5b810190808051906020019092919050505015156116a5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f546f746c655072696d617279202d2070726f7879206661696c656420746f207481526020017f72616e7366657220746f6b656e732066726f6d2075736572000000000000000081525060400191505060405180910390fd5b5b80806001019150506113e5565b818310151515611751576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603c8152602001807f546f746c655072696d617279202d206e6f7420656e6f7567682065746865722081526020017f617661696c61626c6520746f2066696c6c20616c6c206f72646572730000000081525060400191505060405180910390fd5b50505050565b6000806000806000809250889150662386f26fc1000087608001518781518110151561177f57fe5b90602001906020020151101515611824576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f546f746c655072696d617279202d2065786368616e676520666565207761732081526020017f61626f7665206d6178696d756d0000000000000000000000000000000000000081525060400191505060405180910390fd5b61182f828888611ecc565b90506000811115611e07576118448282611e4e565b9150600015158a15151415611a585786602001518681518110151561186557fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663bdd5be2f8289604001518981518110151561189d57fe5b906020019060200201518a606001518a8151811015156118b957fe5b906020019060200201518b608001518b8151811015156118d557fe5b90602001906020020151868d60a001518d8151811015156118f257fe5b906020019060200201518e60c001518e81518110151561190e57fe5b906020019060200201518f60e001518f81518110151561192a57fe5b906020019060200201516040518963ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018088600860200280838360005b8381101561198a57808201518184015260208101905061196f565b5050505090500187600660200280838360005b838110156119b857808201518184015260208101905061199d565b505050509050018681526020018581526020018460ff1660ff168152602001836000191660001916815260200182600019166000191681526020019750505050505050506020604051808303818588803b158015611a1557600080fd5b505af1158015611a29573d6000803e3d6000fd5b50505050506040513d6020811015611a4057600080fd5b81019080805190602001909291905050509250611e06565b866000015186815181101515611a6a57fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb886020015188815181101515611aa157fe5b90602001906020020151836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611b3157600080fd5b505af1158015611b45573d6000803e3d6000fd5b505050506040513d6020811015611b5b57600080fd5b81019080805190602001909291905050501515611c06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001807f546f746c655072696d617279202d20746f6b656e207472616e7366657220746f81526020017f2068616e646c6572206661696c656420666f722073656c6c000000000000000081525060400191505060405180910390fd5b866020015186815181101515611c1857fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16634981b3ca886040015188815181101515611c4f57fe5b90602001906020020151896060015189815181101515611c6b57fe5b906020019060200201518a608001518a815181101515611c8757fe5b90602001906020020151858c60a001518c815181101515611ca457fe5b906020019060200201518d60c001518d815181101515611cc057fe5b906020019060200201518e60e001518e815181101515611cdc57fe5b906020019060200201516040518863ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018088600860200280838360005b83811015611d3c578082015181840152602081019050611d21565b5050505090500187600660200280838360005b83811015611d6a578082015181840152602081019050611d4f565b505050509050018681526020018581526020018460ff1660ff16815260200183600019166000191681526020018260001916600019168152602001975050505050505050602060405180830381600087803b158015611dc857600080fd5b505af1158015611ddc573d6000803e3d6000fd5b505050506040513d6020811015611df257600080fd5b810190808051906020019092919050505092505b5b60008314611e155781611e17565b885b611e218985611e32565b945094505050509550959350505050565b60008183019050828110151515611e4557fe5b80905092915050565b6000828211151515611e5c57fe5b818303905092915050565b60008085118015611e785750600084115b15611ebf5783851115611ea257611e8f85856120da565b611e9984846120da565b11159050611ec4565b611eac84866120da565b611eb683856120da565b10159050611ec4565b600090505b949350505050565b600080836020015183815181101515611ee157fe5b9060200190602002015173ffffffffffffffffffffffffffffffffffffffff16634102bf5c856040015185815181101515611f1857fe5b90602001906020020151866060015186815181101515611f3457fe5b90602001906020020151876080015187815181101515611f5057fe5b906020019060200201518860a0015188815181101515611f6c57fe5b906020019060200201518960c0015189815181101515611f8857fe5b906020019060200201518a60e001518a815181101515611fa457fe5b906020019060200201516040518763ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018087600860200280838360005b83811015612004578082015181840152602081019050611fe9565b5050505090500186600660200280838360005b83811015612032578082015181840152602081019050612017565b505050509050018581526020018460ff1660ff168152602001836000191660001916815260200182600019166000191681526020019650505050505050602060405180830381600087803b15801561208957600080fd5b505af115801561209d573d6000803e3d6000fd5b505050506040513d60208110156120b357600080fd5b810190808051906020019092919050505090506120d085826120f0565b9150509392505050565b600081838115156120e757fe5b04905092915050565b60008183106120ff5781612101565b825b9050929150505600a165627a7a7230582042e5b1df16b8cccfab1a23ffb90dd4b115b24adba14e9d8305165f6ac9e5a2fe0029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ca0ca9c0bafac4724daa5bdfccd105f63b194830
-----Decoded View---------------
Arg [0] : proxy (address): 0xCA0cA9C0BAFAc4724DAA5bdfccd105F63B194830
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000ca0ca9c0bafac4724daa5bdfccd105f63b194830
Swarm Source
bzzr://42e5b1df16b8cccfab1a23ffb90dd4b115b24adba14e9d8305165f6ac9e5a2fe
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ 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.