@proto-kit/protocol 0.1.1-develop.153

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.
Files changed (150) hide show
  1. package/LICENSE.md +201 -0
  2. package/README.md +45 -0
  3. package/dist/Constants.d.ts +4 -0
  4. package/dist/Constants.d.ts.map +1 -0
  5. package/dist/Constants.js +3 -0
  6. package/dist/config/ConfigurableModule.d.ts +18 -0
  7. package/dist/config/ConfigurableModule.d.ts.map +1 -0
  8. package/dist/config/ConfigurableModule.js +20 -0
  9. package/dist/config/ConfigurationAggregator.d.ts +10 -0
  10. package/dist/config/ConfigurationAggregator.d.ts.map +1 -0
  11. package/dist/config/ConfigurationAggregator.js +35 -0
  12. package/dist/config/ConfigurationReceiver.d.ts +25 -0
  13. package/dist/config/ConfigurationReceiver.d.ts.map +1 -0
  14. package/dist/config/ConfigurationReceiver.js +36 -0
  15. package/dist/config/ModuleContainer.d.ts +44 -0
  16. package/dist/config/ModuleContainer.d.ts.map +1 -0
  17. package/dist/config/ModuleContainer.js +89 -0
  18. package/dist/config/types.d.ts +2 -0
  19. package/dist/config/types.d.ts.map +1 -0
  20. package/dist/config/types.js +1 -0
  21. package/dist/index.d.ts +24 -0
  22. package/dist/index.d.ts.map +1 -0
  23. package/dist/index.js +23 -0
  24. package/dist/model/MethodPublicInput.d.ts +51 -0
  25. package/dist/model/MethodPublicInput.d.ts.map +1 -0
  26. package/dist/model/MethodPublicInput.js +11 -0
  27. package/dist/model/MethodPublicOutput.d.ts +59 -0
  28. package/dist/model/MethodPublicOutput.d.ts.map +1 -0
  29. package/dist/model/MethodPublicOutput.js +12 -0
  30. package/dist/model/Option.d.ts +94 -0
  31. package/dist/model/Option.d.ts.map +1 -0
  32. package/dist/model/Option.js +96 -0
  33. package/dist/model/Path.d.ts +31 -0
  34. package/dist/model/Path.d.ts.map +1 -0
  35. package/dist/model/Path.js +44 -0
  36. package/dist/model/StateTransition.d.ts +85 -0
  37. package/dist/model/StateTransition.d.ts.map +1 -0
  38. package/dist/model/StateTransition.js +58 -0
  39. package/dist/model/StateTransitionProvableBatch.d.ts +57 -0
  40. package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -0
  41. package/dist/model/StateTransitionProvableBatch.js +21 -0
  42. package/dist/model/network/NetworkState.d.ts +64 -0
  43. package/dist/model/network/NetworkState.d.ts.map +1 -0
  44. package/dist/model/network/NetworkState.js +14 -0
  45. package/dist/model/transaction/ProtocolTransaction.d.ts +70 -0
  46. package/dist/model/transaction/ProtocolTransaction.d.ts.map +1 -0
  47. package/dist/model/transaction/ProtocolTransaction.js +18 -0
  48. package/dist/model/transaction/RuntimeTransaction.d.ts +55 -0
  49. package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -0
  50. package/dist/model/transaction/RuntimeTransaction.js +26 -0
  51. package/dist/protocol/Protocol.d.ts +37 -0
  52. package/dist/protocol/Protocol.d.ts.map +1 -0
  53. package/dist/protocol/Protocol.js +50 -0
  54. package/dist/protocol/ProtocolModule.d.ts +9 -0
  55. package/dist/protocol/ProtocolModule.d.ts.map +1 -0
  56. package/dist/protocol/ProtocolModule.js +10 -0
  57. package/dist/prover/block/BlockProvable.d.ts +149 -0
  58. package/dist/prover/block/BlockProvable.d.ts.map +1 -0
  59. package/dist/prover/block/BlockProvable.js +20 -0
  60. package/dist/prover/block/BlockProver.d.ts +48 -0
  61. package/dist/prover/block/BlockProver.d.ts.map +1 -0
  62. package/dist/prover/block/BlockProver.js +171 -0
  63. package/dist/prover/block/BlockScopedModule.d.ts +3 -0
  64. package/dist/prover/block/BlockScopedModule.d.ts.map +1 -0
  65. package/dist/prover/block/BlockScopedModule.js +6 -0
  66. package/dist/prover/statetransition/StateTransitionProvable.d.ts +84 -0
  67. package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -0
  68. package/dist/prover/statetransition/StateTransitionProvable.js +11 -0
  69. package/dist/prover/statetransition/StateTransitionProver.d.ts +39 -0
  70. package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -0
  71. package/dist/prover/statetransition/StateTransitionProver.js +157 -0
  72. package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts +16 -0
  73. package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts.map +1 -0
  74. package/dist/prover/statetransition/StateTransitionWitnessProvider.js +17 -0
  75. package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts +7 -0
  76. package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts.map +1 -0
  77. package/dist/prover/statetransition/StateTransitionWitnessProviderReference.js +20 -0
  78. package/dist/src/model/Option.d.ts +158 -0
  79. package/dist/src/model/Option.d.ts.map +1 -0
  80. package/dist/src/model/Option.js +53 -0
  81. package/dist/src/model/Path.d.ts +35 -0
  82. package/dist/src/model/Path.d.ts.map +1 -0
  83. package/dist/src/model/Path.js +51 -0
  84. package/dist/src/model/StateTransition.d.ts +201 -0
  85. package/dist/src/model/StateTransition.d.ts.map +1 -0
  86. package/dist/src/model/StateTransition.js +43 -0
  87. package/dist/src/utils/PrefixedHashList.d.ts +15 -0
  88. package/dist/src/utils/PrefixedHashList.d.ts.map +1 -0
  89. package/dist/src/utils/PrefixedHashList.js +28 -0
  90. package/dist/src/utils/ProvableHashList.d.ts +30 -0
  91. package/dist/src/utils/ProvableHashList.d.ts.map +1 -0
  92. package/dist/src/utils/ProvableHashList.js +43 -0
  93. package/dist/utils/PrefixedHashList.d.ts +14 -0
  94. package/dist/utils/PrefixedHashList.d.ts.map +1 -0
  95. package/dist/utils/PrefixedHashList.js +12 -0
  96. package/dist/utils/PrefixedProvableHashList.d.ts +8 -0
  97. package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -0
  98. package/dist/utils/PrefixedProvableHashList.js +12 -0
  99. package/dist/utils/ProvableHashList.d.ts +27 -0
  100. package/dist/utils/ProvableHashList.d.ts.map +1 -0
  101. package/dist/utils/ProvableHashList.js +43 -0
  102. package/dist/utils/Utils.d.ts +17 -0
  103. package/dist/utils/Utils.d.ts.map +1 -0
  104. package/dist/utils/Utils.js +63 -0
  105. package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts +25 -0
  106. package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts.map +1 -0
  107. package/dist/utils/merkletree/InMemoryMerkleTreeStorage.js +72 -0
  108. package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts +26 -0
  109. package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts.map +1 -0
  110. package/dist/utils/merkletree/MemoryMerkleTreeStorage.js +79 -0
  111. package/dist/utils/merkletree/MerkleTreeStore.d.ts +11 -0
  112. package/dist/utils/merkletree/MerkleTreeStore.d.ts.map +1 -0
  113. package/dist/utils/merkletree/MerkleTreeStore.js +1 -0
  114. package/dist/utils/merkletree/RollupMerkleTree.d.ts +130 -0
  115. package/dist/utils/merkletree/RollupMerkleTree.d.ts.map +1 -0
  116. package/dist/utils/merkletree/RollupMerkleTree.js +244 -0
  117. package/jest.config.cjs +1 -0
  118. package/package.json +35 -0
  119. package/src/Constants.ts +3 -0
  120. package/src/index.ts +23 -0
  121. package/src/model/MethodPublicOutput.ts +12 -0
  122. package/src/model/Option.test.ts +21 -0
  123. package/src/model/Option.ts +133 -0
  124. package/src/model/Path.ts +52 -0
  125. package/src/model/StateTransition.ts +72 -0
  126. package/src/model/StateTransitionProvableBatch.ts +31 -0
  127. package/src/model/Transaction.ts +29 -0
  128. package/src/model/network/NetworkState.ts +15 -0
  129. package/src/model/transaction/ProtocolTransaction.ts +25 -0
  130. package/src/model/transaction/RuntimeTransaction.ts +34 -0
  131. package/src/protocol/Protocol.ts +129 -0
  132. package/src/protocol/ProtocolModule.ts +27 -0
  133. package/src/prover/block/BlockProvable.ts +45 -0
  134. package/src/prover/block/BlockProver.ts +302 -0
  135. package/src/prover/statetransition/StateTransitionProvable.ts +40 -0
  136. package/src/prover/statetransition/StateTransitionProver.ts +270 -0
  137. package/src/prover/statetransition/StateTransitionWitnessProvider.ts +24 -0
  138. package/src/prover/statetransition/StateTransitionWitnessProviderReference.ts +17 -0
  139. package/src/utils/PrefixedProvableHashList.ts +21 -0
  140. package/src/utils/ProvableHashList.ts +50 -0
  141. package/src/utils/merkletree/InMemoryMerkleTreeStorage.ts +99 -0
  142. package/src/utils/merkletree/MerkleTreeStore.ts +15 -0
  143. package/src/utils/merkletree/RollupMerkleTree.ts +250 -0
  144. package/src/utils/merkletree/VirtualMerkleTreeStore.ts +21 -0
  145. package/src/utils/utils.ts +103 -0
  146. package/test/BlockProver.test.ts +127 -0
  147. package/test/Protocol.test.ts +27 -0
  148. package/test/StateTransition.test.ts +182 -0
  149. package/tsconfig.json +8 -0
  150. package/tsconfig.test.json +9 -0
@@ -0,0 +1,64 @@
1
+ import { Field, UInt64 } from "snarkyjs";
2
+ declare const CurrentBlock_base: (new (value: {
3
+ height: UInt64;
4
+ }) => {
5
+ height: UInt64;
6
+ }) & {
7
+ _isStruct: true;
8
+ } & import("snarkyjs/dist/node/snarky").ProvablePure<{
9
+ height: UInt64;
10
+ }> & {
11
+ toInput: (x: {
12
+ height: UInt64;
13
+ }) => {
14
+ fields?: import("snarkyjs/dist/node/lib/field").Field[] | undefined;
15
+ packed?: [import("snarkyjs/dist/node/lib/field").Field, number][] | undefined;
16
+ };
17
+ toJSON: (x: {
18
+ height: UInt64;
19
+ }) => {
20
+ height: string;
21
+ };
22
+ fromJSON: (x: {
23
+ height: string;
24
+ }) => {
25
+ height: UInt64;
26
+ };
27
+ };
28
+ export declare class CurrentBlock extends CurrentBlock_base {
29
+ }
30
+ declare const NetworkState_base: (new (value: {
31
+ block: CurrentBlock;
32
+ }) => {
33
+ block: CurrentBlock;
34
+ }) & {
35
+ _isStruct: true;
36
+ } & import("snarkyjs/dist/node/snarky").ProvablePure<{
37
+ block: CurrentBlock;
38
+ }> & {
39
+ toInput: (x: {
40
+ block: CurrentBlock;
41
+ }) => {
42
+ fields?: import("snarkyjs/dist/node/lib/field").Field[] | undefined;
43
+ packed?: [import("snarkyjs/dist/node/lib/field").Field, number][] | undefined;
44
+ };
45
+ toJSON: (x: {
46
+ block: CurrentBlock;
47
+ }) => {
48
+ block: {
49
+ height: string;
50
+ };
51
+ };
52
+ fromJSON: (x: {
53
+ block: {
54
+ height: string;
55
+ };
56
+ }) => {
57
+ block: CurrentBlock;
58
+ };
59
+ };
60
+ export declare class NetworkState extends NetworkState_base {
61
+ hash(): Field;
62
+ }
63
+ export {};
64
+ //# sourceMappingURL=NetworkState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NetworkState.d.ts","sourceRoot":"","sources":["../../../src/model/network/NetworkState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAoB,MAAM,EAAE,MAAM,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE3D,qBAAa,YAAa,SAAQ,iBAEhC;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,YAAa,SAAQ,iBAEhC;IACO,IAAI,IAAI,KAAK;CAKrB"}
@@ -0,0 +1,14 @@
1
+ import { Poseidon, Struct, UInt64 } from "snarkyjs";
2
+ export class CurrentBlock extends Struct({
3
+ height: UInt64,
4
+ }) {
5
+ }
6
+ export class NetworkState extends Struct({
7
+ block: CurrentBlock,
8
+ }) {
9
+ hash() {
10
+ return Poseidon.hash([
11
+ ...CurrentBlock.toFields(this.block)
12
+ ]);
13
+ }
14
+ }
@@ -0,0 +1,70 @@
1
+ import { Bool, Field, PublicKey, Signature, UInt64 } from "snarkyjs";
2
+ declare const ProtocolTransaction_base: (new (value: {
3
+ methodId: import("snarkyjs/dist/node/lib/field").Field;
4
+ nonce: UInt64;
5
+ sender: PublicKey;
6
+ argsHash: import("snarkyjs/dist/node/lib/field").Field;
7
+ signature: Signature;
8
+ }) => {
9
+ methodId: import("snarkyjs/dist/node/lib/field").Field;
10
+ nonce: UInt64;
11
+ sender: PublicKey;
12
+ argsHash: import("snarkyjs/dist/node/lib/field").Field;
13
+ signature: Signature;
14
+ }) & {
15
+ _isStruct: true;
16
+ } & import("snarkyjs/dist/node/snarky").ProvablePure<{
17
+ methodId: import("snarkyjs/dist/node/lib/field").Field;
18
+ nonce: UInt64;
19
+ sender: PublicKey;
20
+ argsHash: import("snarkyjs/dist/node/lib/field").Field;
21
+ signature: Signature;
22
+ }> & {
23
+ toInput: (x: {
24
+ methodId: import("snarkyjs/dist/node/lib/field").Field;
25
+ nonce: UInt64;
26
+ sender: PublicKey;
27
+ argsHash: import("snarkyjs/dist/node/lib/field").Field;
28
+ signature: Signature;
29
+ }) => {
30
+ fields?: import("snarkyjs/dist/node/lib/field").Field[] | undefined;
31
+ packed?: [import("snarkyjs/dist/node/lib/field").Field, number][] | undefined;
32
+ };
33
+ toJSON: (x: {
34
+ methodId: import("snarkyjs/dist/node/lib/field").Field;
35
+ nonce: UInt64;
36
+ sender: PublicKey;
37
+ argsHash: import("snarkyjs/dist/node/lib/field").Field;
38
+ signature: Signature;
39
+ }) => {
40
+ methodId: string;
41
+ nonce: string;
42
+ sender: string;
43
+ argsHash: string;
44
+ signature: any;
45
+ };
46
+ fromJSON: (x: {
47
+ methodId: string;
48
+ nonce: string;
49
+ sender: string;
50
+ argsHash: string;
51
+ signature: any;
52
+ }) => {
53
+ methodId: import("snarkyjs/dist/node/lib/field").Field;
54
+ nonce: UInt64;
55
+ sender: PublicKey;
56
+ argsHash: import("snarkyjs/dist/node/lib/field").Field;
57
+ signature: Signature;
58
+ };
59
+ };
60
+ export declare class ProtocolTransaction extends ProtocolTransaction_base {
61
+ static getSignatureData(args: {
62
+ methodId: Field;
63
+ nonce: UInt64;
64
+ argsHash: Field;
65
+ }): Field[];
66
+ getSignatureData(): Field[];
67
+ validateSignature(): Bool;
68
+ }
69
+ export {};
70
+ //# sourceMappingURL=ProtocolTransaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProtocolTransaction.d.ts","sourceRoot":"","sources":["../../../src/model/transaction/ProtocolTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAU,MAAM,EAAE,MAAM,UAAU,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE7E,qBAAa,mBAAoB,SAAQ,wBAMvC;WACc,gBAAgB,CAAC,IAAI,EAAE;QACnC,QAAQ,EAAE,KAAK,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,KAAK,CAAC;KACjB,GAAG,KAAK,EAAE;IAIJ,gBAAgB,IAAI,KAAK,EAAE;IAI3B,iBAAiB,IAAI,IAAI;CAGjC"}
@@ -0,0 +1,18 @@
1
+ import { Field, PublicKey, Signature, Struct, UInt64 } from "snarkyjs";
2
+ export class ProtocolTransaction extends Struct({
3
+ methodId: Field,
4
+ nonce: UInt64,
5
+ sender: PublicKey,
6
+ argsHash: Field,
7
+ signature: Signature,
8
+ }) {
9
+ static getSignatureData(args) {
10
+ return [args.methodId, ...args.nonce.toFields(), args.argsHash];
11
+ }
12
+ getSignatureData() {
13
+ return ProtocolTransaction.getSignatureData(this);
14
+ }
15
+ validateSignature() {
16
+ return this.signature.verify(this.sender, this.getSignatureData());
17
+ }
18
+ }
@@ -0,0 +1,55 @@
1
+ import { Field, PublicKey, UInt64 } from "snarkyjs";
2
+ import { ProtocolTransaction } from "./ProtocolTransaction";
3
+ declare const RuntimeTransaction_base: (new (value: {
4
+ nonce: UInt64;
5
+ sender: PublicKey;
6
+ argsHash: import("snarkyjs/dist/node/lib/field").Field;
7
+ }) => {
8
+ nonce: UInt64;
9
+ sender: PublicKey;
10
+ argsHash: import("snarkyjs/dist/node/lib/field").Field;
11
+ }) & {
12
+ _isStruct: true;
13
+ } & import("snarkyjs/dist/node/snarky").ProvablePure<{
14
+ nonce: UInt64;
15
+ sender: PublicKey;
16
+ argsHash: import("snarkyjs/dist/node/lib/field").Field;
17
+ }> & {
18
+ toInput: (x: {
19
+ nonce: UInt64;
20
+ sender: PublicKey;
21
+ argsHash: import("snarkyjs/dist/node/lib/field").Field;
22
+ }) => {
23
+ fields?: import("snarkyjs/dist/node/lib/field").Field[] | undefined;
24
+ packed?: [import("snarkyjs/dist/node/lib/field").Field, number][] | undefined;
25
+ };
26
+ toJSON: (x: {
27
+ nonce: UInt64;
28
+ sender: PublicKey;
29
+ argsHash: import("snarkyjs/dist/node/lib/field").Field;
30
+ }) => {
31
+ nonce: string;
32
+ sender: string;
33
+ argsHash: string;
34
+ };
35
+ fromJSON: (x: {
36
+ nonce: string;
37
+ sender: string;
38
+ argsHash: string;
39
+ }) => {
40
+ nonce: UInt64;
41
+ sender: PublicKey;
42
+ argsHash: import("snarkyjs/dist/node/lib/field").Field;
43
+ };
44
+ };
45
+ /**
46
+ * This struct is used to expose transaction information to the runtime method
47
+ * execution. This class has not all data included in transactions on purpose.
48
+ * For example, we don't want to expose the signature or args as fields.
49
+ */
50
+ export declare class RuntimeTransaction extends RuntimeTransaction_base {
51
+ static fromProtocolTransaction({ nonce, sender, argsHash, }: ProtocolTransaction): RuntimeTransaction;
52
+ hash(): Field;
53
+ }
54
+ export {};
55
+ //# sourceMappingURL=RuntimeTransaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuntimeTransaction.d.ts","sourceRoot":"","sources":["../../../src/model/transaction/RuntimeTransaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAY,SAAS,EAAU,MAAM,EAAE,MAAM,UAAU,CAAC;AAEtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAE5D;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,uBAItC;WACc,uBAAuB,CAAC,EACpC,KAAK,EACL,MAAM,EACN,QAAQ,GACT,EAAE,mBAAmB,GAAG,kBAAkB;IAQpC,IAAI,IAAI,KAAK;CAOrB"}
@@ -0,0 +1,26 @@
1
+ import { Field, Poseidon, PublicKey, Struct, UInt64 } from "snarkyjs";
2
+ /**
3
+ * This struct is used to expose transaction information to the runtime method
4
+ * execution. This class has not all data included in transactions on purpose.
5
+ * For example, we don't want to expose the signature or args as fields.
6
+ */
7
+ export class RuntimeTransaction extends Struct({
8
+ nonce: UInt64,
9
+ sender: PublicKey,
10
+ argsHash: Field,
11
+ }) {
12
+ static fromProtocolTransaction({ nonce, sender, argsHash, }) {
13
+ return new RuntimeTransaction({
14
+ nonce,
15
+ sender,
16
+ argsHash,
17
+ });
18
+ }
19
+ hash() {
20
+ return Poseidon.hash([
21
+ ...this.nonce.toFields(),
22
+ ...this.sender.toFields(),
23
+ this.argsHash,
24
+ ]);
25
+ }
26
+ }
@@ -0,0 +1,37 @@
1
+ import { ModuleContainer, ModulesRecord, StringKeyOf, TypedClass } from "@proto-kit/common";
2
+ import { DependencyContainer } from "tsyringe";
3
+ import { BlockProvable, BlockProverPublicInput, BlockProverPublicOutput } from "../prover/block/BlockProvable";
4
+ import { StateTransitionProver } from "../prover/statetransition/StateTransitionProver";
5
+ import { StateTransitionProvable, StateTransitionProverPublicInput, StateTransitionProverPublicOutput } from "../prover/statetransition/StateTransitionProvable";
6
+ import { BlockProver } from "../prover/block/BlockProver";
7
+ import { ProtocolModule } from "./ProtocolModule";
8
+ export type GenericProtocolModuleRecord = ModulesRecord<TypedClass<ProtocolModule<any, any>>>;
9
+ interface BlockProverType extends ProtocolModule<BlockProverPublicInput, BlockProverPublicOutput>, BlockProvable {
10
+ }
11
+ interface StateTransitionProverType extends ProtocolModule<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>, StateTransitionProvable {
12
+ }
13
+ export interface ProtocolCustomModulesRecord {
14
+ BlockProver: TypedClass<BlockProverType>;
15
+ StateTransitionProver: TypedClass<StateTransitionProverType>;
16
+ }
17
+ export interface ProtocolModulesRecord extends GenericProtocolModuleRecord, ProtocolCustomModulesRecord {
18
+ }
19
+ export interface ProtocolDefinition<Modules extends ProtocolModulesRecord> {
20
+ modules: Modules;
21
+ }
22
+ export declare class Protocol<Modules extends ProtocolModulesRecord> extends ModuleContainer<Modules> {
23
+ static from<Modules extends ProtocolModulesRecord>(modules: ProtocolDefinition<Modules>): Protocol<Modules>;
24
+ protected decorateModule(moduleName: StringKeyOf<Modules>, containedModule: InstanceType<Modules[StringKeyOf<Modules>]>): void;
25
+ get dependencyContainer(): DependencyContainer;
26
+ private isModule;
27
+ get blockProver(): BlockProvable;
28
+ get stateTransitionProver(): StateTransitionProvable;
29
+ }
30
+ export declare const VanillaProtocol: {
31
+ create(): Protocol<{
32
+ StateTransitionProver: typeof StateTransitionProver;
33
+ BlockProver: typeof BlockProver;
34
+ }>;
35
+ };
36
+ export {};
37
+ //# sourceMappingURL=Protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Protocol.d.ts","sourceRoot":"","sources":["../../src/protocol/Protocol.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,eAAe,EAEf,aAAa,EACb,WAAW,EACX,UAAU,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAE/C,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,iDAAiD,CAAC;AACxF,OAAO,EACL,uBAAuB,EACvB,gCAAgC,EAChC,iCAAiC,EAClC,MAAM,mDAAmD,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,MAAM,MAAM,2BAA2B,GAAG,aAAa,CACrD,UAAU,CAAC,cAAc,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CACrC,CAAC;AAEF,UAAU,eACR,SAAQ,cAAc,CAAC,sBAAsB,EAAE,uBAAuB,CAAC,EACrE,aAAa;CAAG;AAEpB,UAAU,yBACR,SAAQ,cAAc,CAClB,gCAAgC,EAChC,iCAAiC,CAClC,EACD,uBAAuB;CAAG;AAE9B,MAAM,WAAW,2BAA2B;IAC1C,WAAW,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;IACzC,qBAAqB,EAAE,UAAU,CAAC,yBAAyB,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,qBACf,SAAQ,2BAA2B,EACjC,2BAA2B;CAAG;AAElC,MAAM,WAAW,kBAAkB,CAAC,OAAO,SAAS,qBAAqB;IACvE,OAAO,EAAE,OAAO,CAAC;CAElB;AAED,qBAAa,QAAQ,CACnB,OAAO,SAAS,qBAAqB,CACrC,SAAQ,eAAe,CAAC,OAAO,CAAC;WAElB,IAAI,CAAC,OAAO,SAAS,qBAAqB,EACtD,OAAO,EAAE,kBAAkB,CAAC,OAAO,CAAC;IAsBtC,SAAS,CAAC,cAAc,CACtB,UAAU,EAAE,WAAW,CAAC,OAAO,CAAC,EAChC,eAAe,EAAE,YAAY,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAQ9D,IAAW,mBAAmB,IAAI,mBAAmB,CAEpD;IAED,OAAO,CAAC,QAAQ;IAMhB,IAAW,WAAW,IAAI,aAAa,CAMtC;IAED,IAAW,qBAAqB,IAAI,uBAAuB,CAI1D;CACF;AAED,eAAO,MAAM,eAAe;cAChB,SAAS;QACjB,uBAAuB,4BAA4B,CAAC;QACpD,aAAa,kBAAkB,CAAC;KACjC,CAAC;CAQH,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { log, ModuleContainer, } from "@proto-kit/common";
2
+ import { StateTransitionProver } from "../prover/statetransition/StateTransitionProver";
3
+ import { BlockProver } from "../prover/block/BlockProver";
4
+ export class Protocol extends ModuleContainer {
5
+ // .from() to create Protocol
6
+ static from(modules) {
7
+ const protocol = new Protocol(modules);
8
+ // Set empty config for all modules, since we don't have that feature yet
9
+ // eslint-disable-next-line max-len
10
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-assignment
11
+ const emptyConfig = Object.keys(modules.modules).reduce((agg, item) => {
12
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
13
+ agg[item] = {};
14
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-return
15
+ return agg;
16
+ }, {});
17
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
18
+ protocol.configure(emptyConfig);
19
+ return protocol;
20
+ }
21
+ decorateModule(moduleName, containedModule) {
22
+ log.debug(`Decorated ${moduleName}`);
23
+ containedModule.protocol = this;
24
+ super.decorateModule(moduleName, containedModule);
25
+ }
26
+ get dependencyContainer() {
27
+ return this.container;
28
+ }
29
+ isModule(moduleName) {
30
+ return this.definition.modules[moduleName] !== undefined;
31
+ }
32
+ get blockProver() {
33
+ // Why do I resolve directly here?
34
+ // I don't know exactly but generics don't let me use .resolve()
35
+ return this.container.resolve("BlockProver");
36
+ }
37
+ get stateTransitionProver() {
38
+ return this.container.resolve("StateTransitionProver");
39
+ }
40
+ }
41
+ export const VanillaProtocol = {
42
+ create() {
43
+ return Protocol.from({
44
+ modules: {
45
+ StateTransitionProver,
46
+ BlockProver,
47
+ },
48
+ });
49
+ },
50
+ };
@@ -0,0 +1,9 @@
1
+ import { AreProofsEnabled, Configurable, ZkProgrammable } from "@proto-kit/common";
2
+ import type { Protocol, ProtocolModulesRecord } from "./Protocol";
3
+ export declare abstract class ProtocolModule<PublicInput, PublicOutput> extends ZkProgrammable<PublicInput, PublicOutput> implements Configurable<unknown> {
4
+ config: {};
5
+ protocol?: Protocol<ProtocolModulesRecord>;
6
+ get appChain(): AreProofsEnabled | undefined;
7
+ constructor();
8
+ }
9
+ //# sourceMappingURL=ProtocolModule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProtocolModule.d.ts","sourceRoot":"","sources":["../../src/protocol/ProtocolModule.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACf,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAGlE,8BAAsB,cAAc,CAAC,WAAW,EAAE,YAAY,CAC5D,SAAQ,cAAc,CAAC,WAAW,EAAE,YAAY,CAChD,YAAW,YAAY,CAAC,OAAO,CAAC;IAEzB,MAAM,KAAM;IAEZ,QAAQ,CAAC,EAAE,QAAQ,CAAC,qBAAqB,CAAC,CAAC;IAElD,IAAW,QAAQ,IAAI,gBAAgB,GAAG,SAAS,CAIlD;;CAKF"}
@@ -0,0 +1,10 @@
1
+ import { ZkProgrammable, } from "@proto-kit/common";
2
+ export class ProtocolModule extends ZkProgrammable {
3
+ get appChain() {
4
+ return this.protocol?.dependencyContainer.resolve("AppChain");
5
+ }
6
+ constructor() {
7
+ super();
8
+ this.config = {};
9
+ }
10
+ }
@@ -0,0 +1,149 @@
1
+ import { Proof } from "snarkyjs";
2
+ import { StateTransitionProof } from "../statetransition/StateTransitionProvable";
3
+ import { MethodPublicOutput } from "../../model/MethodPublicOutput";
4
+ import { ZkProgrammable } from "@proto-kit/common";
5
+ import { ProtocolTransaction } from "../../model/transaction/ProtocolTransaction";
6
+ import { NetworkState } from "../../model/network/NetworkState";
7
+ declare const BlockProverPublicInput_base: (new (value: {
8
+ transactionsHash: import("snarkyjs/dist/node/lib/field").Field;
9
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
10
+ networkStateHash: import("snarkyjs/dist/node/lib/field").Field;
11
+ }) => {
12
+ transactionsHash: import("snarkyjs/dist/node/lib/field").Field;
13
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
14
+ networkStateHash: import("snarkyjs/dist/node/lib/field").Field;
15
+ }) & {
16
+ _isStruct: true;
17
+ } & import("snarkyjs/dist/node/snarky").ProvablePure<{
18
+ transactionsHash: import("snarkyjs/dist/node/lib/field").Field;
19
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
20
+ networkStateHash: import("snarkyjs/dist/node/lib/field").Field;
21
+ }> & {
22
+ toInput: (x: {
23
+ transactionsHash: import("snarkyjs/dist/node/lib/field").Field;
24
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
25
+ networkStateHash: import("snarkyjs/dist/node/lib/field").Field;
26
+ }) => {
27
+ fields?: import("snarkyjs/dist/node/lib/field").Field[] | undefined;
28
+ packed?: [import("snarkyjs/dist/node/lib/field").Field, number][] | undefined;
29
+ };
30
+ toJSON: (x: {
31
+ transactionsHash: import("snarkyjs/dist/node/lib/field").Field;
32
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
33
+ networkStateHash: import("snarkyjs/dist/node/lib/field").Field;
34
+ }) => {
35
+ transactionsHash: string;
36
+ stateRoot: string;
37
+ networkStateHash: string;
38
+ };
39
+ fromJSON: (x: {
40
+ transactionsHash: string;
41
+ stateRoot: string;
42
+ networkStateHash: string;
43
+ }) => {
44
+ transactionsHash: import("snarkyjs/dist/node/lib/field").Field;
45
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
46
+ networkStateHash: import("snarkyjs/dist/node/lib/field").Field;
47
+ };
48
+ };
49
+ export declare class BlockProverPublicInput extends BlockProverPublicInput_base {
50
+ }
51
+ declare const BlockProverPublicOutput_base: (new (value: {
52
+ transactionsHash: import("snarkyjs/dist/node/lib/field").Field;
53
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
54
+ }) => {
55
+ transactionsHash: import("snarkyjs/dist/node/lib/field").Field;
56
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
57
+ }) & {
58
+ _isStruct: true;
59
+ } & import("snarkyjs/dist/node/snarky").ProvablePure<{
60
+ transactionsHash: import("snarkyjs/dist/node/lib/field").Field;
61
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
62
+ }> & {
63
+ toInput: (x: {
64
+ transactionsHash: import("snarkyjs/dist/node/lib/field").Field;
65
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
66
+ }) => {
67
+ fields?: import("snarkyjs/dist/node/lib/field").Field[] | undefined;
68
+ packed?: [import("snarkyjs/dist/node/lib/field").Field, number][] | undefined;
69
+ };
70
+ toJSON: (x: {
71
+ transactionsHash: import("snarkyjs/dist/node/lib/field").Field;
72
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
73
+ }) => {
74
+ transactionsHash: string;
75
+ stateRoot: string;
76
+ };
77
+ fromJSON: (x: {
78
+ transactionsHash: string;
79
+ stateRoot: string;
80
+ }) => {
81
+ transactionsHash: import("snarkyjs/dist/node/lib/field").Field;
82
+ stateRoot: import("snarkyjs/dist/node/lib/field").Field;
83
+ };
84
+ };
85
+ export declare class BlockProverPublicOutput extends BlockProverPublicOutput_base {
86
+ }
87
+ export type BlockProverProof = Proof<BlockProverPublicInput, BlockProverPublicOutput>;
88
+ declare const BlockProverExecutionData_base: (new (value: {
89
+ transaction: ProtocolTransaction;
90
+ networkState: NetworkState;
91
+ }) => {
92
+ transaction: ProtocolTransaction;
93
+ networkState: NetworkState;
94
+ }) & {
95
+ _isStruct: true;
96
+ } & import("snarkyjs/dist/node/snarky").ProvablePure<{
97
+ transaction: ProtocolTransaction;
98
+ networkState: NetworkState;
99
+ }> & {
100
+ toInput: (x: {
101
+ transaction: ProtocolTransaction;
102
+ networkState: NetworkState;
103
+ }) => {
104
+ fields?: import("snarkyjs/dist/node/lib/field").Field[] | undefined;
105
+ packed?: [import("snarkyjs/dist/node/lib/field").Field, number][] | undefined;
106
+ };
107
+ toJSON: (x: {
108
+ transaction: ProtocolTransaction;
109
+ networkState: NetworkState;
110
+ }) => {
111
+ transaction: {
112
+ methodId: string;
113
+ nonce: string;
114
+ sender: string;
115
+ argsHash: string;
116
+ signature: any;
117
+ };
118
+ networkState: {
119
+ block: {
120
+ height: string;
121
+ };
122
+ };
123
+ };
124
+ fromJSON: (x: {
125
+ transaction: {
126
+ methodId: string;
127
+ nonce: string;
128
+ sender: string;
129
+ argsHash: string;
130
+ signature: any;
131
+ };
132
+ networkState: {
133
+ block: {
134
+ height: string;
135
+ };
136
+ };
137
+ }) => {
138
+ transaction: ProtocolTransaction;
139
+ networkState: NetworkState;
140
+ };
141
+ };
142
+ export declare class BlockProverExecutionData extends BlockProverExecutionData_base {
143
+ }
144
+ export interface BlockProvable extends ZkProgrammable<BlockProverPublicInput, BlockProverPublicOutput> {
145
+ proveTransaction: (publicInput: BlockProverPublicInput, stateProof: StateTransitionProof, appProof: Proof<void, MethodPublicOutput>, executionData: BlockProverExecutionData) => BlockProverPublicOutput;
146
+ merge: (publicInput: BlockProverPublicInput, proof1: BlockProverProof, proof2: BlockProverProof) => BlockProverPublicOutput;
147
+ }
148
+ export {};
149
+ //# sourceMappingURL=BlockProvable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockProvable.d.ts","sourceRoot":"","sources":["../../../src/prover/block/BlockProvable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,EAAkB,MAAM,UAAU,CAAC;AAExD,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEhE,qBAAa,sBAAuB,SAAQ,2BAI1C;CAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEL,qBAAa,uBAAwB,SAAQ,4BAG3C;CAAG;AAEL,MAAM,MAAM,gBAAgB,GAAG,KAAK,CAClC,sBAAsB,EACtB,uBAAuB,CACxB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,qBAAa,wBAAyB,SAAQ,6BAI5C;CAAG;AAEL,MAAM,WAAW,aACf,SAAQ,cAAc,CAAC,sBAAsB,EAAE,uBAAuB,CAAC;IACvE,gBAAgB,EAAE,CAChB,WAAW,EAAE,sBAAsB,EACnC,UAAU,EAAE,oBAAoB,EAChC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,EACzC,aAAa,EAAE,wBAAwB,KACpC,uBAAuB,CAAC;IAE7B,KAAK,EAAE,CACL,WAAW,EAAE,sBAAsB,EACnC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,gBAAgB,KACrB,uBAAuB,CAAC;CAC9B"}
@@ -0,0 +1,20 @@
1
+ import { Field, Struct } from "snarkyjs";
2
+ import { ProtocolTransaction } from "../../model/transaction/ProtocolTransaction";
3
+ import { NetworkState } from "../../model/network/NetworkState";
4
+ export class BlockProverPublicInput extends Struct({
5
+ transactionsHash: Field,
6
+ stateRoot: Field,
7
+ networkStateHash: Field,
8
+ }) {
9
+ }
10
+ export class BlockProverPublicOutput extends Struct({
11
+ transactionsHash: Field,
12
+ stateRoot: Field,
13
+ }) {
14
+ }
15
+ export class BlockProverExecutionData extends Struct({
16
+ transaction: ProtocolTransaction,
17
+ networkState: NetworkState,
18
+ // accountstate
19
+ }) {
20
+ }
@@ -0,0 +1,48 @@
1
+ import { Field, type Proof } from "snarkyjs";
2
+ import { PlainZkProgram, WithZkProgrammable, ZkProgrammable } from "@proto-kit/common";
3
+ import { MethodPublicOutput } from "../../model/MethodPublicOutput";
4
+ import { ProtocolModule } from "../../protocol/ProtocolModule";
5
+ import { StateTransitionProof, StateTransitionProverPublicInput, StateTransitionProverPublicOutput } from "../statetransition/StateTransitionProvable";
6
+ import { BlockProvable, BlockProverExecutionData, BlockProverProof, BlockProverPublicInput, BlockProverPublicOutput } from "./BlockProvable";
7
+ export interface BlockProverState {
8
+ stateRoot: Field;
9
+ /**
10
+ * The current commitment of the transaction-list which
11
+ * will at the end equal the bundle hash
12
+ */
13
+ transactionsHash: Field;
14
+ /**
15
+ * The network state which gives access to values such as blockHeight
16
+ * This value is the same for the whole batch (L2 block)
17
+ */
18
+ networkStateHash: Field;
19
+ }
20
+ /**
21
+ * BlockProver class, which aggregates a AppChainProof and
22
+ * a StateTransitionProof into a single BlockProof, that can
23
+ * then be merged to be committed to the base-layer contract
24
+ */
25
+ export declare class BlockProver extends ProtocolModule<BlockProverPublicInput, BlockProverPublicOutput> implements BlockProvable {
26
+ private readonly stateTransitionProver;
27
+ private readonly runtime;
28
+ constructor(stateTransitionProver: ZkProgrammable<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>, runtime: WithZkProgrammable<void, MethodPublicOutput>);
29
+ /**
30
+ * Applies and checks the two proofs and applies the corresponding state
31
+ * changes to the given state
32
+ *
33
+ * @param state The from-state of the BlockProver
34
+ * @param stateTransitionProof
35
+ * @param appProof
36
+ * @returns The new BlockProver-state to be used as public output
37
+ */
38
+ applyTransaction(state: BlockProverState, stateTransitionProof: Proof<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>, appProof: Proof<void, MethodPublicOutput>, { transaction, networkState }: BlockProverExecutionData): BlockProverState;
39
+ proveTransaction(publicInput: BlockProverPublicInput, stateProof: StateTransitionProof, appProof: Proof<void, MethodPublicOutput>, executionData: BlockProverExecutionData): BlockProverPublicOutput;
40
+ merge(publicInput: BlockProverPublicInput, proof1: BlockProverProof, proof2: BlockProverProof): BlockProverPublicOutput;
41
+ /**
42
+ * Creates the BlockProver ZkProgram.
43
+ * Recursive linking of proofs is done via the previously
44
+ * injected StateTransitionProver and the required AppChainProof class
45
+ */
46
+ zkProgramFactory(): PlainZkProgram<BlockProverPublicInput, BlockProverPublicOutput>;
47
+ }
48
+ //# sourceMappingURL=BlockProver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BlockProver.d.ts","sourceRoot":"","sources":["../../../src/prover/block/BlockProver.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,EAAE,KAAK,KAAK,EAAuB,MAAM,UAAU,CAAC;AAEhF,OAAO,EACL,cAAc,EAEd,kBAAkB,EAClB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EACL,oBAAoB,EACpB,gCAAgC,EAChC,iCAAiC,EAClC,MAAM,4CAA4C,CAAC;AAGpD,OAAO,EACL,aAAa,EACb,wBAAwB,EACxB,gBAAgB,EAChB,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,iBAAiB,CAAC;AAiBzB,MAAM,WAAW,gBAAgB;IAE/B,SAAS,EAAE,KAAK,CAAC;IAEjB;;;OAGG;IACH,gBAAgB,EAAE,KAAK,CAAC;IAExB;;;OAGG;IACH,gBAAgB,EAAE,KAAK,CAAC;CACzB;AAED;;;;GAIG;AACH,qBACa,WACX,SAAQ,cAAc,CAAC,sBAAsB,EAAE,uBAAuB,CACtE,YAAW,aAAa;IAItB,OAAO,CAAC,QAAQ,CAAC,qBAAqB;IAKtC,OAAO,CAAC,QAAQ,CAAC,OAAO;gBALP,qBAAqB,EAAE,cAAc,CACpD,gCAAgC,EAChC,iCAAiC,CAClC,EAEgB,OAAO,EAAE,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,CAAC;IAKxE;;;;;;;;OAQG;IACI,gBAAgB,CACrB,KAAK,EAAE,gBAAgB,EACvB,oBAAoB,EAAE,KAAK,CACzB,gCAAgC,EAChC,iCAAiC,CAClC,EACD,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,EACzC,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,wBAAwB,GACtD,gBAAgB;IAyEZ,gBAAgB,CACrB,WAAW,EAAE,sBAAsB,EACnC,UAAU,EAAE,oBAAoB,EAChC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC,EACzC,aAAa,EAAE,wBAAwB,GACtC,uBAAuB;IAgBnB,KAAK,CACV,WAAW,EAAE,sBAAsB,EACnC,MAAM,EAAE,gBAAgB,EACxB,MAAM,EAAE,gBAAgB,GACvB,uBAAuB;IA8B1B;;;;OAIG;IACI,gBAAgB,IAAI,cAAc,CACvC,sBAAsB,EACtB,uBAAuB,CACxB;CAkEF"}