Skip to content

Commit 71c9e85

Browse files
committed
feat: Include contract address in message hash
1 parent b5292ec commit 71c9e85

File tree

2 files changed

+21
-15
lines changed

2 files changed

+21
-15
lines changed

yarn-project/end-to-end/src/e2e_token_contract.test.ts

+13-7
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ describe('e2e_token_contract', () => {
187187

188188
afterEach(async () => {
189189
await tokenSim.check();
190-
});
190+
}, 30_000);
191191

192192
describe('Access controlled functions', () => {
193193
it('Set admin', async () => {
@@ -351,6 +351,7 @@ describe('e2e_token_contract', () => {
351351
) => {
352352
return await hashPayload([
353353
caller.address.toField(),
354+
asset.address.toField(),
354355
FunctionSelector.fromSignature('transfer_public((Field),(Field),Field,Field)').toField(),
355356
from.address.toField(),
356357
to.address.toField(),
@@ -416,7 +417,7 @@ describe('e2e_token_contract', () => {
416417
await txReplay.isMined();
417418
const receiptReplay = await txReplay.getReceipt();
418419
expect(receiptReplay.status).toBe(TxStatus.DROPPED);
419-
}, 30_000);
420+
}, 45_000);
420421

421422
describe('failure cases', () => {
422423
it('transfer more than balance', async () => {
@@ -477,7 +478,7 @@ describe('e2e_token_contract', () => {
477478

478479
expect(await asset.methods.balance_of_public({ address: accounts[0].address }).view()).toEqual(balance0);
479480
expect(await asset.methods.balance_of_public({ address: accounts[1].address }).view()).toEqual(balance1);
480-
});
481+
}, 30_000);
481482

482483
it('transfer on behalf of other, wrong designated caller', async () => {
483484
const balance0 = await asset.methods.balance_of_public({ address: accounts[0].address }).view();
@@ -523,6 +524,7 @@ describe('e2e_token_contract', () => {
523524
) => {
524525
return await hashPayload([
525526
caller.address.toField(),
527+
asset.address.toField(),
526528
FunctionSelector.fromSignature('transfer((Field),(Field),Field,Field)').toField(),
527529
from.address.toField(),
528530
to.address.toField(),
@@ -541,7 +543,7 @@ describe('e2e_token_contract', () => {
541543
const receipt = await tx.wait();
542544
expect(receipt.status).toBe(TxStatus.MINED);
543545
tokenSim.transferPrivate(accounts[0].address, accounts[1].address, amount);
544-
});
546+
}, 30_000);
545547

546548
it('transfer to self', async () => {
547549
const balance0 = await asset.methods.balance_of_private({ address: accounts[0].address }).view();
@@ -553,7 +555,7 @@ describe('e2e_token_contract', () => {
553555
const receipt = await tx.wait();
554556
expect(receipt.status).toBe(TxStatus.MINED);
555557
tokenSim.transferPrivate(accounts[0].address, accounts[0].address, amount);
556-
});
558+
}, 30_000);
557559

558560
it('transfer on behalf of other', async () => {
559561
const balance0 = await asset.methods.balance_of_private({ address: accounts[0].address }).view();
@@ -695,6 +697,7 @@ describe('e2e_token_contract', () => {
695697
) => {
696698
return await hashPayload([
697699
caller.address.toField(),
700+
asset.address.toField(),
698701
FunctionSelector.fromSignature('shield((Field),Field,Field,Field)').toField(),
699702
from.address.toField(),
700703
new Fr(amount),
@@ -733,7 +736,7 @@ describe('e2e_token_contract', () => {
733736
await txClaimDoubleSpend.isMined();
734737
const receiptDoubleSpend = await txClaimDoubleSpend.getReceipt();
735738
expect(receiptDoubleSpend.status).toBe(TxStatus.DROPPED);
736-
});
739+
}, 30_000);
737740

738741
it('on behalf of other', async () => {
739742
const balancePub = await asset.methods.balance_of_public({ address: accounts[0].address }).view();
@@ -783,7 +786,7 @@ describe('e2e_token_contract', () => {
783786
await txClaimDoubleSpend.isMined();
784787
const receiptDoubleSpend = await txClaimDoubleSpend.getReceipt();
785788
expect(receiptDoubleSpend.status).toBe(TxStatus.DROPPED);
786-
}, 30_000);
789+
}, 60_000);
787790

788791
describe('failure cases', () => {
789792
it('on behalf of self (more than balance)', async () => {
@@ -887,6 +890,7 @@ describe('e2e_token_contract', () => {
887890
) => {
888891
return await hashPayload([
889892
caller.address.toField(),
893+
asset.address.toField(),
890894
FunctionSelector.fromSignature('unshield((Field),(Field),Field,Field)').toField(),
891895
accounts[0].address.toField(),
892896
accounts[1].address.toField(),
@@ -1017,6 +1021,7 @@ describe('e2e_token_contract', () => {
10171021
const burnMessageHash = async (caller: CompleteAddress, from: CompleteAddress, amount: bigint, nonce: Fr) => {
10181022
return await hashPayload([
10191023
caller.address.toField(),
1024+
asset.address.toField(),
10201025
FunctionSelector.fromSignature('burn_public((Field),Field,Field)').toField(),
10211026
from.address.toField(),
10221027
new Fr(amount),
@@ -1153,6 +1158,7 @@ describe('e2e_token_contract', () => {
11531158
const burnMessageHash = async (caller: CompleteAddress, from: CompleteAddress, amount: bigint, nonce: Fr) => {
11541159
return await hashPayload([
11551160
caller.address.toField(),
1161+
asset.address.toField(),
11561162
FunctionSelector.fromSignature('burn((Field),Field,Field)').toField(),
11571163
from.address.toField(),
11581164
new Fr(amount),

yarn-project/noir-contracts/src/contracts/token_contract/src/main.nr

+8-8
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ mod util;
55
// Minimal token implementation that supports `AuthWit` accounts.
66
// The auth message follows a similar pattern to the cross-chain message and includes a designated caller.
77
// The designated caller is ALWAYS used here, and not based on a flag as cross-chain.
8-
// message hash = H([caller, selector, , ...args])
9-
// To be read as `caller` calls function defined by `selector` with `args`
8+
// message hash = H([caller, contract, selector, ...args])
9+
// To be read as `caller` calls function at `contract` defined by `selector` with `args`
1010
// Including a nonce in the message hash ensures that the message can only be used once.
1111

1212
contract Token {
@@ -165,7 +165,7 @@ contract Token {
165165
if (from.address != context.msg_sender()) {
166166
// The redeem is only spendable once, so we need to ensure that you cannot insert multiple shields from the same message.
167167
let selector = compute_selector("shield((Field),Field,Field,Field)");
168-
let message_field = compute_message_hash([context.msg_sender(), selector, from.address, amount, secret_hash, nonce]);
168+
let message_field = compute_message_hash([context.msg_sender(), context.this_address(), selector, from.address, amount, secret_hash, nonce]);
169169
AccountContract::at(from.address).is_valid(Context::public(&mut context), message_field);
170170
} else {
171171
assert(nonce == 0, "invalid nonce");
@@ -193,7 +193,7 @@ contract Token {
193193

194194
if (from.address != context.msg_sender()) {
195195
let selector = compute_selector("transfer_public((Field),(Field),Field,Field)");
196-
let message_field = compute_message_hash([context.msg_sender(), selector, from.address, to.address, amount, nonce]);
196+
let message_field = compute_message_hash([context.msg_sender(), context.this_address(), selector, from.address, to.address, amount, nonce]);
197197
AccountContract::at(from.address).is_valid(Context::public(&mut context), message_field);
198198
} else {
199199
assert(nonce == 0, "invalid nonce");
@@ -217,7 +217,7 @@ contract Token {
217217

218218
if (from.address != context.msg_sender()) {
219219
let selector = compute_selector("burn_public((Field),Field,Field)");
220-
let message_field = compute_message_hash([context.msg_sender(), selector, from.address, amount, nonce]);
220+
let message_field = compute_message_hash([context.msg_sender(), context.this_address(), selector, from.address, amount, nonce]);
221221
AccountContract::at(from.address).is_valid(Context::public(&mut context), message_field);
222222
} else {
223223
assert(nonce == 0, "invalid nonce");
@@ -257,7 +257,7 @@ contract Token {
257257

258258
if (from.address != context.msg_sender()) {
259259
let selector = compute_selector("unshield((Field),(Field),Field,Field)");
260-
let message_field = compute_message_hash([context.msg_sender(), selector, from.address, to.address, amount, nonce]);
260+
let message_field = compute_message_hash([context.msg_sender(), context.this_address(), selector, from.address, to.address, amount, nonce]);
261261
AccountContract::at(from.address).is_valid(Context::private(&mut context), message_field);
262262
} else {
263263
assert(nonce == 0, "invalid nonce");
@@ -281,7 +281,7 @@ contract Token {
281281

282282
if (from.address != context.msg_sender()) {
283283
let selector = compute_selector("transfer((Field),(Field),Field,Field)");
284-
let message_field = compute_message_hash([context.msg_sender(), selector, from.address, to.address, amount, nonce]);
284+
let message_field = compute_message_hash([context.msg_sender(), context.this_address(), selector, from.address, to.address, amount, nonce]);
285285
AccountContract::at(from.address).is_valid(Context::private(&mut context), message_field);
286286
} else {
287287
assert(nonce == 0, "invalid nonce");
@@ -304,7 +304,7 @@ contract Token {
304304

305305
if (from.address != context.msg_sender()) {
306306
let selector = compute_selector("burn((Field),Field,Field)");
307-
let message_field = compute_message_hash([context.msg_sender(), selector, from.address, amount, nonce]);
307+
let message_field = compute_message_hash([context.msg_sender(), context.this_address(), selector, from.address, amount, nonce]);
308308
AccountContract::at(from.address).is_valid(Context::private(&mut context), message_field);
309309
} else {
310310
assert(nonce == 0, "invalid nonce");

0 commit comments

Comments
 (0)