diff --git a/yarn-project/simulator/src/avm/journal/journal.test.ts b/yarn-project/simulator/src/avm/journal/journal.test.ts index 07efb46a6471..09e368f01007 100644 --- a/yarn-project/simulator/src/avm/journal/journal.test.ts +++ b/yarn-project/simulator/src/avm/journal/journal.test.ts @@ -139,9 +139,9 @@ describe('journal', () => { it('Should maintain l1 messages', () => { const recipient = new Fr(1); - persistableState.writeL2ToL1Message(recipient, utxo); + persistableState.writeL2ToL1Message(address, recipient, utxo); expect(trace.traceNewL2ToL1Message).toHaveBeenCalledTimes(1); - expect(trace.traceNewL2ToL1Message).toHaveBeenCalledWith(recipient, utxo); + expect(trace.traceNewL2ToL1Message).toHaveBeenCalledWith(address, recipient, utxo); }); }); diff --git a/yarn-project/simulator/src/avm/journal/journal.ts b/yarn-project/simulator/src/avm/journal/journal.ts index 843b6ed90aec..b26c40418381 100644 --- a/yarn-project/simulator/src/avm/journal/journal.ts +++ b/yarn-project/simulator/src/avm/journal/journal.ts @@ -187,12 +187,13 @@ export class AvmPersistableStateManager { /** * Write an L2 to L1 message. + * @param contractAddress - L2 contract address that created this message * @param recipient - L1 contract address to send the message to. * @param content - Message content. */ - public writeL2ToL1Message(recipient: Fr, content: Fr) { - this.log.debug(`L1Messages(${recipient}) += ${content}.`); - this.trace.traceNewL2ToL1Message(recipient, content); + public writeL2ToL1Message(contractAddress: Fr, recipient: Fr, content: Fr) { + this.log.debug(`L2ToL1Messages(${contractAddress}) += (recipient: ${recipient}, content: ${content}).`); + this.trace.traceNewL2ToL1Message(contractAddress, recipient, content); } /** diff --git a/yarn-project/simulator/src/avm/opcodes/accrued_substate.test.ts b/yarn-project/simulator/src/avm/opcodes/accrued_substate.test.ts index 442bb985ba37..14841c01950a 100644 --- a/yarn-project/simulator/src/avm/opcodes/accrued_substate.test.ts +++ b/yarn-project/simulator/src/avm/opcodes/accrued_substate.test.ts @@ -362,7 +362,7 @@ describe('Accrued Substate', () => { /*contentOffset=*/ value1Offset, ).execute(context); expect(trace.traceNewL2ToL1Message).toHaveBeenCalledTimes(1); - expect(trace.traceNewL2ToL1Message).toHaveBeenCalledWith(/*recipient=*/ value0, /*content=*/ value1); + expect(trace.traceNewL2ToL1Message).toHaveBeenCalledWith(address, /*recipient=*/ value0, /*content=*/ value1); }); }); diff --git a/yarn-project/simulator/src/avm/opcodes/accrued_substate.ts b/yarn-project/simulator/src/avm/opcodes/accrued_substate.ts index e7b16a6b4f02..e5c1b7c3b0b8 100644 --- a/yarn-project/simulator/src/avm/opcodes/accrued_substate.ts +++ b/yarn-project/simulator/src/avm/opcodes/accrued_substate.ts @@ -268,7 +268,7 @@ export class SendL2ToL1Message extends Instruction { const recipient = memory.get(recipientOffset).toFr(); const content = memory.get(contentOffset).toFr(); - context.persistableState.writeL2ToL1Message(recipient, content); + context.persistableState.writeL2ToL1Message(context.environment.address, recipient, content); memory.assert({ reads: 2, addressing }); context.machineState.incrementPc(); diff --git a/yarn-project/simulator/src/public/side_effect_trace.test.ts b/yarn-project/simulator/src/public/side_effect_trace.test.ts index ff5a9efcff17..a0b4f16f7091 100644 --- a/yarn-project/simulator/src/public/side_effect_trace.test.ts +++ b/yarn-project/simulator/src/public/side_effect_trace.test.ts @@ -207,7 +207,7 @@ describe('Side Effect Trace', () => { }); it('Should trace new L2ToL1 messages', () => { - trace.traceNewL2ToL1Message(recipient, content); + trace.traceNewL2ToL1Message(address, recipient, content); expect(trace.getCounter()).toBe(startCounterPlus1); const pxResult = toPxResult(trace); @@ -326,9 +326,11 @@ describe('Side Effect Trace', () => { it('Should enforce maximum number of new l2 to l1 messages', () => { for (let i = 0; i < MAX_L2_TO_L1_MSGS_PER_TX; i++) { - trace.traceNewL2ToL1Message(new Fr(i), new Fr(i)); + trace.traceNewL2ToL1Message(new Fr(i), new Fr(i), new Fr(i)); } - expect(() => trace.traceNewL2ToL1Message(new Fr(42), new Fr(42))).toThrow(SideEffectLimitReachedError); + expect(() => trace.traceNewL2ToL1Message(new Fr(42), new Fr(42), new Fr(42))).toThrow( + SideEffectLimitReachedError, + ); }); it('Should enforce maximum number of new logs hashes', () => { @@ -390,7 +392,7 @@ describe('Side Effect Trace', () => { testCounter++; nestedTrace.traceL1ToL2MessageCheck(address, utxo, leafIndex, existsDefault); // counter does not increment for l1tol2 message checks - nestedTrace.traceNewL2ToL1Message(recipient, content); + nestedTrace.traceNewL2ToL1Message(address, recipient, content); testCounter++; nestedTrace.traceUnencryptedLog(address, log); testCounter++; diff --git a/yarn-project/simulator/src/public/side_effect_trace.ts b/yarn-project/simulator/src/public/side_effect_trace.ts index c5a458788d09..5e0f8d51cf76 100644 --- a/yarn-project/simulator/src/public/side_effect_trace.ts +++ b/yarn-project/simulator/src/public/side_effect_trace.ts @@ -182,7 +182,7 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface { // NOTE: counter does not increment for l1tol2 message checks (because it doesn't rely on pending messages) } - public traceNewL2ToL1Message(recipient: Fr, content: Fr) { + public traceNewL2ToL1Message(_contractAddress: Fr, recipient: Fr, content: Fr) { if (this.newL2ToL1Messages.length >= MAX_L2_TO_L1_MSGS_PER_TX) { throw new SideEffectLimitReachedError('l2 to l1 message', MAX_L2_TO_L1_MSGS_PER_TX); } diff --git a/yarn-project/simulator/src/public/side_effect_trace_interface.ts b/yarn-project/simulator/src/public/side_effect_trace_interface.ts index b5a6c397b00a..2d229d7f7b4e 100644 --- a/yarn-project/simulator/src/public/side_effect_trace_interface.ts +++ b/yarn-project/simulator/src/public/side_effect_trace_interface.ts @@ -16,8 +16,7 @@ export interface PublicSideEffectTraceInterface { traceNullifierCheck(storageAddress: Fr, nullifier: Fr, leafIndex: Fr, exists: boolean, isPending: boolean): void; traceNewNullifier(storageAddress: Fr, nullifier: Fr): void; traceL1ToL2MessageCheck(contractAddress: Fr, msgHash: Fr, msgLeafIndex: Fr, exists: boolean): void; - // TODO(dbanks12): should new message accept contract address as arg? - traceNewL2ToL1Message(recipient: Fr, content: Fr): void; + traceNewL2ToL1Message(contractAddress: Fr, recipient: Fr, content: Fr): void; traceUnencryptedLog(contractAddress: Fr, log: Fr[]): void; // TODO(dbanks12): odd that getContractInstance is a one-off in that it accepts an entire object instead of components traceGetContractInstance(instance: TracedContractInstance): void;