@proto-kit/protocol 0.1.1-develop.165 → 0.1.1-develop.1661
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Constants.js +1 -0
- package/dist/Constants.js.map +1 -0
- package/dist/hashing/mina-prefixes.d.ts +10 -0
- package/dist/hashing/mina-prefixes.d.ts.map +1 -0
- package/dist/hashing/mina-prefixes.js +10 -0
- package/dist/hashing/mina-prefixes.js.map +1 -0
- package/dist/hashing/protokit-prefixes.d.ts +10 -0
- package/dist/hashing/protokit-prefixes.d.ts.map +1 -0
- package/dist/hashing/protokit-prefixes.js +24 -0
- package/dist/hashing/protokit-prefixes.js.map +1 -0
- package/dist/hooks/AccountStateHook.d.ts +52 -0
- package/dist/hooks/AccountStateHook.d.ts.map +1 -0
- package/dist/hooks/AccountStateHook.js +52 -0
- package/dist/hooks/AccountStateHook.js.map +1 -0
- package/dist/hooks/BlockHeightHook.d.ts +7 -0
- package/dist/hooks/BlockHeightHook.d.ts.map +1 -0
- package/dist/hooks/BlockHeightHook.js +16 -0
- package/dist/hooks/BlockHeightHook.js.map +1 -0
- package/dist/hooks/LastStateRootBlockHook.d.ts +7 -0
- package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -0
- package/dist/hooks/LastStateRootBlockHook.js +16 -0
- package/dist/hooks/LastStateRootBlockHook.js.map +1 -0
- package/dist/hooks/NoopBlockHook.d.ts +8 -0
- package/dist/hooks/NoopBlockHook.d.ts.map +1 -0
- package/dist/hooks/NoopBlockHook.js +10 -0
- package/dist/hooks/NoopBlockHook.js.map +1 -0
- package/dist/hooks/NoopSettlementHook.d.ts +6 -0
- package/dist/hooks/NoopSettlementHook.d.ts.map +1 -0
- package/dist/{prover/statetransition/StateTransitionWitnessProvider.js → hooks/NoopSettlementHook.js} +8 -7
- package/dist/hooks/NoopSettlementHook.js.map +1 -0
- package/dist/hooks/NoopTransactionHook.d.ts +6 -0
- package/dist/hooks/NoopTransactionHook.d.ts.map +1 -0
- package/dist/hooks/NoopTransactionHook.js +11 -0
- package/dist/hooks/NoopTransactionHook.js.map +1 -0
- package/dist/index.d.ts +51 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -9
- package/dist/index.js.map +1 -0
- package/dist/model/AppliedStateTransitionBatch.d.ts +114 -0
- package/dist/model/AppliedStateTransitionBatch.d.ts.map +1 -0
- package/dist/model/AppliedStateTransitionBatch.js +16 -0
- package/dist/model/AppliedStateTransitionBatch.js.map +1 -0
- package/dist/model/MethodPublicOutput.d.ts +83 -29
- package/dist/model/MethodPublicOutput.d.ts.map +1 -1
- package/dist/model/MethodPublicOutput.js +4 -1
- package/dist/model/MethodPublicOutput.js.map +1 -0
- package/dist/model/Option.d.ts +70 -42
- package/dist/model/Option.d.ts.map +1 -1
- package/dist/model/Option.js +62 -47
- package/dist/model/Option.js.map +1 -0
- package/dist/model/Path.d.ts +4 -3
- package/dist/model/Path.d.ts.map +1 -1
- package/dist/model/Path.js +6 -5
- package/dist/model/Path.js.map +1 -0
- package/dist/model/RuntimeLike.d.ts +11 -0
- package/dist/model/RuntimeLike.d.ts.map +1 -0
- package/dist/model/RuntimeLike.js +2 -0
- package/dist/model/RuntimeLike.js.map +1 -0
- package/dist/model/StateTransition.d.ts +67 -16
- package/dist/model/StateTransition.d.ts.map +1 -1
- package/dist/model/StateTransition.js +18 -2
- package/dist/model/StateTransition.js.map +1 -0
- package/dist/model/StateTransitionProvableBatch.d.ts +389 -16
- package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -1
- package/dist/model/StateTransitionProvableBatch.js +88 -11
- package/dist/model/StateTransitionProvableBatch.js.map +1 -0
- package/dist/model/network/NetworkState.d.ts +105 -9
- package/dist/model/network/NetworkState.d.ts.map +1 -1
- package/dist/model/network/NetworkState.js +20 -2
- package/dist/model/network/NetworkState.js.map +1 -0
- package/dist/model/transaction/RuntimeTransaction.d.ts +96 -28
- package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -1
- package/dist/model/transaction/RuntimeTransaction.js +75 -11
- package/dist/model/transaction/RuntimeTransaction.js.map +1 -0
- package/dist/model/transaction/SignedTransaction.d.ts +107 -0
- package/dist/model/transaction/SignedTransaction.d.ts.map +1 -0
- package/dist/model/transaction/SignedTransaction.js +34 -0
- package/dist/model/transaction/SignedTransaction.js.map +1 -0
- package/dist/model/transaction/ValueOption.d.ts +173 -0
- package/dist/model/transaction/ValueOption.d.ts.map +1 -0
- package/dist/model/transaction/ValueOption.js +25 -0
- package/dist/model/transaction/ValueOption.js.map +1 -0
- package/dist/protocol/Protocol.d.ts +27 -25
- package/dist/protocol/Protocol.d.ts.map +1 -1
- package/dist/protocol/Protocol.js +98 -28
- package/dist/protocol/Protocol.js.map +1 -0
- package/dist/protocol/ProtocolEnvironment.d.ts +9 -0
- package/dist/protocol/ProtocolEnvironment.d.ts.map +1 -0
- package/dist/protocol/ProtocolEnvironment.js +2 -0
- package/dist/protocol/ProtocolEnvironment.js.map +1 -0
- package/dist/protocol/ProtocolModule.d.ts +7 -7
- package/dist/protocol/ProtocolModule.d.ts.map +1 -1
- package/dist/protocol/ProtocolModule.js +10 -7
- package/dist/protocol/ProtocolModule.js.map +1 -0
- package/dist/protocol/ProvableBlockHook.d.ts +19 -0
- package/dist/protocol/ProvableBlockHook.d.ts.map +1 -0
- package/dist/protocol/ProvableBlockHook.js +21 -0
- package/dist/protocol/ProvableBlockHook.js.map +1 -0
- package/dist/protocol/ProvableTransactionHook.d.ts +34 -0
- package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -0
- package/dist/protocol/ProvableTransactionHook.js +13 -0
- package/dist/protocol/ProvableTransactionHook.js.map +1 -0
- package/dist/protocol/TransitioningProtocolModule.d.ts +10 -0
- package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -0
- package/dist/protocol/TransitioningProtocolModule.js +9 -0
- package/dist/protocol/TransitioningProtocolModule.js.map +1 -0
- package/dist/prover/accumulators/AppliedBatchHashList.d.ts +18 -0
- package/dist/prover/accumulators/AppliedBatchHashList.d.ts.map +1 -0
- package/dist/prover/accumulators/AppliedBatchHashList.js +25 -0
- package/dist/prover/accumulators/AppliedBatchHashList.js.map +1 -0
- package/dist/prover/accumulators/StateTransitionReductionList.d.ts +12 -0
- package/dist/prover/accumulators/StateTransitionReductionList.d.ts.map +1 -0
- package/dist/prover/accumulators/StateTransitionReductionList.js +64 -0
- package/dist/prover/accumulators/StateTransitionReductionList.js.map +1 -0
- package/dist/prover/accumulators/TransactionHashList.d.ts +6 -0
- package/dist/prover/accumulators/TransactionHashList.d.ts.map +1 -0
- package/dist/prover/accumulators/TransactionHashList.js +8 -0
- package/dist/prover/accumulators/TransactionHashList.js.map +1 -0
- package/dist/prover/accumulators/WitnessedRootHashList.d.ts +137 -0
- package/dist/prover/accumulators/WitnessedRootHashList.d.ts.map +1 -0
- package/dist/prover/accumulators/WitnessedRootHashList.js +50 -0
- package/dist/prover/accumulators/WitnessedRootHashList.js.map +1 -0
- package/dist/prover/block/BlockProvable.d.ts +869 -65
- package/dist/prover/block/BlockProvable.d.ts.map +1 -1
- package/dist/prover/block/BlockProvable.js +86 -6
- package/dist/prover/block/BlockProvable.js.map +1 -0
- package/dist/prover/block/BlockProver.d.ts +82 -34
- package/dist/prover/block/BlockProver.d.ts.map +1 -1
- package/dist/prover/block/BlockProver.js +505 -86
- package/dist/prover/block/BlockProver.js.map +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +106 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.js +25 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.js.map +1 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts +139 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts.map +1 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js +21 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js.map +1 -0
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts +7 -0
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts.map +1 -0
- package/dist/prover/{statetransition/StateTransitionWitnessProviderReference.js → block/services/RuntimeVerificationKeyRootService.js} +11 -8
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.js.map +1 -0
- package/dist/prover/statetransition/StateTransitionProvable.d.ts +137 -48
- package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -1
- package/dist/prover/statetransition/StateTransitionProvable.js +10 -5
- package/dist/prover/statetransition/StateTransitionProvable.js.map +1 -0
- package/dist/prover/statetransition/StateTransitionProver.d.ts +30 -17
- package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
- package/dist/prover/statetransition/StateTransitionProver.js +169 -74
- package/dist/prover/statetransition/StateTransitionProver.js.map +1 -0
- package/dist/settlement/ContractModule.d.ts +16 -0
- package/dist/settlement/ContractModule.d.ts.map +1 -0
- package/dist/settlement/ContractModule.js +12 -0
- package/dist/settlement/ContractModule.js.map +1 -0
- package/dist/settlement/SettlementContractModule.d.ts +51 -0
- package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
- package/dist/settlement/SettlementContractModule.js +80 -0
- package/dist/settlement/SettlementContractModule.js.map +1 -0
- package/dist/settlement/contracts/BridgeContract.d.ts +116 -0
- package/dist/settlement/contracts/BridgeContract.d.ts.map +1 -0
- package/dist/settlement/contracts/BridgeContract.js +259 -0
- package/dist/settlement/contracts/BridgeContract.js.map +1 -0
- package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts +16 -0
- package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/BridgeContractProtocolModule.js +41 -0
- package/dist/settlement/contracts/BridgeContractProtocolModule.js.map +1 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +21 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.js +57 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.js.map +1 -0
- package/dist/settlement/contracts/DispatchSmartContract.d.ts +44 -0
- package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -0
- package/dist/settlement/contracts/DispatchSmartContract.js +229 -0
- package/dist/settlement/contracts/DispatchSmartContract.js.map +1 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +21 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.js +84 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.js.map +1 -0
- package/dist/settlement/contracts/SettlementSmartContract.d.ts +123 -0
- package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
- package/dist/settlement/contracts/SettlementSmartContract.js +310 -0
- package/dist/settlement/contracts/SettlementSmartContract.js.map +1 -0
- package/dist/settlement/contracts/TokenBridgeTree.d.ts +228 -0
- package/dist/settlement/contracts/TokenBridgeTree.d.ts.map +1 -0
- package/dist/settlement/contracts/TokenBridgeTree.js +60 -0
- package/dist/settlement/contracts/TokenBridgeTree.js.map +1 -0
- package/dist/settlement/contracts/authorizations/ContractAuthorization.d.ts +10 -0
- package/dist/settlement/contracts/authorizations/ContractAuthorization.d.ts.map +1 -0
- package/dist/settlement/contracts/authorizations/ContractAuthorization.js +2 -0
- package/dist/settlement/contracts/authorizations/ContractAuthorization.js.map +1 -0
- package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.d.ts +85 -0
- package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.d.ts.map +1 -0
- package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.js +11 -0
- package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.js.map +1 -0
- package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.d.ts +79 -0
- package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.d.ts.map +1 -0
- package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.js +11 -0
- package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.js.map +1 -0
- package/dist/settlement/messages/Deposit.d.ts +77 -0
- package/dist/settlement/messages/Deposit.d.ts.map +1 -0
- package/dist/settlement/messages/Deposit.js +8 -0
- package/dist/settlement/messages/Deposit.js.map +1 -0
- package/dist/settlement/messages/OutgoingMessage.d.ts +67 -0
- package/dist/settlement/messages/OutgoingMessage.d.ts.map +1 -0
- package/dist/settlement/messages/OutgoingMessage.js +7 -0
- package/dist/settlement/messages/OutgoingMessage.js.map +1 -0
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts +462 -0
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
- package/dist/settlement/messages/OutgoingMessageArgument.js +40 -0
- package/dist/settlement/messages/OutgoingMessageArgument.js.map +1 -0
- package/dist/settlement/messages/Withdrawal.d.ts +2 -0
- package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
- package/dist/settlement/messages/Withdrawal.js +3 -0
- package/dist/settlement/messages/Withdrawal.js.map +1 -0
- package/dist/settlement/modularity/OutgoingMessageProcessor.d.ts +25 -0
- package/dist/settlement/modularity/OutgoingMessageProcessor.d.ts.map +1 -0
- package/dist/settlement/modularity/OutgoingMessageProcessor.js +30 -0
- package/dist/settlement/modularity/OutgoingMessageProcessor.js.map +1 -0
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts +26 -0
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
- package/dist/settlement/modularity/ProvableSettlementHook.js +4 -0
- package/dist/settlement/modularity/ProvableSettlementHook.js.map +1 -0
- package/dist/settlement/modularity/types.d.ts +8 -0
- package/dist/settlement/modularity/types.d.ts.map +1 -0
- package/dist/settlement/modularity/types.js +2 -0
- package/dist/settlement/modularity/types.js.map +1 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +11 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.js +15 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.js.map +1 -0
- package/dist/state/SimpleAsyncStateService.d.ts +6 -0
- package/dist/state/SimpleAsyncStateService.d.ts.map +1 -0
- package/dist/state/SimpleAsyncStateService.js +2 -0
- package/dist/state/SimpleAsyncStateService.js.map +1 -0
- package/dist/state/State.d.ts +68 -0
- package/dist/state/State.d.ts.map +1 -0
- package/dist/state/State.js +131 -0
- package/dist/state/State.js.map +1 -0
- package/dist/state/StateMap.d.ts +37 -0
- package/dist/state/StateMap.d.ts.map +1 -0
- package/dist/state/StateMap.js +56 -0
- package/dist/state/StateMap.js.map +1 -0
- package/dist/state/StateService.d.ts +6 -0
- package/dist/state/StateService.d.ts.map +1 -0
- package/dist/state/StateService.js +2 -0
- package/dist/state/StateService.js.map +1 -0
- package/dist/state/StateServiceProvider.d.ts +8 -0
- package/dist/state/StateServiceProvider.d.ts.map +1 -0
- package/dist/state/StateServiceProvider.js +37 -0
- package/dist/state/StateServiceProvider.js.map +1 -0
- package/dist/state/assert/assert.d.ts +12 -0
- package/dist/state/assert/assert.d.ts.map +1 -0
- package/dist/state/assert/assert.js +33 -0
- package/dist/state/assert/assert.js.map +1 -0
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts +193 -0
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -0
- package/dist/state/context/RuntimeMethodExecutionContext.js +138 -0
- package/dist/state/context/RuntimeMethodExecutionContext.js.map +1 -0
- package/dist/state/context/TransitionMethodExecutionContext.d.ts +23 -0
- package/dist/state/context/TransitionMethodExecutionContext.d.ts.map +1 -0
- package/dist/state/context/TransitionMethodExecutionContext.js +6 -0
- package/dist/state/context/TransitionMethodExecutionContext.js.map +1 -0
- package/dist/state/protocol/ProtocolState.d.ts +13 -0
- package/dist/state/protocol/ProtocolState.d.ts.map +1 -0
- package/dist/state/protocol/ProtocolState.js +58 -0
- package/dist/state/protocol/ProtocolState.js.map +1 -0
- package/dist/utils/FieldOptions.d.ts +62 -0
- package/dist/utils/FieldOptions.d.ts.map +1 -0
- package/dist/utils/FieldOptions.js +13 -0
- package/dist/utils/FieldOptions.js.map +1 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts +19 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
- package/dist/utils/MinaPrefixedProvableHashList.js +46 -0
- package/dist/utils/MinaPrefixedProvableHashList.js.map +1 -0
- package/dist/utils/PrefixedProvableHashList.d.ts +2 -2
- package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -1
- package/dist/utils/PrefixedProvableHashList.js +2 -1
- package/dist/utils/PrefixedProvableHashList.js.map +1 -0
- package/dist/utils/ProvableHashList.d.ts +23 -4
- package/dist/utils/ProvableHashList.d.ts.map +1 -1
- package/dist/utils/ProvableHashList.js +38 -2
- package/dist/utils/ProvableHashList.js.map +1 -0
- package/dist/utils/ProvableReductionHashList.d.ts +18 -0
- package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
- package/dist/utils/ProvableReductionHashList.js +54 -0
- package/dist/utils/ProvableReductionHashList.js.map +1 -0
- package/dist/utils/StateTransitionReductionList.d.ts +11 -0
- package/dist/utils/StateTransitionReductionList.d.ts.map +1 -0
- package/dist/utils/StateTransitionReductionList.js +61 -0
- package/dist/utils/StateTransitionReductionList.js.map +1 -0
- package/dist/utils/utils.d.ts +20 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +51 -0
- package/dist/utils/utils.js.map +1 -0
- package/jest.config.cjs +12 -1
- package/package.json +11 -9
- package/src/hashing/mina-prefixes.ts +10 -0
- package/src/hashing/protokit-prefixes.ts +37 -0
- package/src/hooks/AccountStateHook.ts +57 -0
- package/src/hooks/BlockHeightHook.ts +17 -0
- package/src/hooks/LastStateRootBlockHook.ts +25 -0
- package/src/hooks/NoopBlockHook.ts +24 -0
- package/src/hooks/NoopSettlementHook.ts +20 -0
- package/src/hooks/NoopTransactionHook.ts +13 -0
- package/src/index.ts +51 -9
- package/src/model/AppliedStateTransitionBatch.ts +16 -0
- package/src/model/MethodPublicOutput.ts +3 -1
- package/src/model/Option.ts +99 -60
- package/src/model/Path.ts +9 -5
- package/src/model/RuntimeLike.ts +12 -0
- package/src/model/StateTransition.ts +25 -3
- package/src/model/StateTransitionProvableBatch.ts +117 -14
- package/src/model/Transaction.ts +3 -1
- package/src/model/network/NetworkState.ts +21 -3
- package/src/model/transaction/RuntimeTransaction.ts +90 -15
- package/src/model/transaction/SignedTransaction.ts +47 -0
- package/src/model/transaction/ValueOption.ts +28 -0
- package/src/protocol/Protocol.ts +166 -74
- package/src/protocol/ProtocolEnvironment.ts +10 -0
- package/src/protocol/ProtocolModule.ts +16 -16
- package/src/protocol/ProvableBlockHook.ts +68 -0
- package/src/protocol/ProvableTransactionHook.ts +77 -0
- package/src/protocol/TransitioningProtocolModule.ts +12 -0
- package/src/prover/accumulators/AppliedBatchHashList.ts +32 -0
- package/src/prover/accumulators/StateTransitionReductionList.ts +92 -0
- package/src/prover/accumulators/TransactionHashList.ts +9 -0
- package/src/prover/accumulators/WitnessedRootHashList.ts +61 -0
- package/src/prover/block/BlockProvable.ts +188 -15
- package/src/prover/block/BlockProver.ts +979 -143
- package/src/prover/block/accummulators/BlockHashMerkleTree.ts +24 -0
- package/src/prover/block/accummulators/RuntimeVerificationKeyTree.ts +24 -0
- package/src/prover/block/services/RuntimeVerificationKeyRootService.ts +20 -0
- package/src/prover/statetransition/StateTransitionProvable.ts +26 -19
- package/src/prover/statetransition/StateTransitionProver.ts +338 -130
- package/src/settlement/ContractModule.ts +31 -0
- package/src/settlement/SettlementContractModule.ts +145 -0
- package/src/settlement/contracts/BridgeContract.ts +366 -0
- package/src/settlement/contracts/BridgeContractProtocolModule.ts +48 -0
- package/src/settlement/contracts/DispatchContractProtocolModule.ts +75 -0
- package/src/settlement/contracts/DispatchSmartContract.ts +325 -0
- package/src/settlement/contracts/SettlementContractProtocolModule.ts +113 -0
- package/src/settlement/contracts/SettlementSmartContract.ts +502 -0
- package/src/settlement/contracts/TokenBridgeTree.ts +73 -0
- package/src/settlement/contracts/authorizations/ContractAuthorization.ts +11 -0
- package/src/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.ts +16 -0
- package/src/settlement/contracts/authorizations/UpdateMessagesHashAuth.ts +16 -0
- package/src/settlement/messages/Deposit.ts +7 -0
- package/src/settlement/messages/OutgoingMessage.ts +17 -0
- package/src/settlement/messages/OutgoingMessageArgument.ts +53 -0
- package/src/settlement/modularity/OutgoingMessageProcessor.ts +65 -0
- package/src/settlement/modularity/ProvableSettlementHook.ts +36 -0
- package/src/settlement/modularity/types.ts +22 -0
- package/src/settlement/modules/NetworkStateSettlementModule.ts +42 -0
- package/src/state/State.ts +177 -0
- package/src/state/StateMap.ts +73 -0
- package/src/state/StateService.ts +6 -0
- package/src/state/StateServiceProvider.ts +37 -0
- package/src/state/assert/assert.ts +38 -0
- package/src/state/context/RuntimeMethodExecutionContext.ts +181 -0
- package/src/state/context/TransitionMethodExecutionContext.ts +26 -0
- package/src/state/protocol/ProtocolState.ts +98 -0
- package/src/utils/FieldOptions.ts +13 -0
- package/src/utils/MinaPrefixedProvableHashList.ts +66 -0
- package/src/utils/PrefixedProvableHashList.ts +2 -2
- package/src/utils/ProvableHashList.ts +78 -3
- package/src/utils/ProvableReductionHashList.ts +77 -0
- package/src/utils/utils.ts +44 -55
- package/test/BlockProver.test.ts +161 -74
- package/test/Protocol.test.ts +20 -10
- package/test/State.test.ts +45 -0
- package/test/StateTransition.test.ts +57 -65
- package/test/TestingProtocol.ts +56 -0
- package/test/compiling/types.ts +28 -0
- package/test/model/Option.test.ts +72 -0
- package/test/model/StateTransitionProvableBatch.test.ts +137 -0
- package/test/modularity/types.ts +35 -0
- package/test/prover/block/BlockProver.test.ts +18 -0
- package/test/prover/statetransition/StateTransitionProver.test.ts +261 -0
- package/test/state/assert/assert.test.ts +56 -0
- package/test/tsconfig.json +7 -0
- package/test/utils/ProvableHashList.test.ts +44 -0
- package/test/utils/ProvableReductionHashList.test.ts +117 -0
- package/test/utils.test.ts +27 -0
- package/dist/config/ConfigurableModule.d.ts +0 -18
- package/dist/config/ConfigurableModule.d.ts.map +0 -1
- package/dist/config/ConfigurableModule.js +0 -20
- package/dist/config/ConfigurationAggregator.d.ts +0 -10
- package/dist/config/ConfigurationAggregator.d.ts.map +0 -1
- package/dist/config/ConfigurationAggregator.js +0 -35
- package/dist/config/ConfigurationReceiver.d.ts +0 -25
- package/dist/config/ConfigurationReceiver.d.ts.map +0 -1
- package/dist/config/ConfigurationReceiver.js +0 -36
- package/dist/config/ModuleContainer.d.ts +0 -44
- package/dist/config/ModuleContainer.d.ts.map +0 -1
- package/dist/config/ModuleContainer.js +0 -89
- package/dist/config/types.d.ts +0 -2
- package/dist/config/types.d.ts.map +0 -1
- package/dist/config/types.js +0 -1
- package/dist/model/MethodPublicInput.d.ts +0 -51
- package/dist/model/MethodPublicInput.d.ts.map +0 -1
- package/dist/model/MethodPublicInput.js +0 -11
- package/dist/model/transaction/ProtocolTransaction.d.ts +0 -70
- package/dist/model/transaction/ProtocolTransaction.d.ts.map +0 -1
- package/dist/model/transaction/ProtocolTransaction.js +0 -18
- package/dist/prover/block/BlockScopedModule.d.ts +0 -3
- package/dist/prover/block/BlockScopedModule.d.ts.map +0 -1
- package/dist/prover/block/BlockScopedModule.js +0 -6
- package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts +0 -16
- package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts.map +0 -1
- package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts +0 -7
- package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts.map +0 -1
- package/dist/src/model/Option.d.ts +0 -158
- package/dist/src/model/Option.d.ts.map +0 -1
- package/dist/src/model/Option.js +0 -53
- package/dist/src/model/Path.d.ts +0 -35
- package/dist/src/model/Path.d.ts.map +0 -1
- package/dist/src/model/Path.js +0 -51
- package/dist/src/model/StateTransition.d.ts +0 -201
- package/dist/src/model/StateTransition.d.ts.map +0 -1
- package/dist/src/model/StateTransition.js +0 -43
- package/dist/src/utils/PrefixedHashList.d.ts +0 -15
- package/dist/src/utils/PrefixedHashList.d.ts.map +0 -1
- package/dist/src/utils/PrefixedHashList.js +0 -28
- package/dist/src/utils/ProvableHashList.d.ts +0 -30
- package/dist/src/utils/ProvableHashList.d.ts.map +0 -1
- package/dist/src/utils/ProvableHashList.js +0 -43
- package/dist/utils/PrefixedHashList.d.ts +0 -14
- package/dist/utils/PrefixedHashList.d.ts.map +0 -1
- package/dist/utils/PrefixedHashList.js +0 -12
- package/dist/utils/Utils.d.ts +0 -17
- package/dist/utils/Utils.d.ts.map +0 -1
- package/dist/utils/Utils.js +0 -64
- package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts +0 -25
- package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts.map +0 -1
- package/dist/utils/merkletree/InMemoryMerkleTreeStorage.js +0 -77
- package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts +0 -26
- package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts.map +0 -1
- package/dist/utils/merkletree/MemoryMerkleTreeStorage.js +0 -79
- package/dist/utils/merkletree/MerkleTreeStore.d.ts +0 -11
- package/dist/utils/merkletree/MerkleTreeStore.d.ts.map +0 -1
- package/dist/utils/merkletree/MerkleTreeStore.js +0 -1
- package/dist/utils/merkletree/RollupMerkleTree.d.ts +0 -130
- package/dist/utils/merkletree/RollupMerkleTree.d.ts.map +0 -1
- package/dist/utils/merkletree/RollupMerkleTree.js +0 -244
- package/src/model/Option.test.ts +0 -21
- package/src/model/transaction/ProtocolTransaction.ts +0 -25
- package/src/prover/statetransition/StateTransitionWitnessProvider.ts +0 -24
- package/src/prover/statetransition/StateTransitionWitnessProviderReference.ts +0 -17
- package/src/utils/merkletree/InMemoryMerkleTreeStorage.ts +0 -106
- package/src/utils/merkletree/MerkleTreeStore.ts +0 -15
- package/src/utils/merkletree/RollupMerkleTree.ts +0 -250
- package/src/utils/merkletree/VirtualMerkleTreeStore.ts +0 -21
- package/tsconfig.test.json +0 -9
|
@@ -0,0 +1,502 @@
|
|
|
1
|
+
import {
|
|
2
|
+
prefixToField,
|
|
3
|
+
TypedClass,
|
|
4
|
+
mapSequential,
|
|
5
|
+
ChildVerificationKeyService,
|
|
6
|
+
LinkedMerkleTree,
|
|
7
|
+
} from "@proto-kit/common";
|
|
8
|
+
import {
|
|
9
|
+
AccountUpdate,
|
|
10
|
+
Bool,
|
|
11
|
+
Field,
|
|
12
|
+
method,
|
|
13
|
+
PublicKey,
|
|
14
|
+
Signature,
|
|
15
|
+
SmartContract,
|
|
16
|
+
State,
|
|
17
|
+
state,
|
|
18
|
+
UInt32,
|
|
19
|
+
AccountUpdateForest,
|
|
20
|
+
TokenContractV2,
|
|
21
|
+
PrivateKey,
|
|
22
|
+
VerificationKey,
|
|
23
|
+
Permissions,
|
|
24
|
+
Struct,
|
|
25
|
+
Provable,
|
|
26
|
+
TokenId,
|
|
27
|
+
DynamicProof,
|
|
28
|
+
} from "o1js";
|
|
29
|
+
|
|
30
|
+
import { NetworkState } from "../../model/network/NetworkState";
|
|
31
|
+
import { BlockHashMerkleTree } from "../../prover/block/accummulators/BlockHashMerkleTree";
|
|
32
|
+
import {
|
|
33
|
+
BlockProverPublicInput,
|
|
34
|
+
BlockProverPublicOutput,
|
|
35
|
+
} from "../../prover/block/BlockProvable";
|
|
36
|
+
import {
|
|
37
|
+
ProvableSettlementHook,
|
|
38
|
+
SettlementHookInputs,
|
|
39
|
+
SettlementStateRecord,
|
|
40
|
+
} from "../modularity/ProvableSettlementHook";
|
|
41
|
+
|
|
42
|
+
import { DispatchContractType } from "./DispatchSmartContract";
|
|
43
|
+
import { BridgeContractType } from "./BridgeContract";
|
|
44
|
+
import { TokenBridgeDeploymentAuth } from "./authorizations/TokenBridgeDeploymentAuth";
|
|
45
|
+
import { UpdateMessagesHashAuth } from "./authorizations/UpdateMessagesHashAuth";
|
|
46
|
+
|
|
47
|
+
/* eslint-disable @typescript-eslint/lines-between-class-members */
|
|
48
|
+
|
|
49
|
+
export class DynamicBlockProof extends DynamicProof<
|
|
50
|
+
BlockProverPublicInput,
|
|
51
|
+
BlockProverPublicOutput
|
|
52
|
+
> {
|
|
53
|
+
public static publicInputType = BlockProverPublicInput;
|
|
54
|
+
|
|
55
|
+
public static publicOutputType = BlockProverPublicOutput;
|
|
56
|
+
|
|
57
|
+
public static maxProofsVerified = 2 as const;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export class TokenMapping extends Struct({
|
|
61
|
+
tokenId: Field,
|
|
62
|
+
publicKey: PublicKey,
|
|
63
|
+
}) {}
|
|
64
|
+
|
|
65
|
+
export interface SettlementContractType {
|
|
66
|
+
authorizationField: State<Field>;
|
|
67
|
+
|
|
68
|
+
initialize: (
|
|
69
|
+
sequencer: PublicKey,
|
|
70
|
+
dispatchContract: PublicKey,
|
|
71
|
+
bridgeContract: PublicKey,
|
|
72
|
+
contractKey: PrivateKey
|
|
73
|
+
) => Promise<void>;
|
|
74
|
+
assertStateRoot: (root: Field) => AccountUpdate;
|
|
75
|
+
settle: (
|
|
76
|
+
blockProof: DynamicBlockProof,
|
|
77
|
+
signature: Signature,
|
|
78
|
+
dispatchContractAddress: PublicKey,
|
|
79
|
+
publicKey: PublicKey,
|
|
80
|
+
inputNetworkState: NetworkState,
|
|
81
|
+
outputNetworkState: NetworkState,
|
|
82
|
+
newPromisedMessagesHash: Field
|
|
83
|
+
) => Promise<void>;
|
|
84
|
+
addTokenBridge: (
|
|
85
|
+
tokenId: Field,
|
|
86
|
+
address: PublicKey,
|
|
87
|
+
dispatchContract: PublicKey
|
|
88
|
+
) => Promise<void>;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Some random prefix for the sequencer signature
|
|
92
|
+
export const BATCH_SIGNATURE_PREFIX = prefixToField("pk-batchSignature");
|
|
93
|
+
|
|
94
|
+
// @singleton()
|
|
95
|
+
// export class SettlementSmartContractStaticArgs {
|
|
96
|
+
// public args?: {
|
|
97
|
+
// DispatchContract: TypedClass<DispatchContractType & SmartContract>;
|
|
98
|
+
// hooks: ProvableSettlementHook<unknown>[];
|
|
99
|
+
// escapeHatchSlotsInterval: number;
|
|
100
|
+
// BridgeContract: TypedClass<BridgeContractType> & typeof SmartContract;
|
|
101
|
+
// // Lazily initialized
|
|
102
|
+
// BridgeContractVerificationKey: VerificationKey | undefined;
|
|
103
|
+
// BridgeContractPermissions: Permissions | undefined;
|
|
104
|
+
// signedSettlements: boolean | undefined;
|
|
105
|
+
// };
|
|
106
|
+
// }
|
|
107
|
+
|
|
108
|
+
export abstract class SettlementSmartContractBase extends TokenContractV2 {
|
|
109
|
+
// This pattern of injecting args into a smartcontract is currently the only
|
|
110
|
+
// viable solution that works given the inheritance issues of o1js
|
|
111
|
+
// public static args = container.resolve(SettlementSmartContractStaticArgs);
|
|
112
|
+
public static args: {
|
|
113
|
+
DispatchContract: TypedClass<DispatchContractType & SmartContract>;
|
|
114
|
+
hooks: ProvableSettlementHook<unknown>[];
|
|
115
|
+
escapeHatchSlotsInterval: number;
|
|
116
|
+
BridgeContract: TypedClass<BridgeContractType> & typeof SmartContract;
|
|
117
|
+
// Lazily initialized
|
|
118
|
+
BridgeContractVerificationKey: VerificationKey | undefined;
|
|
119
|
+
BridgeContractPermissions: Permissions | undefined;
|
|
120
|
+
signedSettlements: boolean | undefined;
|
|
121
|
+
ChildVerificationKeyService: ChildVerificationKeyService;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
events = {
|
|
125
|
+
"token-bridge-deployed": TokenMapping,
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
abstract sequencerKey: State<Field>;
|
|
129
|
+
abstract lastSettlementL1BlockHeight: State<UInt32>;
|
|
130
|
+
abstract stateRoot: State<Field>;
|
|
131
|
+
abstract networkStateHash: State<Field>;
|
|
132
|
+
abstract blockHashRoot: State<Field>;
|
|
133
|
+
abstract dispatchContractAddressX: State<Field>;
|
|
134
|
+
|
|
135
|
+
abstract authorizationField: State<Field>;
|
|
136
|
+
|
|
137
|
+
// Not @state
|
|
138
|
+
// abstract offchainStateCommitmentsHash: State<Field>;
|
|
139
|
+
|
|
140
|
+
public assertStateRoot(root: Field): AccountUpdate {
|
|
141
|
+
this.stateRoot.requireEquals(root);
|
|
142
|
+
return this.self;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// TODO Like these properties, I am too lazy to properly infer the types here
|
|
146
|
+
private assertLazyConfigsInitialized() {
|
|
147
|
+
const uninitializedProperties: string[] = [];
|
|
148
|
+
const { args } = SettlementSmartContractBase;
|
|
149
|
+
if (args.BridgeContractPermissions === undefined) {
|
|
150
|
+
uninitializedProperties.push("BridgeContractPermissions");
|
|
151
|
+
}
|
|
152
|
+
if (args.signedSettlements === undefined) {
|
|
153
|
+
uninitializedProperties.push("signedSettlements");
|
|
154
|
+
}
|
|
155
|
+
if (uninitializedProperties.length > 0) {
|
|
156
|
+
throw new Error(
|
|
157
|
+
`Lazy configs of SettlementSmartContract haven't been initialized ${uninitializedProperties.reduce(
|
|
158
|
+
(a, b) => `${a},${b}`
|
|
159
|
+
)}`
|
|
160
|
+
);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
protected async deployTokenBridge(
|
|
165
|
+
tokenId: Field,
|
|
166
|
+
address: PublicKey,
|
|
167
|
+
dispatchContractAddress: PublicKey,
|
|
168
|
+
dispatchContractPreconditionEnforced = false
|
|
169
|
+
) {
|
|
170
|
+
Provable.asProver(() => {
|
|
171
|
+
this.assertLazyConfigsInitialized();
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
const { args } = SettlementSmartContractBase;
|
|
175
|
+
const BridgeContractClass = args.BridgeContract;
|
|
176
|
+
const bridgeContract = new BridgeContractClass(address, tokenId);
|
|
177
|
+
|
|
178
|
+
const {
|
|
179
|
+
BridgeContractVerificationKey,
|
|
180
|
+
signedSettlements,
|
|
181
|
+
BridgeContractPermissions,
|
|
182
|
+
} = args;
|
|
183
|
+
|
|
184
|
+
if (
|
|
185
|
+
signedSettlements === undefined ||
|
|
186
|
+
BridgeContractPermissions === undefined
|
|
187
|
+
) {
|
|
188
|
+
throw new Error(
|
|
189
|
+
"Static arguments for SettlementSmartContract not initialized"
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (
|
|
194
|
+
BridgeContractVerificationKey !== undefined &&
|
|
195
|
+
!BridgeContractVerificationKey.hash.isConstant()
|
|
196
|
+
) {
|
|
197
|
+
throw new Error("Bridge contract verification key has to be constants");
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// This function is not a zkapps method, therefore it will be part of this methods execution
|
|
201
|
+
// The returning account update (owner.self) is therefore part of this circuit and is assertable
|
|
202
|
+
const deploymentAccountUpdate = await bridgeContract.deployProvable(
|
|
203
|
+
args.BridgeContractVerificationKey,
|
|
204
|
+
args.signedSettlements!,
|
|
205
|
+
args.BridgeContractPermissions!,
|
|
206
|
+
this.address
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
this.approve(deploymentAccountUpdate);
|
|
210
|
+
|
|
211
|
+
this.self.body.mayUseToken = {
|
|
212
|
+
// Only set this if we deploy a custom token
|
|
213
|
+
parentsOwnToken: tokenId.equals(TokenId.default).not(),
|
|
214
|
+
inheritFromParent: Bool(false),
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
this.emitEvent(
|
|
218
|
+
"token-bridge-deployed",
|
|
219
|
+
new TokenMapping({
|
|
220
|
+
tokenId: tokenId,
|
|
221
|
+
publicKey: address,
|
|
222
|
+
})
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
// We can't set a precondition twice, for the $mina bridge deployment that
|
|
226
|
+
// would be the case, so we disable it in this case
|
|
227
|
+
if (!dispatchContractPreconditionEnforced) {
|
|
228
|
+
this.dispatchContractAddressX.requireEquals(dispatchContractAddress.x);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
// Set authorization for the auth callback, that we need
|
|
232
|
+
this.authorizationField.set(
|
|
233
|
+
new TokenBridgeDeploymentAuth({
|
|
234
|
+
target: dispatchContractAddress,
|
|
235
|
+
tokenId,
|
|
236
|
+
address,
|
|
237
|
+
}).hash()
|
|
238
|
+
);
|
|
239
|
+
const dispatchContract =
|
|
240
|
+
new SettlementSmartContractBase.args.DispatchContract(
|
|
241
|
+
dispatchContractAddress
|
|
242
|
+
);
|
|
243
|
+
await dispatchContract.enableTokenDeposits(tokenId, address, this.address);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
protected async initializeBase(
|
|
247
|
+
sequencer: PublicKey,
|
|
248
|
+
dispatchContract: PublicKey,
|
|
249
|
+
bridgeContract: PublicKey,
|
|
250
|
+
contractKey: PrivateKey
|
|
251
|
+
) {
|
|
252
|
+
this.sequencerKey.getAndRequireEquals().assertEquals(Field(0));
|
|
253
|
+
this.stateRoot.getAndRequireEquals().assertEquals(Field(0));
|
|
254
|
+
this.blockHashRoot.getAndRequireEquals().assertEquals(Field(0));
|
|
255
|
+
this.networkStateHash.getAndRequireEquals().assertEquals(Field(0));
|
|
256
|
+
this.dispatchContractAddressX.getAndRequireEquals().assertEquals(Field(0));
|
|
257
|
+
|
|
258
|
+
this.sequencerKey.set(sequencer.x);
|
|
259
|
+
this.stateRoot.set(LinkedMerkleTree.EMPTY_ROOT);
|
|
260
|
+
this.blockHashRoot.set(Field(BlockHashMerkleTree.EMPTY_ROOT));
|
|
261
|
+
this.networkStateHash.set(NetworkState.empty().hash());
|
|
262
|
+
this.dispatchContractAddressX.set(dispatchContract.x);
|
|
263
|
+
|
|
264
|
+
const { DispatchContract } = SettlementSmartContractBase.args;
|
|
265
|
+
const contractInstance = new DispatchContract(dispatchContract);
|
|
266
|
+
await contractInstance.initialize(this.address);
|
|
267
|
+
|
|
268
|
+
// Deploy bridge contract for $Mina
|
|
269
|
+
await this.deployTokenBridge(
|
|
270
|
+
this.tokenId,
|
|
271
|
+
bridgeContract,
|
|
272
|
+
dispatchContract,
|
|
273
|
+
true
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
contractKey.toPublicKey().assertEquals(this.address);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
protected async settleBase(
|
|
280
|
+
blockProof: DynamicBlockProof,
|
|
281
|
+
signature: Signature,
|
|
282
|
+
dispatchContractAddress: PublicKey,
|
|
283
|
+
publicKey: PublicKey,
|
|
284
|
+
inputNetworkState: NetworkState,
|
|
285
|
+
outputNetworkState: NetworkState,
|
|
286
|
+
newPromisedMessagesHash: Field
|
|
287
|
+
) {
|
|
288
|
+
// Brought in as a constant
|
|
289
|
+
const blockProofVk =
|
|
290
|
+
SettlementSmartContractBase.args.ChildVerificationKeyService.getVerificationKey(
|
|
291
|
+
"BlockProver"
|
|
292
|
+
);
|
|
293
|
+
if (!blockProofVk.hash.isConstant()) {
|
|
294
|
+
throw new Error("Sanity check - vk hash has to be constant");
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// Verify the blockproof
|
|
298
|
+
blockProof.verify(blockProofVk);
|
|
299
|
+
|
|
300
|
+
// Get and assert on-chain values
|
|
301
|
+
const stateRoot = this.stateRoot.getAndRequireEquals();
|
|
302
|
+
const networkStateHash = this.networkStateHash.getAndRequireEquals();
|
|
303
|
+
const blockHashRoot = this.blockHashRoot.getAndRequireEquals();
|
|
304
|
+
const sequencerKey = this.sequencerKey.getAndRequireEquals();
|
|
305
|
+
const lastSettlementL1BlockHeight =
|
|
306
|
+
this.lastSettlementL1BlockHeight.getAndRequireEquals();
|
|
307
|
+
const onChainDispatchContractAddressX =
|
|
308
|
+
this.dispatchContractAddressX.getAndRequireEquals();
|
|
309
|
+
|
|
310
|
+
onChainDispatchContractAddressX.assertEquals(
|
|
311
|
+
dispatchContractAddress.x,
|
|
312
|
+
"DispatchContract address not provided correctly"
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
const { DispatchContract, escapeHatchSlotsInterval, hooks } =
|
|
316
|
+
SettlementSmartContractBase.args;
|
|
317
|
+
|
|
318
|
+
// Get dispatch contract values
|
|
319
|
+
// These values are witnesses but will be checked later on the AU
|
|
320
|
+
// call to the dispatch contract via .updateMessagesHash()
|
|
321
|
+
const dispatchContract = new DispatchContract(dispatchContractAddress);
|
|
322
|
+
const promisedMessagesHash = dispatchContract.promisedMessagesHash.get();
|
|
323
|
+
|
|
324
|
+
// Get block height and use the lower bound for all ops
|
|
325
|
+
const minBlockHeightIncluded = this.network.blockchainLength.get();
|
|
326
|
+
this.network.blockchainLength.requireBetween(
|
|
327
|
+
minBlockHeightIncluded,
|
|
328
|
+
// 5 because that is the length the newPromisedMessagesHash will be valid
|
|
329
|
+
minBlockHeightIncluded.add(4)
|
|
330
|
+
);
|
|
331
|
+
|
|
332
|
+
// Check signature/escape catch
|
|
333
|
+
publicKey.x.assertEquals(
|
|
334
|
+
sequencerKey,
|
|
335
|
+
"Sequencer public key witness not matching"
|
|
336
|
+
);
|
|
337
|
+
const signatureValid = signature.verify(publicKey, [
|
|
338
|
+
BATCH_SIGNATURE_PREFIX,
|
|
339
|
+
lastSettlementL1BlockHeight.value,
|
|
340
|
+
]);
|
|
341
|
+
const escapeHatchActivated = lastSettlementL1BlockHeight
|
|
342
|
+
.add(UInt32.from(escapeHatchSlotsInterval))
|
|
343
|
+
.lessThan(minBlockHeightIncluded);
|
|
344
|
+
signatureValid
|
|
345
|
+
.or(escapeHatchActivated)
|
|
346
|
+
.assertTrue(
|
|
347
|
+
"Sequencer signature not valid and escape hatch not activated"
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
// Assert correctness of networkState witness
|
|
351
|
+
inputNetworkState
|
|
352
|
+
.hash()
|
|
353
|
+
.assertEquals(networkStateHash, "InputNetworkState witness not valid");
|
|
354
|
+
outputNetworkState
|
|
355
|
+
.hash()
|
|
356
|
+
.assertEquals(
|
|
357
|
+
blockProof.publicOutput.networkStateHash,
|
|
358
|
+
"OutputNetworkState witness not valid"
|
|
359
|
+
);
|
|
360
|
+
|
|
361
|
+
blockProof.publicOutput.closed.assertEquals(
|
|
362
|
+
Bool(true),
|
|
363
|
+
"Supplied proof is not a closed BlockProof"
|
|
364
|
+
);
|
|
365
|
+
blockProof.publicOutput.pendingSTBatchesHash.assertEquals(
|
|
366
|
+
Field(0),
|
|
367
|
+
"Supplied proof is has outstanding STs to be proven"
|
|
368
|
+
);
|
|
369
|
+
|
|
370
|
+
// Execute onSettlementHooks for additional checks
|
|
371
|
+
const stateRecord: SettlementStateRecord = {
|
|
372
|
+
blockHashRoot,
|
|
373
|
+
stateRoot,
|
|
374
|
+
networkStateHash,
|
|
375
|
+
lastSettlementL1BlockHeight,
|
|
376
|
+
sequencerKey: publicKey,
|
|
377
|
+
};
|
|
378
|
+
const inputs: SettlementHookInputs = {
|
|
379
|
+
blockProof,
|
|
380
|
+
contractState: stateRecord,
|
|
381
|
+
newPromisedMessagesHash,
|
|
382
|
+
fromNetworkState: inputNetworkState,
|
|
383
|
+
toNetworkState: outputNetworkState,
|
|
384
|
+
currentL1BlockHeight: minBlockHeightIncluded,
|
|
385
|
+
};
|
|
386
|
+
await mapSequential(hooks, async (hook) => {
|
|
387
|
+
await hook.beforeSettlement(this, inputs);
|
|
388
|
+
});
|
|
389
|
+
|
|
390
|
+
// Apply blockProof
|
|
391
|
+
stateRoot.assertEquals(
|
|
392
|
+
blockProof.publicInput.stateRoot,
|
|
393
|
+
"Input state root not matching"
|
|
394
|
+
);
|
|
395
|
+
|
|
396
|
+
networkStateHash.assertEquals(
|
|
397
|
+
blockProof.publicInput.networkStateHash,
|
|
398
|
+
"Input networkStateHash not matching"
|
|
399
|
+
);
|
|
400
|
+
blockHashRoot.assertEquals(
|
|
401
|
+
blockProof.publicInput.blockHashRoot,
|
|
402
|
+
"Input blockHashRoot not matching"
|
|
403
|
+
);
|
|
404
|
+
this.stateRoot.set(blockProof.publicOutput.stateRoot);
|
|
405
|
+
this.networkStateHash.set(blockProof.publicOutput.networkStateHash);
|
|
406
|
+
this.blockHashRoot.set(blockProof.publicOutput.blockHashRoot);
|
|
407
|
+
|
|
408
|
+
// Assert and apply deposit commitments
|
|
409
|
+
promisedMessagesHash.assertEquals(
|
|
410
|
+
blockProof.publicOutput.incomingMessagesHash,
|
|
411
|
+
"Promised messages not honored"
|
|
412
|
+
);
|
|
413
|
+
|
|
414
|
+
// Set authorization for the dispatchContract to verify the messages hash update
|
|
415
|
+
this.authorizationField.set(
|
|
416
|
+
new UpdateMessagesHashAuth({
|
|
417
|
+
target: dispatchContract.address,
|
|
418
|
+
executedMessagesHash: promisedMessagesHash,
|
|
419
|
+
newPromisedMessagesHash,
|
|
420
|
+
}).hash()
|
|
421
|
+
);
|
|
422
|
+
|
|
423
|
+
// Call DispatchContract
|
|
424
|
+
// This call checks that the promisedMessagesHash, which is already proven
|
|
425
|
+
// to be the blockProofs publicoutput, is actually the current on-chain
|
|
426
|
+
// promisedMessageHash. It also checks the newPromisedMessagesHash to be
|
|
427
|
+
// a current sequencestate value
|
|
428
|
+
await dispatchContract.updateMessagesHash(
|
|
429
|
+
promisedMessagesHash,
|
|
430
|
+
newPromisedMessagesHash
|
|
431
|
+
);
|
|
432
|
+
|
|
433
|
+
this.lastSettlementL1BlockHeight.set(minBlockHeightIncluded);
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
export class SettlementSmartContract
|
|
438
|
+
extends SettlementSmartContractBase
|
|
439
|
+
implements SettlementContractType
|
|
440
|
+
{
|
|
441
|
+
@state(Field) public sequencerKey = State<Field>();
|
|
442
|
+
@state(UInt32) public lastSettlementL1BlockHeight = State<UInt32>();
|
|
443
|
+
|
|
444
|
+
@state(Field) public stateRoot = State<Field>();
|
|
445
|
+
@state(Field) public networkStateHash = State<Field>();
|
|
446
|
+
@state(Field) public blockHashRoot = State<Field>();
|
|
447
|
+
|
|
448
|
+
@state(Field) public dispatchContractAddressX = State<Field>();
|
|
449
|
+
|
|
450
|
+
@state(Field) public authorizationField = State<Field>();
|
|
451
|
+
|
|
452
|
+
@method async approveBase(forest: AccountUpdateForest) {
|
|
453
|
+
this.checkZeroBalanceChange(forest);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
@method
|
|
457
|
+
public async initialize(
|
|
458
|
+
sequencer: PublicKey,
|
|
459
|
+
dispatchContract: PublicKey,
|
|
460
|
+
bridgeContract: PublicKey,
|
|
461
|
+
contractKey: PrivateKey
|
|
462
|
+
) {
|
|
463
|
+
await this.initializeBase(
|
|
464
|
+
sequencer,
|
|
465
|
+
dispatchContract,
|
|
466
|
+
bridgeContract,
|
|
467
|
+
contractKey
|
|
468
|
+
);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
@method
|
|
472
|
+
public async addTokenBridge(
|
|
473
|
+
tokenId: Field,
|
|
474
|
+
address: PublicKey,
|
|
475
|
+
dispatchContract: PublicKey
|
|
476
|
+
) {
|
|
477
|
+
await this.deployTokenBridge(tokenId, address, dispatchContract);
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
@method
|
|
481
|
+
public async settle(
|
|
482
|
+
blockProof: DynamicBlockProof,
|
|
483
|
+
signature: Signature,
|
|
484
|
+
dispatchContractAddress: PublicKey,
|
|
485
|
+
publicKey: PublicKey,
|
|
486
|
+
inputNetworkState: NetworkState,
|
|
487
|
+
outputNetworkState: NetworkState,
|
|
488
|
+
newPromisedMessagesHash: Field
|
|
489
|
+
) {
|
|
490
|
+
return await this.settleBase(
|
|
491
|
+
blockProof,
|
|
492
|
+
signature,
|
|
493
|
+
dispatchContractAddress,
|
|
494
|
+
publicKey,
|
|
495
|
+
inputNetworkState,
|
|
496
|
+
outputNetworkState,
|
|
497
|
+
newPromisedMessagesHash
|
|
498
|
+
);
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
/* eslint-enable @typescript-eslint/lines-between-class-members */
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createMerkleTree,
|
|
3
|
+
InMemoryMerkleTreeStorage,
|
|
4
|
+
log,
|
|
5
|
+
} from "@proto-kit/common";
|
|
6
|
+
import { Field, Poseidon, PublicKey, SmartContract, Struct } from "o1js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Merkle tree that contains all the deployed token bridges as a mapping of
|
|
10
|
+
* tokenId => PublicKey
|
|
11
|
+
*
|
|
12
|
+
* It should be used as an append-only tree with incremental indizes - this allows
|
|
13
|
+
* us to reduce the height of it
|
|
14
|
+
*/
|
|
15
|
+
export class TokenBridgeTree extends createMerkleTree(256) {
|
|
16
|
+
public indizes: Record<string, bigint> = {};
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Initializes and fills the tree based on all on-chain events that have been
|
|
20
|
+
* emitted by every emit
|
|
21
|
+
*/
|
|
22
|
+
public static async buildTreeFromEvents(
|
|
23
|
+
contract: SmartContract & {
|
|
24
|
+
events: { "token-bridge-added": typeof TokenBridgeTreeAddition };
|
|
25
|
+
}
|
|
26
|
+
) {
|
|
27
|
+
const events = await contract.fetchEvents();
|
|
28
|
+
|
|
29
|
+
log.debug(`Found ${events.length} token bridge add events`);
|
|
30
|
+
|
|
31
|
+
const tree = new TokenBridgeTree(new InMemoryMerkleTreeStorage());
|
|
32
|
+
const indizes: Record<string, bigint> = {};
|
|
33
|
+
|
|
34
|
+
events.forEach(({ type, event }) => {
|
|
35
|
+
if (type === "token-bridge-added") {
|
|
36
|
+
const addition =
|
|
37
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
38
|
+
event.data as unknown as TokenBridgeTreeAddition;
|
|
39
|
+
|
|
40
|
+
tree.setLeaf(addition.index.toBigInt(), addition.value.hash());
|
|
41
|
+
|
|
42
|
+
indizes[addition.value.tokenId.toString()] = addition.index.toBigInt();
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
tree.indizes = indizes;
|
|
46
|
+
return tree;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public getIndex(tokenId: Field): bigint {
|
|
50
|
+
return this.indizes[tokenId.toString()];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export class TokenBridgeTreeWitness extends TokenBridgeTree.WITNESS {}
|
|
55
|
+
|
|
56
|
+
export class TokenBridgeEntry extends Struct({
|
|
57
|
+
address: PublicKey,
|
|
58
|
+
tokenId: Field,
|
|
59
|
+
}) {
|
|
60
|
+
public hash() {
|
|
61
|
+
return Poseidon.hash(TokenBridgeEntry.toFields(this));
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export class TokenBridgeAttestation extends Struct({
|
|
66
|
+
witness: TokenBridgeTreeWitness,
|
|
67
|
+
index: Field,
|
|
68
|
+
}) {}
|
|
69
|
+
|
|
70
|
+
export class TokenBridgeTreeAddition extends Struct({
|
|
71
|
+
index: Field,
|
|
72
|
+
value: TokenBridgeEntry,
|
|
73
|
+
}) {}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Field, PublicKey } from "o1js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Interface for cross-contract call authorization
|
|
5
|
+
* See https://github.com/proto-kit/framework/issues/202#issuecomment-2407263173
|
|
6
|
+
*/
|
|
7
|
+
export interface ContractAuthorization {
|
|
8
|
+
target: PublicKey;
|
|
9
|
+
|
|
10
|
+
hash: () => Field;
|
|
11
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Field, Poseidon, PublicKey, Struct } from "o1js";
|
|
2
|
+
|
|
3
|
+
import { ContractAuthorization } from "./ContractAuthorization";
|
|
4
|
+
|
|
5
|
+
export class TokenBridgeDeploymentAuth
|
|
6
|
+
extends Struct({
|
|
7
|
+
target: PublicKey,
|
|
8
|
+
tokenId: Field,
|
|
9
|
+
address: PublicKey,
|
|
10
|
+
})
|
|
11
|
+
implements ContractAuthorization
|
|
12
|
+
{
|
|
13
|
+
public hash() {
|
|
14
|
+
return Poseidon.hash(TokenBridgeDeploymentAuth.toFields(this));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Field, Poseidon, PublicKey, Struct } from "o1js";
|
|
2
|
+
|
|
3
|
+
import { ContractAuthorization } from "./ContractAuthorization";
|
|
4
|
+
|
|
5
|
+
export class UpdateMessagesHashAuth
|
|
6
|
+
extends Struct({
|
|
7
|
+
target: PublicKey,
|
|
8
|
+
executedMessagesHash: Field,
|
|
9
|
+
newPromisedMessagesHash: Field,
|
|
10
|
+
})
|
|
11
|
+
implements ContractAuthorization
|
|
12
|
+
{
|
|
13
|
+
public hash() {
|
|
14
|
+
return Poseidon.hash(UpdateMessagesHashAuth.toFields(this));
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Field, Struct } from "o1js";
|
|
2
|
+
|
|
3
|
+
export class OutgoingMessageKeyStruct extends Struct({
|
|
4
|
+
index: Field,
|
|
5
|
+
tokenId: Field,
|
|
6
|
+
}) {}
|
|
7
|
+
|
|
8
|
+
export type OutgoingMessageEvent<T> = {
|
|
9
|
+
key: OutgoingMessageKeyStruct;
|
|
10
|
+
value: T;
|
|
11
|
+
messageType: Field;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export type OutgoingMessage<T> = {
|
|
15
|
+
value: T;
|
|
16
|
+
messageType: Field;
|
|
17
|
+
};
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { Bool, Field, FlexibleProvablePure, Provable, Struct } from "o1js";
|
|
2
|
+
import {
|
|
3
|
+
LinkedMerkleTree,
|
|
4
|
+
LinkedMerkleTreeReadWitness,
|
|
5
|
+
} from "@proto-kit/common";
|
|
6
|
+
|
|
7
|
+
import { OutgoingMessage } from "./OutgoingMessage";
|
|
8
|
+
|
|
9
|
+
// TODO Make that dynamic based on processors configured
|
|
10
|
+
export const OUTGOING_MESSAGE_BATCH_SIZE = 1;
|
|
11
|
+
|
|
12
|
+
export function createMessageStruct<T>(type: FlexibleProvablePure<T>) {
|
|
13
|
+
return class MessageStruct extends Struct({
|
|
14
|
+
value: type,
|
|
15
|
+
messageType: Field,
|
|
16
|
+
}) {} satisfies FlexibleProvablePure<OutgoingMessage<T>>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export class OutgoingMessageArgument extends Struct({
|
|
20
|
+
witness: LinkedMerkleTreeReadWitness,
|
|
21
|
+
messageType: Field,
|
|
22
|
+
}) {
|
|
23
|
+
public static dummy(): OutgoingMessageArgument {
|
|
24
|
+
return new OutgoingMessageArgument({
|
|
25
|
+
witness: LinkedMerkleTree.dummyReadWitness(),
|
|
26
|
+
messageType: Field(0),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export class OutgoingMessageArgumentBatch extends Struct({
|
|
32
|
+
arguments: Provable.Array(
|
|
33
|
+
OutgoingMessageArgument,
|
|
34
|
+
OUTGOING_MESSAGE_BATCH_SIZE
|
|
35
|
+
),
|
|
36
|
+
|
|
37
|
+
isDummys: Provable.Array(Bool, OUTGOING_MESSAGE_BATCH_SIZE),
|
|
38
|
+
}) {
|
|
39
|
+
public static fromMessages(providedArguments: OutgoingMessageArgument[]) {
|
|
40
|
+
const batch = providedArguments.slice();
|
|
41
|
+
const isDummys = batch.map(() => Bool(false));
|
|
42
|
+
|
|
43
|
+
while (batch.length < OUTGOING_MESSAGE_BATCH_SIZE) {
|
|
44
|
+
batch.push(OutgoingMessageArgument.dummy());
|
|
45
|
+
isDummys.push(Bool(true));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return new OutgoingMessageArgumentBatch({
|
|
49
|
+
arguments: batch,
|
|
50
|
+
isDummys,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|