Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Locking by spending and creating UTXOs #121

Merged
merged 29 commits into from
Jan 29, 2025
Merged
Changes from 1 commit
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
97f3894
spend inputs for locking
jimthematrix Jan 9, 2025
0e3de1a
Squashed commit of the following:
jimthematrix Jan 9, 2025
5a8e9f2
zeto lock with nullifiers
jimthematrix Jan 9, 2025
ac8c0f9
remove lock verifiers
jimthematrix Jan 14, 2025
4725fba
transfer() and transferLocked() with new circuits
jimthematrix Jan 14, 2025
61a0902
fix anon_nullifier and add locking support to nf_anon
jimthematrix Jan 15, 2025
e710d01
add locking support for NF token implementations
jimthematrix Jan 16, 2025
8a2504e
Add escrow contract based on Zeto_Anon for testing purposes
jimthematrix Jan 17, 2025
444a062
add escrow contracts to test locking flows
jimthematrix Jan 20, 2025
1a5a3a9
fix tests
jimthematrix Jan 22, 2025
eb8723f
fix circuit tests
jimthematrix Jan 22, 2025
7660df1
fix go-sdk integration test
jimthematrix Jan 22, 2025
7b3861b
update checks of inputs and output
jimthematrix Jan 22, 2025
a6a911e
update circuit integration tests
jimthematrix Jan 22, 2025
121185b
fix nf nullifier integration test
jimthematrix Jan 22, 2025
518cd5b
fix nf anon nullifier integration test
jimthematrix Jan 22, 2025
ff3fe10
fix test for the escrow flow
jimthematrix Jan 22, 2025
63a902a
fix anon_nullifier build and tests for batching
jimthematrix Jan 23, 2025
5f1a2df
fix deployment parameters for the factory
jimthematrix Jan 23, 2025
f4dff77
change the verifier initialization params to a struct
jimthematrix Jan 23, 2025
64966b5
move verifiers to the contracts/verifiers folder
jimthematrix Jan 23, 2025
c6c2d7e
fix factory unit tests
jimthematrix Jan 23, 2025
e7e96b7
fix tests for using the cloneable factory
jimthematrix Jan 24, 2025
073918c
consolidate solidity interfaces
jimthematrix Jan 24, 2025
7323357
use proof to check for existence in the locked commitments tree
jimthematrix Jan 27, 2025
a9c95c7
renaming of internal variables
jimthematrix Jan 27, 2025
1c54398
Update doc-site/docs/advanced/erc20-tokens-integration.md
jimthematrix Jan 28, 2025
8ced077
test for duplicate output utxos
Chengxuan Jan 29, 2025
925ee0c
Update inline comments in the transferLocked circuit
jimthematrix Jan 29, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
remove lock verifiers
Signed-off-by: Jim Zhang <[email protected]>
jimthematrix committed Jan 14, 2025
commit ac8c0f9dcdbefd2402920b0f9a8b1a29c015ddc7
21 changes: 2 additions & 19 deletions solidity/contracts/factory.sol
Original file line number Diff line number Diff line change
@@ -29,11 +29,9 @@ contract ZetoTokenFactory is Ownable {
address implementation;
address depositVerifier;
address withdrawVerifier;
address lockVerifier;
address verifier;
address batchVerifier;
address batchWithdrawVerifier;
address batchLockVerifier;
}

event ZetoTokenDeployed(address indexed zetoToken);
@@ -86,14 +84,6 @@ contract ZetoTokenFactory is Ownable {
args.batchWithdrawVerifier != address(0),
"Factory: batchWithdrawVerifier address is required"
);
require(
args.lockVerifier != address(0),
"Factory: lockVerifier address is required"
);
require(
args.batchLockVerifier != address(0),
"Factory: batchLockVerifier address is required"
);
address instance = Clones.clone(args.implementation);
require(
instance != address(0),
@@ -105,9 +95,7 @@ contract ZetoTokenFactory is Ownable {
args.depositVerifier,
args.withdrawVerifier,
args.batchVerifier,
args.batchWithdrawVerifier,
args.lockVerifier,
args.batchLockVerifier
args.batchWithdrawVerifier
);
emit ZetoTokenDeployed(instance);
return instance;
@@ -122,19 +110,14 @@ contract ZetoTokenFactory is Ownable {
args.implementation != address(0),
"Factory: failed to find implementation"
);
require(
args.lockVerifier != address(0),
"Factory: lockVerifier address is required"
);
address instance = Clones.clone(args.implementation);
require(
instance != address(0),
"Factory: failed to clone implementation"
);
(IZetoNonFungibleInitializable(instance)).initialize(
initialOwner,
args.verifier,
args.lockVerifier
args.verifier
);
emit ZetoTokenDeployed(instance);
return instance;
Original file line number Diff line number Diff line change
@@ -22,8 +22,6 @@ interface IZetoFungibleInitializable {
address _withdrawVerifier,
address _verifier,
address _batchVerifier,
address _batchWithdrawVerifier,
address _lockVerifier,
address _batchLockVerifier
address _batchWithdrawVerifier
) external;
}
18 changes: 0 additions & 18 deletions solidity/contracts/lib/interfaces/izeto_lockable.sol
Original file line number Diff line number Diff line change
@@ -35,21 +35,3 @@ interface IZetoLockable {
bytes data
);
}

interface ILockVerifier {
function verifyProof(
uint[2] calldata _pA,
uint[2][2] calldata _pB,
uint[2] calldata _pC,
uint[2] calldata _pubSignals
) external view returns (bool);
}

interface IBatchLockVerifier {
function verifyProof(
uint[2] calldata _pA,
uint[2][2] calldata _pB,
uint[2] calldata _pC,
uint[10] calldata _pubSignals
) external view returns (bool);
}
6 changes: 1 addition & 5 deletions solidity/contracts/lib/interfaces/izeto_nf_initializable.sol
Original file line number Diff line number Diff line change
@@ -16,9 +16,5 @@
pragma solidity ^0.8.27;

interface IZetoNonFungibleInitializable {
function initialize(
address initialOwner,
address _verifier,
address _lockVerifier
) external;
function initialize(address initialOwner, address _verifier) external;
}
7 changes: 1 addition & 6 deletions solidity/contracts/lib/zeto_lock.sol
Original file line number Diff line number Diff line change
@@ -24,19 +24,14 @@ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Own
/// without using nullifiers. Each UTXO's spending status is explicitly tracked.
/// @author Kaleido, Inc.
/// @dev Implements common functionalities of Zeto based tokens without nullifiers
abstract contract ZetoLock is IZetoBase, IZetoLockable, OwnableUpgradeable {
abstract contract ZetoLock is IZetoBase, IZetoLockable {
// used for multi-step transaction flows that require counterparties
// to upload proofs. To protect the party that uploads their proof first,
// and prevent any other party from utilizing the uploaded proof to execute
// a transaction, the input UTXOs or nullifiers can be locked and only usable
// by the same party that did the locking.
mapping(uint256 => address) internal lockedUTXOs;

function __ZetoLock_init(
address lockVerifier,
address batchLockVerifier
) public onlyInitializing {}

// Locks the UTXOs so that they can only be spent by submitting the appropriate
// proof from the Eth account designated as the "delegate". This function
// should be called by escrow contracts that will use uploaded proofs
6 changes: 1 addition & 5 deletions solidity/contracts/zeto_anon.sol
Original file line number Diff line number Diff line change
@@ -16,7 +16,6 @@
pragma solidity ^0.8.27;

import {IZeto} from "./lib/interfaces/izeto.sol";
import {ILockVerifier, IBatchLockVerifier} from "./lib/interfaces/izeto_lockable.sol";
import {Groth16Verifier_CheckHashesValue} from "./lib/verifier_check_hashes_value.sol";
import {Groth16Verifier_CheckInputsOutputsValue} from "./lib/verifier_check_inputs_outputs_value.sol";
import {Groth16Verifier_CheckInputsOutputsValueBatch} from "./lib/verifier_check_inputs_outputs_value_batch.sol";
@@ -57,17 +56,14 @@ contract Zeto_Anon is
Groth16Verifier_CheckHashesValue depositVerifier,
Groth16Verifier_CheckInputsOutputsValue withdrawVerifier,
Groth16Verifier_AnonBatch batchVerifier,
Groth16Verifier_CheckInputsOutputsValueBatch batchWithdrawVerifier,
ILockVerifier lockVerifier,
IBatchLockVerifier batchLockVerifier
Groth16Verifier_CheckInputsOutputsValueBatch batchWithdrawVerifier
) public initializer {
__ZetoBase_init(initialOwner);
__ZetoFungibleWithdraw_init(
depositVerifier,
withdrawVerifier,
batchWithdrawVerifier
);
__ZetoLock_init(lockVerifier, batchLockVerifier);
_verifier = verifier;
_batchVerifier = batchVerifier;
}
6 changes: 1 addition & 5 deletions solidity/contracts/zeto_anon_enc.sol
Original file line number Diff line number Diff line change
@@ -16,7 +16,6 @@
pragma solidity ^0.8.27;

import {IZetoEncrypted} from "./lib/interfaces/izeto_encrypted.sol";
import {ILockVerifier, IBatchLockVerifier} from "./lib/interfaces/izeto_lockable.sol";
import {Groth16Verifier_CheckHashesValue} from "./lib/verifier_check_hashes_value.sol";
import {Groth16Verifier_CheckInputsOutputsValue} from "./lib/verifier_check_inputs_outputs_value.sol";
import {Groth16Verifier_CheckInputsOutputsValueBatch} from "./lib/verifier_check_inputs_outputs_value_batch.sol";
@@ -59,17 +58,14 @@ contract Zeto_AnonEnc is
Groth16Verifier_CheckHashesValue depositVerifier,
Groth16Verifier_CheckInputsOutputsValue withdrawVerifier,
Groth16Verifier_AnonEncBatch batchVerifier,
Groth16Verifier_CheckInputsOutputsValueBatch batchWithdrawVerifier,
ILockVerifier lockVerifier,
IBatchLockVerifier batchLockVerifier
Groth16Verifier_CheckInputsOutputsValueBatch batchWithdrawVerifier
) public initializer {
__ZetoBase_init(initialOwner);
__ZetoFungibleWithdraw_init(
depositVerifier,
withdrawVerifier,
batchWithdrawVerifier
);
__ZetoLock_init(lockVerifier, batchLockVerifier);
_verifier = verifier;
_batchVerifier = batchVerifier;
}
6 changes: 1 addition & 5 deletions solidity/contracts/zeto_anon_enc_nullifier.sol
Original file line number Diff line number Diff line change
@@ -16,7 +16,6 @@
pragma solidity ^0.8.27;

import {IZetoEncrypted} from "./lib/interfaces/izeto_encrypted.sol";
import {ILockVerifier, IBatchLockVerifier} from "./lib/interfaces/izeto_lockable.sol";
import {Groth16Verifier_CheckHashesValue} from "./lib/verifier_check_hashes_value.sol";
import {Groth16Verifier_CheckNullifierValue} from "./lib/verifier_check_nullifier_value.sol";
import {Groth16Verifier_CheckNullifierValueBatch} from "./lib/verifier_check_nullifier_value_batch.sol";
@@ -56,17 +55,14 @@ contract Zeto_AnonEncNullifier is
Groth16Verifier_CheckHashesValue depositVerifier,
Groth16Verifier_CheckNullifierValue withdrawVerifier,
Groth16Verifier_AnonEncNullifierBatch batchVerifier,
Groth16Verifier_CheckNullifierValueBatch batchWithdrawVerifier,
ILockVerifier lockVerifier,
IBatchLockVerifier batchLockVerifier
Groth16Verifier_CheckNullifierValueBatch batchWithdrawVerifier
) public initializer {
__ZetoNullifier_init(initialOwner);
__ZetoFungibleWithdrawWithNullifiers_init(
depositVerifier,
withdrawVerifier,
batchWithdrawVerifier
);
__ZetoLock_init(lockVerifier, batchLockVerifier);
_verifier = verifier;
_batchVerifier = batchVerifier;
}
6 changes: 1 addition & 5 deletions solidity/contracts/zeto_anon_enc_nullifier_kyc.sol
Original file line number Diff line number Diff line change
@@ -16,7 +16,6 @@
pragma solidity ^0.8.27;

import {IZetoEncrypted} from "./lib/interfaces/izeto_encrypted.sol";
import {ILockVerifier, IBatchLockVerifier} from "./lib/interfaces/izeto_lockable.sol";
import {Groth16Verifier_CheckHashesValue} from "./lib/verifier_check_hashes_value.sol";
import {Groth16Verifier_CheckNullifierValue} from "./lib/verifier_check_nullifier_value.sol";
import {Groth16Verifier_CheckNullifierValueBatch} from "./lib/verifier_check_nullifier_value_batch.sol";
@@ -58,9 +57,7 @@ contract Zeto_AnonEncNullifierKyc is
Groth16Verifier_CheckHashesValue depositVerifier,
Groth16Verifier_CheckNullifierValue withdrawVerifier,
Groth16Verifier_AnonEncNullifierKycBatch batchVerifier,
Groth16Verifier_CheckNullifierValueBatch batchWithdrawVerifier,
ILockVerifier lockVerifier,
IBatchLockVerifier batchLockVerifier
Groth16Verifier_CheckNullifierValueBatch batchWithdrawVerifier
) public initializer {
__Registry_init();
__ZetoNullifier_init(initialOwner);
@@ -69,7 +66,6 @@ contract Zeto_AnonEncNullifierKyc is
withdrawVerifier,
batchWithdrawVerifier
);
__ZetoLock_init(lockVerifier, batchLockVerifier);
_verifier = verifier;
_batchVerifier = batchVerifier;
}
Original file line number Diff line number Diff line change
@@ -21,7 +21,6 @@ import {Groth16Verifier_CheckNullifierValue} from "./lib/verifier_check_nullifie
import {Groth16Verifier_CheckNullifierValueBatch} from "./lib/verifier_check_nullifier_value_batch.sol";
import {Groth16Verifier_AnonEncNullifierNonRepudiation} from "./lib/verifier_anon_enc_nullifier_non_repudiation.sol";
import {Groth16Verifier_AnonEncNullifierNonRepudiationBatch} from "./lib/verifier_anon_enc_nullifier_non_repudiation_batch.sol";
import {ILockVerifier, IBatchLockVerifier} from "./lib/interfaces/izeto_lockable.sol";
import {ZetoNullifier} from "./lib/zeto_nullifier.sol";
import {ZetoFungibleWithdrawWithNullifiers} from "./lib/zeto_fungible_withdraw_nullifier.sol";
import {ZetoLock} from "./lib/zeto_lock.sol";
@@ -68,17 +67,14 @@ contract Zeto_AnonEncNullifierNonRepudiation is
Groth16Verifier_CheckHashesValue depositVerifier,
Groth16Verifier_CheckNullifierValue withdrawVerifier,
Groth16Verifier_AnonEncNullifierNonRepudiationBatch batchVerifier,
Groth16Verifier_CheckNullifierValueBatch batchWithdrawVerifier,
ILockVerifier lockVerifier,
IBatchLockVerifier batchLockVerifier
Groth16Verifier_CheckNullifierValueBatch batchWithdrawVerifier
) public initializer {
__ZetoNullifier_init(initialOwner);
__ZetoFungibleWithdrawWithNullifiers_init(
depositVerifier,
withdrawVerifier,
batchWithdrawVerifier
);
__ZetoLock_init(lockVerifier, batchLockVerifier);
_verifier = verifier;
_batchVerifier = batchVerifier;
}
6 changes: 1 addition & 5 deletions solidity/contracts/zeto_anon_nullifier.sol
Original file line number Diff line number Diff line change
@@ -17,7 +17,6 @@ pragma solidity ^0.8.27;

import {IZeto} from "./lib/interfaces/izeto.sol";
import {MAX_BATCH} from "./lib/interfaces/izeto_common.sol";
import {ILockVerifier, IBatchLockVerifier} from "./lib/interfaces/izeto_lockable.sol";
import {Groth16Verifier_CheckHashesValue} from "./lib/verifier_check_hashes_value.sol";
import {Groth16Verifier_CheckNullifierValue} from "./lib/verifier_check_nullifier_value.sol";
import {Groth16Verifier_CheckNullifierValueBatch} from "./lib/verifier_check_nullifier_value_batch.sol";
@@ -56,17 +55,14 @@ contract Zeto_AnonNullifier is
Groth16Verifier_CheckHashesValue depositVerifier,
Groth16Verifier_CheckNullifierValue withdrawVerifier,
Groth16Verifier_AnonNullifierBatch batchVerifier,
Groth16Verifier_CheckNullifierValueBatch batchWithdrawVerifier,
ILockVerifier lockVerifier,
IBatchLockVerifier batchLockVerifier
Groth16Verifier_CheckNullifierValueBatch batchWithdrawVerifier
) public initializer {
__ZetoNullifier_init(initialOwner);
__ZetoFungibleWithdrawWithNullifiers_init(
depositVerifier,
withdrawVerifier,
batchWithdrawVerifier
);
__ZetoLock_init(lockVerifier, batchLockVerifier);
_verifier = verifier;
_batchVerifier = batchVerifier;
}
6 changes: 1 addition & 5 deletions solidity/contracts/zeto_anon_nullifier_kyc.sol
Original file line number Diff line number Diff line change
@@ -16,7 +16,6 @@
pragma solidity ^0.8.27;

import {IZeto} from "./lib/interfaces/izeto.sol";
import {ILockVerifier, IBatchLockVerifier} from "./lib/interfaces/izeto_lockable.sol";
import {Groth16Verifier_CheckHashesValue} from "./lib/verifier_check_hashes_value.sol";
import {Groth16Verifier_CheckNullifierValue} from "./lib/verifier_check_nullifier_value.sol";
import {Groth16Verifier_CheckNullifierValueBatch} from "./lib/verifier_check_nullifier_value_batch.sol";
@@ -58,9 +57,7 @@ contract Zeto_AnonNullifierKyc is
Groth16Verifier_CheckHashesValue depositVerifier,
Groth16Verifier_CheckNullifierValue withdrawVerifier,
Groth16Verifier_AnonNullifierKycBatch batchVerifier,
Groth16Verifier_CheckNullifierValueBatch batchWithdrawVerifier,
ILockVerifier lockVerifier,
IBatchLockVerifier batchLockVerifier
Groth16Verifier_CheckNullifierValueBatch batchWithdrawVerifier
) public initializer {
__Registry_init();
__ZetoNullifier_init(initialOwner);
@@ -69,7 +66,6 @@ contract Zeto_AnonNullifierKyc is
withdrawVerifier,
batchWithdrawVerifier
);
__ZetoLock_init(lockVerifier, batchLockVerifier);
_verifier = verifier;
_batchVerifier = batchVerifier;
}
6 changes: 1 addition & 5 deletions solidity/contracts/zeto_nf_anon.sol
Original file line number Diff line number Diff line change
@@ -17,8 +17,6 @@ pragma solidity ^0.8.27;

import {IZeto} from "./lib/interfaces/izeto.sol";
import {Groth16Verifier_CheckUtxosNfOwner} from "./lib/verifier_check_utxos_nf_owner.sol";
import {ILockVerifier, IBatchLockVerifier} from "./lib/interfaces/izeto_lockable.sol";

import {Groth16Verifier_NfAnon} from "./lib/verifier_nf_anon.sol";
import {ZetoBase} from "./lib/zeto_base.sol";
import {ZetoLock} from "./lib/zeto_lock.sol";
@@ -36,11 +34,9 @@ contract Zeto_NfAnon is IZeto, ZetoBase, ZetoLock, UUPSUpgradeable {

function initialize(
address initialOwner,
Groth16Verifier_NfAnon verifier,
ILockVerifier lockVerifier
Groth16Verifier_NfAnon verifier
) public initializer {
__ZetoBase_init(initialOwner);
__ZetoLock_init(lockVerifier, IBatchLockVerifier(address(0)));
_verifier = verifier;
}

5 changes: 1 addition & 4 deletions solidity/contracts/zeto_nf_anon_nullifier.sol
Original file line number Diff line number Diff line change
@@ -16,7 +16,6 @@
pragma solidity ^0.8.27;

import {IZeto} from "./lib/interfaces/izeto.sol";
import {ILockVerifier, IBatchLockVerifier} from "./lib/interfaces/izeto_lockable.sol";
import {Groth16Verifier_NfAnonNullifier} from "./lib/verifier_nf_anon_nullifier.sol";
import {ZetoNullifier} from "./lib/zeto_nullifier.sol";
import {ZetoLock} from "./lib/zeto_lock.sol";
@@ -41,11 +40,9 @@ contract Zeto_NfAnonNullifier is

function initialize(
address initialOwner,
Groth16Verifier_NfAnonNullifier verifier,
ILockVerifier lockVerifier
Groth16Verifier_NfAnonNullifier verifier
) public initializer {
__ZetoNullifier_init(initialOwner);
__ZetoLock_init(lockVerifier, IBatchLockVerifier(address(0)));
_verifier = verifier;
}

Loading