Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 14,874 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Prices | 11690749 | 1340 days ago | IN | 0 ETH | 0.00223524 | ||||
Set Prices | 11690568 | 1340 days ago | IN | 0 ETH | 0.00212986 | ||||
Set Prices | 11690527 | 1340 days ago | IN | 0 ETH | 0.00280938 | ||||
Set Prices | 11690426 | 1340 days ago | IN | 0 ETH | 0.00276744 | ||||
Set Prices | 11690326 | 1340 days ago | IN | 0 ETH | 0.00191462 | ||||
Set Prices | 11690287 | 1340 days ago | IN | 0 ETH | 0.00218054 | ||||
Set Prices | 11690179 | 1340 days ago | IN | 0 ETH | 0.00233956 | ||||
Set Prices | 11690107 | 1340 days ago | IN | 0 ETH | 0.00188922 | ||||
Set Prices | 11690064 | 1340 days ago | IN | 0 ETH | 0.00330038 | ||||
Set Prices | 11690040 | 1340 days ago | IN | 0 ETH | 0.00878782 | ||||
Set Prices | 11690002 | 1340 days ago | IN | 0 ETH | 0.00356493 | ||||
Set Prices | 11689984 | 1340 days ago | IN | 0 ETH | 0.00670947 | ||||
Set Prices | 11689955 | 1340 days ago | IN | 0 ETH | 0.00223423 | ||||
Set Prices | 11689909 | 1340 days ago | IN | 0 ETH | 0.00529702 | ||||
Set Prices | 11689892 | 1340 days ago | IN | 0 ETH | 0.00287838 | ||||
Set Prices | 11689817 | 1340 days ago | IN | 0 ETH | 0.00218978 | ||||
Set Prices | 11689801 | 1340 days ago | IN | 0 ETH | 0.00456525 | ||||
Set Prices | 11689765 | 1340 days ago | IN | 0 ETH | 0.00438951 | ||||
Set Prices | 11689745 | 1340 days ago | IN | 0 ETH | 0.00500311 | ||||
Set Prices | 11689732 | 1340 days ago | IN | 0 ETH | 0.0025875 | ||||
Set Prices | 11689686 | 1340 days ago | IN | 0 ETH | 0.00366886 | ||||
Set Prices | 11689519 | 1340 days ago | IN | 0 ETH | 0.00518316 | ||||
Set Prices | 11689505 | 1340 days ago | IN | 0 ETH | 0.00329964 | ||||
Set Prices | 11689488 | 1340 days ago | IN | 0 ETH | 0.00508085 | ||||
Set Prices | 11689372 | 1340 days ago | IN | 0 ETH | 0.0046026 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
PriceOracle
Compiler Version
v0.4.26+commit.4563c3fc
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-08-02 */ /** *Submitted for verification at Etherscan.io on 2020-07-29 */ pragma solidity ^0.4.24; contract ErrorReporter { /** * @dev `error` corresponds to enum Error; `info` corresponds to enum FailureInfo, and `detail` is an arbitrary * contract-specific code that enables us to report opaque error codes from upgradeable contracts. **/ event Failure(uint error, uint info, uint detail); enum Error { NO_ERROR, OPAQUE_ERROR, // To be used when reporting errors from upgradeable contracts; the opaque code should be given as `detail` in the `Failure` event UNAUTHORIZED, INTEGER_OVERFLOW, INTEGER_UNDERFLOW, DIVISION_BY_ZERO, BAD_INPUT, TOKEN_INSUFFICIENT_ALLOWANCE, TOKEN_INSUFFICIENT_BALANCE, TOKEN_TRANSFER_FAILED, MARKET_NOT_SUPPORTED, SUPPLY_RATE_CALCULATION_FAILED, BORROW_RATE_CALCULATION_FAILED, TOKEN_INSUFFICIENT_CASH, TOKEN_TRANSFER_OUT_FAILED, INSUFFICIENT_LIQUIDITY, INSUFFICIENT_BALANCE, INVALID_COLLATERAL_RATIO, MISSING_ASSET_PRICE, EQUITY_INSUFFICIENT_BALANCE, INVALID_CLOSE_AMOUNT_REQUESTED, ASSET_NOT_PRICED, INVALID_LIQUIDATION_DISCOUNT, INVALID_COMBINED_RISK_PARAMETERS } /* * Note: FailureInfo (but not Error) is kept in alphabetical order * This is because FailureInfo grows significantly faster, and * the order of Error has some meaning, while the order of FailureInfo * is entirely arbitrary. */ enum FailureInfo { BORROW_ACCOUNT_LIQUIDITY_CALCULATION_FAILED, BORROW_ACCOUNT_SHORTFALL_PRESENT, BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, BORROW_AMOUNT_LIQUIDITY_SHORTFALL, BORROW_AMOUNT_VALUE_CALCULATION_FAILED, BORROW_MARKET_NOT_SUPPORTED, BORROW_NEW_BORROW_INDEX_CALCULATION_FAILED, BORROW_NEW_BORROW_RATE_CALCULATION_FAILED, BORROW_NEW_SUPPLY_INDEX_CALCULATION_FAILED, BORROW_NEW_SUPPLY_RATE_CALCULATION_FAILED, BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED, BORROW_NEW_TOTAL_BORROW_CALCULATION_FAILED, BORROW_NEW_TOTAL_CASH_CALCULATION_FAILED, BORROW_ORIGINATION_FEE_CALCULATION_FAILED, BORROW_TRANSFER_OUT_FAILED, EQUITY_WITHDRAWAL_AMOUNT_VALIDATION, EQUITY_WITHDRAWAL_CALCULATE_EQUITY, EQUITY_WITHDRAWAL_MODEL_OWNER_CHECK, EQUITY_WITHDRAWAL_TRANSFER_OUT_FAILED, LIQUIDATE_ACCUMULATED_BORROW_BALANCE_CALCULATION_FAILED, LIQUIDATE_ACCUMULATED_SUPPLY_BALANCE_CALCULATION_FAILED_BORROWER_COLLATERAL_ASSET, LIQUIDATE_ACCUMULATED_SUPPLY_BALANCE_CALCULATION_FAILED_LIQUIDATOR_COLLATERAL_ASSET, LIQUIDATE_AMOUNT_SEIZE_CALCULATION_FAILED, LIQUIDATE_BORROW_DENOMINATED_COLLATERAL_CALCULATION_FAILED, LIQUIDATE_CLOSE_AMOUNT_TOO_HIGH, LIQUIDATE_DISCOUNTED_REPAY_TO_EVEN_AMOUNT_CALCULATION_FAILED, LIQUIDATE_NEW_BORROW_INDEX_CALCULATION_FAILED_BORROWED_ASSET, LIQUIDATE_NEW_BORROW_INDEX_CALCULATION_FAILED_COLLATERAL_ASSET, LIQUIDATE_NEW_BORROW_RATE_CALCULATION_FAILED_BORROWED_ASSET, LIQUIDATE_NEW_SUPPLY_INDEX_CALCULATION_FAILED_BORROWED_ASSET, LIQUIDATE_NEW_SUPPLY_INDEX_CALCULATION_FAILED_COLLATERAL_ASSET, LIQUIDATE_NEW_SUPPLY_RATE_CALCULATION_FAILED_BORROWED_ASSET, LIQUIDATE_NEW_TOTAL_BORROW_CALCULATION_FAILED_BORROWED_ASSET, LIQUIDATE_NEW_TOTAL_CASH_CALCULATION_FAILED_BORROWED_ASSET, LIQUIDATE_NEW_TOTAL_SUPPLY_BALANCE_CALCULATION_FAILED_BORROWER_COLLATERAL_ASSET, LIQUIDATE_NEW_TOTAL_SUPPLY_BALANCE_CALCULATION_FAILED_LIQUIDATOR_COLLATERAL_ASSET, LIQUIDATE_TRANSFER_IN_FAILED, LIQUIDATE_TRANSFER_IN_NOT_POSSIBLE, REPAY_BORROW_ACCUMULATED_BALANCE_CALCULATION_FAILED, REPAY_BORROW_NEW_BORROW_INDEX_CALCULATION_FAILED, REPAY_BORROW_NEW_BORROW_RATE_CALCULATION_FAILED, REPAY_BORROW_NEW_SUPPLY_INDEX_CALCULATION_FAILED, REPAY_BORROW_NEW_SUPPLY_RATE_CALCULATION_FAILED, REPAY_BORROW_NEW_TOTAL_BALANCE_CALCULATION_FAILED, REPAY_BORROW_NEW_TOTAL_BORROW_CALCULATION_FAILED, REPAY_BORROW_NEW_TOTAL_CASH_CALCULATION_FAILED, REPAY_BORROW_TRANSFER_IN_FAILED, REPAY_BORROW_TRANSFER_IN_NOT_POSSIBLE, SET_ADMIN_OWNER_CHECK, SET_ASSET_PRICE_CHECK_ORACLE, SET_MARKET_INTEREST_RATE_MODEL_OWNER_CHECK, SET_ORACLE_OWNER_CHECK, SET_ORIGINATION_FEE_OWNER_CHECK, SET_RISK_PARAMETERS_OWNER_CHECK, SET_RISK_PARAMETERS_VALIDATION, SUPPLY_ACCUMULATED_BALANCE_CALCULATION_FAILED, SUPPLY_MARKET_NOT_SUPPORTED, SUPPLY_NEW_BORROW_INDEX_CALCULATION_FAILED, SUPPLY_NEW_BORROW_RATE_CALCULATION_FAILED, SUPPLY_NEW_SUPPLY_INDEX_CALCULATION_FAILED, SUPPLY_NEW_SUPPLY_RATE_CALCULATION_FAILED, SUPPLY_NEW_TOTAL_BALANCE_CALCULATION_FAILED, SUPPLY_NEW_TOTAL_CASH_CALCULATION_FAILED, SUPPLY_NEW_TOTAL_SUPPLY_CALCULATION_FAILED, SUPPLY_TRANSFER_IN_FAILED, SUPPLY_TRANSFER_IN_NOT_POSSIBLE, SUPPORT_MARKET_OWNER_CHECK, SUPPORT_MARKET_PRICE_CHECK, SUSPEND_MARKET_OWNER_CHECK, WITHDRAW_ACCOUNT_LIQUIDITY_CALCULATION_FAILED, WITHDRAW_ACCOUNT_SHORTFALL_PRESENT, WITHDRAW_ACCUMULATED_BALANCE_CALCULATION_FAILED, WITHDRAW_AMOUNT_LIQUIDITY_SHORTFALL, WITHDRAW_AMOUNT_VALUE_CALCULATION_FAILED, WITHDRAW_CAPACITY_CALCULATION_FAILED, WITHDRAW_NEW_BORROW_INDEX_CALCULATION_FAILED, WITHDRAW_NEW_BORROW_RATE_CALCULATION_FAILED, WITHDRAW_NEW_SUPPLY_INDEX_CALCULATION_FAILED, WITHDRAW_NEW_SUPPLY_RATE_CALCULATION_FAILED, WITHDRAW_NEW_TOTAL_BALANCE_CALCULATION_FAILED, WITHDRAW_NEW_TOTAL_SUPPLY_CALCULATION_FAILED, WITHDRAW_TRANSFER_OUT_FAILED, WITHDRAW_TRANSFER_OUT_NOT_POSSIBLE } /** * @dev use this when reporting a known error from the money market or a non-upgradeable collaborator */ function fail(Error err, FailureInfo info) internal returns (uint) { emit Failure(uint(err), uint(info), 0); return uint(err); } /** * @dev use this when reporting an opaque error from an upgradeable collaborator contract */ function failOpaque(FailureInfo info, uint opaqueError) internal returns (uint) { emit Failure(uint(Error.OPAQUE_ERROR), uint(info), opaqueError); return uint(Error.OPAQUE_ERROR); } } contract DSValue { // TODO: View or constant? It's clearly a view... function peek() public view returns (bytes32, bool); function read() public view returns (bytes32); } contract CarefulMath is ErrorReporter { /** * @dev Multiplies two numbers, returns an error on overflow. */ function mul(uint a, uint b) internal pure returns (Error, uint) { if (a == 0) { return (Error.NO_ERROR, 0); } uint c = a * b; if (c / a != b) { return (Error.INTEGER_OVERFLOW, 0); } else { return (Error.NO_ERROR, c); } } /** * @dev Integer division of two numbers, truncating the quotient. */ function div(uint a, uint b) internal pure returns (Error, uint) { if (b == 0) { return (Error.DIVISION_BY_ZERO, 0); } return (Error.NO_ERROR, a / b); } /** * @dev Subtracts two numbers, returns an error on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint a, uint b) internal pure returns (Error, uint) { if (b <= a) { return (Error.NO_ERROR, a - b); } else { return (Error.INTEGER_UNDERFLOW, 0); } } /** * @dev Adds two numbers, returns an error on overflow. */ function add(uint a, uint b) internal pure returns (Error, uint) { uint c = a + b; if (c >= a) { return (Error.NO_ERROR, c); } else { return (Error.INTEGER_OVERFLOW, 0); } } /** * @dev add a and b and then subtract c */ function addThenSub(uint a, uint b, uint c) internal pure returns (Error, uint) { (Error err0, uint sum) = add(a, b); if (err0 != Error.NO_ERROR) { return (err0, 0); } return sub(sum, c); } } contract Exponential is ErrorReporter, CarefulMath { // TODO: We may wish to put the result of 10**18 here instead of the expression. // Per https://solidity.readthedocs.io/en/latest/contracts.html#constant-state-variables // the optimizer MAY replace the expression 10**18 with its calculated value. uint constant expScale = 10**18; // See TODO on expScale uint constant halfExpScale = expScale/2; struct Exp { uint mantissa; } uint constant mantissaOne = 10**18; uint constant mantissaOneTenth = 10**17; /** * @dev Creates an exponential from numerator and denominator values. * Note: Returns an error if (`num` * 10e18) > MAX_INT, * or if `denom` is zero. */ function getExp(uint num, uint denom) pure internal returns (Error, Exp memory) { (Error err0, uint scaledNumerator) = mul(num, expScale); if (err0 != Error.NO_ERROR) { return (err0, Exp({mantissa: 0})); } (Error err1, uint rational) = div(scaledNumerator, denom); if (err1 != Error.NO_ERROR) { return (err1, Exp({mantissa: 0})); } return (Error.NO_ERROR, Exp({mantissa: rational})); } /** * @dev Adds two exponentials, returning a new exponential. */ function addExp(Exp memory a, Exp memory b) pure internal returns (Error, Exp memory) { (Error error, uint result) = add(a.mantissa, b.mantissa); return (error, Exp({mantissa: result})); } /** * @dev Subtracts two exponentials, returning a new exponential. */ function subExp(Exp memory a, Exp memory b) pure internal returns (Error, Exp memory) { (Error error, uint result) = sub(a.mantissa, b.mantissa); return (error, Exp({mantissa: result})); } /** * @dev Multiply an Exp by a scalar, returning a new Exp. */ function mulScalar(Exp memory a, uint scalar) pure internal returns (Error, Exp memory) { (Error err0, uint scaledMantissa) = mul(a.mantissa, scalar); if (err0 != Error.NO_ERROR) { return (err0, Exp({mantissa: 0})); } return (Error.NO_ERROR, Exp({mantissa: scaledMantissa})); } /** * @dev Divide an Exp by a scalar, returning a new Exp. */ function divScalar(Exp memory a, uint scalar) pure internal returns (Error, Exp memory) { (Error err0, uint descaledMantissa) = div(a.mantissa, scalar); if (err0 != Error.NO_ERROR) { return (err0, Exp({mantissa: 0})); } return (Error.NO_ERROR, Exp({mantissa: descaledMantissa})); } /** * @dev Divide a scalar by an Exp, returning a new Exp. */ function divScalarByExp(uint scalar, Exp divisor) pure internal returns (Error, Exp memory) { /* We are doing this as: getExp(mul(expScale, scalar), divisor.mantissa) How it works: Exp = a / b; Scalar = s; `s / (a / b)` = `b * s / a` and since for an Exp `a = mantissa, b = expScale` */ (Error err0, uint numerator) = mul(expScale, scalar); if (err0 != Error.NO_ERROR) { return (err0, Exp({mantissa: 0})); } return getExp(numerator, divisor.mantissa); } /** * @dev Multiplies two exponentials, returning a new exponential. */ function mulExp(Exp memory a, Exp memory b) pure internal returns (Error, Exp memory) { (Error err0, uint doubleScaledProduct) = mul(a.mantissa, b.mantissa); if (err0 != Error.NO_ERROR) { return (err0, Exp({mantissa: 0})); } // We add half the scale before dividing so that we get rounding instead of truncation. // See "Listing 6" and text above it at https://accu.org/index.php/journals/1717 // Without this change, a result like 6.6...e-19 will be truncated to 0 instead of being rounded to 1e-18. (Error err1, uint doubleScaledProductWithHalfScale) = add(halfExpScale, doubleScaledProduct); if (err1 != Error.NO_ERROR) { return (err1, Exp({mantissa: 0})); } (Error err2, uint product) = div(doubleScaledProductWithHalfScale, expScale); // The only error `div` can return is Error.DIVISION_BY_ZERO but we control `expScale` and it is not zero. assert(err2 == Error.NO_ERROR); return (Error.NO_ERROR, Exp({mantissa: product})); } /** * @dev Divides two exponentials, returning a new exponential. * (a/scale) / (b/scale) = (a/scale) * (scale/b) = a/b, * which we can scale as an Exp by calling getExp(a.mantissa, b.mantissa) */ function divExp(Exp memory a, Exp memory b) pure internal returns (Error, Exp memory) { return getExp(a.mantissa, b.mantissa); } /** * @dev Truncates the given exp to a whole number value. * For example, truncate(Exp{mantissa: 15 * (10**18)}) = 15 */ function truncate(Exp memory exp) pure internal returns (uint) { // Note: We are not using careful math here as we're performing a division that cannot fail return exp.mantissa / 10**18; } /** * @dev Checks if first Exp is less than second Exp. */ function lessThanExp(Exp memory left, Exp memory right) pure internal returns (bool) { return left.mantissa < right.mantissa; //TODO: Add some simple tests and this in another PR yo. } /** * @dev Checks if left Exp <= right Exp. */ function lessThanOrEqualExp(Exp memory left, Exp memory right) pure internal returns (bool) { return left.mantissa <= right.mantissa; } /** * @dev Checks if first Exp is greater than second Exp. */ function greaterThanExp(Exp memory left, Exp memory right) pure internal returns (bool) { return left.mantissa > right.mantissa; } /** * @dev returns true if Exp is exactly zero */ function isZeroExp(Exp memory value) pure internal returns (bool) { return value.mantissa == 0; } } contract PriceOracle is Exponential { /** * @dev flag for whether or not contract is paused * */ bool public paused; uint public constant numBlocksPerPeriod = 240; // approximately 1 hour: 60 seconds/minute * 60 minutes/hour * 1 block/15 seconds uint public constant maxSwingMantissa = (10 ** 17); // 0.1 /** * @dev Mapping of asset addresses to DSValue price oracle contracts. The price contracts * should be DSValue contracts whose value is the `eth:asset` price scaled by 1e18. * That is, 1 eth is worth how much of the asset (e.g. 1 eth = 100 USD). We want * to know the inverse, which is how much eth is one asset worth. This `asset:eth` * is the multiplicative inverse (in that example, 1/100). The math is a bit trickier * since we need to descale the number by 1e18, inverse, and then rescale the number. * We perform this operation to return the `asset:eth` price for these reader assets. * * map: assetAddress -> DSValue price oracle */ mapping(address => DSValue) public readers; /** * @dev Mapping of asset addresses and their corresponding price in terms of Eth-Wei * which is simply equal to AssetWeiPrice * 10e18. For instance, if OMG token was * worth 5x Eth then the price for OMG would be 5*10e18 or Exp({mantissa: 5000000000000000000}). * map: assetAddress -> Exp */ mapping(address => Exp) public _assetPrices; constructor(address _poster, address addr0, address reader0, address addr1, address reader1) public { anchorAdmin = msg.sender; poster = _poster; maxSwing = Exp({mantissa : maxSwingMantissa}); // Make sure the assets are zero or different assert(addr0 == address(0) || (addr0 != addr1)); if (addr0 != address(0)) { assert(reader0 != address(0)); readers[addr0] = DSValue(reader0); } else { assert(reader0 == address(0)); } if (addr1 != address(0)) { assert(reader1 != address(0)); readers[addr1] = DSValue(reader1); } else { assert(reader1 == address(0)); } } /** * @notice Do not pay into PriceOracle */ function() payable public { revert(); } enum OracleError { NO_ERROR, UNAUTHORIZED, FAILED_TO_SET_PRICE } enum OracleFailureInfo { ACCEPT_ANCHOR_ADMIN_PENDING_ANCHOR_ADMIN_CHECK, SET_PAUSED_OWNER_CHECK, SET_PENDING_ANCHOR_ADMIN_OWNER_CHECK, SET_PENDING_ANCHOR_PERMISSION_CHECK, SET_PRICE_CALCULATE_SWING, SET_PRICE_CAP_TO_MAX, SET_PRICE_MAX_SWING_CHECK, SET_PRICE_NO_ANCHOR_PRICE_OR_INITIAL_PRICE_ZERO, SET_PRICE_PERMISSION_CHECK, SET_PRICE_ZERO_PRICE, SET_PRICES_PARAM_VALIDATION, SET_PRICE_IS_READER_ASSET } /** * @dev `msgSender` is msg.sender; `error` corresponds to enum OracleError; `info` corresponds to enum OracleFailureInfo, and `detail` is an arbitrary * contract-specific code that enables us to report opaque error codes from upgradeable contracts. **/ event OracleFailure(address msgSender, address asset, uint error, uint info, uint detail); /** * @dev use this when reporting a known error from the price oracle or a non-upgradeable collaborator * Using Oracle in name because we already inherit a `fail` function from ErrorReporter.sol via Exponential.sol */ function failOracle(address asset, OracleError err, OracleFailureInfo info) internal returns (uint) { emit OracleFailure(msg.sender, asset, uint(err), uint(info), 0); return uint(err); } /** * @dev Use this when reporting an error from the money market. Give the money market result as `details` */ function failOracleWithDetails(address asset, OracleError err, OracleFailureInfo info, uint details) internal returns (uint) { emit OracleFailure(msg.sender, asset, uint(err), uint(info), details); return uint(err); } /** * @dev An administrator who can set the pending anchor value for assets. * Set in the constructor. */ address public anchorAdmin; /** * @dev pending anchor administrator for this contract. */ address public pendingAnchorAdmin; /** * @dev Address of the price poster. * Set in the constructor. */ address public poster; /** * @dev maxSwing the maximum allowed percentage difference between a new price and the anchor's price * Set only in the constructor */ Exp public maxSwing; struct Anchor { // floor(block.number / numBlocksPerPeriod) + 1 uint period; // Price in ETH, scaled by 10**18 uint priceMantissa; } /** * @dev anchors by asset */ mapping(address => Anchor) public anchors; /** * @dev pending anchor prices by asset */ mapping(address => uint) public pendingAnchors; /** * @dev emitted when a pending anchor is set * @param asset Asset for which to set a pending anchor * @param oldScaledPrice if an unused pending anchor was present, its value; otherwise 0. * @param newScaledPrice the new scaled pending anchor price */ event NewPendingAnchor(address anchorAdmin, address asset, uint oldScaledPrice, uint newScaledPrice); /** * @notice provides ability to override the anchor price for an asset * @dev Admin function to set the anchor price for an asset * @param asset Asset for which to override the anchor price * @param newScaledPrice New anchor price * @return uint 0=success, otherwise a failure (see enum OracleError for details) */ function _setPendingAnchor(address asset, uint newScaledPrice) public returns (uint) { // Check caller = anchorAdmin. Note: Deliberately not allowing admin. They can just change anchorAdmin if desired. if (msg.sender != anchorAdmin) { return failOracle(asset, OracleError.UNAUTHORIZED, OracleFailureInfo.SET_PENDING_ANCHOR_PERMISSION_CHECK); } uint oldScaledPrice = pendingAnchors[asset]; pendingAnchors[asset] = newScaledPrice; emit NewPendingAnchor(msg.sender, asset, oldScaledPrice, newScaledPrice); return uint(OracleError.NO_ERROR); } /** * @dev emitted for all price changes */ event PricePosted(address asset, uint previousPriceMantissa, uint requestedPriceMantissa, uint newPriceMantissa); /** * @dev emitted if this contract successfully posts a capped-to-max price to the money market */ event CappedPricePosted(address asset, uint requestedPriceMantissa, uint anchorPriceMantissa, uint cappedPriceMantissa); /** * @dev emitted when admin either pauses or resumes the contract; newState is the resulting state */ event SetPaused(bool newState); /** * @dev emitted when pendingAnchorAdmin is changed */ event NewPendingAnchorAdmin(address oldPendingAnchorAdmin, address newPendingAnchorAdmin); /** * @dev emitted when pendingAnchorAdmin is accepted, which means anchor admin is updated */ event NewAnchorAdmin(address oldAnchorAdmin, address newAnchorAdmin); /** * @notice set `paused` to the specified state * @dev Admin function to pause or resume the market * @param requestedState value to assign to `paused` * @return uint 0=success, otherwise a failure */ function _setPaused(bool requestedState) public returns (uint) { // Check caller = anchorAdmin if (msg.sender != anchorAdmin) { return failOracle(0, OracleError.UNAUTHORIZED, OracleFailureInfo.SET_PAUSED_OWNER_CHECK); } paused = requestedState; emit SetPaused(requestedState); return uint(Error.NO_ERROR); } /** * @notice Begins transfer of anchor admin rights. The newPendingAnchorAdmin must call `_acceptAnchorAdmin` to finalize the transfer. * @dev Admin function to begin change of anchor admin. The newPendingAnchorAdmin must call `_acceptAnchorAdmin` to finalize the transfer. * @param newPendingAnchorAdmin New pending anchor admin. * @return uint 0=success, otherwise a failure * * TODO: Should we add a second arg to verify, like a checksum of `newAnchorAdmin` address? */ function _setPendingAnchorAdmin(address newPendingAnchorAdmin) public returns (uint) { // Check caller = anchorAdmin if (msg.sender != anchorAdmin) { return failOracle(0, OracleError.UNAUTHORIZED, OracleFailureInfo.SET_PENDING_ANCHOR_ADMIN_OWNER_CHECK); } // save current value, if any, for inclusion in log address oldPendingAnchorAdmin = pendingAnchorAdmin; // Store pendingAdmin = newPendingAdmin pendingAnchorAdmin = newPendingAnchorAdmin; emit NewPendingAnchorAdmin(oldPendingAnchorAdmin, newPendingAnchorAdmin); return uint(Error.NO_ERROR); } /** * @notice Accepts transfer of anchor admin rights. msg.sender must be pendingAnchorAdmin * @dev Admin function for pending anchor admin to accept role and update anchor admin * @return uint 0=success, otherwise a failure */ function _acceptAnchorAdmin() public returns (uint) { // Check caller = pendingAnchorAdmin // msg.sender can't be zero if (msg.sender != pendingAnchorAdmin) { return failOracle(0, OracleError.UNAUTHORIZED, OracleFailureInfo.ACCEPT_ANCHOR_ADMIN_PENDING_ANCHOR_ADMIN_CHECK); } // Save current value for inclusion in log address oldAnchorAdmin = anchorAdmin; // Store admin = pendingAnchorAdmin anchorAdmin = pendingAnchorAdmin; // Clear the pending value pendingAnchorAdmin = 0; emit NewAnchorAdmin(oldAnchorAdmin, msg.sender); return uint(Error.NO_ERROR); } /** * @notice retrieves price of an asset * @dev function to get price for an asset * @param asset Asset for which to get the price * @return uint mantissa of asset price (scaled by 1e18) or zero if unset or contract paused */ function assetPrices(address asset) public view returns (uint) { // Note: zero is treated by the money market as an invalid // price and will cease operations with that asset // when zero. // // We get the price as: // // 1. If the contract is paused, return 0. // 2. If the asset is a reader asset: // a. If the reader has a value set, invert it and return. // b. Else, return 0. // 3. Return price in `_assetPrices`, which may be zero. if (paused) { return 0; } else { if (readers[asset] != address(0)) { (bytes32 readValue, bool foundValue) = readers[asset].peek(); if (foundValue) { (Error error, Exp memory invertedVal) = getExp(mantissaOne, uint256(readValue)); if (error != Error.NO_ERROR) { return 0; } return invertedVal.mantissa; } else { return 0; } } else { return _assetPrices[asset].mantissa; } } } /** * @notice retrieves price of an asset * @dev function to get price for an asset * @param asset Asset for which to get the price * @return uint mantissa of asset price (scaled by 1e18) or zero if unset or contract paused */ function getPrice(address asset) public view returns (uint) { return assetPrices(asset); } struct SetPriceLocalVars { Exp price; Exp swing; Exp anchorPrice; uint anchorPeriod; uint currentPeriod; bool priceCapped; uint cappingAnchorPriceMantissa; uint pendingAnchorMantissa; } /** * @notice entry point for updating prices * @dev function to set price for an asset * @param asset Asset for which to set the price * @param requestedPriceMantissa requested new price, scaled by 10**18 * @return uint 0=success, otherwise a failure (see enum OracleError for details) */ function setPrice(address asset, uint requestedPriceMantissa) public returns (uint) { // Fail when msg.sender is not poster if (msg.sender != poster) { return failOracle(asset, OracleError.UNAUTHORIZED, OracleFailureInfo.SET_PRICE_PERMISSION_CHECK); } return setPriceInternal(asset, requestedPriceMantissa); } function setPriceInternal(address asset, uint requestedPriceMantissa) internal returns (uint) { // re-used for intermediate errors Error err; SetPriceLocalVars memory localVars; // We add 1 for currentPeriod so that it can never be zero and there's no ambiguity about an unset value. // (It can be a problem in tests with low block numbers.) localVars.currentPeriod = (block.number / numBlocksPerPeriod) + 1; localVars.pendingAnchorMantissa = pendingAnchors[asset]; localVars.price = Exp({mantissa : requestedPriceMantissa}); if (readers[asset] != address(0)) { return failOracle(asset, OracleError.FAILED_TO_SET_PRICE, OracleFailureInfo.SET_PRICE_IS_READER_ASSET); } if (localVars.pendingAnchorMantissa != 0) { // let's explicitly set to 0 rather than relying on default of declaration localVars.anchorPeriod = 0; localVars.anchorPrice = Exp({mantissa : localVars.pendingAnchorMantissa}); // Verify movement is within max swing of pending anchor (currently: 10%) (err, localVars.swing) = calculateSwing(localVars.anchorPrice, localVars.price); if (err != Error.NO_ERROR) { return failOracleWithDetails(asset, OracleError.FAILED_TO_SET_PRICE, OracleFailureInfo.SET_PRICE_CALCULATE_SWING, uint(err)); } // Fail when swing > maxSwing if (greaterThanExp(localVars.swing, maxSwing)) { return failOracleWithDetails(asset, OracleError.FAILED_TO_SET_PRICE, OracleFailureInfo.SET_PRICE_MAX_SWING_CHECK, localVars.swing.mantissa); } } else { localVars.anchorPeriod = anchors[asset].period; localVars.anchorPrice = Exp({mantissa : anchors[asset].priceMantissa}); if (localVars.anchorPeriod != 0) { (err, localVars.priceCapped, localVars.price) = capToMax(localVars.anchorPrice, localVars.price); if (err != Error.NO_ERROR) { return failOracleWithDetails(asset, OracleError.FAILED_TO_SET_PRICE, OracleFailureInfo.SET_PRICE_CAP_TO_MAX, uint(err)); } if (localVars.priceCapped) { // save for use in log localVars.cappingAnchorPriceMantissa = localVars.anchorPrice.mantissa; } } else { // Setting first price. Accept as is (already assigned above from requestedPriceMantissa) and use as anchor localVars.anchorPrice = Exp({mantissa : requestedPriceMantissa}); } } // Fail if anchorPrice or price is zero. // zero anchor represents an unexpected situation likely due to a problem in this contract // zero price is more likely as the result of bad input from the caller of this function if (isZeroExp(localVars.anchorPrice)) { // If we get here price could also be zero, but it does not seem worthwhile to distinguish the 3rd case return failOracle(asset, OracleError.FAILED_TO_SET_PRICE, OracleFailureInfo.SET_PRICE_NO_ANCHOR_PRICE_OR_INITIAL_PRICE_ZERO); } if (isZeroExp(localVars.price)) { return failOracle(asset, OracleError.FAILED_TO_SET_PRICE, OracleFailureInfo.SET_PRICE_ZERO_PRICE); } // BEGIN SIDE EFFECTS // Set pendingAnchor = Nothing // Pending anchor is only used once. if (pendingAnchors[asset] != 0) { pendingAnchors[asset] = 0; } // If currentPeriod > anchorPeriod: // Set anchors[asset] = (currentPeriod, price) // The new anchor is if we're in a new period or we had a pending anchor, then we become the new anchor if (localVars.currentPeriod > localVars.anchorPeriod) { anchors[asset] = Anchor({period : localVars.currentPeriod, priceMantissa : localVars.price.mantissa}); } uint previousPrice = _assetPrices[asset].mantissa; setPriceStorageInternal(asset, localVars.price.mantissa); emit PricePosted(asset, previousPrice, requestedPriceMantissa, localVars.price.mantissa); if (localVars.priceCapped) { // We have set a capped price. Log it so we can detect the situation and investigate. emit CappedPricePosted(asset, requestedPriceMantissa, localVars.cappingAnchorPriceMantissa, localVars.price.mantissa); } return uint(OracleError.NO_ERROR); } // As a function to allow harness overrides function setPriceStorageInternal(address asset, uint256 priceMantissa) internal { _assetPrices[asset] = Exp({mantissa: priceMantissa}); } // abs(price - anchorPrice) / anchorPrice function calculateSwing(Exp memory anchorPrice, Exp memory price) pure internal returns (Error, Exp memory) { Exp memory numerator; Error err; if (greaterThanExp(anchorPrice, price)) { (err, numerator) = subExp(anchorPrice, price); // can't underflow assert(err == Error.NO_ERROR); } else { (err, numerator) = subExp(price, anchorPrice); // Given greaterThan check above, price >= anchorPrice so can't underflow. assert(err == Error.NO_ERROR); } return divExp(numerator, anchorPrice); } function capToMax(Exp memory anchorPrice, Exp memory price) view internal returns (Error, bool, Exp memory) { Exp memory one = Exp({mantissa : mantissaOne}); Exp memory onePlusMaxSwing; Exp memory oneMinusMaxSwing; Exp memory max; Exp memory min; // re-used for intermediate errors Error err; (err, onePlusMaxSwing) = addExp(one, maxSwing); if (err != Error.NO_ERROR) { return (err, false, Exp({mantissa : 0})); } // max = anchorPrice * (1 + maxSwing) (err, max) = mulExp(anchorPrice, onePlusMaxSwing); if (err != Error.NO_ERROR) { return (err, false, Exp({mantissa : 0})); } // If price > anchorPrice * (1 + maxSwing) // Set price = anchorPrice * (1 + maxSwing) if (greaterThanExp(price, max)) { return (Error.NO_ERROR, true, max); } (err, oneMinusMaxSwing) = subExp(one, maxSwing); if (err != Error.NO_ERROR) { return (err, false, Exp({mantissa : 0})); } // min = anchorPrice * (1 - maxSwing) (err, min) = mulExp(anchorPrice, oneMinusMaxSwing); // We can't overflow here or we would have already overflowed above when calculating `max` assert(err == Error.NO_ERROR); // If price < anchorPrice * (1 - maxSwing) // Set price = anchorPrice * (1 - maxSwing) if (lessThanExp(price, min)) { return (Error.NO_ERROR, true, min); } return (Error.NO_ERROR, false, price); } /** * @notice entry point for updating multiple prices * @dev function to set prices for a variable number of assets. * @param assets a list of up to assets for which to set a price. required: 0 < assets.length == requestedPriceMantissas.length * @param requestedPriceMantissas requested new prices for the assets, scaled by 10**18. required: 0 < assets.length == requestedPriceMantissas.length * @return uint values in same order as inputs. For each: 0=success, otherwise a failure (see enum OracleError for details) */ function setPrices(address[] assets, uint[] requestedPriceMantissas) public returns (uint[] memory) { uint numAssets = assets.length; uint numPrices = requestedPriceMantissas.length; uint[] memory result; // Fail when msg.sender is not poster if (msg.sender != poster) { result = new uint[](1); result[0] = failOracle(0, OracleError.UNAUTHORIZED, OracleFailureInfo.SET_PRICE_PERMISSION_CHECK); return result; } if ((numAssets == 0) || (numPrices != numAssets)) { result = new uint[](1); result[0] = failOracle(0, OracleError.FAILED_TO_SET_PRICE, OracleFailureInfo.SET_PRICES_PARAM_VALIDATION); return result; } result = new uint[](numAssets); for (uint i = 0; i < numAssets; i++) { result[i] = setPriceInternal(assets[i], requestedPriceMantissas[i]); } return result; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"asset","type":"address"},{"name":"requestedPriceMantissa","type":"uint256"}],"name":"setPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"anchorAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxSwingMantissa","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"_assetPrices","outputs":[{"name":"mantissa","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"requestedState","type":"bool"}],"name":"_setPaused","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"asset","type":"address"}],"name":"getPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"assets","type":"address[]"},{"name":"requestedPriceMantissas","type":"uint256[]"}],"name":"setPrices","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pendingAnchorAdmin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"numBlocksPerPeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"readers","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"asset","type":"address"}],"name":"assetPrices","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"anchors","outputs":[{"name":"period","type":"uint256"},{"name":"priceMantissa","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"poster","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newPendingAnchorAdmin","type":"address"}],"name":"_setPendingAnchorAdmin","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"pendingAnchors","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxSwing","outputs":[{"name":"mantissa","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"_acceptAnchorAdmin","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"asset","type":"address"},{"name":"newScaledPrice","type":"uint256"}],"name":"_setPendingAnchor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_poster","type":"address"},{"name":"addr0","type":"address"},{"name":"reader0","type":"address"},{"name":"addr1","type":"address"},{"name":"reader1","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"msgSender","type":"address"},{"indexed":false,"name":"asset","type":"address"},{"indexed":false,"name":"error","type":"uint256"},{"indexed":false,"name":"info","type":"uint256"},{"indexed":false,"name":"detail","type":"uint256"}],"name":"OracleFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"anchorAdmin","type":"address"},{"indexed":false,"name":"asset","type":"address"},{"indexed":false,"name":"oldScaledPrice","type":"uint256"},{"indexed":false,"name":"newScaledPrice","type":"uint256"}],"name":"NewPendingAnchor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"asset","type":"address"},{"indexed":false,"name":"previousPriceMantissa","type":"uint256"},{"indexed":false,"name":"requestedPriceMantissa","type":"uint256"},{"indexed":false,"name":"newPriceMantissa","type":"uint256"}],"name":"PricePosted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"asset","type":"address"},{"indexed":false,"name":"requestedPriceMantissa","type":"uint256"},{"indexed":false,"name":"anchorPriceMantissa","type":"uint256"},{"indexed":false,"name":"cappedPriceMantissa","type":"uint256"}],"name":"CappedPricePosted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newState","type":"bool"}],"name":"SetPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldPendingAnchorAdmin","type":"address"},{"indexed":false,"name":"newPendingAnchorAdmin","type":"address"}],"name":"NewPendingAnchorAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldAnchorAdmin","type":"address"},{"indexed":false,"name":"newAnchorAdmin","type":"address"}],"name":"NewAnchorAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"error","type":"uint256"},{"indexed":false,"name":"info","type":"uint256"},{"indexed":false,"name":"detail","type":"uint256"}],"name":"Failure","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b5060405160a0806200161e833981016040818152825160208085015183860151606087015160809097015160038054600160a060020a0319908116331790915560058054600160a060020a038089169190931617905593870190955267016345785d8a000095869052600695909555919491939290841615806100a5575081600160a060020a031684600160a060020a031614155b15156100ad57fe5b600160a060020a0384161561010157600160a060020a03831615156100ce57fe5b600160a060020a0384811660009081526001602052604090208054600160a060020a031916918516919091179055610112565b600160a060020a0383161561011257fe5b600160a060020a0382161561016657600160a060020a038116151561013357fe5b600160a060020a0382811660009081526001602052604090208054600160a060020a031916918316919091179055610177565b600160a060020a0381161561017757fe5b5050505050611492806200018c6000396000f3006080604052600436106101055763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041662e4768b811461010a57806308f31857146101405780630c9c630114610171578063183f34441461018657806326617c28146101a757806341976e09146101c15780634352fa9f146101e2578063451b1e3a146102c0578063485feabe146102d557806351e59ffb146102ea5780635c975abb1461030b5780635e9a523c14610334578063692374e314610355578063809597211461038f5780639964622c146103a45780639e8c4d95146103c5578063c5faf1d5146103e6578063ccb13cbd146103fb578063de9d0e8514610410575b600080fd5b34801561011657600080fd5b5061012e600160a060020a0360043516602435610434565b60408051918252519081900360200190f35b34801561014c57600080fd5b50610155610470565b60408051600160a060020a039092168252519081900360200190f35b34801561017d57600080fd5b5061012e61047f565b34801561019257600080fd5b5061012e600160a060020a036004351661048b565b3480156101b357600080fd5b5061012e600435151561049d565b3480156101cd57600080fd5b5061012e600160a060020a0360043516610515565b3480156101ee57600080fd5b506040805160206004803580820135838102808601850190965280855261027095369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506105209650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102ac578181015183820152602001610294565b505050509050019250505060405180910390f35b3480156102cc57600080fd5b50610155610671565b3480156102e157600080fd5b5061012e610680565b3480156102f657600080fd5b50610155600160a060020a0360043516610685565b34801561031757600080fd5b506103206106a0565b604080519115158252519081900360200190f35b34801561034057600080fd5b5061012e600160a060020a03600435166106a9565b34801561036157600080fd5b50610376600160a060020a03600435166107fe565b6040805192835260208301919091528051918290030190f35b34801561039b57600080fd5b50610155610817565b3480156103b057600080fd5b5061012e600160a060020a0360043516610826565b3480156103d157600080fd5b5061012e600160a060020a03600435166108ca565b3480156103f257600080fd5b5061012e6108dc565b34801561040757600080fd5b5061012e6108e2565b34801561041c57600080fd5b5061012e600160a060020a036004351660243561098c565b600554600090600160a060020a0316331461045d576104568360016008610a2b565b905061046a565b6104678383610ab4565b90505b92915050565b600354600160a060020a031681565b67016345785d8a000081565b60026020526000908152604090205481565b600354600090600160a060020a031633146104c6576104bf6000600180610a2b565b9050610510565b6000805483151560ff19909116811790915560408051918252517f3c70af01296aef045b2f5c9d3c30b05d4428fd257145b9c7fcd76418e65b59809181900360200190a160005b90505b919050565b600061050d826106a9565b8151815160055460609291908390600090600160a060020a0316331461059157604080516001808252818301909252906020808301908038833901905050915061056e600060016008610a2b565b82600081518110151561057d57fe5b602090810290910101529093508390610667565b83158061059e5750838314155b156105d157604080516001808252818301909252906020808301908038833901905050915061056e60006002600a610a2b565b836040519080825280602002602001820160405280156105fb578160200160208202803883390190505b509150600090505b8381101561066357610643878281518110151561061c57fe5b90602001906020020151878381518110151561063457fe5b90602001906020020151610ab4565b828281518110151561065157fe5b60209081029091010152600101610603565b8194505b5050505092915050565b600454600160a060020a031681565b60f081565b600160205260009081526040902054600160a060020a031681565b60005460ff1681565b6000806000806106b76113fa565b60005460ff16156106cb57600094506107f5565b600160a060020a0386811660009081526001602052604090205416156107d957600160a060020a038087166000908152600160205260408082205481517f59e02dd7000000000000000000000000000000000000000000000000000000008152825191909416936359e02dd79360048083019493928390030190829087803b15801561075657600080fd5b505af115801561076a573d6000803e3d6000fd5b505050506040513d604081101561078057600080fd5b508051602090910151909450925082156107d0576107a6670de0b6b3a764000085610e2a565b909250905060008260178111156107b957fe5b146107c757600094506107f5565b805194506107f5565b600094506107f5565b600160a060020a03861660009081526002602052604090205494505b50505050919050565b6007602052600090815260409020805460019091015482565b600554600160a060020a031681565b6003546000908190600160a060020a031633146108525761084b600060016002610a2b565b91506108c4565b5060048054600160a060020a0384811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040805191909216808252602082019390935281517f6c773973d5bcf264b509f4194ceb99e891251f6aabb325523a863c282958b13e929181900390910190a1600091505b50919050565b60086020526000908152604090205481565b60065481565b6004546000908190600160a060020a0316331461090e57610907600060016000610a2b565b9150610988565b50600380546004805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179095551690556040805192909116808352336020840152815190927fbef9248fe57ae972dd47833f68c43f0b3b2d14217612dfbc804a520a23730d4692908290030190a1600091505b5090565b6003546000908190600160a060020a031633146109b7576109b08460016003610a2b565b9150610a24565b50600160a060020a0383166000818152600860209081526040918290208054908690558251338152918201939093528082018390526060810185905290517ff0aa20c29c1f8e751bfe0a78bc49a520ed14f2dab274087d90d1341d8b76af5c9181900360800190a1600091505b5092915050565b60007f96f29b65cebbd6816352fb242b6af7180b49e8a09e19e589225d35bc8444f0b73385856002811115610a5c57fe5b85600b811115610a6857fe5b60408051600160a060020a0395861681529390941660208401528284019190915260608201526000608082015290519081900360a00190a1826002811115610aac57fe5b949350505050565b600080610abf61140c565b600160f0430481016080830152600160a060020a0386811660008181526008602090815260408083205460e0880152805180830182528a81528752928252939093528220541615610b1e57610b17866002600b610a2b565b9350610e21565b60e082015115610bc257600060608301526040805160208101825260e084015181529083018190528251610b529190610ede565b602084015292506000836017811115610b6757fe5b14610b8557610b178660026004866017811115610b8057fe5b610f63565b6020808301516040805192830190526006548252610ba291610fed565b15610bbd57610b178660026006856020015160000151610f63565b610c79565b600160a060020a038616600081815260076020818152604080842080546060890190815282518085018452969095529290915260019091015483528401919091525115610c6757610c1b82604001518360000151610ff4565b8452151560a084015292506000836017811115610c3457fe5b14610c4d57610b178660026005866017811115610b8057fe5b8160a0015115610bbd5760408201515160c0830152610c79565b60408051602081018252868152908301525b610c868260400151611197565b15610c9857610b178660026007610a2b565b8151610ca390611197565b15610cb557610b178660026009610a2b565b600160a060020a03861660009081526008602052604090205415610ced57600160a060020a0386166000908152600860205260408120555b816060015182608001511115610d3d57604080518082018252608084015181528351516020808301918252600160a060020a038a1660009081526007909152929092209051815590516001909101555b50600160a060020a038516600090815260026020526040902054815151610d6590879061119c565b81515160408051600160a060020a0389168152602081018490528082018890526060810192909252517fdd71a1d19fcba687442a1d5c58578f1e409af71a79d10fd95a4d66efd8fa9ae79181900360800190a18160a0015115610e1c5760c082015182515160408051600160a060020a038a16815260208101899052808201939093526060830191909152517f7221f7a2708437039cc63319145b6b873a40594b9782a3bee45b975e2f3b0f689181900360800190a15b600093505b50505092915050565b6000610e346113fa565b600080600080610e4c88670de0b6b3a76400006111c7565b90945092506000846017811115610e5f57fe5b14610e80576040805160208101909152600081529395509293508492610ed3565b610e8a8388611211565b90925090506000826017811115610e9d57fe5b14610ebe576040805160208101909152600081529195509093508490610ed3565b60408051602081019091528181526000965094505b505050509250929050565b6000610ee86113fa565b610ef06113fa565b6000610efc8686610fed565b15610f2957610f0b8686611241565b925090506000816017811115610f1d57fe5b14610f2457fe5b610f4c565b610f338587611241565b925090506000816017811115610f4557fe5b14610f4c57fe5b610f56828761127b565b9350935050509250929050565b60007f96f29b65cebbd6816352fb242b6af7180b49e8a09e19e589225d35bc8444f0b73386866002811115610f9457fe5b86600b811115610fa057fe5b60408051600160a060020a0395861681529390941660208401528284019190915260608201526080810185905290519081900360a00190a1836002811115610fe457fe5b95945050505050565b5190511190565b600080610fff6113fa565b6110076113fa565b61100f6113fa565b6110176113fa565b61101f6113fa565b6110276113fa565b6040805160208181018352670de0b6b3a7640000825282519081019092526006548252955060009061105a90879061129e565b95509050600081601781111561106c57fe5b1461108f576040805160208101909152600080825291995090975095508761118a565b6110998b866112bd565b9350905060008160178111156110ab57fe5b146110ce576040805160208101909152600080825291995090975095508761118a565b6110d88a84610fed565b156110ed57600060018498509850985061118a565b60408051602081019091526006548152611108908790611241565b94509050600081601781111561111a57fe5b1461113d576040805160208101909152600080825291995090975095508761118a565b6111478b856112bd565b92509050600081601781111561115957fe5b1461116057fe5b61116a8a836113aa565b1561117f57600060018398509850985061118a565b6000808b9850985098505b5050505050509250925092565b511590565b6040805160208181018352928152600160a060020a0390931660009081526002909252902090519055565b600080808415156111de5760009250829150611209565b508383028385828115156111ee57fe5b0414611201576003925060009150611209565b600081925092505b509250929050565b600080821515611227575060059050600061123a565b6000838581151561123457fe5b04915091505b9250929050565b600061124b6113fa565b600080611260866000015186600001516113b1565b60408051602081019091529081529097909650945050505050565b60006112856113fa565b835183516112939190610e2a565b915091509250929050565b60006112a86113fa565b600080611260866000015186600001516113d4565b60006112c76113fa565b6000806000806000806112e28a600001518a600001516111c7565b909650945060008660178111156112f557fe5b1461131657604080516020810190915260008152959750949550869461139d565b6113286706f05b59d3b20000866113d4565b9094509250600084601781111561133b57fe5b1461135c57604080516020810190915260008152939750929550869261139d565b61136e83670de0b6b3a7640000611211565b9092509050600082601781111561138157fe5b1461138857fe5b60408051602081019091528181526000985096505b5050505050509250929050565b5190511090565b6000808383116113c857506000905081830361123a565b5060049050600061123a565b6000808383018481106113ed5760008192509250611209565b6003925060009150611209565b60408051602081019091526000815290565b610100604051908101604052806114216113fa565b815260200161142e6113fa565b815260200161143b6113fa565b81526020016000815260200160008152602001600015158152602001600081526020016000815250905600a165627a7a72305820606d3476f5c4301d964880efc77e49b2dd6117e1cc6bcb651ea64d02b3bca8e80029000000000000000000000000612aca17160cc50b3aa777f9790615905d01c0bf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106101055763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041662e4768b811461010a57806308f31857146101405780630c9c630114610171578063183f34441461018657806326617c28146101a757806341976e09146101c15780634352fa9f146101e2578063451b1e3a146102c0578063485feabe146102d557806351e59ffb146102ea5780635c975abb1461030b5780635e9a523c14610334578063692374e314610355578063809597211461038f5780639964622c146103a45780639e8c4d95146103c5578063c5faf1d5146103e6578063ccb13cbd146103fb578063de9d0e8514610410575b600080fd5b34801561011657600080fd5b5061012e600160a060020a0360043516602435610434565b60408051918252519081900360200190f35b34801561014c57600080fd5b50610155610470565b60408051600160a060020a039092168252519081900360200190f35b34801561017d57600080fd5b5061012e61047f565b34801561019257600080fd5b5061012e600160a060020a036004351661048b565b3480156101b357600080fd5b5061012e600435151561049d565b3480156101cd57600080fd5b5061012e600160a060020a0360043516610515565b3480156101ee57600080fd5b506040805160206004803580820135838102808601850190965280855261027095369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a9989019892975090820195509350839250850190849080828437509497506105209650505050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102ac578181015183820152602001610294565b505050509050019250505060405180910390f35b3480156102cc57600080fd5b50610155610671565b3480156102e157600080fd5b5061012e610680565b3480156102f657600080fd5b50610155600160a060020a0360043516610685565b34801561031757600080fd5b506103206106a0565b604080519115158252519081900360200190f35b34801561034057600080fd5b5061012e600160a060020a03600435166106a9565b34801561036157600080fd5b50610376600160a060020a03600435166107fe565b6040805192835260208301919091528051918290030190f35b34801561039b57600080fd5b50610155610817565b3480156103b057600080fd5b5061012e600160a060020a0360043516610826565b3480156103d157600080fd5b5061012e600160a060020a03600435166108ca565b3480156103f257600080fd5b5061012e6108dc565b34801561040757600080fd5b5061012e6108e2565b34801561041c57600080fd5b5061012e600160a060020a036004351660243561098c565b600554600090600160a060020a0316331461045d576104568360016008610a2b565b905061046a565b6104678383610ab4565b90505b92915050565b600354600160a060020a031681565b67016345785d8a000081565b60026020526000908152604090205481565b600354600090600160a060020a031633146104c6576104bf6000600180610a2b565b9050610510565b6000805483151560ff19909116811790915560408051918252517f3c70af01296aef045b2f5c9d3c30b05d4428fd257145b9c7fcd76418e65b59809181900360200190a160005b90505b919050565b600061050d826106a9565b8151815160055460609291908390600090600160a060020a0316331461059157604080516001808252818301909252906020808301908038833901905050915061056e600060016008610a2b565b82600081518110151561057d57fe5b602090810290910101529093508390610667565b83158061059e5750838314155b156105d157604080516001808252818301909252906020808301908038833901905050915061056e60006002600a610a2b565b836040519080825280602002602001820160405280156105fb578160200160208202803883390190505b509150600090505b8381101561066357610643878281518110151561061c57fe5b90602001906020020151878381518110151561063457fe5b90602001906020020151610ab4565b828281518110151561065157fe5b60209081029091010152600101610603565b8194505b5050505092915050565b600454600160a060020a031681565b60f081565b600160205260009081526040902054600160a060020a031681565b60005460ff1681565b6000806000806106b76113fa565b60005460ff16156106cb57600094506107f5565b600160a060020a0386811660009081526001602052604090205416156107d957600160a060020a038087166000908152600160205260408082205481517f59e02dd7000000000000000000000000000000000000000000000000000000008152825191909416936359e02dd79360048083019493928390030190829087803b15801561075657600080fd5b505af115801561076a573d6000803e3d6000fd5b505050506040513d604081101561078057600080fd5b508051602090910151909450925082156107d0576107a6670de0b6b3a764000085610e2a565b909250905060008260178111156107b957fe5b146107c757600094506107f5565b805194506107f5565b600094506107f5565b600160a060020a03861660009081526002602052604090205494505b50505050919050565b6007602052600090815260409020805460019091015482565b600554600160a060020a031681565b6003546000908190600160a060020a031633146108525761084b600060016002610a2b565b91506108c4565b5060048054600160a060020a0384811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040805191909216808252602082019390935281517f6c773973d5bcf264b509f4194ceb99e891251f6aabb325523a863c282958b13e929181900390910190a1600091505b50919050565b60086020526000908152604090205481565b60065481565b6004546000908190600160a060020a0316331461090e57610907600060016000610a2b565b9150610988565b50600380546004805473ffffffffffffffffffffffffffffffffffffffff19808416600160a060020a03838116919091179095551690556040805192909116808352336020840152815190927fbef9248fe57ae972dd47833f68c43f0b3b2d14217612dfbc804a520a23730d4692908290030190a1600091505b5090565b6003546000908190600160a060020a031633146109b7576109b08460016003610a2b565b9150610a24565b50600160a060020a0383166000818152600860209081526040918290208054908690558251338152918201939093528082018390526060810185905290517ff0aa20c29c1f8e751bfe0a78bc49a520ed14f2dab274087d90d1341d8b76af5c9181900360800190a1600091505b5092915050565b60007f96f29b65cebbd6816352fb242b6af7180b49e8a09e19e589225d35bc8444f0b73385856002811115610a5c57fe5b85600b811115610a6857fe5b60408051600160a060020a0395861681529390941660208401528284019190915260608201526000608082015290519081900360a00190a1826002811115610aac57fe5b949350505050565b600080610abf61140c565b600160f0430481016080830152600160a060020a0386811660008181526008602090815260408083205460e0880152805180830182528a81528752928252939093528220541615610b1e57610b17866002600b610a2b565b9350610e21565b60e082015115610bc257600060608301526040805160208101825260e084015181529083018190528251610b529190610ede565b602084015292506000836017811115610b6757fe5b14610b8557610b178660026004866017811115610b8057fe5b610f63565b6020808301516040805192830190526006548252610ba291610fed565b15610bbd57610b178660026006856020015160000151610f63565b610c79565b600160a060020a038616600081815260076020818152604080842080546060890190815282518085018452969095529290915260019091015483528401919091525115610c6757610c1b82604001518360000151610ff4565b8452151560a084015292506000836017811115610c3457fe5b14610c4d57610b178660026005866017811115610b8057fe5b8160a0015115610bbd5760408201515160c0830152610c79565b60408051602081018252868152908301525b610c868260400151611197565b15610c9857610b178660026007610a2b565b8151610ca390611197565b15610cb557610b178660026009610a2b565b600160a060020a03861660009081526008602052604090205415610ced57600160a060020a0386166000908152600860205260408120555b816060015182608001511115610d3d57604080518082018252608084015181528351516020808301918252600160a060020a038a1660009081526007909152929092209051815590516001909101555b50600160a060020a038516600090815260026020526040902054815151610d6590879061119c565b81515160408051600160a060020a0389168152602081018490528082018890526060810192909252517fdd71a1d19fcba687442a1d5c58578f1e409af71a79d10fd95a4d66efd8fa9ae79181900360800190a18160a0015115610e1c5760c082015182515160408051600160a060020a038a16815260208101899052808201939093526060830191909152517f7221f7a2708437039cc63319145b6b873a40594b9782a3bee45b975e2f3b0f689181900360800190a15b600093505b50505092915050565b6000610e346113fa565b600080600080610e4c88670de0b6b3a76400006111c7565b90945092506000846017811115610e5f57fe5b14610e80576040805160208101909152600081529395509293508492610ed3565b610e8a8388611211565b90925090506000826017811115610e9d57fe5b14610ebe576040805160208101909152600081529195509093508490610ed3565b60408051602081019091528181526000965094505b505050509250929050565b6000610ee86113fa565b610ef06113fa565b6000610efc8686610fed565b15610f2957610f0b8686611241565b925090506000816017811115610f1d57fe5b14610f2457fe5b610f4c565b610f338587611241565b925090506000816017811115610f4557fe5b14610f4c57fe5b610f56828761127b565b9350935050509250929050565b60007f96f29b65cebbd6816352fb242b6af7180b49e8a09e19e589225d35bc8444f0b73386866002811115610f9457fe5b86600b811115610fa057fe5b60408051600160a060020a0395861681529390941660208401528284019190915260608201526080810185905290519081900360a00190a1836002811115610fe457fe5b95945050505050565b5190511190565b600080610fff6113fa565b6110076113fa565b61100f6113fa565b6110176113fa565b61101f6113fa565b6110276113fa565b6040805160208181018352670de0b6b3a7640000825282519081019092526006548252955060009061105a90879061129e565b95509050600081601781111561106c57fe5b1461108f576040805160208101909152600080825291995090975095508761118a565b6110998b866112bd565b9350905060008160178111156110ab57fe5b146110ce576040805160208101909152600080825291995090975095508761118a565b6110d88a84610fed565b156110ed57600060018498509850985061118a565b60408051602081019091526006548152611108908790611241565b94509050600081601781111561111a57fe5b1461113d576040805160208101909152600080825291995090975095508761118a565b6111478b856112bd565b92509050600081601781111561115957fe5b1461116057fe5b61116a8a836113aa565b1561117f57600060018398509850985061118a565b6000808b9850985098505b5050505050509250925092565b511590565b6040805160208181018352928152600160a060020a0390931660009081526002909252902090519055565b600080808415156111de5760009250829150611209565b508383028385828115156111ee57fe5b0414611201576003925060009150611209565b600081925092505b509250929050565b600080821515611227575060059050600061123a565b6000838581151561123457fe5b04915091505b9250929050565b600061124b6113fa565b600080611260866000015186600001516113b1565b60408051602081019091529081529097909650945050505050565b60006112856113fa565b835183516112939190610e2a565b915091509250929050565b60006112a86113fa565b600080611260866000015186600001516113d4565b60006112c76113fa565b6000806000806000806112e28a600001518a600001516111c7565b909650945060008660178111156112f557fe5b1461131657604080516020810190915260008152959750949550869461139d565b6113286706f05b59d3b20000866113d4565b9094509250600084601781111561133b57fe5b1461135c57604080516020810190915260008152939750929550869261139d565b61136e83670de0b6b3a7640000611211565b9092509050600082601781111561138157fe5b1461138857fe5b60408051602081019091528181526000985096505b5050505050509250929050565b5190511090565b6000808383116113c857506000905081830361123a565b5060049050600061123a565b6000808383018481106113ed5760008192509250611209565b6003925060009150611209565b60408051602081019091526000815290565b610100604051908101604052806114216113fa565b815260200161142e6113fa565b815260200161143b6113fa565b81526020016000815260200160008152602001600015158152602001600081526020016000815250905600a165627a7a72305820606d3476f5c4301d964880efc77e49b2dd6117e1cc6bcb651ea64d02b3bca8e80029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000612aca17160cc50b3aa777f9790615905d01c0bf0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _poster (address): 0x612acA17160cc50b3AA777F9790615905d01c0bF
Arg [1] : addr0 (address): 0x0000000000000000000000000000000000000000
Arg [2] : reader0 (address): 0x0000000000000000000000000000000000000000
Arg [3] : addr1 (address): 0x0000000000000000000000000000000000000000
Arg [4] : reader1 (address): 0x0000000000000000000000000000000000000000
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000612aca17160cc50b3aa777f9790615905d01c0bf
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
14967:22035:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17377:8;;;27923:365;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27923:365:0;-1:-1:-1;;;;;27923:365:0;;;;;;;;;;;;;;;;;;;;;;;19396:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19396:26:0;;;;;;;;-1:-1:-1;;;;;19396:26:0;;;;;;;;;;;;;;15260:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15260:50:0;;;;16469:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16469:43:0;-1:-1:-1;;;;;16469:43:0;;;;;22886:383;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22886:383:0;;;;;;;27204:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;27204:104:0;-1:-1:-1;;;;;27204:104:0;;;;;36016:983;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;36016:983:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36016:983:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36016:983:0;;;;-1:-1:-1;36016:983:0;-1:-1:-1;36016:983:0;;-1:-1:-1;36016:983:0;;;;;;;;;-1:-1:-1;36016:983:0;;-1:-1:-1;36016:983:0;;-1:-1:-1;;;;;;;36016:983:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36016:983:0;;;;;;;;;;;;;;;;;19512:33;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19512:33:0;;;;15124:45;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15124:45:0;;;;16073:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16073:42:0;-1:-1:-1;;;;;16073:42:0;;;;;15097:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15097:18:0;;;;;;;;;;;;;;;;;;;;;;25690:1239;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25690:1239:0;-1:-1:-1;;;;;25690:1239:0;;;;;20114:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20114:41:0;-1:-1:-1;;;;;20114:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19654:21;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19654:21:0;;;;23805:653;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23805:653:0;-1:-1:-1;;;;;23805:653:0;;;;;20228:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20228:46:0;-1:-1:-1;;;;;20228:46:0;;;;;19853:19;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19853:19:0;;;;24727:688;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24727:688:0;;;;21051:626;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21051:626:0;-1:-1:-1;;;;;21051:626:0;;;;;;;27923:365;28083:6;;28001:4;;-1:-1:-1;;;;;28083:6:0;28069:10;:20;28065:149;;28113:89;28124:5;28131:24;28157:44;28113:10;:89::i;:::-;28106:96;;;;28065:149;28233:47;28250:5;28257:22;28233:16;:47::i;:::-;28226:54;;27923:365;;;;;:::o;19396:26::-;;;-1:-1:-1;;;;;19396:26:0;;:::o;15260:50::-;15301:8;15260:50;:::o;16469:43::-;;;;;;;;;;;;;:::o;22886:383::-;23017:11;;22943:4;;-1:-1:-1;;;;;23017:11:0;23003:10;:25;22999:146;;23052:81;23063:1;23066:24;23092:40;23052:10;:81::i;:::-;23045:88;;;;22999:146;23157:6;:23;;;;;-1:-1:-1;;23157:23:0;;;;;;;;23196:25;;;;;;;;;;;;;;;;23246:14;23241:20;23234:27;;22886:383;;;;:::o;27204:104::-;27258:4;27282:18;27294:5;27282:11;:18::i;36016:983::-;36144:13;;36185:30;;36324:6;;36101;;36144:13;36185:30;36101:6;;36127:14;;-1:-1:-1;;;;;36324:6:0;36310:10;:20;36306:215;;36356:13;;;36367:1;36356:13;;;;;;;;;;;;;;;;105:10:-1;36356:13:0;88:34:-1;136:17;;-1:-1;36356:13:0;36347:22;;36396:85;36407:1;36410:24;36436:44;36396:10;:85::i;:::-;36384:6;36391:1;36384:9;;;;;;;;;;;;;;;;;;:97;36503:6;;-1:-1:-1;36503:6:0;;36496:13;;36306:215;36538:14;;;36537:44;;;36571:9;36558;:22;;36537:44;36533:247;;;36607:13;;;36618:1;36607:13;;;;;;;;;;;;;;;;105:10:-1;36607:13:0;88:34:-1;136:17;;-1:-1;36607:13:0;36598:22;;36647:93;36658:1;36661:31;36694:45;36647:10;:93::i;36533:247::-;36812:9;36801:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;36801:21:0;;36792:30;;36849:1;36840:10;;36835:131;36856:9;36852:1;:13;36835:131;;;36899:55;36916:6;36923:1;36916:9;;;;;;;;;;;;;;;;;;36927:23;36951:1;36927:26;;;;;;;;;;;;;;;;;;36899:16;:55::i;:::-;36887:6;36894:1;36887:9;;;;;;;;;;;;;;;;;;:67;36867:3;;36835:131;;;36985:6;36978:13;;36016:983;;;;;;;;;:::o;19512:33::-;;;-1:-1:-1;;;;;19512:33:0;;:::o;15124:45::-;15166:3;15124:45;:::o;16073:42::-;;;;;;;;;;;;-1:-1:-1;;;;;16073:42:0;;:::o;15097:18::-;;;;;;:::o;25690:1239::-;25747:4;26381:17;26400:15;26501:11;26514:22;;:::i;:::-;26263:6;;;;26259:663;;;26293:1;26286:8;;;;26259:663;-1:-1:-1;;;;;26331:14:0;;;26357:1;26331:14;;;:7;:14;;;;;;;:28;26327:584;;-1:-1:-1;;;;;26419:14:0;;;;;;;:7;:14;;;;;;;:21;;;;;;;:14;;;;;:19;;:21;;;;;:14;:21;;;;;;;;:14;:21;;;5:2:-1;;;;30:1;27;20:12;5:2;26419:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26419:21:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26419:21:0;;;;;;;;;-1:-1:-1;26419:21:0;-1:-1:-1;26461:359:0;;;;26540:39;9212:6;26568:9;26540:6;:39::i;:::-;26500:79;;-1:-1:-1;26500:79:0;-1:-1:-1;26617:14:0;26608:5;:23;;;;;;;;;26604:88;;26667:1;26660:8;;;;26604:88;26723:20;;;-1:-1:-1;26716:27:0;;26461:359;26799:1;26792:8;;;;26327:584;-1:-1:-1;;;;;26867:19:0;;;;;;:12;:19;;;;;:28;;-1:-1:-1;26327:584:0;25690:1239;;;;;;;:::o;20114:41::-;;;;;;;;;;;;;;;;;;;:::o;19654:21::-;;;-1:-1:-1;;;;;19654:21:0;;:::o;23805:653::-;23958:11;;23884:4;;;;-1:-1:-1;;;;;23958:11:0;23944:10;:25;23940:160;;23993:95;24004:1;24007:24;24033:54;23993:10;:95::i;:::-;23986:102;;;;23940:160;-1:-1:-1;24205:18:0;;;-1:-1:-1;;;;;24283:42:0;;;-1:-1:-1;;24283:42:0;;;;;;;24343:67;;;24205:18;;;;24343:67;;;;;;;;;;;;;;;;;;;;;;;24435:14;24423:27;;23805:653;;;;;:::o;20228:46::-;;;;;;;;;;;;;:::o;19853:19::-;;;;:::o;24727:688::-;24891:18;;24773:4;;;;-1:-1:-1;;;;;24891:18:0;24877:10;:32;24873:177;;24933:105;24944:1;24947:24;24973:64;24933:10;:105::i;:::-;24926:112;;;;24873:177;-1:-1:-1;25139:11:0;;;25220:18;;;-1:-1:-1;;25206:32:0;;;-1:-1:-1;;;;;25220:18:0;;;25206:32;;;;;;;25285:22;;;25325:42;;;25139:11;;;;25325:42;;;25356:10;25325:42;;;;;;25139:11;;25325:42;;;;;;;;;25392:14;25380:27;;24727:688;;;:::o;21051:626::-;21289:11;;21130:4;;;;-1:-1:-1;;;;;21289:11:0;21275:10;:25;21271:163;;21324:98;21335:5;21342:24;21368:53;21324:10;:98::i;:::-;21317:105;;;;21271:163;-1:-1:-1;;;;;;21468:21:0;;;;;;:14;:21;;;;;;;;;;;21500:38;;;;21556:67;;21573:10;21556:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21648:20;21636:33;;21051:626;;;;;;:::o;18659:211::-;18753:4;18775:58;18789:10;18801:5;18813:3;18808:9;;;;;;;;18824:4;18819:10;;;;;;;;18775:58;;;-1:-1:-1;;;;;18775:58:0;;;;;;;;;;;;;;;;;;;;;;;;18831:1;18775:58;;;;;;;;;;;;;;18858:3;18853:9;;;;;;;;18846:16;18659:211;-1:-1:-1;;;;18659:211:0:o;28296:4626::-;28384:4;28445:9;28465:34;;:::i;:::-;28756:1;15166:3;28719:12;:33;28718:39;;28692:23;;;:65;-1:-1:-1;;;;;28802:21:0;;;32367:18;28802:21;;;:14;:21;;;;;;;;;28768:31;;;:55;28852:40;;;;;;;;;;28834:58;;28909:14;;;;;;;;;;;:28;28905:163;;28961:95;28972:5;28979:31;29012:43;28961:10;:95::i;:::-;28954:102;;;;28905:163;29084:31;;;;:36;29080:1916;;29250:1;29225:22;;;:26;29290:49;;;;;;;;29306:31;;;;29290:49;;29266:21;;;:73;;;29506:15;;29468:54;;29290:49;29468:14;:54::i;:::-;29449:15;;;29443:79;;-1:-1:-1;29548:14:0;29541:3;:21;;;;;;;;;29537:186;;29590:117;29612:5;29619:31;29652:43;29702:3;29697:9;;;;;;;;29590:21;:117::i;29537:186::-;29801:15;;;;;29786:41;;;;;;;;29818:8;29786:41;;;;;:14;:41::i;:::-;29782:221;;;29855:132;29877:5;29884:31;29917:43;29962:9;:15;;;:24;;;29855:21;:132::i;29782:221::-;29080:1916;;;-1:-1:-1;;;;;30060:14:0;;;;;;:7;:14;;;;;;;;:21;;30035:22;;;:46;;;30120;;;;;;;30136:14;;;;;;;;:28;;;;;30120:46;;30096:21;;:70;;;;30187:22;:27;30183:802;;30283:48;30292:9;:21;;;30315:9;:15;;;30283:8;:48::i;:::-;30235:96;;;;30241:21;;;30235:96;;-1:-1:-1;30264:15:0;30354:3;:21;;;;;;;;;30350:189;;30407:112;30429:5;30436:31;30469:38;30514:3;30509:9;;;;;;;30350:189;30561:9;:21;;;30557:183;;;30690:21;;;;:30;30651:36;;;:69;30183:802;;;30929:40;;;;;;;;;;;30905:21;;;:64;30183:802;31260:32;31270:9;:21;;;31260:9;:32::i;:::-;31256:306;;;31433:117;31444:5;31451:31;31484:65;31433:10;:117::i;31256:306::-;31588:15;;31578:26;;:9;:26::i;:::-;31574:156;;;31628:90;31639:5;31646:31;31679:38;31628:10;:90::i;31574:156::-;-1:-1:-1;;;;;31865:21:0;;;;;;:14;:21;;;;;;:26;31861:84;;-1:-1:-1;;;;;31908:21:0;;31932:1;31908:21;;;:14;:21;;;;;:25;31861:84;32203:9;:22;;;32177:9;:23;;;:48;32173:182;;;32259:84;;;;;;;;32276:23;;;;32259:84;;32317:15;;:24;32259:84;;;;;;;-1:-1:-1;;;;;32242:14:0;;-1:-1:-1;32242:14:0;;;:7;:14;;;;;;;:101;;;;;;;;;;;32173:182;-1:-1:-1;;;;;;32388:19:0;;;;;;:12;:19;;;;;:28;32460:15;;:24;32429:56;;32401:5;;32429:23;:56::i;:::-;32561:15;;:24;32503:83;;;-1:-1:-1;;;;;32503:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32603:9;:21;;;32599:270;;;32794:36;;;;32832:15;;:24;32745:112;;;-1:-1:-1;;;;;32745:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32599:270;32893:20;32881:33;;28296:4626;;;;;;;;:::o;9470:483::-;9531:5;9538:3;;:::i;:::-;9562:10;9574:20;9728:10;9740:13;9598:18;9602:3;9041:6;9598:3;:18::i;:::-;9561:55;;-1:-1:-1;9561:55:0;-1:-1:-1;9639:14:0;9631:4;:22;;;;;;;;;9627:88;;9684:18;;;;;;;;;-1:-1:-1;9684:18:0;;9678:4;;-1:-1:-1;9684:18:0;;-1:-1:-1;9678:4:0;;9670:33;;9627:88;9757:27;9761:15;9778:5;9757:3;:27::i;:::-;9727:57;;-1:-1:-1;9727:57:0;-1:-1:-1;9807:14:0;9799:4;:22;;;;;;;;;9795:88;;9852:18;;;;;;;;;-1:-1:-1;9852:18:0;;9846:4;;-1:-1:-1;9852:18:0;;-1:-1:-1;9846:4:0;;9838:33;;9795:88;9919:25;;;;;;;;;;;;9903:14;;-1:-1:-1;9919:25:0;-1:-1:-1;9470:483:0;;;;;;;;;;:::o;33185:627::-;33274:5;33281:3;;:::i;:::-;33304:20;;:::i;:::-;33335:9;33361:34;33376:11;33389:5;33361:14;:34::i;:::-;33357:398;;;33431:26;33438:11;33451:5;33431:6;:26::i;:::-;33412:45;-1:-1:-1;33412:45:0;-1:-1:-1;33518:14:0;33511:3;:21;;;;;;;;;33504:29;;;;33357:398;;;33585:26;33592:5;33599:11;33585:6;:26::i;:::-;33566:45;-1:-1:-1;33566:45:0;-1:-1:-1;33728:14:0;33721:3;:21;;;;;;;;;33714:29;;;;33774:30;33781:9;33792:11;33774:6;:30::i;:::-;33767:37;;;;33185:627;;;;;;;:::o;19009:242::-;19128:4;19150:64;19164:10;19176:5;19188:3;19183:9;;;;;;;;19199:4;19194:10;;;;;;;;19150:64;;;-1:-1:-1;;;;;19150:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19239:3;19234:9;;;;;;;;19227:16;19009:242;-1:-1:-1;;;;;19009:242:0:o;14630:144::-;14752:14;14736:13;;:30;;14630:144::o;33820:1620::-;33903:5;33910:4;33916:3;;:::i;:::-;33939:14;;:::i;:::-;33996:26;;:::i;:::-;34033:27;;:::i;:::-;34071:14;;:::i;:::-;34096;;:::i;:::-;33956:29;;;;;;;;;9212:6;33956:29;;34212:21;;;;;;;;34224:8;34212:21;;;33956:29;-1:-1:-1;34165:9:0;;34212:21;;33956:29;;34212:6;:21::i;:::-;34187:46;-1:-1:-1;34187:46:0;-1:-1:-1;34255:14:0;34248:3;:21;;;;;;;;;34244:94;;34306:19;;;;;;;;;34299:5;34306:19;;;34294:3;;-1:-1:-1;34299:5:0;;-1:-1:-1;34306:19:0;-1:-1:-1;34294:3:0;34286:40;;34244:94;34410:36;34417:11;34430:15;34410:6;:36::i;:::-;34397:49;-1:-1:-1;34397:49:0;-1:-1:-1;34468:14:0;34461:3;:21;;;;;;;;;34457:94;;34519:19;;;;;;;;;34512:5;34519:19;;;34507:3;;-1:-1:-1;34512:5:0;;-1:-1:-1;34519:19:0;-1:-1:-1;34507:3:0;34499:40;;34457:94;34672:26;34687:5;34694:3;34672:14;:26::i;:::-;34668:93;;;34723:14;34739:4;34745:3;34715:34;;;;;;;;34668:93;34799:21;;;;;;;;;34811:8;34799:21;;;;;34806:3;;34799:6;:21::i;:::-;34773:47;-1:-1:-1;34773:47:0;-1:-1:-1;34842:14:0;34835:3;:21;;;;;;;;;34831:94;;34893:19;;;;;;;;;34886:5;34893:19;;;34881:3;;-1:-1:-1;34886:5:0;;-1:-1:-1;34893:19:0;-1:-1:-1;34881:3:0;34873:40;;34831:94;34997:37;35004:11;35017:16;34997:6;:37::i;:::-;34984:50;-1:-1:-1;34984:50:0;-1:-1:-1;35159:14:0;35152:3;:21;;;;;;;;;35145:29;;;;35297:23;35309:5;35316:3;35297:11;:23::i;:::-;35293:90;;;35345:14;35361:4;35367:3;35337:34;;;;;;;;35293:90;35403:14;35419:5;35426;35395:37;;;;;;33820:1620;;;;;;;;;;;;:::o;14851:111::-;14935:14;:19;;14851:111::o;32979:151::-;33092:30;;;;;;;;;;;;-1:-1:-1;;;;;33070:19:0;;;-1:-1:-1;33070:19:0;;;:12;:19;;;;;:52;;;;32979:151::o;7073:323::-;7125:5;;;7153:6;;7149:65;;;7184:14;;-1:-1:-1;7184:14:0;;-1:-1:-1;7176:26:0;;7149:65;-1:-1:-1;7235:5:0;;;7239:1;7235;:5;7257;;;;;;;;:10;7253:136;;7292:22;;-1:-1:-1;7316:1:0;;-1:-1:-1;7284:34:0;;7253:136;7359:14;7375:1;7351:26;;;;7253:136;7073:323;;;;;;:::o;7491:199::-;7543:5;;7571:6;;7567:73;;;-1:-1:-1;7602:22:0;;-1:-1:-1;7626:1:0;7594:34;;7567:73;7660:14;7680:1;7676;:5;;;;;;;;7652:30;;;;7491:199;;;;;;:::o;10349:213::-;10416:5;10423:3;;:::i;:::-;10447:11;10460;10475:27;10479:1;:10;;;10491:1;:10;;;10475:3;:27::i;:::-;10530:23;;;;;;;;;;;;10446:56;;10530:23;;-1:-1:-1;10349:213:0;-1:-1:-1;;;;;10349:213:0:o;13520:142::-;13587:5;13594:3;;:::i;:::-;13631:10;;13643;;13624:30;;13631:10;13624:6;:30::i;:::-;13617:37;;;;13520:142;;;;;:::o;10042:213::-;10109:5;10116:3;;:::i;:::-;10140:11;10153;10168:27;10172:1;:10;;;10184:1;:10;;;10168:3;:27::i;12189:1088::-;12256:5;12263:3;;:::i;:::-;12289:10;12301:24;12772:10;12784:37;12975:10;12987:12;12329:27;12333:1;:10;;;12345:1;:10;;;12329:3;:27::i;:::-;12288:68;;-1:-1:-1;12288:68:0;-1:-1:-1;12379:14:0;12371:4;:22;;;;;;;;;12367:88;;12424:18;;;;;;;;;-1:-1:-1;12424:18:0;;12418:4;;-1:-1:-1;12424:18:0;;-1:-1:-1;12418:4:0;;12410:33;;12367:88;12825:38;9114:10;12843:19;12825:3;:38::i;:::-;12771:92;;-1:-1:-1;12771:92:0;-1:-1:-1;12886:14:0;12878:4;:22;;;;;;;;;12874:88;;12931:18;;;;;;;;;-1:-1:-1;12931:18:0;;12925:4;;-1:-1:-1;12931:18:0;;-1:-1:-1;12925:4:0;;12917:33;;12874:88;13003:47;13007:32;9041:6;13003:3;:47::i;:::-;12974:76;;-1:-1:-1;12974:76:0;-1:-1:-1;13192:14:0;13184:4;:22;;;;;;;;;13177:30;;;;13244:24;;;;;;;;;;;;13228:14;;-1:-1:-1;13244:24:0;-1:-1:-1;12189:1088:0;;;;;;;;;;;;:::o;14120:198::-;14239:14;14223:13;;:30;;14120:198::o;7825:220::-;7877:5;;7905:6;;;7901:137;;-1:-1:-1;7936:14:0;;-1:-1:-1;7952:5:0;;;7928:30;;7901:137;-1:-1:-1;7999:23:0;;-1:-1:-1;8024:1:0;7991:35;;8130:242;8182:5;;8215;;;8237:6;;;8233:132;;8268:14;8284:1;8260:26;;;;;;8233:132;8327:22;;-1:-1:-1;8351:1:0;;-1:-1:-1;8319:34:0;;14967:22035;;;;;;;;;;-1:-1:-1;14967:22035:0;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://606d3476f5c4301d964880efc77e49b2dd6117e1cc6bcb651ea64d02b3bca8e8
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.