Source Code
Overview
ETH Balance
More Info
ContractCreator
Multichain Info
N/A
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
8484089 | 35 days ago | 0 ETH | ||||
8484089 | 35 days ago | 0 ETH | ||||
8484089 | 35 days ago | 0 ETH | ||||
8484089 | 35 days ago | 0 ETH | ||||
8484089 | 35 days ago | 0 ETH | ||||
8484089 | 35 days ago | 0 ETH | ||||
8484087 | 35 days ago | 0 ETH | ||||
8484087 | 35 days ago | 0 ETH | ||||
8484087 | 35 days ago | 0 ETH | ||||
8484077 | 35 days ago | 0 ETH | ||||
8484077 | 35 days ago | 0 ETH | ||||
8484077 | 35 days ago | 0 ETH | ||||
8484077 | 35 days ago | 0 ETH | ||||
8484077 | 35 days ago | 0 ETH | ||||
8484077 | 35 days ago | 0 ETH | ||||
8484077 | 35 days ago | 0 ETH | ||||
8484074 | 35 days ago | 0 ETH | ||||
8484074 | 35 days ago | 0 ETH | ||||
8484074 | 35 days ago | 0 ETH | ||||
8484067 | 35 days ago | 0 ETH | ||||
8484067 | 35 days ago | 0 ETH | ||||
8484067 | 35 days ago | 0 ETH | ||||
8484067 | 35 days ago | 0 ETH | ||||
8484067 | 35 days ago | 0 ETH | ||||
8484067 | 35 days ago | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
DrandBeacon
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 1000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.8.28; import {BLS} from "@kevincharm/bls-bn254/contracts/BLS.sol"; import {SSTORE2} from "solady/src/utils/SSTORE2.sol"; import {IDrandBeacon} from "../interfaces/IDrandBeacon.sol"; /// @title DrandBeacon /// @author Kevin Charm <[email protected]> /// @notice Contract containing immutable information about a drand beacon. contract DrandBeacon is IDrandBeacon { /// @notice Domain separation tag bytes public constant DST = bytes("BLS_SIG_BN254G1_XMD:KECCAK-256_SVDW_RO_NUL_"); /** * ---------------------+-------+ * var | size | * ---------------------+-------+ * publicKey | 128 | * genesisTimestamp | 32 | * period | 32 | * ---------------------+-------+ */ uint256 private constant PTR_PUBLIC_KEY = 0; uint256 private constant LEN_PUBLIC_KEY = 128; uint256 private constant PTR_GENESIS_TIMESTAMP = 128; uint256 private constant LEN_GENESIS_TIMESTAMP = 32; uint256 private constant PTR_PERIOD = 160; uint256 private constant LEN_PERIOD = 32; /// @notice Pointer to immutable data address public immutable data; error InvalidPublicKey(uint256[4] pubKey); error InvalidBeaconConfiguration(uint256 genesisTimestamp, uint256 period); error InvalidSignature( uint256[4] pubKey, uint256[2] message, uint256[2] signature ); constructor( uint256[4] memory publicKey_, uint256 genesisTimestamp_, uint256 period_ ) { if (!BLS.isValidPublicKey(publicKey_)) { revert InvalidPublicKey(publicKey_); } bytes memory pubKey = abi.encodePacked( publicKey_[0], publicKey_[1], publicKey_[2], publicKey_[3] ); if (genesisTimestamp_ == 0 || period_ == 0) { revert InvalidBeaconConfiguration(genesisTimestamp_, period_); } data = SSTORE2.write( abi.encodePacked(pubKey, genesisTimestamp_, period_) ); // Sanity checks assert(keccak256(publicKey()) == keccak256(pubKey)); assert(genesisTimestamp() == genesisTimestamp_); assert(period() == period_); } /// @notice Get the public key of the beacon function publicKey() public view returns (bytes memory) { return SSTORE2.read(data, PTR_PUBLIC_KEY, PTR_PUBLIC_KEY + LEN_PUBLIC_KEY); } /// @notice Get the public key hash of the beacon function publicKeyHash() public view returns (bytes32) { return keccak256(publicKey()); } /// @notice Get the genesis timestamp of the beacon function genesisTimestamp() public view returns (uint256) { return abi.decode( SSTORE2.read( data, PTR_GENESIS_TIMESTAMP, PTR_GENESIS_TIMESTAMP + LEN_GENESIS_TIMESTAMP ), (uint256) ); } /// @notice Get the period of the beacon function period() public view returns (uint256) { return abi.decode( SSTORE2.read(data, PTR_PERIOD, PTR_PERIOD + LEN_PERIOD), (uint256) ); } /// @notice Deserialise the public key from raw bytes for ecpairing function _deserialisePublicKey() private view returns (uint256[4] memory) { ( uint256 pubKey0, uint256 pubKey1, uint256 pubKey2, uint256 pubKey3 ) = abi.decode(publicKey(), (uint256, uint256, uint256, uint256)); return [pubKey0, pubKey1, pubKey2, pubKey3]; } /// @notice Verify the signature produced by a drand beacon round against /// the known public key. Reverts if the signature is invalid. /// @param round The beacon round to verify /// @param signature The signature to verify function verifyBeaconRound( uint256 round, uint256[2] memory signature ) external view { // Encode round for hash-to-point bytes memory hashedRoundBytes = new bytes(32); assembly { mstore(0x00, round) let hashedRound := keccak256(0x18, 0x08) // hash the last 8 bytes (uint64) of `round` mstore(add(0x20, hashedRoundBytes), hashedRound) } uint256[4] memory pubKey = _deserialisePublicKey(); uint256[2] memory message = BLS.hashToPoint(DST, hashedRoundBytes); bool isValidSignature = BLS.isValidSignature(signature); if (!isValidSignature) { revert InvalidSignature(pubKey, message, signature); } (bool pairingSuccess, bool callSuccess) = BLS.verifySingle( signature, pubKey, message ); // From EIP-197: If the length of the input is incorrect or any of the // inputs are not elements of the respective group or are not encoded // correctly, the call fails. // Ergo, this must never revert. Otherwise we have a bug. assert(callSuccess); if (!pairingSuccess) { revert InvalidSignature(pubKey, message, signature); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8; import {ModexpInverse, ModexpSqrt} from "./ModExp.sol"; /// @title Boneh–Lynn–Shacham (BLS) signature scheme on Barreto-Naehrig 254 bit curve (BN-254) /// @notice We use BLS signature aggregation to reduce the size of signature data to store on chain. /// @dev We use G1 points for signatures and messages, and G2 points for public keys /// @dev Adapted from https://github.com/thehubbleproject/hubble-contracts library BLS { // Field order // prettier-ignore uint256 private constant N = 21888242871839275222246405745257275088696311157297823662689037894645226208583; // Negated generator of G2 // prettier-ignore uint256 private constant N_G2_X1 = 11559732032986387107991004021392285783925812861821192530917403151452391805634; // prettier-ignore uint256 private constant N_G2_X0 = 10857046999023057135944570762232829481370756359578518086990519993285655852781; // prettier-ignore uint256 private constant N_G2_Y1 = 17805874995975841540914202342111839520379459829704422454583296818431106115052; // prettier-ignore uint256 private constant N_G2_Y0 = 13392588948715843804641432497768002650278120570034223513918757245338268106653; // prettier-ignore uint256 private constant T24 = 0x1000000000000000000000000000000000000000000000000; // prettier-ignore uint256 private constant MASK24 = 0xffffffffffffffffffffffffffffffffffffffffffffffff; /// @notice Param A of BN254 uint256 private constant A = 0; /// @notice Param B of BN254 uint256 private constant B = 3; /// @notice Param Z for SVDW over E uint256 private constant Z = 1; /// @notice g(Z) where g(x) = x^3 + 3 uint256 private constant C1 = 0x4; /// @notice -Z / 2 (mod N) uint256 private constant C2 = 0x183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea3; /// @notice C3 = sqrt(-g(Z) * (3 * Z^2 + 4 * A)) (mod N) /// and sgn0(C3) == 0 uint256 private constant C3 = 0x16789af3a83522eb353c98fc6b36d713d5d8d1cc5dffffffa; /// @notice 4 * -g(Z) / (3 * Z^2 + 4 * A) (mod N) uint256 private constant C4 = 0x10216f7ba065e00de81ac1e7808072c9dd2b2385cd7b438469602eb24829a9bd; /// @notice (N - 1) / 2 uint256 private constant C5 = 0x183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea3; error BNAddFailed(uint256[4] input); error InvalidFieldElement(uint256 x); error MapToPointFailed(uint256 noSqrt); error InvalidDSTLength(bytes dst); error ModExpFailed(uint256 base, uint256 exponent, uint256 modulus); function verifySingle( uint256[2] memory signature, uint256[4] memory pubkey, uint256[2] memory message ) internal view returns (bool pairingSuccess, bool callSuccess) { uint256[12] memory input = [ signature[0], signature[1], N_G2_X1, N_G2_X0, N_G2_Y1, N_G2_Y0, message[0], message[1], pubkey[1], pubkey[0], pubkey[3], pubkey[2] ]; uint256[1] memory out; // solium-disable-next-line security/no-inline-assembly assembly { callSuccess := staticcall( sub(gas(), 2000), 8, input, 384, out, 0x20 ) } return (out[0] != 0, callSuccess); } /// @notice Hash to BN254 G1 /// @param domain Domain separation tag /// @param message Message to hash /// @return Point in G1 function hashToPoint( bytes memory domain, bytes memory message ) internal view returns (uint256[2] memory) { uint256[2] memory u = hashToField(domain, message); uint256[2] memory p0 = mapToPoint(u[0]); uint256[2] memory p1 = mapToPoint(u[1]); uint256[4] memory bnAddInput; bnAddInput[0] = p0[0]; bnAddInput[1] = p0[1]; bnAddInput[2] = p1[0]; bnAddInput[3] = p1[1]; bool success; // solium-disable-next-line security/no-inline-assembly assembly { success := staticcall(sub(gas(), 2000), 6, bnAddInput, 128, p0, 64) } if (!success) revert BNAddFailed(bnAddInput); return p0; } /// @notice Check if `signature` is a valid signature /// @param signature Signature to check function isValidSignature( uint256[2] memory signature ) internal pure returns (bool) { if ((signature[0] >= N) || (signature[1] >= N)) { return false; } else { return isOnCurveG1(signature); } } /// @notice Check if `publicKey` is a valid public key /// @param publicKey PK to check function isValidPublicKey( uint256[4] memory publicKey ) internal pure returns (bool) { if ( (publicKey[0] >= N) || (publicKey[1] >= N) || (publicKey[2] >= N || (publicKey[3] >= N)) ) { return false; } else { return isOnCurveG2(publicKey); } } /// @notice Check if `point` is in G1 /// @param point Point to check function isOnCurveG1( uint256[2] memory point ) internal pure returns (bool _isOnCurve) { // solium-disable-next-line security/no-inline-assembly assembly { let t0 := mload(point) let t1 := mload(add(point, 32)) let t2 := mulmod(t0, t0, N) t2 := mulmod(t2, t0, N) t2 := addmod(t2, 3, N) t1 := mulmod(t1, t1, N) _isOnCurve := eq(t1, t2) } } /// @notice Check if `point` is in G2 /// @param point Point to check function isOnCurveG2( uint256[4] memory point ) internal pure returns (bool _isOnCurve) { // solium-disable-next-line security/no-inline-assembly assembly { // x0, x1 let t0 := mload(point) let t1 := mload(add(point, 32)) // x0 ^ 2 let t2 := mulmod(t0, t0, N) // x1 ^ 2 let t3 := mulmod(t1, t1, N) // 3 * x0 ^ 2 let t4 := add(add(t2, t2), t2) // 3 * x1 ^ 2 let t5 := addmod(add(t3, t3), t3, N) // x0 * (x0 ^ 2 - 3 * x1 ^ 2) t2 := mulmod(add(t2, sub(N, t5)), t0, N) // x1 * (3 * x0 ^ 2 - x1 ^ 2) t3 := mulmod(add(t4, sub(N, t3)), t1, N) // x ^ 3 + b t0 := addmod( t2, 0x2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5, N ) t1 := addmod( t3, 0x009713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d2, N ) // y0, y1 t2 := mload(add(point, 64)) t3 := mload(add(point, 96)) // y ^ 2 t4 := mulmod(addmod(t2, t3, N), addmod(t2, sub(N, t3), N), N) t3 := mulmod(shl(1, t2), t3, N) // y ^ 2 == x ^ 3 + b _isOnCurve := and(eq(t0, t4), eq(t1, t3)) } } /// @notice sqrt(xx) mod N /// @param xx Input function sqrt(uint256 xx) internal pure returns (uint256 x, bool hasRoot) { x = ModexpSqrt.run(xx); hasRoot = mulmod(x, x, N) == xx; } /// @notice a^{-1} mod N /// @param a Input function inverse(uint256 a) internal pure returns (uint256) { return ModexpInverse.run(a); } /// @notice Hash a message to the field /// @param domain Domain separation tag /// @param message Message to hash function hashToField( bytes memory domain, bytes memory message ) internal pure returns (uint256[2] memory) { bytes memory _msg = expandMsgTo96(domain, message); uint256 u0; uint256 u1; uint256 a0; uint256 a1; // solium-disable-next-line security/no-inline-assembly assembly { let p := add(_msg, 24) u1 := and(mload(p), MASK24) p := add(_msg, 48) u0 := and(mload(p), MASK24) a0 := addmod(mulmod(u1, T24, N), u0, N) p := add(_msg, 72) u1 := and(mload(p), MASK24) p := add(_msg, 96) u0 := and(mload(p), MASK24) a1 := addmod(mulmod(u1, T24, N), u0, N) } return [a0, a1]; } /// @notice Expand arbitrary message to 96 pseudorandom bytes, as described /// in rfc9380 section 5.3.1, using H = keccak256. /// @param DST Domain separation tag /// @param message Message to expand function expandMsgTo96( bytes memory DST, bytes memory message ) internal pure returns (bytes memory) { uint256 domainLen = DST.length; if (domainLen > 255) { revert InvalidDSTLength(DST); } bytes memory zpad = new bytes(136); bytes memory b_0 = abi.encodePacked( zpad, message, uint8(0), uint8(96), uint8(0), DST, uint8(domainLen) ); bytes32 b0 = keccak256(b_0); bytes memory b_i = abi.encodePacked( b0, uint8(1), DST, uint8(domainLen) ); bytes32 bi = keccak256(b_i); bytes memory out = new bytes(96); uint256 ell = 3; for (uint256 i = 1; i < ell; i++) { b_i = abi.encodePacked( b0 ^ bi, uint8(1 + i), DST, uint8(domainLen) ); assembly { let p := add(32, out) p := add(p, mul(32, sub(i, 1))) mstore(p, bi) } bi = keccak256(b_i); } assembly { let p := add(32, out) p := add(p, mul(32, sub(ell, 1))) mstore(p, bi) } return out; } /// @notice Map field element to E using SvdW /// @param u Field element to map /// @return p Point on curve function mapToPoint(uint256 u) internal view returns (uint256[2] memory p) { if (u >= N) revert InvalidFieldElement(u); uint256 tv1 = mulmod(mulmod(u, u, N), C1, N); uint256 tv2 = addmod(1, tv1, N); tv1 = addmod(1, N - tv1, N); uint256 tv3 = inverse(mulmod(tv1, tv2, N)); uint256 tv5 = mulmod(mulmod(mulmod(u, tv1, N), tv3, N), C3, N); uint256 x1 = addmod(C2, N - tv5, N); uint256 x2 = addmod(C2, tv5, N); uint256 tv7 = mulmod(tv2, tv2, N); uint256 tv8 = mulmod(tv7, tv3, N); uint256 x3 = addmod(Z, mulmod(C4, mulmod(tv8, tv8, N), N), N); bool hasRoot; uint256 gx; if (legendre(g(x1)) == 1) { p[0] = x1; gx = g(x1); (p[1], hasRoot) = sqrt(gx); if (!hasRoot) revert MapToPointFailed(gx); } else if (legendre(g(x2)) == 1) { p[0] = x2; gx = g(x2); (p[1], hasRoot) = sqrt(gx); if (!hasRoot) revert MapToPointFailed(gx); } else { p[0] = x3; gx = g(x3); (p[1], hasRoot) = sqrt(gx); if (!hasRoot) revert MapToPointFailed(gx); } if (sgn0(u) != sgn0(p[1])) { p[1] = N - p[1]; } } /// @notice g(x) = y^2 = x^3 + 3 function g(uint256 x) private pure returns (uint256) { return addmod(mulmod(mulmod(x, x, N), x, N), B, N); } /// @notice https://datatracker.ietf.org/doc/html/rfc9380#name-the-sgn0-function function sgn0(uint256 x) private pure returns (uint256) { return x % 2; } /// @notice Compute Legendre symbol of u /// @param u Field element /// @return 1 if u is a quadratic residue, -1 if not, or 0 if u = 0 (mod p) function legendre(uint256 u) private view returns (int8) { uint256 x = modexpLegendre(u); if (x == N - 1) { return -1; } if (x != 0 && x != 1) { revert MapToPointFailed(u); } return int8(int256(x)); } /// @notice This is cheaper than an addchain for exponent (N-1)/2 function modexpLegendre(uint256 u) private view returns (uint256 output) { bytes memory input = new bytes(192); bool success; assembly { let p := add(input, 32) mstore(p, 32) // len(u) p := add(p, 32) mstore(p, 32) // len(exp) p := add(p, 32) mstore(p, 32) // len(mod) p := add(p, 32) mstore(p, u) // u p := add(p, 32) mstore(p, C5) // (N-1)/2 p := add(p, 32) mstore(p, N) // N success := staticcall( gas(), 5, add(input, 32), 192, 0x00, // scratch space <- result 32 ) output := mload(0x00) // output <- result } if (!success) { revert ModExpFailed(u, C5, N); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8; /** @title Compute Inverse by Modular Exponentiation @notice Compute $input^(N - 2) mod N$ using Addition Chain method. Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 and N - 2 = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd45 @dev the function body is generated with the modified addchain script see https://github.com/kobigurk/addchain/commit/2c37a2ace567a9bdc680b4e929c94aaaa3ec700f */ library ModexpInverse { function run(uint256 t2) internal pure returns (uint256 t0) { // solium-disable-next-line security/no-inline-assembly assembly { let n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 t0 := mulmod(t2, t2, n) let t5 := mulmod(t0, t2, n) let t1 := mulmod(t5, t0, n) let t3 := mulmod(t5, t5, n) let t8 := mulmod(t1, t0, n) let t4 := mulmod(t3, t5, n) let t6 := mulmod(t3, t1, n) t0 := mulmod(t3, t3, n) let t7 := mulmod(t8, t3, n) t3 := mulmod(t4, t3, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t5, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t8, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t8, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t8, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t5, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t7, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t1, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t5, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t8, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t1, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t6, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t7, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t1, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t5, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t1, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t5, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t6, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t6, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t1, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t8, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t6, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t1, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t4, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t6, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t8, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t8, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t1, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t7, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t3, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t5, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t6, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t5, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t5, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t3, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t4, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t3, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t1, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t1, n) } } } /** @title Compute Square Root by Modular Exponentiation @notice Compute $input^{(N + 1) / 4} mod N$ using Addition Chain method. Where N = 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 and (N + 1) / 4 = 0xc19139cb84c680a6e14116da060561765e05aa45a1c72a34f082305b61f3f52 */ library ModexpSqrt { function run(uint256 t6) internal pure returns (uint256 t0) { // solium-disable-next-line security/no-inline-assembly assembly { let n := 0x30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47 t0 := mulmod(t6, t6, n) let t4 := mulmod(t0, t6, n) let t2 := mulmod(t4, t0, n) let t3 := mulmod(t4, t4, n) let t8 := mulmod(t2, t0, n) let t1 := mulmod(t3, t4, n) let t5 := mulmod(t3, t2, n) t0 := mulmod(t3, t3, n) let t7 := mulmod(t8, t3, n) t3 := mulmod(t1, t3, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t4, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t6, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t6, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t8, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t8, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t6, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t8, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t6, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t4, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t7, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t4, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t8, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t6, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t5, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t7, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t4, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t4, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t5, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t5, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t8, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t5, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t1, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t5, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t6, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t8, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t8, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t6, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t7, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t3, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t6, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t6, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t4, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t5, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t4, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t4, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t3, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t1, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t3, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t2, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t0, n) t0 := mulmod(t0, t1, n) t0 := mulmod(t0, t0, n) } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8; /// @title IDrandBeacon /// @author Kevin Charm ([email protected]) /// @notice Contract containing immutable information about a drand beacon. interface IDrandBeacon { /// @notice Get the public key of the beacon function publicKey() external view returns (bytes memory); /// @notice Get the public key hash of the beacon function publicKeyHash() external view returns (bytes32); /// @notice Get the genesis timestamp of the beacon function genesisTimestamp() external view returns (uint256); /// @notice Get the period of the beacon function period() external view returns (uint256); /// @notice Verify the signature produced by a drand beacon round against /// the known public key. Should revert if the signature is invalid. /// @param round The beacon round to verify /// @param signature The signature to verify function verifyBeaconRound( uint256 round, uint256[2] memory signature ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice Read and write to persistent storage at a fraction of the cost. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SSTORE2.sol) /// @author Saw-mon-and-Natalie (https://github.com/Saw-mon-and-Natalie) /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SSTORE2.sol) /// @author Modified from 0xSequence (https://github.com/0xSequence/sstore2/blob/master/contracts/SSTORE2.sol) /// @author Modified from SSTORE3 (https://github.com/Philogy/sstore3) library SSTORE2 { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTANTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The proxy initialization code. uint256 private constant _CREATE3_PROXY_INITCODE = 0x67363d3d37363d34f03d5260086018f3; /// @dev Hash of the `_CREATE3_PROXY_INITCODE`. /// Equivalent to `keccak256(abi.encodePacked(hex"67363d3d37363d34f03d5260086018f3"))`. bytes32 internal constant CREATE3_PROXY_INITCODE_HASH = 0x21c35dbe1b344a2488cf3321d6ce542f8e9f305544ff09e4993a62319a497c1f; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Unable to deploy the storage contract. error DeploymentFailed(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* WRITE LOGIC */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Writes `data` into the bytecode of a storage contract and returns its address. function write(bytes memory data) internal returns (address pointer) { /// @solidity memory-safe-assembly assembly { let n := mload(data) // Let `l` be `n + 1`. +1 as we prefix a STOP opcode. /** * ---------------------------------------------------+ * Opcode | Mnemonic | Stack | Memory | * ---------------------------------------------------| * 61 l | PUSH2 l | l | | * 80 | DUP1 | l l | | * 60 0xa | PUSH1 0xa | 0xa l l | | * 3D | RETURNDATASIZE | 0 0xa l l | | * 39 | CODECOPY | l | [0..l): code | * 3D | RETURNDATASIZE | 0 l | [0..l): code | * F3 | RETURN | | [0..l): code | * 00 | STOP | | | * ---------------------------------------------------+ * @dev Prefix the bytecode with a STOP opcode to ensure it cannot be called. * Also PUSH2 is used since max contract size cap is 24,576 bytes which is less than 2 ** 16. */ // Do a out-of-gas revert if `n + 1` is more than 2 bytes. mstore(add(data, gt(n, 0xfffe)), add(0xfe61000180600a3d393df300, shl(0x40, n))) // Deploy a new contract with the generated creation code. pointer := create(0, add(data, 0x15), add(n, 0xb)) if iszero(pointer) { mstore(0x00, 0x30116425) // `DeploymentFailed()`. revert(0x1c, 0x04) } mstore(data, n) // Restore the length of `data`. } } /// @dev Writes `data` into the bytecode of a storage contract with `salt` /// and returns its normal CREATE2 deterministic address. function writeCounterfactual(bytes memory data, bytes32 salt) internal returns (address pointer) { /// @solidity memory-safe-assembly assembly { let n := mload(data) // Do a out-of-gas revert if `n + 1` is more than 2 bytes. mstore(add(data, gt(n, 0xfffe)), add(0xfe61000180600a3d393df300, shl(0x40, n))) // Deploy a new contract with the generated creation code. pointer := create2(0, add(data, 0x15), add(n, 0xb), salt) if iszero(pointer) { mstore(0x00, 0x30116425) // `DeploymentFailed()`. revert(0x1c, 0x04) } mstore(data, n) // Restore the length of `data`. } } /// @dev Writes `data` into the bytecode of a storage contract and returns its address. /// This uses the so-called "CREATE3" workflow, /// which means that `pointer` is agnostic to `data, and only depends on `salt`. function writeDeterministic(bytes memory data, bytes32 salt) internal returns (address pointer) { /// @solidity memory-safe-assembly assembly { let n := mload(data) mstore(0x00, _CREATE3_PROXY_INITCODE) // Store the `_PROXY_INITCODE`. let proxy := create2(0, 0x10, 0x10, salt) if iszero(proxy) { mstore(0x00, 0x30116425) // `DeploymentFailed()`. revert(0x1c, 0x04) } mstore(0x14, proxy) // Store the proxy's address. // 0xd6 = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x01). // 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex). mstore(0x00, 0xd694) mstore8(0x34, 0x01) // Nonce of the proxy contract (1). pointer := keccak256(0x1e, 0x17) // Do a out-of-gas revert if `n + 1` is more than 2 bytes. mstore(add(data, gt(n, 0xfffe)), add(0xfe61000180600a3d393df300, shl(0x40, n))) if iszero( mul( // The arguments of `mul` are evaluated last to first. extcodesize(pointer), call(gas(), proxy, 0, add(data, 0x15), add(n, 0xb), codesize(), 0x00) ) ) { mstore(0x00, 0x30116425) // `DeploymentFailed()`. revert(0x1c, 0x04) } mstore(data, n) // Restore the length of `data`. } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ADDRESS CALCULATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the initialization code hash of the storage contract for `data`. /// Used for mining vanity addresses with create2crunch. function initCodeHash(bytes memory data) internal pure returns (bytes32 hash) { /// @solidity memory-safe-assembly assembly { let n := mload(data) // Do a out-of-gas revert if `n + 1` is more than 2 bytes. returndatacopy(returndatasize(), returndatasize(), gt(n, 0xfffe)) mstore(data, add(0x61000180600a3d393df300, shl(0x40, n))) hash := keccak256(add(data, 0x15), add(n, 0xb)) mstore(data, n) // Restore the length of `data`. } } /// @dev Equivalent to `predictCounterfactualAddress(data, salt, address(this))` function predictCounterfactualAddress(bytes memory data, bytes32 salt) internal view returns (address pointer) { pointer = predictCounterfactualAddress(data, salt, address(this)); } /// @dev Returns the CREATE2 address of the storage contract for `data` /// deployed with `salt` by `deployer`. /// Note: The returned result has dirty upper 96 bits. Please clean if used in assembly. function predictCounterfactualAddress(bytes memory data, bytes32 salt, address deployer) internal pure returns (address predicted) { bytes32 hash = initCodeHash(data); /// @solidity memory-safe-assembly assembly { // Compute and store the bytecode hash. mstore8(0x00, 0xff) // Write the prefix. mstore(0x35, hash) mstore(0x01, shl(96, deployer)) mstore(0x15, salt) predicted := keccak256(0x00, 0x55) // Restore the part of the free memory pointer that has been overwritten. mstore(0x35, 0) } } /// @dev Equivalent to `predictDeterministicAddress(salt, address(this))`. function predictDeterministicAddress(bytes32 salt) internal view returns (address pointer) { pointer = predictDeterministicAddress(salt, address(this)); } /// @dev Returns the "CREATE3" deterministic address for `salt` with `deployer`. function predictDeterministicAddress(bytes32 salt, address deployer) internal pure returns (address pointer) { /// @solidity memory-safe-assembly assembly { let m := mload(0x40) // Cache the free memory pointer. mstore(0x00, deployer) // Store `deployer`. mstore8(0x0b, 0xff) // Store the prefix. mstore(0x20, salt) // Store the salt. mstore(0x40, CREATE3_PROXY_INITCODE_HASH) // Store the bytecode hash. mstore(0x14, keccak256(0x0b, 0x55)) // Store the proxy's address. mstore(0x40, m) // Restore the free memory pointer. // 0xd6 = 0xc0 (short RLP prefix) + 0x16 (length of: 0x94 ++ proxy ++ 0x01). // 0x94 = 0x80 + 0x14 (0x14 = the length of an address, 20 bytes, in hex). mstore(0x00, 0xd694) mstore8(0x34, 0x01) // Nonce of the proxy contract (1). pointer := keccak256(0x1e, 0x17) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* READ LOGIC */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Equivalent to `read(pointer, 0, 2 ** 256 - 1)`. function read(address pointer) internal view returns (bytes memory data) { /// @solidity memory-safe-assembly assembly { data := mload(0x40) let n := and(sub(extcodesize(pointer), 0x01), 0xffffffffff) extcodecopy(pointer, add(data, 0x1f), 0x00, add(n, 0x21)) mstore(data, n) // Store the length. mstore(0x40, add(n, add(data, 0x40))) // Allocate memory. } } /// @dev Equivalent to `read(pointer, start, 2 ** 256 - 1)`. function read(address pointer, uint256 start) internal view returns (bytes memory data) { /// @solidity memory-safe-assembly assembly { data := mload(0x40) let n := and(sub(extcodesize(pointer), 0x01), 0xffffffffff) extcodecopy(pointer, add(data, 0x1f), start, add(n, 0x21)) mstore(data, mul(sub(n, start), lt(start, n))) // Store the length. mstore(0x40, add(data, add(0x40, mload(data)))) // Allocate memory. } } /// @dev Returns a slice of the data on `pointer` from `start` to `end`. /// `start` and `end` will be clamped to the range `[0, args.length]`. /// The `pointer` MUST be deployed via the SSTORE2 write functions. /// Otherwise, the behavior is undefined. /// Out-of-gas reverts if `pointer` does not have any code. function read(address pointer, uint256 start, uint256 end) internal view returns (bytes memory data) { /// @solidity memory-safe-assembly assembly { data := mload(0x40) if iszero(lt(end, 0xffff)) { end := 0xffff } let d := mul(sub(end, start), lt(start, end)) extcodecopy(pointer, add(data, 0x1f), start, add(d, 0x01)) if iszero(and(0xff, mload(add(data, d)))) { let n := sub(extcodesize(pointer), 0x01) returndatacopy(returndatasize(), returndatasize(), shr(64, n)) d := mul(gt(n, start), sub(d, mul(gt(end, n), sub(end, n)))) } mstore(data, d) // Store the length. mstore(add(add(data, 0x20), d), 0) // Zeroize the slot after the bytes. mstore(0x40, add(add(data, 0x40), d)) // Allocate memory. } } }
{ "viaIR": false, "optimizer": { "enabled": true, "runs": 1000 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract ABI
API[{"inputs":[{"internalType":"uint256[4]","name":"publicKey_","type":"uint256[4]"},{"internalType":"uint256","name":"genesisTimestamp_","type":"uint256"},{"internalType":"uint256","name":"period_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256[4]","name":"input","type":"uint256[4]"}],"name":"BNAddFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"genesisTimestamp","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"}],"name":"InvalidBeaconConfiguration","type":"error"},{"inputs":[{"internalType":"bytes","name":"dst","type":"bytes"}],"name":"InvalidDSTLength","type":"error"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"InvalidFieldElement","type":"error"},{"inputs":[{"internalType":"uint256[4]","name":"pubKey","type":"uint256[4]"}],"name":"InvalidPublicKey","type":"error"},{"inputs":[{"internalType":"uint256[4]","name":"pubKey","type":"uint256[4]"},{"internalType":"uint256[2]","name":"message","type":"uint256[2]"},{"internalType":"uint256[2]","name":"signature","type":"uint256[2]"}],"name":"InvalidSignature","type":"error"},{"inputs":[{"internalType":"uint256","name":"noSqrt","type":"uint256"}],"name":"MapToPointFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"base","type":"uint256"},{"internalType":"uint256","name":"exponent","type":"uint256"},{"internalType":"uint256","name":"modulus","type":"uint256"}],"name":"ModExpFailed","type":"error"},{"inputs":[],"name":"DST","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"data","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"period","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicKey","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicKeyHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"round","type":"uint256"},{"internalType":"uint256[2]","name":"signature","type":"uint256[2]"}],"name":"verifyBeaconRound","outputs":[],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a060405234801561001057600080fd5b5060405161271f38038061271f83398101604081905261002f91610483565b6100388361016c565b610060578260405163c7728ee960e01b8152600401610057919061050f565b60405180910390fd5b825160208085015160408087015160608089015183519586019690965291840192909252820152608081019190915260009060a001604051602081830303815290604052905082600014806100b3575081155b156100db57604051634b55885360e11b81526004810184905260248101839052604401610057565b6101088184846040516020016100f393929190610540565b60408051601f198184030181529190526101f4565b6001600160a01b031660805280516020820120610123610238565b805190602001201461013757610137610577565b8261014061025a565b1461014d5761014d610577565b81610156610285565b1461016357610163610577565b505050506105c7565b80516000906000805160206126ff83398151915211158061019f575060208201516000805160206126ff83398151915211155b806101d8575060408201516000805160206126ff8339815191521115806101d8575060608201516000805160206126ff83398151915211155b156101e557506000919050565b6101ee8261029d565b92915050565b600081518060401b6bfe61000180600a3d393df3000161fffe8211840152600b8101601584016000f09150816102325763301164256000526004601cfd5b90915290565b6060610255608051600060806000610250919061058d565b610404565b905090565b6000610272608051608060206080610250919061058d565b80602001905181019061025591906105ae565b600061027260805160a0602060a0610250919061058d565b6000815160208301516000805160206126ff8339815191528283096000805160206126ff83398151915282830981828301016000805160206126ff83398151915282838401086000805160206126ff83398151915286826000805160206126ff833981519152038601099350506000805160206126ff83398151915284836000805160206126ff8339815191520383010991506000805160206126ff8339815191527f2b149d40ceb8aaae81be18991be06ac3b5b4c5e559dbefa33267e6dc24a138e5840894506000805160206126ff8339815191527e9713b03af0fed4cd2cafadeed8fdf4a74fa084e52d1852e4a2bd0685c315d28308935060408701519250606087015191506000805160206126ff83398151915280836000805160206126ff8339815191520385086000805160206126ff8339815191528486080990506000805160206126ff833981519152828460011b0994149290931491909116949350505050565b60405161ffff82106104165761ffff91505b818310838303026001810184601f8401873c8082015160ff16610450576001853b038060401c3d3d3e808403818511028203858211029150505b808252600081602084010152806040830101604052509392505050565b634e487b7160e01b600052604160045260246000fd5b600080600060c0848603121561049857600080fd5b84601f8501126104a757600080fd5b604051608081016001600160401b03811182821017156104c9576104c961046d565b6040528060808601878111156104de57600080fd5b865b818110156104f85780518352602092830192016104e0565b505160a09690960151919795965090949350505050565b60808101818360005b6004811015610537578151835260209283019290910190600101610518565b50505092915050565b6000845160005b818110156105615760208188018101518583015201610547565b5091909101928352506020820152604001919050565b634e487b7160e01b600052600160045260246000fd5b808201808211156101ee57634e487b7160e01b600052601160045260246000fd5b6000602082840312156105c057600080fd5b5051919050565b6080516121096105f66000396000818160bf01528181610164015281816101a101526102ce01526121096000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c806373d4a13a1161005b57806373d4a13a146100ba578063cacf66ab14610106578063e3d4ff161461010e578063ef78d4fd1461012357600080fd5b80635e7e3416146100825780635f7c75221461009d57806363ffab31146100b2575b600080fd5b61008a61012b565b6040519081526020015b60405180910390f35b6100a5610141565b6040516100949190611d5e565b6100a561015d565b6100e17f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610094565b61008a61019a565b61012161011c366004611da7565b6101e0565b005b61008a6102c7565b600061013561015d565b80519060200120905090565b6040518060600160405280602b81526020016120a9602b913981565b60606101957f00000000000000000000000000000000000000000000000000000000000000006000610190608082611e46565b6102fa565b905090565b60006101cd7f00000000000000000000000000000000000000000000000000000000000000006080610190602082611e46565b8060200190518101906101959190611e59565b604080516020808252818301909252600091602082018180368337505050600084815260086018206020830152909150610218610363565b9050600061023e6040518060600160405280602b81526020016120a9602b9139846103b3565b9050600061024b8561046e565b90508061027a57828286604051630b8cf7d360e41b815260040161027193929190611ebe565b60405180910390fd5b6000806102888786866104b7565b915091508061029957610299611eef565b816102bd57848488604051630b8cf7d360e41b815260040161027193929190611ebe565b5050505050505050565b60006101cd7f000000000000000000000000000000000000000000000000000000000000000060a0610190602082611e46565b60405161ffff821061030c5761ffff91505b818310838303026001810184601f8401873c8082015160ff16610346576001853b038060401c3d3d3e808403818511028203858211029150505b808252600081602084010152806040830101604052509392505050565b61036b611ce0565b60008060008061037961015d565b80602001905181019061038c9190611f05565b60408051608081018252948552602085019390935291830152606082015295945050505050565b6103bb611cfe565b60006103c7848461066e565b905060006103db82825b602002015161075c565b905060006103ea8360016103d1565b90506103f4611ce0565b825181526020808401518282015282516040808401919091529083015160608301526000908460808460066107d05a03fa90508061046057816040517f128e3f080000000000000000000000000000000000000000000000000000000081526004016102719190611f51565b509193505050505b92915050565b80516000906000805160206120898339815191521115806104a15750602082015160008051602061208983398151915211155b156104ae57506000919050565b61046882610a9a565b6000806000604051806101800160405280876000600281106104db576104db611f3b565b60200201518152602001876001600281106104f8576104f8611f3b565b602002015181526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81526020017f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d8152602001856000600281106105ad576105ad611f3b565b60200201518152602001856001600281106105ca576105ca611f3b565b60200201518152602001866001600481106105e7576105e7611f3b565b602002015181526020018660006004811061060457610604611f3b565b602002015181526020018660036004811061062157610621611f3b565b602002015181526020018660026004811061063e5761063e611f3b565b60200201519052905061064f611d1c565b6020816101808460086107d05a03fa9051151597909650945050505050565b610676611cfe565b60006106828484610af9565b90506000806000806018850177ffffffffffffffffffffffffffffffffffffffffffffffff815116935060308601905077ffffffffffffffffffffffffffffffffffffffffffffffff815116945060008051602061208983398151915285600080516020612089833981519152600160c01b8709086048870151606088015177ffffffffffffffffffffffffffffffffffffffffffffffff9081169750169450925060008051602061208983398151915290508481600160c01b860908604080518082019091529283526020830152509695505050505050565b610764611cfe565b60008051602061208983398151915282106107ae576040517fd53e941500000000000000000000000000000000000000000000000000000000815260048101839052602401610271565b60006000805160206120898339815191526004600080516020612089833981519152858609099050600060008051602061208983398151915282600108905060008051602061208983398151915261081483600080516020612089833981519152611f5f565b60010891506000610835600080516020612089833981519152838509610c72565b9050600060008051602061208983398151915278016789af3a83522eb353c98fc6b36d713d5d8d1cc5dffffffa60008051602061208983398151915284600080516020612089833981519152888b090909905060006000805160206120898339815191526108b183600080516020612089833981519152611f5f565b7f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea30890506000600080516020612089833981519152837f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea308905060006000805160206120898339815191528687099050600060008051602061208983398151915286830990506000600080516020612089833981519152806000805160206120898339815191528485097f10216f7ba065e00de81ac1e7808072c9dd2b2385cd7b438469602eb24829a9bd09600108905060008061099661099188610c7d565b610cba565b60000b6001036109e757868c526109ac87610c7d565b90506109b781610d22565b60208e01919091529150816109e25760405163396ec77160e01b815260048101829052602401610271565b610a4b565b6109f361099187610c7d565b60000b600103610a0957858c526109ac86610c7d565b828c52610a1583610c7d565b9050610a2081610d22565b60208e0191909152915081610a4b5760405163396ec77160e01b815260048101829052602401610271565b60208c0151610a5990610d4b565b610a628e610d4b565b14610a8a5760208c0151610a8490600080516020612089833981519152611f5f565b60208d01525b5050505050505050505050919050565b600081516020830151600080516020612089833981519152828309600080516020612089833981519152838209905060008051602061208983398151915260038208905060008051602061208983398151915282830914949350505050565b815160609060ff811115610b3b57836040517f26e4f9ba0000000000000000000000000000000000000000000000000000000081526004016102719190611d5e565b60408051608880825260c08201909252600091602082018180368337019050509050600081856000606060008a88604051602001610b7f9796959493929190611f72565b604051602081830303815290604052905060008180519060200120905060008160018987604051602001610bb69493929190612013565b60408051808303601f190181528282528051602082012060608085526080850190935290935091600091602082018180368337019050509050600360015b81811015610c5457858418610c0a826001611e46565b8d8b604051602001610c1f9493929190612013565b60408051808303601f190181529190526020600019830181028501810195909552805194810194909420939450600101610bf4565b50600019016020908102820101919091529550505050505092915050565b600061046882610d58565b6000600080516020612089833981519152600360008051602061208983398151915284600080516020612089833981519152868709090892915050565b600080610cc68361149f565b9050610ce16001600080516020612089833981519152611f5f565b8103610cf1575060001992915050565b8015801590610d01575080600114155b156104685760405163396ec77160e01b815260048101849052602401610271565b600080610d2e836115ab565b915082600080516020612089833981519152838409149050915091565b6000610468600283612066565b60006000805160206120898339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996505050838586099450838586099450838586099450838586099450838186099450508284850993508284850993508284850993508281850993508284850993508284850993508285850993508284850993508284850993508284850993508284850993508284850993508284850993508281850995945050505050565b6040805160c080825260e082019092526000918291906020820181803683370190505060208082018181526040830182905260608301829052608083018690527f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea360a084015260008051602061208983398151915260c080850191909152929350600092839160055afa90506000519250806115a4576040517fc6daf7ab000000000000000000000000000000000000000000000000000000008152600481018590527f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea360248201526000805160206120898339815191526044820152606401610271565b5050919050565b60006000805160206120898339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508584880996508587880996508587880996508587880996508587880996508587880996508581880996505050505050808283099392505050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b60005b83811015611d55578181015183820152602001611d3d565b50506000910152565b6020815260008251806020840152611d7d816040850160208701611d3a565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b60008060608385031215611dba57600080fd5b82359150603f83018413611dcd57600080fd5b6040516040810181811067ffffffffffffffff82111715611df057611df0611d91565b604052806060850186811115611e0557600080fd5b602086015b81811015611e22578035835260209283019201611e0a565b505050809150509250929050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561046857610468611e30565b600060208284031215611e6b57600080fd5b5051919050565b8060005b6004811015611e95578151845260209384019390910190600101611e76565b50505050565b8060005b6002811015611e95578151845260209384019390910190600101611e9f565b6101008101611ecd8286611e72565b611eda6080830185611e9b565b611ee760c0830184611e9b565b949350505050565b634e487b7160e01b600052600160045260246000fd5b60008060008060808587031215611f1b57600080fd5b505082516020840151604085015160609095015191969095509092509050565b634e487b7160e01b600052603260045260246000fd5b608081016104688284611e72565b8181038181111561046857610468611e30565b60008851611f84818460208d01611d3a565b885190830190611f98818360208d01611d3a565b8082019150506001600160f81b03198860f81b1681526001600160f81b03198760f81b1660018201526001600160f81b03198660f81b1660028201528451611fe7816003840160208901611d3a565b8082019150506001600160f81b03198460f81b1660038201526004810191505098975050505050505050565b8481526001600160f81b03198460f81b1660208201526000835161203e816021850160208801611d3a565b80830190506001600160f81b03198460f81b1660218201526022810191505095945050505050565b60008261208357634e487b7160e01b600052601260045260246000fd5b50069056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47424c535f5349475f424e32353447315f584d443a4b454343414b2d3235365f535644575f524f5f4e554c5fa26469706673582212201ffc0da30ba6942682e5429b8347d6cf43d2e9ab45fda42101ba0a29da06976064736f6c634300081c003330644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd470557ec32c2ad488e4d4f6008f89a346f18492092ccc0d594610de2732c8b808f07e1d1d335df83fa98462005690372c643340060d205306a9aa8106b6bd0b382297d3a4f9749b33eb2d904c9d9ebf17224150ddd7abd7567a9bec6c74480ee0b0095685ae3a85ba243747b1b2f426049010f6b73a0cf1d389351d5aaaa1047f60000000000000000000000000000000000000000000000000000000066f7e1330000000000000000000000000000000000000000000000000000000000000003
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061007d5760003560e01c806373d4a13a1161005b57806373d4a13a146100ba578063cacf66ab14610106578063e3d4ff161461010e578063ef78d4fd1461012357600080fd5b80635e7e3416146100825780635f7c75221461009d57806363ffab31146100b2575b600080fd5b61008a61012b565b6040519081526020015b60405180910390f35b6100a5610141565b6040516100949190611d5e565b6100a561015d565b6100e17f0000000000000000000000006ff198788e339ec256d8c82ca03b791887e31e9c81565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610094565b61008a61019a565b61012161011c366004611da7565b6101e0565b005b61008a6102c7565b600061013561015d565b80519060200120905090565b6040518060600160405280602b81526020016120a9602b913981565b60606101957f0000000000000000000000006ff198788e339ec256d8c82ca03b791887e31e9c6000610190608082611e46565b6102fa565b905090565b60006101cd7f0000000000000000000000006ff198788e339ec256d8c82ca03b791887e31e9c6080610190602082611e46565b8060200190518101906101959190611e59565b604080516020808252818301909252600091602082018180368337505050600084815260086018206020830152909150610218610363565b9050600061023e6040518060600160405280602b81526020016120a9602b9139846103b3565b9050600061024b8561046e565b90508061027a57828286604051630b8cf7d360e41b815260040161027193929190611ebe565b60405180910390fd5b6000806102888786866104b7565b915091508061029957610299611eef565b816102bd57848488604051630b8cf7d360e41b815260040161027193929190611ebe565b5050505050505050565b60006101cd7f0000000000000000000000006ff198788e339ec256d8c82ca03b791887e31e9c60a0610190602082611e46565b60405161ffff821061030c5761ffff91505b818310838303026001810184601f8401873c8082015160ff16610346576001853b038060401c3d3d3e808403818511028203858211029150505b808252600081602084010152806040830101604052509392505050565b61036b611ce0565b60008060008061037961015d565b80602001905181019061038c9190611f05565b60408051608081018252948552602085019390935291830152606082015295945050505050565b6103bb611cfe565b60006103c7848461066e565b905060006103db82825b602002015161075c565b905060006103ea8360016103d1565b90506103f4611ce0565b825181526020808401518282015282516040808401919091529083015160608301526000908460808460066107d05a03fa90508061046057816040517f128e3f080000000000000000000000000000000000000000000000000000000081526004016102719190611f51565b509193505050505b92915050565b80516000906000805160206120898339815191521115806104a15750602082015160008051602061208983398151915211155b156104ae57506000919050565b61046882610a9a565b6000806000604051806101800160405280876000600281106104db576104db611f3b565b60200201518152602001876001600281106104f8576104f8611f3b565b602002015181526020017f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f275dc4a288d1afb3cbb1ac09187524c7db36395df7be3b99e673b13a075a65ec81526020017f1d9befcd05a5323e6da4d435f3b617cdb3af83285c2df711ef39c01571827f9d8152602001856000600281106105ad576105ad611f3b565b60200201518152602001856001600281106105ca576105ca611f3b565b60200201518152602001866001600481106105e7576105e7611f3b565b602002015181526020018660006004811061060457610604611f3b565b602002015181526020018660036004811061062157610621611f3b565b602002015181526020018660026004811061063e5761063e611f3b565b60200201519052905061064f611d1c565b6020816101808460086107d05a03fa9051151597909650945050505050565b610676611cfe565b60006106828484610af9565b90506000806000806018850177ffffffffffffffffffffffffffffffffffffffffffffffff815116935060308601905077ffffffffffffffffffffffffffffffffffffffffffffffff815116945060008051602061208983398151915285600080516020612089833981519152600160c01b8709086048870151606088015177ffffffffffffffffffffffffffffffffffffffffffffffff9081169750169450925060008051602061208983398151915290508481600160c01b860908604080518082019091529283526020830152509695505050505050565b610764611cfe565b60008051602061208983398151915282106107ae576040517fd53e941500000000000000000000000000000000000000000000000000000000815260048101839052602401610271565b60006000805160206120898339815191526004600080516020612089833981519152858609099050600060008051602061208983398151915282600108905060008051602061208983398151915261081483600080516020612089833981519152611f5f565b60010891506000610835600080516020612089833981519152838509610c72565b9050600060008051602061208983398151915278016789af3a83522eb353c98fc6b36d713d5d8d1cc5dffffffa60008051602061208983398151915284600080516020612089833981519152888b090909905060006000805160206120898339815191526108b183600080516020612089833981519152611f5f565b7f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea30890506000600080516020612089833981519152837f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea308905060006000805160206120898339815191528687099050600060008051602061208983398151915286830990506000600080516020612089833981519152806000805160206120898339815191528485097f10216f7ba065e00de81ac1e7808072c9dd2b2385cd7b438469602eb24829a9bd09600108905060008061099661099188610c7d565b610cba565b60000b6001036109e757868c526109ac87610c7d565b90506109b781610d22565b60208e01919091529150816109e25760405163396ec77160e01b815260048101829052602401610271565b610a4b565b6109f361099187610c7d565b60000b600103610a0957858c526109ac86610c7d565b828c52610a1583610c7d565b9050610a2081610d22565b60208e0191909152915081610a4b5760405163396ec77160e01b815260048101829052602401610271565b60208c0151610a5990610d4b565b610a628e610d4b565b14610a8a5760208c0151610a8490600080516020612089833981519152611f5f565b60208d01525b5050505050505050505050919050565b600081516020830151600080516020612089833981519152828309600080516020612089833981519152838209905060008051602061208983398151915260038208905060008051602061208983398151915282830914949350505050565b815160609060ff811115610b3b57836040517f26e4f9ba0000000000000000000000000000000000000000000000000000000081526004016102719190611d5e565b60408051608880825260c08201909252600091602082018180368337019050509050600081856000606060008a88604051602001610b7f9796959493929190611f72565b604051602081830303815290604052905060008180519060200120905060008160018987604051602001610bb69493929190612013565b60408051808303601f190181528282528051602082012060608085526080850190935290935091600091602082018180368337019050509050600360015b81811015610c5457858418610c0a826001611e46565b8d8b604051602001610c1f9493929190612013565b60408051808303601f190181529190526020600019830181028501810195909552805194810194909420939450600101610bf4565b50600019016020908102820101919091529550505050505092915050565b600061046882610d58565b6000600080516020612089833981519152600360008051602061208983398151915284600080516020612089833981519152868709090892915050565b600080610cc68361149f565b9050610ce16001600080516020612089833981519152611f5f565b8103610cf1575060001992915050565b8015801590610d01575080600114155b156104685760405163396ec77160e01b815260048101849052602401610271565b600080610d2e836115ab565b915082600080516020612089833981519152838409149050915091565b6000610468600283612066565b60006000805160206120898339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996505050838586099450838586099450838586099450838586099450838186099450508284850993508284850993508284850993508281850993508284850993508284850993508285850993508284850993508284850993508284850993508284850993508284850993508284850993508281850995945050505050565b6040805160c080825260e082019092526000918291906020820181803683370190505060208082018181526040830182905260608301829052608083018690527f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea360a084015260008051602061208983398151915260c080850191909152929350600092839160055afa90506000519250806115a4576040517fc6daf7ab000000000000000000000000000000000000000000000000000000008152600481018590527f183227397098d014dc2822db40c0ac2ecbc0b548b438e5469e10460b6c3e7ea360248201526000805160206120898339815191526044820152606401610271565b5050919050565b60006000805160206120898339815191528083840991508083830981838209828283098385830984848309858484098684850997508684840987858409945087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087878a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a09985087898a09985087898a09985087898a09985087838a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087828a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087848a09985087898a09985087898a09985087898a09985087898a09985087898a09985087868a09985087898a09985087898a099850878a8a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087898a09985087818a09985050868889099750868889099750868889099750868889099750868889099750868889099750868489099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868889099750868989099750868889099750868889099750868889099750868889099750868889099750868689099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868889099750868189099750508587880996508587880996508587880996508585880996508587880996508587880996508587880996508585880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508587880996508581880996508587880996508587880996508587880996508587880996508583880996508587880996508587880996508587880996508584880996508587880996508587880996508587880996508587880996508587880996508581880996505050505050808283099392505050565b60405180608001604052806004906020820280368337509192915050565b60405180604001604052806002906020820280368337509192915050565b60405180602001604052806001906020820280368337509192915050565b60005b83811015611d55578181015183820152602001611d3d565b50506000910152565b6020815260008251806020840152611d7d816040850160208701611d3a565b601f01601f19169190910160400192915050565b634e487b7160e01b600052604160045260246000fd5b60008060608385031215611dba57600080fd5b82359150603f83018413611dcd57600080fd5b6040516040810181811067ffffffffffffffff82111715611df057611df0611d91565b604052806060850186811115611e0557600080fd5b602086015b81811015611e22578035835260209283019201611e0a565b505050809150509250929050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561046857610468611e30565b600060208284031215611e6b57600080fd5b5051919050565b8060005b6004811015611e95578151845260209384019390910190600101611e76565b50505050565b8060005b6002811015611e95578151845260209384019390910190600101611e9f565b6101008101611ecd8286611e72565b611eda6080830185611e9b565b611ee760c0830184611e9b565b949350505050565b634e487b7160e01b600052600160045260246000fd5b60008060008060808587031215611f1b57600080fd5b505082516020840151604085015160609095015191969095509092509050565b634e487b7160e01b600052603260045260246000fd5b608081016104688284611e72565b8181038181111561046857610468611e30565b60008851611f84818460208d01611d3a565b885190830190611f98818360208d01611d3a565b8082019150506001600160f81b03198860f81b1681526001600160f81b03198760f81b1660018201526001600160f81b03198660f81b1660028201528451611fe7816003840160208901611d3a565b8082019150506001600160f81b03198460f81b1660038201526004810191505098975050505050505050565b8481526001600160f81b03198460f81b1660208201526000835161203e816021850160208801611d3a565b80830190506001600160f81b03198460f81b1660218201526022810191505095945050505050565b60008261208357634e487b7160e01b600052601260045260246000fd5b50069056fe30644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd47424c535f5349475f424e32353447315f584d443a4b454343414b2d3235365f535644575f524f5f4e554c5fa26469706673582212201ffc0da30ba6942682e5429b8347d6cf43d2e9ab45fda42101ba0a29da06976064736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0557ec32c2ad488e4d4f6008f89a346f18492092ccc0d594610de2732c8b808f07e1d1d335df83fa98462005690372c643340060d205306a9aa8106b6bd0b382297d3a4f9749b33eb2d904c9d9ebf17224150ddd7abd7567a9bec6c74480ee0b0095685ae3a85ba243747b1b2f426049010f6b73a0cf1d389351d5aaaa1047f60000000000000000000000000000000000000000000000000000000066f7e1330000000000000000000000000000000000000000000000000000000000000003
-----Decoded View---------------
Arg [0] : publicKey_ (uint256[4]): 2416910118189096557713698606232949750075245832257361418817199221841198809231,3565178688866727608783247307855519961161197286613423629330948765523825963906,18766085122067595057703228467555884757373773082319035490740181099798629248523,263980444642394177375858669180402387903005329333277938776544051059273779190
Arg [1] : genesisTimestamp_ (uint256): 1727521075
Arg [2] : period_ (uint256): 3
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0557ec32c2ad488e4d4f6008f89a346f18492092ccc0d594610de2732c8b808f
Arg [1] : 07e1d1d335df83fa98462005690372c643340060d205306a9aa8106b6bd0b382
Arg [2] : 297d3a4f9749b33eb2d904c9d9ebf17224150ddd7abd7567a9bec6c74480ee0b
Arg [3] : 0095685ae3a85ba243747b1b2f426049010f6b73a0cf1d389351d5aaaa1047f6
Arg [4] : 0000000000000000000000000000000000000000000000000000000066f7e133
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.