zkcloudworker 0.17.6 → 0.17.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,305 @@
1
+ import { Field, Option, PublicKey, UInt64, Bool } from "o1js";
2
+ import { Storage } from "../..";
3
+ declare const WhitelistMap_base: typeof import("o1js/dist/node/lib/provable/merkle-tree-indexed").IndexedMerkleMapBase;
4
+ /** Represents the whitelist using an Indexed Merkle Map. */
5
+ export declare class WhitelistMap extends WhitelistMap_base {
6
+ }
7
+ declare const WhitelistMapOption_base: import("o1js/dist/node/lib/provable/types/provable-intf").Provable<Option<import("o1js/dist/node/lib/provable/merkle-tree-indexed").IndexedMerkleMapBase, {
8
+ root: bigint;
9
+ length: bigint;
10
+ data: {
11
+ nodes: (bigint | undefined)[][];
12
+ sortedLeaves: {
13
+ readonly value: bigint;
14
+ readonly key: bigint;
15
+ readonly nextKey: bigint;
16
+ readonly index: number;
17
+ }[];
18
+ };
19
+ }>, {
20
+ root: bigint;
21
+ length: bigint;
22
+ data: {
23
+ nodes: (bigint | undefined)[][];
24
+ sortedLeaves: {
25
+ readonly value: bigint;
26
+ readonly key: bigint;
27
+ readonly nextKey: bigint;
28
+ readonly index: number;
29
+ }[];
30
+ };
31
+ } | undefined> & (new (option: {
32
+ isSome: Bool;
33
+ value: import("o1js/dist/node/lib/provable/merkle-tree-indexed").IndexedMerkleMapBase;
34
+ }) => Option<import("o1js/dist/node/lib/provable/merkle-tree-indexed").IndexedMerkleMapBase, {
35
+ root: bigint;
36
+ length: bigint;
37
+ data: {
38
+ nodes: (bigint | undefined)[][];
39
+ sortedLeaves: {
40
+ readonly value: bigint;
41
+ readonly key: bigint;
42
+ readonly nextKey: bigint;
43
+ readonly index: number;
44
+ }[];
45
+ };
46
+ }>) & {
47
+ fromValue(value: import("o1js/dist/node/lib/provable/merkle-tree-indexed").IndexedMerkleMapBase | {
48
+ root: bigint;
49
+ length: bigint;
50
+ data: {
51
+ nodes: (bigint | undefined)[][];
52
+ sortedLeaves: {
53
+ readonly value: bigint;
54
+ readonly key: bigint;
55
+ readonly nextKey: bigint;
56
+ readonly index: number;
57
+ }[];
58
+ };
59
+ } | {
60
+ isSome: boolean | Bool;
61
+ value: import("o1js/dist/node/lib/provable/merkle-tree-indexed").IndexedMerkleMapBase | {
62
+ root: bigint;
63
+ length: bigint;
64
+ data: {
65
+ nodes: (bigint | undefined)[][];
66
+ sortedLeaves: {
67
+ readonly value: bigint;
68
+ readonly key: bigint;
69
+ readonly nextKey: bigint;
70
+ readonly index: number;
71
+ }[];
72
+ };
73
+ };
74
+ } | undefined): Option<import("o1js/dist/node/lib/provable/merkle-tree-indexed").IndexedMerkleMapBase, {
75
+ root: bigint;
76
+ length: bigint;
77
+ data: {
78
+ nodes: (bigint | undefined)[][];
79
+ sortedLeaves: {
80
+ readonly value: bigint;
81
+ readonly key: bigint;
82
+ readonly nextKey: bigint;
83
+ readonly index: number;
84
+ }[];
85
+ };
86
+ }>;
87
+ from(value?: import("o1js/dist/node/lib/provable/merkle-tree-indexed").IndexedMerkleMapBase | {
88
+ root: bigint;
89
+ length: bigint;
90
+ data: {
91
+ nodes: (bigint | undefined)[][];
92
+ sortedLeaves: {
93
+ readonly value: bigint;
94
+ readonly key: bigint;
95
+ readonly nextKey: bigint;
96
+ readonly index: number;
97
+ }[];
98
+ };
99
+ } | undefined): Option<import("o1js/dist/node/lib/provable/merkle-tree-indexed").IndexedMerkleMapBase, {
100
+ root: bigint;
101
+ length: bigint;
102
+ data: {
103
+ nodes: (bigint | undefined)[][];
104
+ sortedLeaves: {
105
+ readonly value: bigint;
106
+ readonly key: bigint;
107
+ readonly nextKey: bigint;
108
+ readonly index: number;
109
+ }[];
110
+ };
111
+ }>;
112
+ none(): Option<import("o1js/dist/node/lib/provable/merkle-tree-indexed").IndexedMerkleMapBase, {
113
+ root: bigint;
114
+ length: bigint;
115
+ data: {
116
+ nodes: (bigint | undefined)[][];
117
+ sortedLeaves: {
118
+ readonly value: bigint;
119
+ readonly key: bigint;
120
+ readonly nextKey: bigint;
121
+ readonly index: number;
122
+ }[];
123
+ };
124
+ }>;
125
+ };
126
+ export declare class WhitelistMapOption extends WhitelistMapOption_base {
127
+ }
128
+ declare const UInt64Option_base: Omit<import("o1js/dist/node/lib/provable/types/provable-intf").Provable<Option<UInt64, bigint>, bigint | undefined>, "fromFields"> & {
129
+ fromFields: (fields: import("o1js/dist/node/lib/provable/field").Field[]) => Option<UInt64, bigint>;
130
+ } & (new (option: {
131
+ isSome: Bool;
132
+ value: UInt64;
133
+ }) => Option<UInt64, bigint>) & {
134
+ fromValue(value: bigint | UInt64 | {
135
+ isSome: boolean | Bool;
136
+ value: bigint | UInt64;
137
+ } | undefined): Option<UInt64, bigint>;
138
+ from(value?: bigint | UInt64 | undefined): Option<UInt64, bigint>;
139
+ none(): Option<UInt64, bigint>;
140
+ };
141
+ export declare class UInt64Option extends UInt64Option_base {
142
+ }
143
+ declare const WhitelistedAddress_base: (new (value: {
144
+ address: PublicKey;
145
+ amount: UInt64;
146
+ }) => {
147
+ address: PublicKey;
148
+ amount: UInt64;
149
+ }) & {
150
+ _isStruct: true;
151
+ } & Omit<import("o1js/dist/node/lib/provable/types/provable-intf").Provable<{
152
+ address: PublicKey;
153
+ amount: UInt64;
154
+ }, {
155
+ address: {
156
+ x: bigint;
157
+ isOdd: boolean;
158
+ };
159
+ amount: bigint;
160
+ }>, "fromFields"> & {
161
+ fromFields: (fields: import("o1js/dist/node/lib/provable/field").Field[]) => {
162
+ address: PublicKey;
163
+ amount: UInt64;
164
+ };
165
+ } & {
166
+ fromValue: (value: {
167
+ address: PublicKey | {
168
+ x: Field | bigint;
169
+ isOdd: Bool | boolean;
170
+ };
171
+ amount: bigint | UInt64;
172
+ }) => {
173
+ address: PublicKey;
174
+ amount: UInt64;
175
+ };
176
+ toInput: (x: {
177
+ address: PublicKey;
178
+ amount: UInt64;
179
+ }) => {
180
+ fields?: Field[] | undefined;
181
+ packed?: [Field, number][] | undefined;
182
+ };
183
+ toJSON: (x: {
184
+ address: PublicKey;
185
+ amount: UInt64;
186
+ }) => {
187
+ address: string;
188
+ amount: string;
189
+ };
190
+ fromJSON: (x: {
191
+ address: string;
192
+ amount: string;
193
+ }) => {
194
+ address: PublicKey;
195
+ amount: UInt64;
196
+ };
197
+ empty: () => {
198
+ address: PublicKey;
199
+ amount: UInt64;
200
+ };
201
+ };
202
+ export declare class WhitelistedAddress extends WhitelistedAddress_base {
203
+ }
204
+ declare const Whitelist_base: (new (value: {
205
+ root: import("o1js/dist/node/lib/provable/field").Field;
206
+ storage: Storage;
207
+ }) => {
208
+ root: import("o1js/dist/node/lib/provable/field").Field;
209
+ storage: Storage;
210
+ }) & {
211
+ _isStruct: true;
212
+ } & Omit<import("o1js/dist/node/lib/provable/types/provable-intf").Provable<{
213
+ root: import("o1js/dist/node/lib/provable/field").Field;
214
+ storage: Storage;
215
+ }, {
216
+ root: bigint;
217
+ storage: {
218
+ url: bigint[];
219
+ };
220
+ }>, "fromFields"> & {
221
+ fromFields: (fields: import("o1js/dist/node/lib/provable/field").Field[]) => {
222
+ root: import("o1js/dist/node/lib/provable/field").Field;
223
+ storage: Storage;
224
+ };
225
+ } & {
226
+ fromValue: (value: {
227
+ root: string | number | bigint | import("o1js/dist/node/lib/provable/field").Field;
228
+ storage: Storage | {
229
+ url: import("o1js/dist/node/lib/provable/field").Field[] | bigint[];
230
+ };
231
+ }) => {
232
+ root: import("o1js/dist/node/lib/provable/field").Field;
233
+ storage: Storage;
234
+ };
235
+ toInput: (x: {
236
+ root: import("o1js/dist/node/lib/provable/field").Field;
237
+ storage: Storage;
238
+ }) => {
239
+ fields?: Field[] | undefined;
240
+ packed?: [Field, number][] | undefined;
241
+ };
242
+ toJSON: (x: {
243
+ root: import("o1js/dist/node/lib/provable/field").Field;
244
+ storage: Storage;
245
+ }) => {
246
+ root: string;
247
+ storage: {
248
+ url: string[];
249
+ };
250
+ };
251
+ fromJSON: (x: {
252
+ root: string;
253
+ storage: {
254
+ url: string[];
255
+ };
256
+ }) => {
257
+ root: import("o1js/dist/node/lib/provable/field").Field;
258
+ storage: Storage;
259
+ };
260
+ empty: () => {
261
+ root: import("o1js/dist/node/lib/provable/field").Field;
262
+ storage: Storage;
263
+ };
264
+ };
265
+ export declare class Whitelist extends Whitelist_base {
266
+ isNone(): Bool;
267
+ isSome(): Bool;
268
+ load(): Promise<WhitelistMapOption>;
269
+ /**
270
+ * The function fetches a whitelisted amount associated with a given address using a map and returns it
271
+ * as a UInt64Option.
272
+ * @param {PublicKey} address - The `address` parameter is of type `PublicKey`, which represents a
273
+ * public key used in cryptography for various purposes such as encryption, digital signatures, and
274
+ * authentication. In the context of the `fetchWhitelistedAmount` function, the `address` parameter is
275
+ * used to retrieve a whitelisted amount
276
+ * @returns The `fetchWhitelistedAmount` function returns a `Promise` that resolves to a `UInt64Option`
277
+ * object. This object contains a `value` property representing the amount retrieved from a map based
278
+ * on the provided address. The `isSome` property indicates whether the value is present or not.
279
+ * The value is not present if the whitelist is NOT empty and the address is NOT whitelisted.
280
+ * The value is present if the whitelist is NOT empty or the address IS whitelisted.
281
+ * The value is present and equals to UInt64.MAXINT() if the whitelist IS empty.
282
+ */
283
+ getWhitelistedAmount(address: PublicKey): Promise<UInt64Option>;
284
+ static empty(): Whitelist;
285
+ /**
286
+ * Creates a new whitelist and pins it to IPFS.
287
+ * @param params - The parameters for creating the whitelist.
288
+ * @returns A new `Whitelist` instance.
289
+ */
290
+ static create(params: {
291
+ list: WhitelistedAddress[] | {
292
+ address: string;
293
+ amount?: number;
294
+ }[];
295
+ name?: string;
296
+ keyvalues?: {
297
+ key: string;
298
+ value: string;
299
+ }[];
300
+ timeout?: number;
301
+ attempts?: number;
302
+ auth?: string;
303
+ }): Promise<Whitelist>;
304
+ }
305
+ export {};
@@ -0,0 +1,132 @@
1
+ import { Experimental, Struct, Field, Option, Provable, PublicKey, UInt64, Poseidon, } from "o1js";
2
+ import { serializeIndexedMap, createIpfsURL, pinJSON, Storage, sleep, loadIndexedMerkleMap, } from "../..";
3
+ const { IndexedMerkleMap } = Experimental;
4
+ const WHITELIST_HEIGHT = 20;
5
+ /** Represents the whitelist using an Indexed Merkle Map. */
6
+ export class WhitelistMap extends IndexedMerkleMap(WHITELIST_HEIGHT) {
7
+ }
8
+ export class WhitelistMapOption extends Option(WhitelistMap) {
9
+ }
10
+ export class UInt64Option extends Option(UInt64) {
11
+ }
12
+ export class WhitelistedAddress extends Struct({
13
+ address: PublicKey,
14
+ amount: UInt64, // Maximum permitted amount of the transaction
15
+ }) {
16
+ }
17
+ export class Whitelist extends Struct({
18
+ /** The root hash of the Merkle tree representing the whitelist. */
19
+ root: Field,
20
+ /** Off-chain storage information, typically an IPFS hash pointing to the whitelist data. */
21
+ storage: Storage,
22
+ }) {
23
+ isNone() {
24
+ return this.root
25
+ .equals(Field(0))
26
+ .or(Storage.equals(this.storage, Storage.empty()));
27
+ }
28
+ isSome() {
29
+ return this.isNone().not();
30
+ }
31
+ async load() {
32
+ const isNone = this.isNone();
33
+ const map = await Provable.witnessAsync(WhitelistMapOption, async () => {
34
+ if (isNone.toBoolean())
35
+ return WhitelistMapOption.none();
36
+ else
37
+ return WhitelistMapOption.fromValue(await loadIndexedMerkleMap({
38
+ url: createIpfsURL({ hash: this.storage.toString() }),
39
+ type: WhitelistMap,
40
+ }));
41
+ });
42
+ isNone.assertEquals(map.isSome.not());
43
+ const root = Provable.if(map.isSome, map.orElse(new WhitelistMap()).root, Field(0));
44
+ root.equals(this.root);
45
+ return map;
46
+ }
47
+ /**
48
+ * The function fetches a whitelisted amount associated with a given address using a map and returns it
49
+ * as a UInt64Option.
50
+ * @param {PublicKey} address - The `address` parameter is of type `PublicKey`, which represents a
51
+ * public key used in cryptography for various purposes such as encryption, digital signatures, and
52
+ * authentication. In the context of the `fetchWhitelistedAmount` function, the `address` parameter is
53
+ * used to retrieve a whitelisted amount
54
+ * @returns The `fetchWhitelistedAmount` function returns a `Promise` that resolves to a `UInt64Option`
55
+ * object. This object contains a `value` property representing the amount retrieved from a map based
56
+ * on the provided address. The `isSome` property indicates whether the value is present or not.
57
+ * The value is not present if the whitelist is NOT empty and the address is NOT whitelisted.
58
+ * The value is present if the whitelist is NOT empty or the address IS whitelisted.
59
+ * The value is present and equals to UInt64.MAXINT() if the whitelist IS empty.
60
+ */
61
+ async getWhitelistedAmount(address) {
62
+ const map = await this.load();
63
+ const key = Poseidon.hashPacked(PublicKey, address);
64
+ const value = map.orElse(new WhitelistMap()).getOption(key);
65
+ const valueField = value.orElse(UInt64.MAXINT().value);
66
+ valueField.assertLessThanOrEqual(UInt64.MAXINT().value);
67
+ const amount = UInt64.Unsafe.fromField(valueField);
68
+ return new UInt64Option({
69
+ value: amount,
70
+ isSome: value.isSome.or(this.isNone()),
71
+ });
72
+ }
73
+ static empty() {
74
+ return new Whitelist({
75
+ root: Field(0),
76
+ storage: Storage.empty(),
77
+ });
78
+ }
79
+ /**
80
+ * Creates a new whitelist and pins it to IPFS.
81
+ * @param params - The parameters for creating the whitelist.
82
+ * @returns A new `Whitelist` instance.
83
+ */
84
+ static async create(params) {
85
+ const { name = "whitelist.json", keyvalues = [{ key: "library", value: "zkcloudworker" }], timeout = 60 * 1000, attempts = 5, auth, } = params;
86
+ const list = typeof params.list[0].address === "string"
87
+ ? params.list.map((item) => new WhitelistedAddress({
88
+ address: PublicKey.fromBase58(item.address),
89
+ amount: item.amount
90
+ ? UInt64.from(item.amount)
91
+ : UInt64.MAXINT(),
92
+ }))
93
+ : params.list;
94
+ const map = new WhitelistMap();
95
+ for (const item of list) {
96
+ map.insert(Poseidon.hashPacked(PublicKey, item.address), item.amount.toBigInt());
97
+ }
98
+ const serializedMap = serializeIndexedMap(map);
99
+ const json = {
100
+ map: serializedMap,
101
+ whitelist: list.map((item) => ({
102
+ address: item.address.toBase58(),
103
+ amount: Number(item.amount.toBigInt()),
104
+ })),
105
+ };
106
+ let attempt = 0;
107
+ const start = Date.now();
108
+ let hash = await pinJSON({
109
+ data: json,
110
+ name,
111
+ keyvalues,
112
+ auth,
113
+ });
114
+ while (!hash && attempt < attempts && Date.now() - start < timeout) {
115
+ attempt++;
116
+ await sleep(5000 * attempt); // handle rate-limits
117
+ hash = await pinJSON({
118
+ data: json,
119
+ name,
120
+ keyvalues,
121
+ auth,
122
+ });
123
+ }
124
+ if (!hash)
125
+ throw new Error("Failed to pin whitelist");
126
+ return new Whitelist({
127
+ root: map.root,
128
+ storage: Storage.fromString(hash),
129
+ });
130
+ }
131
+ }
132
+ //# sourceMappingURL=whitelist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whitelist.js","sourceRoot":"","sources":["../../../../../../src/mina/token/whitelist.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,8 @@ export interface IndexedMapSerialized {
11
11
  export declare function loadIndexedMerkleMap(params: {
12
12
  url: string;
13
13
  type: ReturnType<typeof IndexedMerkleMap>;
14
+ timeout?: number;
15
+ attempts?: number;
14
16
  }): Promise<import("o1js/dist/node/lib/provable/merkle-tree-indexed").IndexedMerkleMapBase>;
15
17
  export declare function saveIndexedMerkleMap(params: {
16
18
  map: IndexedMerkleMap;
@@ -1,14 +1,24 @@
1
1
  import { Experimental, Field } from "o1js";
2
- import { bigintToBase64, bigintFromBase64 } from "../../cloud";
2
+ import { bigintToBase64, bigintFromBase64, sleep } from "../../cloud";
3
3
  import { pinJSON } from "../storage/pinata";
4
4
  const { IndexedMerkleMap } = Experimental;
5
5
  export async function loadIndexedMerkleMap(params) {
6
- const { url, type } = params;
7
- const response = await fetch(url);
6
+ const { url, type, timeout = 60000, attempts = 5 } = params;
7
+ let attempt = 0;
8
+ const start = Date.now();
9
+ let response = await fetch(url);
10
+ while (!response.ok && attempt < attempts && Date.now() - start < timeout) {
11
+ attempt++;
12
+ await sleep(5000 * attempt); // handle rate limiting
13
+ response = await fetch(url);
14
+ }
8
15
  if (!response.ok) {
9
16
  throw new Error("Failed to fetch IndexedMerkleMap");
10
17
  }
11
- const serializedIndexedMap = (await response.json());
18
+ const json = await response.json();
19
+ const serializedIndexedMap = json.map;
20
+ if (!serializedIndexedMap)
21
+ throw new Error("wrong IndexedMerkleMap json format");
12
22
  const map = deserializeIndexedMerkleMapInternal({
13
23
  serializedIndexedMap,
14
24
  type,
@@ -22,7 +32,7 @@ export async function saveIndexedMerkleMap(params) {
22
32
  const { map, name = "indexed-map", keyvalues, auth } = params;
23
33
  const serialized = serializeIndexedMap(map);
24
34
  const ipfsHash = await pinJSON({
25
- data: serialized,
35
+ data: { map: serialized },
26
36
  name,
27
37
  keyvalues,
28
38
  auth,
@@ -1 +1 @@
1
- {"version":3,"file":"indexed-map.js","sourceRoot":"","sources":["../../../../../../src/mina/utils/indexed-map.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"indexed-map.js","sourceRoot":"","sources":["../../../../../../src/mina/utils/indexed-map.ts"],"names":[],"mappings":"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"}