Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x60806040 | 24271754 | 67 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x17E100E5...0BAB8Dc69 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
QuipWallet
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
No with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// Copyright (C) 2025 quip.network
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity ^0.8.28;
import "@quip.network/hashsigs-solidity/contracts/WOTSPlus.sol";
import "./QuipFactory.sol";
// Uncomment this line to use console.log
contract QuipWallet {
address payable public quipFactory;
address payable public owner;
WOTSPlus.WinternitzAddress public pqOwner;
receive() external payable {}
fallback() external payable {}
event pqTransfer(
uint256 amount,
uint256 when,
WOTSPlus.WinternitzAddress pqFrom,
WOTSPlus.WinternitzAddress pqNext,
address to
);
constructor(address payable creator, address payable newOwner) payable {
quipFactory = creator;
owner = payable(newOwner);
}
function initialize(WOTSPlus.WinternitzAddress calldata newPqOwner) public {
require(
msg.sender == owner || msg.sender == quipFactory,
"You aren't the owner or creator"
);
require(
pqOwner.publicSeed == bytes32(0) &&
pqOwner.publicKeyHash == bytes32(0),
"Already initialized"
);
pqOwner = newPqOwner;
}
function changePqOwner(
WOTSPlus.WinternitzAddress calldata newPqOwner,
WOTSPlus.WinternitzElements calldata pqSig
) public {
require(msg.sender == owner, "You aren't the owner");
bytes memory msgData = abi.encodePacked(
pqOwner.publicSeed,
pqOwner.publicKeyHash,
newPqOwner.publicSeed,
newPqOwner.publicKeyHash
);
WOTSPlus.WinternitzMessage memory message = WOTSPlus.WinternitzMessage({
messageHash: keccak256(msgData)
});
require(WOTSPlus.verify(pqOwner, message, pqSig), "Invalid signature");
pqOwner = newPqOwner;
}
function transferWithWinternitz(
WOTSPlus.WinternitzAddress calldata nextPqOwner,
WOTSPlus.WinternitzElements calldata pqSig,
address payable to,
uint256 value
) public payable {
WOTSPlus.WinternitzAddress memory curPqOwner = pqOwner;
uint256 fee = getTransferFee();
require(msg.value >= fee, "Insufficient fee");
require(msg.sender == owner, "You aren't the owner");
require(address(this).balance >= value, "Insufficient balance");
bytes memory msgData = abi.encodePacked(
pqOwner.publicSeed,
pqOwner.publicKeyHash,
nextPqOwner.publicSeed,
nextPqOwner.publicKeyHash,
to,
value
);
WOTSPlus.WinternitzMessage memory message = WOTSPlus.WinternitzMessage({
messageHash: keccak256(msgData)
});
require(WOTSPlus.verify(pqOwner, message, pqSig), "Invalid signature");
pqOwner = nextPqOwner;
to.transfer(value);
quipFactory.transfer(fee);
emit pqTransfer(value, block.timestamp, curPqOwner, nextPqOwner, to);
}
function executeWithWinternitz(
WOTSPlus.WinternitzAddress calldata nextPqOwner,
WOTSPlus.WinternitzElements calldata pqSig,
address payable target,
bytes calldata opdata
) public payable returns (bool, bytes memory) {
uint256 fee = getExecuteFee();
require(msg.value >= fee, "Insufficient fee");
uint256 forwardValue = msg.value - fee;
require(msg.sender == owner, "You aren't the owner");
WOTSPlus.WinternitzMessage memory message = WOTSPlus.WinternitzMessage({
messageHash: keccak256(
abi.encodePacked(
pqOwner.publicSeed,
pqOwner.publicKeyHash,
nextPqOwner.publicSeed,
nextPqOwner.publicKeyHash,
target,
opdata
)
)
});
require(WOTSPlus.verify(pqOwner, message, pqSig), "Invalid signature");
pqOwner = nextPqOwner;
quipFactory.transfer(fee);
(bool success, bytes memory returnData) = target.call{
value: forwardValue
}(opdata);
require(success, string(returnData));
return (success, returnData);
}
function getTransferFee() public view returns (uint256) {
return QuipFactory(quipFactory).transferFee();
}
function getExecuteFee() public view returns (uint256) {
return QuipFactory(quipFactory).executeFee();
}
}// Copyright (C) 2024 quip.network
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity^0.8.28;
// DEBUG: import {Vm} from "../lib/forge-std/src/Vm.sol";
// DEBUG: import {console} from "../lib/forge-std/src/console.sol";
library WOTSPlus {
// DEBUG: Vm constant vm = Vm(address(uint160(uint256(keccak256("hevm cheat code")))));
// SignatureSize: The size of the signature in bytes.
uint16 public constant SignatureSize = uint16(NumSignatureChunks) * uint16(HashLen);
// PublicKeySize: The size of the public key in bytes.
uint8 public constant PublicKeySize = HashLen * 2;
// Hash: The WOTS+ `F` hash function.
function Hash(bytes memory data) internal pure returns (bytes32) {
return keccak256(data);
}
// HashLen: The WOTS+ `n` security parameter which is the size
// of the hash function output in bytes.
// This is 32 for keccak256 (256 / 8 = 32)
uint8 public constant HashLen = 32;
// MessageLen: The WOTS+ `m` parameter which is the size
// of the message to be signed in bytes
// (and also the size of our hash function)
//
// This is 32 for keccak256 (256 / 8 = 32)
//
// Note that this is not the message length itself as, like
// with most signatures, we hash the message and then compute
// the signature on the hash of the message.
uint8 public constant MessageLen = 32;
// ChainLen: The WOTS+ `w`(internitz) parameter.
// This corresponds to the number of hash chains for each public
// key segment and the base-w representation of the message
// and checksum.
//
// A larger value means a smaller signature size but a longer
// computation time.
//
// For XMSS (rfc8391) this value is limited to 4 or 16 because
// they simplify the algorithm and offer the best trade-offs.
uint8 public constant ChainLen = 16;
// lg(ChainLen) so we don't calculate it
uint8 public constant LgChainLen = 4;
// NumMessageChunks: the `len_1` parameter which is the number of
// message chunks. This is
// ceil(8n / lg(w)) -> ceil(8 * HashLen / lg(ChainLen))
// or ceil(32*8 / lg(16)) -> 256 / 4 = 64
// Python: math.ceil(32*8 / math.log(16,2))
uint8 public constant NumMessageChunks = 64;
// NumChecksumChunks: the `len_2` parameter which is the number of
// checksum chunks. This is
// floor(lg(len_1 * (w - 1)) / lg(w)) + 1
// -> floor(lg(NumMessageChunks * (ChainLen - 1)) / lg(ChainLen)) + 1
// -> floor(lg(64 * 15) / lg(16)) + 1 = 3
// Python: math.floor(math.log(64 * 15, 2) / math.log(16, 2)) + 1
uint8 public constant NumChecksumChunks = 3;
uint8 public constant NumSignatureChunks = NumMessageChunks + NumChecksumChunks;
struct WinternitzAddress {
bytes32 publicSeed;
bytes32 publicKeyHash;
}
struct WinternitzElements {
bytes32[NumSignatureChunks] elements;
}
struct WinternitzMessage {
bytes32 messageHash;
}
// verify: Verify a WOTS+ signature.
// 1. The first part of the publicKey is a public seed used to regenerate the randomization elements. (`r` from the paper).
// 2. The second part of the publicKey is the hash of the NumMessageChunks + NumChecksumChunks public key segments.
// 3. Convert the Message to "base-w" representation (or base of ChainLen representation).
// 4. Compute and add the checksum.
// 5. Run the chain function on each segment to reproduce each public key segment.
// 6. Hash all public key segments together to recreate the original public key.
function verify(
WinternitzAddress calldata quipAddress,
WinternitzMessage calldata message,
WinternitzElements calldata signature
) public pure returns (bool) {
// DEBUG: require(publicKey.length == PublicKeySize,
// DEBUG: string.concat("public key length must be ", vm.toString(PublicKeySize), " bytes"));
// DEBUG: require(message.length == MessageLen,
// DEBUG: string.concat("message length must be ", vm.toString(MessageLen), " bytes"));
// DEBUG: require(signature.length == NumSignatureChunks,
// DEBUG: string.concat("signature length must be ", vm.toString(NumSignatureChunks), " bytes, not", vm.toString(signature.length)));
WinternitzElements memory randomizationElements = generateRandomizationElements(quipAddress.publicSeed);
// DEBUG: console.log("Public key seed:");
// DEBUG: console.logBytes32(publicSeed);
// DEBUG: console.log("Public key hash:");
// DEBUG: console.logBytes32(publicKeyHash);
// DEBUG: console.log("Message:");
// DEBUG: console.logBytes(message);
bytes memory publicKeySegments = new bytes(SignatureSize);
// would it be clearer to compute these together in a subfunction, hiding the checksum details entirely?
uint8[] memory chainSegments = ComputeMessageHashChainIndexes(message);
// Compute each public key segment. These are done by taking the signature, which is prevChainOut at chainIdx - 1,
// and completing the hash chain via the chain function to recompute the public key segment.
for (uint8 i = 0; i < chainSegments.length; i++ ) {
uint8 chainIdx = chainSegments[i];
uint8 numIterations = ChainLen - chainIdx - 1;
bytes32 prevChainOut = signature.elements[i];
bytes32 segment = chain(prevChainOut, randomizationElements, chainIdx, numIterations);
// Copy bytes32 to the correct position in publicKeySegments
uint16 offset = uint16(i) * uint16(HashLen);
setSlice32(publicKeySegments, segment, offset);
}
// DEBUG: console.log("Computed Public key segments:");
// DEBUG: console.logBytes(publicKeySegments);
// Hash all public key segments together to recreate the original public key.
bytes32 computedHash = Hash(publicKeySegments);
// DEBUG: console.log("Computed public key hash:");
// DEBUG: console.logBytes32(computedHash);
// Compare computed hash with stored public key hash
return computedHash == quipAddress.publicKeyHash;
}
// verify: Verify a WOTS+ signature.
// 1. The first part of the publicKey is a public seed used to regenerate the randomization elements. (`r` from the paper).
// 2. The second part of the publicKey is the hash of the NumMessageChunks + NumChecksumChunks public key segments.
// 3. Convert the Message to "base-w" representation (or base of ChainLen representation).
// 4. Compute and add the checksum.
// 5. Run the chain function on each segment to reproduce each public key segment.
// 6. Hash all public key segments together to recreate the original public key.
function verifyWithRandomizationElements(
WinternitzAddress calldata quipAddress,
WinternitzMessage calldata message,
WinternitzElements calldata signature,
WinternitzElements memory randomizationElements
) public pure returns (bool) {
// DEBUG: require(publicKey.length == PublicKeySize,
// DEBUG: string.concat("public key length must be ", vm.toString(PublicKeySize), " bytes"));
// DEBUG: require(message.length == MessageLen,
// DEBUG: string.concat("message length must be ", vm.toString(MessageLen), " bytes"));
// DEBUG: require(signature.length == NumSignatureChunks,
// DEBUG: string.concat("signature length must be ", vm.toString(NumSignatureChunks), " bytes, not", vm.toString(signature.length)));
// DEBUG: console.log("Public key hash:");
// DEBUG: console.logBytes32(publicKeyHash);
// DEBUG: console.log("Message:");
// DEBUG: console.logBytes(message);
bytes memory publicKeySegments = new bytes(SignatureSize);
uint8[] memory chainSegments = ComputeMessageHashChainIndexes(message);
// Compute each public key segment. These are done by taking the signature, which is prevChainOut at chainIdx - 1,
// and completing the hash chain via the chain function to recompute the public key segment.
for (uint8 i = 0; i < chainSegments.length; i++ ) {
uint8 chainIdx = chainSegments[i];
uint8 numIterations = ChainLen - chainIdx - 1;
bytes32 prevChainOut = signature.elements[i];
bytes32 segment = chain(prevChainOut, randomizationElements, chainIdx, numIterations);
// Copy bytes32 to the correct position in publicKeySegments
uint16 offset = uint16(i) * uint16(HashLen);
setSlice32(publicKeySegments, segment, offset);
}
// DEBUG: console.log("Computed Public key segments:");
// DEBUG: console.logBytes(publicKeySegments);
// Hash all public key segments together to recreate the original public key.
bytes32 computedHash = Hash(publicKeySegments);
// DEBUG: console.log("Computed public key hash:");
// DEBUG: console.logBytes32(computedHash);
// Compare computed hash with stored public key hash
return computedHash == quipAddress.publicKeyHash;
}
// sign: Sign a message with a WOTS+ private key. Do not use this, it is present as an example and
// you should be using a typescript version of this function because it requires your private key.
function sign(bytes32 privateKey, WinternitzMessage calldata message) public pure returns (bytes32[NumSignatureChunks] memory) {
// DEBUG: require(privateKey.length == HashLen,
// DEBUG: string.concat("private key length must be ", vm.toString(HashLen), " bytes"));
// DEBUG: require(message.length == MessageLen,
// DEBUG: string.concat("message length must be ", vm.toString(MessageLen), " bytes"));
require(privateKey.length == HashLen,
string.concat("private key length must be 32 bytes"));
bytes32 publicSeed = prf(privateKey, 0);
WinternitzElements memory randomizationElements = generateRandomizationElements(publicSeed);
bytes32 functionKey = randomizationElements.elements[0];
bytes32[NumSignatureChunks] memory signature;
uint8[] memory chainSegments = ComputeMessageHashChainIndexes(message);
for (uint8 i = 0; i < chainSegments.length; i++ ) {
uint16 chainIdx = chainSegments[i];
bytes32 secretKeySegment = Hash(abi.encodePacked(functionKey, prf(privateKey, i + 1)));
signature[i] = chain(secretKeySegment, randomizationElements, 0, chainIdx);
}
return signature;
}
// generateKeyPair: Generate a WOTS+ key pair. Do not use this, it is present as an example and
// you should be using a typescript version of this function, presumably with better entropy source.
function generateKeyPair(bytes32 privateSeed) public pure returns (WinternitzAddress memory, bytes32) {
bytes32 privateKey = prf(privateSeed, 0);
bytes32 publicSeed = prf(privateKey, 0);
WinternitzElements memory randomizationElements = generateRandomizationElements(publicSeed);
// functionKey is `k` from the paper, we define it as the index 0 from the prf,
// as the prf output is not used on the first element in the chain function.
// This is hashed in on each chain iteration along with the randomization element.
// It is part of the public key, so safe to define it with the public seed.
// To set it, we hash it into the first segment with the secret key.
// TODO: take a closer look at XMSS et al and see how they handle this, we should be
// doing the same.
bytes32 functionKey = randomizationElements.elements[0];
bytes memory publicKeySegments = new bytes(SignatureSize);
for (uint8 i = 0; i < NumSignatureChunks; i++) {
bytes32 secretKeySegment = Hash(abi.encodePacked(functionKey, prf(privateKey, i + 1)));
bytes32 segment = chain(secretKeySegment, randomizationElements, 0, ChainLen - 1);
// Copy bytes32 to the correct position in publicKeySegments
uint16 offset = uint16(i) * uint16(HashLen);
setSlice32(publicKeySegments, segment, offset);
}
// DEBUG: console.log("Public key segments:");
// DEBUG: console.logBytes(publicKeySegments);
bytes32 publicKeyHash = Hash(publicKeySegments);
// DEBUG: console.log("Public key hash:");
// DEBUG: console.logBytes32(publicKeyHash);
WinternitzAddress memory publicKey = WinternitzAddress({publicKeyHash: publicKeyHash, publicSeed: publicSeed});
return (publicKey, privateKey);
}
function generateRandomizationElements(bytes32 publicSeed) public pure returns (WinternitzElements memory) {
bytes32[NumSignatureChunks] memory elements;
for (uint8 i = 0; i < NumSignatureChunks; i++) {
elements[i] = prf(publicSeed, i);
}
return WinternitzElements({elements: elements});
}
// chain is the c_k^i function,
// the hash of (prevChainOut XOR randomization element at index).
// As a practical matter, we generate the randomization elements
// via a seed like in XMSS(rfc8391) with a defined PRF.
function chain(
bytes32 prevChainOut,
WinternitzElements memory randomizationElements,
uint16 index,
uint16 steps
) public pure returns (bytes32) {
// DEBUG: require((index + steps) < ChainLen,
// DEBUG: string.concat("steps + index must be less than ", vm.toString(ChainLen)));
bytes32 chainOut = prevChainOut;
for (uint8 i = 1; i <= steps; i++) {
chainOut = Hash(abi.encodePacked(xor(chainOut, randomizationElements.elements[i + index])));
}
return chainOut;
}
// xor: XOR two bytes32 values
function xor(bytes32 a, bytes32 b) internal pure returns (bytes32) {
return bytes32(uint256(a) ^ uint256(b));
}
// There's no built-in x[a:b] semantic for bytes or bytes32 unless it's calldata, apparently...
function setSlice32(bytes memory dst, bytes32 src, uint16 offset) internal pure {
assembly {
mstore(add(add(dst, 32), offset), src)
}
}
// prf: Generate randomization elements from seed and index
// Similar to XMSS RFC 8391 section 5.1
// NOTE: while sha256 and ripemd160 are available in solidity,
// they are implemented as precompiled contracts and are more expensive for gas.
function prf(bytes32 seed, uint16 index) internal pure returns (bytes32) {
return keccak256(abi.encodePacked(
bytes1(0x03), // prefix to domain separate
seed, // the seed input
uint16(index) // the index/position
));
}
// ComputeMessageHashChainIndexes: Compute the chain indexes for a message.
// We convert the message to base-w representation (or base of ChainLen representation)
// We attach the checksum, also in base-w representation, to the end of the hash chain index list.
function ComputeMessageHashChainIndexes(WinternitzMessage calldata message) internal pure returns (uint8[] memory) {
uint8[] memory chainIndexes = new uint8[](NumMessageChunks + NumChecksumChunks);
toBaseW(abi.encodePacked(message.messageHash), NumMessageChunks, chainIndexes, 0);
checksum(chainIndexes);
return chainIndexes;
}
// checksum: Calculate the checksum of the message and return it in basew
function checksum(uint8[] memory basew) internal pure {
uint16 csum = 0;
for (uint8 i = 0; i < NumMessageChunks; i++ ) {
csum = csum + ChainLen - 1 - basew[i];
}
// this is left-shifting the checksum to ensure proper alignment when
// converting to base-w representation.
// This shift ensures that when we convert to base-w, the least significant
// bits of the checksum will be properly aligned with the w-bit boundaries.
// (8 - ((NumChecksumChunks * LgChainLen) % 8)) = 4
csum = csum << 4;
// Per XMSS (rfc8391) this is done in big endian...
// It's 2 bytes because thats ceil( ( len_2 * lg(w) ) / 8 ), technically actually
// 12 bits, or 3 basew segments.
bytes memory csumBytes = new bytes(2);
csumBytes[0] = bytes1(uint8(csum >> 8)); // Most significant byte
csumBytes[1] = bytes1(uint8(csum & 0xFF)); // Least significant byte
// Convert checksum bytes to base-w and append to basew array
toBaseW(csumBytes, NumChecksumChunks, basew, NumMessageChunks);
}
// toBaseW: Convert a message to base-w representation (or base of ChainLen representation)
// These numbers are used to index into each hash chain which is rooted at a secret key segment and produces
// a public key segment at the end of the chain. Verification of a signature means using these
// index into each hash chain to recompute the corresponding public key segment.
function toBaseW(bytes memory message, uint8 numChunks, uint8[] memory basew, uint8 offset) internal pure {
// Input message index
uint8 mIdx = 0;
// Output basew index
uint8 oIdx = 0 + offset;
uint8 total = 0;
uint8 bits = 0;
for (uint8 consumed = 0; consumed < numChunks; consumed++) {
// Consume more bits when we run out
if (bits == 0) {
total = uint8(message[mIdx]);
mIdx++;
bits += 8;
}
// Read lg(ChainLen) bits from the message (lg(w))
bits -= LgChainLen;
basew[oIdx] = (total >> bits) & (ChainLen - 1);
oIdx++;
}
}
}// Copyright (C) 2025 quip.network
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
//
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity ^0.8.28;
import "@quip.network/hashsigs-solidity/contracts/WOTSPlus.sol";
import "./QuipWallet.sol";
contract QuipFactory {
address payable public admin;
address public immutable wotsLibrary;
// Fees
uint256 public creationFee = 0;
uint256 public transferFee = 0;
uint256 public executeFee = 0;
// eth address -> "salt" vaultId -> QuipWallet address
mapping(address => mapping(bytes32 => address)) public quips;
// Track vaultIds for each owner
mapping(address => bytes32[]) public vaultIds;
event QuipCreated(
uint256 amount,
uint256 when,
bytes32 vaultId,
address creator,
WOTSPlus.WinternitzAddress pqPubkey,
address quip
);
receive() external payable {}
fallback() external payable {}
constructor(address payable initialOwner, address _wotsLibrary) payable {
admin = initialOwner;
wotsLibrary = _wotsLibrary;
}
/* NOTE: you can pregenerate the address as follows:
bytes32 hash = keccak256(
abi.encodePacked(
bytes1(0xff),
address(this),
salt,
keccak256(type(Lock).creationCode)
)
);
address preAddr = address(uint160(uint(hash)));
*/
function depositToWinternitz(
bytes32 vaultId,
address payable to,
WOTSPlus.WinternitzAddress calldata pqTo
) public payable returns (address) {
address contractAddr;
bytes memory quipWalletCode = abi.encodePacked(
type(QuipWallet).creationCode,
// Encode params for the constructor
abi.encode(address(this), to)
);
uint256 contractValue = msg.value - creationFee;
assembly {
// code starts after the first 32 bytes...
// https://ethereum-blockchain-developer.com/110-upgrade-smart-contracts/12-metamorphosis-create2/
let code := add(0x20, quipWalletCode)
let codeSize := mload(quipWalletCode)
contractAddr := create2(0, code, codeSize, vaultId)
// revert on failure
if iszero(extcodesize(contractAddr)) {
revert(0, 0)
}
}
assert(contractAddr != address(0));
QuipWallet(payable(contractAddr)).initialize(pqTo);
payable(contractAddr).transfer(contractValue);
quips[to][vaultId] = contractAddr;
vaultIds[to].push(vaultId);
emit QuipCreated(
msg.value,
block.timestamp,
vaultId,
to,
pqTo,
contractAddr
);
return contractAddr;
}
function transferOwnership(address newOwner) public {
require(msg.sender == admin, "You aren't the admin");
admin = payable(newOwner);
}
function setCreationFee(uint256 newFee) public {
require(msg.sender == admin, "You aren't the admin");
creationFee = newFee;
}
function setTransferFee(uint256 newFee) public {
require(msg.sender == admin, "You aren't the admin");
transferFee = newFee;
}
function setExecuteFee(uint256 newFee) public {
require(msg.sender == admin, "You aren't the admin");
executeFee = newFee;
}
function withdraw(uint256 amount) public {
require(msg.sender == admin, "You aren't the admin");
require(address(this).balance >= amount, "Insufficient balance");
admin.transfer(amount);
}
function owner() public view returns (address) {
return admin;
}
}{
"evmVersion": "paris",
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {
"contracts/QuipWallet.sol": {
"WOTSPlus": "0x1ad02cabfc65ed65fdf6da64108f04f71e2e8991"
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address payable","name":"creator","type":"address"},{"internalType":"address payable","name":"newOwner","type":"address"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"when","type":"uint256"},{"components":[{"internalType":"bytes32","name":"publicSeed","type":"bytes32"},{"internalType":"bytes32","name":"publicKeyHash","type":"bytes32"}],"indexed":false,"internalType":"struct WOTSPlus.WinternitzAddress","name":"pqFrom","type":"tuple"},{"components":[{"internalType":"bytes32","name":"publicSeed","type":"bytes32"},{"internalType":"bytes32","name":"publicKeyHash","type":"bytes32"}],"indexed":false,"internalType":"struct WOTSPlus.WinternitzAddress","name":"pqNext","type":"tuple"},{"indexed":false,"internalType":"address","name":"to","type":"address"}],"name":"pqTransfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"components":[{"internalType":"bytes32","name":"publicSeed","type":"bytes32"},{"internalType":"bytes32","name":"publicKeyHash","type":"bytes32"}],"internalType":"struct WOTSPlus.WinternitzAddress","name":"newPqOwner","type":"tuple"},{"components":[{"internalType":"bytes32[67]","name":"elements","type":"bytes32[67]"}],"internalType":"struct WOTSPlus.WinternitzElements","name":"pqSig","type":"tuple"}],"name":"changePqOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"publicSeed","type":"bytes32"},{"internalType":"bytes32","name":"publicKeyHash","type":"bytes32"}],"internalType":"struct WOTSPlus.WinternitzAddress","name":"nextPqOwner","type":"tuple"},{"components":[{"internalType":"bytes32[67]","name":"elements","type":"bytes32[67]"}],"internalType":"struct WOTSPlus.WinternitzElements","name":"pqSig","type":"tuple"},{"internalType":"address payable","name":"target","type":"address"},{"internalType":"bytes","name":"opdata","type":"bytes"}],"name":"executeWithWinternitz","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getExecuteFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransferFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"publicSeed","type":"bytes32"},{"internalType":"bytes32","name":"publicKeyHash","type":"bytes32"}],"internalType":"struct WOTSPlus.WinternitzAddress","name":"newPqOwner","type":"tuple"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pqOwner","outputs":[{"internalType":"bytes32","name":"publicSeed","type":"bytes32"},{"internalType":"bytes32","name":"publicKeyHash","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quipFactory","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"publicSeed","type":"bytes32"},{"internalType":"bytes32","name":"publicKeyHash","type":"bytes32"}],"internalType":"struct WOTSPlus.WinternitzAddress","name":"nextPqOwner","type":"tuple"},{"components":[{"internalType":"bytes32[67]","name":"elements","type":"bytes32[67]"}],"internalType":"struct WOTSPlus.WinternitzElements","name":"pqSig","type":"tuple"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferWithWinternitz","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
0x6080604052604051611ca2380380611ca283398181016040528101906100259190610110565b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050610150565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100dd826100b2565b9050919050565b6100ed816100d2565b81146100f857600080fd5b50565b60008151905061010a816100e4565b92915050565b60008060408385031215610127576101266100ad565b5b6000610135858286016100fb565b9250506020610146858286016100fb565b9150509250929050565b611b438061015f6000396000f3fe60806040526004361061008a5760003560e01c80638f46fc7d116100595780638f46fc7d146101385780639a12ef39146101695780639a17d8c114610192578063bdb87deb146101bd578063c103dd63146101e85761008b565b80630d95d8df1461008d57806343f2f612146100b6578063701373b0146100e15780638da5cb5b1461010d5761008b565b5b005b34801561009957600080fd5b506100b460048036038101906100af9190610d9e565b610204565b005b3480156100c257600080fd5b506100cb6103be565b6040516100d89190610df8565b60405180910390f35b3480156100ed57600080fd5b506100f6610455565b604051610104929190610e2c565b60405180910390f35b34801561011957600080fd5b50610122610467565b60405161012f9190610e96565b60405180910390f35b610152600480360381019061014d9190610f42565b61048d565b604051610160929190611078565b60405180910390f35b34801561017557600080fd5b50610190600480360381019061018b91906110a8565b6107d7565b005b34801561019e57600080fd5b506101a761092f565b6040516101b49190610df8565b60405180910390f35b3480156101c957600080fd5b506101d26109c6565b6040516101df9190610e96565b60405180910390f35b61020260048036038101906101fd9190611101565b6109ea565b005b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028b906111c8565b60405180910390fd5b6000600260000154600260010154846000013585602001356040516020016102bf9493929190611209565b60405160208183030381529060405290506000604051806020016040528083805190602001208152509050731ad02cabfc65ed65fdf6da64108f04f71e2e8991638e623fb1600283866040518463ffffffff1660e01b815260040161032693929190611344565b602060405180830381865af4158015610343573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036791906113a8565b6103a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039d90611421565b60405180910390fd5b83600281816103b5919061154a565b90505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8c8f5f86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561042c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610450919061156d565b905090565b60028060000154908060010154905082565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006060600061049b6103be565b9050803410156104e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d7906115e6565b60405180910390fd5b600081346104ee9190611635565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610580576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610577906111c8565b60405180910390fd5b600060405180602001604052806002600001546002600101548d600001358e602001358d8d8d6040516020016105bc97969594939291906116f0565b604051602081830303815290604052805190602001208152509050731ad02cabfc65ed65fdf6da64108f04f71e2e8991638e623fb16002838c6040518463ffffffff1660e01b815260040161061393929190611344565b602060405180830381865af4158015610630573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065491906113a8565b610693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068a90611421565b60405180910390fd5b89600281816106a2919061154a565b90505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561070b573d6000803e3d6000fd5b506000808973ffffffffffffffffffffffffffffffffffffffff16848a8a60405161073792919061175e565b60006040518083038185875af1925050503d8060008114610774576040519150601f19603f3d011682016040523d82523d6000602084013e610779565b606091505b50915091508181906107c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b891906117bb565b60405180910390fd5b5081819650965050505050509550959350505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061087e575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6108bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b490611829565b60405180910390fd5b6000801b6002600001541480156108db57506000801b600260010154145b61091a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091190611895565b60405180910390fd5b8060028181610929919061154a565b90505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663acb2ad6f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561099d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c1919061156d565b905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060026040518060400160405290816000820154815260200160018201548152505090506000610a1961092f565b905080341015610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a55906115e6565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae5906111c8565b60405180910390fd5b82471015610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890611901565b60405180910390fd5b6000600260000154600260010154886000013589602001358888604051602001610b6096959493929190611942565b60405160208183030381529060405290506000604051806020016040528083805190602001208152509050731ad02cabfc65ed65fdf6da64108f04f71e2e8991638e623fb16002838a6040518463ffffffff1660e01b8152600401610bc793929190611344565b602060405180830381865af4158015610be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0891906113a8565b610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90611421565b60405180910390fd5b8760028181610c56919061154a565b9050508573ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f19350505050158015610c9f573d6000803e3d6000fd5b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015610d06573d6000803e3d6000fd5b507ff40ccced1c70410078ce59d546283d2b0ab0d3e225c71d28d501e5723ce70a1d8542868b8a604051610d3e959493929190611aba565b60405180910390a15050505050505050565b600080fd5b600080fd5b600080fd5b600060408284031215610d7557610d74610d5a565b5b81905092915050565b60006108608284031215610d9557610d94610d5a565b5b81905092915050565b6000806108a08385031215610db657610db5610d50565b5b6000610dc485828601610d5f565b9250506040610dd585828601610d7e565b9150509250929050565b6000819050919050565b610df281610ddf565b82525050565b6000602082019050610e0d6000830184610de9565b92915050565b6000819050919050565b610e2681610e13565b82525050565b6000604082019050610e416000830185610e1d565b610e4e6020830184610e1d565b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e8082610e55565b9050919050565b610e9081610e75565b82525050565b6000602082019050610eab6000830184610e87565b92915050565b610eba81610e75565b8114610ec557600080fd5b50565b600081359050610ed781610eb1565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610f0257610f01610edd565b5b8235905067ffffffffffffffff811115610f1f57610f1e610ee2565b5b602083019150836001820283011115610f3b57610f3a610ee7565b5b9250929050565b60008060008060006108e08688031215610f5f57610f5e610d50565b5b6000610f6d88828901610d5f565b9550506040610f7e88828901610d7e565b9450506108a0610f9088828901610ec8565b9350506108c086013567ffffffffffffffff811115610fb257610fb1610d55565b5b610fbe88828901610eec565b92509250509295509295909350565b60008115159050919050565b610fe281610fcd565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611022578082015181840152602081019050611007565b60008484015250505050565b6000601f19601f8301169050919050565b600061104a82610fe8565b6110548185610ff3565b9350611064818560208601611004565b61106d8161102e565b840191505092915050565b600060408201905061108d6000830185610fd9565b818103602083015261109f818461103f565b90509392505050565b6000604082840312156110be576110bd610d50565b5b60006110cc84828501610d5f565b91505092915050565b6110de81610ddf565b81146110e957600080fd5b50565b6000813590506110fb816110d5565b92915050565b6000806000806108e0858703121561111c5761111b610d50565b5b600061112a87828801610d5f565b945050604061113b87828801610d7e565b9350506108a061114d87828801610ec8565b9250506108c061115f878288016110ec565b91505092959194509250565b600082825260208201905092915050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006111b260148361116b565b91506111bd8261117c565b602082019050919050565b600060208201905081810360008301526111e1816111a5565b9050919050565b6000819050919050565b6112036111fe82610e13565b6111e8565b82525050565b600061121582876111f2565b60208201915061122582866111f2565b60208201915061123582856111f2565b60208201915061124582846111f2565b60208201915081905095945050505050565b60008160001c9050919050565b6000819050919050565b600061128161127c83611257565b611264565b9050919050565b61129181610e13565b82525050565b6040820160008083015490506112ac8161126e565b6112b96000860182611288565b50600183015490506112ca8161126e565b6112d76020860182611288565b5050505050565b6020820160008201516112f46000850182611288565b50505050565b600082905092915050565b82818337505050565b61131b6108608383611305565b5050565b610860820161133160008301836112fa565b61133e600085018261130e565b50505050565b60006108c08201905061135a6000830186611297565b61136760408301856112de565b611374606083018461131f565b949350505050565b61138581610fcd565b811461139057600080fd5b50565b6000815190506113a28161137c565b92915050565b6000602082840312156113be576113bd610d50565b5b60006113cc84828501611393565b91505092915050565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b600061140b60118361116b565b9150611416826113d5565b602082019050919050565b6000602082019050818103600083015261143a816113fe565b9050919050565b61144a81610e13565b811461145557600080fd5b50565b6000813561146581611441565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6114a78461146e565b9350801983169250808416831791505092915050565b60006114c882610e13565b9050919050565b60006114da82611257565b9050919050565b6114ea826114bd565b6114fd6114f6826114cf565b835461147b565b8255505050565b60008101600083018061151681611458565b905061152281846114e1565b50505060018101602083018061153781611458565b905061154381846114e1565b5050505050565b6115548282611504565b5050565b600081519050611567816110d5565b92915050565b60006020828403121561158357611582610d50565b5b600061159184828501611558565b91505092915050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b60006115d060108361116b565b91506115db8261159a565b602082019050919050565b600060208201905081810360008301526115ff816115c3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061164082610ddf565b915061164b83610ddf565b925082820390508181111561166357611662611606565b5b92915050565b60008160601b9050919050565b600061168182611669565b9050919050565b600061169382611676565b9050919050565b6116ab6116a682610e75565b611688565b82525050565b600081905092915050565b82818337600083830152505050565b60006116d783856116b1565b93506116e48385846116bc565b82840190509392505050565b60006116fc828a6111f2565b60208201915061170c82896111f2565b60208201915061171c82886111f2565b60208201915061172c82876111f2565b60208201915061173c828661169a565b60148201915061174d8284866116cb565b915081905098975050505050505050565b600061176b8284866116cb565b91508190509392505050565b600081519050919050565b600061178d82611777565b611797818561116b565b93506117a7818560208601611004565b6117b08161102e565b840191505092915050565b600060208201905081810360008301526117d58184611782565b905092915050565b7f596f75206172656e277420746865206f776e6572206f722063726561746f7200600082015250565b6000611813601f8361116b565b915061181e826117dd565b602082019050919050565b6000602082019050818103600083015261184281611806565b9050919050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b600061187f60138361116b565b915061188a82611849565b602082019050919050565b600060208201905081810360008301526118ae81611872565b9050919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b60006118eb60148361116b565b91506118f6826118b5565b602082019050919050565b6000602082019050818103600083015261191a816118de565b9050919050565b6000819050919050565b61193c61193782610ddf565b611921565b82525050565b600061194e82896111f2565b60208201915061195e82886111f2565b60208201915061196e82876111f2565b60208201915061197e82866111f2565b60208201915061198e828561169a565b60148201915061199e828461192b565b602082019150819050979650505050505050565b6119bb81610e13565b82525050565b6040820160008201516119d760008501826119b2565b5060208201516119ea60208501826119b2565b50505050565b6000813590506119ff81611441565b92915050565b6000611a1460208401846119f0565b905092915050565b60408201611a2d6000830183611a05565b611a3a60008501826119b2565b50611a486020830183611a05565b611a5560208501826119b2565b50505050565b6000819050919050565b6000611a80611a7b611a7684610e55565b611a5b565b610e55565b9050919050565b6000611a9282611a65565b9050919050565b6000611aa482611a87565b9050919050565b611ab481611a99565b82525050565b600060e082019050611acf6000830188610de9565b611adc6020830187610de9565b611ae960408301866119c1565b611af66080830185611a1c565b611b0360c0830184611aab565b969550505050505056fea26469706673582212203eda2d413e639d12d3c7e8d3cdf1289050e38716004d0b96874eb74aabbcdf2664736f6c634300081c00330000000000000000000000004a5a444f3b12342dc50e34f562dffbf0152cbb99000000000000000000000000632ee0ef9461fe1ea4e802e68c5f761d9c07942c
Deployed Bytecode
0x60806040526004361061008a5760003560e01c80638f46fc7d116100595780638f46fc7d146101385780639a12ef39146101695780639a17d8c114610192578063bdb87deb146101bd578063c103dd63146101e85761008b565b80630d95d8df1461008d57806343f2f612146100b6578063701373b0146100e15780638da5cb5b1461010d5761008b565b5b005b34801561009957600080fd5b506100b460048036038101906100af9190610d9e565b610204565b005b3480156100c257600080fd5b506100cb6103be565b6040516100d89190610df8565b60405180910390f35b3480156100ed57600080fd5b506100f6610455565b604051610104929190610e2c565b60405180910390f35b34801561011957600080fd5b50610122610467565b60405161012f9190610e96565b60405180910390f35b610152600480360381019061014d9190610f42565b61048d565b604051610160929190611078565b60405180910390f35b34801561017557600080fd5b50610190600480360381019061018b91906110a8565b6107d7565b005b34801561019e57600080fd5b506101a761092f565b6040516101b49190610df8565b60405180910390f35b3480156101c957600080fd5b506101d26109c6565b6040516101df9190610e96565b60405180910390f35b61020260048036038101906101fd9190611101565b6109ea565b005b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028b906111c8565b60405180910390fd5b6000600260000154600260010154846000013585602001356040516020016102bf9493929190611209565b60405160208183030381529060405290506000604051806020016040528083805190602001208152509050731ad02cabfc65ed65fdf6da64108f04f71e2e8991638e623fb1600283866040518463ffffffff1660e01b815260040161032693929190611344565b602060405180830381865af4158015610343573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036791906113a8565b6103a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039d90611421565b60405180910390fd5b83600281816103b5919061154a565b90505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f8c8f5f86040518163ffffffff1660e01b8152600401602060405180830381865afa15801561042c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610450919061156d565b905090565b60028060000154908060010154905082565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006060600061049b6103be565b9050803410156104e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d7906115e6565b60405180910390fd5b600081346104ee9190611635565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610580576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610577906111c8565b60405180910390fd5b600060405180602001604052806002600001546002600101548d600001358e602001358d8d8d6040516020016105bc97969594939291906116f0565b604051602081830303815290604052805190602001208152509050731ad02cabfc65ed65fdf6da64108f04f71e2e8991638e623fb16002838c6040518463ffffffff1660e01b815260040161061393929190611344565b602060405180830381865af4158015610630573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065491906113a8565b610693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161068a90611421565b60405180910390fd5b89600281816106a2919061154a565b90505060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f1935050505015801561070b573d6000803e3d6000fd5b506000808973ffffffffffffffffffffffffffffffffffffffff16848a8a60405161073792919061175e565b60006040518083038185875af1925050503d8060008114610774576040519150601f19603f3d011682016040523d82523d6000602084013e610779565b606091505b50915091508181906107c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b891906117bb565b60405180910390fd5b5081819650965050505050509550959350505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061087e575060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6108bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b490611829565b60405180910390fd5b6000801b6002600001541480156108db57506000801b600260010154145b61091a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091190611895565b60405180910390fd5b8060028181610929919061154a565b90505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663acb2ad6f6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561099d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c1919061156d565b905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060026040518060400160405290816000820154815260200160018201548152505090506000610a1961092f565b905080341015610a5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a55906115e6565b60405180910390fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae5906111c8565b60405180910390fd5b82471015610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2890611901565b60405180910390fd5b6000600260000154600260010154886000013589602001358888604051602001610b6096959493929190611942565b60405160208183030381529060405290506000604051806020016040528083805190602001208152509050731ad02cabfc65ed65fdf6da64108f04f71e2e8991638e623fb16002838a6040518463ffffffff1660e01b8152600401610bc793929190611344565b602060405180830381865af4158015610be4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c0891906113a8565b610c47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3e90611421565b60405180910390fd5b8760028181610c56919061154a565b9050508573ffffffffffffffffffffffffffffffffffffffff166108fc869081150290604051600060405180830381858888f19350505050158015610c9f573d6000803e3d6000fd5b5060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015610d06573d6000803e3d6000fd5b507ff40ccced1c70410078ce59d546283d2b0ab0d3e225c71d28d501e5723ce70a1d8542868b8a604051610d3e959493929190611aba565b60405180910390a15050505050505050565b600080fd5b600080fd5b600080fd5b600060408284031215610d7557610d74610d5a565b5b81905092915050565b60006108608284031215610d9557610d94610d5a565b5b81905092915050565b6000806108a08385031215610db657610db5610d50565b5b6000610dc485828601610d5f565b9250506040610dd585828601610d7e565b9150509250929050565b6000819050919050565b610df281610ddf565b82525050565b6000602082019050610e0d6000830184610de9565b92915050565b6000819050919050565b610e2681610e13565b82525050565b6000604082019050610e416000830185610e1d565b610e4e6020830184610e1d565b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610e8082610e55565b9050919050565b610e9081610e75565b82525050565b6000602082019050610eab6000830184610e87565b92915050565b610eba81610e75565b8114610ec557600080fd5b50565b600081359050610ed781610eb1565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610f0257610f01610edd565b5b8235905067ffffffffffffffff811115610f1f57610f1e610ee2565b5b602083019150836001820283011115610f3b57610f3a610ee7565b5b9250929050565b60008060008060006108e08688031215610f5f57610f5e610d50565b5b6000610f6d88828901610d5f565b9550506040610f7e88828901610d7e565b9450506108a0610f9088828901610ec8565b9350506108c086013567ffffffffffffffff811115610fb257610fb1610d55565b5b610fbe88828901610eec565b92509250509295509295909350565b60008115159050919050565b610fe281610fcd565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b83811015611022578082015181840152602081019050611007565b60008484015250505050565b6000601f19601f8301169050919050565b600061104a82610fe8565b6110548185610ff3565b9350611064818560208601611004565b61106d8161102e565b840191505092915050565b600060408201905061108d6000830185610fd9565b818103602083015261109f818461103f565b90509392505050565b6000604082840312156110be576110bd610d50565b5b60006110cc84828501610d5f565b91505092915050565b6110de81610ddf565b81146110e957600080fd5b50565b6000813590506110fb816110d5565b92915050565b6000806000806108e0858703121561111c5761111b610d50565b5b600061112a87828801610d5f565b945050604061113b87828801610d7e565b9350506108a061114d87828801610ec8565b9250506108c061115f878288016110ec565b91505092959194509250565b600082825260208201905092915050565b7f596f75206172656e277420746865206f776e6572000000000000000000000000600082015250565b60006111b260148361116b565b91506111bd8261117c565b602082019050919050565b600060208201905081810360008301526111e1816111a5565b9050919050565b6000819050919050565b6112036111fe82610e13565b6111e8565b82525050565b600061121582876111f2565b60208201915061122582866111f2565b60208201915061123582856111f2565b60208201915061124582846111f2565b60208201915081905095945050505050565b60008160001c9050919050565b6000819050919050565b600061128161127c83611257565b611264565b9050919050565b61129181610e13565b82525050565b6040820160008083015490506112ac8161126e565b6112b96000860182611288565b50600183015490506112ca8161126e565b6112d76020860182611288565b5050505050565b6020820160008201516112f46000850182611288565b50505050565b600082905092915050565b82818337505050565b61131b6108608383611305565b5050565b610860820161133160008301836112fa565b61133e600085018261130e565b50505050565b60006108c08201905061135a6000830186611297565b61136760408301856112de565b611374606083018461131f565b949350505050565b61138581610fcd565b811461139057600080fd5b50565b6000815190506113a28161137c565b92915050565b6000602082840312156113be576113bd610d50565b5b60006113cc84828501611393565b91505092915050565b7f496e76616c6964207369676e6174757265000000000000000000000000000000600082015250565b600061140b60118361116b565b9150611416826113d5565b602082019050919050565b6000602082019050818103600083015261143a816113fe565b9050919050565b61144a81610e13565b811461145557600080fd5b50565b6000813561146581611441565b80915050919050565b60008160001b9050919050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6114a78461146e565b9350801983169250808416831791505092915050565b60006114c882610e13565b9050919050565b60006114da82611257565b9050919050565b6114ea826114bd565b6114fd6114f6826114cf565b835461147b565b8255505050565b60008101600083018061151681611458565b905061152281846114e1565b50505060018101602083018061153781611458565b905061154381846114e1565b5050505050565b6115548282611504565b5050565b600081519050611567816110d5565b92915050565b60006020828403121561158357611582610d50565b5b600061159184828501611558565b91505092915050565b7f496e73756666696369656e742066656500000000000000000000000000000000600082015250565b60006115d060108361116b565b91506115db8261159a565b602082019050919050565b600060208201905081810360008301526115ff816115c3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061164082610ddf565b915061164b83610ddf565b925082820390508181111561166357611662611606565b5b92915050565b60008160601b9050919050565b600061168182611669565b9050919050565b600061169382611676565b9050919050565b6116ab6116a682610e75565b611688565b82525050565b600081905092915050565b82818337600083830152505050565b60006116d783856116b1565b93506116e48385846116bc565b82840190509392505050565b60006116fc828a6111f2565b60208201915061170c82896111f2565b60208201915061171c82886111f2565b60208201915061172c82876111f2565b60208201915061173c828661169a565b60148201915061174d8284866116cb565b915081905098975050505050505050565b600061176b8284866116cb565b91508190509392505050565b600081519050919050565b600061178d82611777565b611797818561116b565b93506117a7818560208601611004565b6117b08161102e565b840191505092915050565b600060208201905081810360008301526117d58184611782565b905092915050565b7f596f75206172656e277420746865206f776e6572206f722063726561746f7200600082015250565b6000611813601f8361116b565b915061181e826117dd565b602082019050919050565b6000602082019050818103600083015261184281611806565b9050919050565b7f416c726561647920696e697469616c697a656400000000000000000000000000600082015250565b600061187f60138361116b565b915061188a82611849565b602082019050919050565b600060208201905081810360008301526118ae81611872565b9050919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b60006118eb60148361116b565b91506118f6826118b5565b602082019050919050565b6000602082019050818103600083015261191a816118de565b9050919050565b6000819050919050565b61193c61193782610ddf565b611921565b82525050565b600061194e82896111f2565b60208201915061195e82886111f2565b60208201915061196e82876111f2565b60208201915061197e82866111f2565b60208201915061198e828561169a565b60148201915061199e828461192b565b602082019150819050979650505050505050565b6119bb81610e13565b82525050565b6040820160008201516119d760008501826119b2565b5060208201516119ea60208501826119b2565b50505050565b6000813590506119ff81611441565b92915050565b6000611a1460208401846119f0565b905092915050565b60408201611a2d6000830183611a05565b611a3a60008501826119b2565b50611a486020830183611a05565b611a5560208501826119b2565b50505050565b6000819050919050565b6000611a80611a7b611a7684610e55565b611a5b565b610e55565b9050919050565b6000611a9282611a65565b9050919050565b6000611aa482611a87565b9050919050565b611ab481611a99565b82525050565b600060e082019050611acf6000830188610de9565b611adc6020830187610de9565b611ae960408301866119c1565b611af66080830185611a1c565b611b0360c0830184611aab565b969550505050505056fea26469706673582212203eda2d413e639d12d3c7e8d3cdf1289050e38716004d0b96874eb74aabbcdf2664736f6c634300081c0033
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.