Polygon Sponsored slots available. Book your slot here!
Contract Overview
Balance:
0 MATIC
MATIC Value:
$0.00
My Name Tag:
Not Available, login to update
Txn Hash |
Method
|
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0x02fb3876d36c3b05bfcd03ff4ae40afd03529688f0de218fd4dfe7f2380d3bdb | 0x60a06040 | 31243820 | 245 days 4 hrs ago | 0x07883ebd6f178420f24969279bd425ab0b99f10b | IN | Create: UniV2Oracle | 0 MATIC | 0.026838285925 |
[ Download CSV Export ]
Contract Name:
UniV2Oracle
Compiler Version
v0.8.9+commit.e5eed63a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface IUniswapV2Factory { function getPair(address token0, address token1) external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface IUniswapV2Pair { function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; interface IOracle { /// @notice Oracle price for tokens as a Q64.96 value. /// @notice Returns pricing information based on the indexes of non-zero bits in safetyIndicesSet. /// @notice It is possible that not all indices will have their respective prices returned. /// @dev The price is token1 / token0 i.e. how many weis of token1 required for 1 wei of token0. /// The safety indexes are: /// /// 1 - unsafe, this is typically a spot price that can be easily manipulated, /// /// 2 - 4 - more or less safe, this is typically a uniV3 oracle, where the safety is defined by the timespan of the average price /// /// 5 - safe - this is typically a chailink oracle /// @param token0 Reference to token0 /// @param token1 Reference to token1 /// @param safetyIndicesSet Bitmask of safety indices that are allowed for the return prices. For set of safety indexes = { 1 }, safetyIndicesSet = 0x2 /// @return pricesX96 Prices that satisfy safetyIndex and tokens /// @return safetyIndices Safety indices for those prices function priceX96( address token0, address token1, uint256 safetyIndicesSet ) external view returns (uint256[] memory pricesX96, uint256[] memory safetyIndices); }
// SPDX-License-Identifier: BSL-1.1 pragma solidity 0.8.9; import "../external/univ2/IUniswapV2Factory.sol"; import "./IOracle.sol"; interface IUniV2Oracle is IOracle { /// @notice Reference to UniV2 factory function factory() external returns (IUniswapV2Factory); /// @notice Index of safety bit function safetyIndex() external view returns (uint8); }
// SPDX-License-Identifier: BSL-1.1 pragma solidity 0.8.9; interface IContractMeta { function contractName() external view returns (string memory); function contractNameBytes() external view returns (bytes32); function contractVersion() external view returns (string memory); function contractVersionBytes() external view returns (bytes32); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; import "./external/FullMath.sol"; import "./ExceptionsLibrary.sol"; /// @notice CommonLibrary shared utilities library CommonLibrary { uint256 constant DENOMINATOR = 10**9; uint256 constant D18 = 10**18; uint256 constant YEAR = 365 * 24 * 3600; uint256 constant Q128 = 2**128; uint256 constant Q96 = 2**96; uint256 constant Q48 = 2**48; uint256 constant Q160 = 2**160; uint256 constant UNI_FEE_DENOMINATOR = 10**6; /// @notice Sort uint256 using bubble sort. The sorting is done in-place. /// @param arr Array of uint256 function sortUint(uint256[] memory arr) internal pure { uint256 l = arr.length; for (uint256 i = 0; i < l; ++i) { for (uint256 j = i + 1; j < l; ++j) { if (arr[i] > arr[j]) { uint256 temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } } /// @notice Checks if array of addresses is sorted and all adresses are unique /// @param tokens A set of addresses to check /// @return `true` if all addresses are sorted and unique, `false` otherwise function isSortedAndUnique(address[] memory tokens) internal pure returns (bool) { if (tokens.length < 2) { return true; } for (uint256 i = 0; i < tokens.length - 1; ++i) { if (tokens[i] >= tokens[i + 1]) { return false; } } return true; } /// @notice Projects tokenAmounts onto subset or superset of tokens /// @dev /// Requires both sets of tokens to be sorted. When tokens are not sorted, it's undefined behavior. /// If there is a token in tokensToProject that is not part of tokens and corresponding tokenAmountsToProject > 0, reverts. /// Zero token amount is eqiuvalent to missing token function projectTokenAmounts( address[] memory tokens, address[] memory tokensToProject, uint256[] memory tokenAmountsToProject ) internal pure returns (uint256[] memory) { uint256[] memory res = new uint256[](tokens.length); uint256 t = 0; uint256 tp = 0; while ((t < tokens.length) && (tp < tokensToProject.length)) { if (tokens[t] < tokensToProject[tp]) { res[t] = 0; t++; } else if (tokens[t] > tokensToProject[tp]) { if (tokenAmountsToProject[tp] == 0) { tp++; } else { revert("TPS"); } } else { res[t] = tokenAmountsToProject[tp]; t++; tp++; } } while (t < tokens.length) { res[t] = 0; t++; } return res; } /// @notice Calculated sqrt of uint in X96 format /// @param xX96 input number in X96 format /// @return sqrt of xX96 in X96 format function sqrtX96(uint256 xX96) internal pure returns (uint256) { uint256 sqX96 = sqrt(xX96); return sqX96 << 48; } /// @notice Calculated sqrt of uint /// @param x input number /// @return sqrt of x function sqrt(uint256 x) internal pure returns (uint256) { if (x == 0) return 0; uint256 xx = x; uint256 r = 1; if (xx >= 0x100000000000000000000000000000000) { xx >>= 128; r <<= 64; } if (xx >= 0x10000000000000000) { xx >>= 64; r <<= 32; } if (xx >= 0x100000000) { xx >>= 32; r <<= 16; } if (xx >= 0x10000) { xx >>= 16; r <<= 8; } if (xx >= 0x100) { xx >>= 8; r <<= 4; } if (xx >= 0x10) { xx >>= 4; r <<= 2; } if (xx >= 0x8) { r <<= 1; } r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; r = (r + x / r) >> 1; uint256 r1 = x / r; return (r < r1 ? r : r1); } /// @notice Recovers signer address from signed message hash /// @param _ethSignedMessageHash signed message /// @param _signature contatenated ECDSA r, s, v (65 bytes) /// @return Recovered address if the signature is valid, address(0) otherwise function recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature) internal pure returns (address) { (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature); return ecrecover(_ethSignedMessageHash, v, r, s); } /// @notice Get ECDSA r, s, v from signature /// @param sig signature (65 bytes) /// @return r ECDSA r /// @return s ECDSA s /// @return v ECDSA v function splitSignature(bytes memory sig) internal pure returns ( bytes32 r, bytes32 s, uint8 v ) { require(sig.length == 65, ExceptionsLibrary.INVALID_LENGTH); assembly { r := mload(add(sig, 32)) s := mload(add(sig, 64)) v := byte(0, mload(add(sig, 96))) } } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.9; /// @notice Exceptions stores project`s smart-contracts exceptions library ExceptionsLibrary { string constant ADDRESS_ZERO = "AZ"; string constant VALUE_ZERO = "VZ"; string constant EMPTY_LIST = "EMPL"; string constant NOT_FOUND = "NF"; string constant INIT = "INIT"; string constant DUPLICATE = "DUP"; string constant NULL = "NULL"; string constant TIMESTAMP = "TS"; string constant FORBIDDEN = "FRB"; string constant ALLOWLIST = "ALL"; string constant LIMIT_OVERFLOW = "LIMO"; string constant LIMIT_UNDERFLOW = "LIMU"; string constant INVALID_VALUE = "INV"; string constant INVARIANT = "INVA"; string constant INVALID_TARGET = "INVTR"; string constant INVALID_TOKEN = "INVTO"; string constant INVALID_INTERFACE = "INVI"; string constant INVALID_SELECTOR = "INVS"; string constant INVALID_STATE = "INVST"; string constant INVALID_LENGTH = "INVL"; string constant LOCK = "LCKD"; string constant DISABLED = "DIS"; }
// SPDX-License-Identifier: MIT pragma solidity =0.8.9; /// @title Contains 512-bit math functions /// @notice Facilitates multiplication and division that can have overflow of an intermediate value without any loss of precision /// @dev Handles "phantom overflow" i.e., allows multiplication and division where an intermediate value overflows 256 bits library FullMath { /// @notice Calculates floor(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 /// @param a The multiplicand /// @param b The multiplier /// @param denominator The divisor /// @return result The 256-bit result /// @dev Credit to Remco Bloemen under MIT license https://xn--2-umb.com/21/muldiv function mulDiv( uint256 a, uint256 b, uint256 denominator ) internal pure returns (uint256 result) { // diff: original lib works under 0.7.6 with overflows enabled unchecked { // 512-bit multiply [prod1 prod0] = a * b // Compute the product mod 2**256 and mod 2**256 - 1 // then use the Chinese Remainder Theorem to reconstruct // the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2**256 + prod0 uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(a, b, not(0)) prod0 := mul(a, b) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division if (prod1 == 0) { require(denominator > 0); assembly { result := div(prod0, denominator) } return result; } // Make sure the result is less than 2**256. // Also prevents denominator == 0 require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0] // Compute remainder using mulmod uint256 remainder; assembly { remainder := mulmod(a, b, denominator) } // Subtract 256 bit number from 512 bit number assembly { prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator // Compute largest power of two divisor of denominator. // Always >= 1. // diff: original uint256 twos = -denominator & denominator; uint256 twos = uint256(-int256(denominator)) & denominator; // Divide denominator by power of two assembly { denominator := div(denominator, twos) } // Divide [prod1 prod0] by the factors of two assembly { prod0 := div(prod0, twos) } // Shift in bits from prod1 into prod0. For this we need // to flip `twos` such that it is 2**256 / twos. // If twos is zero, then it becomes one assembly { twos := add(div(sub(0, twos), twos), 1) } prod0 |= prod1 * twos; // Invert denominator mod 2**256 // Now that denominator is an odd number, it has an inverse // modulo 2**256 such that denominator * inv = 1 mod 2**256. // Compute the inverse by starting with a seed that is correct // correct for four bits. That is, denominator * inv = 1 mod 2**4 uint256 inv = (3 * denominator) ^ 2; // Now use Newton-Raphson iteration to improve the precision. // Thanks to Hensel's lifting lemma, this also works in modular // arithmetic, doubling the correct bits in each step. inv *= 2 - denominator * inv; // inverse mod 2**8 inv *= 2 - denominator * inv; // inverse mod 2**16 inv *= 2 - denominator * inv; // inverse mod 2**32 inv *= 2 - denominator * inv; // inverse mod 2**64 inv *= 2 - denominator * inv; // inverse mod 2**128 inv *= 2 - denominator * inv; // inverse mod 2**256 // Because the division is now exact we can divide by multiplying // with the modular inverse of denominator. This will give us the // correct result modulo 2**256. Since the precoditions guarantee // that the outcome is less than 2**256, this is the final result. // We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inv; return result; } } /// @notice Calculates ceil(a×b÷denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 /// @param a The multiplicand /// @param b The multiplier /// @param denominator The divisor /// @return result The 256-bit result function mulDivRoundingUp( uint256 a, uint256 b, uint256 denominator ) internal pure returns (uint256 result) { // diff: original lib works under 0.7.6 with overflows enabled unchecked { result = mulDiv(a, b, denominator); if (mulmod(a, b, denominator) > 0) { require(result < type(uint256).max); result++; } } } }
// SPDX-License-Identifier: BSL-1.1 pragma solidity 0.8.9; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "../interfaces/external/univ2/IUniswapV2Pair.sol"; import "../interfaces/external/univ2/IUniswapV2Factory.sol"; import "../interfaces/oracles/IUniV2Oracle.sol"; import "../libraries/CommonLibrary.sol"; import "../utils/ContractMeta.sol"; contract UniV2Oracle is ContractMeta, IUniV2Oracle, ERC165 { /// @inheritdoc IUniV2Oracle IUniswapV2Factory public immutable factory; /// @inheritdoc IUniV2Oracle uint8 public constant safetyIndex = 1; constructor(IUniswapV2Factory factory_) { factory = factory_; } // ------------------------- EXTERNAL, VIEW ------------------------------ /// @inheritdoc IOracle function priceX96( address token0, address token1, uint256 safetyIndicesSet ) external view returns (uint256[] memory pricesX96, uint256[] memory safetyIndices) { bool isSwapped = false; if (token0 > token1) { (token0, token1) = (token1, token0); isSwapped = true; } if (((safetyIndicesSet >> safetyIndex) & 1) != 1) { return (pricesX96, safetyIndices); } IUniswapV2Pair pool = IUniswapV2Pair(factory.getPair(token0, token1)); if (address(pool) == address(0)) { return (pricesX96, safetyIndices); } (uint112 reserve0, uint112 reserve1, ) = pool.getReserves(); pricesX96 = new uint256[](1); safetyIndices = new uint256[](1); if (isSwapped) { pricesX96[0] = FullMath.mulDiv(reserve0, CommonLibrary.Q96, reserve1); } else { pricesX96[0] = FullMath.mulDiv(reserve1, CommonLibrary.Q96, reserve0); } safetyIndices[0] = safetyIndex; } /// @inheritdoc IERC165 function supportsInterface(bytes4 interfaceId) public view override returns (bool) { return super.supportsInterface(interfaceId) || type(IUniV2Oracle).interfaceId == interfaceId; } // ------------------- INTERNAL, VIEW ------------------- function _contractName() internal pure override returns (bytes32) { return bytes32("UniV2Oracle"); } function _contractVersion() internal pure override returns (bytes32) { return bytes32("1.0.0"); } }
// SPDX-License-Identifier: BSL-1.1 pragma solidity 0.8.9; import "../interfaces/utils/IContractMeta.sol"; abstract contract ContractMeta is IContractMeta { // ------------------- EXTERNAL, VIEW ------------------- function contractName() external pure returns (string memory) { return _bytes32ToString(_contractName()); } function contractNameBytes() external pure returns (bytes32) { return _contractName(); } function contractVersion() external pure returns (string memory) { return _bytes32ToString(_contractVersion()); } function contractVersionBytes() external pure returns (bytes32) { return _contractVersion(); } // ------------------- INTERNAL, VIEW ------------------- function _contractName() internal pure virtual returns (bytes32); function _contractVersion() internal pure virtual returns (bytes32); function _bytes32ToString(bytes32 b) internal pure returns (string memory s) { s = new string(32); uint256 len = 32; for (uint256 i = 0; i < 32; ++i) { if (uint8(b[i]) == 0) { len = i; break; } } assembly { mstore(s, len) mstore(add(s, 0x20), b) } } }
{ "evmVersion": "istanbul", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IUniswapV2Factory","name":"factory_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"contractName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractNameBytes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"contractVersionBytes","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint256","name":"safetyIndicesSet","type":"uint256"}],"name":"priceX96","outputs":[{"internalType":"uint256[]","name":"pricesX96","type":"uint256[]"},{"internalType":"uint256[]","name":"safetyIndices","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"safetyIndex","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405234801561001057600080fd5b5060405161083d38038061083d83398101604081905261002f91610040565b6001600160a01b0316608052610070565b60006020828403121561005257600080fd5b81516001600160a01b038116811461006957600080fd5b9392505050565b6080516107ab61009260003960008181610124015261021601526107ab6000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c806375d0c0dc1161005b57806375d0c0dc14610102578063a0a8e46014610117578063c45a01551461011f578063e312650b1461015e57600080fd5b806301ffc9a71461008d57806306a46239146100b55780630e3e80ac146100cd5780636d80125b146100e1575b600080fd5b6100a061009b36600461056c565b610178565b60405190151581526020015b60405180910390f35b640312e302e360dc1b5b6040519081526020016100ac565b6a556e6956324f7261636c6560a81b6100bf565b6100f46100ef3660046105ae565b6101b4565b6040516100ac92919061062a565b61010a610420565b6040516100ac9190610658565b61010a610439565b6101467f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016100ac565b610166600181565b60405160ff90911681526020016100ac565b60006301ffc9a760e01b6001600160e01b0319831614806101a957506313a4322f60e11b6001600160e01b03198316145b92915050565b905090565b6060806000846001600160a01b0316866001600160a01b031611156101da575092939260015b600184811c8116146101ec5750610418565b60405163e6a4390560e01b81526001600160a01b03878116600483015286811660248301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a439059060440160206040518083038186803b15801561025a57600080fd5b505afa15801561026e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029291906106ad565b90506001600160a01b0381166102a9575050610418565b600080826001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156102e557600080fd5b505afa1580156102f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061031d91906106e6565b5060408051600180825281830190925292945090925060208083019080368337505060408051600180825281830190925292985090506020808301908036833701905050945083156103ae5761038a826001600160701b0316600160601b836001600160701b031661044c565b8660008151811061039d5761039d610736565b6020026020010181815250506103ef565b6103cf816001600160701b0316600160601b846001600160701b031661044c565b866000815181106103e2576103e2610736565b6020026020010181815250505b600160ff168560008151811061040757610407610736565b602002602001018181525050505050505b935093915050565b60606101af6a556e6956324f7261636c6560a81b610500565b60606101af640312e302e360dc1b610500565b600080806000198587098587029250828110838203039150508060001415610486576000841161047b57600080fd5b5082900490506104f9565b80841161049257600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150505b9392505050565b604080516020808252818301909252606091602082018180368337019050509050602060005b602081101561055e5783816020811061054157610541610736565b1a61054e5780915061055e565b6105578161074c565b9050610526565b508152602081019190915290565b60006020828403121561057e57600080fd5b81356001600160e01b0319811681146104f957600080fd5b6001600160a01b03811681146105ab57600080fd5b50565b6000806000606084860312156105c357600080fd5b83356105ce81610596565b925060208401356105de81610596565b929592945050506040919091013590565b600081518084526020808501945080840160005b8381101561061f57815187529582019590820190600101610603565b509495945050505050565b60408152600061063d60408301856105ef565b828103602084015261064f81856105ef565b95945050505050565b600060208083528351808285015260005b8181101561068557858101830151858201604001528201610669565b81811115610697576000604083870101525b50601f01601f1916929092016040019392505050565b6000602082840312156106bf57600080fd5b81516104f981610596565b80516001600160701b03811681146106e157600080fd5b919050565b6000806000606084860312156106fb57600080fd5b610704846106ca565b9250610712602085016106ca565b9150604084015163ffffffff8116811461072b57600080fd5b809150509250925092565b634e487b7160e01b600052603260045260246000fd5b600060001982141561076e57634e487b7160e01b600052601160045260246000fd5b506001019056fea26469706673582212209702ba196acdd04f16ddf43791d272e707cc8267530222f0f7e0eb529b3f191e64736f6c63430008090033000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c4
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c4
-----Decoded View---------------
Arg [0] : factory_ (address): 0xc35dadb65012ec5796536bd9864ed8773abc74c4
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c35dadb65012ec5796536bd9864ed8773abc74c4
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.