Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 7,519 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Poke | 8678218 | 1962 days ago | IN | 0 ETH | 0.00004741 | ||||
Poke | 8178192 | 2040 days ago | IN | 0 ETH | 0.00003416 | ||||
Poke | 7969247 | 2073 days ago | IN | 0 ETH | 0.00019172 | ||||
Poke | 7968938 | 2073 days ago | IN | 0 ETH | 0.00022073 | ||||
Poke | 7968902 | 2073 days ago | IN | 0 ETH | 0.00018104 | ||||
Poke | 7968831 | 2073 days ago | IN | 0 ETH | 0.00021033 | ||||
Poke | 7968777 | 2073 days ago | IN | 0 ETH | 0.00019359 | ||||
Poke | 7968730 | 2073 days ago | IN | 0 ETH | 0.00018194 | ||||
Poke | 7968706 | 2073 days ago | IN | 0 ETH | 0.0001783 | ||||
Poke | 7968530 | 2073 days ago | IN | 0 ETH | 0.00018863 | ||||
Poke | 7967730 | 2073 days ago | IN | 0 ETH | 0.00015562 | ||||
Poke | 7967684 | 2073 days ago | IN | 0 ETH | 0.00019974 | ||||
Poke | 7967662 | 2073 days ago | IN | 0 ETH | 0.0001902 | ||||
Poke | 7967637 | 2073 days ago | IN | 0 ETH | 0.00019326 | ||||
Poke | 7967614 | 2073 days ago | IN | 0 ETH | 0.0003547 | ||||
Poke | 7967579 | 2073 days ago | IN | 0 ETH | 0.00036269 | ||||
Poke | 7967094 | 2073 days ago | IN | 0 ETH | 0.0003632 | ||||
Poke | 7966889 | 2073 days ago | IN | 0 ETH | 0.00017513 | ||||
Poke | 7966855 | 2073 days ago | IN | 0 ETH | 0.00036248 | ||||
Poke | 7966845 | 2073 days ago | IN | 0 ETH | 0.00034879 | ||||
Poke | 7966817 | 2073 days ago | IN | 0 ETH | 0.00038854 | ||||
Poke | 7966801 | 2073 days ago | IN | 0 ETH | 0.00018646 | ||||
Poke | 7966759 | 2073 days ago | IN | 0 ETH | 0.00018398 | ||||
Poke | 7966738 | 2073 days ago | IN | 0 ETH | 0.00018548 | ||||
Poke | 7966717 | 2073 days ago | IN | 0 ETH | 0.0001857 |
Latest 13 internal transactions
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
7908487 | 2082 days ago | 0.67292052 ETH | ||||
7806265 | 2098 days ago | 3.32452739 ETH | ||||
7678602 | 2118 days ago | 1.1974672 ETH | ||||
7632282 | 2125 days ago | 3.52264274 ETH | ||||
7632282 | 2125 days ago | 5 ETH | ||||
7496614 | 2146 days ago | 1.28244212 ETH | ||||
7460690 | 2152 days ago | Contract Creation | 0 ETH | |||
7460641 | 2152 days ago | Contract Creation | 0 ETH | |||
7460602 | 2152 days ago | Contract Creation | 0 ETH | |||
7460568 | 2152 days ago | Contract Creation | 0 ETH | |||
7460502 | 2152 days ago | Contract Creation | 0 ETH | |||
7447457 | 2154 days ago | 5 ETH | ||||
7447336 | 2154 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Polaris
Compiler Version
v0.5.2+commit.1df8f40c
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-03-27 */ pragma solidity 0.5.2; /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ interface IERC20 { function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title Math * @dev Assorted math operations */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Calculates the average of two numbers. Since these are integers, * averages of an even and odd number cannot be represented, and will be * rounded down. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath#mul: Integer overflow"); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath#div: Invalid divisor zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath#sub: Integer underflow"); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath#add: Integer overflow"); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath#mod: Invalid divisor zero"); return a % b; } } contract IUniswapExchange { // Address of ERC20 token sold on this exchange function tokenAddress() external view returns (address token); // Address of Uniswap Factory function factoryAddress() external view returns (address factory); // Provide Liquidity function addLiquidity(uint256 min_liquidity, uint256 max_tokens, uint256 deadline) external payable returns (uint256); function removeLiquidity(uint256 amount, uint256 min_eth, uint256 min_tokens, uint256 deadline) external returns (uint256, uint256); // Get Prices function getEthToTokenInputPrice(uint256 eth_sold) external view returns (uint256 tokens_bought); function getEthToTokenOutputPrice(uint256 tokens_bought) external view returns (uint256 eth_sold); function getTokenToEthInputPrice(uint256 tokens_sold) external view returns (uint256 eth_bought); function getTokenToEthOutputPrice(uint256 eth_bought) external view returns (uint256 tokens_sold); // Trade ETH to ERC20 function ethToTokenSwapInput(uint256 min_tokens, uint256 deadline) external payable returns (uint256 tokens_bought); function ethToTokenTransferInput(uint256 min_tokens, uint256 deadline, address recipient) external payable returns (uint256 tokens_bought); function ethToTokenSwapOutput(uint256 tokens_bought, uint256 deadline) external payable returns (uint256 eth_sold); function ethToTokenTransferOutput(uint256 tokens_bought, uint256 deadline, address recipient) external payable returns (uint256 eth_sold); // Trade ERC20 to ETH function tokenToEthSwapInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline) external returns (uint256 eth_bought); function tokenToEthTransferInput(uint256 tokens_sold, uint256 min_tokens, uint256 deadline, address recipient) external returns (uint256 eth_bought); function tokenToEthSwapOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline) external returns (uint256 tokens_sold); function tokenToEthTransferOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline, address recipient) external returns (uint256 tokens_sold); // Trade ERC20 to ERC20 function tokenToTokenSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address token_addr) external returns (uint256 tokens_bought); function tokenToTokenTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address token_addr) external returns (uint256 tokens_bought); function tokenToTokenSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address token_addr) external returns (uint256 tokens_sold); function tokenToTokenTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address token_addr) external returns (uint256 tokens_sold); // Trade ERC20 to Custom Pool function tokenToExchangeSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address exchange_addr) external returns (uint256 tokens_bought); function tokenToExchangeTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address exchange_addr) external returns (uint256 tokens_bought); function tokenToExchangeSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address exchange_addr) external returns (uint256 tokens_sold); function tokenToExchangeTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address exchange_addr) external returns (uint256 tokens_sold); // ERC20 comaptibility for liquidity tokens bytes32 public name; bytes32 public symbol; uint256 public decimals; function transfer(address _to, uint256 _value) external returns (bool); function transferFrom(address _from, address _to, uint256 value) external returns (bool); function approve(address _spender, uint256 _value) external returns (bool); function allowance(address _owner, address _spender) external view returns (uint256); function balanceOf(address _owner) external view returns (uint256); // Never use function setup(address token_addr) external; } contract IUniswapFactory { // Public Variables address public exchangeTemplate; uint256 public tokenCount; // Create Exchange function createExchange(address token) external returns (address payable exchange); // Get Exchange and Token Info function getExchange(address token) external view returns (address payable exchange); function getToken(address exchange) external view returns (address token); function getTokenWithId(uint256 tokenId) external view returns (address token); } /** * @title Standard ERC20 token * * @dev Implementation of the basic standard token. * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md * Originally based on code by FirstBlood: * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol * * This implementation emits additional Approval events, allowing applications to reconstruct the allowance status for * all accounts just by listening to said events. Note that this isn't required by the specification, and other * compliant implementations may not do it. */ contract ERC20 is IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowed; uint256 private _totalSupply; /** * @dev Total number of tokens in existence */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev Gets the balance of the specified address. * @param owner The address to query the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address owner) public view returns (uint256) { return _balances[owner]; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param owner address The address which owns the funds. * @param spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowed[owner][spender]; } /** * @dev Transfer token for a specified address * @param to The address to transfer to. * @param value The amount to be transferred. */ function transfer(address to, uint256 value) public returns (bool) { _transfer(msg.sender, to, value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * Beware that changing an allowance with this method brings the risk that someone may use both the old * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. */ function approve(address spender, uint256 value) public returns (bool) { require(spender != address(0), "ERC20#approve: Cannot approve address zero"); _allowed[msg.sender][spender] = value; emit Approval(msg.sender, spender, value); return true; } /** * @dev Transfer tokens from one address to another. * Note that while this function emits an Approval event, this is not required as per the specification, * and other compliant implementations may not emit the event. * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to * @param value uint256 the amount of tokens to be transferred */ function transferFrom(address from, address to, uint256 value) public returns (bool) { _allowed[from][msg.sender] = _allowed[from][msg.sender].sub(value); _transfer(from, to, value); emit Approval(from, msg.sender, _allowed[from][msg.sender]); return true; } /** * @dev Increase the amount of tokens that an owner allowed to a spender. * approve should be called when allowed_[_spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * Emits an Approval event. * @param spender The address which will spend the funds. * @param addedValue The amount of tokens to increase the allowance by. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { require(spender != address(0), "ERC20#increaseAllowance: Cannot increase allowance for address zero"); _allowed[msg.sender][spender] = _allowed[msg.sender][spender].add(addedValue); emit Approval(msg.sender, spender, _allowed[msg.sender][spender]); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * approve should be called when allowed_[_spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * Emits an Approval event. * @param spender The address which will spend the funds. * @param subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { require(spender != address(0), "ERC20#decreaseAllowance: Cannot decrease allowance for address zero"); _allowed[msg.sender][spender] = _allowed[msg.sender][spender].sub(subtractedValue); emit Approval(msg.sender, spender, _allowed[msg.sender][spender]); return true; } /** * @dev Transfer token for a specified addresses * @param from The address to transfer from. * @param to The address to transfer to. * @param value The amount to be transferred. */ function _transfer(address from, address to, uint256 value) internal { require(to != address(0), "ERC20#_transfer: Cannot transfer to address zero"); _balances[from] = _balances[from].sub(value); _balances[to] = _balances[to].add(value); emit Transfer(from, to, value); } /** * @dev Internal function that mints an amount of the token and assigns it to * an account. This encapsulates the modification of balances such that the * proper events are emitted. * @param account The account that will receive the created tokens. * @param value The amount that will be created. */ function _mint(address account, uint256 value) internal { require(account != address(0), "ERC20#_mint: Cannot mint to address zero"); _totalSupply = _totalSupply.add(value); _balances[account] = _balances[account].add(value); emit Transfer(address(0), account, value); } /** * @dev Internal function that burns an amount of the token of a given * account. * @param account The account whose tokens will be burnt. * @param value The amount that will be burnt. */ function _burn(address account, uint256 value) internal { require(account != address(0), "ERC20#_burn: Cannot burn from address zero"); _totalSupply = _totalSupply.sub(value); _balances[account] = _balances[account].sub(value); emit Transfer(account, address(0), value); } /** * @dev Internal function that burns an amount of the token of a given * account, deducting from the sender's allowance for said account. Uses the * internal burn function. * Emits an Approval event (reflecting the reduced allowance). * @param account The account whose tokens will be burnt. * @param value The amount that will be burnt. */ function _burnFrom(address account, uint256 value) internal { _allowed[account][msg.sender] = _allowed[account][msg.sender].sub(value); _burn(account, value); emit Approval(account, msg.sender, _allowed[account][msg.sender]); } } contract OracleToken is ERC20 { string public name = "Polaris Token"; string public symbol = "PLRS"; uint8 public decimals = 18; address public oracle; address public token; constructor(address _token) public payable { oracle = msg.sender; token = _token; } function () external payable {} function mint(address to, uint amount) public returns (bool) { require(msg.sender == oracle, "OracleToken::mint: Only Oracle can call mint"); _mint(to, amount); return true; } function redeem(uint amount) public { uint ethAmount = address(this).balance.mul(amount).div(totalSupply()); _burn(msg.sender, amount); msg.sender.transfer(ethAmount); } } pragma experimental ABIEncoderV2; contract Polaris { using Math for uint; using SafeMath for uint; event NewMedian(address indexed token, uint ethReserve, uint tokenReserve); event Subscribe(address indexed token, address indexed subscriber, uint amount); event Unsubscribe(address indexed token, address indexed subscriber, uint amount); uint8 public constant MAX_CHECKPOINTS = 15; // Reward for a successful poke, in oracle tokens uint public constant CHECKPOINT_REWARD = 1e18; // Conditions for checkpoint reward uint public constant MIN_PRICE_CHANGE = .01e18; // 1% uint public constant MAX_TIME_SINCE_LAST_CHECKPOINT = 3 hours; uint public constant PENDING_PERIOD = 3.5 minutes; address public constant ETHER = address(0); // Monthly subscription fee to subscribe to a single oracle uint public constant MONTHLY_SUBSCRIPTION_FEE = 5 ether; uint public constant ONE_MONTH_IN_SECONDS = 30 days; IUniswapFactory public uniswap; struct Account { uint balance; uint collectionTimestamp; } struct Checkpoint { uint ethReserve; uint tokenReserve; } struct Medianizer { uint8 tail; uint pendingStartTimestamp; uint latestTimestamp; Checkpoint[] prices; Checkpoint[] pending; Checkpoint median; } // Token => Subscriber => Account mapping (address => mapping (address => Account)) public accounts; // Token => Oracle Token (reward for poking) mapping (address => OracleToken) public oracleTokens; // Token => Medianizer mapping (address => Medianizer) private medianizers; constructor(IUniswapFactory _uniswap) public { uniswap = _uniswap; } /** * @dev Subscribe to read the price of a given token (e.g, DAI). * @param token The address of the token to subscribe to. */ function subscribe(address token) public payable { Account storage account = accounts[token][msg.sender]; _collect(token, account); account.balance = account.balance.add(msg.value); require(account.balance >= MONTHLY_SUBSCRIPTION_FEE, "Polaris::subscribe: Account balance is below the minimum"); emit Subscribe(token, msg.sender, msg.value); } /** * @dev Unsubscribe to a given token (e.g, DAI). * @param token The address of the token to unsubscribe from. * @param amount The requested amount to withdraw, in wei. * @return The actual amount withdrawn, in wei. */ function unsubscribe(address token, uint amount) public returns (uint) { Account storage account = accounts[token][msg.sender]; _collect(token, account); uint maxWithdrawAmount = account.balance.sub(MONTHLY_SUBSCRIPTION_FEE); uint actualWithdrawAmount = amount.min(maxWithdrawAmount); account.balance = account.balance.sub(actualWithdrawAmount); msg.sender.transfer(actualWithdrawAmount); emit Unsubscribe(token, msg.sender, actualWithdrawAmount); } /** * @dev Collect subscription fees from a subscriber. * @param token The address of the subscribed token to collect fees from. * @param who The address of the subscriber. */ function collect(address token, address who) public { Account storage account = accounts[token][who]; _collect(token, account); } /** * @dev Add a new price checkpoint. * @param token The address of the token to checkpoint. */ function poke(address token) public { require(_isHuman(), "Polaris::poke: Poke must be called by an externally owned account"); OracleToken oracleToken = oracleTokens[token]; // Get the current reserves from Uniswap Checkpoint memory checkpoint = _newCheckpoint(token); if (address(oracleToken) == address(0)) { _initializeMedianizer(token, checkpoint); } else { Medianizer storage medianizer = medianizers[token]; require(medianizer.latestTimestamp != block.timestamp, "Polaris::poke: Cannot poke more than once per block"); // See if checkpoint should be rewarded if (_willRewardCheckpoint(token, checkpoint)) { oracleToken.mint(msg.sender, CHECKPOINT_REWARD); } // If pending checkpoints are old, reset pending checkpoints if (block.timestamp.sub(medianizer.pendingStartTimestamp) > PENDING_PERIOD || medianizer.pending.length == MAX_CHECKPOINTS) { medianizer.pending.length = 0; medianizer.tail = (medianizer.tail + 1) % MAX_CHECKPOINTS; medianizer.pendingStartTimestamp = block.timestamp; } medianizer.latestTimestamp = block.timestamp; // Add the checkpoint to the pending array medianizer.pending.push(checkpoint); // Add the pending median to the prices array medianizer.prices[medianizer.tail] = _medianize(medianizer.pending); // Find and store the prices median medianizer.median = _medianize(medianizer.prices); emit NewMedian(token, medianizer.median.ethReserve, medianizer.median.tokenReserve); } } /** * @dev Get price data for a given token. * @param token The address of the token to query. * @return The price data struct. */ function getMedianizer(address token) public view returns (Medianizer memory) { require(_isSubscriber(accounts[token][msg.sender]) || _isHuman(), "Polaris::getMedianizer: Not subscribed"); return medianizers[token]; } /** * @notice This uses the x * y = k bonding curve to determine the destination amount based on the medianized price. * 𝝙x = (𝝙y * x) / (y + 𝝙y) * @dev Get the amount of destination token, based on a given amount of source token. * @param src The address of the source token. * @param dest The address of the destination token. * @param srcAmount The amount of the source token. * @return The amount of destination token. */ function getDestAmount(address src, address dest, uint srcAmount) public view returns (uint) { if (!_isHuman()) { require(src == ETHER || _isSubscriber(accounts[src][msg.sender]), "Polaris::getDestAmount: Not subscribed"); require(dest == ETHER || _isSubscriber(accounts[dest][msg.sender]), "Polaris::getDestAmount: Not subscribed"); } if (src == dest) { return srcAmount; } else if (src == ETHER) { Checkpoint memory median = medianizers[dest].median; return srcAmount.mul(median.tokenReserve).div(median.ethReserve.add(srcAmount)); } else if (dest == ETHER) { Checkpoint memory median = medianizers[src].median; return srcAmount.mul(median.ethReserve).div(median.tokenReserve.add(srcAmount)); } else { Checkpoint memory srcMedian = medianizers[src].median; Checkpoint memory destMedian = medianizers[dest].median; uint ethAmount = srcAmount.mul(srcMedian.ethReserve).div(srcMedian.tokenReserve.add(srcAmount)); return ethAmount.mul(destMedian.ethReserve).div(destMedian.tokenReserve.add(ethAmount)); } } /** * @dev Determine whether a given checkpoint would be rewarded with newly minted oracle tokens. * @param token The address of the token to query checkpoint for. * @return True if given checkpoint satisfies any of the following: * Less than required checkpoints exist to calculate a valid median * Exceeds max time since last checkpoint * Exceeds minimum price change from median AND no pending checkpoints * Exceeds minimum percent change from pending checkpoints median * Exceeds minimum percent change from last checkpoint */ function willRewardCheckpoint(address token) public view returns (bool) { Checkpoint memory checkpoint = _newCheckpoint(token); return _willRewardCheckpoint(token, checkpoint); } /** * @dev Get the account for a given subscriber of a token feed. * @param token The token to query the account of the given subscriber. * @param who The subscriber to query the account of the given token feed. * @return The account of the subscriber of the given token feed. */ function getAccount(address token, address who) public view returns (Account memory) { return accounts[token][who]; } /** * @dev Get the owed amount for a given subscriber of a token feed. * @param token The token to query the owed amount of the given subscriber. * @param who The subscriber to query the owed amount for the given token feed. * @return The owed amount of the subscriber of the given token feed. */ function getOwedAmount(address token, address who) public view returns (uint) { Account storage account = accounts[token][who]; return _getOwedAmount(account); } /** * @dev Update the subscriber balance of a given token feed. * @param token The token to collect subscription revenues for. * @param account The subscriber account to collect subscription revenues from. */ function _collect(address token, Account storage account) internal { if (account.balance == 0) { account.collectionTimestamp = block.timestamp; return; } uint owedAmount = _getOwedAmount(account); OracleToken oracleToken = oracleTokens[token]; // If the subscriber does not have enough, collect the remaining balance if (owedAmount >= account.balance) { address(oracleToken).transfer(account.balance); account.balance = 0; } else { address(oracleToken).transfer(owedAmount); account.balance = account.balance.sub(owedAmount); } account.collectionTimestamp = block.timestamp; } /** * @dev Initialize the medianizer * @param token The token to initialize the medianizer for. * @param checkpoint The new checkpoint to initialize the medianizer with. */ function _initializeMedianizer(address token, Checkpoint memory checkpoint) internal { address payable exchange = uniswap.getExchange(token); require(exchange != address(0), "Polaris::_initializeMedianizer: Token must exist on Uniswap"); OracleToken oracleToken = new OracleToken(token); oracleTokens[token] = oracleToken; // Reward additional oracle tokens for the first poke to compensate for extra gas costs oracleToken.mint(msg.sender, CHECKPOINT_REWARD.mul(10)); Medianizer storage medianizer = medianizers[token]; medianizer.pending.push(checkpoint); medianizer.median = checkpoint; medianizer.latestTimestamp = block.timestamp; medianizer.pendingStartTimestamp = block.timestamp; // Hydrate prices queue for (uint i = 0; i < MAX_CHECKPOINTS; i++) { medianizer.prices.push(checkpoint); } } /** * @dev Find the median given an array of checkpoints. * @param checkpoints The array of checkpoints to find the median. * @return The median checkpoint within the given array. */ function _medianize(Checkpoint[] memory checkpoints) internal pure returns (Checkpoint memory) { // To minimize complexity, return the higher of the two middle checkpoints in even-sized arrays instead of the average. uint k = checkpoints.length.div(2); uint left = 0; uint right = checkpoints.length.sub(1); while (left < right) { uint pivotIndex = left.add(right).div(2); Checkpoint memory pivotCheckpoint = checkpoints[pivotIndex]; (checkpoints[pivotIndex], checkpoints[right]) = (checkpoints[right], checkpoints[pivotIndex]); uint storeIndex = left; for (uint i = left; i < right; i++) { if (_isLessThan(checkpoints[i], pivotCheckpoint)) { (checkpoints[storeIndex], checkpoints[i]) = (checkpoints[i], checkpoints[storeIndex]); storeIndex++; } } (checkpoints[storeIndex], checkpoints[right]) = (checkpoints[right], checkpoints[storeIndex]); if (storeIndex < k) { left = storeIndex.add(1); } else { right = storeIndex; } } return checkpoints[k]; } /** * @dev Determine if checkpoint x is less than checkpoint y. * @param x The first checkpoint for comparison. * @param y The second checkpoint for comparison. * @return True if x is less than y. */ function _isLessThan(Checkpoint memory x, Checkpoint memory y) internal pure returns (bool) { return x.ethReserve.mul(y.tokenReserve) < y.ethReserve.mul(x.tokenReserve); } /** * @dev Check if msg.sender is an externally owned account. * @return True if msg.sender is an externally owned account, false if smart contract. */ function _isHuman() internal view returns (bool) { return msg.sender == tx.origin; } /** * @dev Get the reserve values of a Uniswap exchange for a given token. * @param token The token to query the reserve values for. * @return A checkpoint holding the appropriate reserve values. */ function _newCheckpoint(address token) internal view returns (Checkpoint memory) { address payable exchange = uniswap.getExchange(token); return Checkpoint({ ethReserve: exchange.balance, tokenReserve: IERC20(token).balanceOf(exchange) }); } /** * @dev Get subscriber status of a given account for a given token. * @param account The account to query. * @return True if subscribed. */ function _isSubscriber(Account storage account) internal view returns (bool) { // Strict inequality to return false for users who never subscribed and owe zero. return account.balance > _getOwedAmount(account); } /** * @dev Get amount owed by an account. Accrued amount minus collections. * @param account The account to query. * @return Amount owed. */ function _getOwedAmount(Account storage account) internal view returns (uint) { if (account.collectionTimestamp == 0) return 0; uint timeElapsed = block.timestamp.sub(account.collectionTimestamp); return MONTHLY_SUBSCRIPTION_FEE.mul(timeElapsed).div(ONE_MONTH_IN_SECONDS); } /** * @dev Determine whether a given checkpoint would be rewarded with newly minted oracle tokens. * @param token The address of the token to query checkpoint for. * @param checkpoint The checkpoint to test for reward of oracle tokens. * @return True if given checkpoint satisfies any of the following: * Less than required checkpoints exist to calculate a valid median * Exceeds max time since last checkpoint * Exceeds minimum price change from median AND no pending checkpoints * Exceeds minimum percent change from pending checkpoints median * Exceeds minimum percent change from last checkpoint */ function _willRewardCheckpoint(address token, Checkpoint memory checkpoint) internal view returns (bool) { Medianizer memory medianizer = medianizers[token]; return ( medianizer.prices.length < MAX_CHECKPOINTS || block.timestamp.sub(medianizer.latestTimestamp) >= MAX_TIME_SINCE_LAST_CHECKPOINT || (block.timestamp.sub(medianizer.pendingStartTimestamp) >= PENDING_PERIOD && _percentChange(medianizer.median, checkpoint) >= MIN_PRICE_CHANGE) || _percentChange(medianizer.prices[medianizer.tail], checkpoint) >= MIN_PRICE_CHANGE || _percentChange(medianizer.pending[medianizer.pending.length.sub(1)], checkpoint) >= MIN_PRICE_CHANGE ); } /** * @dev Get the percent change between two checkpoints. * @param x The first checkpoint. * @param y The second checkpoint. * @return The absolute value of the percent change, with 18 decimals of precision (e.g., .01e18 = 1%). */ function _percentChange(Checkpoint memory x, Checkpoint memory y) internal pure returns (uint) { uint a = x.ethReserve.mul(y.tokenReserve); uint b = y.ethReserve.mul(x.tokenReserve); uint diff = a > b ? a.sub(b) : b.sub(a); return diff.mul(10 ** 18).div(a); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[],"name":"MONTHLY_SUBSCRIPTION_FEE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"}],"name":"willRewardCheckpoint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TIME_SINCE_LAST_CHECKPOINT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"uniswap","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"}],"name":"getMedianizer","outputs":[{"components":[{"name":"tail","type":"uint8"},{"name":"pendingStartTimestamp","type":"uint256"},{"name":"latestTimestamp","type":"uint256"},{"components":[{"name":"ethReserve","type":"uint256"},{"name":"tokenReserve","type":"uint256"}],"name":"prices","type":"tuple[]"},{"components":[{"name":"ethReserve","type":"uint256"},{"name":"tokenReserve","type":"uint256"}],"name":"pending","type":"tuple[]"},{"components":[{"name":"ethReserve","type":"uint256"},{"name":"tokenReserve","type":"uint256"}],"name":"median","type":"tuple"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"subscribe","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"ETHER","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_CHECKPOINTS","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ONE_MONTH_IN_SECONDS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CHECKPOINT_REWARD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"oracleTokens","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"}],"name":"unsubscribe","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"who","type":"address"}],"name":"collect","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"who","type":"address"}],"name":"getOwedAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"accounts","outputs":[{"name":"balance","type":"uint256"},{"name":"collectionTimestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"}],"name":"poke","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MIN_PRICE_CHANGE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"dest","type":"address"},{"name":"srcAmount","type":"uint256"}],"name":"getDestAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"who","type":"address"}],"name":"getAccount","outputs":[{"components":[{"name":"balance","type":"uint256"},{"name":"collectionTimestamp","type":"uint256"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PENDING_PERIOD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_uniswap","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"token","type":"address"},{"indexed":false,"name":"ethReserve","type":"uint256"},{"indexed":false,"name":"tokenReserve","type":"uint256"}],"name":"NewMedian","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"token","type":"address"},{"indexed":true,"name":"subscriber","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Subscribe","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"token","type":"address"},{"indexed":true,"name":"subscriber","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Unsubscribe","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516020806200381d83398101806040526200003391908101906200006e565b60008054600160a060020a031916600160a060020a0392909216919091179055620000c3565b6000620000678251620000b6565b9392505050565b6000602082840312156200008157600080fd5b60006200008f848462000059565b949350505050565b6000620000a482620000aa565b92915050565b600160a060020a031690565b6000620000a48262000097565b61374a80620000d36000396000f3fe6080604052600436106200013e5760003560e060020a90048063879747d211620000b3578063b1a997ac1162000071578063b1a997ac146200037a578063b7087451146200039f578063ef9152d114620003b7578063fd59084714620003dc578063fe1317781462000410576200013e565b8063879747d214620002b1578063883e5b7a14620002d6578063a12ef25e14620002fb578063a67986a21462000320578063ad74b7751462000345576200013e565b806341a7726a116200010157806341a7726a146200021a57806342cb1fbc1462000233578063588fcfd8146200025a5780635de357a214620002815780637d6697521462000299576200013e565b806307a139be146200014357806325b07a431462000173578063262de7bc14620001a75780632681f7e414620001bf5780633cf244a914620001e6575b600080fd5b3480156200015057600080fd5b506200015b62000428565b6040516200016a919062002339565b60405180910390f35b3480156200018057600080fd5b50620001986200019236600462001c3b565b62000434565b6040516200016a919062002242565b348015620001b457600080fd5b506200015b62000462565b348015620001cc57600080fd5b50620001d762000468565b6040516200016a919062002252565b348015620001f357600080fd5b506200020b6200020536600462001c3b565b62000477565b6040516200016a919062002326565b620002316200022b36600462001c3b565b6200062b565b005b3480156200024057600080fd5b506200024b620006ef565b6040516200016a919062002203565b3480156200026757600080fd5b5062000272620006f4565b6040516200016a919062002359565b3480156200028e57600080fd5b506200015b620006f9565b348015620002a657600080fd5b506200015b62000700565b348015620002be57600080fd5b50620001d7620002d036600462001c3b565b6200070c565b348015620002e357600080fd5b506200015b620002f536600462001d10565b62000727565b3480156200030857600080fd5b50620002316200031a36600462001c7d565b62000829565b3480156200032d57600080fd5b506200015b6200033f36600462001c7d565b6200085f565b3480156200035257600080fd5b506200036a6200036436600462001c7d565b6200089b565b6040516200016a92919062002349565b3480156200038757600080fd5b50620002316200039936600462001c3b565b620008bc565b348015620003ac57600080fd5b506200015b62000c3e565b348015620003c457600080fd5b506200015b620003d636600462001cbc565b62000c49565b348015620003e957600080fd5b5062000401620003fb36600462001c7d565b62000f4d565b6040516200016a919062002316565b3480156200041d57600080fd5b506200015b62000f96565b674563918244f4000081565b60006200044062001b36565b6200044b8362000f9b565b9050620004598382620010f0565b9150505b919050565b612a3081565b600054600160a060020a031681565b6200048162001b4d565b600160a060020a03821660009081526001602090815260408083203384529091529020620004af9062001332565b80620004c05750620004c062001349565b1515620004ed5760405160e560020a62461bcd028152600401620004e49062002286565b60405180910390fd5b600160a060020a0382166000908152600360208181526040808420815160c081018352815460ff16815260018201548185015260028201548184015293810180548351818602810186019094528084529495919460608701949192909184015b828210156200058e5760008481526020908190206040805180820190915260028502909101805482526001908101548284015290835290920191016200054d565b50505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015620005fc576000848152602090819020604080518082019091526002850290910180548252600190810154828401529083529092019101620005bb565b505050908252506040805180820190915260058301548152600690920154602080840191909152015292915050565b600160a060020a038116600090815260016020908152604080832033845290915290206200065a828262001350565b80546200066e903463ffffffff6200143816565b808255674563918244f4000011156200069e5760405160e560020a62461bcd028152600401620004e490620022aa565b33600160a060020a031682600160a060020a03167f93837e03101facb2299be0f488056246fef5645f06dbcccdbbf9a667812afb2c34604051620006e3919062002339565b60405180910390a35050565b600081565b600f81565b62278d0081565b670de0b6b3a764000081565b600260205260009081526040902054600160a060020a031681565b600160a060020a0382166000908152600160209081526040808320338452909152812062000756848262001350565b80546000906200077590674563918244f4000063ffffffff6200146316565b905060006200078b858363ffffffff6200149116565b8354909150620007a2908263ffffffff6200146316565b8355604051339082156108fc029083906000818181858888f19350505050158015620007d2573d6000803e3d6000fd5b5033600160a060020a031686600160a060020a03167f7a11eec6f06aede35f15f295fd0dd79b252a60829ce0a1f961e6665924e7a3c58360405162000818919062002339565b60405180910390a350505092915050565b600160a060020a0380831660009081526001602090815260408083209385168352929052206200085a838262001350565b505050565b600160a060020a03808316600090815260016020908152604080832093851683529290529081206200089181620014a9565b9150505b92915050565b60016020818152600093845260408085209091529183529120805491015482565b620008c662001349565b1515620008ea5760405160e560020a62461bcd028152600401620004e490620022e0565b600160a060020a03808216600090815260026020526040902054166200090f62001b36565b6200091a8362000f9b565b9050600160a060020a03821615156200093f5762000939838262001501565b6200085a565b600160a060020a03831660009081526003602052604090206002810154421415620009815760405160e560020a62461bcd028152600401620004e49062002274565b6200098d8483620010f0565b1562000a3c576040517f40c10f19000000000000000000000000000000000000000000000000000000008152600160a060020a038416906340c10f1990620009e4903390670de0b6b3a76400009060040162002223565b602060405180830381600087803b158015620009ff57600080fd5b505af115801562000a14573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000a3a919081019062001d45565b505b60d262000a578260010154426200146390919063ffffffff16565b118062000a6857506004810154600f145b1562000aa457600062000a7f600483018262001b8e565b508054600f9060ff90811660010116825460ff191691900660ff161781554260018201555b4260028083019190915560048201805460018181018355600083815260208082208851949096029095019283558487015192909101919091558154604080518286028101860190915281815262000b47949093929084015b8282101562000b3d57600084815260209081902060408051808201909152600285029091018054825260019081015482840152908352909201910162000afc565b505050506200177d565b8154600383018054909160ff1690811062000b5e57fe5b60009182526020808320845160029093020191825592830151600190910155600383018054604080518286028101860190915281815262000bdf9490939084018282101562000b3d57600084815260209081902060408051808201909152600285029091018054825260019081015482840152908352909201910162000afc565b80516005830181905560209091015160068301819055604051600160a060020a038716927fba854b56b0860538e2774bcbfe46711c498ee893bac0a49cbfef3e543de2e5c09262000c309262002349565b60405180910390a250505050565b662386f26fc1000081565b600062000c5562001349565b151562000d2457600160a060020a038416158062000c9c5750600160a060020a0384166000908152600160209081526040808320338452909152902062000c9c9062001332565b151562000cc05760405160e560020a62461bcd028152600401620004e49062002262565b600160a060020a038316158062000d005750600160a060020a0383166000908152600160209081526040808320338452909152902062000d009062001332565b151562000d245760405160e560020a62461bcd028152600401620004e49062002262565b82600160a060020a031684600160a060020a0316141562000d4757508062000f46565b600160a060020a038416151562000de15762000d6262001b36565b50600160a060020a038316600090815260036020908152604091829020825180840190935260058101548084526006909101549183019190915262000dd89062000db3908563ffffffff6200143816565b602083015162000dcb90869063ffffffff620019d916565b9063ffffffff62001a2016565b91505062000f46565b600160a060020a038316151562000e5e5762000dfc62001b36565b50600160a060020a0384166000908152600360209081526040918290208251808401909352600581015483526006015490820181905262000dd89062000e49908563ffffffff6200143816565b825162000dcb90869063ffffffff620019d916565b62000e6862001b36565b50600160a060020a038416600090815260036020908152604091829020825180840190935260058101548352600601549082015262000ea662001b36565b50600160a060020a038416600090815260036020908152604080832081518083019092526005810154825260060154818301529083015190919062000f0c9062000ef7908763ffffffff6200143816565b845162000dcb90889063ffffffff620019d916565b905062000f4062000f2b8284602001516200143890919063ffffffff16565b835162000dcb90849063ffffffff620019d916565b93505050505b9392505050565b62000f5762001b36565b50600160a060020a0391821660009081526001602081815260408084209490951683529283529083902083518085019094528054845201549082015290565b60d281565b62000fa562001b36565b600080546040517f06f2bf62000000000000000000000000000000000000000000000000000000008152600160a060020a03909116906306f2bf629062000ff190869060040162002203565b60206040518083038186803b1580156200100a57600080fd5b505afa1580156200101f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062001045919081019062001c5c565b9050604080519081016040528082600160a060020a031631815260200184600160a060020a03166370a08231846040518263ffffffff1660e060020a02815260040162001093919062002213565b60206040518083038186803b158015620010ac57600080fd5b505afa158015620010c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620010e7919081019062001d66565b90529392505050565b6000620010fc62001b4d565b600160a060020a0384166000908152600360208181526040808420815160c081018352815460ff16815260018201548185015260028201548184015293810180548351818602810186019094528084529495919460608701949192909184015b828210156200119d5760008481526020908190206040805180820190915260028502909101805482526001908101548284015290835290920191016200115c565b50505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156200120b576000848152602090819020604080518082019091526002850290910180548252600190810154828401529083529092019101620011ca565b5050509082525060408051808201909152600583015481526006909201546020838101919091520152606081015151909150600f1180620012665750612a30620012638260400151426200146390919063ffffffff16565b10155b80620012ad575060d2620012888260200151426200146390919063ffffffff16565b10158015620012ad5750662386f26fc10000620012aa8260a001518562001a5e565b10155b80620012ee5750662386f26fc10000620012eb8260600151836000015160ff16815181101515620012da57fe5b906020019060200201518562001a5e565b10155b8062000891575060808101518051662386f26fc100009162001328916200131d90600163ffffffff6200146316565b81518110620012da57fe5b1015949350505050565b60006200133f82620014a9565b8254119050919050565b3332145b90565b80541515620013655742600182015562001434565b60006200137282620014a9565b600160a060020a03808516600090815260026020526040902054845492935016908210620013dc578254604051600160a060020a0383169180156108fc02916000818181858888f19350505050158015620013d1573d6000803e3d6000fd5b50600083556200142b565b604051600160a060020a0382169083156108fc029084906000818181858888f1935050505015801562001413573d6000803e3d6000fd5b50825462001428908363ffffffff6200146316565b83555b50504260018201555b5050565b60008282018381101562000f465760405160e560020a62461bcd028152600401620004e49062002298565b6000828211156200148b5760405160e560020a62461bcd028152600401620004e490620022ce565b50900390565b6000818310620014a2578162000f46565b5090919050565b6000816001015460001415620014c2575060006200045d565b6000620014dd8360010154426200146390919063ffffffff16565b90506200045962278d0062000dcb674563918244f400008463ffffffff620019d916565b600080546040517f06f2bf62000000000000000000000000000000000000000000000000000000008152600160a060020a03909116906306f2bf62906200154d90869060040162002203565b60206040518083038186803b1580156200156657600080fd5b505afa1580156200157b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620015a1919081019062001c5c565b9050600160a060020a0381161515620015d15760405160e560020a62461bcd028152600401620004e49062002304565b600083620015de62001bbd565b620015ea919062002203565b604051809103906000f08015801562001607573d6000803e3d6000fd5b50600160a060020a038581166000908152600260205260409020805473ffffffffffffffffffffffffffffffffffffffff191691831691821790559091506340c10f193362001660670de0b6b3a7640000600a620019d9565b6040518363ffffffff1660e060020a0281526004016200168292919062002223565b602060405180830381600087803b1580156200169d57600080fd5b505af1158015620016b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620016d8919081019062001d45565b50600160a060020a038416600090815260036020908152604082206004810180546001818101835591855283852088516002928302909101818155948901519483018590556005840155600683019390935542928201839055810191909155905b600f8110156200177557600382018054600181810183556000928352602092839020885160029093020191825591870151908201550162001739565b505050505050565b6200178762001b36565b81516000906200179f90600263ffffffff62001a2016565b83519091506000908190620017bc90600163ffffffff6200146316565b90505b80821015620019b6576000620017e2600262000dcb858563ffffffff6200143816565b9050620017ee62001b36565b8682815181101515620017fd57fe5b90602001906020020151905086838151811015156200181857fe5b9060200190602002015187838151811015156200183157fe5b9060200190602002015188848151811015156200184a57fe5b90602001906020020189868151811015156200186257fe5b602090810290910101919091525283805b848110156200191d57620018a089828151811015156200188f57fe5b906020019060200201518462001afa565b1562001914578881815181101515620018b557fe5b906020019060200201518983815181101515620018ce57fe5b906020019060200201518a84815181101515620018e757fe5b9060200190602002018b84815181101515620018ff57fe5b60209081029091010191909152526001909101905b60010162001873565b5087848151811015156200192d57fe5b9060200190602002015188828151811015156200194657fe5b9060200190602002015189838151811015156200195f57fe5b9060200190602002018a878151811015156200197757fe5b602090810290910101919091525285811015620019a957620019a181600163ffffffff6200143816565b9450620019ad565b8093505b505050620017bf565b8483815181101515620019c557fe5b906020019060200201519350505050919050565b6000821515620019ec5750600062000895565b828202828482811515620019fc57fe5b041462000f465760405160e560020a62461bcd028152600401620004e490620022f2565b600080821162001a475760405160e560020a62461bcd028152600401620004e490620022bc565b6000828481151562001a5557fe5b04949350505050565b60208101518251600091829162001a7b9163ffffffff620019d916565b6020850151845191925060009162001a999163ffffffff620019d916565b9050600081831162001abd5762001ab7828463ffffffff6200146316565b62001acf565b62001acf838363ffffffff6200146316565b905062001af08362000dcb83670de0b6b3a764000063ffffffff620019d916565b9695505050505050565b6020820151815160009162001b16919063ffffffff620019d916565b6020830151845162001b2e9163ffffffff620019d916565b109392505050565b604080518082019091526000808252602082015290565b60e060405190810160405280600060ff1681526020016000815260200160008152602001606081526020016060815260200162001b8962001b36565b905290565b8154818355818111156200085a576002028160020283600052602060002091820191016200085a919062001bce565b60405161136480620023ad83390190565b6200134d91905b8082111562001bf1576000808255600182015560020162001bd5565b5090565b600062000f46823562002373565b600062000f46825162002373565b600062000f46825162002380565b600062000f4682356200134d565b600062000f4682516200134d565b60006020828403121562001c4e57600080fd5b600062000891848462001bf5565b60006020828403121562001c6f57600080fd5b600062000891848462001c03565b6000806040838503121562001c9157600080fd5b600062001c9f858562001bf5565b925050602062001cb28582860162001bf5565b9150509250929050565b60008060006060848603121562001cd257600080fd5b600062001ce0868662001bf5565b935050602062001cf38682870162001bf5565b925050604062001d068682870162001c1f565b9150509250925092565b6000806040838503121562001d2457600080fd5b600062001d32858562001bf5565b925050602062001cb28582860162001c1f565b60006020828403121562001d5857600080fd5b600062000891848462001c11565b60006020828403121562001d7957600080fd5b600062000891848462001c2d565b62001d928162002397565b82525050565b62001d928162002373565b600062001db0826200236f565b80845260208401935062001dc48362002369565b60005b8281101562001dfa5762001ddd8683516200212a565b62001de88262002369565b60409690960195915060010162001dc7565b5093949350505050565b62001d928162002380565b62001d92816200239f565b602681527f506f6c617269733a3a67657444657374416d6f756e743a204e6f74207375627360208201527f6372696265640000000000000000000000000000000000000000000000000000604082015260600190565b603381527f506f6c617269733a3a706f6b653a2043616e6e6f7420706f6b65206d6f72652060208201527f7468616e206f6e63652070657220626c6f636b00000000000000000000000000604082015260600190565b602681527f506f6c617269733a3a6765744d656469616e697a65723a204e6f74207375627360208201527f6372696265640000000000000000000000000000000000000000000000000000604082015260600190565b601e81527f536166654d617468236164643a20496e7465676572206f766572666c6f770000602082015260400190565b603881527f506f6c617269733a3a7375627363726962653a204163636f756e742062616c6160208201527f6e63652069732062656c6f7720746865206d696e696d756d0000000000000000604082015260600190565b602281527f536166654d617468236469763a20496e76616c69642064697669736f72207a6560208201527f726f000000000000000000000000000000000000000000000000000000000000604082015260600190565b601f81527f536166654d617468237375623a20496e746567657220756e646572666c6f7700602082015260400190565b604181527f506f6c617269733a3a706f6b653a20506f6b65206d7573742062652063616c6c60208201527f656420627920616e2065787465726e616c6c79206f776e6564206163636f756e60408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b601e81527f536166654d617468236d756c3a20496e7465676572206f766572666c6f770000602082015260400190565b603b81527f506f6c617269733a3a5f696e697469616c697a654d656469616e697a65723a2060208201527f546f6b656e206d757374206578697374206f6e20556e69737761700000000000604082015260600190565b805160408301906200213d8482620021ed565b506020820151620021526020850182620021ed565b50505050565b805160009060e08401906200216e8582620021f8565b506020830151620021836020860182620021ed565b506040830151620021986040860182620021ed565b5060608301518482036060860152620021b2828262001da3565b91505060808301518482036080860152620021ce828262001da3565b91505060a0830151620021e560a08601826200212a565b509392505050565b62001d92816200134d565b62001d928162002391565b6020810162000895828462001d98565b6020810162000895828462001d87565b6040810162002233828562001d87565b62000f466020830184620021ed565b6020810162000895828462001e04565b6020810162000895828462001e0f565b60208082528101620008958162001e1a565b60208082528101620008958162001e70565b60208082528101620008958162001ec6565b60208082528101620008958162001f1c565b60208082528101620008958162001f4c565b60208082528101620008958162001fa2565b60208082528101620008958162001ff8565b60208082528101620008958162002028565b602080825281016200089581620020a4565b602080825281016200089581620020d4565b604081016200089582846200212a565b6020808252810162000f46818462002158565b60208101620008958284620021ed565b60408101620022338285620021ed565b60208101620008958284620021f8565b60200190565b5190565b6000620008958262002385565b151590565b600160a060020a031690565b60ff1690565b600062000895825b600062000895826200237356fe60c0604052600d60808190527f506f6c6172697320546f6b656e0000000000000000000000000000000000000060a0908152620000409160039190620000f1565b506040805180820190915260048082527f504c5253000000000000000000000000000000000000000000000000000000006020909201918252620000859181620000f1565b506005805460ff19166012179055604051602080620013648339810180604052620000b49190810190620001ab565b6005805461010060a860020a031916336101000217905560068054600160a060020a031916600160a060020a0392909216919091179055620001f3565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200013457805160ff191683800117855562000164565b8280016001018555821562000164579182015b828111156200016457825182559160200191906001019062000147565b506200017292915062000176565b5090565b6200019391905b808211156200017257600081556001016200017d565b90565b6000620001a48251620001e0565b9392505050565b600060208284031215620001be57600080fd5b6000620001cc848462000196565b949350505050565b600160a060020a031690565b6000620001ed82620001d4565b92915050565b61116180620002036000396000f3fe608060405260043610610105576000357c01000000000000000000000000000000000000000000000000000000009004806370a08231116100a7578063a9059cbb11610076578063a9059cbb1461027a578063db006a751461029a578063dd62ed3e146102ba578063fc0c546a146102da57610105565b806370a08231146102035780637dc0d1d01461022357806395d89b4114610245578063a457c2d71461025a57610105565b806323b872dd116100e357806323b872dd14610181578063313ce567146101a157806339509351146101c357806340c10f19146101e357610105565b806306fdde0314610107578063095ea7b31461013257806318160ddd1461015f575b005b34801561011357600080fd5b5061011c6102ef565b6040516101299190610fe7565b60405180910390f35b34801561013e57600080fd5b5061015261014d366004610b92565b61037d565b6040516101299190610fd9565b34801561016b57600080fd5b5061017461041f565b60405161012991906110a8565b34801561018d57600080fd5b5061015261019c366004610b45565b610425565b3480156101ad57600080fd5b506101b66104f1565b60405161012991906110b6565b3480156101cf57600080fd5b506101526101de366004610b92565b6104fa565b3480156101ef57600080fd5b506101526101fe366004610b92565b6105b3565b34801561020f57600080fd5b5061017461021e366004610ae5565b6105fb565b34801561022f57600080fd5b50610238610616565b6040516101299190610fcb565b34801561025157600080fd5b5061011c61062a565b34801561026657600080fd5b50610152610275366004610b92565b610685565b34801561028657600080fd5b50610152610295366004610b92565b6106e6565b3480156102a657600080fd5b506101056102b5366004610bc2565b6106f3565b3480156102c657600080fd5b506101746102d5366004610b0b565b61075b565b3480156102e657600080fd5b50610238610786565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103755780601f1061034a57610100808354040283529160200191610375565b820191906000526020600020905b81548152906001019060200180831161035857829003601f168201915b505050505081565b6000600160a060020a03831615156103b35760405160e560020a62461bcd0281526004016103aa90611038565b60405180910390fd5b336000818152600160209081526040808320600160a060020a03881680855292529182902085905590519091907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061040d9086906110a8565b60405180910390a35060015b92915050565b60025490565b600160a060020a0383166000908152600160209081526040808320338452909152812054610459908363ffffffff61079516565b600160a060020a03851660009081526001602090815260408083203384529091529020556104888484846107c0565b600160a060020a0384166000818152600160209081526040808320338085529252918290205491519092917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925916104df91906110a8565b60405180910390a35060019392505050565b60055460ff1681565b6000600160a060020a03831615156105275760405160e560020a62461bcd0281526004016103aa90611028565b336000908152600160209081526040808320600160a060020a038716845290915290205461055b908363ffffffff6108a816565b336000818152600160209081526040808320600160a060020a038916808552925291829020849055905190927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259161040d91906110a8565b6005546000906101009004600160a060020a031633146105e85760405160e560020a62461bcd0281526004016103aa90611058565b6105f283836108d7565b50600192915050565b600160a060020a031660009081526020819052604090205490565b6005546101009004600160a060020a031681565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103755780601f1061034a57610100808354040283529160200191610375565b6000600160a060020a03831615156106b25760405160e560020a62461bcd0281526004016103aa90611018565b336000908152600160209081526040808320600160a060020a038716845290915290205461055b908363ffffffff61079516565b60006105f23384846107c0565b600061071d61070061041f565b61071130318563ffffffff61099c16565b9063ffffffff6109dd16565b90506107293383610a17565b604051339082156108fc029083906000818181858888f19350505050158015610756573d6000803e3d6000fd5b505050565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b600654600160a060020a031681565b6000828211156107ba5760405160e560020a62461bcd0281526004016103aa90611078565b50900390565b600160a060020a03821615156107eb5760405160e560020a62461bcd0281526004016103aa90611008565b600160a060020a038316600090815260208190526040902054610814908263ffffffff61079516565b600160a060020a038085166000908152602081905260408082209390935590841681522054610849908263ffffffff6108a816565b600160a060020a0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061089b9085906110a8565b60405180910390a3505050565b6000828201838110156108d05760405160e560020a62461bcd0281526004016103aa90611048565b9392505050565b600160a060020a03821615156109025760405160e560020a62461bcd0281526004016103aa90610ff8565b600254610915908263ffffffff6108a816565b600255600160a060020a038216600090815260208190526040902054610941908263ffffffff6108a816565b600160a060020a0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109909085906110a8565b60405180910390a35050565b60008215156109ad57506000610419565b8282028284828115156109bc57fe5b04146108d05760405160e560020a62461bcd0281526004016103aa90611088565b6000808211610a015760405160e560020a62461bcd0281526004016103aa90611068565b60008284811515610a0e57fe5b04949350505050565b600160a060020a0382161515610a425760405160e560020a62461bcd0281526004016103aa90611098565b600254610a55908263ffffffff61079516565b600255600160a060020a038216600090815260208190526040902054610a81908263ffffffff61079516565b600160a060020a0383166000818152602081905260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109909085906110a8565b60006108d082356110c8565b60006108d082356110e4565b600060208284031215610af757600080fd5b6000610b038484610acd565b949350505050565b60008060408385031215610b1e57600080fd5b6000610b2a8585610acd565b9250506020610b3b85828601610acd565b9150509250929050565b600080600060608486031215610b5a57600080fd5b6000610b668686610acd565b9350506020610b7786828701610acd565b9250506040610b8886828701610ad9565b9150509250925092565b60008060408385031215610ba557600080fd5b6000610bb18585610acd565b9250506020610b3b85828601610ad9565b600060208284031215610bd457600080fd5b6000610b038484610ad9565b610be9816110c8565b82525050565b610be9816110d3565b6000610c03826110c4565b808452610c178160208601602086016110ed565b610c208161111d565b9093016020019392505050565b602881527f4552433230235f6d696e743a2043616e6e6f74206d696e7420746f206164647260208201527f657373207a65726f000000000000000000000000000000000000000000000000604082015260600190565b603081527f4552433230235f7472616e736665723a2043616e6e6f74207472616e7366657260208201527f20746f2061646472657373207a65726f00000000000000000000000000000000604082015260600190565b604381527f4552433230236465637265617365416c6c6f77616e63653a2043616e6e6f742060208201527f646563726561736520616c6c6f77616e636520666f722061646472657373207a60408201527f65726f0000000000000000000000000000000000000000000000000000000000606082015260800190565b604381527f455243323023696e637265617365416c6c6f77616e63653a2043616e6e6f742060208201527f696e63726561736520616c6c6f77616e636520666f722061646472657373207a60408201527f65726f0000000000000000000000000000000000000000000000000000000000606082015260800190565b602a81527f455243323023617070726f76653a2043616e6e6f7420617070726f766520616460208201527f6472657373207a65726f00000000000000000000000000000000000000000000604082015260600190565b601e81527f536166654d617468236164643a20496e7465676572206f766572666c6f770000602082015260400190565b602c81527f4f7261636c65546f6b656e3a3a6d696e743a204f6e6c79204f7261636c65206360208201527f616e2063616c6c206d696e740000000000000000000000000000000000000000604082015260600190565b602281527f536166654d617468236469763a20496e76616c69642064697669736f72207a6560208201527f726f000000000000000000000000000000000000000000000000000000000000604082015260600190565b601f81527f536166654d617468237375623a20496e746567657220756e646572666c6f7700602082015260400190565b601e81527f536166654d617468236d756c3a20496e7465676572206f766572666c6f770000602082015260400190565b602a81527f4552433230235f6275726e3a2043616e6e6f74206275726e2066726f6d20616460208201527f6472657373207a65726f00000000000000000000000000000000000000000000604082015260600190565b610be9816110e4565b610be9816110e7565b602081016104198284610be0565b602081016104198284610bef565b602080825281016108d08184610bf8565b6020808252810161041981610c2d565b6020808252810161041981610c83565b6020808252810161041981610cd9565b6020808252810161041981610d55565b6020808252810161041981610dd1565b6020808252810161041981610e27565b6020808252810161041981610e57565b6020808252810161041981610ead565b6020808252810161041981610f03565b6020808252810161041981610f33565b6020808252810161041981610f63565b602081016104198284610fb9565b602081016104198284610fc2565b5190565b6000610419826110d8565b151590565b600160a060020a031690565b90565b60ff1690565b60005b838110156111085781810151838201526020016110f0565b83811115611117576000848401525b50505050565b601f01601f19169056fea265627a7a72305820421198d3fcc3903d1afc88102fb66379ce581857a6d95819a0febd65835f34a56c6578706572696d656e74616cf50037a265627a7a7230582027f78db4ee58efae0039bbd3f856c4ddf728b547472e6873e51150243cb78df16c6578706572696d656e74616cf50037000000000000000000000000c0a47dfe034b400b47bdad5fecda2621de6c4d95
Deployed Bytecode
0x6080604052600436106200013e5760003560e060020a90048063879747d211620000b3578063b1a997ac1162000071578063b1a997ac146200037a578063b7087451146200039f578063ef9152d114620003b7578063fd59084714620003dc578063fe1317781462000410576200013e565b8063879747d214620002b1578063883e5b7a14620002d6578063a12ef25e14620002fb578063a67986a21462000320578063ad74b7751462000345576200013e565b806341a7726a116200010157806341a7726a146200021a57806342cb1fbc1462000233578063588fcfd8146200025a5780635de357a214620002815780637d6697521462000299576200013e565b806307a139be146200014357806325b07a431462000173578063262de7bc14620001a75780632681f7e414620001bf5780633cf244a914620001e6575b600080fd5b3480156200015057600080fd5b506200015b62000428565b6040516200016a919062002339565b60405180910390f35b3480156200018057600080fd5b50620001986200019236600462001c3b565b62000434565b6040516200016a919062002242565b348015620001b457600080fd5b506200015b62000462565b348015620001cc57600080fd5b50620001d762000468565b6040516200016a919062002252565b348015620001f357600080fd5b506200020b6200020536600462001c3b565b62000477565b6040516200016a919062002326565b620002316200022b36600462001c3b565b6200062b565b005b3480156200024057600080fd5b506200024b620006ef565b6040516200016a919062002203565b3480156200026757600080fd5b5062000272620006f4565b6040516200016a919062002359565b3480156200028e57600080fd5b506200015b620006f9565b348015620002a657600080fd5b506200015b62000700565b348015620002be57600080fd5b50620001d7620002d036600462001c3b565b6200070c565b348015620002e357600080fd5b506200015b620002f536600462001d10565b62000727565b3480156200030857600080fd5b50620002316200031a36600462001c7d565b62000829565b3480156200032d57600080fd5b506200015b6200033f36600462001c7d565b6200085f565b3480156200035257600080fd5b506200036a6200036436600462001c7d565b6200089b565b6040516200016a92919062002349565b3480156200038757600080fd5b50620002316200039936600462001c3b565b620008bc565b348015620003ac57600080fd5b506200015b62000c3e565b348015620003c457600080fd5b506200015b620003d636600462001cbc565b62000c49565b348015620003e957600080fd5b5062000401620003fb36600462001c7d565b62000f4d565b6040516200016a919062002316565b3480156200041d57600080fd5b506200015b62000f96565b674563918244f4000081565b60006200044062001b36565b6200044b8362000f9b565b9050620004598382620010f0565b9150505b919050565b612a3081565b600054600160a060020a031681565b6200048162001b4d565b600160a060020a03821660009081526001602090815260408083203384529091529020620004af9062001332565b80620004c05750620004c062001349565b1515620004ed5760405160e560020a62461bcd028152600401620004e49062002286565b60405180910390fd5b600160a060020a0382166000908152600360208181526040808420815160c081018352815460ff16815260018201548185015260028201548184015293810180548351818602810186019094528084529495919460608701949192909184015b828210156200058e5760008481526020908190206040805180820190915260028502909101805482526001908101548284015290835290920191016200054d565b50505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b82821015620005fc576000848152602090819020604080518082019091526002850290910180548252600190810154828401529083529092019101620005bb565b505050908252506040805180820190915260058301548152600690920154602080840191909152015292915050565b600160a060020a038116600090815260016020908152604080832033845290915290206200065a828262001350565b80546200066e903463ffffffff6200143816565b808255674563918244f4000011156200069e5760405160e560020a62461bcd028152600401620004e490620022aa565b33600160a060020a031682600160a060020a03167f93837e03101facb2299be0f488056246fef5645f06dbcccdbbf9a667812afb2c34604051620006e3919062002339565b60405180910390a35050565b600081565b600f81565b62278d0081565b670de0b6b3a764000081565b600260205260009081526040902054600160a060020a031681565b600160a060020a0382166000908152600160209081526040808320338452909152812062000756848262001350565b80546000906200077590674563918244f4000063ffffffff6200146316565b905060006200078b858363ffffffff6200149116565b8354909150620007a2908263ffffffff6200146316565b8355604051339082156108fc029083906000818181858888f19350505050158015620007d2573d6000803e3d6000fd5b5033600160a060020a031686600160a060020a03167f7a11eec6f06aede35f15f295fd0dd79b252a60829ce0a1f961e6665924e7a3c58360405162000818919062002339565b60405180910390a350505092915050565b600160a060020a0380831660009081526001602090815260408083209385168352929052206200085a838262001350565b505050565b600160a060020a03808316600090815260016020908152604080832093851683529290529081206200089181620014a9565b9150505b92915050565b60016020818152600093845260408085209091529183529120805491015482565b620008c662001349565b1515620008ea5760405160e560020a62461bcd028152600401620004e490620022e0565b600160a060020a03808216600090815260026020526040902054166200090f62001b36565b6200091a8362000f9b565b9050600160a060020a03821615156200093f5762000939838262001501565b6200085a565b600160a060020a03831660009081526003602052604090206002810154421415620009815760405160e560020a62461bcd028152600401620004e49062002274565b6200098d8483620010f0565b1562000a3c576040517f40c10f19000000000000000000000000000000000000000000000000000000008152600160a060020a038416906340c10f1990620009e4903390670de0b6b3a76400009060040162002223565b602060405180830381600087803b158015620009ff57600080fd5b505af115801562000a14573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062000a3a919081019062001d45565b505b60d262000a578260010154426200146390919063ffffffff16565b118062000a6857506004810154600f145b1562000aa457600062000a7f600483018262001b8e565b508054600f9060ff90811660010116825460ff191691900660ff161781554260018201555b4260028083019190915560048201805460018181018355600083815260208082208851949096029095019283558487015192909101919091558154604080518286028101860190915281815262000b47949093929084015b8282101562000b3d57600084815260209081902060408051808201909152600285029091018054825260019081015482840152908352909201910162000afc565b505050506200177d565b8154600383018054909160ff1690811062000b5e57fe5b60009182526020808320845160029093020191825592830151600190910155600383018054604080518286028101860190915281815262000bdf9490939084018282101562000b3d57600084815260209081902060408051808201909152600285029091018054825260019081015482840152908352909201910162000afc565b80516005830181905560209091015160068301819055604051600160a060020a038716927fba854b56b0860538e2774bcbfe46711c498ee893bac0a49cbfef3e543de2e5c09262000c309262002349565b60405180910390a250505050565b662386f26fc1000081565b600062000c5562001349565b151562000d2457600160a060020a038416158062000c9c5750600160a060020a0384166000908152600160209081526040808320338452909152902062000c9c9062001332565b151562000cc05760405160e560020a62461bcd028152600401620004e49062002262565b600160a060020a038316158062000d005750600160a060020a0383166000908152600160209081526040808320338452909152902062000d009062001332565b151562000d245760405160e560020a62461bcd028152600401620004e49062002262565b82600160a060020a031684600160a060020a0316141562000d4757508062000f46565b600160a060020a038416151562000de15762000d6262001b36565b50600160a060020a038316600090815260036020908152604091829020825180840190935260058101548084526006909101549183019190915262000dd89062000db3908563ffffffff6200143816565b602083015162000dcb90869063ffffffff620019d916565b9063ffffffff62001a2016565b91505062000f46565b600160a060020a038316151562000e5e5762000dfc62001b36565b50600160a060020a0384166000908152600360209081526040918290208251808401909352600581015483526006015490820181905262000dd89062000e49908563ffffffff6200143816565b825162000dcb90869063ffffffff620019d916565b62000e6862001b36565b50600160a060020a038416600090815260036020908152604091829020825180840190935260058101548352600601549082015262000ea662001b36565b50600160a060020a038416600090815260036020908152604080832081518083019092526005810154825260060154818301529083015190919062000f0c9062000ef7908763ffffffff6200143816565b845162000dcb90889063ffffffff620019d916565b905062000f4062000f2b8284602001516200143890919063ffffffff16565b835162000dcb90849063ffffffff620019d916565b93505050505b9392505050565b62000f5762001b36565b50600160a060020a0391821660009081526001602081815260408084209490951683529283529083902083518085019094528054845201549082015290565b60d281565b62000fa562001b36565b600080546040517f06f2bf62000000000000000000000000000000000000000000000000000000008152600160a060020a03909116906306f2bf629062000ff190869060040162002203565b60206040518083038186803b1580156200100a57600080fd5b505afa1580156200101f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525062001045919081019062001c5c565b9050604080519081016040528082600160a060020a031631815260200184600160a060020a03166370a08231846040518263ffffffff1660e060020a02815260040162001093919062002213565b60206040518083038186803b158015620010ac57600080fd5b505afa158015620010c1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620010e7919081019062001d66565b90529392505050565b6000620010fc62001b4d565b600160a060020a0384166000908152600360208181526040808420815160c081018352815460ff16815260018201548185015260028201548184015293810180548351818602810186019094528084529495919460608701949192909184015b828210156200119d5760008481526020908190206040805180820190915260028502909101805482526001908101548284015290835290920191016200115c565b50505050815260200160048201805480602002602001604051908101604052809291908181526020016000905b828210156200120b576000848152602090819020604080518082019091526002850290910180548252600190810154828401529083529092019101620011ca565b5050509082525060408051808201909152600583015481526006909201546020838101919091520152606081015151909150600f1180620012665750612a30620012638260400151426200146390919063ffffffff16565b10155b80620012ad575060d2620012888260200151426200146390919063ffffffff16565b10158015620012ad5750662386f26fc10000620012aa8260a001518562001a5e565b10155b80620012ee5750662386f26fc10000620012eb8260600151836000015160ff16815181101515620012da57fe5b906020019060200201518562001a5e565b10155b8062000891575060808101518051662386f26fc100009162001328916200131d90600163ffffffff6200146316565b81518110620012da57fe5b1015949350505050565b60006200133f82620014a9565b8254119050919050565b3332145b90565b80541515620013655742600182015562001434565b60006200137282620014a9565b600160a060020a03808516600090815260026020526040902054845492935016908210620013dc578254604051600160a060020a0383169180156108fc02916000818181858888f19350505050158015620013d1573d6000803e3d6000fd5b50600083556200142b565b604051600160a060020a0382169083156108fc029084906000818181858888f1935050505015801562001413573d6000803e3d6000fd5b50825462001428908363ffffffff6200146316565b83555b50504260018201555b5050565b60008282018381101562000f465760405160e560020a62461bcd028152600401620004e49062002298565b6000828211156200148b5760405160e560020a62461bcd028152600401620004e490620022ce565b50900390565b6000818310620014a2578162000f46565b5090919050565b6000816001015460001415620014c2575060006200045d565b6000620014dd8360010154426200146390919063ffffffff16565b90506200045962278d0062000dcb674563918244f400008463ffffffff620019d916565b600080546040517f06f2bf62000000000000000000000000000000000000000000000000000000008152600160a060020a03909116906306f2bf62906200154d90869060040162002203565b60206040518083038186803b1580156200156657600080fd5b505afa1580156200157b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620015a1919081019062001c5c565b9050600160a060020a0381161515620015d15760405160e560020a62461bcd028152600401620004e49062002304565b600083620015de62001bbd565b620015ea919062002203565b604051809103906000f08015801562001607573d6000803e3d6000fd5b50600160a060020a038581166000908152600260205260409020805473ffffffffffffffffffffffffffffffffffffffff191691831691821790559091506340c10f193362001660670de0b6b3a7640000600a620019d9565b6040518363ffffffff1660e060020a0281526004016200168292919062002223565b602060405180830381600087803b1580156200169d57600080fd5b505af1158015620016b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250620016d8919081019062001d45565b50600160a060020a038416600090815260036020908152604082206004810180546001818101835591855283852088516002928302909101818155948901519483018590556005840155600683019390935542928201839055810191909155905b600f8110156200177557600382018054600181810183556000928352602092839020885160029093020191825591870151908201550162001739565b505050505050565b6200178762001b36565b81516000906200179f90600263ffffffff62001a2016565b83519091506000908190620017bc90600163ffffffff6200146316565b90505b80821015620019b6576000620017e2600262000dcb858563ffffffff6200143816565b9050620017ee62001b36565b8682815181101515620017fd57fe5b90602001906020020151905086838151811015156200181857fe5b9060200190602002015187838151811015156200183157fe5b9060200190602002015188848151811015156200184a57fe5b90602001906020020189868151811015156200186257fe5b602090810290910101919091525283805b848110156200191d57620018a089828151811015156200188f57fe5b906020019060200201518462001afa565b1562001914578881815181101515620018b557fe5b906020019060200201518983815181101515620018ce57fe5b906020019060200201518a84815181101515620018e757fe5b9060200190602002018b84815181101515620018ff57fe5b60209081029091010191909152526001909101905b60010162001873565b5087848151811015156200192d57fe5b9060200190602002015188828151811015156200194657fe5b9060200190602002015189838151811015156200195f57fe5b9060200190602002018a878151811015156200197757fe5b602090810290910101919091525285811015620019a957620019a181600163ffffffff6200143816565b9450620019ad565b8093505b505050620017bf565b8483815181101515620019c557fe5b906020019060200201519350505050919050565b6000821515620019ec5750600062000895565b828202828482811515620019fc57fe5b041462000f465760405160e560020a62461bcd028152600401620004e490620022f2565b600080821162001a475760405160e560020a62461bcd028152600401620004e490620022bc565b6000828481151562001a5557fe5b04949350505050565b60208101518251600091829162001a7b9163ffffffff620019d916565b6020850151845191925060009162001a999163ffffffff620019d916565b9050600081831162001abd5762001ab7828463ffffffff6200146316565b62001acf565b62001acf838363ffffffff6200146316565b905062001af08362000dcb83670de0b6b3a764000063ffffffff620019d916565b9695505050505050565b6020820151815160009162001b16919063ffffffff620019d916565b6020830151845162001b2e9163ffffffff620019d916565b109392505050565b604080518082019091526000808252602082015290565b60e060405190810160405280600060ff1681526020016000815260200160008152602001606081526020016060815260200162001b8962001b36565b905290565b8154818355818111156200085a576002028160020283600052602060002091820191016200085a919062001bce565b60405161136480620023ad83390190565b6200134d91905b8082111562001bf1576000808255600182015560020162001bd5565b5090565b600062000f46823562002373565b600062000f46825162002373565b600062000f46825162002380565b600062000f4682356200134d565b600062000f4682516200134d565b60006020828403121562001c4e57600080fd5b600062000891848462001bf5565b60006020828403121562001c6f57600080fd5b600062000891848462001c03565b6000806040838503121562001c9157600080fd5b600062001c9f858562001bf5565b925050602062001cb28582860162001bf5565b9150509250929050565b60008060006060848603121562001cd257600080fd5b600062001ce0868662001bf5565b935050602062001cf38682870162001bf5565b925050604062001d068682870162001c1f565b9150509250925092565b6000806040838503121562001d2457600080fd5b600062001d32858562001bf5565b925050602062001cb28582860162001c1f565b60006020828403121562001d5857600080fd5b600062000891848462001c11565b60006020828403121562001d7957600080fd5b600062000891848462001c2d565b62001d928162002397565b82525050565b62001d928162002373565b600062001db0826200236f565b80845260208401935062001dc48362002369565b60005b8281101562001dfa5762001ddd8683516200212a565b62001de88262002369565b60409690960195915060010162001dc7565b5093949350505050565b62001d928162002380565b62001d92816200239f565b602681527f506f6c617269733a3a67657444657374416d6f756e743a204e6f74207375627360208201527f6372696265640000000000000000000000000000000000000000000000000000604082015260600190565b603381527f506f6c617269733a3a706f6b653a2043616e6e6f7420706f6b65206d6f72652060208201527f7468616e206f6e63652070657220626c6f636b00000000000000000000000000604082015260600190565b602681527f506f6c617269733a3a6765744d656469616e697a65723a204e6f74207375627360208201527f6372696265640000000000000000000000000000000000000000000000000000604082015260600190565b601e81527f536166654d617468236164643a20496e7465676572206f766572666c6f770000602082015260400190565b603881527f506f6c617269733a3a7375627363726962653a204163636f756e742062616c6160208201527f6e63652069732062656c6f7720746865206d696e696d756d0000000000000000604082015260600190565b602281527f536166654d617468236469763a20496e76616c69642064697669736f72207a6560208201527f726f000000000000000000000000000000000000000000000000000000000000604082015260600190565b601f81527f536166654d617468237375623a20496e746567657220756e646572666c6f7700602082015260400190565b604181527f506f6c617269733a3a706f6b653a20506f6b65206d7573742062652063616c6c60208201527f656420627920616e2065787465726e616c6c79206f776e6564206163636f756e60408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b601e81527f536166654d617468236d756c3a20496e7465676572206f766572666c6f770000602082015260400190565b603b81527f506f6c617269733a3a5f696e697469616c697a654d656469616e697a65723a2060208201527f546f6b656e206d757374206578697374206f6e20556e69737761700000000000604082015260600190565b805160408301906200213d8482620021ed565b506020820151620021526020850182620021ed565b50505050565b805160009060e08401906200216e8582620021f8565b506020830151620021836020860182620021ed565b506040830151620021986040860182620021ed565b5060608301518482036060860152620021b2828262001da3565b91505060808301518482036080860152620021ce828262001da3565b91505060a0830151620021e560a08601826200212a565b509392505050565b62001d92816200134d565b62001d928162002391565b6020810162000895828462001d98565b6020810162000895828462001d87565b6040810162002233828562001d87565b62000f466020830184620021ed565b6020810162000895828462001e04565b6020810162000895828462001e0f565b60208082528101620008958162001e1a565b60208082528101620008958162001e70565b60208082528101620008958162001ec6565b60208082528101620008958162001f1c565b60208082528101620008958162001f4c565b60208082528101620008958162001fa2565b60208082528101620008958162001ff8565b60208082528101620008958162002028565b602080825281016200089581620020a4565b602080825281016200089581620020d4565b604081016200089582846200212a565b6020808252810162000f46818462002158565b60208101620008958284620021ed565b60408101620022338285620021ed565b60208101620008958284620021f8565b60200190565b5190565b6000620008958262002385565b151590565b600160a060020a031690565b60ff1690565b600062000895825b600062000895826200237356fe60c0604052600d60808190527f506f6c6172697320546f6b656e0000000000000000000000000000000000000060a0908152620000409160039190620000f1565b506040805180820190915260048082527f504c5253000000000000000000000000000000000000000000000000000000006020909201918252620000859181620000f1565b506005805460ff19166012179055604051602080620013648339810180604052620000b49190810190620001ab565b6005805461010060a860020a031916336101000217905560068054600160a060020a031916600160a060020a0392909216919091179055620001f3565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200013457805160ff191683800117855562000164565b8280016001018555821562000164579182015b828111156200016457825182559160200191906001019062000147565b506200017292915062000176565b5090565b6200019391905b808211156200017257600081556001016200017d565b90565b6000620001a48251620001e0565b9392505050565b600060208284031215620001be57600080fd5b6000620001cc848462000196565b949350505050565b600160a060020a031690565b6000620001ed82620001d4565b92915050565b61116180620002036000396000f3fe608060405260043610610105576000357c01000000000000000000000000000000000000000000000000000000009004806370a08231116100a7578063a9059cbb11610076578063a9059cbb1461027a578063db006a751461029a578063dd62ed3e146102ba578063fc0c546a146102da57610105565b806370a08231146102035780637dc0d1d01461022357806395d89b4114610245578063a457c2d71461025a57610105565b806323b872dd116100e357806323b872dd14610181578063313ce567146101a157806339509351146101c357806340c10f19146101e357610105565b806306fdde0314610107578063095ea7b31461013257806318160ddd1461015f575b005b34801561011357600080fd5b5061011c6102ef565b6040516101299190610fe7565b60405180910390f35b34801561013e57600080fd5b5061015261014d366004610b92565b61037d565b6040516101299190610fd9565b34801561016b57600080fd5b5061017461041f565b60405161012991906110a8565b34801561018d57600080fd5b5061015261019c366004610b45565b610425565b3480156101ad57600080fd5b506101b66104f1565b60405161012991906110b6565b3480156101cf57600080fd5b506101526101de366004610b92565b6104fa565b3480156101ef57600080fd5b506101526101fe366004610b92565b6105b3565b34801561020f57600080fd5b5061017461021e366004610ae5565b6105fb565b34801561022f57600080fd5b50610238610616565b6040516101299190610fcb565b34801561025157600080fd5b5061011c61062a565b34801561026657600080fd5b50610152610275366004610b92565b610685565b34801561028657600080fd5b50610152610295366004610b92565b6106e6565b3480156102a657600080fd5b506101056102b5366004610bc2565b6106f3565b3480156102c657600080fd5b506101746102d5366004610b0b565b61075b565b3480156102e657600080fd5b50610238610786565b6003805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103755780601f1061034a57610100808354040283529160200191610375565b820191906000526020600020905b81548152906001019060200180831161035857829003601f168201915b505050505081565b6000600160a060020a03831615156103b35760405160e560020a62461bcd0281526004016103aa90611038565b60405180910390fd5b336000818152600160209081526040808320600160a060020a03881680855292529182902085905590519091907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061040d9086906110a8565b60405180910390a35060015b92915050565b60025490565b600160a060020a0383166000908152600160209081526040808320338452909152812054610459908363ffffffff61079516565b600160a060020a03851660009081526001602090815260408083203384529091529020556104888484846107c0565b600160a060020a0384166000818152600160209081526040808320338085529252918290205491519092917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925916104df91906110a8565b60405180910390a35060019392505050565b60055460ff1681565b6000600160a060020a03831615156105275760405160e560020a62461bcd0281526004016103aa90611028565b336000908152600160209081526040808320600160a060020a038716845290915290205461055b908363ffffffff6108a816565b336000818152600160209081526040808320600160a060020a038916808552925291829020849055905190927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259161040d91906110a8565b6005546000906101009004600160a060020a031633146105e85760405160e560020a62461bcd0281526004016103aa90611058565b6105f283836108d7565b50600192915050565b600160a060020a031660009081526020819052604090205490565b6005546101009004600160a060020a031681565b6004805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156103755780601f1061034a57610100808354040283529160200191610375565b6000600160a060020a03831615156106b25760405160e560020a62461bcd0281526004016103aa90611018565b336000908152600160209081526040808320600160a060020a038716845290915290205461055b908363ffffffff61079516565b60006105f23384846107c0565b600061071d61070061041f565b61071130318563ffffffff61099c16565b9063ffffffff6109dd16565b90506107293383610a17565b604051339082156108fc029083906000818181858888f19350505050158015610756573d6000803e3d6000fd5b505050565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b600654600160a060020a031681565b6000828211156107ba5760405160e560020a62461bcd0281526004016103aa90611078565b50900390565b600160a060020a03821615156107eb5760405160e560020a62461bcd0281526004016103aa90611008565b600160a060020a038316600090815260208190526040902054610814908263ffffffff61079516565b600160a060020a038085166000908152602081905260408082209390935590841681522054610849908263ffffffff6108a816565b600160a060020a0380841660008181526020819052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061089b9085906110a8565b60405180910390a3505050565b6000828201838110156108d05760405160e560020a62461bcd0281526004016103aa90611048565b9392505050565b600160a060020a03821615156109025760405160e560020a62461bcd0281526004016103aa90610ff8565b600254610915908263ffffffff6108a816565b600255600160a060020a038216600090815260208190526040902054610941908263ffffffff6108a816565b600160a060020a0383166000818152602081905260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109909085906110a8565b60405180910390a35050565b60008215156109ad57506000610419565b8282028284828115156109bc57fe5b04146108d05760405160e560020a62461bcd0281526004016103aa90611088565b6000808211610a015760405160e560020a62461bcd0281526004016103aa90611068565b60008284811515610a0e57fe5b04949350505050565b600160a060020a0382161515610a425760405160e560020a62461bcd0281526004016103aa90611098565b600254610a55908263ffffffff61079516565b600255600160a060020a038216600090815260208190526040902054610a81908263ffffffff61079516565b600160a060020a0383166000818152602081905260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906109909085906110a8565b60006108d082356110c8565b60006108d082356110e4565b600060208284031215610af757600080fd5b6000610b038484610acd565b949350505050565b60008060408385031215610b1e57600080fd5b6000610b2a8585610acd565b9250506020610b3b85828601610acd565b9150509250929050565b600080600060608486031215610b5a57600080fd5b6000610b668686610acd565b9350506020610b7786828701610acd565b9250506040610b8886828701610ad9565b9150509250925092565b60008060408385031215610ba557600080fd5b6000610bb18585610acd565b9250506020610b3b85828601610ad9565b600060208284031215610bd457600080fd5b6000610b038484610ad9565b610be9816110c8565b82525050565b610be9816110d3565b6000610c03826110c4565b808452610c178160208601602086016110ed565b610c208161111d565b9093016020019392505050565b602881527f4552433230235f6d696e743a2043616e6e6f74206d696e7420746f206164647260208201527f657373207a65726f000000000000000000000000000000000000000000000000604082015260600190565b603081527f4552433230235f7472616e736665723a2043616e6e6f74207472616e7366657260208201527f20746f2061646472657373207a65726f00000000000000000000000000000000604082015260600190565b604381527f4552433230236465637265617365416c6c6f77616e63653a2043616e6e6f742060208201527f646563726561736520616c6c6f77616e636520666f722061646472657373207a60408201527f65726f0000000000000000000000000000000000000000000000000000000000606082015260800190565b604381527f455243323023696e637265617365416c6c6f77616e63653a2043616e6e6f742060208201527f696e63726561736520616c6c6f77616e636520666f722061646472657373207a60408201527f65726f0000000000000000000000000000000000000000000000000000000000606082015260800190565b602a81527f455243323023617070726f76653a2043616e6e6f7420617070726f766520616460208201527f6472657373207a65726f00000000000000000000000000000000000000000000604082015260600190565b601e81527f536166654d617468236164643a20496e7465676572206f766572666c6f770000602082015260400190565b602c81527f4f7261636c65546f6b656e3a3a6d696e743a204f6e6c79204f7261636c65206360208201527f616e2063616c6c206d696e740000000000000000000000000000000000000000604082015260600190565b602281527f536166654d617468236469763a20496e76616c69642064697669736f72207a6560208201527f726f000000000000000000000000000000000000000000000000000000000000604082015260600190565b601f81527f536166654d617468237375623a20496e746567657220756e646572666c6f7700602082015260400190565b601e81527f536166654d617468236d756c3a20496e7465676572206f766572666c6f770000602082015260400190565b602a81527f4552433230235f6275726e3a2043616e6e6f74206275726e2066726f6d20616460208201527f6472657373207a65726f00000000000000000000000000000000000000000000604082015260600190565b610be9816110e4565b610be9816110e7565b602081016104198284610be0565b602081016104198284610bef565b602080825281016108d08184610bf8565b6020808252810161041981610c2d565b6020808252810161041981610c83565b6020808252810161041981610cd9565b6020808252810161041981610d55565b6020808252810161041981610dd1565b6020808252810161041981610e27565b6020808252810161041981610e57565b6020808252810161041981610ead565b6020808252810161041981610f03565b6020808252810161041981610f33565b6020808252810161041981610f63565b602081016104198284610fb9565b602081016104198284610fc2565b5190565b6000610419826110d8565b151590565b600160a060020a031690565b90565b60ff1690565b60005b838110156111085781810151838201526020016110f0565b83811115611117576000848401525b50505050565b601f01601f19169056fea265627a7a72305820421198d3fcc3903d1afc88102fb66379ce581857a6d95819a0febd65835f34a56c6578706572696d656e74616cf50037a265627a7a7230582027f78db4ee58efae0039bbd3f856c4ddf728b547472e6873e51150243cb78df16c6578706572696d656e74616cf50037
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c0a47dfe034b400b47bdad5fecda2621de6c4d95
-----Decoded View---------------
Arg [0] : _uniswap (address): 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c0a47dfe034b400b47bdad5fecda2621de6c4d95
Swarm Source
bzzr://27f78db4ee58efae0039bbd3f856c4ddf728b547472e6873e51150243cb78df1
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.