@proto-kit/protocol 0.1.1-develop.0
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/LICENSE.md +201 -0
- package/README.md +45 -0
- package/dist/Constants.d.ts +4 -0
- package/dist/Constants.d.ts.map +1 -0
- package/dist/Constants.js +4 -0
- package/dist/Constants.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 +48 -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 +8 -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 +9 -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/hooks/NoopSettlementHook.js +18 -0
- 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 +8 -0
- package/dist/hooks/NoopTransactionHook.js.map +1 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +58 -0
- package/dist/index.js.map +1 -0
- package/dist/model/MethodPublicOutput.d.ts +113 -0
- package/dist/model/MethodPublicOutput.d.ts.map +1 -0
- package/dist/model/MethodPublicOutput.js +15 -0
- package/dist/model/MethodPublicOutput.js.map +1 -0
- package/dist/model/Option.d.ts +122 -0
- package/dist/model/Option.d.ts.map +1 -0
- package/dist/model/Option.js +111 -0
- package/dist/model/Option.js.map +1 -0
- package/dist/model/Path.d.ts +31 -0
- package/dist/model/Path.d.ts.map +1 -0
- package/dist/model/Path.js +43 -0
- 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 +135 -0
- package/dist/model/StateTransition.d.ts.map +1 -0
- package/dist/model/StateTransition.js +69 -0
- package/dist/model/StateTransition.js.map +1 -0
- package/dist/model/StateTransitionProvableBatch.d.ts +198 -0
- package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -0
- package/dist/model/StateTransitionProvableBatch.js +91 -0
- package/dist/model/StateTransitionProvableBatch.js.map +1 -0
- package/dist/model/network/NetworkState.d.ts +160 -0
- package/dist/model/network/NetworkState.d.ts.map +1 -0
- package/dist/model/network/NetworkState.js +32 -0
- package/dist/model/network/NetworkState.js.map +1 -0
- package/dist/model/transaction/RuntimeTransaction.d.ts +122 -0
- package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -0
- package/dist/model/transaction/RuntimeTransaction.js +87 -0
- 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 +43 -0
- package/dist/protocol/Protocol.d.ts.map +1 -0
- package/dist/protocol/Protocol.js +120 -0
- 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 +9 -0
- package/dist/protocol/ProtocolModule.d.ts.map +1 -0
- package/dist/protocol/ProtocolModule.js +13 -0
- package/dist/protocol/ProtocolModule.js.map +1 -0
- package/dist/protocol/ProvableBlockHook.d.ts +8 -0
- package/dist/protocol/ProvableBlockHook.d.ts.map +1 -0
- package/dist/protocol/ProvableBlockHook.js +5 -0
- package/dist/protocol/ProvableBlockHook.js.map +1 -0
- package/dist/protocol/ProvableTransactionHook.d.ts +7 -0
- package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -0
- package/dist/protocol/ProvableTransactionHook.js +4 -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/block/BlockProvable.d.ts +409 -0
- package/dist/prover/block/BlockProvable.d.ts.map +1 -0
- package/dist/prover/block/BlockProvable.js +48 -0
- package/dist/prover/block/BlockProvable.js.map +1 -0
- package/dist/prover/block/BlockProver.d.ts +94 -0
- package/dist/prover/block/BlockProver.d.ts.map +1 -0
- package/dist/prover/block/BlockProver.js +510 -0
- package/dist/prover/block/BlockProver.js.map +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +64 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.js +17 -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/block/services/RuntimeVerificationKeyRootService.js +23 -0
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.js.map +1 -0
- package/dist/prover/statetransition/StateTransitionProvable.d.ts +172 -0
- package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -0
- package/dist/prover/statetransition/StateTransitionProvable.js +16 -0
- package/dist/prover/statetransition/StateTransitionProvable.js.map +1 -0
- package/dist/prover/statetransition/StateTransitionProver.d.ts +48 -0
- package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -0
- package/dist/prover/statetransition/StateTransitionProver.js +187 -0
- 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 +53 -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 +97 -0
- package/dist/settlement/contracts/BridgeContract.d.ts.map +1 -0
- package/dist/settlement/contracts/BridgeContract.js +164 -0
- package/dist/settlement/contracts/BridgeContract.js.map +1 -0
- package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts +14 -0
- package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/BridgeContractProtocolModule.js +30 -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 +230 -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 +82 -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 +309 -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/OutgoingMessageArgument.d.ts +197 -0
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
- package/dist/settlement/messages/OutgoingMessageArgument.js +33 -0
- package/dist/settlement/messages/OutgoingMessageArgument.js.map +1 -0
- package/dist/settlement/messages/Withdrawal.d.ts +78 -0
- package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
- package/dist/settlement/messages/Withdrawal.js +16 -0
- package/dist/settlement/messages/Withdrawal.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/State.d.ts +68 -0
- package/dist/state/State.d.ts.map +1 -0
- package/dist/state/State.js +130 -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 +31 -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 +136 -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 +7 -0
- package/dist/state/protocol/ProtocolState.d.ts.map +1 -0
- package/dist/state/protocol/ProtocolState.js +40 -0
- package/dist/state/protocol/ProtocolState.js.map +1 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts +24 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
- package/dist/utils/MinaPrefixedProvableHashList.js +53 -0
- package/dist/utils/MinaPrefixedProvableHashList.js.map +1 -0
- package/dist/utils/PrefixedProvableHashList.d.ts +8 -0
- package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -0
- package/dist/utils/PrefixedProvableHashList.js +13 -0
- package/dist/utils/PrefixedProvableHashList.js.map +1 -0
- package/dist/utils/ProvableHashList.d.ts +27 -0
- package/dist/utils/ProvableHashList.d.ts.map +1 -0
- package/dist/utils/ProvableHashList.js +44 -0
- package/dist/utils/ProvableHashList.js.map +1 -0
- package/dist/utils/ProvableReductionHashList.d.ts +14 -0
- package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
- package/dist/utils/ProvableReductionHashList.js +51 -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 +11 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +45 -0
- package/dist/utils/utils.js.map +1 -0
- package/jest.config.cjs +12 -0
- package/package.json +36 -0
- package/src/Constants.ts +3 -0
- package/src/hooks/AccountStateHook.ts +48 -0
- package/src/hooks/BlockHeightHook.ts +17 -0
- package/src/hooks/LastStateRootBlockHook.ts +26 -0
- package/src/hooks/NoopBlockHook.ts +21 -0
- package/src/hooks/NoopSettlementHook.ts +20 -0
- package/src/hooks/NoopTransactionHook.ts +10 -0
- package/src/index.ts +57 -0
- package/src/model/MethodPublicOutput.ts +14 -0
- package/src/model/Option.ts +172 -0
- package/src/model/Path.ts +50 -0
- package/src/model/RuntimeLike.ts +12 -0
- package/src/model/StateTransition.ts +88 -0
- package/src/model/StateTransitionProvableBatch.ts +145 -0
- package/src/model/Transaction.ts +31 -0
- package/src/model/network/NetworkState.ts +33 -0
- package/src/model/transaction/RuntimeTransaction.ts +105 -0
- package/src/model/transaction/SignedTransaction.ts +47 -0
- package/src/model/transaction/ValueOption.ts +28 -0
- package/src/protocol/Protocol.ts +226 -0
- package/src/protocol/ProtocolEnvironment.ts +10 -0
- package/src/protocol/ProtocolModule.ts +27 -0
- package/src/protocol/ProvableBlockHook.ts +19 -0
- package/src/protocol/ProvableTransactionHook.ts +13 -0
- package/src/protocol/TransitioningProtocolModule.ts +12 -0
- package/src/prover/block/BlockProvable.ts +99 -0
- package/src/prover/block/BlockProver.ts +990 -0
- package/src/prover/block/accummulators/BlockHashMerkleTree.ts +16 -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 +41 -0
- package/src/prover/statetransition/StateTransitionProver.ts +377 -0
- package/src/settlement/ContractModule.ts +31 -0
- package/src/settlement/SettlementContractModule.ts +145 -0
- package/src/settlement/contracts/BridgeContract.ts +237 -0
- package/src/settlement/contracts/BridgeContractProtocolModule.ts +43 -0
- package/src/settlement/contracts/DispatchContractProtocolModule.ts +73 -0
- package/src/settlement/contracts/DispatchSmartContract.ts +326 -0
- package/src/settlement/contracts/SettlementContractProtocolModule.ts +108 -0
- package/src/settlement/contracts/SettlementSmartContract.ts +498 -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/OutgoingMessageArgument.ts +42 -0
- package/src/settlement/messages/Withdrawal.ts +16 -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 +175 -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 +35 -0
- package/src/state/context/RuntimeMethodExecutionContext.ts +174 -0
- package/src/state/context/TransitionMethodExecutionContext.ts +26 -0
- package/src/state/protocol/ProtocolState.ts +61 -0
- package/src/utils/MinaPrefixedProvableHashList.ts +73 -0
- package/src/utils/PrefixedProvableHashList.ts +21 -0
- package/src/utils/ProvableHashList.ts +50 -0
- package/src/utils/ProvableReductionHashList.ts +68 -0
- package/src/utils/StateTransitionReductionList.ts +89 -0
- package/src/utils/utils.ts +75 -0
- package/test/BlockProver.test.ts +212 -0
- package/test/Protocol.test.ts +37 -0
- package/test/State.test.ts +45 -0
- package/test/StateTransition.test.ts +174 -0
- package/test/TestingProtocol.ts +52 -0
- package/test/compiling/types.ts +28 -0
- package/test/model/Option.test.ts +72 -0
- package/test/modularity/types.ts +35 -0
- package/test/state/assert/assert.test.ts +56 -0
- package/test/tsconfig.json +7 -0
- package/test/utils/ProvableReductionHashList.test.ts +117 -0
- package/test/utils.test.ts +27 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AccountUpdate,
|
|
3
|
+
Bool,
|
|
4
|
+
Field,
|
|
5
|
+
method,
|
|
6
|
+
Permissions,
|
|
7
|
+
Poseidon,
|
|
8
|
+
Provable,
|
|
9
|
+
PublicKey,
|
|
10
|
+
SmartContract,
|
|
11
|
+
State,
|
|
12
|
+
state,
|
|
13
|
+
Struct,
|
|
14
|
+
TokenContractV2,
|
|
15
|
+
TokenId,
|
|
16
|
+
VerificationKey,
|
|
17
|
+
} from "o1js";
|
|
18
|
+
import { noop, range, TypedClass } from "@proto-kit/common";
|
|
19
|
+
|
|
20
|
+
import {
|
|
21
|
+
OUTGOING_MESSAGE_BATCH_SIZE,
|
|
22
|
+
OutgoingMessageArgumentBatch,
|
|
23
|
+
} from "../messages/OutgoingMessageArgument";
|
|
24
|
+
import { Path } from "../../model/Path";
|
|
25
|
+
import { Withdrawal } from "../messages/Withdrawal";
|
|
26
|
+
|
|
27
|
+
import type { SettlementContractType } from "./SettlementSmartContract";
|
|
28
|
+
|
|
29
|
+
export type BridgeContractType = {
|
|
30
|
+
stateRoot: State<Field>;
|
|
31
|
+
outgoingMessageCursor: State<Field>;
|
|
32
|
+
|
|
33
|
+
rollupOutgoingMessages: (
|
|
34
|
+
batch: OutgoingMessageArgumentBatch
|
|
35
|
+
) => Promise<Field>;
|
|
36
|
+
redeem: (additionUpdate: AccountUpdate) => Promise<void>;
|
|
37
|
+
|
|
38
|
+
deployProvable: (
|
|
39
|
+
args: VerificationKey | undefined,
|
|
40
|
+
signedSettlement: boolean,
|
|
41
|
+
permissions: Permissions,
|
|
42
|
+
settlementContractAddress: PublicKey
|
|
43
|
+
) => Promise<AccountUpdate>;
|
|
44
|
+
|
|
45
|
+
updateStateRoot: (root: Field) => Promise<void>;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Equal to WithdrawalKey
|
|
49
|
+
export class OutgoingMessageKey extends Struct({
|
|
50
|
+
index: Field,
|
|
51
|
+
tokenId: Field,
|
|
52
|
+
}) {}
|
|
53
|
+
|
|
54
|
+
export abstract class BridgeContractBase extends TokenContractV2 {
|
|
55
|
+
public static args: {
|
|
56
|
+
SettlementContract:
|
|
57
|
+
| (TypedClass<SettlementContractType> & typeof SmartContract)
|
|
58
|
+
| undefined;
|
|
59
|
+
withdrawalStatePath: [string, string];
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
abstract settlementContractAddress: State<PublicKey>;
|
|
63
|
+
|
|
64
|
+
abstract stateRoot: State<Field>;
|
|
65
|
+
|
|
66
|
+
abstract outgoingMessageCursor: State<Field>;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Function to deploy the bridging contract in a provable way, so that it can be
|
|
70
|
+
* a provable process initiated by the settlement contract with a baked-in vk
|
|
71
|
+
*
|
|
72
|
+
* @returns Creates and returns an account update deploying the bridge contract
|
|
73
|
+
*/
|
|
74
|
+
public async deployProvable(
|
|
75
|
+
verificationKey: VerificationKey | undefined,
|
|
76
|
+
signedSettlement: boolean,
|
|
77
|
+
permissions: Permissions,
|
|
78
|
+
settlementContractAddress: PublicKey
|
|
79
|
+
) {
|
|
80
|
+
const accountUpdate = this.self;
|
|
81
|
+
|
|
82
|
+
if (!signedSettlement) {
|
|
83
|
+
if (verificationKey === undefined) {
|
|
84
|
+
throw new Error("Verification Key not provided, can't deploy");
|
|
85
|
+
}
|
|
86
|
+
accountUpdate.account.verificationKey.set(verificationKey);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
accountUpdate.requireSignature();
|
|
90
|
+
this.account.permissions.set(permissions);
|
|
91
|
+
|
|
92
|
+
range(0, 8).forEach((i) => {
|
|
93
|
+
accountUpdate.update.appState[i] = {
|
|
94
|
+
isSome: Bool(true),
|
|
95
|
+
value: Field(0),
|
|
96
|
+
};
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
this.settlementContractAddress.set(settlementContractAddress);
|
|
100
|
+
|
|
101
|
+
accountUpdate.body.mayUseToken = {
|
|
102
|
+
// Set to true for custom tokens only
|
|
103
|
+
inheritFromParent: accountUpdate.tokenId.equals(TokenId.default).not(),
|
|
104
|
+
parentsOwnToken: Bool(false),
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
return accountUpdate;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
public async approveBase(): Promise<void> {
|
|
111
|
+
noop();
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public async updateStateRootBase(root: Field) {
|
|
115
|
+
this.stateRoot.set(root);
|
|
116
|
+
|
|
117
|
+
const settlementContractAddress =
|
|
118
|
+
this.settlementContractAddress.getAndRequireEquals();
|
|
119
|
+
const SettlementContractClass = BridgeContractBase.args.SettlementContract;
|
|
120
|
+
if (SettlementContractClass === undefined) {
|
|
121
|
+
throw new Error(
|
|
122
|
+
"Settlement Contract class hasn't been set yet, something is wrong with your module composition"
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
const settlementContract = new SettlementContractClass(
|
|
126
|
+
settlementContractAddress
|
|
127
|
+
);
|
|
128
|
+
const accountUpdate = settlementContract.assertStateRoot(root);
|
|
129
|
+
this.approve(accountUpdate);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
public async rollupOutgoingMessagesBase(
|
|
133
|
+
batch: OutgoingMessageArgumentBatch
|
|
134
|
+
): Promise<Field> {
|
|
135
|
+
let counter = this.outgoingMessageCursor.getAndRequireEquals();
|
|
136
|
+
const stateRoot = this.stateRoot.getAndRequireEquals();
|
|
137
|
+
|
|
138
|
+
const [withdrawalModule, withdrawalStateName] =
|
|
139
|
+
BridgeContractBase.args.withdrawalStatePath;
|
|
140
|
+
const mapPath = Path.fromProperty(withdrawalModule, withdrawalStateName);
|
|
141
|
+
|
|
142
|
+
// Count account creation fee to return later, so that the sender can fund
|
|
143
|
+
// those accounts with a separate AU
|
|
144
|
+
let accountCreationFeePaid = Field(0);
|
|
145
|
+
|
|
146
|
+
for (let i = 0; i < OUTGOING_MESSAGE_BATCH_SIZE; i++) {
|
|
147
|
+
const args = batch.arguments[i];
|
|
148
|
+
|
|
149
|
+
// Check witness
|
|
150
|
+
const path = Path.fromKey(mapPath, OutgoingMessageKey, {
|
|
151
|
+
index: counter,
|
|
152
|
+
tokenId: this.tokenId,
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
// Process message
|
|
156
|
+
const { address, amount } = args.value;
|
|
157
|
+
const isDummy = address.equals(this.address);
|
|
158
|
+
|
|
159
|
+
args.witness
|
|
160
|
+
.checkMembership(
|
|
161
|
+
stateRoot,
|
|
162
|
+
path,
|
|
163
|
+
Poseidon.hash(Withdrawal.toFields(args.value))
|
|
164
|
+
)
|
|
165
|
+
.or(isDummy)
|
|
166
|
+
.assertTrue("Provided Withdrawal witness not valid");
|
|
167
|
+
|
|
168
|
+
const tokenAu = this.internal.mint({ address, amount });
|
|
169
|
+
const isNewAccount = tokenAu.account.isNew.getAndRequireEquals();
|
|
170
|
+
|
|
171
|
+
accountCreationFeePaid = accountCreationFeePaid.add(
|
|
172
|
+
Provable.if(isNewAccount, Field(1e9), Field(0))
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
counter = counter.add(Provable.if(isDummy, Field(0), Field(1)));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
this.outgoingMessageCursor.set(counter);
|
|
179
|
+
|
|
180
|
+
return accountCreationFeePaid;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
protected async redeemBase(additionUpdate: AccountUpdate) {
|
|
184
|
+
additionUpdate.body.tokenId.assertEquals(
|
|
185
|
+
this.tokenId,
|
|
186
|
+
"Tokenid not same as this bridging contract's tokenId"
|
|
187
|
+
);
|
|
188
|
+
additionUpdate.body.balanceChange.sgn
|
|
189
|
+
.isPositive()
|
|
190
|
+
.assertTrue("Sign not correct");
|
|
191
|
+
const amount = additionUpdate.body.balanceChange.magnitude;
|
|
192
|
+
|
|
193
|
+
// Burn tokens
|
|
194
|
+
this.internal.burn({
|
|
195
|
+
address: additionUpdate.publicKey,
|
|
196
|
+
amount,
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
// Inherit from parent for custom tokens
|
|
200
|
+
additionUpdate.body.mayUseToken = {
|
|
201
|
+
inheritFromParent: this.tokenId.equals(TokenId.default).not(),
|
|
202
|
+
parentsOwnToken: Bool(false),
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
// Send mina
|
|
206
|
+
this.approve(additionUpdate);
|
|
207
|
+
this.balance.subInPlace(amount);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export class BridgeContract
|
|
212
|
+
extends BridgeContractBase
|
|
213
|
+
implements BridgeContractType
|
|
214
|
+
{
|
|
215
|
+
@state(PublicKey) public settlementContractAddress = State<PublicKey>();
|
|
216
|
+
|
|
217
|
+
@state(Field) public stateRoot = State<Field>();
|
|
218
|
+
|
|
219
|
+
@state(Field) public outgoingMessageCursor = State<Field>();
|
|
220
|
+
|
|
221
|
+
@method
|
|
222
|
+
public async updateStateRoot(root: Field) {
|
|
223
|
+
return await this.updateStateRootBase(root);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
@method.returns(Field)
|
|
227
|
+
public async rollupOutgoingMessages(
|
|
228
|
+
batch: OutgoingMessageArgumentBatch
|
|
229
|
+
): Promise<Field> {
|
|
230
|
+
return await this.rollupOutgoingMessagesBase(batch);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
@method
|
|
234
|
+
public async redeem(additionUpdate: AccountUpdate) {
|
|
235
|
+
return await this.redeemBase(additionUpdate);
|
|
236
|
+
}
|
|
237
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { injectable } from "tsyringe";
|
|
2
|
+
import { CompileRegistry } from "@proto-kit/common";
|
|
3
|
+
|
|
4
|
+
import { ContractModule } from "../ContractModule";
|
|
5
|
+
|
|
6
|
+
import {
|
|
7
|
+
BridgeContract,
|
|
8
|
+
BridgeContractBase,
|
|
9
|
+
BridgeContractType,
|
|
10
|
+
} from "./BridgeContract";
|
|
11
|
+
|
|
12
|
+
export type BridgeContractConfig = {
|
|
13
|
+
withdrawalStatePath: `${string}.${string}`;
|
|
14
|
+
withdrawalEventName: string;
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
@injectable()
|
|
18
|
+
export class BridgeContractProtocolModule extends ContractModule<
|
|
19
|
+
BridgeContractType,
|
|
20
|
+
BridgeContractConfig
|
|
21
|
+
> {
|
|
22
|
+
public contractFactory() {
|
|
23
|
+
const { config } = this;
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
25
|
+
const withdrawalStatePathSplit = config.withdrawalStatePath.split(".") as [
|
|
26
|
+
string,
|
|
27
|
+
string,
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
BridgeContractBase.args = {
|
|
31
|
+
withdrawalStatePath: withdrawalStatePathSplit,
|
|
32
|
+
SettlementContract: BridgeContractBase.args?.SettlementContract,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
return BridgeContract;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public async compile(registry: CompileRegistry) {
|
|
39
|
+
return {
|
|
40
|
+
BridgeContract: await registry.compile(BridgeContract),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { inject, injectable } from "tsyringe";
|
|
2
|
+
import { PublicKey } from "o1js";
|
|
3
|
+
import { CompileRegistry } from "@proto-kit/common";
|
|
4
|
+
|
|
5
|
+
import { RuntimeLike, RuntimeMethodIdMapping } from "../../model/RuntimeLike";
|
|
6
|
+
import {
|
|
7
|
+
ContractModule,
|
|
8
|
+
SmartContractClassFromInterface,
|
|
9
|
+
} from "../ContractModule";
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
DispatchSmartContract,
|
|
13
|
+
DispatchContractType,
|
|
14
|
+
DispatchSmartContractBase,
|
|
15
|
+
} from "./DispatchSmartContract";
|
|
16
|
+
|
|
17
|
+
export type DispatchContractConfig = {
|
|
18
|
+
incomingMessagesMethods: Record<string, `${string}.${string}`>;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
@injectable()
|
|
22
|
+
export class DispatchContractProtocolModule extends ContractModule<
|
|
23
|
+
DispatchContractType,
|
|
24
|
+
DispatchContractConfig
|
|
25
|
+
> {
|
|
26
|
+
public constructor(@inject("Runtime") private readonly runtime: RuntimeLike) {
|
|
27
|
+
super();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public eventsDefinition() {
|
|
31
|
+
return new DispatchSmartContract(PublicKey.empty<typeof PublicKey>())
|
|
32
|
+
.events;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
private checkConfigIntegrity(
|
|
36
|
+
incomingMessagesMethods: Record<string, `${string}.${string}`>,
|
|
37
|
+
runtimeMethodIds: RuntimeMethodIdMapping
|
|
38
|
+
) {
|
|
39
|
+
const missing = Object.values(incomingMessagesMethods).filter(
|
|
40
|
+
(method) => runtimeMethodIds[method] === undefined
|
|
41
|
+
);
|
|
42
|
+
if (missing.length > 0) {
|
|
43
|
+
throw new Error(
|
|
44
|
+
`Incoming messages config references a unknown methods: [${missing}]`
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public contractFactory(): SmartContractClassFromInterface<DispatchContractType> {
|
|
50
|
+
const { incomingMessagesMethods } = this.config;
|
|
51
|
+
const methodIdMappings = this.runtime.methodIdResolver.methodIdMap();
|
|
52
|
+
|
|
53
|
+
this.checkConfigIntegrity(incomingMessagesMethods, methodIdMappings);
|
|
54
|
+
|
|
55
|
+
DispatchSmartContractBase.args = {
|
|
56
|
+
incomingMessagesPaths: incomingMessagesMethods,
|
|
57
|
+
methodIdMappings,
|
|
58
|
+
settlementContractClass:
|
|
59
|
+
DispatchSmartContractBase.args?.settlementContractClass,
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
return DispatchSmartContract;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public async compile(registry: CompileRegistry) {
|
|
66
|
+
if (DispatchSmartContractBase.args.settlementContractClass === undefined) {
|
|
67
|
+
throw new Error("Reference to Settlement Contract not set");
|
|
68
|
+
}
|
|
69
|
+
return {
|
|
70
|
+
DispatchSmartContract: await registry.compile(DispatchSmartContract),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AccountUpdate,
|
|
3
|
+
Bool,
|
|
4
|
+
Field,
|
|
5
|
+
method,
|
|
6
|
+
Poseidon,
|
|
7
|
+
Provable,
|
|
8
|
+
ProvableExtended,
|
|
9
|
+
PublicKey,
|
|
10
|
+
Reducer,
|
|
11
|
+
SmartContract,
|
|
12
|
+
State,
|
|
13
|
+
state,
|
|
14
|
+
TokenId,
|
|
15
|
+
UInt64,
|
|
16
|
+
} from "o1js";
|
|
17
|
+
import { InMemoryMerkleTreeStorage, TypedClass } from "@proto-kit/common";
|
|
18
|
+
|
|
19
|
+
import { RuntimeMethodIdMapping } from "../../model/RuntimeLike";
|
|
20
|
+
import { RuntimeTransaction } from "../../model/transaction/RuntimeTransaction";
|
|
21
|
+
import {
|
|
22
|
+
MinaActions,
|
|
23
|
+
MinaEvents,
|
|
24
|
+
} from "../../utils/MinaPrefixedProvableHashList";
|
|
25
|
+
import { Deposit } from "../messages/Deposit";
|
|
26
|
+
|
|
27
|
+
import type { SettlementContractType } from "./SettlementSmartContract";
|
|
28
|
+
import { TokenBridgeDeploymentAuth } from "./authorizations/TokenBridgeDeploymentAuth";
|
|
29
|
+
import { UpdateMessagesHashAuth } from "./authorizations/UpdateMessagesHashAuth";
|
|
30
|
+
import {
|
|
31
|
+
TokenBridgeAttestation,
|
|
32
|
+
TokenBridgeEntry,
|
|
33
|
+
TokenBridgeTree,
|
|
34
|
+
TokenBridgeTreeAddition,
|
|
35
|
+
TokenBridgeTreeWitness,
|
|
36
|
+
} from "./TokenBridgeTree";
|
|
37
|
+
|
|
38
|
+
export const ACTIONS_EMPTY_HASH = Reducer.initialActionState;
|
|
39
|
+
|
|
40
|
+
export interface DispatchContractType {
|
|
41
|
+
updateMessagesHash: (
|
|
42
|
+
executedMessagesHash: Field,
|
|
43
|
+
newPromisedMessagesHash: Field
|
|
44
|
+
) => Promise<void>;
|
|
45
|
+
initialize: (settlementContract: PublicKey) => Promise<void>;
|
|
46
|
+
enableTokenDeposits: (
|
|
47
|
+
tokenId: Field,
|
|
48
|
+
bridgeContractAddress: PublicKey,
|
|
49
|
+
settlementContractAddress: PublicKey
|
|
50
|
+
) => Promise<void>;
|
|
51
|
+
|
|
52
|
+
promisedMessagesHash: State<Field>;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const tokenBridgeRoot = new TokenBridgeTree(
|
|
56
|
+
new InMemoryMerkleTreeStorage()
|
|
57
|
+
).getRoot();
|
|
58
|
+
|
|
59
|
+
export abstract class DispatchSmartContractBase extends SmartContract {
|
|
60
|
+
public static args: {
|
|
61
|
+
methodIdMappings: RuntimeMethodIdMapping;
|
|
62
|
+
incomingMessagesPaths: Record<string, `${string}.${string}`>;
|
|
63
|
+
settlementContractClass?: TypedClass<SettlementContractType> &
|
|
64
|
+
typeof SmartContract;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
events = {
|
|
68
|
+
"token-bridge-added": TokenBridgeTreeAddition,
|
|
69
|
+
// We need a placeholder event here, so that o1js internally adds a identifier to the
|
|
70
|
+
// emitted event-fields. That will lead to the o1js API being able to distinguish the
|
|
71
|
+
// TokenBridgeEvents from the manually emitted events for the incoming messages
|
|
72
|
+
"incoming-message-placeholder": Field,
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
abstract promisedMessagesHash: State<Field>;
|
|
76
|
+
|
|
77
|
+
abstract honoredMessagesHash: State<Field>;
|
|
78
|
+
|
|
79
|
+
abstract settlementContract: State<PublicKey>;
|
|
80
|
+
|
|
81
|
+
abstract tokenBridgeRoot: State<Field>;
|
|
82
|
+
|
|
83
|
+
abstract tokenBridgeCount: State<Field>;
|
|
84
|
+
|
|
85
|
+
protected updateMessagesHashBase(
|
|
86
|
+
executedMessagesHash: Field,
|
|
87
|
+
newPromisedMessagesHash: Field
|
|
88
|
+
) {
|
|
89
|
+
const promisedMessagesHash =
|
|
90
|
+
this.promisedMessagesHash.getAndRequireEquals();
|
|
91
|
+
this.honoredMessagesHash.getAndRequireEquals();
|
|
92
|
+
|
|
93
|
+
executedMessagesHash.assertEquals(promisedMessagesHash);
|
|
94
|
+
|
|
95
|
+
this.honoredMessagesHash.set(executedMessagesHash);
|
|
96
|
+
|
|
97
|
+
// Assert and apply new promisedMessagesHash
|
|
98
|
+
this.self.account.actionState.requireEquals(newPromisedMessagesHash);
|
|
99
|
+
this.promisedMessagesHash.set(newPromisedMessagesHash);
|
|
100
|
+
|
|
101
|
+
const settlementContractAddress =
|
|
102
|
+
this.settlementContract.getAndRequireEquals();
|
|
103
|
+
const settlementContract =
|
|
104
|
+
new DispatchSmartContractBase.args.settlementContractClass!(
|
|
105
|
+
settlementContractAddress
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
settlementContract.authorizationField.requireEquals(
|
|
109
|
+
new UpdateMessagesHashAuth({
|
|
110
|
+
target: this.address,
|
|
111
|
+
executedMessagesHash,
|
|
112
|
+
newPromisedMessagesHash,
|
|
113
|
+
}).hash()
|
|
114
|
+
);
|
|
115
|
+
this.approve(settlementContract.self);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
protected initializeBase(settlementContract: PublicKey) {
|
|
119
|
+
this.promisedMessagesHash.getAndRequireEquals().assertEquals(Field(0));
|
|
120
|
+
this.honoredMessagesHash.getAndRequireEquals().assertEquals(Field(0));
|
|
121
|
+
this.settlementContract
|
|
122
|
+
.getAndRequireEquals()
|
|
123
|
+
.assertEquals(PublicKey.empty<typeof PublicKey>());
|
|
124
|
+
|
|
125
|
+
this.promisedMessagesHash.set(ACTIONS_EMPTY_HASH);
|
|
126
|
+
this.honoredMessagesHash.set(ACTIONS_EMPTY_HASH);
|
|
127
|
+
this.settlementContract.set(settlementContract);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
protected dispatchMessage<Type>(
|
|
131
|
+
methodId: Field,
|
|
132
|
+
value: Type,
|
|
133
|
+
valueType: ProvableExtended<Type>
|
|
134
|
+
) {
|
|
135
|
+
const args = valueType.toFields(value);
|
|
136
|
+
// Should be the same as RuntimeTransaction.hash
|
|
137
|
+
const argsHash = Poseidon.hash(args);
|
|
138
|
+
const runtimeTransaction = RuntimeTransaction.fromMessage({
|
|
139
|
+
methodId,
|
|
140
|
+
argsHash,
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
// Append tx to incomingMessagesHash
|
|
144
|
+
const actionData = runtimeTransaction.hashData();
|
|
145
|
+
const actionHash = MinaActions.actionHash(actionData);
|
|
146
|
+
|
|
147
|
+
this.self.body.actions = {
|
|
148
|
+
hash: actionHash,
|
|
149
|
+
data: [actionData],
|
|
150
|
+
};
|
|
151
|
+
|
|
152
|
+
// Find event index of placeholder event that we can use for manual event dispatching
|
|
153
|
+
const eventIndex = Object.keys(this.events)
|
|
154
|
+
.sort()
|
|
155
|
+
.indexOf("incoming-message-placeholder");
|
|
156
|
+
if (eventIndex === -1) {
|
|
157
|
+
throw new Error("Unknown event type for placeholder event");
|
|
158
|
+
}
|
|
159
|
+
const paddedArgs = [Field(eventIndex), ...args];
|
|
160
|
+
|
|
161
|
+
const eventHash = MinaEvents.eventHash(paddedArgs);
|
|
162
|
+
this.self.body.events = {
|
|
163
|
+
hash: eventHash,
|
|
164
|
+
data: [paddedArgs],
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
protected async enableTokenDepositsBase(
|
|
169
|
+
tokenId: Field,
|
|
170
|
+
bridgeContractAddress: PublicKey,
|
|
171
|
+
// Witness it here, since o1js doesn't fetch this state correctly since
|
|
172
|
+
// its updated in a parent AU
|
|
173
|
+
settlementContractAddress: PublicKey
|
|
174
|
+
// treeWitness: TokenBridgeTreeWitness
|
|
175
|
+
) {
|
|
176
|
+
this.settlementContract.requireEquals(settlementContractAddress);
|
|
177
|
+
const settlementContract =
|
|
178
|
+
new DispatchSmartContractBase.args.settlementContractClass!(
|
|
179
|
+
settlementContractAddress
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
// Append bridge address to the tree
|
|
183
|
+
// TODO This not concurrent and will fail if multiple users deploy bridges at the same time
|
|
184
|
+
const counter = this.tokenBridgeCount.getAndRequireEquals();
|
|
185
|
+
const root = this.tokenBridgeRoot.getAndRequireEquals();
|
|
186
|
+
|
|
187
|
+
const treeWitness = await Provable.witnessAsync(
|
|
188
|
+
TokenBridgeTreeWitness,
|
|
189
|
+
async () => {
|
|
190
|
+
const tree = await TokenBridgeTree.buildTreeFromEvents(this);
|
|
191
|
+
return tree.getWitness(counter.toBigInt());
|
|
192
|
+
}
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
Provable.log(root);
|
|
196
|
+
treeWitness
|
|
197
|
+
.checkMembership(root, counter, Field(0))
|
|
198
|
+
.assertTrue("Bridge Tree Witness not valid");
|
|
199
|
+
|
|
200
|
+
const entry = new TokenBridgeEntry({
|
|
201
|
+
tokenId,
|
|
202
|
+
address: bridgeContractAddress,
|
|
203
|
+
});
|
|
204
|
+
const newRoot = treeWitness.calculateRoot(entry.hash());
|
|
205
|
+
this.tokenBridgeRoot.set(newRoot);
|
|
206
|
+
this.tokenBridgeCount.set(counter.add(1));
|
|
207
|
+
|
|
208
|
+
this.emitEvent(
|
|
209
|
+
"token-bridge-added",
|
|
210
|
+
new TokenBridgeTreeAddition({
|
|
211
|
+
index: counter,
|
|
212
|
+
value: entry,
|
|
213
|
+
})
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
// Authenticate call via callback
|
|
217
|
+
settlementContract.authorizationField.requireEquals(
|
|
218
|
+
new TokenBridgeDeploymentAuth({
|
|
219
|
+
target: this.address,
|
|
220
|
+
tokenId,
|
|
221
|
+
address: bridgeContractAddress,
|
|
222
|
+
}).hash()
|
|
223
|
+
);
|
|
224
|
+
|
|
225
|
+
this.approve(settlementContract.self);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export class DispatchSmartContract
|
|
230
|
+
extends DispatchSmartContractBase
|
|
231
|
+
implements DispatchContractType
|
|
232
|
+
{
|
|
233
|
+
@state(Field) public promisedMessagesHash = State<Field>();
|
|
234
|
+
|
|
235
|
+
@state(Field) public honoredMessagesHash = State<Field>();
|
|
236
|
+
|
|
237
|
+
@state(PublicKey) public settlementContract = State<PublicKey>();
|
|
238
|
+
|
|
239
|
+
@state(Field) public tokenBridgeRoot = State<Field>(tokenBridgeRoot);
|
|
240
|
+
|
|
241
|
+
@state(Field) public tokenBridgeCount = State<Field>();
|
|
242
|
+
|
|
243
|
+
@method
|
|
244
|
+
public async enableTokenDeposits(
|
|
245
|
+
tokenId: Field,
|
|
246
|
+
bridgeContractAddress: PublicKey,
|
|
247
|
+
settlementContractAddress: PublicKey
|
|
248
|
+
) {
|
|
249
|
+
await this.enableTokenDepositsBase(
|
|
250
|
+
tokenId,
|
|
251
|
+
bridgeContractAddress,
|
|
252
|
+
settlementContractAddress
|
|
253
|
+
);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
@method
|
|
257
|
+
public async updateMessagesHash(
|
|
258
|
+
executedMessagesHash: Field,
|
|
259
|
+
newPromisedMessagesHash: Field
|
|
260
|
+
) {
|
|
261
|
+
return this.updateMessagesHashBase(
|
|
262
|
+
executedMessagesHash,
|
|
263
|
+
newPromisedMessagesHash
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
@method
|
|
268
|
+
public async initialize(settlementContract: PublicKey) {
|
|
269
|
+
return this.initializeBase(settlementContract);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
@method
|
|
273
|
+
public async deposit(
|
|
274
|
+
amount: UInt64,
|
|
275
|
+
tokenId: Field,
|
|
276
|
+
bridgingContract: PublicKey,
|
|
277
|
+
bridgingContractAttestation: TokenBridgeAttestation,
|
|
278
|
+
l2Receiver: PublicKey
|
|
279
|
+
) {
|
|
280
|
+
const childrenMayUseToken: AccountUpdate["body"]["mayUseToken"] = {
|
|
281
|
+
parentsOwnToken: Bool(false),
|
|
282
|
+
// MayUseToken has to be set only for custom tokens
|
|
283
|
+
inheritFromParent: tokenId.equals(TokenId.default).not(),
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
// Check that the bridgingContract parameter is valid => is in the offchain tree
|
|
287
|
+
const bridgeTreeRoot = this.tokenBridgeRoot.getAndRequireEquals();
|
|
288
|
+
const entry = new TokenBridgeEntry({
|
|
289
|
+
tokenId,
|
|
290
|
+
address: bridgingContract,
|
|
291
|
+
});
|
|
292
|
+
|
|
293
|
+
bridgingContractAttestation.witness
|
|
294
|
+
.checkMembership(
|
|
295
|
+
bridgeTreeRoot,
|
|
296
|
+
bridgingContractAttestation.index,
|
|
297
|
+
entry.hash()
|
|
298
|
+
)
|
|
299
|
+
.assertTrue("Bridging Contract Attestation not valid");
|
|
300
|
+
|
|
301
|
+
// Credit the amount to the settlement contract
|
|
302
|
+
const balanceAU = AccountUpdate.create(bridgingContract, tokenId);
|
|
303
|
+
balanceAU.balance.addInPlace(amount);
|
|
304
|
+
balanceAU.body.mayUseToken = childrenMayUseToken;
|
|
305
|
+
this.approve(balanceAU);
|
|
306
|
+
|
|
307
|
+
const action = new Deposit({
|
|
308
|
+
tokenId,
|
|
309
|
+
address: l2Receiver,
|
|
310
|
+
amount,
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
const { methodIdMappings, incomingMessagesPaths } =
|
|
314
|
+
DispatchSmartContractBase.args;
|
|
315
|
+
|
|
316
|
+
const methodId = Field(
|
|
317
|
+
methodIdMappings[incomingMessagesPaths.deposit].methodId
|
|
318
|
+
).toConstant();
|
|
319
|
+
this.dispatchMessage(methodId.toConstant(), action, Deposit);
|
|
320
|
+
|
|
321
|
+
this.self.body.mayUseToken = {
|
|
322
|
+
parentsOwnToken: tokenId.equals(TokenId.default).not(),
|
|
323
|
+
inheritFromParent: Bool(false),
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
}
|