ETH Price: $3,327.85 (+0.17%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Remove Group Pub...151208402022-07-11 10:30:58928 days ago1657535458IN
0xE4F8d9A3...3BBABD51A
0 ETH0.0004028314.77578121
Add Group Public...151208272022-07-11 10:27:20928 days ago1657535240IN
0xE4F8d9A3...3BBABD51A
0 ETH0.0004171712.03228729
Add Group Public...151208152022-07-11 10:25:48928 days ago1657535148IN
0xE4F8d9A3...3BBABD51A
0 ETH0.0011173215.00351098
Add Group Public...151208072022-07-11 10:24:01928 days ago1657535041IN
0xE4F8d9A3...3BBABD51A
0 ETH0.0005137514.81786081
Add Group Public...150825202022-07-05 12:29:07934 days ago1657024147IN
0xE4F8d9A3...3BBABD51A
0 ETH0.0004882413.02988904
Add Group Public...150712682022-07-03 18:46:04936 days ago1656873964IN
0xE4F8d9A3...3BBABD51A
0 ETH0.0022400330.11327266
Add Group Public...140288802022-01-18 10:09:191102 days ago1642500559IN
0xE4F8d9A3...3BBABD51A
0 ETH0.00754042101.25315208

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MuonV02

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 4 : MuonV02.sol
// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.7.0 <0.9.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "./SchnorrSECP256K1.sol";

contract MuonV02 is Ownable {

    event Transaction(bytes reqId, address[] groups);

    SchnorrSECP256K1 schnorr;

    struct PublicKey {
        uint256 x;
        uint8 parity;
    }

    struct SchnorrSign {
        uint256 signature;
        address owner;
        address nonce;
    }

    mapping(address => PublicKey) public groupsPubKey;

    constructor(address _schnorrLib, address _groupAddress, uint256 _groupPubKeyX, uint8 _groupPubKeyYParity){
        schnorr = SchnorrSECP256K1(_schnorrLib);
        addGroupPublicKey(_groupAddress, _groupPubKeyX, _groupPubKeyYParity);
    }

    function verify(bytes calldata _reqId, uint256 _hash, SchnorrSign[] calldata _sigs) public returns (bool) 
    {
        require(_sigs.length > 0, '!_sigs');

        PublicKey memory pub;
        address[] memory groups = new address[](_sigs.length);
        for(uint i=0 ; i<_sigs.length; i++){
            pub = groupsPubKey[_sigs[i].owner];
            if(pub.x == 0)
                return false;
            if(!schnorr.verifySignature(pub.x, pub.parity, _sigs[i].signature, _hash, _sigs[i].nonce) || (i>0 && _sigs[i].owner <= groups[i-1]))
                return false;
            groups[i] = _sigs[i].owner;
        }
        emit Transaction(_reqId, groups);
        return true;
    }

    function addGroupPublicKey(address _address, uint256 _pubX, uint8 _pubYParity) public onlyOwner {
        schnorr.validatePubKey(_pubX);
        groupsPubKey[_address] = PublicKey(_pubX, _pubYParity);
    }

    function removeGroupPublicKey(address _groupAddress) public onlyOwner {
        delete groupsPubKey[_groupAddress];
    }

    function setLibAddress(address _schnorrLib) public onlyOwner {
        schnorr = SchnorrSECP256K1(_schnorrLib);
    }
}

File 2 of 4 : SchnorrSECP256K1.sol
pragma solidity  >=0.7.0 <0.9.0;

contract SchnorrSECP256K1 {
  // See https://en.bitcoin.it/wiki/Secp256k1 for this constant.
  uint256 constant public Q = // Group order of secp256k1
    // solium-disable-next-line indentation
    0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141;
  // solium-disable-next-line zeppelin/no-arithmetic-operations
  uint256 constant public HALF_Q = (Q >> 1) + 1;

  /** **************************************************************************
      @notice verifySignature returns true iff passed a valid Schnorr signature.
      @dev See https://en.wikipedia.org/wiki/Schnorr_signature for reference.
      @dev In what follows, let d be your secret key, PK be your public key,
      PKx be the x ordinate of your public key, and PKyp be the parity bit for
      the y ordinate (i.e., 0 if PKy is even, 1 if odd.)
      **************************************************************************
      @dev TO CREATE A VALID SIGNATURE FOR THIS METHOD
      @dev First PKx must be less than HALF_Q. Then follow these instructions
           (see evm/test/schnorr_test.js, for an example of carrying them out):
      @dev 1. Hash the target message to a uint256, called msgHash here, using
              keccak256
      @dev 2. Pick k uniformly and cryptographically securely randomly from
              {0,...,Q-1}. It is critical that k remains confidential, as your
              private key can be reconstructed from k and the signature.
      @dev 3. Compute k*g in the secp256k1 group, where g is the group
              generator. (This is the same as computing the public key from the
              secret key k. But it's OK if k*g's x ordinate is greater than
              HALF_Q.)
      @dev 4. Compute the ethereum address for k*g. This is the lower 160 bits
              of the keccak hash of the concatenated affine coordinates of k*g,
              as 32-byte big-endians. (For instance, you could pass k to
              ethereumjs-utils's privateToAddress to compute this, though that
              should be strictly a development convenience, not for handling
              live secrets, unless you've locked your javascript environment
              down very carefully.) Call this address
              nonceTimesGeneratorAddress.
      @dev 5. Compute e=uint256(keccak256(PKx as a 32-byte big-endian
                                        ‖ PKyp as a single byte
                                        ‖ msgHash
                                        ‖ nonceTimesGeneratorAddress))
              This value e is called "msgChallenge" in verifySignature's source
              code below. Here "‖" means concatenation of the listed byte
              arrays.
      @dev 6. Let x be your secret key. Compute s = (k - d * e) % Q. Add Q to
              it, if it's negative. This is your signature. (d is your secret
              key.)
      **************************************************************************
      @dev TO VERIFY A SIGNATURE
      @dev Given a signature (s, e) of msgHash, constructed as above, compute
      S=e*PK+s*generator in the secp256k1 group law, and then the ethereum
      address of S, as described in step 4. Call that
      nonceTimesGeneratorAddress. Then call the verifySignature method as:
      @dev    verifySignature(PKx, PKyp, s, msgHash,
                              nonceTimesGeneratorAddress)
      **************************************************************************
      @dev This signging scheme deviates slightly from the classical Schnorr
      signature, in that the address of k*g is used in place of k*g itself,
      both when calculating e and when verifying sum S as described in the
      verification paragraph above. This reduces the difficulty of
      brute-forcing a signature by trying random secp256k1 points in place of
      k*g in the signature verification process from 256 bits to 160 bits.
      However, the difficulty of cracking the public key using "baby-step,
      giant-step" is only 128 bits, so this weakening constitutes no compromise
      in the security of the signatures or the key.
      @dev The constraint signingPubKeyX < HALF_Q comes from Eq. (281), p. 24
      of Yellow Paper version 78d7b9a. ecrecover only accepts "s" inputs less
      than HALF_Q, to protect against a signature- malleability vulnerability in
      ECDSA. Schnorr does not have this vulnerability, but we must account for
      ecrecover's defense anyway. And since we are abusing ecrecover by putting
      signingPubKeyX in ecrecover's "s" argument the constraint applies to
      signingPubKeyX, even though it represents a value in the base field, and
      has no natural relationship to the order of the curve's cyclic group.
      **************************************************************************
      @param signingPubKeyX is the x ordinate of the public key. This must be
             less than HALF_Q. 
      @param pubKeyYParity is 0 if the y ordinate of the public key is even, 1 
             if it's odd.
      @param signature is the actual signature, described as s in the above
             instructions.
      @param msgHash is a 256-bit hash of the message being signed.
      @param nonceTimesGeneratorAddress is the ethereum address of k*g in the
             above instructions
      **************************************************************************
      @return True if passed a valid signature, false otherwise. */
  function verifySignature(
    uint256 signingPubKeyX,
    uint8 pubKeyYParity,
    uint256 signature,
    uint256 msgHash,
    address nonceTimesGeneratorAddress) external pure returns (bool) {
    require(signingPubKeyX < HALF_Q, "Public-key x >= HALF_Q");
    // Avoid signature malleability from multiple representations for ℤ/Qℤ elts
    require(signature < Q, "signature must be reduced modulo Q");

    // Forbid trivial inputs, to avoid ecrecover edge cases. The main thing to
    // avoid is something which causes ecrecover to return 0x0: then trivial
    // signatures could be constructed with the nonceTimesGeneratorAddress input
    // set to 0x0.
    //
    // solium-disable-next-line indentation
    require(nonceTimesGeneratorAddress != address(0) && signingPubKeyX > 0 &&
      signature > 0 && msgHash > 0, "no zero inputs allowed");

    // solium-disable-next-line indentation
    uint256 msgChallenge = // "e"
      // solium-disable-next-line indentation
      uint256(keccak256(abi.encodePacked(nonceTimesGeneratorAddress, msgHash)));

    // Verify msgChallenge * signingPubKey + signature * generator ==
    //        nonce * generator
    //
    // https://ethresear.ch/t/you-can-kinda-abuse-ecrecover-to-do-ecmul-in-secp256k1-today/2384/9
    // The point corresponding to the address returned by
    // ecrecover(-s*r,v,r,e*r) is (r⁻¹ mod Q)*(e*r*R-(-s)*r*g)=e*R+s*g, where R
    // is the (v,r) point. See https://crypto.stackexchange.com/a/18106
    //
    // solium-disable-next-line indentation
    address recoveredAddress = ecrecover(
      // solium-disable-next-line zeppelin/no-arithmetic-operations
      bytes32(Q - mulmod(signingPubKeyX, signature, Q)),
      // https://ethereum.github.io/yellowpaper/paper.pdf p. 24, "The
      // value 27 represents an even y value and 28 represents an odd
      // y value."
      (pubKeyYParity == 0) ? 27 : 28,
      bytes32(signingPubKeyX),
      bytes32(mulmod(msgChallenge, signingPubKeyX, Q)));
    return nonceTimesGeneratorAddress == recoveredAddress;
  }

  function validatePubKey (uint256 signingPubKeyX) external pure {
    require(signingPubKeyX < HALF_Q, "Public-key x >= HALF_Q");
  }
}

File 3 of 4 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 4 of 4 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "evmVersion": "istanbul",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_schnorrLib","type":"address"},{"internalType":"address","name":"_groupAddress","type":"address"},{"internalType":"uint256","name":"_groupPubKeyX","type":"uint256"},{"internalType":"uint8","name":"_groupPubKeyYParity","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"reqId","type":"bytes"},{"indexed":false,"internalType":"address[]","name":"groups","type":"address[]"}],"name":"Transaction","type":"event"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_pubX","type":"uint256"},{"internalType":"uint8","name":"_pubYParity","type":"uint8"}],"name":"addGroupPublicKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"groupsPubKey","outputs":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint8","name":"parity","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_groupAddress","type":"address"}],"name":"removeGroupPublicKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_schnorrLib","type":"address"}],"name":"setLibAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_reqId","type":"bytes"},{"internalType":"uint256","name":"_hash","type":"uint256"},{"components":[{"internalType":"uint256","name":"signature","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"nonce","type":"address"}],"internalType":"struct MuonV02.SchnorrSign[]","name":"_sigs","type":"tuple[]"}],"name":"verify","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162000dc638038062000dc68339810160408190526200003491620001f8565b62000048620000426200007a565b6200007e565b600180546001600160a01b0319166001600160a01b03861617905562000070838383620000ce565b505050506200028f565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b620000d86200007a565b6001600160a01b0316620000eb620001cc565b6001600160a01b0316146200011d5760405162461bcd60e51b8152600401620001149062000251565b60405180910390fd5b600154604051634112302560e11b81526001600160a01b0390911690638224604a906200014f90859060040162000286565b60006040518083038186803b1580156200016857600080fd5b505afa1580156200017d573d6000803e3d6000fd5b505060408051808201825294855260ff93841660208087019182526001600160a01b039790971660009081526002909752952093518455505091516001909101805460ff191691909216179055565b6000546001600160a01b031690565b80516001600160a01b0381168114620001f357600080fd5b919050565b600080600080608085870312156200020e578384fd5b6200021985620001db565b93506200022960208601620001db565b925060408501519150606085015160ff8116811462000246578182fd5b939692955090935050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b90815260200190565b610b27806200029f6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80637b3192801161005b5780637b319280146100e75780638da5cb5b146100fa578063e80876cf1461010f578063f2fde38b1461012f57610088565b80631c1e60081461008d57806325f7ee64146100b7578063537918a1146100cc578063715018a6146100df575b600080fd5b6100a061009b3660046107d8565b610142565b6040516100ae929190610a69565b60405180910390f35b6100ca6100c53660046107d8565b61015e565b005b6100ca6100da3660046107f9565b6101c8565b6100ca6102b2565b6100ca6100f53660046107d8565b6102fd565b610102610363565b6040516100ae9190610926565b61012261011d36600461085d565b610372565b6040516100ae919061093a565b6100ca61013d3660046107d8565b6106e0565b6002602052600090815260409020805460019091015460ff1682565b610166610751565b6001600160a01b0316610177610363565b6001600160a01b0316146101a65760405162461bcd60e51b815260040161019d90610a0b565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6101d0610751565b6001600160a01b03166101e1610363565b6001600160a01b0316146102075760405162461bcd60e51b815260040161019d90610a0b565b600154604051634112302560e11b81526001600160a01b0390911690638224604a90610237908590600401610a60565b60006040518083038186803b15801561024f57600080fd5b505afa158015610263573d6000803e3d6000fd5b505060408051808201825294855260ff93841660208087019182526001600160a01b039790971660009081526002909752952093518455505091516001909101805460ff191691909216179055565b6102ba610751565b6001600160a01b03166102cb610363565b6001600160a01b0316146102f15760405162461bcd60e51b815260040161019d90610a0b565b6102fb6000610755565b565b610305610751565b6001600160a01b0316610316610363565b6001600160a01b03161461033c5760405162461bcd60e51b815260040161019d90610a0b565b6001600160a01b03166000908152600260205260408120908155600101805460ff19169055565b6000546001600160a01b031690565b6000816103915760405162461bcd60e51b815260040161019d90610a40565b6103996107a5565b60008367ffffffffffffffff8111156103c257634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156103eb578160200160208202803683370190505b50905060005b84811015610694576002600087878481811061041d57634e487b7160e01b600052603260045260246000fd5b905060600201602001602081019061043591906107d8565b6001600160a01b0316815260208082019290925260409081016000208151808301909252805480835260019091015460ff1692820192909252935061048057600093505050506106d7565b600154835160208501516001600160a01b039092169163ff51dff291908989868181106104bd57634e487b7160e01b600052603260045260246000fd5b905060600201600001358b8b8b888181106104e857634e487b7160e01b600052603260045260246000fd5b905060600201604001602081019061050091906107d8565b6040518663ffffffff1660e01b8152600401610520959493929190610a7a565b60206040518083038186803b15801561053857600080fd5b505afa15801561054c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610570919061083d565b1580610601575060008111801561060157508161058e600183610aa9565b815181106105ac57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168686838181106105dd57634e487b7160e01b600052603260045260246000fd5b90506060020160200160208101906105f591906107d8565b6001600160a01b031611155b1561061257600093505050506106d7565b85858281811061063257634e487b7160e01b600052603260045260246000fd5b905060600201602001602081019061064a91906107d8565b82828151811061066a57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101528061068c81610ac0565b9150506103f1565b507fad2ed9ec4239c3ff956fe6d45ad12ecd39d916ac0e979c4c75771c8db1559f4d8888836040516106c893929190610945565b60405180910390a16001925050505b95945050505050565b6106e8610751565b6001600160a01b03166106f9610363565b6001600160a01b03161461071f5760405162461bcd60e51b815260040161019d90610a0b565b6001600160a01b0381166107455760405162461bcd60e51b815260040161019d906109c5565b61074e81610755565b50565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080518082019091526000808252602082015290565b80356001600160a01b03811681146107d357600080fd5b919050565b6000602082840312156107e9578081fd5b6107f2826107bc565b9392505050565b60008060006060848603121561080d578182fd5b610816846107bc565b925060208401359150604084013560ff81168114610832578182fd5b809150509250925092565b60006020828403121561084e578081fd5b815180151581146107f2578182fd5b600080600080600060608688031215610874578081fd5b853567ffffffffffffffff8082111561088b578283fd5b818801915088601f83011261089e578283fd5b8135818111156108ac578384fd5b8960208285010111156108bd578384fd5b602092830197509550908701359350604087013590808211156108de578283fd5b818801915088601f8301126108f1578283fd5b8135818111156108ff578384fd5b896020606083028501011115610913578384fd5b9699959850939650602001949392505050565b6001600160a01b0391909116815260200190565b901515815260200190565b600060408252836040830152838560608401378060608584010152601f19601f85011682016060810160206060858403018186015281865180845260808501915082880194508593505b808410156109b85784516001600160a01b0316825293820193600193909301929082019061098f565b5098975050505050505050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260069082015265215f7369677360d01b604082015260600190565b90815260200190565b91825260ff16602082015260400190565b94855260ff939093166020850152604084019190915260608301526001600160a01b0316608082015260a00190565b600082821015610abb57610abb610adb565b500390565b6000600019821415610ad457610ad4610adb565b5060010190565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220ba1b2e56be1b6867dd1e5a247a44a208ed8b833caca1c2b71731c415e4fd16c164736f6c6343000800003300000000000000000000000043a544dd24cb10975b7de1deec49e77f652dac66000000000000000000000000464b7df5f9171d5a27a22ca8ea20bfb59b83cfc2723485167650fce02741e1d89aaa51e09b3af91e1b4a7e2c4bb42765d9828ede0000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100885760003560e01c80637b3192801161005b5780637b319280146100e75780638da5cb5b146100fa578063e80876cf1461010f578063f2fde38b1461012f57610088565b80631c1e60081461008d57806325f7ee64146100b7578063537918a1146100cc578063715018a6146100df575b600080fd5b6100a061009b3660046107d8565b610142565b6040516100ae929190610a69565b60405180910390f35b6100ca6100c53660046107d8565b61015e565b005b6100ca6100da3660046107f9565b6101c8565b6100ca6102b2565b6100ca6100f53660046107d8565b6102fd565b610102610363565b6040516100ae9190610926565b61012261011d36600461085d565b610372565b6040516100ae919061093a565b6100ca61013d3660046107d8565b6106e0565b6002602052600090815260409020805460019091015460ff1682565b610166610751565b6001600160a01b0316610177610363565b6001600160a01b0316146101a65760405162461bcd60e51b815260040161019d90610a0b565b60405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6101d0610751565b6001600160a01b03166101e1610363565b6001600160a01b0316146102075760405162461bcd60e51b815260040161019d90610a0b565b600154604051634112302560e11b81526001600160a01b0390911690638224604a90610237908590600401610a60565b60006040518083038186803b15801561024f57600080fd5b505afa158015610263573d6000803e3d6000fd5b505060408051808201825294855260ff93841660208087019182526001600160a01b039790971660009081526002909752952093518455505091516001909101805460ff191691909216179055565b6102ba610751565b6001600160a01b03166102cb610363565b6001600160a01b0316146102f15760405162461bcd60e51b815260040161019d90610a0b565b6102fb6000610755565b565b610305610751565b6001600160a01b0316610316610363565b6001600160a01b03161461033c5760405162461bcd60e51b815260040161019d90610a0b565b6001600160a01b03166000908152600260205260408120908155600101805460ff19169055565b6000546001600160a01b031690565b6000816103915760405162461bcd60e51b815260040161019d90610a40565b6103996107a5565b60008367ffffffffffffffff8111156103c257634e487b7160e01b600052604160045260246000fd5b6040519080825280602002602001820160405280156103eb578160200160208202803683370190505b50905060005b84811015610694576002600087878481811061041d57634e487b7160e01b600052603260045260246000fd5b905060600201602001602081019061043591906107d8565b6001600160a01b0316815260208082019290925260409081016000208151808301909252805480835260019091015460ff1692820192909252935061048057600093505050506106d7565b600154835160208501516001600160a01b039092169163ff51dff291908989868181106104bd57634e487b7160e01b600052603260045260246000fd5b905060600201600001358b8b8b888181106104e857634e487b7160e01b600052603260045260246000fd5b905060600201604001602081019061050091906107d8565b6040518663ffffffff1660e01b8152600401610520959493929190610a7a565b60206040518083038186803b15801561053857600080fd5b505afa15801561054c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610570919061083d565b1580610601575060008111801561060157508161058e600183610aa9565b815181106105ac57634e487b7160e01b600052603260045260246000fd5b60200260200101516001600160a01b03168686838181106105dd57634e487b7160e01b600052603260045260246000fd5b90506060020160200160208101906105f591906107d8565b6001600160a01b031611155b1561061257600093505050506106d7565b85858281811061063257634e487b7160e01b600052603260045260246000fd5b905060600201602001602081019061064a91906107d8565b82828151811061066a57634e487b7160e01b600052603260045260246000fd5b6001600160a01b03909216602092830291909101909101528061068c81610ac0565b9150506103f1565b507fad2ed9ec4239c3ff956fe6d45ad12ecd39d916ac0e979c4c75771c8db1559f4d8888836040516106c893929190610945565b60405180910390a16001925050505b95945050505050565b6106e8610751565b6001600160a01b03166106f9610363565b6001600160a01b03161461071f5760405162461bcd60e51b815260040161019d90610a0b565b6001600160a01b0381166107455760405162461bcd60e51b815260040161019d906109c5565b61074e81610755565b50565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080518082019091526000808252602082015290565b80356001600160a01b03811681146107d357600080fd5b919050565b6000602082840312156107e9578081fd5b6107f2826107bc565b9392505050565b60008060006060848603121561080d578182fd5b610816846107bc565b925060208401359150604084013560ff81168114610832578182fd5b809150509250925092565b60006020828403121561084e578081fd5b815180151581146107f2578182fd5b600080600080600060608688031215610874578081fd5b853567ffffffffffffffff8082111561088b578283fd5b818801915088601f83011261089e578283fd5b8135818111156108ac578384fd5b8960208285010111156108bd578384fd5b602092830197509550908701359350604087013590808211156108de578283fd5b818801915088601f8301126108f1578283fd5b8135818111156108ff578384fd5b896020606083028501011115610913578384fd5b9699959850939650602001949392505050565b6001600160a01b0391909116815260200190565b901515815260200190565b600060408252836040830152838560608401378060608584010152601f19601f85011682016060810160206060858403018186015281865180845260808501915082880194508593505b808410156109b85784516001600160a01b0316825293820193600193909301929082019061098f565b5098975050505050505050565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b602080825260069082015265215f7369677360d01b604082015260600190565b90815260200190565b91825260ff16602082015260400190565b94855260ff939093166020850152604084019190915260608301526001600160a01b0316608082015260a00190565b600082821015610abb57610abb610adb565b500390565b6000600019821415610ad457610ad4610adb565b5060010190565b634e487b7160e01b600052601160045260246000fdfea2646970667358221220ba1b2e56be1b6867dd1e5a247a44a208ed8b833caca1c2b71731c415e4fd16c164736f6c63430008000033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000043a544dd24cb10975b7de1deec49e77f652dac66000000000000000000000000464b7df5f9171d5a27a22ca8ea20bfb59b83cfc2723485167650fce02741e1d89aaa51e09b3af91e1b4a7e2c4bb42765d9828ede0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _schnorrLib (address): 0x43A544DD24Cb10975B7dE1dEEC49E77F652Dac66
Arg [1] : _groupAddress (address): 0x464B7Df5f9171D5a27A22ca8EA20bfB59B83CFC2
Arg [2] : _groupPubKeyX (uint256): 51656459323703960945451791659984063894038905716576238718089376375060459327198
Arg [3] : _groupPubKeyYParity (uint8): 0

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000043a544dd24cb10975b7de1deec49e77f652dac66
Arg [1] : 000000000000000000000000464b7df5f9171d5a27a22ca8ea20bfb59b83cfc2
Arg [2] : 723485167650fce02741e1d89aaa51e09b3af91e1b4a7e2c4bb42765d9828ede
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.