diff --git a/src/lib/mina/actions/offchain-contract.unit-test.ts b/src/lib/mina/actions/offchain-contract.unit-test.ts index 2a9c5b216..14eb729b3 100644 --- a/src/lib/mina/actions/offchain-contract.unit-test.ts +++ b/src/lib/mina/actions/offchain-contract.unit-test.ts @@ -21,12 +21,14 @@ const offchainState = OffchainState( class StateProof extends offchainState.Proof {} +const offchainStateInstance = offchainState.init(); + // example contract that interacts with offchain state class ExampleContract extends SmartContract { @state(OffchainState.Commitments) offchainStateCommitments = offchainState.emptyCommitments(); - offchainState = offchainState.init(ExampleContract); + offchainState = offchainStateInstance; @method async createAccount(address: PublicKey, amountToMint: UInt64) { @@ -68,6 +70,9 @@ class ExampleContract extends SmartContract { let fromOption = await this.offchainState.fields.accounts.get(from); let fromBalance = fromOption.assertSome('sender account exists'); + Provable.asProver(() => { + console.log('transfer2'); + }); let toOption = await this.offchainState.fields.accounts.get(to); let toBalance = toOption.orElse(0n); @@ -117,6 +122,8 @@ class ExampleContract extends SmartContract { } } +offchainStateInstance.setContractClass(ExampleContract); + // connect contract to offchain state // offchainState.setContractClass(ExampleContract); diff --git a/src/lib/mina/actions/offchain-state.ts b/src/lib/mina/actions/offchain-state.ts index 1efb34636..ac0c0cca2 100644 --- a/src/lib/mina/actions/offchain-state.ts +++ b/src/lib/mina/actions/offchain-state.ts @@ -55,6 +55,8 @@ type OffchainStateInstance< setContractInstance(contractInstance: OffchainStateContract): void; + setContractClass(contractClass: OffchainStateContractClass): void; + /** * Create a proof that updates the commitments to offchain state: Merkle root and action state. */ @@ -104,9 +106,7 @@ type OffchainState = { emptyCommitments(): State; - init( - contractClass: OffchainStateContractClass - ): OffchainStateInstance; + init(): OffchainStateInstance; }; type OffchainStateContract< @@ -189,15 +189,15 @@ function OffchainState< const height = logTotalCapacity + 1; class IndexedMerkleMapN extends IndexedMerkleMap(height) {} + const emptyMerkleMapRoot = new IndexedMerkleMapN().root; + let rollup = OffchainStateRollup({ logTotalCapacity, maxActionsPerProof, maxActionsPerUpdate, }); - function OffchainStateInstance( - contractClass: OffchainStateContractClass - ): OffchainStateInstance { + function OffchainStateInstance(): OffchainStateInstance { type InternalState = { _contract: OffchainStateContract | undefined; _contractClass: OffchainStateContractClass | undefined; @@ -215,9 +215,10 @@ function OffchainState< }; function defaultInternalState(): InternalState { + console.log('defaultInternalState'); return { _contract: undefined, - _contractClass: contractClass, + _contractClass: undefined, merkleMap: new IndexedMerkleMapN(), valueMap: new Map(), @@ -249,10 +250,16 @@ function OffchainState< }; const merkleMaps = async () => { - if (internal.merkleMap !== undefined && internal.valueMap !== undefined) { + if ( + internal.merkleMap.root.toString() !== emptyMerkleMapRoot.toString() || + internal.valueMap.size > 0 + ) { + console.log('local merkle maps found'); return { merkleMap: internal.merkleMap, valueMap: internal.valueMap }; } + console.log('local merkle maps not found'); let actionState = await onchainActionState(); + console.log('actionState', actionState.toString()); let { merkleMap, valueMap } = await fetchMerkleMap( height, internal.contract, @@ -413,6 +420,13 @@ function OffchainState< // push action on account update let update = getContract().self; + Provable.asProver(() => { + console.log( + 'existing actions', + JSON.stringify(update.body.actions) + ); + console.log('pushing action', action.toString()); + }); update.body.actions = Actions.pushEvent(update.body.actions, action); }, @@ -426,6 +440,11 @@ function OffchainState< return { setContractInstance(contractInstance) { internal._contract = contractInstance; + internal._contractClass = + contractInstance.constructor as OffchainStateContractClass; + }, + setContractClass(contractClass) { + internal._contractClass = contractClass; }, async createSettlementProof() { let { merkleMap } = await merkleMaps(); @@ -490,8 +509,8 @@ function OffchainState< } return { - init(contractClass: OffchainStateContractClass) { - return OffchainStateInstance(contractClass); + init() { + return OffchainStateInstance(); }, async compile() {