Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 7 from a total of 7 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Remove Group Pub... | 15120840 | 928 days ago | IN | 0 ETH | 0.00040283 | ||||
Add Group Public... | 15120827 | 928 days ago | IN | 0 ETH | 0.00041717 | ||||
Add Group Public... | 15120815 | 928 days ago | IN | 0 ETH | 0.00111732 | ||||
Add Group Public... | 15120807 | 928 days ago | IN | 0 ETH | 0.00051375 | ||||
Add Group Public... | 15082520 | 934 days ago | IN | 0 ETH | 0.00048824 | ||||
Add Group Public... | 15071268 | 936 days ago | IN | 0 ETH | 0.00224003 | ||||
Add Group Public... | 14028880 | 1102 days ago | IN | 0 ETH | 0.00754042 |
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
Contract Source Code (Solidity Standard Json-Input format)
// 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); } }
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"); } }
// 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; } }
// 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); } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "istanbul", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.