Skip to content

Commit 82f611a

Browse files
authored
Merge pull request #85 from hyperledger-labs/lock-delegate
Add delegate to lockProof()
2 parents 713dcce + a203759 commit 82f611a

File tree

3 files changed

+24
-2
lines changed

3 files changed

+24
-2
lines changed

solidity/contracts/lib/zeto_common.sol

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,17 @@ abstract contract ZetoCommon is OwnableUpgradeable {
4343
// should be called by escrow contracts that will use uploaded proofs
4444
// to execute transactions, in order to prevent the proof from being used
4545
// by parties other than the escrow contract
46-
function lockProof(Commonlib.Proof calldata proof) public {
46+
function lockProof(
47+
Commonlib.Proof calldata proof,
48+
address delegate
49+
) public {
4750
bytes32 proofHash = Commonlib.getProofHash(proof);
48-
lockedProofs[proofHash] = msg.sender;
51+
require(
52+
lockedProofs[proofHash] == address(0) ||
53+
lockedProofs[proofHash] == msg.sender,
54+
"Proof already locked by another party"
55+
);
56+
lockedProofs[proofHash] = delegate;
4957
}
5058

5159
function sortInputsAndOutputs(

solidity/contracts/zkDvP.sol

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -206,8 +206,10 @@ contract zkDvP {
206206
bytes32 proofHash = getProofHash(proof);
207207
if (trade.paymentProofHash == proofHash) {
208208
trade.paymentProof = proof;
209+
paymentToken.lockProof(proof, address(this));
209210
} else if (trade.assetProofHash == proofHash) {
210211
trade.assetProof = proof;
212+
assetToken.lockProof(proof, address(this));
211213
} else {
212214
revert("Invalid proof");
213215
}

solidity/test/zkDvP.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,18 @@ describe("DvP flows between fungible and non-fungible tokens based on Zeto with
219219
await expect(zkDvP.connect(Bob.signer).acceptTrade(tradeId, [0, 0], [0, 0], mockProofHash, 0, 0, mockProofHash)).rejectedWith("Payment inputs must be provided to accept the trade");
220220
await expect(zkDvP.connect(Bob.signer).acceptTrade(tradeId, [utxo3.hash, utxo4.hash], [0, 0], mockProofHash, 0, 0, mockProofHash)).rejectedWith("Payment outputs must be provided to accept the trade");
221221
});
222+
223+
it("test proof locking", async function () {
224+
const circuit1 = await loadCircuit('anon');
225+
const { provingKeyFile: provingKey1 } = loadProvingKeys('anon');
226+
const utxo1 = newUTXO(100, Alice);
227+
const proof = await zetoAnonTests.prepareProof(circuit1, provingKey1, Alice, [utxo1, ZERO_UTXO], [utxo1, ZERO_UTXO], [Alice, {}]);
228+
229+
await expect(zkPayment.connect(Alice.signer).lockProof(proof.encodedProof, await Alice.signer.getAddress())).fulfilled;
230+
await expect(zkPayment.connect(Bob.signer).lockProof(proof.encodedProof, await Bob.signer.getAddress())).rejectedWith("Proof already locked by another party");
231+
await expect(zkPayment.connect(Alice.signer).lockProof(proof.encodedProof, await Bob.signer.getAddress())).fulfilled;
232+
await expect(zkPayment.connect(Bob.signer).lockProof(proof.encodedProof, "0x0000000000000000000000000000000000000000")).fulfilled;
233+
});
222234
});
223235

224236
}).timeout(600000);

0 commit comments

Comments
 (0)