11import {
22 AccountUpdate ,
33 Bool ,
4- Experimental ,
54 Field ,
65 method ,
76 Permissions ,
@@ -14,10 +13,11 @@ import {
1413 Struct ,
1514 TokenContract ,
1615 TokenId ,
16+ Unconstrained ,
1717 VerificationKey ,
1818} from "o1js" ;
1919import { noop , range , TypedClass } from "@proto-kit/common" ;
20- import { container , injectable , singleton } from "tsyringe" ;
20+ import { container } from "tsyringe" ;
2121
2222import {
2323 OUTGOING_MESSAGE_BATCH_SIZE ,
@@ -61,16 +61,10 @@ export class OutgoingMessageKey extends Struct({
6161 tokenId : Field ,
6262} ) { }
6363
64- @injectable ( )
65- @singleton ( )
66- export class BridgeContractContext {
67- public data : {
68- messageInputs : any [ ] [ ] ;
69- } = { messageInputs : [ ] } ;
70- }
71-
7264export interface BridgeContractArgs {
73- SettlementContract : TypedClass < BridgingSettlementContractType > &
65+ SettlementContract : TypedClass <
66+ Pick < BridgingSettlementContractType , "assertStateRoot" >
67+ > &
7468 typeof SmartContract ;
7569 messageProcessors : OutgoingMessageProcessor < unknown > [ ] ;
7670 batchSize ?: number ;
@@ -171,40 +165,44 @@ export abstract class BridgeContractBase
171165 ) ;
172166 }
173167
174- private executeProcessors ( batchIndex : number , args : OutgoingMessageArgument ) {
168+ private executeProcessors ( args : OutgoingMessageArgument ) {
175169 const { messageProcessors } = this . getInitializationArgs ( ) ;
176170 return messageProcessors . map ( ( processor , j ) => {
177- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
178- const value = Experimental . memoizeWitness ( processor . type , ( ) => {
179- return container . resolve ( BridgeContractContext ) . data . messageInputs [
180- batchIndex
181- ] [ j ] ;
171+ const messageType = processor . getMessageType ( ) ;
172+
173+ // Create the message struct from unconstrained message argument Field[]
174+ const value = Provable . witness ( processor . type , ( ) => {
175+ if ( args . messageType . toString ( ) === messageType . toString ( ) ) {
176+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
177+ const fieldData = ( args . data as Unconstrained < Field [ ] > ) . get ( ) ;
178+ return processor . type . fromFields ( fieldData ) ;
179+ } else {
180+ return processor . dummy ( ) ;
181+ }
182182 } ) ;
183183
184184 const MessageType = createMessageStruct ( processor . type ) ;
185185 const message = new MessageType ( {
186- messageType : args . messageType ,
186+ messageType,
187187 value,
188188 } ) ;
189+ const result = processor . processMessage ( value , {
190+ bridgeContract : {
191+ publicKey : this . address ,
192+ tokenId : this . tokenId ,
193+ } ,
194+ } ) ;
189195 return {
190- messageType : args . messageType ,
191- result : processor . processMessage ( value , {
192- bridgeContract : {
193- publicKey : this . address ,
194- tokenId : this . tokenId ,
195- } ,
196- } ) ,
196+ // messageType is authenticated via the hash, which is checked again
197+ messageType,
198+ result,
197199 hash : Poseidon . hash ( MessageType . toFields ( message ) ) ,
198200 } ;
199201 } ) ;
200202 }
201203
202- public processMessage (
203- batchIndex : number ,
204- args : OutgoingMessageArgument ,
205- isDummy : Bool
206- ) {
207- const results = this . executeProcessors ( batchIndex , args ) ;
204+ public processMessage ( args : OutgoingMessageArgument , isDummy : Bool ) {
205+ const results = this . executeProcessors ( args ) ;
208206
209207 const maxAccountUpdates = Math . max (
210208 0 ,
@@ -290,7 +288,7 @@ export abstract class BridgeContractBase
290288
291289 const isDummy = batch . isDummys [ i ] ;
292290
293- const message = this . processMessage ( i , args , isDummy ) ;
291+ const message = this . processMessage ( args , isDummy ) ;
294292
295293 // Check witness
296294 const path = Path . fromKey (
@@ -302,6 +300,10 @@ export abstract class BridgeContractBase
302300 }
303301 ) ;
304302
303+ Provable . log ( message . hash ) ;
304+ Provable . log ( path ) ;
305+ Provable . log ( stateRoot ) ;
306+
305307 args . witness
306308 . checkMembership ( stateRoot , path , message . hash )
307309 . or ( isDummy )
0 commit comments