tokamak-l2js 0.0.1

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 (84) hide show
  1. package/LICENSE-APACHE +201 -0
  2. package/LICENSE-MIT +21 -0
  3. package/NOTICE +2 -0
  4. package/README.md +31 -0
  5. package/dist/cjs/crypto/index.js +112 -0
  6. package/dist/cjs/crypto/index.js.map +1 -0
  7. package/dist/cjs/index.js +33 -0
  8. package/dist/cjs/index.js.map +1 -0
  9. package/dist/cjs/package.json +3 -0
  10. package/dist/cjs/params/index.js +12 -0
  11. package/dist/cjs/params/index.js.map +1 -0
  12. package/dist/cjs/stateManager/TokamakL2StateManager.js +227 -0
  13. package/dist/cjs/stateManager/TokamakL2StateManager.js.map +1 -0
  14. package/dist/cjs/stateManager/constructors.js +26 -0
  15. package/dist/cjs/stateManager/constructors.js.map +1 -0
  16. package/dist/cjs/stateManager/index.js +22 -0
  17. package/dist/cjs/stateManager/index.js.map +1 -0
  18. package/dist/cjs/stateManager/types.js +3 -0
  19. package/dist/cjs/stateManager/types.js.map +1 -0
  20. package/dist/cjs/tx/TokamakL2Tx.js +148 -0
  21. package/dist/cjs/tx/TokamakL2Tx.js.map +1 -0
  22. package/dist/cjs/tx/constructors.js +55 -0
  23. package/dist/cjs/tx/constructors.js.map +1 -0
  24. package/dist/cjs/tx/index.js +21 -0
  25. package/dist/cjs/tx/index.js.map +1 -0
  26. package/dist/cjs/tx/types.js +3 -0
  27. package/dist/cjs/tx/types.js.map +1 -0
  28. package/dist/cjs/utils/utils.js +89 -0
  29. package/dist/cjs/utils/utils.js.map +1 -0
  30. package/dist/cjs/utils/web.js +35 -0
  31. package/dist/cjs/utils/web.js.map +1 -0
  32. package/dist/crypto/index.d.ts +11 -0
  33. package/dist/crypto/index.d.ts.map +1 -0
  34. package/dist/crypto/index.js +103 -0
  35. package/dist/crypto/index.js.map +1 -0
  36. package/dist/index.d.ts +7 -0
  37. package/dist/index.d.ts.map +1 -0
  38. package/dist/index.js +7 -0
  39. package/dist/index.js.map +1 -0
  40. package/dist/params/index.d.ts +7 -0
  41. package/dist/params/index.d.ts.map +1 -0
  42. package/dist/params/index.js +9 -0
  43. package/dist/params/index.js.map +1 -0
  44. package/dist/stateManager/TokamakL2StateManager.d.ts +24 -0
  45. package/dist/stateManager/TokamakL2StateManager.d.ts.map +1 -0
  46. package/dist/stateManager/TokamakL2StateManager.js +223 -0
  47. package/dist/stateManager/TokamakL2StateManager.js.map +1 -0
  48. package/dist/stateManager/constructors.d.ts +5 -0
  49. package/dist/stateManager/constructors.d.ts.map +1 -0
  50. package/dist/stateManager/constructors.js +22 -0
  51. package/dist/stateManager/constructors.js.map +1 -0
  52. package/dist/stateManager/index.d.ts +4 -0
  53. package/dist/stateManager/index.d.ts.map +1 -0
  54. package/dist/stateManager/index.js +4 -0
  55. package/dist/stateManager/index.js.map +1 -0
  56. package/dist/stateManager/types.d.ts +27 -0
  57. package/dist/stateManager/types.d.ts.map +1 -0
  58. package/dist/stateManager/types.js +2 -0
  59. package/dist/stateManager/types.js.map +1 -0
  60. package/dist/tx/TokamakL2Tx.d.ts +23 -0
  61. package/dist/tx/TokamakL2Tx.d.ts.map +1 -0
  62. package/dist/tx/TokamakL2Tx.js +144 -0
  63. package/dist/tx/TokamakL2Tx.js.map +1 -0
  64. package/dist/tx/constructors.d.ts +18 -0
  65. package/dist/tx/constructors.d.ts.map +1 -0
  66. package/dist/tx/constructors.js +50 -0
  67. package/dist/tx/constructors.js.map +1 -0
  68. package/dist/tx/index.d.ts +4 -0
  69. package/dist/tx/index.d.ts.map +1 -0
  70. package/dist/tx/index.js +3 -0
  71. package/dist/tx/index.js.map +1 -0
  72. package/dist/tx/types.d.ts +32 -0
  73. package/dist/tx/types.d.ts.map +1 -0
  74. package/dist/tx/types.js +2 -0
  75. package/dist/tx/types.js.map +1 -0
  76. package/dist/utils/utils.d.ts +6 -0
  77. package/dist/utils/utils.d.ts.map +1 -0
  78. package/dist/utils/utils.js +84 -0
  79. package/dist/utils/utils.js.map +1 -0
  80. package/dist/utils/web.d.ts +13 -0
  81. package/dist/utils/web.d.ts.map +1 -0
  82. package/dist/utils/web.js +28 -0
  83. package/dist/utils/web.js.map +1 -0
  84. package/package.json +65 -0
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.batchBigIntTo32BytesEach = batchBigIntTo32BytesEach;
4
+ exports.fromEdwardsToAddress = fromEdwardsToAddress;
5
+ exports.getUserStorageKey = getUserStorageKey;
6
+ const util_1 = require("@ethereumjs/util");
7
+ const misc_js_1 = require("@noble/curves/misc.js");
8
+ const index_js_1 = require("../crypto/index.js");
9
+ const keccak_1 = require("ethereum-cryptography/keccak");
10
+ function batchBigIntTo32BytesEach(...inVals) {
11
+ return (0, util_1.concatBytes)(...inVals.map(x => (0, util_1.setLengthLeft)((0, util_1.bigIntToBytes)(x), 32)));
12
+ }
13
+ function fromEdwardsToAddress(point) {
14
+ const edwardsToAffineBytes = (point) => {
15
+ const affine = point.toAffine();
16
+ return batchBigIntTo32BytesEach(affine.x, affine.y);
17
+ };
18
+ let pointBytes;
19
+ if (point instanceof Uint8Array) {
20
+ if (point.length === 32) {
21
+ // compressed point
22
+ pointBytes = edwardsToAffineBytes(misc_js_1.jubjub.Point.fromBytes(point));
23
+ }
24
+ else if (point.length === 64) {
25
+ // Uncompressed Affine coordinates
26
+ pointBytes = point;
27
+ }
28
+ else {
29
+ throw new Error('Invalid EdwardsPoint format');
30
+ }
31
+ }
32
+ else {
33
+ pointBytes = edwardsToAffineBytes(point);
34
+ }
35
+ const addressByte = (0, index_js_1.poseidon)(pointBytes).subarray(-20);
36
+ return new util_1.Address(addressByte);
37
+ }
38
+ function getUserStorageKey(parts, layer) {
39
+ const bytesArray = [];
40
+ for (const p of parts) {
41
+ let b;
42
+ if (p instanceof util_1.Address) {
43
+ b = p.toBytes();
44
+ }
45
+ else if (typeof p === 'number') {
46
+ b = (0, util_1.bigIntToBytes)(BigInt(p));
47
+ }
48
+ else if (typeof p === 'bigint') {
49
+ b = (0, util_1.bigIntToBytes)(p);
50
+ }
51
+ else if (typeof p === 'string') {
52
+ b = (0, util_1.hexToBytes)((0, util_1.addHexPrefix)(p));
53
+ }
54
+ else {
55
+ throw new Error('getStorageKey accepts only Address | number | bigint | string');
56
+ }
57
+ bytesArray.push((0, util_1.setLengthLeft)(b, 32));
58
+ }
59
+ const packed = (0, util_1.concatBytes)(...bytesArray);
60
+ let hash;
61
+ switch (layer) {
62
+ case 'L1':
63
+ {
64
+ hash = keccak_1.keccak256;
65
+ }
66
+ break;
67
+ case 'TokamakL2':
68
+ {
69
+ hash = index_js_1.poseidon;
70
+ }
71
+ break;
72
+ default: {
73
+ throw new Error(`Error while making a user's storage key: Undefined layer "${layer}"`);
74
+ }
75
+ }
76
+ return hash(packed);
77
+ }
78
+ // export function compressJubJubPoint(point: EdwardsPoint): bigint {
79
+ // return point.X * jubjub.Point.Fp.ORDER + point.Y
80
+ // }
81
+ // export function recoverJubJubPoint(raw: bigint): EdwardsPoint {
82
+ // const Y = raw % jubjub.Point.Fp.ORDER
83
+ // const X = (raw - Y) / jubjub.Point.Fp.ORDER
84
+ // if (X >= jubjub.Point.Fp.ORDER) {
85
+ // throw new Error('Invalid format for a JubJub point')
86
+ // }
87
+ // return jubjub.Point.fromAffine({x: X, y: Y})
88
+ // }
89
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/utils/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deriveL2MptKeyFromAddress = exports.deriveL2AddressFromKeys = exports.deriveL2KeysFromSignature = exports.deriveSignatureFromMetaMask = exports.L2_PRV_KEY_MESSAGE = void 0;
4
+ const utils_1 = require("ethereum-cryptography/utils");
5
+ const index_js_1 = require("../crypto/index.js");
6
+ const misc_js_1 = require("@noble/curves/misc.js");
7
+ const util_1 = require("@ethereumjs/util");
8
+ const utils_js_1 = require("./utils.js");
9
+ exports.L2_PRV_KEY_MESSAGE = 'Tokamak-Private-App-Channel-';
10
+ // ##Usage##
11
+ // import { useSignMessage } from 'wagmi';
12
+ // const { signMessageAsync } = useSignMessage();
13
+ const deriveSignatureFromMetaMask = async (signMessageAsync, channelId) => {
14
+ const messageToSign = `Tokamak-Private-App-Channel-${channelId}`;
15
+ return await signMessageAsync({ message: messageToSign });
16
+ };
17
+ exports.deriveSignatureFromMetaMask = deriveSignatureFromMetaMask;
18
+ const deriveL2KeysFromSignature = (signature) => {
19
+ const rngStringRaw = misc_js_1.jubjub.utils.randomPrivateKey((0, index_js_1.poseidon)((0, utils_1.utf8ToBytes)(signature)));
20
+ const privateKey = (0, util_1.setLengthLeft)((0, util_1.bigIntToBytes)((0, util_1.bytesToBigInt)(rngStringRaw) % misc_js_1.jubjub.Point.Fn.ORDER), 32);
21
+ const publicKey = misc_js_1.jubjub.Point.BASE.multiply((0, util_1.bytesToBigInt)(privateKey)).toBytes();
22
+ return { privateKey, publicKey };
23
+ };
24
+ exports.deriveL2KeysFromSignature = deriveL2KeysFromSignature;
25
+ const deriveL2AddressFromKeys = (keys) => {
26
+ const address = (0, utils_js_1.fromEdwardsToAddress)(keys.publicKey);
27
+ return address.toString();
28
+ };
29
+ exports.deriveL2AddressFromKeys = deriveL2AddressFromKeys;
30
+ const deriveL2MptKeyFromAddress = (address, slotIndex) => {
31
+ const mptKey = (0, utils_js_1.getUserStorageKey)([address, slotIndex], 'TokamakL2');
32
+ return (0, util_1.bytesToHex)(mptKey);
33
+ };
34
+ exports.deriveL2MptKeyFromAddress = deriveL2MptKeyFromAddress;
35
+ //# sourceMappingURL=web.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.js","sourceRoot":"","sources":["../../../src/utils/web.ts"],"names":[],"mappings":";;;AAAA,uDAA0D;AAC1D,iDAA8C;AAC9C,mDAA+C;AAC/C,2CAA2F;AAC3F,yCAAqE;AAExD,QAAA,kBAAkB,GAAC,8BAA8B,CAAA;AAO9D,YAAY;AACZ,0CAA0C;AAC1C,iDAAiD;AAE1C,MAAM,2BAA2B,GAAG,KAAK,EAAE,gBAAuE,EAAE,SAAwB,EAA0B,EAAE;IAC7K,MAAM,aAAa,GAAG,+BAA+B,SAAS,EAAE,CAAC;IACjE,OAAO,MAAM,gBAAgB,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC,CAAA;AAC3D,CAAC,CAAC;AAHW,QAAA,2BAA2B,+BAGtC;AAEK,MAAM,yBAAyB,GAAG,CAAC,SAAwB,EAAc,EAAE;IAChF,MAAM,YAAY,GAAG,gBAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAA,mBAAQ,EAAC,IAAA,mBAAW,EAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,IAAA,oBAAa,EAAC,IAAA,oBAAa,EAAC,IAAA,oBAAa,EAAC,YAAY,CAAC,GAAG,gBAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IACzG,MAAM,SAAS,GAAG,gBAAM,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAA,oBAAa,EAAC,UAAU,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;IAClF,OAAO,EAAC,UAAU,EAAE,SAAS,EAAC,CAAC;AACjC,CAAC,CAAC;AALW,QAAA,yBAAyB,6BAKpC;AAEK,MAAM,uBAAuB,GAAG,CAAC,IAAe,EAAiB,EAAE;IACxE,MAAM,OAAO,GAAG,IAAA,+BAAoB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAA;AAC3B,CAAC,CAAC;AAHW,QAAA,uBAAuB,2BAGlC;AAEK,MAAM,yBAAyB,GAAG,CAAC,OAAsB,EAAE,SAAiB,EAAiB,EAAE;IACpG,MAAM,MAAM,GAAG,IAAA,4BAAiB,EAAC,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;IACpE,OAAO,IAAA,iBAAU,EAAC,MAAM,CAAC,CAAA;AAC3B,CAAC,CAAC;AAHW,QAAA,yBAAyB,6BAGpC"}
@@ -0,0 +1,11 @@
1
+ import { EdwardsPoint } from "@noble/curves/abstract/edwards.js";
2
+ export declare const poseidon_raw: (inVals: bigint[]) => bigint;
3
+ export declare function poseidon(msg: Uint8Array): Uint8Array;
4
+ export declare function poseidonN2xCompress(in_vals: bigint[]): bigint;
5
+ export declare function getEddsaPublicKey(msgHash: Uint8Array, v: bigint, r: Uint8Array, s: Uint8Array, chainId?: bigint): Uint8Array;
6
+ export declare function eddsaSign(prvKey: bigint, msg: Uint8Array[]): {
7
+ R: EdwardsPoint;
8
+ S: bigint;
9
+ };
10
+ export declare function eddsaVerify(msg: Uint8Array[], pubKey: EdwardsPoint, R: EdwardsPoint, S: bigint): boolean;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/crypto/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAMjE,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,EAAE,KAAG,MAK/C,CAAA;AAKD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,UAAU,CAoCpD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAW7D;AAKD,wBAAgB,iBAAiB,CAC7B,OAAO,EAAE,UAAU,EACnB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,UAAU,EACb,CAAC,EAAE,UAAU,EACb,OAAO,CAAC,EAAE,MAAM,GACjB,UAAU,CAgBZ;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG;IAAC,CAAC,EAAE,YAAY,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAC,CAmCzF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAiBxG"}
@@ -0,0 +1,103 @@
1
+ import { jubjub } from "@noble/curves/misc.js";
2
+ import { DST_NONCE } from "../params/index.js";
3
+ import { bigIntToBytes, bytesToBigInt, concatBytes, setLengthLeft } from "@ethereumjs/util";
4
+ import { batchBigIntTo32BytesEach } from "../utils/utils.js";
5
+ import { poseidon2 } from "poseidon-bls12381";
6
+ // TODO: Import this constant from QAP compiler in the future, when QAP compiler is NPM-packaged.
7
+ import { POSEIDON_INPUTS } from "../params/index.js";
8
+ export const poseidon_raw = (inVals) => {
9
+ if (inVals.length !== POSEIDON_INPUTS) {
10
+ throw new Error(`Expected an array with ${POSEIDON_INPUTS} elements, but got ${inVals.length} elements`);
11
+ }
12
+ return poseidon2(inVals);
13
+ };
14
+ // To replace KECCAK256 with poseidon4. Example:
15
+ // const common = new Common({ chain: Mainnet, customCrypto: { keccak256: poseidon } })
16
+ // const block = createBlock({}, { common })
17
+ export function poseidon(msg) {
18
+ if (msg.length === 0) {
19
+ return setLengthLeft(bigIntToBytes(poseidon_raw(Array(POSEIDON_INPUTS).fill(0n))), 32);
20
+ }
21
+ // Split input bytes into 32-byte big-endian words → BigInt[] (no Node Buffer dependency)
22
+ const words = Array.from({ length: Math.ceil(msg.byteLength / 32) }, (_, i) => {
23
+ const slice = msg.subarray(i * 32, (i + 1) * 32);
24
+ return bytesToBigInt(slice);
25
+ });
26
+ const fold = (arr) => {
27
+ const n1xChunks = Math.ceil(arr.length / POSEIDON_INPUTS);
28
+ const nPaddedChildren = n1xChunks * POSEIDON_INPUTS;
29
+ const mode2x = nPaddedChildren % (POSEIDON_INPUTS ** 2) === 0;
30
+ let placeFunction = mode2x ?
31
+ poseidonN2xCompress :
32
+ poseidon_raw;
33
+ const nChildren = mode2x ? (POSEIDON_INPUTS ** 2) : POSEIDON_INPUTS;
34
+ const out = [];
35
+ for (let childId = 0; childId < nPaddedChildren; childId += nChildren) {
36
+ const chunk = Array.from({ length: nChildren }, (_, localChildId) => arr[childId + localChildId] ?? 0n);
37
+ // Every word must be within the field [0, MOD)
38
+ // chunk.map(checkBLS12Modulus)
39
+ out.push(placeFunction(chunk));
40
+ }
41
+ return out;
42
+ };
43
+ // Repeatedly fold until a single word remains
44
+ let acc = fold(words);
45
+ while (acc.length > 1)
46
+ acc = fold(acc);
47
+ return setLengthLeft(bigIntToBytes(acc[0]), 32);
48
+ }
49
+ export function poseidonN2xCompress(in_vals) {
50
+ if (in_vals.length !== POSEIDON_INPUTS ** 2) {
51
+ throw new Error(`poseidon${POSEIDON_INPUTS} expected exactly ${POSEIDON_INPUTS} values`);
52
+ }
53
+ const interim = [];
54
+ for (let k = 0; k < POSEIDON_INPUTS; k++) {
55
+ const children = in_vals.slice(k * POSEIDON_INPUTS, (k + 1) * POSEIDON_INPUTS);
56
+ interim.push(poseidon_raw(children));
57
+ }
58
+ return poseidon_raw(interim);
59
+ }
60
+ // To replace ecrecover with Eddsa public key recovery. Example:
61
+ // const common = new Common({ chain: Mainnet, customCrypto: { ecrecover: getEddsaPublicKey } })
62
+ // const block = createBlock({}, { common })
63
+ export function getEddsaPublicKey(msgHash, v, r, s, chainId) {
64
+ // msgHash must be the original message, not a hash.
65
+ // The last 32 bytes of the msgHash contains the public key
66
+ // v is useless but only to satisfy the interface of LegacyTx
67
+ if (chainId !== undefined) {
68
+ throw new Error("Eddsa does not require 'chainId' to recover a public key");
69
+ }
70
+ const msg = msgHash.subarray(0, msgHash.byteLength - 32);
71
+ const pubKeyBytes = msgHash.subarray(msgHash.byteLength - 32);
72
+ const pubKey = jubjub.Point.fromBytes(pubKeyBytes);
73
+ const randomizer = jubjub.Point.fromBytes(r);
74
+ if (!eddsaVerify([msg], pubKey, randomizer, bytesToBigInt(s))) {
75
+ throw new Error('Signature verification failed');
76
+ }
77
+ return pubKeyBytes;
78
+ }
79
+ export function eddsaSign(prvKey, msg) {
80
+ const pubKey = jubjub.Point.BASE.multiply(prvKey);
81
+ const nonceKeyBytes = poseidon(concatBytes(DST_NONCE, setLengthLeft(bigIntToBytes(prvKey), 32)));
82
+ const r = bytesToBigInt(poseidon(concatBytes(DST_NONCE, nonceKeyBytes, batchBigIntTo32BytesEach(pubKey.toAffine().x, pubKey.toAffine().y), ...msg))) % jubjub.Point.Fn.ORDER;
83
+ const R = jubjub.Point.BASE.multiply(r);
84
+ const e = bytesToBigInt(poseidon(concatBytes(batchBigIntTo32BytesEach(R.toAffine().x, R.toAffine().y, pubKey.toAffine().x, pubKey.toAffine().y), ...msg)));
85
+ const ep = e % jubjub.Point.Fn.ORDER;
86
+ const S = (r + ep * prvKey) % jubjub.Point.Fn.ORDER;
87
+ return { R, S };
88
+ }
89
+ export function eddsaVerify(msg, pubKey, R, S) {
90
+ if (S >= jubjub.Point.Fn.ORDER || S < 0n)
91
+ return false;
92
+ if (pubKey.equals(jubjub.Point.ZERO))
93
+ return false;
94
+ if (R.equals(jubjub.Point.ZERO))
95
+ return false;
96
+ if (msg.length === 0)
97
+ return false;
98
+ const e = bytesToBigInt(poseidon(concatBytes(batchBigIntTo32BytesEach(R.toAffine().x, R.toAffine().y, pubKey.toAffine().x, pubKey.toAffine().y), ...msg))) % jubjub.Point.Fn.ORDER;
99
+ const LHS = jubjub.Point.BASE.multiply(S);
100
+ const RHS = pubKey.multiply(e).add(R);
101
+ return LHS.equals(RHS);
102
+ }
103
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/crypto/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export { poseidon, getEddsaPublicKey } from './crypto/index.js';
2
+ export * from './tx/index.js';
3
+ export * from './stateManager/index.js';
4
+ export * from './params/index.js';
5
+ export { getUserStorageKey, fromEdwardsToAddress } from './utils/utils.js';
6
+ export { L2_PRV_KEY_MESSAGE, deriveL2AddressFromKeys, deriveL2KeysFromSignature, deriveL2MptKeyFromAddress, deriveSignatureFromMetaMask } from './utils/web.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC/D,cAAc,eAAe,CAAA;AAC7B,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC1E,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ export { poseidon, getEddsaPublicKey } from './crypto/index.js';
2
+ export * from './tx/index.js';
3
+ export * from './stateManager/index.js';
4
+ export * from './params/index.js';
5
+ export { getUserStorageKey, fromEdwardsToAddress } from './utils/utils.js';
6
+ export { L2_PRV_KEY_MESSAGE, deriveL2AddressFromKeys, deriveL2KeysFromSignature, deriveL2MptKeyFromAddress, deriveSignatureFromMetaMask } from './utils/web.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAC/D,cAAc,eAAe,CAAA;AAC7B,cAAc,yBAAyB,CAAA;AACvC,cAAc,mBAAmB,CAAA;AACjC,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAC1E,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAA"}
@@ -0,0 +1,7 @@
1
+ export declare const DST_NONCE: Uint8Array<ArrayBufferLike>;
2
+ export declare const ANY_LARGE_GAS_LIMIT = 9999999999999999n;
3
+ export declare const ANY_LARGE_GAS_PRICE = 9999999n;
4
+ export declare const POSEIDON_INPUTS = 2;
5
+ export declare const MT_DEPTH = 4;
6
+ export declare const MAX_MT_LEAVES: number;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/params/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,SAAS,6BAA+D,CAAC;AACtF,eAAO,MAAM,mBAAmB,oBAAoB,CAAC;AACrD,eAAO,MAAM,mBAAmB,WAAW,CAAC;AAG5C,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,QAAQ,IAAI,CAAC;AAC1B,eAAO,MAAM,aAAa,QAA8B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { setLengthLeft, utf8ToBytes } from "@ethereumjs/util";
2
+ export const DST_NONCE = setLengthLeft(utf8ToBytes("TokamakAuth‑EDDSA‑NONCE‑v1"), 32);
3
+ export const ANY_LARGE_GAS_LIMIT = 9999999999999999n;
4
+ export const ANY_LARGE_GAS_PRICE = 9999999n;
5
+ // TODO: Modify QAP compiler to import the following constants from this pacakge.
6
+ export const POSEIDON_INPUTS = 2;
7
+ export const MT_DEPTH = 4;
8
+ export const MAX_MT_LEAVES = POSEIDON_INPUTS ** MT_DEPTH;
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/params/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE9D,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,4BAA4B,CAAC,EAAE,EAAE,CAAC,CAAC;AACtF,MAAM,CAAC,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AACrD,MAAM,CAAC,MAAM,mBAAmB,GAAG,QAAQ,CAAC;AAE5C,iFAAiF;AACjF,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AACjC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC;AAC1B,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,IAAI,QAAQ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { MerkleStateManager } from "@ethereumjs/statemanager";
2
+ import { StateSnapshot, TokamakL2StateManagerOpts } from "./types.js";
3
+ import { StateManagerInterface } from "@ethereumjs/common";
4
+ import { IMT, IMTMerkleProof } from "@zk-kit/imt";
5
+ export declare class TokamakL2StateManager extends MerkleStateManager implements StateManagerInterface {
6
+ private _cachedOpts;
7
+ private _registeredKeys;
8
+ private _initialMerkleTree;
9
+ initTokamakExtendsFromRPC(rpcUrl: string, opts: TokamakL2StateManagerOpts): Promise<void>;
10
+ initTokamakExtendsFromSnapshot(snapshot: StateSnapshot, opts: TokamakL2StateManagerOpts): Promise<void>;
11
+ initTokamakExtend(opts: TokamakL2StateManagerOpts): Promise<void>;
12
+ fetchStorageFromRPC(rpcUrl: string, opts: TokamakL2StateManagerOpts): Promise<void>;
13
+ fetchStorageFromSnapshot(snapshot: StateSnapshot, opts: TokamakL2StateManagerOpts): Promise<void>;
14
+ convertLeavesIntoMerkleTreeLeaves(): Promise<bigint[]>;
15
+ private _permuteRegisteredKeys;
16
+ get initialMerkleTree(): IMT;
17
+ getUpdatedMerkleTreeRoot(permutation?: number[]): Promise<bigint>;
18
+ getMerkleProof(leafIndex: number): Promise<IMTMerkleProof>;
19
+ get registeredKeys(): Uint8Array<ArrayBufferLike>[];
20
+ getMTIndex(key: bigint): number;
21
+ get cachedOpts(): TokamakL2StateManagerOpts;
22
+ captureStateSnapshot(prevSnapshot: StateSnapshot): Promise<StateSnapshot>;
23
+ }
24
+ //# sourceMappingURL=TokamakL2StateManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokamakL2StateManager.d.ts","sourceRoot":"","sources":["../../src/stateManager/TokamakL2StateManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAmB,cAAc,EAAW,MAAM,aAAa,CAAA;AAS3E,qBAAa,qBAAsB,SAAQ,kBAAmB,YAAW,qBAAqB;IAC1F,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,kBAAkB,CAAmB;IAEhC,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAezF,8BAA8B,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB9G,iBAAiB,CAAC,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjE,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0CnF,wBAAwB,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB1F,iCAAiC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAenE,OAAO,CAAC,sBAAsB;IAY9B,IAAW,iBAAiB,IAAI,GAAG,CAMlC;IAEY,wBAAwB,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBjE,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAcvE,IAAW,cAAc,kCAAgC;IAClD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAMtC,IAAW,UAAU,8BAA4B;IAEpC,oBAAoB,CAAC,YAAY,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;CAyCzF"}
@@ -0,0 +1,223 @@
1
+ import { MerkleStateManager } from "@ethereumjs/statemanager";
2
+ import { IMT } from "@zk-kit/imt";
3
+ import { addHexPrefix, Address, bigIntToBytes, bytesToBigInt, bytesToHex, createAccount, hexToBigInt, hexToBytes, toBytes } from "@ethereumjs/util";
4
+ import { ethers } from "ethers";
5
+ import { RLP } from "@ethereumjs/rlp";
6
+ import { MAX_MT_LEAVES, MT_DEPTH, POSEIDON_INPUTS } from "../params/index.js";
7
+ import { poseidon_raw } from "../crypto/index.js";
8
+ export class TokamakL2StateManager extends MerkleStateManager {
9
+ constructor() {
10
+ super(...arguments);
11
+ this._cachedOpts = null;
12
+ this._registeredKeys = null;
13
+ this._initialMerkleTree = null;
14
+ }
15
+ async initTokamakExtendsFromRPC(rpcUrl, opts) {
16
+ if (this._cachedOpts !== null) {
17
+ throw new Error('Cannot rewrite cached opts');
18
+ }
19
+ this._cachedOpts = opts;
20
+ await this.initTokamakExtend(opts);
21
+ await this.fetchStorageFromRPC(rpcUrl, opts);
22
+ if (this._initialMerkleTree !== null) {
23
+ throw new Error('Merkle tree is already initialized');
24
+ }
25
+ this._initialMerkleTree = await TokamakL2MerkleTree.buildFromTokamakL2StateManager(this);
26
+ }
27
+ async initTokamakExtendsFromSnapshot(snapshot, opts) {
28
+ if (this._cachedOpts !== null) {
29
+ throw new Error('Cannot rewrite cached opts');
30
+ }
31
+ this._cachedOpts = opts;
32
+ await this.initTokamakExtend(opts);
33
+ await this.fetchStorageFromSnapshot(snapshot, opts);
34
+ if (this._initialMerkleTree !== null) {
35
+ throw new Error('Merkle tree is already initialized');
36
+ }
37
+ this._initialMerkleTree = await TokamakL2MerkleTree.buildFromTokamakL2StateManager(this);
38
+ if (BigInt(this._initialMerkleTree.root) !== hexToBigInt(addHexPrefix(snapshot.stateRoot))) {
39
+ throw new Error(`Creating TokamakL2StateManager using StateSnapshot fails: (provided root: ${snapshot.stateRoot}, reconstructed root: ${this._initialMerkleTree.toString()})`);
40
+ }
41
+ }
42
+ async initTokamakExtend(opts) {
43
+ if (opts.common.customCrypto.keccak256 === undefined) {
44
+ throw new Error('Custom crypto must be set');
45
+ }
46
+ const contractAddress = new Address(toBytes(opts.contractAddress));
47
+ const POSEIDON_RLP = opts.common.customCrypto.keccak256(RLP.encode(new Uint8Array([])));
48
+ const POSEIDON_NULL = opts.common.customCrypto.keccak256(new Uint8Array(0));
49
+ const contractAccount = createAccount({ nonce: 0n, balance: 0n, storageRoot: POSEIDON_RLP, codeHash: POSEIDON_NULL });
50
+ await this.putAccount(contractAddress, contractAccount);
51
+ }
52
+ async fetchStorageFromRPC(rpcUrl, opts) {
53
+ const provider = new ethers.JsonRpcProvider(rpcUrl);
54
+ const contractAddress = new Address(toBytes(opts.contractAddress));
55
+ if (await this.getAccount(contractAddress) === undefined) {
56
+ throw new Error('TokamakL2StateManager is not initialized.');
57
+ }
58
+ if (opts.blockNumber === undefined) {
59
+ throw new Error('Creating TokamakL2StateManager from RPC requires a block number.');
60
+ }
61
+ const byteCodeStr = await provider.getCode(contractAddress.toString(), opts.blockNumber);
62
+ await this.putCode(contractAddress, hexToBytes(addHexPrefix(byteCodeStr)));
63
+ if (opts.initStorageKeys === undefined) {
64
+ throw new Error('Creating TokamakL2StateManager from RPC requires L1 and L2 key pairs.');
65
+ }
66
+ if (this._registeredKeys !== null) {
67
+ throw new Error('Cannot rewrite registered keys');
68
+ }
69
+ const usedL1Keys = new Set();
70
+ const registeredL2KeyBigInts = new Set();
71
+ this._registeredKeys = [];
72
+ for (const keys of opts.initStorageKeys) {
73
+ const keyL1BigInt = bytesToBigInt(keys.L1);
74
+ const keyL2BigInt = bytesToBigInt(keys.L2);
75
+ if (usedL1Keys.has(keyL1BigInt)) {
76
+ throw new Error(`Duplication in L1 MPT keys.`);
77
+ }
78
+ if (registeredL2KeyBigInts.has(keyL2BigInt)) {
79
+ throw new Error(`Duplication in L2 MPT keys.`);
80
+ }
81
+ const v = await provider.getStorage(contractAddress.toString(), bytesToBigInt(keys.L1), opts.blockNumber);
82
+ const vBytes = hexToBytes(addHexPrefix(v));
83
+ await this.putStorage(contractAddress, keys.L2, vBytes);
84
+ usedL1Keys.add(keyL1BigInt);
85
+ registeredL2KeyBigInts.add(keyL2BigInt);
86
+ this._registeredKeys.push(keys.L2);
87
+ }
88
+ }
89
+ async fetchStorageFromSnapshot(snapshot, opts) {
90
+ if (opts.contractCode === undefined) {
91
+ throw new Error('Creating TokamakL2StateManager using StateSnapshot requires a contract code.');
92
+ }
93
+ const contractAddress = new Address(toBytes(opts.contractAddress));
94
+ await this.putCode(contractAddress, hexToBytes(addHexPrefix(opts.contractCode)));
95
+ if (this._registeredKeys !== null) {
96
+ throw new Error('Cannot rewrite registered keys');
97
+ }
98
+ this._registeredKeys = snapshot.registeredKeys.map(str => hexToBytes(addHexPrefix(str)));
99
+ for (const entry of [...snapshot.storageEntries, ...snapshot.preAllocatedLeaves]) {
100
+ const vBytes = hexToBytes(addHexPrefix(entry.value));
101
+ const keyBytes = hexToBytes(addHexPrefix(entry.key));
102
+ await this.putStorage(contractAddress, keyBytes, vBytes);
103
+ }
104
+ }
105
+ async convertLeavesIntoMerkleTreeLeaves() {
106
+ const contractAddress = new Address(toBytes(this.cachedOpts.contractAddress));
107
+ const leaves = new Array(MAX_MT_LEAVES);
108
+ for (var index = 0; index < MAX_MT_LEAVES; index++) {
109
+ const key = this.registeredKeys[index];
110
+ if (key === undefined) {
111
+ leaves[index] = poseidon_raw([0n, 0n]);
112
+ }
113
+ else {
114
+ const val = await this.getStorage(contractAddress, key);
115
+ leaves[index] = poseidon_raw([bytesToBigInt(key), bytesToBigInt(val)]);
116
+ }
117
+ }
118
+ return leaves;
119
+ }
120
+ _permuteRegisteredKeys(permutation) {
121
+ if (this._registeredKeys === null) {
122
+ throw new Error('Registered storage keys must be permuted after init.');
123
+ }
124
+ const permutedKeys = [...this._registeredKeys];
125
+ for (const [newIdx, oldIdx] of permutation.entries()) {
126
+ permutedKeys[newIdx] = this._registeredKeys[oldIdx].slice();
127
+ }
128
+ this._registeredKeys = permutedKeys;
129
+ }
130
+ // getters
131
+ get initialMerkleTree() {
132
+ if (this._initialMerkleTree === null) {
133
+ throw new Error('Merkle tree is not initialized');
134
+ }
135
+ const imt = this._initialMerkleTree;
136
+ return new IMT(poseidon_raw, imt.depth, 0n, imt.arity, imt.leaves);
137
+ }
138
+ async getUpdatedMerkleTreeRoot(permutation) {
139
+ if (permutation !== undefined) {
140
+ this._permuteRegisteredKeys(permutation);
141
+ }
142
+ const merkleTree = await TokamakL2MerkleTree.buildFromTokamakL2StateManager(this);
143
+ const _root = merkleTree.root;
144
+ let root = new Uint8Array([]);
145
+ if (typeof _root === 'bigint') {
146
+ root = bigIntToBytes(_root);
147
+ }
148
+ if (typeof _root === 'string') {
149
+ root = hexToBytes(addHexPrefix(_root));
150
+ }
151
+ if (typeof _root === 'number') {
152
+ root = bigIntToBytes(BigInt(_root));
153
+ }
154
+ return bytesToBigInt(root);
155
+ }
156
+ async getMerkleProof(leafIndex) {
157
+ const merkleTree = await TokamakL2MerkleTree.buildFromTokamakL2StateManager(this);
158
+ // pathIndices of this proof generation is incorrect. The indices are based on binary, but we are using 4-ary.
159
+ return merkleTree.createProof(leafIndex);
160
+ }
161
+ // public getInputMerkleTreeRootForTxNonce(txNonce: number) {
162
+ // const val = this._merkleTreeRoots[txNonce]
163
+ // if (val === undefined) {
164
+ // throw new Error('The Merkle tree has not been updated')
165
+ // }
166
+ // return val
167
+ // }
168
+ get registeredKeys() { return this._registeredKeys; }
169
+ getMTIndex(key) {
170
+ const MTIndex = this.registeredKeys.findIndex(register => bytesToBigInt(register) === key);
171
+ return MTIndex;
172
+ }
173
+ get cachedOpts() { return this._cachedOpts; }
174
+ async captureStateSnapshot(prevSnapshot) {
175
+ if (hexToBigInt(addHexPrefix(prevSnapshot.contractAddress)) !== bytesToBigInt(this.cachedOpts.contractAddress.bytes)) {
176
+ throw new Error('Mismatch between contract addresses of the previous state snapshot and the current state.');
177
+ }
178
+ const contractAddress = this.cachedOpts.contractAddress;
179
+ const getUpdatedEntry = async (entry) => {
180
+ const keyBytes = hexToBytes(addHexPrefix(entry.key));
181
+ const value = await this.getStorage(contractAddress, keyBytes);
182
+ return {
183
+ key: entry.key,
184
+ value: bytesToHex(value),
185
+ };
186
+ };
187
+ // Build state snapshot (matching snapshot.ts logic)
188
+ const permutedRegisteredKeys = this.registeredKeys.map((key) => bytesToHex(key));
189
+ const afterStorageEntries = await Promise.all(prevSnapshot.storageEntries.map(entry => getUpdatedEntry(entry)));
190
+ const afterPreAllocatedLeaves = await Promise.all(prevSnapshot.preAllocatedLeaves.map(entry => getUpdatedEntry(entry)));
191
+ return {
192
+ channelId: prevSnapshot.channelId,
193
+ stateRoot: (await this.getUpdatedMerkleTreeRoot()).toString(16),
194
+ registeredKeys: permutedRegisteredKeys,
195
+ storageEntries: afterStorageEntries,
196
+ contractAddress: prevSnapshot.contractAddress,
197
+ preAllocatedLeaves: afterPreAllocatedLeaves,
198
+ };
199
+ }
200
+ }
201
+ class TokamakL2MerkleTree extends IMT {
202
+ constructor() {
203
+ super(...arguments);
204
+ this._cachedTokamakL2StateManager = null;
205
+ }
206
+ initCache(stateManager) {
207
+ if (this._cachedTokamakL2StateManager !== null) {
208
+ throw new Error('Cannot rewirte cached state manager');
209
+ }
210
+ this._cachedTokamakL2StateManager = stateManager;
211
+ }
212
+ get cachedTokamakL2StateManager() {
213
+ return this._cachedTokamakL2StateManager;
214
+ }
215
+ static async buildFromTokamakL2StateManager(mpt) {
216
+ const treeDepth = MT_DEPTH;
217
+ const leaves = await mpt.convertLeavesIntoMerkleTreeLeaves();
218
+ const mt = new TokamakL2MerkleTree(poseidon_raw, treeDepth, 0n, POSEIDON_INPUTS, leaves);
219
+ mt.initCache(mpt);
220
+ return mt;
221
+ }
222
+ }
223
+ //# sourceMappingURL=TokamakL2StateManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TokamakL2StateManager.js","sourceRoot":"","sources":["../../src/stateManager/TokamakL2StateManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { StateSnapshot, TokamakL2StateManagerOpts } from "./types.js";
2
+ import { TokamakL2StateManager } from "./TokamakL2StateManager.js";
3
+ export declare function createTokamakL2StateManagerFromL1RPC(rpcUrl: string, opts: TokamakL2StateManagerOpts): Promise<TokamakL2StateManager>;
4
+ export declare function createTokamakL2StateManagerFromStateSnapshot(snapshot: StateSnapshot, opts: TokamakL2StateManagerOpts): Promise<TokamakL2StateManager>;
5
+ //# sourceMappingURL=constructors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constructors.d.ts","sourceRoot":"","sources":["../../src/stateManager/constructors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGnE,wBAAsB,oCAAoC,CACtD,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,yBAAyB,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAYhC;AAED,wBAAsB,4CAA4C,CAC9D,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,yBAAyB,GAChC,OAAO,CAAC,qBAAqB,CAAC,CAShC"}
@@ -0,0 +1,22 @@
1
+ import { TokamakL2StateManager } from "./TokamakL2StateManager.js";
2
+ import { MAX_MT_LEAVES } from "../params/index.js";
3
+ export async function createTokamakL2StateManagerFromL1RPC(rpcUrl, opts) {
4
+ if (opts.initStorageKeys === undefined) {
5
+ throw new Error('Creating TokamakL2StateManager using StateSnapshot requires L1 and L2 key pairs.');
6
+ }
7
+ if (opts.initStorageKeys.length > MAX_MT_LEAVES) {
8
+ throw new Error(`Allowed maximum number of storage slots = ${MAX_MT_LEAVES}, but taking ${opts.initStorageKeys.length}`);
9
+ }
10
+ const stateManager = new TokamakL2StateManager(opts);
11
+ await stateManager.initTokamakExtendsFromRPC(rpcUrl, opts);
12
+ return stateManager;
13
+ }
14
+ export async function createTokamakL2StateManagerFromStateSnapshot(snapshot, opts) {
15
+ if (snapshot.registeredKeys.length > MAX_MT_LEAVES) {
16
+ throw new Error(`Allowed maximum number of storage slots = ${MAX_MT_LEAVES}, but taking ${snapshot.registeredKeys.length}`);
17
+ }
18
+ const stateManager = new TokamakL2StateManager(opts);
19
+ await stateManager.initTokamakExtendsFromSnapshot(snapshot, opts);
20
+ return stateManager;
21
+ }
22
+ //# sourceMappingURL=constructors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constructors.js","sourceRoot":"","sources":["../../src/stateManager/constructors.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,oCAAoC,CACtD,MAAc,EACd,IAA+B;IAE/B,IAAI,IAAI,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,kFAAkF,CAAC,CAAA;IACvG,CAAC;IACD,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,6CAA6C,aAAa,gBAAgB,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAA;IAC5H,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAErD,MAAM,YAAY,CAAC,yBAAyB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC3D,OAAO,YAAY,CAAA;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4CAA4C,CAC9D,QAAuB,EACvB,IAA+B;IAE/B,IAAI,QAAQ,CAAC,cAAc,CAAC,MAAM,GAAG,aAAa,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,6CAA6C,aAAa,gBAAgB,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC,CAAA;IAC/H,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAErD,MAAM,YAAY,CAAC,8BAA8B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAClE,OAAO,YAAY,CAAA;AACvB,CAAC"}