diff --git a/solidity/contracts/erc20.sol b/solidity/contracts/erc20.sol index bafd737..681f38f 100644 --- a/solidity/contracts/erc20.sol +++ b/solidity/contracts/erc20.sol @@ -17,7 +17,6 @@ pragma solidity ^0.8.20; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; -import "hardhat/console.sol"; /// @title A sample implementation of a Zeto based fungible token with anonymity and no encryption /// @author Kaleido, Inc. diff --git a/solidity/contracts/lib/interfaces/izeto.sol b/solidity/contracts/lib/interfaces/izeto.sol new file mode 100644 index 0000000..a7f1034 --- /dev/null +++ b/solidity/contracts/lib/interfaces/izeto.sol @@ -0,0 +1,27 @@ +// Copyright © 2024 Kaleido, Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +pragma solidity ^0.8.20; + +import {IZetoBase} from "./izeto_base.sol"; + +interface IZeto is IZetoBase { + event UTXOTransfer( + uint256[] inputs, + uint256[] outputs, + address indexed submitter, + bytes data + ); +} diff --git a/solidity/contracts/lib/interfaces/izeto_base.sol b/solidity/contracts/lib/interfaces/izeto_base.sol new file mode 100644 index 0000000..65e3042 --- /dev/null +++ b/solidity/contracts/lib/interfaces/izeto_base.sol @@ -0,0 +1,20 @@ +// Copyright © 2024 Kaleido, Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +pragma solidity ^0.8.20; + +interface IZetoBase { + event UTXOMint(uint256[] outputs, address indexed submitter, bytes data); +} diff --git a/solidity/contracts/lib/interfaces/izeto_encrypted.sol b/solidity/contracts/lib/interfaces/izeto_encrypted.sol new file mode 100644 index 0000000..798e740 --- /dev/null +++ b/solidity/contracts/lib/interfaces/izeto_encrypted.sol @@ -0,0 +1,29 @@ +// Copyright © 2024 Kaleido, Inc. +// +// SPDX-License-Identifier: Apache-2.0 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +pragma solidity ^0.8.20; + +import {IZetoBase} from "./izeto_base.sol"; + +interface IZetoEncrypted is IZetoBase { + event UTXOTransferWithEncryptedValues( + uint256[] inputs, + uint256[] outputs, + uint256 encryptionNonce, + uint256[] encryptedValues, + address indexed submitter, + bytes data + ); +} diff --git a/solidity/contracts/lib/registry.sol b/solidity/contracts/lib/registry.sol index 553091f..895e7ce 100644 --- a/solidity/contracts/lib/registry.sol +++ b/solidity/contracts/lib/registry.sol @@ -19,7 +19,6 @@ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Own import {SmtLib} from "@iden3/contracts/lib/SmtLib.sol"; import {PoseidonUnit2L, PoseidonUnit3L} from "@iden3/contracts/lib/Poseidon.sol"; import {Commonlib} from "./common.sol"; -import "hardhat/console.sol"; uint256 constant MAX_SMT_DEPTH = 64; diff --git a/solidity/contracts/lib/zeto_base.sol b/solidity/contracts/lib/zeto_base.sol index dd0692b..11909ab 100644 --- a/solidity/contracts/lib/zeto_base.sol +++ b/solidity/contracts/lib/zeto_base.sol @@ -15,6 +15,7 @@ // limitations under the License. pragma solidity ^0.8.20; +import {IZetoBase} from "./interfaces/izeto_base.sol"; import {Commonlib} from "./common.sol"; import {Registry} from "./registry.sol"; import {ZetoCommon} from "./zeto_common.sol"; @@ -25,7 +26,7 @@ import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; /// 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 ZetoBase is ZetoCommon { +abstract contract ZetoBase is IZetoBase, ZetoCommon { enum UTXOStatus { UNKNOWN, // default value for the empty UTXO slots UNSPENT, @@ -114,7 +115,7 @@ abstract contract ZetoBase is ZetoCommon { // This function is used to mint new UTXOs, as an example implementation, // which is only callable by the owner. - function _mint(uint256[] memory utxos) internal virtual { + function _mint(uint256[] memory utxos, bytes calldata data) internal virtual { for (uint256 i = 0; i < utxos.length; ++i) { uint256 utxo = utxos[i]; if (_utxos[utxo] == UTXOStatus.UNSPENT) { @@ -125,6 +126,6 @@ abstract contract ZetoBase is ZetoCommon { _utxos[utxo] = UTXOStatus.UNSPENT; } - emit UTXOMint(utxos, msg.sender); + emit UTXOMint(utxos, msg.sender, data); } } diff --git a/solidity/contracts/lib/zeto_common.sol b/solidity/contracts/lib/zeto_common.sol index 94826be..567216e 100644 --- a/solidity/contracts/lib/zeto_common.sol +++ b/solidity/contracts/lib/zeto_common.sol @@ -23,22 +23,6 @@ import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/Own /// @author Kaleido, Inc. /// @dev Implements common functionalities of Zeto based tokens abstract contract ZetoCommon is OwnableUpgradeable { - event UTXOMint(uint256[] outputs, address indexed submitter); - - event UTXOTransfer( - uint256[] inputs, - uint256[] outputs, - address indexed submitter - ); - - event UTXOTransferWithEncryptedValues( - uint256[] inputs, - uint256[] outputs, - uint256 encryptionNonce, - uint256[] encryptedValues, - address indexed submitter - ); - error UTXONotMinted(uint256 utxo); error UTXOAlreadyOwned(uint256 utxo); error UTXOAlreadySpent(uint256 utxo); diff --git a/solidity/contracts/lib/zeto_nullifier.sol b/solidity/contracts/lib/zeto_nullifier.sol index 6912f4c..eb81919 100644 --- a/solidity/contracts/lib/zeto_nullifier.sol +++ b/solidity/contracts/lib/zeto_nullifier.sol @@ -15,6 +15,7 @@ // limitations under the License. pragma solidity ^0.8.20; +import {IZetoBase} from "./interfaces/izeto_base.sol"; import {Commonlib} from "./common.sol"; import {Registry} from "./registry.sol"; import {ZetoCommon} from "./zeto_common.sol"; @@ -27,7 +28,7 @@ uint256 constant MAX_SMT_DEPTH = 64; /// @title A sample base implementation of a Zeto based token contract with nullifiers /// @author Kaleido, Inc. /// @dev Implements common functionalities of Zeto based tokens using nullifiers -abstract contract ZetoNullifier is ZetoCommon { +abstract contract ZetoNullifier is IZetoBase, ZetoCommon { SmtLib.Data internal _commitmentsTree; using SmtLib for SmtLib.Data; mapping(uint256 => bool) private _nullifiers; @@ -110,7 +111,7 @@ abstract contract ZetoNullifier is ZetoCommon { // This function is used to mint new UTXOs, as an example implementation, // which is only callable by the owner. - function _mint(uint256[] memory utxos) internal virtual { + function _mint(uint256[] memory utxos, bytes calldata data) internal virtual { for (uint256 i = 0; i < utxos.length; ++i) { uint256 utxo = utxos[i]; if (utxo == 0) { @@ -126,7 +127,7 @@ abstract contract ZetoNullifier is ZetoCommon { _commitmentsTree.addLeaf(utxo, utxo); } - emit UTXOMint(utxos, msg.sender); + emit UTXOMint(utxos, msg.sender, data); } function getRoot() public view returns (uint256) { diff --git a/solidity/contracts/zeto_anon.sol b/solidity/contracts/zeto_anon.sol index cbf922e..74b0dc0 100644 --- a/solidity/contracts/zeto_anon.sol +++ b/solidity/contracts/zeto_anon.sol @@ -15,6 +15,7 @@ // limitations under the License. pragma solidity ^0.8.20; +import {IZeto} from "./lib/interfaces/izeto.sol"; import {Groth16Verifier_CheckHashesValue} from "./lib/verifier_check_hashes_value.sol"; import {Groth16Verifier_CheckInputsOutputsValue} from "./lib/verifier_check_inputs_outputs_value.sol"; import {Groth16Verifier_Anon} from "./lib/verifier_anon.sol"; @@ -25,7 +26,6 @@ import {ZetoFungible} from "./lib/zeto_fungible.sol"; import {ZetoFungibleWithdraw} from "./lib/zeto_fungible_withdraw.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import "hardhat/console.sol"; /// @title A sample implementation of a Zeto based fungible token with anonymity and no encryption /// @author Kaleido, Inc. @@ -34,7 +34,7 @@ import "hardhat/console.sol"; /// - the sum of the input values match the sum of output values /// - the hashes in the input and output match the `hash(value, salt, owner public key)` formula /// - the sender possesses the private BabyJubjub key, whose public key is part of the pre-image of the input commitment hashes -contract Zeto_Anon is ZetoBase, ZetoFungibleWithdraw, UUPSUpgradeable { +contract Zeto_Anon is IZeto, ZetoBase, ZetoFungibleWithdraw, UUPSUpgradeable { Groth16Verifier_Anon internal verifier; function initialize( @@ -63,7 +63,8 @@ contract Zeto_Anon is ZetoBase, ZetoFungibleWithdraw, UUPSUpgradeable { function transfer( uint256[2] memory inputs, uint256[2] memory outputs, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public returns (bool) { require( validateTransactionProposal(inputs, outputs, proof), @@ -91,7 +92,7 @@ contract Zeto_Anon is ZetoBase, ZetoFungibleWithdraw, UUPSUpgradeable { inputArray[i] = inputs[i]; outputArray[i] = outputs[i]; } - emit UTXOTransfer(inputArray, outputArray, msg.sender); + emit UTXOTransfer(inputArray, outputArray, msg.sender, data); return true; } @@ -99,12 +100,13 @@ contract Zeto_Anon is ZetoBase, ZetoFungibleWithdraw, UUPSUpgradeable { function deposit( uint256 amount, uint256 utxo, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public { _deposit(amount, utxo, proof); uint256[] memory utxos = new uint256[](1); utxos[0] = utxo; - _mint(utxos); + _mint(utxos, data); } function withdraw( @@ -118,7 +120,7 @@ contract Zeto_Anon is ZetoBase, ZetoFungibleWithdraw, UUPSUpgradeable { processInputsAndOutputs(inputs, [output, 0]); } - function mint(uint256[] memory utxos) public onlyOwner { - _mint(utxos); + function mint(uint256[] memory utxos, bytes calldata data) public onlyOwner { + _mint(utxos, data); } } diff --git a/solidity/contracts/zeto_anon_enc.sol b/solidity/contracts/zeto_anon_enc.sol index 6310f60..fc6ae8d 100644 --- a/solidity/contracts/zeto_anon_enc.sol +++ b/solidity/contracts/zeto_anon_enc.sol @@ -15,6 +15,7 @@ // limitations under the License. pragma solidity ^0.8.20; +import {IZetoEncrypted} from "./lib/interfaces/izeto_encrypted.sol"; import {Groth16Verifier_CheckHashesValue} from "./lib/verifier_check_hashes_value.sol"; import {Groth16Verifier_CheckInputsOutputsValue} from "./lib/verifier_check_inputs_outputs_value.sol"; import {Groth16Verifier_AnonEnc} from "./lib/verifier_anon_enc.sol"; @@ -25,7 +26,6 @@ import {Registry} from "./lib/registry.sol"; import {Commonlib} from "./lib/common.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import "hardhat/console.sol"; /// @title A sample implementation of a Zeto based fungible token with anonymity, and encryption /// @author Kaleido, Inc. @@ -36,7 +36,7 @@ import "hardhat/console.sol"; /// - the sender possesses the private BabyJubjub key, whose public key is part of the pre-image of the input commitment hashes /// - the encrypted value in the input is derived from the receiver's UTXO value and encrypted with a shared secret using /// the ECDH protocol between the sender and receiver (this guarantees data availability for the receiver) -contract Zeto_AnonEnc is ZetoBase, ZetoFungibleWithdraw, UUPSUpgradeable { +contract Zeto_AnonEnc is IZetoEncrypted, ZetoBase, ZetoFungibleWithdraw, UUPSUpgradeable { Groth16Verifier_AnonEnc internal verifier; function initialize( @@ -67,7 +67,8 @@ contract Zeto_AnonEnc is ZetoBase, ZetoFungibleWithdraw, UUPSUpgradeable { uint256[2] memory outputs, uint256 encryptionNonce, uint256[4] memory encryptedValues, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public returns (bool) { require( validateTransactionProposal(inputs, outputs, proof), @@ -112,7 +113,8 @@ contract Zeto_AnonEnc is ZetoBase, ZetoFungibleWithdraw, UUPSUpgradeable { outputArray, encryptionNonce, encryptedValuesArray, - msg.sender + msg.sender, + data ); return true; } @@ -120,12 +122,13 @@ contract Zeto_AnonEnc is ZetoBase, ZetoFungibleWithdraw, UUPSUpgradeable { function deposit( uint256 amount, uint256 utxo, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public { _deposit(amount, utxo, proof); uint256[] memory utxos = new uint256[](1); utxos[0] = utxo; - _mint(utxos); + _mint(utxos, data); } function withdraw( @@ -139,7 +142,7 @@ contract Zeto_AnonEnc is ZetoBase, ZetoFungibleWithdraw, UUPSUpgradeable { processInputsAndOutputs(inputs, [output, 0]); } - function mint(uint256[] memory utxos) public onlyOwner { - _mint(utxos); + function mint(uint256[] memory utxos, bytes calldata data) public onlyOwner { + _mint(utxos, data); } } diff --git a/solidity/contracts/zeto_anon_enc_nullifier.sol b/solidity/contracts/zeto_anon_enc_nullifier.sol index 2c8b653..d262f08 100644 --- a/solidity/contracts/zeto_anon_enc_nullifier.sol +++ b/solidity/contracts/zeto_anon_enc_nullifier.sol @@ -15,6 +15,7 @@ // limitations under the License. pragma solidity ^0.8.20; +import {IZetoEncrypted} from "./lib/interfaces/izeto_encrypted.sol"; import {Groth16Verifier_CheckHashesValue} from "./lib/verifier_check_hashes_value.sol"; import {Groth16Verifier_CheckNullifierValue} from "./lib/verifier_check_nullifier_value.sol"; import {Groth16Verifier_AnonEncNullifier} from "./lib/verifier_anon_enc_nullifier.sol"; @@ -23,7 +24,6 @@ import {ZetoFungibleWithdrawWithNullifiers} from "./lib/zeto_fungible_withdraw_n import {Registry} from "./lib/registry.sol"; import {Commonlib} from "./lib/common.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import "hardhat/console.sol"; /// @title A sample implementation of a Zeto based fungible token with anonymity, encryption and history masking /// @author Kaleido, Inc. @@ -35,6 +35,7 @@ import "hardhat/console.sol"; /// - the encrypted value in the input is derived from the receiver's UTXO value and encrypted with a shared secret using the ECDH protocol between the sender and receiver (this guarantees data availability for the receiver) /// - the nullifiers represent input commitments that are included in a Sparse Merkle Tree represented by the root hash contract Zeto_AnonEncNullifier is + IZetoEncrypted, ZetoNullifier, ZetoFungibleWithdrawWithNullifiers, UUPSUpgradeable @@ -77,7 +78,8 @@ contract Zeto_AnonEncNullifier is uint256 root, uint256 encryptionNonce, uint256[4] memory encryptedValues, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public returns (bool) { require( validateTransactionProposal(nullifiers, outputs, root), @@ -126,7 +128,8 @@ contract Zeto_AnonEncNullifier is outputArray, encryptionNonce, encryptedValuesArray, - msg.sender + msg.sender, + data ); return true; } @@ -134,12 +137,13 @@ contract Zeto_AnonEncNullifier is function deposit( uint256 amount, uint256 utxo, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public { _deposit(amount, utxo, proof); uint256[] memory utxos = new uint256[](1); utxos[0] = utxo; - _mint(utxos); + _mint(utxos, data); } function withdraw( @@ -154,7 +158,7 @@ contract Zeto_AnonEncNullifier is processInputsAndOutputs(nullifiers, [output, 0]); } - function mint(uint256[] memory utxos) public onlyOwner { - _mint(utxos); + function mint(uint256[] memory utxos, bytes calldata data) public onlyOwner { + _mint(utxos, data); } } diff --git a/solidity/contracts/zeto_anon_enc_nullifier_kyc.sol b/solidity/contracts/zeto_anon_enc_nullifier_kyc.sol index 02a6993..05bdb0c 100644 --- a/solidity/contracts/zeto_anon_enc_nullifier_kyc.sol +++ b/solidity/contracts/zeto_anon_enc_nullifier_kyc.sol @@ -15,6 +15,7 @@ // limitations under the License. pragma solidity ^0.8.20; +import {IZetoEncrypted} from "./lib/interfaces/izeto_encrypted.sol"; import {Groth16Verifier_CheckHashesValue} from "./lib/verifier_check_hashes_value.sol"; import {Groth16Verifier_CheckNullifierValue} from "./lib/verifier_check_nullifier_value.sol"; import {Groth16Verifier_AnonEncNullifierKyc} from "./lib/verifier_anon_enc_nullifier_kyc.sol"; @@ -23,7 +24,6 @@ import {ZetoFungibleWithdrawWithNullifiers} from "./lib/zeto_fungible_withdraw_n import {Registry} from "./lib/registry.sol"; import {Commonlib} from "./lib/common.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import "hardhat/console.sol"; /// @title A sample implementation of a Zeto based fungible token with anonymity, encryption and history masking /// @author Kaleido, Inc. @@ -35,6 +35,7 @@ import "hardhat/console.sol"; /// - the encrypted value in the input is derived from the receiver's UTXO value and encrypted with a shared secret using the ECDH protocol between the sender and receiver (this guarantees data availability for the receiver) /// - the nullifiers represent input commitments that are included in a Sparse Merkle Tree represented by the root hash contract Zeto_AnonEncNullifierKyc is + IZetoEncrypted, ZetoNullifier, ZetoFungibleWithdrawWithNullifiers, Registry, @@ -82,7 +83,8 @@ contract Zeto_AnonEncNullifierKyc is uint256 root, uint256 encryptionNonce, uint256[4] memory encryptedValues, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public returns (bool) { require( validateTransactionProposal(nullifiers, outputs, root), @@ -132,7 +134,8 @@ contract Zeto_AnonEncNullifierKyc is outputArray, encryptionNonce, encryptedValuesArray, - msg.sender + msg.sender, + data ); return true; } @@ -145,12 +148,13 @@ contract Zeto_AnonEncNullifierKyc is function deposit( uint256 amount, uint256 utxo, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public { _deposit(amount, utxo, proof); uint256[] memory utxos = new uint256[](1); utxos[0] = utxo; - _mint(utxos); + _mint(utxos, data); } function withdraw( @@ -165,7 +169,7 @@ contract Zeto_AnonEncNullifierKyc is processInputsAndOutputs(nullifiers, [output, 0]); } - function mint(uint256[] memory utxos) public onlyOwner { - _mint(utxos); + function mint(uint256[] memory utxos, bytes calldata data) public onlyOwner { + _mint(utxos, data); } } diff --git a/solidity/contracts/zeto_anon_enc_nullifier_non_repudiation.sol b/solidity/contracts/zeto_anon_enc_nullifier_non_repudiation.sol index ce30a31..991b9ab 100644 --- a/solidity/contracts/zeto_anon_enc_nullifier_non_repudiation.sol +++ b/solidity/contracts/zeto_anon_enc_nullifier_non_repudiation.sol @@ -23,7 +23,6 @@ import {ZetoNullifier} from "./lib/zeto_nullifier.sol"; import {ZetoFungibleWithdrawWithNullifiers} from "./lib/zeto_fungible_withdraw_nullifier.sol"; import {Registry} from "./lib/registry.sol"; import {Commonlib} from "./lib/common.sol"; -import "hardhat/console.sol"; /// @title A sample implementation of a Zeto based fungible token with anonymity, encryption and history masking /// @author Kaleido, Inc. @@ -45,7 +44,8 @@ contract Zeto_AnonEncNullifierNonRepudiation is uint256 encryptionNonce, uint256[] encryptedValuesForReceiver, uint256[] encryptedValuesForAuthority, - address indexed submitter + address indexed submitter, + bytes data ); Groth16Verifier_AnonEncNullifierNonRepudiation verifier; @@ -101,7 +101,8 @@ contract Zeto_AnonEncNullifierNonRepudiation is uint256 encryptionNonce, uint256[4] memory encryptedValuesForReceiver, uint256[16] memory encryptedValuesForAuthority, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public returns (bool) { require( validateTransactionProposal(nullifiers, outputs, root), @@ -175,7 +176,8 @@ contract Zeto_AnonEncNullifierNonRepudiation is encryptionNonce, encryptedValuesReceiverArray, encryptedValuesAuthorityArray, - msg.sender + msg.sender, + data ); return true; } @@ -183,12 +185,13 @@ contract Zeto_AnonEncNullifierNonRepudiation is function deposit( uint256 amount, uint256 utxo, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public { _deposit(amount, utxo, proof); uint256[] memory utxos = new uint256[](1); utxos[0] = utxo; - _mint(utxos); + _mint(utxos, data); } function withdraw( @@ -203,7 +206,7 @@ contract Zeto_AnonEncNullifierNonRepudiation is processInputsAndOutputs(nullifiers, [output, 0]); } - function mint(uint256[] memory utxos) public onlyOwner { - _mint(utxos); + function mint(uint256[] memory utxos, bytes calldata data) public onlyOwner { + _mint(utxos, data); } } diff --git a/solidity/contracts/zeto_anon_nullifier.sol b/solidity/contracts/zeto_anon_nullifier.sol index a3c3e1e..144a64f 100644 --- a/solidity/contracts/zeto_anon_nullifier.sol +++ b/solidity/contracts/zeto_anon_nullifier.sol @@ -15,6 +15,7 @@ // limitations under the License. pragma solidity ^0.8.20; +import {IZeto} from "./lib/interfaces/izeto.sol"; import {Groth16Verifier_CheckHashesValue} from "./lib/verifier_check_hashes_value.sol"; import {Groth16Verifier_CheckNullifierValue} from "./lib/verifier_check_nullifier_value.sol"; import {Groth16Verifier_AnonNullifier} from "./lib/verifier_anon_nullifier.sol"; @@ -26,7 +27,6 @@ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import {SmtLib} from "@iden3/contracts/lib/SmtLib.sol"; import {PoseidonUnit3L} from "@iden3/contracts/lib/Poseidon.sol"; -import "hardhat/console.sol"; uint256 constant MAX_SMT_DEPTH = 64; @@ -39,6 +39,7 @@ uint256 constant MAX_SMT_DEPTH = 64; /// - the sender possesses the private BabyJubjub key, whose public key is part of the pre-image of the input commitment hashes, which match the corresponding nullifiers /// - the nullifiers represent input commitments that are included in a Sparse Merkle Tree represented by the root hash contract Zeto_AnonNullifier is + IZeto, ZetoNullifier, ZetoFungibleWithdrawWithNullifiers, UUPSUpgradeable @@ -76,7 +77,8 @@ contract Zeto_AnonNullifier is uint256[2] memory nullifiers, uint256[2] memory outputs, uint256 root, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public returns (bool) { require( validateTransactionProposal(nullifiers, outputs, root), @@ -107,19 +109,20 @@ contract Zeto_AnonNullifier is nullifierArray[i] = nullifiers[i]; outputArray[i] = outputs[i]; } - emit UTXOTransfer(nullifierArray, outputArray, msg.sender); + emit UTXOTransfer(nullifierArray, outputArray, msg.sender, data); return true; } function deposit( uint256 amount, uint256 utxo, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public { _deposit(amount, utxo, proof); uint256[] memory utxos = new uint256[](1); utxos[0] = utxo; - _mint(utxos); + _mint(utxos, data); } function withdraw( @@ -134,7 +137,7 @@ contract Zeto_AnonNullifier is processInputsAndOutputs(nullifiers, [output, 0]); } - function mint(uint256[] memory utxos) public onlyOwner { - _mint(utxos); + function mint(uint256[] memory utxos, bytes calldata data) public onlyOwner { + _mint(utxos, data); } } diff --git a/solidity/contracts/zeto_anon_nullifier_kyc.sol b/solidity/contracts/zeto_anon_nullifier_kyc.sol index 427088c..0d5469b 100644 --- a/solidity/contracts/zeto_anon_nullifier_kyc.sol +++ b/solidity/contracts/zeto_anon_nullifier_kyc.sol @@ -15,6 +15,7 @@ // limitations under the License. pragma solidity ^0.8.20; +import {IZeto} from "./lib/interfaces/izeto.sol"; import {Groth16Verifier_CheckHashesValue} from "./lib/verifier_check_hashes_value.sol"; import {Groth16Verifier_CheckNullifierValue} from "./lib/verifier_check_nullifier_value.sol"; import {Groth16Verifier_AnonNullifierKyc} from "./lib/verifier_anon_nullifier_kyc.sol"; @@ -26,7 +27,6 @@ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import {SmtLib} from "@iden3/contracts/lib/SmtLib.sol"; import {PoseidonUnit3L} from "@iden3/contracts/lib/Poseidon.sol"; -import "hardhat/console.sol"; uint256 constant MAX_SMT_DEPTH = 64; @@ -39,6 +39,7 @@ uint256 constant MAX_SMT_DEPTH = 64; /// - the sender possesses the private BabyJubjub key, whose public key is part of the pre-image of the input commitment hashes, which match the corresponding nullifiers /// - the nullifiers represent input commitments that are included in a Sparse Merkle Tree represented by the root hash contract Zeto_AnonNullifierKyc is + IZeto, ZetoNullifier, ZetoFungibleWithdrawWithNullifiers, Registry, @@ -82,7 +83,8 @@ contract Zeto_AnonNullifierKyc is uint256[2] memory nullifiers, uint256[2] memory outputs, uint256 root, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public returns (bool) { require( validateTransactionProposal(nullifiers, outputs, root), @@ -114,19 +116,20 @@ contract Zeto_AnonNullifierKyc is nullifierArray[i] = nullifiers[i]; outputArray[i] = outputs[i]; } - emit UTXOTransfer(nullifierArray, outputArray, msg.sender); + emit UTXOTransfer(nullifierArray, outputArray, msg.sender, data); return true; } function deposit( uint256 amount, uint256 utxo, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public { _deposit(amount, utxo, proof); uint256[] memory utxos = new uint256[](1); utxos[0] = utxo; - _mint(utxos); + _mint(utxos, data); } function withdraw( @@ -141,7 +144,7 @@ contract Zeto_AnonNullifierKyc is processInputsAndOutputs(nullifiers, [output, 0]); } - function mint(uint256[] memory utxos) public onlyOwner { - _mint(utxos); + function mint(uint256[] memory utxos, bytes calldata data) public onlyOwner { + _mint(utxos, data); } } diff --git a/solidity/contracts/zeto_nf_anon.sol b/solidity/contracts/zeto_nf_anon.sol index fdf881a..7424a28 100644 --- a/solidity/contracts/zeto_nf_anon.sol +++ b/solidity/contracts/zeto_nf_anon.sol @@ -15,13 +15,13 @@ // limitations under the License. pragma solidity ^0.8.20; +import {IZeto} from "./lib/interfaces/izeto.sol"; import {Groth16Verifier_NfAnon} from "./lib/verifier_nf_anon.sol"; import {ZetoBase} from "./lib/zeto_base.sol"; import {Registry} from "./lib/registry.sol"; import {Commonlib} from "./lib/common.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; -import "hardhat/console.sol"; /// @title A sample implementation of a Zeto based non-fungible token with anonymity and no encryption /// @author Kaleido, Inc. @@ -29,7 +29,7 @@ import "hardhat/console.sol"; /// - The sender owns the private key whose public key is part of the pre-image of the input UTXOs commitments /// (aka the sender is authorized to spend the input UTXOs) /// - The input UTXOs and output UTXOs are valid in terms of obeying mass conservation rules -contract Zeto_NfAnon is ZetoBase, UUPSUpgradeable { +contract Zeto_NfAnon is IZeto, ZetoBase, UUPSUpgradeable { Groth16Verifier_NfAnon internal verifier; function initialize( @@ -55,7 +55,8 @@ contract Zeto_NfAnon is ZetoBase, UUPSUpgradeable { function transfer( uint256 input, uint256 output, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public returns (bool) { require( validateTransactionProposal([input, 0], [output, 0], proof), @@ -81,11 +82,11 @@ contract Zeto_NfAnon is ZetoBase, UUPSUpgradeable { inputArray[0] = input; outputArray[0] = output; - emit UTXOTransfer(inputArray, outputArray, msg.sender); + emit UTXOTransfer(inputArray, outputArray, msg.sender, data); return true; } - function mint(uint256[] memory utxos) public { - _mint(utxos); + function mint(uint256[] memory utxos, bytes calldata data) public { + _mint(utxos, data); } } diff --git a/solidity/contracts/zeto_nf_anon_nullifier.sol b/solidity/contracts/zeto_nf_anon_nullifier.sol index 9c33baf..2a758dd 100644 --- a/solidity/contracts/zeto_nf_anon_nullifier.sol +++ b/solidity/contracts/zeto_nf_anon_nullifier.sol @@ -15,6 +15,7 @@ // limitations under the License. pragma solidity ^0.8.20; +import {IZeto} from "./lib/interfaces/izeto.sol"; import {Groth16Verifier_NfAnonNullifier} from "./lib/verifier_nf_anon_nullifier.sol"; import {ZetoNullifier} from "./lib/zeto_nullifier.sol"; import {Registry} from "./lib/registry.sol"; @@ -23,7 +24,6 @@ import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; import {SmtLib} from "@iden3/contracts/lib/SmtLib.sol"; import {PoseidonUnit3L} from "@iden3/contracts/lib/Poseidon.sol"; -import "hardhat/console.sol"; uint256 constant MAX_SMT_DEPTH = 64; @@ -35,7 +35,7 @@ uint256 constant MAX_SMT_DEPTH = 64; /// - the hashes in the input and output match the hash(value, salt, owner public key) formula /// - the sender possesses the private BabyJubjub key, whose public key is part of the pre-image of the input commitment hashes, which match the corresponding nullifiers /// - the nullifiers represent input commitments that are included in a Sparse Merkle Tree represented by the root hash -contract Zeto_NfAnonNullifier is ZetoNullifier, UUPSUpgradeable { +contract Zeto_NfAnonNullifier is IZeto, ZetoNullifier, UUPSUpgradeable { Groth16Verifier_NfAnonNullifier verifier; function initialize( @@ -63,7 +63,8 @@ contract Zeto_NfAnonNullifier is ZetoNullifier, UUPSUpgradeable { uint256 nullifier, uint256 output, uint256 root, - Commonlib.Proof calldata proof + Commonlib.Proof calldata proof, + bytes calldata data ) public returns (bool) { require( validateTransactionProposal([nullifier, 0], [output, 0], root), @@ -89,11 +90,11 @@ contract Zeto_NfAnonNullifier is ZetoNullifier, UUPSUpgradeable { nullifierArray[0] = nullifier; outputArray[0] = output; - emit UTXOTransfer(nullifierArray, outputArray, msg.sender); + emit UTXOTransfer(nullifierArray, outputArray, msg.sender, data); return true; } - function mint(uint256[] memory utxos) public { - _mint(utxos); + function mint(uint256[] memory utxos, bytes calldata data) public { + _mint(utxos, data); } } diff --git a/solidity/contracts/zkDvP.sol b/solidity/contracts/zkDvP.sol index 438f5c3..a36d2f9 100644 --- a/solidity/contracts/zkDvP.sol +++ b/solidity/contracts/zkDvP.sol @@ -18,7 +18,6 @@ pragma solidity ^0.8.20; import {Commonlib} from "./lib/common.sol"; import {Zeto_Anon} from "./zeto_anon.sol"; import {Zeto_NfAnon} from "./zeto_nf_anon.sol"; -import "hardhat/console.sol"; /// @title A sample on-chain implementation of a DvP escrow contract using ZKP based C-UTXO tokens /// @author Kaleido, Inc. @@ -221,7 +220,8 @@ contract zkDvP { paymentToken.transfer( trade.paymentInputs, trade.paymentOutputs, - trade.paymentProof + trade.paymentProof, + "" ), "Payment branch of the trade failed" ); @@ -229,7 +229,8 @@ contract zkDvP { assetToken.transfer( trade.assetInput, trade.assetOutput, - trade.assetProof + trade.assetProof, + "" ), "Asset branch of the trade failed" ); diff --git a/solidity/test/lib/utils.ts b/solidity/test/lib/utils.ts index 2be8e1a..25dde5b 100644 --- a/solidity/test/lib/utils.ts +++ b/solidity/test/lib/utils.ts @@ -77,7 +77,9 @@ export function newAssetNullifier(utxo: UTXO, owner: User): UTXO { export async function doMint(zetoTokenContract: any, minter: Signer, outputs: UTXO[]): Promise { const outputCommitments = outputs.map((output) => output.hash) as BigNumberish[]; - const tx = await zetoTokenContract.connect(minter).mint(outputCommitments); + const tx = await zetoTokenContract + .connect(minter) + .mint(outputCommitments, "0x"); const result = await tx.wait(); console.log(`Method mint() complete. Gas used: ${result?.gasUsed}`); return result; diff --git a/solidity/test/zeto_anon.ts b/solidity/test/zeto_anon.ts index 1fc606e..765a94c 100644 --- a/solidity/test/zeto_anon.ts +++ b/solidity/test/zeto_anon.ts @@ -72,7 +72,9 @@ describe("Zeto based fungible token with anonymity without encryption or nullifi utxo100 = newUTXO(100, Alice); const { outputCommitments, encodedProof } = await prepareDepositProof(Alice, utxo100); - const tx2 = await zeto.connect(Alice.signer).deposit(100, outputCommitments[0], encodedProof); + const tx2 = await zeto + .connect(Alice.signer) + .deposit(100, outputCommitments[0], encodedProof, "0x"); await tx2.wait(); }); @@ -219,7 +221,9 @@ describe("Zeto based fungible token with anonymity without encryption or nullifi encodedProof: any ) { const signerAddress = await signer.signer.getAddress(); - const tx = await zeto.connect(signer.signer).transfer(inputCommitments, outputCommitments, encodedProof); + const tx = await zeto + .connect(signer.signer) + .transfer(inputCommitments, outputCommitments, encodedProof, "0x"); const results = await tx.wait(); console.log(`Method transfer() complete. Gas used: ${results?.gasUsed}`); diff --git a/solidity/test/zeto_anon_enc.ts b/solidity/test/zeto_anon_enc.ts index 53270b5..b2e6e1f 100644 --- a/solidity/test/zeto_anon_enc.ts +++ b/solidity/test/zeto_anon_enc.ts @@ -69,7 +69,9 @@ describe("Zeto based fungible token with anonymity and encryption", function () utxo100 = newUTXO(100, Alice); const { outputCommitments, encodedProof } = await prepareDepositProof(Alice, utxo100); - const tx2 = await zeto.connect(Alice.signer).deposit(100, outputCommitments[0], encodedProof); + const tx2 = await zeto + .connect(Alice.signer) + .deposit(100, outputCommitments[0], encodedProof, "0x"); await tx2.wait(); }); @@ -259,7 +261,16 @@ describe("Zeto based fungible token with anonymity and encryption", function () encryptionNonce: BigNumberish, encodedProof: any ) { - const tx = await zeto.connect(signer.signer).transfer(inputCommitments, outputCommitments, encryptionNonce, encryptedValues, encodedProof); + const tx = await zeto + .connect(signer.signer) + .transfer( + inputCommitments, + outputCommitments, + encryptionNonce, + encryptedValues, + encodedProof, + "0x" + ); const results: ContractTransactionReceipt | null = await tx.wait(); for (const input of inputCommitments) { diff --git a/solidity/test/zeto_anon_enc_nullifier.ts b/solidity/test/zeto_anon_enc_nullifier.ts index 41e3c42..de80627 100644 --- a/solidity/test/zeto_anon_enc_nullifier.ts +++ b/solidity/test/zeto_anon_enc_nullifier.ts @@ -84,7 +84,9 @@ describe("Zeto based fungible token with anonymity using nullifiers and encrypti utxo100 = newUTXO(100, Alice); const { outputCommitments, encodedProof } = await prepareDepositProof(Alice, utxo100); - const tx2 = await zeto.connect(Alice.signer).deposit(100, outputCommitments[0], encodedProof); + const tx2 = await zeto + .connect(Alice.signer) + .deposit(100, outputCommitments[0], encodedProof, "0x"); await tx2.wait(); await smtAlice.add(utxo100.hash, utxo100.hash); @@ -415,7 +417,17 @@ describe("Zeto based fungible token with anonymity using nullifiers and encrypti encodedProof: any ) { const startTx = Date.now(); - const tx = await zeto.connect(signer.signer).transfer(nullifiers, outputCommitments, root, encryptionNonce, encryptedValues, encodedProof); + const tx = await zeto + .connect(signer.signer) + .transfer( + nullifiers, + outputCommitments, + root, + encryptionNonce, + encryptedValues, + encodedProof, + "0x" + ); const results: ContractTransactionReceipt | null = await tx.wait(); console.log(`Time to execute transaction: ${Date.now() - startTx}ms. Gas used: ${results?.gasUsed}`); return results; diff --git a/solidity/test/zeto_anon_enc_nullifier_kyc.ts b/solidity/test/zeto_anon_enc_nullifier_kyc.ts index d28e5f8..509de0a 100644 --- a/solidity/test/zeto_anon_enc_nullifier_kyc.ts +++ b/solidity/test/zeto_anon_enc_nullifier_kyc.ts @@ -134,7 +134,7 @@ describe('Zeto based fungible token with anonymity using nullifiers and encrypti ); const tx2 = await zeto .connect(Alice.signer) - .deposit(100, outputCommitments[0], encodedProof); + .deposit(100, outputCommitments[0], encodedProof, "0x"); await tx2.wait(); await smtAlice.add(utxo100.hash, utxo100.hash); @@ -394,7 +394,7 @@ describe('Zeto based fungible token with anonymity using nullifiers and encrypti ); const tx2 = await zeto .connect(unregistered.signer) - .deposit(100, outputCommitments[0], encodedProof); + .deposit(100, outputCommitments[0], encodedProof, "0x"); await tx2.wait(); // Alice tracks the UTXO inside the SMT @@ -953,7 +953,8 @@ describe('Zeto based fungible token with anonymity using nullifiers and encrypti root, encryptionNonce, encryptedValues, - encodedProof + encodedProof, + "0x" ); const results: ContractTransactionReceipt | null = await tx.wait(); console.log( diff --git a/solidity/test/zeto_anon_enc_nullifier_non_repudiation.ts b/solidity/test/zeto_anon_enc_nullifier_non_repudiation.ts index 7512a8b..4cceead 100644 --- a/solidity/test/zeto_anon_enc_nullifier_non_repudiation.ts +++ b/solidity/test/zeto_anon_enc_nullifier_non_repudiation.ts @@ -89,7 +89,9 @@ describe("Zeto based fungible token with anonymity using nullifiers and encrypti utxo100 = newUTXO(100, Alice); const { outputCommitments, encodedProof } = await prepareDepositProof(Alice, utxo100); - const tx2 = await zeto.connect(Alice.signer).deposit(100, outputCommitments[0], encodedProof); + const tx2 = await zeto + .connect(Alice.signer) + .deposit(100, outputCommitments[0], encodedProof, "0x"); await tx2.wait(); await smtAlice.add(utxo100.hash, utxo100.hash); @@ -446,7 +448,18 @@ describe("Zeto based fungible token with anonymity using nullifiers and encrypti const startTx = Date.now(); const encryptedValuesForReceiver = encryptedValues.slice(0, 4); const encryptedValuesForRegulator = encryptedValues.slice(4, 20); - const tx = await zeto.connect(signer.signer).transfer(nullifiers, outputCommitments, root, encryptionNonce, encryptedValuesForReceiver, encryptedValuesForRegulator, encodedProof); + const tx = await zeto + .connect(signer.signer) + .transfer( + nullifiers, + outputCommitments, + root, + encryptionNonce, + encryptedValuesForReceiver, + encryptedValuesForRegulator, + encodedProof, + "0x" + ); const results: ContractTransactionReceipt | null = await tx.wait(); console.log(`Time to execute transaction: ${Date.now() - startTx}ms. Gas used: ${results?.gasUsed}`); return results; diff --git a/solidity/test/zeto_anon_nullifier.ts b/solidity/test/zeto_anon_nullifier.ts index 158bb43..82bbee4 100644 --- a/solidity/test/zeto_anon_nullifier.ts +++ b/solidity/test/zeto_anon_nullifier.ts @@ -84,7 +84,9 @@ describe("Zeto based fungible token with anonymity using nullifiers without encr utxo100 = newUTXO(100, Alice); const { outputCommitments, encodedProof } = await prepareDepositProof(Alice, utxo100); - const tx2 = await zeto.connect(Alice.signer).deposit(100, outputCommitments[0], encodedProof); + const tx2 = await zeto + .connect(Alice.signer) + .deposit(100, outputCommitments[0], encodedProof, "0x"); await tx2.wait(); await smtAlice.add(utxo100.hash, utxo100.hash); @@ -402,7 +404,9 @@ describe("Zeto based fungible token with anonymity using nullifiers without encr encodedProof: any ) { const startTx = Date.now(); - const tx = await zeto.connect(signer.signer).transfer(nullifiers, outputCommitments, root, encodedProof); + const tx = await zeto + .connect(signer.signer) + .transfer(nullifiers, outputCommitments, root, encodedProof, "0x"); const results: ContractTransactionReceipt | null = await tx.wait(); console.log(`Time to execute transaction: ${Date.now() - startTx}ms. Gas used: ${results?.gasUsed}`); return results; diff --git a/solidity/test/zeto_anon_nullifier_kyc.ts b/solidity/test/zeto_anon_nullifier_kyc.ts index fc4d09c..3abaf07 100644 --- a/solidity/test/zeto_anon_nullifier_kyc.ts +++ b/solidity/test/zeto_anon_nullifier_kyc.ts @@ -105,8 +105,13 @@ describe("Zeto based fungible token with anonymity, KYC, using nullifiers withou await tx1.wait(); utxo100 = newUTXO(100, Alice); - const { outputCommitments, encodedProof } = await prepareDepositProof(Alice, utxo100); - const tx2 = await zeto.connect(Alice.signer).deposit(100, outputCommitments[0], encodedProof); + const { outputCommitments, encodedProof } = await prepareDepositProof( + Alice, + utxo100 + ); + const tx2 = await zeto + .connect(Alice.signer) + .deposit(100, outputCommitments[0], encodedProof, "0x"); await tx2.wait(); await smtAlice.add(utxo100.hash, utxo100.hash); @@ -281,8 +286,13 @@ describe("Zeto based fungible token with anonymity, KYC, using nullifiers withou await tx1.wait(); unregisteredUtxo100 = newUTXO(100, unregistered); - const { outputCommitments, encodedProof } = await prepareDepositProof(unregistered, unregisteredUtxo100); - const tx2 = await zeto.connect(unregistered.signer).deposit(100, outputCommitments[0], encodedProof); + const { outputCommitments, encodedProof } = await prepareDepositProof( + unregistered, + unregisteredUtxo100 + ); + const tx2 = await zeto + .connect(unregistered.signer) + .deposit(100, outputCommitments[0], encodedProof, "0x"); await tx2.wait(); // Alice tracks the UTXO inside the SMT @@ -572,7 +582,9 @@ describe("Zeto based fungible token with anonymity, KYC, using nullifiers withou encodedProof: any ) { const startTx = Date.now(); - const tx = await zeto.connect(signer.signer).transfer(nullifiers, outputCommitments, root, encodedProof); + const tx = await zeto + .connect(signer.signer) + .transfer(nullifiers, outputCommitments, root, encodedProof, "0x"); const results: ContractTransactionReceipt | null = await tx.wait(); console.log(`Time to execute transaction: ${Date.now() - startTx}ms. Gas used: ${results?.gasUsed}`); return results; diff --git a/solidity/test/zeto_nf_anon.ts b/solidity/test/zeto_nf_anon.ts index 543fae0..c514609 100644 --- a/solidity/test/zeto_nf_anon.ts +++ b/solidity/test/zeto_nf_anon.ts @@ -126,7 +126,9 @@ describe("Zeto based non-fungible token with anonymity without encryption or nul outputCommitment: BigNumberish, encodedProof: any ) { - const tx = await zeto.connect(signer.signer).transfer(inputCommitment, outputCommitment, encodedProof); + const tx = await zeto + .connect(signer.signer) + .transfer(inputCommitment, outputCommitment, encodedProof, "0x"); const results = await tx.wait(); console.log(`Method transfer() complete. Gas used: ${results?.gasUsed}`); diff --git a/solidity/test/zeto_nf_anon_nullifier.ts b/solidity/test/zeto_nf_anon_nullifier.ts index 8b2a33f..f721e66 100644 --- a/solidity/test/zeto_nf_anon_nullifier.ts +++ b/solidity/test/zeto_nf_anon_nullifier.ts @@ -264,7 +264,9 @@ describe("Zeto based non-fungible token with anonymity using nullifiers without encodedProof: any ) { const startTx = Date.now(); - const tx = await zeto.connect(signer.signer).transfer(nullifier, outputCommitment, root, encodedProof); + const tx = await zeto + .connect(signer.signer) + .transfer(nullifier, outputCommitment, root, encodedProof, "0x"); const results: ContractTransactionReceipt | null = await tx.wait(); console.log(`Time to execute transaction: ${Date.now() - startTx}ms. Gas used: ${results?.gasUsed}`); return results;