Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
GreenOracle
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 999999 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.28; import "../lib/Babylonian.sol"; import "../lib/FixedPoint.sol"; import "../lib/UniswapV2OracleLibrary.sol"; import "../utils/Epoch.sol"; import "../interfaces/IUniswapV2Pair.sol"; // fixed window oracle that recomputes the average price for the entire period once every period // note that the price average is only guaranteed to be over at least 1 period, but may be over a longer period contract GreenOracle is Epoch { using FixedPoint for *; uint144 GREEN_DECIMALS_FACTOR = 1e12; /* ========== STATE VARIABLES ========== */ // uniswap address public token0; address public token1; IUniswapV2Pair public pair; address public green; // oracle uint32 public blockTimestampLast; uint256 public price0CumulativeLast; uint256 public price1CumulativeLast; FixedPoint.uq112x112 public price0Average; FixedPoint.uq112x112 public price1Average; /* ========== CONSTRUCTOR ========== */ constructor( IUniswapV2Pair _pair, address _green, uint256 _period, uint256 _startTime ) Epoch(_period, _startTime, 0) { pair = _pair; green = _green; token0 = pair.token0(); token1 = pair.token1(); price0CumulativeLast = pair.price0CumulativeLast(); // fetch the current accumulated price value (1 / 0) price1CumulativeLast = pair.price1CumulativeLast(); // fetch the current accumulated price value (0 / 1) uint112 reserve0; uint112 reserve1; (reserve0, reserve1, blockTimestampLast) = pair.getReserves(); require(reserve0 != 0 && reserve1 != 0, "Oracle: NO_RESERVES"); // ensure that there's liquidity in the pair } /* ========== MUTABLE FUNCTIONS ========== */ /** @dev Updates 1-day EMA price from Uniswap. */ function update() external checkEpoch { (uint256 price0Cumulative, uint256 price1Cumulative, uint32 blockTimestamp) = UniswapV2OracleLibrary.currentCumulativePrices(address(pair)); uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired if (timeElapsed == 0) { // prevent divided by zero return; } // overflow is desired, casting never truncates // cumulative price is in (uq112x112 price * seconds) units so we simply wrap it after division by time elapsed price0Average = FixedPoint.uq112x112(uint224((price0Cumulative - price0CumulativeLast) / timeElapsed)); price1Average = FixedPoint.uq112x112(uint224((price1Cumulative - price1CumulativeLast) / timeElapsed)); price0CumulativeLast = price0Cumulative; price1CumulativeLast = price1Cumulative; blockTimestampLast = blockTimestamp; emit Updated(price0Cumulative, price1Cumulative); } // note this will always return 0 before update has been called successfully for the first time. function consult(address _token, uint256 _amountIn) external view returns (uint144 amountOut) { if (_token == token0) { amountOut = price0Average.mul(_amountIn).decode144(); } else { require(_token == token1, "Oracle: INVALID_TOKEN"); amountOut = price1Average.mul(_amountIn).decode144(); } } function twap(address _token, uint256 _amountIn) external view returns (uint144 _amountOut) { (uint256 price0Cumulative, uint256 price1Cumulative, uint32 blockTimestamp) = UniswapV2OracleLibrary.currentCumulativePrices(address(pair)); uint32 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired if (_token == token0) { _amountOut = FixedPoint.uq112x112(uint224((price0Cumulative - price0CumulativeLast) / timeElapsed)).mul(_amountIn).decode144(); } else if (_token == token1) { _amountOut = FixedPoint.uq112x112(uint224((price1Cumulative - price1CumulativeLast) / timeElapsed)).mul(_amountIn).decode144(); } if (_token == green) _amountOut *= GREEN_DECIMALS_FACTOR; else _amountOut /= GREEN_DECIMALS_FACTOR; } event Updated(uint256 price0CumulativeLast, uint256 price1CumulativeLast); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.28; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to); event Swap(address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.28; library Babylonian { function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } // else z = 0 } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.28; import "./Babylonian.sol"; // a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format)) library FixedPoint { // range: [0, 2**112 - 1] // resolution: 1 / 2**112 struct uq112x112 { uint224 _x; } // range: [0, 2**144 - 1] // resolution: 1 / 2**112 struct uq144x112 { uint256 _x; } uint8 private constant RESOLUTION = 112; uint256 private constant Q112 = uint256(1) << RESOLUTION; uint256 private constant Q224 = Q112 << RESOLUTION; // encode a uint112 as a UQ112x112 function encode(uint112 x) internal pure returns (uq112x112 memory) { return uq112x112(uint224(x) << RESOLUTION); } // encodes a uint144 as a UQ144x112 function encode144(uint144 x) internal pure returns (uq144x112 memory) { return uq144x112(uint256(x) << RESOLUTION); } // divide a UQ112x112 by a uint112, returning a UQ112x112 function div(uq112x112 memory self, uint112 x) internal pure returns (uq112x112 memory) { require(x != 0, "FixedPoint: DIV_BY_ZERO"); return uq112x112(self._x / uint224(x)); } // multiply a UQ112x112 by a uint, returning a UQ144x112 // reverts on overflow function mul(uq112x112 memory self, uint256 y) internal pure returns (uq144x112 memory) { uint256 z; require(y == 0 || (z = uint256(self._x) * y) / y == uint256(self._x), "FixedPoint: MULTIPLICATION_OVERFLOW"); return uq144x112(z); } // returns a UQ112x112 which represents the ratio of the numerator to the denominator // equivalent to encode(numerator).div(denominator) function fraction(uint112 numerator, uint112 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, "FixedPoint: DIV_BY_ZERO"); return uq112x112((uint224(numerator) << RESOLUTION) / denominator); } // decode a UQ112x112 into a uint112 by truncating after the radix point function decode(uq112x112 memory self) internal pure returns (uint112) { return uint112(self._x >> RESOLUTION); } // decode a UQ144x112 into a uint144 by truncating after the radix point function decode144(uq144x112 memory self) internal pure returns (uint144) { return uint144(self._x >> RESOLUTION); } // take the reciprocal of a UQ112x112 function reciprocal(uq112x112 memory self) internal pure returns (uq112x112 memory) { require(self._x != 0, "FixedPoint: ZERO_RECIPROCAL"); return uq112x112(uint224(Q224 / self._x)); } // square root of a UQ112x112 function sqrt(uq112x112 memory self) internal pure returns (uq112x112 memory) { return uq112x112(uint224(Babylonian.sqrt(uint256(self._x)) << 56)); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.28; import "./FixedPoint.sol"; import "../interfaces/IUniswapV2Pair.sol"; // library with helper methods for oracles that are concerned with computing average prices library UniswapV2OracleLibrary { using FixedPoint for *; // helper function that returns the current block timestamp within the range of uint32, i.e. [0, 2**32 - 1] function currentBlockTimestamp() internal view returns (uint32) { return uint32(block.timestamp % 2**32); } // produces the cumulative price using counterfactuals to save gas and avoid a call to sync. function currentCumulativePrices(address pair) internal view returns ( uint256 price0Cumulative, uint256 price1Cumulative, uint32 blockTimestamp ) { blockTimestamp = currentBlockTimestamp(); price0Cumulative = IUniswapV2Pair(pair).price0CumulativeLast(); price1Cumulative = IUniswapV2Pair(pair).price1CumulativeLast(); // if time has elapsed since the last update on the pair, mock the accumulated price values (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast) = IUniswapV2Pair(pair).getReserves(); if (blockTimestampLast != blockTimestamp) { // subtraction overflow is desired uint32 timeElapsed = blockTimestamp - blockTimestampLast; // addition overflow is desired // counterfactual price0Cumulative += uint256(FixedPoint.fraction(reserve1, reserve0)._x) * timeElapsed; // counterfactual price1Cumulative += uint256(FixedPoint.fraction(reserve0, reserve1)._x) * timeElapsed; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; abstract contract Operator is Context, Ownable { address private _operator; event OperatorTransferred(address indexed previousOperator, address indexed newOperator); constructor() Ownable(_msgSender()) { _operator = _msgSender(); emit OperatorTransferred(address(0), _operator); } function operator() public view returns (address) { return _operator; } modifier onlyOperator() { require(_operator == msg.sender, "operator: caller is not the operator"); _; } function isOperator() public view returns (bool) { return _msgSender() == _operator; } function transferOperator(address newOperator_) public onlyOwner { _transferOperator(newOperator_); } function _transferOperator(address newOperator_) internal { require(newOperator_ != address(0), "operator: zero address given for new operator"); emit OperatorTransferred(_operator, newOperator_); _operator = newOperator_; } function _renounceOperator() public onlyOwner { emit OperatorTransferred(_operator, address(0)); _operator = address(0); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.28; import '../owner/Operator.sol'; contract Epoch is Operator { uint256 private period; uint256 private startTime; uint256 private lastEpochTime; uint256 private epoch; /* ========== CONSTRUCTOR ========== */ constructor( uint256 _period, uint256 _startTime, uint256 _startEpoch ) { period = _period; startTime = _startTime; epoch = _startEpoch; lastEpochTime = startTime - period; } /* ========== Modifier ========== */ modifier checkStartTime { require(block.timestamp >= startTime, 'Epoch: not started yet'); _; } modifier checkEpoch { uint256 _nextEpochPoint = nextEpochPoint(); if (block.timestamp < _nextEpochPoint) { require(msg.sender == operator(), 'Epoch: only operator allowed for pre-epoch'); _; } else { _; for (;;) { lastEpochTime = _nextEpochPoint; ++epoch; _nextEpochPoint = nextEpochPoint(); if (block.timestamp < _nextEpochPoint) break; } } } /* ========== VIEW FUNCTIONS ========== */ function getCurrentEpoch() public view returns (uint256) { return epoch; } function getPeriod() public view returns (uint256) { return period; } function getStartTime() public view returns (uint256) { return startTime; } function getLastEpochTime() public view returns (uint256) { return lastEpochTime; } function nextEpochPoint() public view returns (uint256) { return lastEpochTime + period; } /* ========== GOVERNANCE ========== */ function setPeriod(uint256 _period) external onlyOperator { require(_period >= 1 hours && _period <= 48 hours, '_period: out of range'); period = _period; } function setEpoch(uint256 _epoch) external onlyOperator { epoch = _epoch; } }
{ "optimizer": { "enabled": true, "runs": 999999 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IUniswapV2Pair","name":"_pair","type":"address"},{"internalType":"address","name":"_green","type":"address"},{"internalType":"uint256","name":"_period","type":"uint256"},{"internalType":"uint256","name":"_startTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"price0CumulativeLast","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price1CumulativeLast","type":"uint256"}],"name":"Updated","type":"event"},{"inputs":[],"name":"_renounceOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blockTimestampLast","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"consult","outputs":[{"internalType":"uint144","name":"amountOut","type":"uint144"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastEpochTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"green","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextEpochPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"contract IUniswapV2Pair","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price0Average","outputs":[{"internalType":"uint224","name":"_x","type":"uint224"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price1Average","outputs":[{"internalType":"uint224","name":"_x","type":"uint224"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_epoch","type":"uint256"}],"name":"setEpoch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator_","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountIn","type":"uint256"}],"name":"twap","outputs":[{"internalType":"uint144","name":"_amountOut","type":"uint144"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600680546001600160901b03191664e8d4a5100017905534801561002757600080fd5b50604051611e20380380611e208339810160408190526100469161045a565b81816000338061007157604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b61007a816103f2565b50600180546001600160a01b031916339081179091556040516000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a36002839055600382905560058190556100d483836104a2565b6004908155600980546001600160a01b03808b166001600160a01b03199283168117909355600a8054918b169190921617905560408051630dfe168160e01b81529051919550630dfe168194508083019350602092908290030181865afa158015610143573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061016791906104c9565b600780546001600160a01b0319166001600160a01b039283161790556009546040805163d21220a760e01b81529051919092169163d21220a79160048083019260209291908290030181865afa1580156101c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101e991906104c9565b600880546001600160a01b0319166001600160a01b0392831617905560095460408051635909c0d560e01b815290519190921691635909c0d59160048083019260209291908290030181865afa158015610247573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061026b91906104ed565b600b5560095460408051635a3d549360e01b815290516001600160a01b0390921691635a3d5493916004808201926020929091908290030181865afa1580156102b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102dc91906104ed565b600c5560095460408051630240bc6b60e21b8152905160009283926001600160a01b0390911691630902f1ac916004808201926060929091908290030181865afa15801561032e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103529190610522565b600a805463ffffffff909216600160a01b0263ffffffff60a01b1990921691909117905590925090506001600160701b0382161580159061039b57506001600160701b03811615155b6103e75760405162461bcd60e51b815260206004820152601360248201527f4f7261636c653a204e4f5f5245534552564553000000000000000000000000006044820152606401610068565b505050505050610572565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116811461045757600080fd5b50565b6000806000806080858703121561047057600080fd5b845161047b81610442565b602086015190945061048c81610442565b6040860151606090960151949790965092505050565b818103818111156104c357634e487b7160e01b600052601160045260246000fd5b92915050565b6000602082840312156104db57600080fd5b81516104e681610442565b9392505050565b6000602082840312156104ff57600080fd5b5051919050565b80516001600160701b038116811461051d57600080fd5b919050565b60008060006060848603121561053757600080fd5b61054084610506565b925061054e60208501610506565b9150604084015163ffffffff8116811461056757600080fd5b809150509250925092565b61189f806105816000396000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80638a27f103116100ee578063ba52245811610097578063c828371e11610071578063c828371e14610416578063d21220a71461041e578063f2f1e1321461043e578063f2fde38b1461045e57600080fd5b8063ba522458146103c9578063c5700a02146103d1578063c5967c261461040e57600080fd5b8063a6bb4539116100c8578063a6bb453914610379578063a8aa1b31146103a1578063b97dd9e2146103c157600080fd5b80638a27f1031461034b5780638da5cb5b14610353578063a2e620451461037157600080fd5b80634456eda21161015b5780635a3d5493116101355780635a3d5493146102d25780635e6aaf2c146102db5780636808a12814610330578063715018a61461034357600080fd5b80634456eda214610280578063570ca735146102ab5780635909c0d5146102c957600080fd5b80631ed241951161018c5780631ed241951461022557806329605e77146102375780633ddac9531461024a57600080fd5b80630ceb2cef146101b35780630dfe1681146101c85780630f3a9f6514610212575b600080fd5b6101c66101c1366004611547565b610471565b005b6007546101e89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101c6610220366004611547565b610521565b6002545b604051908152602001610209565b6101c6610245366004611589565b610647565b61025d6102583660046115a4565b61065b565b60405171ffffffffffffffffffffffffffffffffffff9091168152602001610209565b60015473ffffffffffffffffffffffffffffffffffffffff1633146040519015158152602001610209565b60015473ffffffffffffffffffffffffffffffffffffffff166101e8565b610229600b5481565b610229600c5481565b600e54610303907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091168152602001610209565b61025d61033e3660046115a4565b610794565b6101c661093f565b6101c6610953565b60005473ffffffffffffffffffffffffffffffffffffffff166101e8565b6101c66109ca565b600d54610303907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681565b6009546101e89073ffffffffffffffffffffffffffffffffffffffff1681565b600554610229565b600454610229565b600a546103f99074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610209565b610229610eb6565b600354610229565b6008546101e89073ffffffffffffffffffffffffffffffffffffffff1681565b600a546101e89073ffffffffffffffffffffffffffffffffffffffff1681565b6101c661046c366004611589565b610ecd565b60015473ffffffffffffffffffffffffffffffffffffffff16331461051c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201527f61746f720000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b600555565b60015473ffffffffffffffffffffffffffffffffffffffff1633146105c7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201527f61746f72000000000000000000000000000000000000000000000000000000006064820152608401610513565b610e1081101580156105dc57506202a3008111155b610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5f706572696f643a206f7574206f662072616e676500000000000000000000006044820152606401610513565b600255565b61064f610f2e565b61065881610f81565b50565b60075460009073ffffffffffffffffffffffffffffffffffffffff908116908416036106cb576040805160208101909152600d547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681526106c4906106bd90846110b2565b5160701c90565b905061078e565b60085473ffffffffffffffffffffffffffffffffffffffff84811691161461074f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4f7261636c653a20494e56414c49445f544f4b454e00000000000000000000006044820152606401610513565b6040805160208101909152600e547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815261078b906106bd90846110b2565b90505b92915050565b6009546000908190819081906107bf9073ffffffffffffffffffffffffffffffffffffffff166111a5565b600a5492955090935091506000906107f59074010000000000000000000000000000000000000000900463ffffffff16836115fd565b60075490915073ffffffffffffffffffffffffffffffffffffffff90811690881603610879576108726106bd8760405180602001604052808563ffffffff16600b548a6108429190611619565b61084c919061165b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169052906110b2565b94506108c6565b60085473ffffffffffffffffffffffffffffffffffffffff908116908816036108c6576108c36106bd8760405180602001604052808563ffffffff16600c54896108429190611619565b94505b600a5473ffffffffffffffffffffffffffffffffffffffff908116908816036109115760065461090a9071ffffffffffffffffffffffffffffffffffff168661166f565b9450610935565b6006546109329071ffffffffffffffffffffffffffffffffffff16866116d0565b94505b5050505092915050565b610947610f2e565b61095160006113c9565b565b61095b610f2e565b60015460405160009173ffffffffffffffffffffffffffffffffffffffff16907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908390a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60006109d4610eb6565b905080421015610c865760015473ffffffffffffffffffffffffffffffffffffffff163314610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f45706f63683a206f6e6c79206f70657261746f7220616c6c6f77656420666f7260448201527f207072652d65706f6368000000000000000000000000000000000000000000006064820152608401610513565b60095460009081908190610aae9073ffffffffffffffffffffffffffffffffffffffff166111a5565b600a549295509093509150600090610ae49074010000000000000000000000000000000000000000900463ffffffff16836115fd565b90508063ffffffff16600003610afb575050505050565b60405180602001604052808263ffffffff16600b5487610b1b9190611619565b610b25919061165b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081169091529051600d80547fffffffff0000000000000000000000000000000000000000000000000000000016919092161790556040805160208101909152600c54819063ffffffff841690610b999087611619565b610ba3919061165b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081169091529051600e80547fffffffff000000000000000000000000000000000000000000000000000000001691909216179055600b849055600c839055600a80547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff85160217905560408051858152602081018590527fd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902910160405180910390a15050505050565b60095460009081908190610caf9073ffffffffffffffffffffffffffffffffffffffff166111a5565b600a549295509093509150600090610ce59074010000000000000000000000000000000000000000900463ffffffff16836115fd565b90508063ffffffff16600003610cfe5750505050610e87565b60405180602001604052808263ffffffff16600b5487610d1e9190611619565b610d28919061165b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081169091529051600d80547fffffffff0000000000000000000000000000000000000000000000000000000016919092161790556040805160208101909152600c54819063ffffffff841690610d9c9087611619565b610da6919061165b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081169091529051600e80547fffffffff000000000000000000000000000000000000000000000000000000001691909216179055600b849055600c839055600a80547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff85160217905560408051858152602081018590527fd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902910160405180910390a1505050505b600481905560058054600090610e9c90611714565b90915550610ea8610eb6565b905080421061065857610e87565b6000600254600454610ec8919061174c565b905090565b610ed5610f2e565b73ffffffffffffffffffffffffffffffffffffffff8116610f25576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610513565b610658816113c9565b60005473ffffffffffffffffffffffffffffffffffffffff163314610951576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610513565b73ffffffffffffffffffffffffffffffffffffffff8116611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260448201527f206e6577206f70657261746f72000000000000000000000000000000000000006064820152608401610513565b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed90600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6040805160208101909152600081526000821580611104575083517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16836110f6818361175f565b9250611102908361165b565b145b611190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4669786564506f696e743a204d554c5449504c49434154494f4e5f4f5645524660448201527f4c4f5700000000000000000000000000000000000000000000000000000000006064820152608401610513565b60408051602081019091529081529392505050565b60008060006111b261143e565b90508373ffffffffffffffffffffffffffffffffffffffff16635909c0d56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112239190611776565b92508373ffffffffffffffffffffffffffffffffffffffff16635a3d54936040518163ffffffff1660e01b8152600401602060405180830381865afa158015611270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112949190611776565b915060008060008673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156112e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130a91906117ad565b9250925092508363ffffffff168163ffffffff16146113bf57600061132f82866115fd565b90508063ffffffff16611342848661144f565b5161136b91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661175f565b611375908861174c565b96508063ffffffff16611388858561144f565b516113b191907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661175f565b6113bb908761174c565b9550505b5050509193909250565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610ec8640100000000426117fd565b6040805160208101909152600081526000826dffffffffffffffffffffffffffff16116114d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4669786564506f696e743a204449565f42595f5a45524f0000000000000000006044820152606401610513565b6040805160208101909152806115206dffffffffffffffffffffffffffff85167bffffffffffffffffffffffffffff0000000000000000000000000000607088901b16611811565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690529392505050565b60006020828403121561155957600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461158457600080fd5b919050565b60006020828403121561159b57600080fd5b61078b82611560565b600080604083850312156115b757600080fd5b6115c083611560565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b63ffffffff828116828216039081111561078e5761078e6115ce565b8181038181111561078e5761078e6115ce565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261166a5761166a61162c565b500490565b600071ffffffffffffffffffffffffffffffffffff821671ffffffffffffffffffffffffffffffffffff841671ffffffffffffffffffffffffffffffffffff81830216925081830481148215176116c8576116c86115ce565b505092915050565b600071ffffffffffffffffffffffffffffffffffff8316806116f4576116f461162c565b8071ffffffffffffffffffffffffffffffffffff84160491505092915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611745576117456115ce565b5060010190565b8082018082111561078e5761078e6115ce565b808202811582820484141761078e5761078e6115ce565b60006020828403121561178857600080fd5b5051919050565b80516dffffffffffffffffffffffffffff8116811461158457600080fd5b6000806000606084860312156117c257600080fd5b6117cb8461178f565b92506117d96020850161178f565b9150604084015163ffffffff811681146117f257600080fd5b809150509250925092565b60008261180c5761180c61162c565b500690565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83168061183f5761183f61162c565b807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416049150509291505056fea26469706673582212203e0a1db3cfd6c993f0aff7197aaa226ff93ffed5fa3e4214099e2856cc85488e64736f6c634300081c00330000000000000000000000009f3e35fc18c93314a8d74bbc6c648d8ebdffa8cf000000000000000000000000d1f4414c66e5e046635a179143820f4cbf0d3d3b00000000000000000000000000000000000000000000000000000000000070800000000000000000000000000000000000000000000000000000000067beca00
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101ae5760003560e01c80638a27f103116100ee578063ba52245811610097578063c828371e11610071578063c828371e14610416578063d21220a71461041e578063f2f1e1321461043e578063f2fde38b1461045e57600080fd5b8063ba522458146103c9578063c5700a02146103d1578063c5967c261461040e57600080fd5b8063a6bb4539116100c8578063a6bb453914610379578063a8aa1b31146103a1578063b97dd9e2146103c157600080fd5b80638a27f1031461034b5780638da5cb5b14610353578063a2e620451461037157600080fd5b80634456eda21161015b5780635a3d5493116101355780635a3d5493146102d25780635e6aaf2c146102db5780636808a12814610330578063715018a61461034357600080fd5b80634456eda214610280578063570ca735146102ab5780635909c0d5146102c957600080fd5b80631ed241951161018c5780631ed241951461022557806329605e77146102375780633ddac9531461024a57600080fd5b80630ceb2cef146101b35780630dfe1681146101c85780630f3a9f6514610212575b600080fd5b6101c66101c1366004611547565b610471565b005b6007546101e89073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b6101c6610220366004611547565b610521565b6002545b604051908152602001610209565b6101c6610245366004611589565b610647565b61025d6102583660046115a4565b61065b565b60405171ffffffffffffffffffffffffffffffffffff9091168152602001610209565b60015473ffffffffffffffffffffffffffffffffffffffff1633146040519015158152602001610209565b60015473ffffffffffffffffffffffffffffffffffffffff166101e8565b610229600b5481565b610229600c5481565b600e54610303907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681565b6040517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091168152602001610209565b61025d61033e3660046115a4565b610794565b6101c661093f565b6101c6610953565b60005473ffffffffffffffffffffffffffffffffffffffff166101e8565b6101c66109ca565b600d54610303907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681565b6009546101e89073ffffffffffffffffffffffffffffffffffffffff1681565b600554610229565b600454610229565b600a546103f99074010000000000000000000000000000000000000000900463ffffffff1681565b60405163ffffffff9091168152602001610209565b610229610eb6565b600354610229565b6008546101e89073ffffffffffffffffffffffffffffffffffffffff1681565b600a546101e89073ffffffffffffffffffffffffffffffffffffffff1681565b6101c661046c366004611589565b610ecd565b60015473ffffffffffffffffffffffffffffffffffffffff16331461051c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201527f61746f720000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b600555565b60015473ffffffffffffffffffffffffffffffffffffffff1633146105c7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260448201527f61746f72000000000000000000000000000000000000000000000000000000006064820152608401610513565b610e1081101580156105dc57506202a3008111155b610642576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f5f706572696f643a206f7574206f662072616e676500000000000000000000006044820152606401610513565b600255565b61064f610f2e565b61065881610f81565b50565b60075460009073ffffffffffffffffffffffffffffffffffffffff908116908416036106cb576040805160208101909152600d547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1681526106c4906106bd90846110b2565b5160701c90565b905061078e565b60085473ffffffffffffffffffffffffffffffffffffffff84811691161461074f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4f7261636c653a20494e56414c49445f544f4b454e00000000000000000000006044820152606401610513565b6040805160208101909152600e547bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16815261078b906106bd90846110b2565b90505b92915050565b6009546000908190819081906107bf9073ffffffffffffffffffffffffffffffffffffffff166111a5565b600a5492955090935091506000906107f59074010000000000000000000000000000000000000000900463ffffffff16836115fd565b60075490915073ffffffffffffffffffffffffffffffffffffffff90811690881603610879576108726106bd8760405180602001604052808563ffffffff16600b548a6108429190611619565b61084c919061165b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff169052906110b2565b94506108c6565b60085473ffffffffffffffffffffffffffffffffffffffff908116908816036108c6576108c36106bd8760405180602001604052808563ffffffff16600c54896108429190611619565b94505b600a5473ffffffffffffffffffffffffffffffffffffffff908116908816036109115760065461090a9071ffffffffffffffffffffffffffffffffffff168661166f565b9450610935565b6006546109329071ffffffffffffffffffffffffffffffffffff16866116d0565b94505b5050505092915050565b610947610f2e565b61095160006113c9565b565b61095b610f2e565b60015460405160009173ffffffffffffffffffffffffffffffffffffffff16907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908390a3600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60006109d4610eb6565b905080421015610c865760015473ffffffffffffffffffffffffffffffffffffffff163314610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f45706f63683a206f6e6c79206f70657261746f7220616c6c6f77656420666f7260448201527f207072652d65706f6368000000000000000000000000000000000000000000006064820152608401610513565b60095460009081908190610aae9073ffffffffffffffffffffffffffffffffffffffff166111a5565b600a549295509093509150600090610ae49074010000000000000000000000000000000000000000900463ffffffff16836115fd565b90508063ffffffff16600003610afb575050505050565b60405180602001604052808263ffffffff16600b5487610b1b9190611619565b610b25919061165b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081169091529051600d80547fffffffff0000000000000000000000000000000000000000000000000000000016919092161790556040805160208101909152600c54819063ffffffff841690610b999087611619565b610ba3919061165b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081169091529051600e80547fffffffff000000000000000000000000000000000000000000000000000000001691909216179055600b849055600c839055600a80547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff85160217905560408051858152602081018590527fd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902910160405180910390a15050505050565b60095460009081908190610caf9073ffffffffffffffffffffffffffffffffffffffff166111a5565b600a549295509093509150600090610ce59074010000000000000000000000000000000000000000900463ffffffff16836115fd565b90508063ffffffff16600003610cfe5750505050610e87565b60405180602001604052808263ffffffff16600b5487610d1e9190611619565b610d28919061165b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081169091529051600d80547fffffffff0000000000000000000000000000000000000000000000000000000016919092161790556040805160208101909152600c54819063ffffffff841690610d9c9087611619565b610da6919061165b565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff9081169091529051600e80547fffffffff000000000000000000000000000000000000000000000000000000001691909216179055600b849055600c839055600a80547fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff167401000000000000000000000000000000000000000063ffffffff85160217905560408051858152602081018590527fd78a0cb8bb633d06981248b816e7bd33c2a35a6089241d099fa519e361cab902910160405180910390a1505050505b600481905560058054600090610e9c90611714565b90915550610ea8610eb6565b905080421061065857610e87565b6000600254600454610ec8919061174c565b905090565b610ed5610f2e565b73ffffffffffffffffffffffffffffffffffffffff8116610f25576040517f1e4fbdf700000000000000000000000000000000000000000000000000000000815260006004820152602401610513565b610658816113c9565b60005473ffffffffffffffffffffffffffffffffffffffff163314610951576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610513565b73ffffffffffffffffffffffffffffffffffffffff8116611024576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f6f70657261746f723a207a65726f206164647265737320676976656e20666f7260448201527f206e6577206f70657261746f72000000000000000000000000000000000000006064820152608401610513565b60015460405173ffffffffffffffffffffffffffffffffffffffff8084169216907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed90600090a3600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6040805160208101909152600081526000821580611104575083517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16836110f6818361175f565b9250611102908361165b565b145b611190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4669786564506f696e743a204d554c5449504c49434154494f4e5f4f5645524660448201527f4c4f5700000000000000000000000000000000000000000000000000000000006064820152608401610513565b60408051602081019091529081529392505050565b60008060006111b261143e565b90508373ffffffffffffffffffffffffffffffffffffffff16635909c0d56040518163ffffffff1660e01b8152600401602060405180830381865afa1580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112239190611776565b92508373ffffffffffffffffffffffffffffffffffffffff16635a3d54936040518163ffffffff1660e01b8152600401602060405180830381865afa158015611270573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112949190611776565b915060008060008673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156112e6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130a91906117ad565b9250925092508363ffffffff168163ffffffff16146113bf57600061132f82866115fd565b90508063ffffffff16611342848661144f565b5161136b91907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661175f565b611375908861174c565b96508063ffffffff16611388858561144f565b516113b191907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1661175f565b6113bb908761174c565b9550505b5050509193909250565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610ec8640100000000426117fd565b6040805160208101909152600081526000826dffffffffffffffffffffffffffff16116114d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4669786564506f696e743a204449565f42595f5a45524f0000000000000000006044820152606401610513565b6040805160208101909152806115206dffffffffffffffffffffffffffff85167bffffffffffffffffffffffffffff0000000000000000000000000000607088901b16611811565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1690529392505050565b60006020828403121561155957600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461158457600080fd5b919050565b60006020828403121561159b57600080fd5b61078b82611560565b600080604083850312156115b757600080fd5b6115c083611560565b946020939093013593505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b63ffffffff828116828216039081111561078e5761078e6115ce565b8181038181111561078e5761078e6115ce565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261166a5761166a61162c565b500490565b600071ffffffffffffffffffffffffffffffffffff821671ffffffffffffffffffffffffffffffffffff841671ffffffffffffffffffffffffffffffffffff81830216925081830481148215176116c8576116c86115ce565b505092915050565b600071ffffffffffffffffffffffffffffffffffff8316806116f4576116f461162c565b8071ffffffffffffffffffffffffffffffffffff84160491505092915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611745576117456115ce565b5060010190565b8082018082111561078e5761078e6115ce565b808202811582820484141761078e5761078e6115ce565b60006020828403121561178857600080fd5b5051919050565b80516dffffffffffffffffffffffffffff8116811461158457600080fd5b6000806000606084860312156117c257600080fd5b6117cb8461178f565b92506117d96020850161178f565b9150604084015163ffffffff811681146117f257600080fd5b809150509250925092565b60008261180c5761180c61162c565b500690565b60007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83168061183f5761183f61162c565b807bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8416049150509291505056fea26469706673582212203e0a1db3cfd6c993f0aff7197aaa226ff93ffed5fa3e4214099e2856cc85488e64736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009f3e35fc18c93314a8d74bbc6c648d8ebdffa8cf000000000000000000000000d1f4414c66e5e046635a179143820f4cbf0d3d3b00000000000000000000000000000000000000000000000000000000000070800000000000000000000000000000000000000000000000000000000067beca00
-----Decoded View---------------
Arg [0] : _pair (address): 0x9F3e35fC18C93314A8D74bBC6c648d8EBDFFa8Cf
Arg [1] : _green (address): 0xd1F4414c66E5e046635A179143820f4CBf0D3D3b
Arg [2] : _period (uint256): 28800
Arg [3] : _startTime (uint256): 1740556800
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000009f3e35fc18c93314a8d74bbc6c648d8ebdffa8cf
Arg [1] : 000000000000000000000000d1f4414c66e5e046635a179143820f4cbf0d3d3b
Arg [2] : 0000000000000000000000000000000000000000000000000000000000007080
Arg [3] : 0000000000000000000000000000000000000000000000000000000067beca00
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.