zkcloudworker 0.18.12 → 0.18.15

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 (162) hide show
  1. package/dist/node/index.cjs +4055 -0
  2. package/package.json +5 -8
  3. package/dist/ts/index.cjs +0 -418768
  4. package/dist/ts/mina/token/FungibleToken.d.ts +0 -338
  5. package/dist/ts/mina/token/FungibleToken.js +0 -292
  6. package/dist/ts/mina/token/FungibleToken.js.map +0 -1
  7. package/dist/web/mina/token/FungibleToken.d.ts +0 -338
  8. package/dist/web/mina/token/FungibleToken.js +0 -292
  9. package/dist/web/mina/token/FungibleToken.js.map +0 -1
  10. /package/dist/{ts → node}/cloud/config.d.ts +0 -0
  11. /package/dist/{ts → node}/cloud/config.js +0 -0
  12. /package/dist/{ts → node}/cloud/config.js.map +0 -0
  13. /package/dist/{ts → node}/cloud/index.d.ts +0 -0
  14. /package/dist/{ts → node}/cloud/index.js +0 -0
  15. /package/dist/{ts → node}/cloud/index.js.map +0 -0
  16. /package/dist/{ts → node}/cloud/networks.d.ts +0 -0
  17. /package/dist/{ts → node}/cloud/networks.js +0 -0
  18. /package/dist/{ts → node}/cloud/networks.js.map +0 -0
  19. /package/dist/{ts → node}/cloud/utils/base64.d.ts +0 -0
  20. /package/dist/{ts → node}/cloud/utils/base64.js +0 -0
  21. /package/dist/{ts → node}/cloud/utils/base64.js.map +0 -0
  22. /package/dist/{ts → node}/cloud/utils/graphql.d.ts +0 -0
  23. /package/dist/{ts → node}/cloud/utils/graphql.js +0 -0
  24. /package/dist/{ts → node}/cloud/utils/graphql.js.map +0 -0
  25. /package/dist/{ts → node}/cloud/utils/index.d.ts +0 -0
  26. /package/dist/{ts → node}/cloud/utils/index.js +0 -0
  27. /package/dist/{ts → node}/cloud/utils/index.js.map +0 -0
  28. /package/dist/{ts → node}/cloud/utils/utils.d.ts +0 -0
  29. /package/dist/{ts → node}/cloud/utils/utils.js +0 -0
  30. /package/dist/{ts → node}/cloud/utils/utils.js.map +0 -0
  31. /package/dist/{ts → node}/cloud/worker/cloud.d.ts +0 -0
  32. /package/dist/{ts → node}/cloud/worker/cloud.js +0 -0
  33. /package/dist/{ts → node}/cloud/worker/cloud.js.map +0 -0
  34. /package/dist/{ts → node}/cloud/worker/index.d.ts +0 -0
  35. /package/dist/{ts → node}/cloud/worker/index.js +0 -0
  36. /package/dist/{ts → node}/cloud/worker/index.js.map +0 -0
  37. /package/dist/{ts → node}/cloud/worker/job.d.ts +0 -0
  38. /package/dist/{ts → node}/cloud/worker/job.js +0 -0
  39. /package/dist/{ts → node}/cloud/worker/job.js.map +0 -0
  40. /package/dist/{ts → node}/cloud/worker/task.d.ts +0 -0
  41. /package/dist/{ts → node}/cloud/worker/task.js +0 -0
  42. /package/dist/{ts → node}/cloud/worker/task.js.map +0 -0
  43. /package/dist/{ts → node}/cloud/worker/transaction.d.ts +0 -0
  44. /package/dist/{ts → node}/cloud/worker/transaction.js +0 -0
  45. /package/dist/{ts → node}/cloud/worker/transaction.js.map +0 -0
  46. /package/dist/{ts → node}/cloud/worker/worker.d.ts +0 -0
  47. /package/dist/{ts → node}/cloud/worker/worker.js +0 -0
  48. /package/dist/{ts → node}/cloud/worker/worker.js.map +0 -0
  49. /package/dist/{ts → node}/index.d.ts +0 -0
  50. /package/dist/{ts → node}/index.js +0 -0
  51. /package/dist/{ts → node}/index.js.map +0 -0
  52. /package/dist/{ts → node}/mina/api/api.d.ts +0 -0
  53. /package/dist/{ts → node}/mina/api/api.js +0 -0
  54. /package/dist/{ts → node}/mina/api/api.js.map +0 -0
  55. /package/dist/{ts → node}/mina/index.d.ts +0 -0
  56. /package/dist/{ts → node}/mina/index.js +0 -0
  57. /package/dist/{ts → node}/mina/index.js.map +0 -0
  58. /package/dist/{ts → node}/mina/local/local.d.ts +0 -0
  59. /package/dist/{ts → node}/mina/local/local.js +0 -0
  60. /package/dist/{ts → node}/mina/local/local.js.map +0 -0
  61. /package/dist/{ts → node}/mina/storage/index.d.ts +0 -0
  62. /package/dist/{ts → node}/mina/storage/index.js +0 -0
  63. /package/dist/{ts → node}/mina/storage/index.js.map +0 -0
  64. /package/dist/{ts → node}/mina/storage/ipfs.d.ts +0 -0
  65. /package/dist/{ts → node}/mina/storage/ipfs.js +0 -0
  66. /package/dist/{ts → node}/mina/storage/ipfs.js.map +0 -0
  67. /package/dist/{ts → node}/mina/storage/pinata.d.ts +0 -0
  68. /package/dist/{ts → node}/mina/storage/pinata.js +0 -0
  69. /package/dist/{ts → node}/mina/storage/pinata.js.map +0 -0
  70. /package/dist/{ts → node}/mina/storage/storage.d.ts +0 -0
  71. /package/dist/{ts → node}/mina/storage/storage.js +0 -0
  72. /package/dist/{ts → node}/mina/storage/storage.js.map +0 -0
  73. /package/dist/{ts → node}/mina/token/FungibleTokenAdmin.d.ts +0 -0
  74. /package/dist/{ts → node}/mina/token/FungibleTokenAdmin.js +0 -0
  75. /package/dist/{ts → node}/mina/token/FungibleTokenAdmin.js.map +0 -0
  76. /package/dist/{ts → node}/mina/token/FungibleTokenContract.d.ts +0 -0
  77. /package/dist/{ts → node}/mina/token/FungibleTokenContract.js +0 -0
  78. /package/dist/{ts → node}/mina/token/FungibleTokenContract.js.map +0 -0
  79. /package/dist/{ts → node}/mina/token/FungibleTokenWhitelistedAdmin.d.ts +0 -0
  80. /package/dist/{ts → node}/mina/token/FungibleTokenWhitelistedAdmin.js +0 -0
  81. /package/dist/{ts → node}/mina/token/FungibleTokenWhitelistedAdmin.js.map +0 -0
  82. /package/dist/{ts → node}/mina/token/api.d.ts +0 -0
  83. /package/dist/{ts → node}/mina/token/api.js +0 -0
  84. /package/dist/{ts → node}/mina/token/api.js.map +0 -0
  85. /package/dist/{ts → node}/mina/token/bid.d.ts +0 -0
  86. /package/dist/{ts → node}/mina/token/bid.js +0 -0
  87. /package/dist/{ts → node}/mina/token/bid.js.map +0 -0
  88. /package/dist/{ts → node}/mina/token/build.d.ts +0 -0
  89. /package/dist/{ts → node}/mina/token/build.js +0 -0
  90. /package/dist/{ts → node}/mina/token/build.js.map +0 -0
  91. /package/dist/{ts → node}/mina/token/fee.d.ts +0 -0
  92. /package/dist/{ts → node}/mina/token/fee.js +0 -0
  93. /package/dist/{ts → node}/mina/token/fee.js.map +0 -0
  94. /package/dist/{ts → node}/mina/token/index.d.ts +0 -0
  95. /package/dist/{ts → node}/mina/token/index.js +0 -0
  96. /package/dist/{ts → node}/mina/token/index.js.map +0 -0
  97. /package/dist/{ts → node}/mina/token/offer.d.ts +0 -0
  98. /package/dist/{ts → node}/mina/token/offer.js +0 -0
  99. /package/dist/{ts → node}/mina/token/offer.js.map +0 -0
  100. /package/dist/{ts → node}/mina/token/token.d.ts +0 -0
  101. /package/dist/{ts → node}/mina/token/token.js +0 -0
  102. /package/dist/{ts → node}/mina/token/token.js.map +0 -0
  103. /package/dist/{ts → node}/mina/token/vk.d.ts +0 -0
  104. /package/dist/{ts → node}/mina/token/vk.js +0 -0
  105. /package/dist/{ts → node}/mina/token/vk.js.map +0 -0
  106. /package/dist/{ts → node}/mina/token/whitelist.d.ts +0 -0
  107. /package/dist/{ts → node}/mina/token/whitelist.js +0 -0
  108. /package/dist/{ts → node}/mina/token/whitelist.js.map +0 -0
  109. /package/dist/{ts → node}/mina/transactions/account.d.ts +0 -0
  110. /package/dist/{ts → node}/mina/transactions/account.js +0 -0
  111. /package/dist/{ts → node}/mina/transactions/account.js.map +0 -0
  112. /package/dist/{ts → node}/mina/transactions/blockberry.d.ts +0 -0
  113. /package/dist/{ts → node}/mina/transactions/blockberry.js +0 -0
  114. /package/dist/{ts → node}/mina/transactions/blockberry.js.map +0 -0
  115. /package/dist/{ts → node}/mina/transactions/chain.d.ts +0 -0
  116. /package/dist/{ts → node}/mina/transactions/chain.js +0 -0
  117. /package/dist/{ts → node}/mina/transactions/chain.js.map +0 -0
  118. /package/dist/{ts → node}/mina/transactions/index.d.ts +0 -0
  119. /package/dist/{ts → node}/mina/transactions/index.js +0 -0
  120. /package/dist/{ts → node}/mina/transactions/index.js.map +0 -0
  121. /package/dist/{ts → node}/mina/transactions/nonce.d.ts +0 -0
  122. /package/dist/{ts → node}/mina/transactions/nonce.js +0 -0
  123. /package/dist/{ts → node}/mina/transactions/nonce.js.map +0 -0
  124. /package/dist/{ts → node}/mina/transactions/send.d.ts +0 -0
  125. /package/dist/{ts → node}/mina/transactions/send.js +0 -0
  126. /package/dist/{ts → node}/mina/transactions/send.js.map +0 -0
  127. /package/dist/{ts → node}/mina/transactions/tiny-contract.d.ts +0 -0
  128. /package/dist/{ts → node}/mina/transactions/tiny-contract.js +0 -0
  129. /package/dist/{ts → node}/mina/transactions/tiny-contract.js.map +0 -0
  130. /package/dist/{ts → node}/mina/transactions/transaction.d.ts +0 -0
  131. /package/dist/{ts → node}/mina/transactions/transaction.js +0 -0
  132. /package/dist/{ts → node}/mina/transactions/transaction.js.map +0 -0
  133. /package/dist/{ts → node}/mina/transactions/txstatus.d.ts +0 -0
  134. /package/dist/{ts → node}/mina/transactions/txstatus.js +0 -0
  135. /package/dist/{ts → node}/mina/transactions/txstatus.js.map +0 -0
  136. /package/dist/{ts → node}/mina/utils/base64.d.ts +0 -0
  137. /package/dist/{ts → node}/mina/utils/base64.js +0 -0
  138. /package/dist/{ts → node}/mina/utils/base64.js.map +0 -0
  139. /package/dist/{ts → node}/mina/utils/fee.d.ts +0 -0
  140. /package/dist/{ts → node}/mina/utils/fee.js +0 -0
  141. /package/dist/{ts → node}/mina/utils/fee.js.map +0 -0
  142. /package/dist/{ts → node}/mina/utils/fetch.d.ts +0 -0
  143. /package/dist/{ts → node}/mina/utils/fetch.js +0 -0
  144. /package/dist/{ts → node}/mina/utils/fetch.js.map +0 -0
  145. /package/dist/{ts → node}/mina/utils/fields.d.ts +0 -0
  146. /package/dist/{ts → node}/mina/utils/fields.js +0 -0
  147. /package/dist/{ts → node}/mina/utils/fields.js.map +0 -0
  148. /package/dist/{ts → node}/mina/utils/index.d.ts +0 -0
  149. /package/dist/{ts → node}/mina/utils/index.js +0 -0
  150. /package/dist/{ts → node}/mina/utils/index.js.map +0 -0
  151. /package/dist/{ts → node}/mina/utils/indexed-map.d.ts +0 -0
  152. /package/dist/{ts → node}/mina/utils/indexed-map.js +0 -0
  153. /package/dist/{ts → node}/mina/utils/indexed-map.js.map +0 -0
  154. /package/dist/{ts → node}/mina/utils/mina.d.ts +0 -0
  155. /package/dist/{ts → node}/mina/utils/mina.js +0 -0
  156. /package/dist/{ts → node}/mina/utils/mina.js.map +0 -0
  157. /package/dist/{ts → node}/mina/verification/index.d.ts +0 -0
  158. /package/dist/{ts → node}/mina/verification/index.js +0 -0
  159. /package/dist/{ts → node}/mina/verification/index.js.map +0 -0
  160. /package/dist/{ts → node}/mina/verification/verification.d.ts +0 -0
  161. /package/dist/{ts → node}/mina/verification/verification.js +0 -0
  162. /package/dist/{ts → node}/mina/verification/verification.js.map +0 -0
@@ -0,0 +1,4055 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // dist/node/index.js
31
+ var node_exports = {};
32
+ __export(node_exports, {
33
+ Cloud: () => Cloud,
34
+ Devnet: () => Devnet,
35
+ FungibleToken: () => FungibleToken,
36
+ FungibleTokenAdmin: () => FungibleTokenAdmin,
37
+ FungibleTokenBidContract: () => FungibleTokenBidContract,
38
+ FungibleTokenOfferContract: () => FungibleTokenOfferContract,
39
+ FungibleTokenWhitelistedAdmin: () => FungibleTokenWhitelistedAdmin,
40
+ LAUNCH_FEE: () => LAUNCH_FEE,
41
+ Lightnet: () => Lightnet,
42
+ Local: () => Local,
43
+ LocalCloud: () => LocalCloud,
44
+ LocalStorage: () => LocalStorage,
45
+ Mainnet: () => Mainnet,
46
+ Memory: () => Memory,
47
+ Storage: () => Storage,
48
+ TRANSACTION_FEE: () => TRANSACTION_FEE,
49
+ TinyContract: () => TinyContract,
50
+ TokenAPI: () => TokenAPI,
51
+ UInt64Option: () => UInt64Option,
52
+ Whitelist: () => Whitelist,
53
+ WhitelistMap: () => WhitelistMap,
54
+ WhitelistMapOption: () => WhitelistMapOption,
55
+ WhitelistedAddress: () => WhitelistedAddress,
56
+ WhitelistedFungibleToken: () => WhitelistedFungibleToken,
57
+ Zeko: () => Zeko,
58
+ accountBalance: () => accountBalance,
59
+ accountBalanceMina: () => accountBalanceMina,
60
+ accountExists: () => accountExists,
61
+ bigintFromBase56: () => bigintFromBase56,
62
+ bigintFromBase64: () => bigintFromBase64,
63
+ bigintToBase56: () => bigintToBase56,
64
+ bigintToBase64: () => bigintToBase64,
65
+ buildTokenDeployTransaction: () => buildTokenDeployTransaction,
66
+ buildTokenTransaction: () => buildTokenTransaction,
67
+ checkAddress: () => checkAddress,
68
+ checkMinaZkappTransaction: () => checkMinaZkappTransaction,
69
+ createIpfsURL: () => createIpfsURL,
70
+ currentNetwork: () => currentNetwork,
71
+ defaultToken: () => defaultToken,
72
+ deserializeFields: () => deserializeFields,
73
+ deserializeIndexedMerkleMap: () => deserializeIndexedMerkleMap,
74
+ deserializeTransaction: () => deserializeTransaction,
75
+ fee: () => fee,
76
+ fetchMinaAccount: () => fetchMinaAccount,
77
+ fetchMinaActions: () => fetchMinaActions,
78
+ fieldFromBase56: () => fieldFromBase56,
79
+ fieldFromBase64: () => fieldFromBase64,
80
+ fieldToBase56: () => fieldToBase56,
81
+ fieldToBase64: () => fieldToBase64,
82
+ formatTime: () => formatTime,
83
+ fromBase: () => fromBase,
84
+ fungibleTokenVerificationKeys: () => fungibleTokenVerificationKeys,
85
+ getAccountFromGraphQL: () => getAccountFromGraphQL,
86
+ getAccountNonce: () => getAccountNonce,
87
+ getBalanceFromGraphQL: () => getBalanceFromGraphQL,
88
+ getCurrentNetwork: () => getCurrentNetwork,
89
+ getDeployer: () => getDeployer,
90
+ getNetworkIdHash: () => getNetworkIdHash,
91
+ getNonce: () => getNonce,
92
+ getPaymentTxsFromBlockBerry: () => getPaymentTxsFromBlockBerry,
93
+ getTokenSymbolAndAdmin: () => getTokenSymbolAndAdmin,
94
+ getTxStatusFast: () => getTxStatusFast,
95
+ getZkAppFromBlockBerry: () => getZkAppFromBlockBerry,
96
+ getZkAppTxFromBlockBerry: () => getZkAppTxFromBlockBerry,
97
+ getZkAppTxsFromBlockBerry: () => getZkAppTxsFromBlockBerry,
98
+ initBlockchain: () => initBlockchain,
99
+ loadIndexedMerkleMap: () => loadIndexedMerkleMap,
100
+ makeString: () => makeString,
101
+ networks: () => networks,
102
+ parseIndexedMapSerialized: () => parseIndexedMapSerialized,
103
+ pinJSON: () => pinJSON,
104
+ saveIndexedMerkleMap: () => saveIndexedMerkleMap,
105
+ sendTx: () => sendTx,
106
+ serializeFields: () => serializeFields,
107
+ serializeIndexedMap: () => serializeIndexedMap,
108
+ serializeTransaction: () => serializeTransaction,
109
+ sleep: () => sleep,
110
+ toBase: () => toBase,
111
+ tokenBalance: () => tokenBalance,
112
+ tokenVerificationKeys: () => tokenVerificationKeys,
113
+ transactionParams: () => transactionParams,
114
+ txStatusBlockberry: () => txStatusBlockberry,
115
+ zkCloudWorker: () => zkCloudWorker,
116
+ zkCloudWorkerClient: () => zkCloudWorkerClient
117
+ });
118
+ module.exports = __toCommonJS(node_exports);
119
+
120
+ // dist/node/cloud/utils/graphql.js
121
+ var defaultToken = "wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf";
122
+ async function getBalanceFromGraphQL(params) {
123
+ const { publicKey, mina } = params;
124
+ const tokenId = params.tokenId ?? defaultToken;
125
+ if (mina.length === 0)
126
+ throw new Error("no mina endpoints provided");
127
+ const account = await fetchAccountInternal({
128
+ publicKey,
129
+ tokenId,
130
+ mina,
131
+ queryType: "balance"
132
+ });
133
+ const balance = account?.account?.balance?.total;
134
+ return balance ? BigInt(balance) : 0n;
135
+ }
136
+ async function getAccountFromGraphQL(params) {
137
+ const { publicKey, mina } = params;
138
+ const tokenId = params.tokenId ?? defaultToken;
139
+ if (mina.length === 0)
140
+ throw new Error("no mina endpoints provided");
141
+ const account = await fetchAccountInternal({
142
+ publicKey,
143
+ tokenId,
144
+ mina,
145
+ queryType: "account"
146
+ });
147
+ return account?.account;
148
+ }
149
+ async function fetchAccountInternal(params) {
150
+ const { publicKey, tokenId, mina, timeout, queryType } = params;
151
+ const query = queryType === "balance" ? balanceQuery(publicKey, tokenId) : accountQuery(publicKey, tokenId);
152
+ let [response, error] = await makeGraphqlRequest({
153
+ query,
154
+ mina,
155
+ timeout
156
+ });
157
+ if (error !== void 0)
158
+ return { account: void 0, error };
159
+ const account = response?.data?.account;
160
+ if (!account) {
161
+ return {
162
+ account: void 0,
163
+ error: {
164
+ statusCode: 404,
165
+ statusText: `fetchAccount: Account with public key ${publicKey} does not exist.`
166
+ }
167
+ };
168
+ }
169
+ return {
170
+ account,
171
+ error: void 0
172
+ };
173
+ }
174
+ async function makeGraphqlRequest(params) {
175
+ const defaultTimeout = 5 * 60 * 1e3;
176
+ const timeout = params.timeout ?? defaultTimeout;
177
+ const { query, mina } = params;
178
+ const graphqlEndpoint = mina[0];
179
+ const fallbackEndpoints = mina.slice(1);
180
+ if (graphqlEndpoint === "none")
181
+ throw Error("Should have made a graphql request, but don't know to which endpoint.");
182
+ let timeouts = [];
183
+ const clearTimeouts = () => {
184
+ timeouts.forEach((t) => clearTimeout(t));
185
+ timeouts = [];
186
+ };
187
+ const makeRequest = async (url) => {
188
+ const controller = new AbortController();
189
+ const timer = setTimeout(() => controller.abort(), timeout);
190
+ timeouts.push(timer);
191
+ let body = JSON.stringify({
192
+ operationName: null,
193
+ query,
194
+ variables: {}
195
+ });
196
+ try {
197
+ let response = await fetch(url, {
198
+ method: "POST",
199
+ headers: { "Content-Type": "application/json" },
200
+ body,
201
+ signal: controller.signal
202
+ });
203
+ return checkResponseStatus(response);
204
+ } finally {
205
+ clearTimeouts();
206
+ }
207
+ };
208
+ let timeoutErrors = [];
209
+ let urls = [graphqlEndpoint, ...fallbackEndpoints];
210
+ for (let i = 0; i < urls.length; i += 2) {
211
+ let url1 = urls[i];
212
+ let url2 = urls[i + 1];
213
+ if (url2 === void 0) {
214
+ try {
215
+ return await makeRequest(url1);
216
+ } catch (error) {
217
+ return [void 0, inferError(error)];
218
+ }
219
+ }
220
+ try {
221
+ return await Promise.race([makeRequest(url1), makeRequest(url2)]);
222
+ } catch (unknownError) {
223
+ let error = inferError(unknownError);
224
+ if (error.statusCode === 408) {
225
+ timeoutErrors.push({ url1, url2, error });
226
+ } else {
227
+ return [void 0, error];
228
+ }
229
+ }
230
+ }
231
+ const statusText = timeoutErrors.map(({ url1, url2, error }) => `Request to ${url1} and ${url2} timed out. Error: ${error}`).join("\n");
232
+ return [void 0, { statusCode: 408, statusText }];
233
+ }
234
+ function inferError(error) {
235
+ let errorMessage = JSON.stringify(error);
236
+ if (error instanceof AbortSignal) {
237
+ return { statusCode: 408, statusText: `Request Timeout: ${errorMessage}` };
238
+ } else {
239
+ return {
240
+ statusCode: 500,
241
+ statusText: `Unknown Error: ${errorMessage}`
242
+ };
243
+ }
244
+ }
245
+ async function checkResponseStatus(response) {
246
+ if (response.ok) {
247
+ const jsonResponse = await response.json();
248
+ if (jsonResponse.errors && jsonResponse.errors.length > 0) {
249
+ return [
250
+ void 0,
251
+ {
252
+ statusCode: response.status,
253
+ statusText: jsonResponse.errors.map((error) => error.message).join("\n")
254
+ }
255
+ ];
256
+ } else if (jsonResponse.data === void 0) {
257
+ return [
258
+ void 0,
259
+ {
260
+ statusCode: response.status,
261
+ statusText: `GraphQL response data is undefined`
262
+ }
263
+ ];
264
+ }
265
+ return [jsonResponse, void 0];
266
+ } else {
267
+ return [
268
+ void 0,
269
+ {
270
+ statusCode: response.status,
271
+ statusText: response.statusText
272
+ }
273
+ ];
274
+ }
275
+ }
276
+ var balanceQuery = (publicKey, tokenId) => `{
277
+ account(publicKey: "${publicKey}", token: "${tokenId}") {
278
+ balance { total }
279
+ }
280
+ }
281
+ `;
282
+ var accountQuery = (publicKey, tokenId) => `{
283
+ account(publicKey: "${publicKey}", token: "${tokenId}") {
284
+ publicKey
285
+ token
286
+ nonce
287
+ balance { total }
288
+ tokenSymbol
289
+ receiptChainHash
290
+ timing {
291
+ initialMinimumBalance
292
+ cliffTime
293
+ cliffAmount
294
+ vestingPeriod
295
+ vestingIncrement
296
+ }
297
+ permissions {
298
+ editState
299
+ access
300
+ send
301
+ receive
302
+ setDelegate
303
+ setPermissions
304
+ setVerificationKey {
305
+ auth
306
+ txnVersion
307
+ }
308
+ setZkappUri
309
+ editActionState
310
+ setTokenSymbol
311
+ incrementNonce
312
+ setVotingFor
313
+ setTiming
314
+ }
315
+ delegateAccount { publicKey }
316
+ votingFor
317
+ zkappState
318
+ verificationKey {
319
+ verificationKey
320
+ hash
321
+ }
322
+ actionState
323
+ provedState
324
+ zkappUri
325
+ }
326
+ }
327
+ `;
328
+
329
+ // dist/node/cloud/utils/utils.js
330
+ function sleep(ms) {
331
+ return new Promise((resolve) => setTimeout(resolve, ms));
332
+ }
333
+ function makeString(length) {
334
+ let outString = ``;
335
+ const inOptions = `ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`;
336
+ for (let i = 0; i < length; i++) {
337
+ outString += inOptions.charAt(Math.floor(Math.random() * inOptions.length));
338
+ }
339
+ return outString;
340
+ }
341
+ function formatTime(ms) {
342
+ if (ms === void 0)
343
+ return "";
344
+ if (ms < 1e3)
345
+ return ms.toString() + " ms";
346
+ if (ms < 60 * 1e3)
347
+ return parseInt((ms / 1e3).toString()).toString() + " sec";
348
+ if (ms < 60 * 60 * 1e3) {
349
+ const minutes = parseInt((ms / 1e3 / 60).toString());
350
+ const seconds = parseInt(((ms - minutes * 60 * 1e3) / 1e3).toString());
351
+ return minutes.toString() + " min " + seconds.toString() + " sec";
352
+ } else {
353
+ const hours = parseInt((ms / 1e3 / 60 / 60).toString());
354
+ const minutes = parseInt(((ms - hours * 60 * 60 * 1e3) / 1e3 / 60).toString());
355
+ return hours.toString() + " h " + minutes.toString() + " min";
356
+ }
357
+ }
358
+ var Memory = class _Memory {
359
+ constructor() {
360
+ _Memory.rss = 0;
361
+ }
362
+ // eslint-disable-next-line @typescript-eslint/no-inferrable-types
363
+ static info(description = ``, fullInfo = false) {
364
+ const memoryData = process.memoryUsage();
365
+ const formatMemoryUsage = (data) => `${Math.round(data / 1024 / 1024)} MB`;
366
+ const oldRSS = _Memory.rss;
367
+ _Memory.rss = Math.round(memoryData.rss / 1024 / 1024);
368
+ const memoryUsage = fullInfo ? {
369
+ step: `${description}:`,
370
+ rssDelta: `${(oldRSS === 0 ? 0 : _Memory.rss - oldRSS).toString()} MB -> Resident Set Size memory change`,
371
+ rss: `${formatMemoryUsage(memoryData.rss)} -> Resident Set Size - total memory allocated`,
372
+ heapTotal: `${formatMemoryUsage(memoryData.heapTotal)} -> total size of the allocated heap`,
373
+ heapUsed: `${formatMemoryUsage(memoryData.heapUsed)} -> actual memory used during the execution`,
374
+ external: `${formatMemoryUsage(memoryData.external)} -> V8 external memory`
375
+ } : `RSS memory ${description}: ${formatMemoryUsage(memoryData.rss)}${oldRSS === 0 ? `` : `, changed by ` + (_Memory.rss - oldRSS).toString() + ` MB`}`;
376
+ console.log(memoryUsage);
377
+ }
378
+ };
379
+ Memory.rss = 0;
380
+
381
+ // dist/node/cloud/utils/base64.js
382
+ var TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
383
+ function bigintToBase56(value) {
384
+ const digits = toBase(value, 56n);
385
+ const str = digits.map((x) => TABLE[Number(x)]).join("");
386
+ return str;
387
+ }
388
+ function bigintFromBase56(str) {
389
+ const base56Digits = str.split("").map((x2) => BigInt(TABLE.indexOf(x2)));
390
+ const x = fromBase(base56Digits, 56n);
391
+ return x;
392
+ }
393
+ function bigintToBase64(value) {
394
+ const digits = toBase(value, 64n);
395
+ const str = digits.map((x) => TABLE[Number(x)]).join("");
396
+ return str;
397
+ }
398
+ function bigintFromBase64(str) {
399
+ const base64Digits = str.split("").map((x2) => BigInt(TABLE.indexOf(x2)));
400
+ const x = fromBase(base64Digits, 64n);
401
+ return x;
402
+ }
403
+ function fromBase(digits, base) {
404
+ if (base <= 0n)
405
+ throw Error("fromBase: base must be positive");
406
+ let basePowers = [];
407
+ for (let power = base, n = 1; n < digits.length; power **= 2n, n *= 2) {
408
+ basePowers.push(power);
409
+ }
410
+ let k = basePowers.length;
411
+ digits = digits.concat(Array(2 ** k - digits.length).fill(0n));
412
+ for (let i = 0; i < k; i++) {
413
+ let newDigits = Array(digits.length >> 1);
414
+ let basePower = basePowers[i];
415
+ for (let j = 0; j < newDigits.length; j++) {
416
+ newDigits[j] = digits[2 * j] + basePower * digits[2 * j + 1];
417
+ }
418
+ digits = newDigits;
419
+ }
420
+ console.assert(digits.length === 1);
421
+ let [digit] = digits;
422
+ return digit;
423
+ }
424
+ function toBase(x, base) {
425
+ if (base <= 0n)
426
+ throw Error("toBase: base must be positive");
427
+ let basePowers = [];
428
+ for (let power = base; power <= x; power **= 2n) {
429
+ basePowers.push(power);
430
+ }
431
+ let digits = [x];
432
+ let k = basePowers.length;
433
+ for (let i = 0; i < k; i++) {
434
+ let newDigits = Array(2 * digits.length);
435
+ let basePower = basePowers[k - 1 - i];
436
+ for (let j = 0; j < digits.length; j++) {
437
+ let x2 = digits[j];
438
+ let high = x2 / basePower;
439
+ newDigits[2 * j + 1] = high;
440
+ newDigits[2 * j] = x2 - high * basePower;
441
+ }
442
+ digits = newDigits;
443
+ }
444
+ while (digits[digits.length - 1] === 0n) {
445
+ digits.pop();
446
+ }
447
+ return digits;
448
+ }
449
+
450
+ // dist/node/cloud/worker/cloud.js
451
+ var Cloud = class {
452
+ /**
453
+ * Constructor for the Cloud class
454
+ * @param params the parameters for the Cloud class
455
+ * @param params.id the id of the user
456
+ * @param params.jobId the job id
457
+ * @param params.stepId the step id
458
+ * @param params.taskId the task id
459
+ * @param params.cache the cache folder. Use it to get the Cache object: cache = Cache.FileSystem(this.cloud.cache);
460
+ * @param params.developer the developer id
461
+ * @param params.repo the repo id
462
+ * @param params.task the task id
463
+ * @param params.userId the user id
464
+ * @param params.args the arguments, should be a string or serialized JSON
465
+ * @param params.metadata the metadata, should be a string or serialized JSON
466
+ * @param params.chain the blockchain network
467
+ * @param params.isLocalCloud a boolean to check if the cloud is local or not
468
+ */
469
+ constructor(params) {
470
+ const { id, jobId, stepId, taskId, cache, developer, repo, task, userId, args, metadata, isLocalCloud, chain } = params;
471
+ this.id = id;
472
+ this.jobId = jobId;
473
+ this.stepId = stepId;
474
+ this.taskId = taskId;
475
+ this.cache = cache;
476
+ this.developer = developer;
477
+ this.repo = repo;
478
+ this.task = task;
479
+ this.userId = userId;
480
+ this.args = args;
481
+ this.metadata = metadata;
482
+ this.isLocalCloud = isLocalCloud ?? false;
483
+ this.chain = chain;
484
+ }
485
+ };
486
+
487
+ // dist/node/cloud/worker/worker.js
488
+ var zkCloudWorker = class {
489
+ /**
490
+ * Constructor for the zkCloudWorker class
491
+ * @param cloud the cloud instance provided by the zkCloudWorker in the local environment or in the cloud
492
+ */
493
+ constructor(cloud) {
494
+ this.cloud = cloud;
495
+ }
496
+ // Those methods should be implemented for recursive proofs calculations
497
+ /**
498
+ * Creates a new proof from a transaction
499
+ * @param transaction the transaction
500
+ * @returns the serialized proof
501
+ */
502
+ async create(transaction) {
503
+ return void 0;
504
+ }
505
+ /**
506
+ * Merges two proofs
507
+ * @param proof1 the first proof
508
+ * @param proof2 the second proof
509
+ * @returns the merged proof
510
+ */
511
+ async merge(proof1, proof2) {
512
+ return void 0;
513
+ }
514
+ // Those methods should be implemented for anything except for recursive proofs
515
+ /**
516
+ * Executes the transactions
517
+ * @param transactions the transactions, can be empty list
518
+ * @returns the result
519
+ */
520
+ async execute(transactions) {
521
+ return void 0;
522
+ }
523
+ /* Process the transactions received by the cloud
524
+ * @param transactions: the transactions
525
+ */
526
+ async processTransactions(transactions) {
527
+ }
528
+ /**
529
+ * process the task defined by the developer
530
+ * @returns the result
531
+ */
532
+ async task() {
533
+ return void 0;
534
+ }
535
+ };
536
+
537
+ // dist/node/cloud/config.js
538
+ var config = {
539
+ MINAFEE: "200000000",
540
+ ZKCLOUDWORKER_AUTH: "M6t4jtbBAFFXhLERHQWyEB9JA9xi4cWqmYduaCXtbrFjb7yaY7TyaXDunKDJNiUTBEcyUomNXJgC",
541
+ ZKCLOUDWORKER_API: "https://api.zkcloudworker.com/v1/",
542
+ ZKCLOUDWORKER_NATS: "https://cloud.zkcloudworker.com:4222",
543
+ ZKCLOUDWORKER_NATS_WS: "wss://cloud.zkcloudworker.com:4223"
544
+ };
545
+ var config_default = config;
546
+
547
+ // dist/node/cloud/networks.js
548
+ var Mainnet = {
549
+ mina: [
550
+ //"https://proxy.devnet.minaexplorer.com/graphql",
551
+ "https://api.minascan.io/node/mainnet/v1/graphql"
552
+ ],
553
+ archive: [
554
+ "https://api.minascan.io/archive/mainnet/v1/graphql"
555
+ //"https://archive.devnet.minaexplorer.com",
556
+ ],
557
+ explorerAccountUrl: "https://minascan.io/mainnet/account/",
558
+ explorerTransactionUrl: "https://minascan.io/mainnet/tx/",
559
+ chainId: "mainnet",
560
+ name: "Mainnet"
561
+ };
562
+ var Local = {
563
+ mina: [],
564
+ archive: [],
565
+ chainId: "local"
566
+ };
567
+ var Devnet = {
568
+ mina: [
569
+ "https://api.minascan.io/node/devnet/v1/graphql"
570
+ //"https://proxy.devnet.minaexplorer.com/graphql",
571
+ ],
572
+ archive: [
573
+ "https://api.minascan.io/archive/devnet/v1/graphql"
574
+ //"https://archive.devnet.minaexplorer.com",
575
+ ],
576
+ explorerAccountUrl: "https://minascan.io/devnet/account/",
577
+ explorerTransactionUrl: "https://minascan.io/devnet/tx/",
578
+ chainId: "devnet",
579
+ name: "Devnet",
580
+ faucet: "https://faucet.minaprotocol.com"
581
+ };
582
+ var Zeko = {
583
+ mina: ["https://devnet.zeko.io/graphql"],
584
+ archive: ["https://devnet.zeko.io/graphql"],
585
+ explorerAccountUrl: "https://zekoscan.io/devnet/account/",
586
+ explorerTransactionUrl: "https://zekoscan.io/devnet/tx/",
587
+ chainId: "zeko",
588
+ name: "Zeko",
589
+ faucet: "https://zeko.io/faucet"
590
+ };
591
+ var Lightnet = {
592
+ mina: ["http://localhost:8080/graphql"],
593
+ archive: ["http://localhost:8282"],
594
+ accountManager: "http://localhost:8181",
595
+ chainId: "lightnet",
596
+ name: "Lightnet"
597
+ };
598
+ var networks = [Mainnet, Local, Devnet, Zeko, Lightnet];
599
+
600
+ // dist/node/mina/api/api.js
601
+ var import_axios = __toESM(require("axios"), 1);
602
+ var import_chalk = __toESM(require("chalk"), 1);
603
+
604
+ // dist/node/mina/local/local.js
605
+ var LocalCloud = class _LocalCloud extends Cloud {
606
+ /**
607
+ * Constructor for LocalCloud
608
+ * @param params the parameters to create the LocalCloud
609
+ * @param params.job the job data
610
+ * @param params.chain the blockchain to execute the job on, can be any blockchain, not only local
611
+ * @param params.cache the cache folder
612
+ * @param params.stepId the step id
613
+ * @param params.localWorker the worker to execute the tasks
614
+ */
615
+ constructor(params) {
616
+ const { job, chain, cache, stepId, localWorker } = params;
617
+ const { id, jobId, developer, repo, task, userId, args, metadata, taskId } = job;
618
+ super({
619
+ id,
620
+ jobId,
621
+ stepId: stepId ?? "stepId",
622
+ taskId: taskId ?? "taskId",
623
+ cache: cache ?? "./cache",
624
+ developer,
625
+ repo,
626
+ task,
627
+ userId,
628
+ args,
629
+ metadata,
630
+ isLocalCloud: true,
631
+ chain
632
+ });
633
+ this.localWorker = localWorker;
634
+ }
635
+ /**
636
+ * Provides the deployer key pair for testing and development
637
+ * @returns the deployer key pair
638
+ */
639
+ async getDeployer() {
640
+ const privateKey = process.env.DEPLOYER_PRIVATE_KEY;
641
+ const publicKey = process.env.DEPLOYER_PUBLIC_KEY;
642
+ try {
643
+ return privateKey === void 0 || publicKey === void 0 ? void 0 : {
644
+ privateKey,
645
+ publicKey
646
+ };
647
+ } catch (error) {
648
+ console.error(`getDeployer: error getting deployer key pair: ${error}`, error);
649
+ return void 0;
650
+ }
651
+ }
652
+ /**
653
+ * Releases the deployer key pair
654
+ */
655
+ async releaseDeployer(params) {
656
+ console.log("LocalCloud: releaseDeployer", params);
657
+ }
658
+ /**
659
+ * Gets the data by key
660
+ * @param key the key to get the data
661
+ * @returns the data
662
+ */
663
+ async getDataByKey(key) {
664
+ const value = LocalStorage.data[key];
665
+ return value;
666
+ }
667
+ /**
668
+ * Saves the data by key
669
+ * @param key the key to save the data
670
+ * @param value the value to save
671
+ */
672
+ async saveDataByKey(key, value) {
673
+ if (value !== void 0)
674
+ LocalStorage.data[key] = value;
675
+ else
676
+ delete LocalStorage.data[key];
677
+ }
678
+ /**
679
+ * Saves the file
680
+ * @param filename the filename to save
681
+ * @param value the value to save
682
+ */
683
+ async saveFile(filename, value) {
684
+ LocalStorage.files[filename] = value;
685
+ }
686
+ /**
687
+ * Loads the file
688
+ * @param filename
689
+ * @returns the file data
690
+ */
691
+ async loadFile(filename) {
692
+ return LocalStorage.files[filename];
693
+ }
694
+ /**
695
+ * Encrypts the data
696
+ * @param params
697
+ * @param params.data the data
698
+ * @param params.context the context
699
+ * @param params.keyId the key id, optional
700
+ * @returns encrypted data
701
+ */
702
+ async encrypt(params) {
703
+ return JSON.stringify(params);
704
+ }
705
+ /**
706
+ * Decrypts the data
707
+ * @param params
708
+ * @param params.data the data
709
+ * @param params.context the context
710
+ * @param params.keyId the key id, optional
711
+ * @returns
712
+ */
713
+ async decrypt(params) {
714
+ const { data, context, keyId } = JSON.parse(params.data);
715
+ if (context !== params.context) {
716
+ console.error("decrypt: context mismatch");
717
+ return void 0;
718
+ }
719
+ if (keyId !== params.keyId) {
720
+ console.error("decrypt: keyId mismatch");
721
+ return void 0;
722
+ }
723
+ return data;
724
+ }
725
+ /**
726
+ * Generates an id for local cloud
727
+ * @returns generated unique id
728
+ */
729
+ static generateId(tx = void 0) {
730
+ return Date.now() + "." + makeString(32);
731
+ }
732
+ /**
733
+ * Send transactions to the local cloud
734
+ * @param transactions the transactions to add
735
+ * @returns the transaction ids
736
+ */
737
+ async sendTransactions(transactions) {
738
+ return await _LocalCloud.addTransactions(transactions);
739
+ }
740
+ /**
741
+ * Adds transactions to the local cloud
742
+ * @param transactions the transactions to add
743
+ * @returns the transaction ids
744
+ */
745
+ static async addTransactions(transactions) {
746
+ const timeReceived = Date.now();
747
+ const txs = [];
748
+ transactions.forEach((tx) => {
749
+ if (typeof tx === "string") {
750
+ const txId = _LocalCloud.generateId(JSON.stringify({ tx, time: timeReceived }));
751
+ const transaction = {
752
+ txId,
753
+ transaction: tx,
754
+ timeReceived,
755
+ status: "accepted"
756
+ };
757
+ LocalStorage.transactions[txId] = transaction;
758
+ txs.push(transaction);
759
+ } else {
760
+ LocalStorage.transactions[tx.txId] = tx;
761
+ txs.push(tx);
762
+ }
763
+ });
764
+ return txs;
765
+ }
766
+ /**
767
+ * Deletes a transaction from the local cloud
768
+ * @param txId the transaction id to delete
769
+ */
770
+ async deleteTransaction(txId) {
771
+ if (LocalStorage.transactions[txId] === void 0)
772
+ throw new Error(`deleteTransaction: Transaction ${txId} not found`);
773
+ delete LocalStorage.transactions[txId];
774
+ }
775
+ async getTransactions() {
776
+ const txs = Object.keys(LocalStorage.transactions).map((txId) => {
777
+ return LocalStorage.transactions[txId];
778
+ });
779
+ return txs;
780
+ }
781
+ /**
782
+ * Publish the transaction metadata in human-readable format
783
+ * @param params
784
+ * @param params.txId the transaction id
785
+ * @param params.metadata the metadata
786
+ */
787
+ async publishTransactionMetadata(params) {
788
+ console.log("publishTransactionMetadata:", params);
789
+ }
790
+ /**
791
+ * Runs the worker in the local cloud
792
+ * @param params the parameters to run the worker
793
+ * @param params.command the command to run
794
+ * @param params.data the data to use
795
+ * @param params.chain the blockchain to execute the job on
796
+ * @param params.localWorker the worker to execute the tasks
797
+ * @returns the job id
798
+ */
799
+ static async run(params) {
800
+ const { command, data, chain, localWorker } = params;
801
+ const { developer, repo, transactions, task, userId, args, metadata } = data;
802
+ const timeCreated = Date.now();
803
+ const jobId = _LocalCloud.generateId();
804
+ const job = {
805
+ id: "local",
806
+ jobId,
807
+ developer,
808
+ repo,
809
+ task,
810
+ userId,
811
+ args,
812
+ metadata,
813
+ txNumber: command === "recursiveProof" ? transactions.length : 1,
814
+ timeCreated,
815
+ timeStarted: timeCreated,
816
+ chain
817
+ };
818
+ const cloud = new _LocalCloud({
819
+ job,
820
+ chain,
821
+ localWorker
822
+ });
823
+ const worker = await localWorker(cloud);
824
+ if (worker === void 0)
825
+ throw new Error("worker is undefined");
826
+ const result = command === "recursiveProof" ? await _LocalCloud.sequencer({
827
+ worker,
828
+ data
829
+ }) : command === "execute" ? await worker.execute(transactions) : void 0;
830
+ const timeFinished = Date.now();
831
+ if (result !== void 0) {
832
+ LocalStorage.jobEvents[jobId] = {
833
+ jobId,
834
+ jobStatus: "finished",
835
+ eventTime: timeFinished,
836
+ result
837
+ };
838
+ job.timeFinished = timeFinished;
839
+ job.jobStatus = "finished";
840
+ job.result = result;
841
+ } else {
842
+ LocalStorage.jobEvents[jobId] = {
843
+ jobId,
844
+ jobStatus: "failed",
845
+ eventTime: timeFinished
846
+ };
847
+ job.timeFailed = timeFinished;
848
+ job.jobStatus = "failed";
849
+ }
850
+ job.billedDuration = timeFinished - timeCreated;
851
+ LocalStorage.jobs[jobId] = job;
852
+ return jobId;
853
+ }
854
+ /**
855
+ * Runs the recursive proof in the local cloud
856
+ * @param data the data to use
857
+ * @param data.transactions the transactions to process
858
+ * @param data.task the task to execute
859
+ * @param data.userId the user id
860
+ * @param data.args the arguments for the job
861
+ * @param data.metadata the metadata for the job
862
+ * @returns the job id
863
+ */
864
+ async recursiveProof(data) {
865
+ return await _LocalCloud.run({
866
+ command: "recursiveProof",
867
+ data: {
868
+ developer: this.developer,
869
+ repo: this.repo,
870
+ transactions: data.transactions,
871
+ task: data.task ?? "recursiveProof",
872
+ userId: data.userId,
873
+ args: data.args,
874
+ metadata: data.metadata
875
+ },
876
+ chain: this.chain,
877
+ localWorker: this.localWorker
878
+ });
879
+ }
880
+ /**
881
+ * Executes the task in the local cloud
882
+ * @param data the data to use
883
+ * @param data.transactions the transactions to process
884
+ * @param data.task the task to execute
885
+ * @param data.userId the user id
886
+ * @param data.args the arguments for the job
887
+ * @param data.metadata the metadata for the job
888
+ * @returns the job id
889
+ */
890
+ async execute(data) {
891
+ return await _LocalCloud.run({
892
+ command: "execute",
893
+ data: {
894
+ developer: this.developer,
895
+ repo: this.repo,
896
+ transactions: data.transactions,
897
+ task: data.task,
898
+ userId: data.userId,
899
+ args: data.args,
900
+ metadata: data.metadata
901
+ },
902
+ chain: this.chain,
903
+ localWorker: this.localWorker
904
+ });
905
+ }
906
+ /**
907
+ * Gets the job result
908
+ * @param jobId the job id
909
+ * @returns the job data
910
+ */
911
+ async jobResult(jobId) {
912
+ return LocalStorage.jobs[jobId];
913
+ }
914
+ /**
915
+ * Adds a task to the local cloud
916
+ * @param data the data to use
917
+ * @param data.task the task to execute
918
+ * @param data.startTime the start time for the task
919
+ * @param data.userId the user id
920
+ * @param data.args the arguments for the job
921
+ * @param data.metadata the metadata for the job
922
+ * @returns the task id
923
+ */
924
+ async addTask(data) {
925
+ const taskId = _LocalCloud.generateId();
926
+ LocalStorage.tasks[taskId] = {
927
+ ...data,
928
+ id: "local",
929
+ taskId,
930
+ timeCreated: Date.now(),
931
+ developer: this.developer,
932
+ repo: this.repo,
933
+ chain: this.chain
934
+ };
935
+ return taskId;
936
+ }
937
+ /**
938
+ * Deletes a task from the local cloud
939
+ * @param taskId the task id to delete
940
+ */
941
+ async deleteTask(taskId) {
942
+ if (LocalStorage.tasks[taskId] === void 0)
943
+ throw new Error(`deleteTask: Task ${taskId} not found`);
944
+ delete LocalStorage.tasks[taskId];
945
+ }
946
+ /**
947
+ * Processes the tasks in the local cloud
948
+ */
949
+ async processTasks() {
950
+ await _LocalCloud.processLocalTasks({
951
+ developer: this.developer,
952
+ repo: this.repo,
953
+ localWorker: this.localWorker,
954
+ chain: this.chain
955
+ });
956
+ }
957
+ /**
958
+ * Processes the local tasks
959
+ * @param params the parameters to process the local tasks
960
+ * @param params.developer the developer of the repo
961
+ * @param params.repo the repo
962
+ * @param params.localWorker the worker to execute the tasks
963
+ * @param params.chain the blockchain to execute the job on
964
+ */
965
+ static async processLocalTasks(params) {
966
+ const { developer, repo, localWorker, chain } = params;
967
+ for (const taskId in LocalStorage.tasks) {
968
+ const data = LocalStorage.tasks[taskId];
969
+ const jobId = _LocalCloud.generateId();
970
+ const timeCreated = Date.now();
971
+ if (data.startTime !== void 0 && data.startTime < timeCreated)
972
+ continue;
973
+ const job = {
974
+ id: "local",
975
+ jobId,
976
+ taskId,
977
+ developer,
978
+ repo,
979
+ task: data.task,
980
+ userId: data.userId,
981
+ args: data.args,
982
+ metadata: data.metadata,
983
+ txNumber: 1,
984
+ timeCreated
985
+ };
986
+ const cloud = new _LocalCloud({
987
+ job,
988
+ chain,
989
+ localWorker
990
+ });
991
+ const worker = await localWorker(cloud);
992
+ const result = await worker.task();
993
+ const timeFinished = Date.now();
994
+ if (result !== void 0) {
995
+ LocalStorage.jobEvents[jobId] = {
996
+ jobId,
997
+ jobStatus: "finished",
998
+ eventTime: timeFinished,
999
+ result
1000
+ };
1001
+ job.timeFinished = timeFinished;
1002
+ } else {
1003
+ LocalStorage.jobEvents[jobId] = {
1004
+ jobId,
1005
+ jobStatus: "failed",
1006
+ eventTime: timeFinished
1007
+ };
1008
+ job.timeFailed = timeFinished;
1009
+ }
1010
+ job.billedDuration = timeFinished - timeCreated;
1011
+ LocalStorage.jobs[jobId] = job;
1012
+ }
1013
+ let count = 0;
1014
+ for (const task in LocalStorage.tasks)
1015
+ count++;
1016
+ return count;
1017
+ }
1018
+ /**
1019
+ * Runs the sequencer in the local cloud
1020
+ * @param params the parameters to run the sequencer
1021
+ * @param params.worker the worker to execute the tasks
1022
+ * @param params.data the data to use
1023
+ * @returns the proof
1024
+ */
1025
+ static async sequencer(params) {
1026
+ const { worker, data } = params;
1027
+ const { transactions } = data;
1028
+ if (transactions.length === 0)
1029
+ throw new Error("No transactions to process");
1030
+ const proofs = [];
1031
+ for (const transaction of transactions) {
1032
+ const result = await worker.create(transaction);
1033
+ if (result === void 0)
1034
+ throw new Error("Failed to create proof");
1035
+ proofs.push(result);
1036
+ }
1037
+ let proof = proofs[0];
1038
+ for (let i = 1; i < proofs.length; i++) {
1039
+ const result = await worker.merge(proof, proofs[i]);
1040
+ if (result === void 0)
1041
+ throw new Error("Failed to merge proofs");
1042
+ proof = result;
1043
+ }
1044
+ return proof;
1045
+ }
1046
+ /**
1047
+ * forces the worker to restart
1048
+ */
1049
+ async forceWorkerRestart() {
1050
+ throw new Error("forceWorkerRestart called in LocalCloud");
1051
+ }
1052
+ };
1053
+ var LocalStorage = class _LocalStorage {
1054
+ /**
1055
+ * Saves the data.
1056
+ * @param name The name to save the data under.
1057
+ * @throws Error Method not implemented to keep web compatibility.
1058
+ */
1059
+ static async saveData(name) {
1060
+ throw new Error("Method not implemented to keep web compatibility.");
1061
+ const data = {
1062
+ jobs: _LocalStorage.jobs,
1063
+ data: _LocalStorage.data,
1064
+ transactions: _LocalStorage.transactions,
1065
+ tasks: _LocalStorage.tasks
1066
+ };
1067
+ const filename = name + ".cloud";
1068
+ }
1069
+ /**
1070
+ * Loads the data.
1071
+ * @param name The name to load the data from.
1072
+ * @throws Error Method not implemented to keep web compatibility.
1073
+ */
1074
+ static async loadData(name) {
1075
+ throw new Error("Method not implemented to keep web compatibility.");
1076
+ const filename = name + ".cloud";
1077
+ }
1078
+ };
1079
+ LocalStorage.jobs = {};
1080
+ LocalStorage.jobEvents = {};
1081
+ LocalStorage.data = {};
1082
+ LocalStorage.files = {};
1083
+ LocalStorage.transactions = {};
1084
+ LocalStorage.tasks = {};
1085
+
1086
+ // dist/node/mina/api/api.js
1087
+ var { ZKCLOUDWORKER_AUTH, ZKCLOUDWORKER_API } = config_default;
1088
+ var zkCloudWorkerClient = class {
1089
+ /**
1090
+ * Constructor for the API class
1091
+ * @param params the parameters for the API class
1092
+ * @param params.jwt The jwt token for authentication, get it at https://t.me/minanft_bot?start=auth
1093
+ * @param params.zkcloudworker The local worker for the serverless api to test the code locally
1094
+ * @param params.chain The blockchain network to use
1095
+ * @param params.webhook The webhook for the serverless api to get the results
1096
+ */
1097
+ constructor(params) {
1098
+ const { jwt, zkcloudworker, webhook } = params;
1099
+ this.jwt = jwt;
1100
+ const chain = params.chain ?? "devnet";
1101
+ this.chain = chain;
1102
+ this.endpoint = chain === "devnet" || chain === "zeko" ? ZKCLOUDWORKER_API + chain : void 0;
1103
+ this.webhook = webhook;
1104
+ if (jwt === "local") {
1105
+ if (zkcloudworker === void 0)
1106
+ throw new Error("worker is required for local mode");
1107
+ this.localWorker = zkcloudworker;
1108
+ }
1109
+ }
1110
+ /**
1111
+ * Starts a new job for the proof calculation using serverless api call
1112
+ * @param data the data for the proof call
1113
+ * @param data.developer the developer
1114
+ * @param data.repo the repo to use
1115
+ * @param data.transactions the transactions
1116
+ * @param data.task the task of the job
1117
+ * @param data.userId the userId of the job
1118
+ * @param data.args the arguments of the job, should be serialized JSON or string
1119
+ * @param data.metadata the metadata of the job, should be serialized JSON or string
1120
+ * @param data.webhook the webhook for the job
1121
+ * @returns { success: boolean, error?: string, jobId?: string }
1122
+ * where jonId is the jobId of the job
1123
+ *
1124
+ * The developers repo should provide a zkcloudworker function
1125
+ * that can be called with the given parameters, see the examples
1126
+ */
1127
+ async recursiveProof(data) {
1128
+ const result = await this.apiHub("recursiveProof", data);
1129
+ if (result.data === "error" || typeof result.data === "string" && result.data.startsWith("error"))
1130
+ return {
1131
+ success: false,
1132
+ error: result.error
1133
+ };
1134
+ else if (result.success === false || result.data?.success === false)
1135
+ return {
1136
+ success: false,
1137
+ error: result.error ?? result.data?.error ?? "recursiveProof call failed"
1138
+ };
1139
+ else if (result.success === true && result.data?.success === true && result.data?.jobId !== void 0)
1140
+ return {
1141
+ success: result.success,
1142
+ jobId: result.data.jobId,
1143
+ error: result.error
1144
+ };
1145
+ else
1146
+ return {
1147
+ success: false,
1148
+ error: "recursiveProof call error"
1149
+ };
1150
+ }
1151
+ /**
1152
+ * Starts a new job for the function call using serverless api call
1153
+ * @param data the data for the proof call
1154
+ * @param data.developer the developer
1155
+ * @param data.repo the repo to use
1156
+ * @param data.transactions the transactions
1157
+ * @param data.task the task of the job
1158
+ * @param data.userId the userId of the job
1159
+ * @param data.args the arguments of the job
1160
+ * @param data.metadata the metadata of the job
1161
+ * @param data.mode the mode of the job execution: "sync" will not create a job, it will execute the function synchronously within 30 seconds and with the memory limit of 256 MB
1162
+ * @returns { success: boolean, error?: string, jobId?: string, result?: any }
1163
+ * where jonId is the jobId of the job (for async calls), result is the result of the job (for sync calls)
1164
+ */
1165
+ async execute(data) {
1166
+ const result = await this.apiHub("execute", data);
1167
+ if (result.data === "error" || typeof result.data === "string" && result.data.startsWith("error"))
1168
+ return {
1169
+ success: false,
1170
+ error: result.error
1171
+ };
1172
+ else if (result.success === false || result.data?.success === false)
1173
+ return {
1174
+ success: false,
1175
+ error: result.error ?? result.data?.error ?? "execute call failed"
1176
+ };
1177
+ else if (result.success === true && data.mode === "sync" && result.data !== void 0)
1178
+ return {
1179
+ success: result.success,
1180
+ jobId: void 0,
1181
+ result: result.data,
1182
+ error: result.error
1183
+ };
1184
+ else if (result.success === true && data.mode !== "sync" && result.data?.success === true && result.data?.jobId !== void 0)
1185
+ return {
1186
+ success: result.success,
1187
+ jobId: result.data.jobId,
1188
+ result: void 0,
1189
+ error: result.error
1190
+ };
1191
+ else
1192
+ return {
1193
+ success: false,
1194
+ error: "execute call error"
1195
+ };
1196
+ }
1197
+ /**
1198
+ * Sends transactions to the blockchain using serverless api call
1199
+ * @param data the data for the proof call
1200
+ * @param data.developer the developer
1201
+ * @param data.repo the repo to use
1202
+ * @param data.transactions the transactions
1203
+ * @returns { success: boolean, error?: string, txId?: string[] }
1204
+ * where txId is the transaction id of the transaction, in the sequence of the input transactions
1205
+ */
1206
+ async sendTransactions(data) {
1207
+ const result = await this.apiHub("sendTransactions", data);
1208
+ if (result.data === "error")
1209
+ return {
1210
+ success: false,
1211
+ error: result.error
1212
+ };
1213
+ else
1214
+ return {
1215
+ success: result.success,
1216
+ txId: result.data,
1217
+ error: result.error
1218
+ };
1219
+ }
1220
+ /**
1221
+ * Gets the result of the job using serverless api call
1222
+ * @param data the data for the jobResult call
1223
+ * @param data.jobId the jobId of the job
1224
+ * @param data.includeLogs include logs in the result, default is false
1225
+ * @returns { success: boolean, error?: string, result?: any }
1226
+ * where result is the result of the job
1227
+ * if the job is not finished yet, the result will be undefined
1228
+ * if the job failed, the result will be undefined and error will be set
1229
+ * if the job is finished, the result will be set and error will be undefined
1230
+ * if the job is not found, the result will be undefined and error will be set
1231
+ */
1232
+ async jobResult(data) {
1233
+ const result = await this.apiHub("jobResult", data);
1234
+ if (this.isError(result.data))
1235
+ return {
1236
+ success: false,
1237
+ error: result.error,
1238
+ result: result.data
1239
+ };
1240
+ else
1241
+ return {
1242
+ success: result.success,
1243
+ error: result.error,
1244
+ result: result.success ? result.data : result.data
1245
+ };
1246
+ }
1247
+ /**
1248
+ * Deploys the code to the cloud using serverless api call
1249
+ * @param data the data for the deploy call
1250
+ * @param data.repo the repo to use
1251
+ * @param data.developer the developer
1252
+ * @param data.packageManager the package manager to use
1253
+ * @returns { success: boolean, error?: string, jobId?: string}
1254
+ * where jobId is the jobId of the job
1255
+ */
1256
+ async deploy(data) {
1257
+ const { repo, developer, packageManager } = data;
1258
+ const result = await this.apiHub("deploy", {
1259
+ developer,
1260
+ repo,
1261
+ args: packageManager
1262
+ });
1263
+ if (result.data === "error" || typeof result.data === "string" && result.data.startsWith("error"))
1264
+ return {
1265
+ success: false,
1266
+ error: result.error
1267
+ };
1268
+ else
1269
+ return {
1270
+ success: result.success && result.data?.success,
1271
+ jobId: result.data?.jobId,
1272
+ error: result.error
1273
+ };
1274
+ }
1275
+ /**
1276
+ * Gets the billing report for the jobs sent using JWT
1277
+ * @returns { success: boolean, error?: string, result?: any }
1278
+ * where result is the billing report
1279
+ */
1280
+ async queryBilling() {
1281
+ const result = await this.apiHub("queryBilling", {});
1282
+ if (this.isError(result.data))
1283
+ return {
1284
+ success: false,
1285
+ error: result.error,
1286
+ result: result.data
1287
+ };
1288
+ else
1289
+ return {
1290
+ success: result.success,
1291
+ error: result.error,
1292
+ result: result.data
1293
+ };
1294
+ }
1295
+ /**
1296
+ * Gets the remaining balance
1297
+ * @returns { success: boolean, error?: string, result?: any }
1298
+ * where result is the balance
1299
+ */
1300
+ async getBalance() {
1301
+ const result = await this.apiHub("getBalance", {});
1302
+ if (this.isError(result.data))
1303
+ return {
1304
+ success: false,
1305
+ error: result.error,
1306
+ result: result.data
1307
+ };
1308
+ else
1309
+ return {
1310
+ success: result.success,
1311
+ error: result.error,
1312
+ result: result.data
1313
+ };
1314
+ }
1315
+ /**
1316
+ * Waits for the job to finish
1317
+ * @param data the data for the waitForJobResult call
1318
+ * @param data.jobId the jobId of the job
1319
+ * @param data.maxAttempts the maximum number of attempts, default is 360 (2 hours)
1320
+ * @param data.interval the interval between attempts, default is 20000 (20 seconds)
1321
+ * @param data.maxErrors the maximum number of network errors, default is 10
1322
+ * @param data.printLogs print logs, default is true
1323
+ * @returns { success: boolean, error?: string, result?: any }
1324
+ * where result is the result of the job
1325
+ */
1326
+ async waitForJobResult(data) {
1327
+ if (this.jwt === "local")
1328
+ return this.jobResult({ jobId: data.jobId });
1329
+ const maxAttempts = data?.maxAttempts ?? 360;
1330
+ const interval = data?.interval ?? 1e4;
1331
+ const maxErrors = data?.maxErrors ?? 10;
1332
+ const errorDelay = 3e4;
1333
+ const printedLogs = [];
1334
+ const printLogs = data.printLogs ?? true;
1335
+ function print(logs) {
1336
+ logs.forEach((log) => {
1337
+ if (printedLogs.includes(log) === false) {
1338
+ printedLogs.push(log);
1339
+ if (printLogs) {
1340
+ const text = log.replace(/error/gi, (matched) => import_chalk.default.red(matched));
1341
+ console.log(text);
1342
+ }
1343
+ }
1344
+ });
1345
+ }
1346
+ let attempts = 0;
1347
+ let errors = 0;
1348
+ while (attempts < maxAttempts) {
1349
+ const result = await this.apiHub("jobResult", {
1350
+ jobId: data.jobId,
1351
+ includeLogs: printLogs
1352
+ });
1353
+ const isAllLogsFetched = result?.data?.isFullLog === true || printLogs === false;
1354
+ if (printLogs === true && result?.data?.logs !== void 0 && result?.data?.logs !== null && Array.isArray(result.data.logs) === true)
1355
+ print(result.data.logs);
1356
+ if (result.success === false) {
1357
+ errors++;
1358
+ if (errors > maxErrors) {
1359
+ return {
1360
+ success: false,
1361
+ error: "Too many network errors",
1362
+ result: void 0
1363
+ };
1364
+ }
1365
+ await sleep(errorDelay * errors);
1366
+ } else {
1367
+ if (this.isError(result.data) && isAllLogsFetched)
1368
+ return {
1369
+ success: false,
1370
+ error: result.error,
1371
+ result: result.data
1372
+ };
1373
+ else if (result.data?.result !== void 0 && isAllLogsFetched) {
1374
+ return {
1375
+ success: result.success,
1376
+ error: result.error,
1377
+ result: result.data
1378
+ };
1379
+ } else if (result.data?.jobStatus === "failed" && isAllLogsFetched) {
1380
+ return {
1381
+ success: false,
1382
+ error: "Job failed",
1383
+ result: result.data
1384
+ };
1385
+ }
1386
+ await sleep(interval);
1387
+ }
1388
+ attempts++;
1389
+ }
1390
+ return {
1391
+ success: false,
1392
+ error: "Timeout",
1393
+ result: void 0
1394
+ };
1395
+ }
1396
+ /**
1397
+ * Calls the serverless API
1398
+ * @param command the command of the API
1399
+ * @param data the data of the API
1400
+ * */
1401
+ async apiHub(command, data) {
1402
+ if (this.jwt === "local") {
1403
+ if (this.localWorker === void 0)
1404
+ throw new Error("localWorker is undefined");
1405
+ switch (command) {
1406
+ case "recursiveProof": {
1407
+ const jobId = await LocalCloud.run({
1408
+ command: "recursiveProof",
1409
+ data,
1410
+ chain: this.chain,
1411
+ localWorker: this.localWorker
1412
+ });
1413
+ return {
1414
+ success: true,
1415
+ data: { success: true, jobId }
1416
+ };
1417
+ }
1418
+ case "execute": {
1419
+ const jobId = await LocalCloud.run({
1420
+ command: "execute",
1421
+ data,
1422
+ chain: this.chain,
1423
+ localWorker: this.localWorker
1424
+ });
1425
+ if (data.mode === "sync")
1426
+ return {
1427
+ success: true,
1428
+ data: LocalStorage.jobEvents[jobId].result
1429
+ };
1430
+ else
1431
+ return {
1432
+ success: true,
1433
+ data: { success: true, jobId }
1434
+ };
1435
+ }
1436
+ case "jobResult": {
1437
+ const job = LocalStorage.jobs[data.jobId];
1438
+ if (job === void 0) {
1439
+ return {
1440
+ success: false,
1441
+ error: "local job not found"
1442
+ };
1443
+ } else {
1444
+ return {
1445
+ success: true,
1446
+ data: job
1447
+ };
1448
+ }
1449
+ }
1450
+ case "sendTransactions": {
1451
+ return {
1452
+ success: true,
1453
+ data: await LocalCloud.addTransactions(data.transactions)
1454
+ };
1455
+ }
1456
+ case "deploy":
1457
+ return {
1458
+ success: true,
1459
+ data: "local_deploy"
1460
+ };
1461
+ case "queryBilling":
1462
+ return {
1463
+ success: true,
1464
+ data: "local_queryBilling"
1465
+ };
1466
+ default:
1467
+ return {
1468
+ success: false,
1469
+ error: "local_error"
1470
+ };
1471
+ }
1472
+ } else {
1473
+ if (this.endpoint === void 0)
1474
+ throw new Error("zkCloudWorker supports only devnet and zeko chains in the cloud.");
1475
+ const apiData = {
1476
+ auth: ZKCLOUDWORKER_AUTH,
1477
+ command,
1478
+ jwtToken: this.jwt,
1479
+ data,
1480
+ chain: this.chain,
1481
+ webhook: this.webhook
1482
+ // TODO: implement webhook code on AWS
1483
+ };
1484
+ try {
1485
+ const response = await import_axios.default.post(this.endpoint, apiData);
1486
+ return { success: true, data: response.data };
1487
+ } catch (error) {
1488
+ console.error("apiHub error:", error.message ?? error);
1489
+ return { success: false, error };
1490
+ }
1491
+ }
1492
+ }
1493
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1494
+ isError(data) {
1495
+ if (data === "error")
1496
+ return true;
1497
+ if (data?.jobStatus === "failed")
1498
+ return true;
1499
+ if (typeof data === "string" && data.toLowerCase().startsWith("error"))
1500
+ return true;
1501
+ if (data !== void 0 && data.error !== void 0)
1502
+ return true;
1503
+ return false;
1504
+ }
1505
+ };
1506
+
1507
+ // dist/node/mina/utils/base64.js
1508
+ var import_o1js = require("o1js");
1509
+ var TABLE2 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
1510
+ function fieldToBase56(field) {
1511
+ const digits = toBase(field.toBigInt(), 56n);
1512
+ const str = digits.map((x) => TABLE2[Number(x)]).join("");
1513
+ return str;
1514
+ }
1515
+ function fieldFromBase56(str) {
1516
+ const base56Digits = str.split("").map((x2) => BigInt(TABLE2.indexOf(x2)));
1517
+ const x = fromBase(base56Digits, 56n);
1518
+ return (0, import_o1js.Field)(x);
1519
+ }
1520
+ function fieldToBase64(field) {
1521
+ const digits = toBase(field.toBigInt(), 64n);
1522
+ const str = digits.map((x) => TABLE2[Number(x)]).join("");
1523
+ return str;
1524
+ }
1525
+ function fieldFromBase64(str) {
1526
+ const base64Digits = str.split("").map((x2) => BigInt(TABLE2.indexOf(x2)));
1527
+ const x = fromBase(base64Digits, 64n);
1528
+ return (0, import_o1js.Field)(x);
1529
+ }
1530
+
1531
+ // dist/node/mina/utils/fetch.js
1532
+ var import_o1js2 = require("o1js");
1533
+ async function fetchMinaAccount(params) {
1534
+ const { publicKey, tokenId, force = false } = params;
1535
+ const timeout = 1e3 * 60 * 3;
1536
+ let attempt = 0;
1537
+ const startTime = Date.now();
1538
+ let result = { account: void 0 };
1539
+ while (Date.now() - startTime < timeout) {
1540
+ try {
1541
+ const result2 = await (0, import_o1js2.fetchAccount)({
1542
+ publicKey,
1543
+ tokenId
1544
+ });
1545
+ return result2;
1546
+ } catch (error) {
1547
+ if (force === true)
1548
+ console.log("Error in fetchMinaAccount:", {
1549
+ error,
1550
+ publicKey: typeof publicKey === "string" ? publicKey : publicKey.toBase58(),
1551
+ tokenId: tokenId?.toString(),
1552
+ force
1553
+ });
1554
+ else {
1555
+ console.log("fetchMinaAccount error", {
1556
+ error,
1557
+ publicKey: typeof publicKey === "string" ? publicKey : publicKey.toBase58(),
1558
+ tokenId: tokenId?.toString(),
1559
+ force
1560
+ });
1561
+ return result;
1562
+ }
1563
+ }
1564
+ attempt++;
1565
+ await sleep(1e3 * 6 * attempt);
1566
+ }
1567
+ if (force === true)
1568
+ throw new Error(`fetchMinaAccount timeout
1569
+ ${{
1570
+ publicKey: typeof publicKey === "string" ? publicKey : publicKey.toBase58(),
1571
+ tokenId: tokenId?.toString(),
1572
+ force
1573
+ }}`);
1574
+ else
1575
+ console.log("fetchMinaAccount timeout", typeof publicKey === "string" ? publicKey : publicKey.toBase58(), tokenId?.toString(), force);
1576
+ return result;
1577
+ }
1578
+ async function fetchMinaActions(publicKey, fromActionState, endActionState) {
1579
+ const timeout = 1e3 * 60 * 600;
1580
+ const startTime = Date.now();
1581
+ while (Date.now() - startTime < timeout) {
1582
+ try {
1583
+ let actions = await import_o1js2.Mina.fetchActions(publicKey, {
1584
+ fromActionState,
1585
+ endActionState
1586
+ });
1587
+ if (Array.isArray(actions))
1588
+ return actions;
1589
+ else
1590
+ console.log("Cannot fetch actions - wrong format");
1591
+ } catch (error) {
1592
+ console.log("Error in fetchMinaActions", error.toString().substring(0, 300));
1593
+ }
1594
+ await sleep(1e3 * 60 * 2);
1595
+ }
1596
+ console.log("Timeout in fetchMinaActions");
1597
+ return void 0;
1598
+ }
1599
+ async function checkMinaZkappTransaction(hash) {
1600
+ try {
1601
+ const result = await (0, import_o1js2.checkZkappTransaction)(hash);
1602
+ return result;
1603
+ } catch (error) {
1604
+ console.error("Error in checkZkappTransaction:", error);
1605
+ return { success: false };
1606
+ }
1607
+ }
1608
+
1609
+ // dist/node/mina/utils/fields.js
1610
+ var import_o1js3 = require("o1js");
1611
+ function serializeFields(fields) {
1612
+ const hash = import_o1js3.Poseidon.hash(fields);
1613
+ const value = [(0, import_o1js3.Field)(fields.length), hash, ...fields];
1614
+ return value.map((f) => fieldToBase64(f)).join(".");
1615
+ }
1616
+ function deserializeFields(s) {
1617
+ try {
1618
+ const value = s.split(".").map((n) => fieldFromBase64(n));
1619
+ const length = value[0];
1620
+ if ((0, import_o1js3.Field)(value.length - 2).equals(length).toBoolean() === false)
1621
+ throw new Error("deserializeFields: invalid length");
1622
+ const hash = import_o1js3.Poseidon.hash(value.slice(2));
1623
+ if (hash.equals(value[1]).toBoolean()) {
1624
+ return value.slice(2);
1625
+ } else
1626
+ throw new Error("deserializeFields: invalid hash: data mismatch");
1627
+ } catch (e) {
1628
+ throw new Error(`deserializeFields: invalid string: ${s}: ${e}`);
1629
+ }
1630
+ }
1631
+
1632
+ // dist/node/mina/utils/fee.js
1633
+ var import_o1js4 = require("o1js");
1634
+ async function fee() {
1635
+ return import_o1js4.UInt64.fromJSON(config_default.MINAFEE);
1636
+ }
1637
+
1638
+ // dist/node/mina/utils/mina.js
1639
+ var import_o1js5 = require("o1js");
1640
+ var currentNetwork = void 0;
1641
+ function getNetworkIdHash() {
1642
+ if (currentNetwork === void 0) {
1643
+ throw new Error("Network is not initialized");
1644
+ }
1645
+ return currentNetwork.networkIdHash;
1646
+ }
1647
+ function getCurrentNetwork() {
1648
+ if (currentNetwork === void 0) {
1649
+ throw new Error("Network is not initialized");
1650
+ }
1651
+ return currentNetwork;
1652
+ }
1653
+ function getDeployer() {
1654
+ if (currentNetwork === void 0) {
1655
+ throw new Error("Network is not initialized");
1656
+ }
1657
+ if (currentNetwork.keys.length < 1)
1658
+ return void 0;
1659
+ return currentNetwork.keys[0];
1660
+ }
1661
+ async function initBlockchain(instance, deployersNumber = 0) {
1662
+ if (currentNetwork !== void 0) {
1663
+ if (currentNetwork?.network.chainId === instance) {
1664
+ return currentNetwork;
1665
+ } else {
1666
+ throw new Error(`Network is already initialized to different chain ${currentNetwork.network.chainId}, cannot initialize to ${instance}`);
1667
+ }
1668
+ }
1669
+ const networkIdHash = import_o1js5.CircuitString.fromString(instance).hash();
1670
+ if (instance === "local") {
1671
+ const local = await import_o1js5.Mina.LocalBlockchain({
1672
+ proofsEnabled: true
1673
+ });
1674
+ import_o1js5.Mina.setActiveInstance(local);
1675
+ if (deployersNumber > local.testAccounts.length)
1676
+ throw new Error("Not enough test accounts");
1677
+ currentNetwork = {
1678
+ keys: local.testAccounts,
1679
+ network: Local,
1680
+ networkIdHash
1681
+ };
1682
+ return currentNetwork;
1683
+ }
1684
+ const network = networks.find((n) => n.chainId === instance);
1685
+ if (network === void 0) {
1686
+ throw new Error("Unknown network");
1687
+ }
1688
+ const networkInstance = import_o1js5.Mina.Network({
1689
+ mina: network.mina,
1690
+ archive: network.archive,
1691
+ lightnetAccountManager: network.accountManager,
1692
+ networkId: instance === "mainnet" ? "mainnet" : "testnet"
1693
+ });
1694
+ import_o1js5.Mina.setActiveInstance(networkInstance);
1695
+ const keys = [];
1696
+ if (deployersNumber > 0) {
1697
+ if (instance === "lightnet") {
1698
+ for (let i = 0; i < deployersNumber; i++) {
1699
+ const keyPair = await import_o1js5.Lightnet.acquireKeyPair();
1700
+ const key = import_o1js5.Mina.TestPublicKey(keyPair.privateKey);
1701
+ keys.push(key);
1702
+ }
1703
+ } else {
1704
+ const deployers = process.env.DEPLOYERS;
1705
+ if (deployers === void 0 || Array.isArray(deployers) === false || deployers.length < deployersNumber)
1706
+ throw new Error("Deployers are not set");
1707
+ for (let i = 0; i < deployersNumber; i++) {
1708
+ const privateKey = import_o1js5.PrivateKey.fromBase58(deployers[i]);
1709
+ const key = import_o1js5.Mina.TestPublicKey(privateKey);
1710
+ keys.push(key);
1711
+ }
1712
+ }
1713
+ }
1714
+ currentNetwork = {
1715
+ keys,
1716
+ network,
1717
+ networkIdHash
1718
+ };
1719
+ return currentNetwork;
1720
+ }
1721
+ async function accountBalance(address) {
1722
+ await (0, import_o1js5.fetchAccount)({ publicKey: address });
1723
+ if (import_o1js5.Mina.hasAccount(address))
1724
+ return import_o1js5.Mina.getBalance(address);
1725
+ else
1726
+ return import_o1js5.UInt64.from(0);
1727
+ }
1728
+ async function accountBalanceMina(address) {
1729
+ return Number((await accountBalance(address)).toBigInt()) / 1e9;
1730
+ }
1731
+
1732
+ // dist/node/mina/utils/indexed-map.js
1733
+ var import_o1js6 = require("o1js");
1734
+
1735
+ // dist/node/mina/storage/pinata.js
1736
+ async function pinJSON(params) {
1737
+ const { data, name = "data.json", keyvalues = [{ key: "library", value: "zkcloudworker" }] } = params;
1738
+ const auth = params.auth ?? process.env.PINATA_JWT ?? process.env.NEXT_PUBLIC_PINATA_JWT ?? process.env.REACT_APP_PINATA_JWT;
1739
+ try {
1740
+ const pinataData = {
1741
+ pinataOptions: {
1742
+ cidVersion: 1
1743
+ },
1744
+ pinataMetadata: {
1745
+ name,
1746
+ keyvalues
1747
+ },
1748
+ pinataContent: data
1749
+ };
1750
+ const res = await fetch("https://api.pinata.cloud/pinning/pinJSONToIPFS", {
1751
+ method: "POST",
1752
+ headers: {
1753
+ "Content-Type": "application/json",
1754
+ Authorization: "Bearer " + auth
1755
+ },
1756
+ body: JSON.stringify(pinataData)
1757
+ });
1758
+ if (!res.ok) {
1759
+ throw new Error(`Pinata error: status: ${res.status} ${res.statusText}`);
1760
+ }
1761
+ const responseData = await res.json();
1762
+ console.log("saveToIPFS result:", responseData);
1763
+ return responseData?.IpfsHash;
1764
+ } catch (error) {
1765
+ console.error("saveToIPFS error:", error?.message);
1766
+ return void 0;
1767
+ }
1768
+ }
1769
+
1770
+ // dist/node/mina/utils/indexed-map.js
1771
+ var { IndexedMerkleMap } = import_o1js6.Experimental;
1772
+ async function loadIndexedMerkleMap(params) {
1773
+ const { url, type, timeout = 6e4, attempts = 5 } = params;
1774
+ let attempt = 0;
1775
+ const start = Date.now();
1776
+ let response = await fetch(url);
1777
+ while (!response.ok && attempt < attempts && Date.now() - start < timeout) {
1778
+ attempt++;
1779
+ await sleep(5e3 * attempt);
1780
+ response = await fetch(url);
1781
+ }
1782
+ if (!response.ok) {
1783
+ throw new Error("Failed to fetch IndexedMerkleMap");
1784
+ }
1785
+ const json = await response.json();
1786
+ const serializedIndexedMap = json.map;
1787
+ if (!serializedIndexedMap)
1788
+ throw new Error("wrong IndexedMerkleMap json format");
1789
+ const map = deserializeIndexedMerkleMapInternal({
1790
+ serializedIndexedMap,
1791
+ type
1792
+ });
1793
+ if (!map) {
1794
+ throw new Error("Failed to deserialize whitelist");
1795
+ }
1796
+ return map;
1797
+ }
1798
+ async function saveIndexedMerkleMap(params) {
1799
+ const { map, name = "indexed-map", keyvalues, auth } = params;
1800
+ const serialized = serializeIndexedMap(map);
1801
+ const ipfsHash = await pinJSON({
1802
+ data: { map: serialized },
1803
+ name,
1804
+ keyvalues,
1805
+ auth
1806
+ });
1807
+ return ipfsHash;
1808
+ }
1809
+ function serializeIndexedMap(map) {
1810
+ return {
1811
+ height: map.height,
1812
+ root: map.root.toJSON(),
1813
+ length: map.length.toJSON(),
1814
+ nodes: JSON.stringify(map.data.get().nodes, (_, v) => typeof v === "bigint" ? "n" + bigintToBase64(v) : v),
1815
+ sortedLeaves: JSON.stringify(map.data.get().sortedLeaves.map((v) => [
1816
+ bigintToBase64(v.key),
1817
+ bigintToBase64(v.nextKey),
1818
+ bigintToBase64(v.value),
1819
+ bigintToBase64(BigInt(v.index))
1820
+ ]))
1821
+ };
1822
+ }
1823
+ function deserializeIndexedMerkleMap(params) {
1824
+ try {
1825
+ const { serializedIndexedMap, type } = params;
1826
+ return deserializeIndexedMerkleMapInternal({
1827
+ serializedIndexedMap,
1828
+ type: type ?? IndexedMerkleMap(serializedIndexedMap.height)
1829
+ });
1830
+ } catch (error) {
1831
+ console.error("Error deserializing map:", error?.message ?? error);
1832
+ return void 0;
1833
+ }
1834
+ }
1835
+ function parseIndexedMapSerialized(serializedMap) {
1836
+ const json = JSON.parse(serializedMap);
1837
+ if (json.height === void 0 || json.root === void 0 || json.length === void 0 || json.nodes === void 0 || json.sortedLeaves === void 0)
1838
+ throw new Error("wrong IndexedMerkleMap json format");
1839
+ if (typeof json.height !== "number")
1840
+ throw new Error("wrong IndexedMerkleMap height format");
1841
+ if (typeof json.root !== "string")
1842
+ throw new Error("wrong IndexedMerkleMap root format");
1843
+ if (typeof json.length !== "string")
1844
+ throw new Error("wrong IndexedMerkleMap length format");
1845
+ if (typeof json.nodes !== "string")
1846
+ throw new Error("wrong IndexedMerkleMap nodes format");
1847
+ if (typeof json.sortedLeaves !== "string")
1848
+ throw new Error("wrong IndexedMerkleMap sortedLeaves format");
1849
+ return json;
1850
+ }
1851
+ function deserializeIndexedMerkleMapInternal(params) {
1852
+ const { serializedIndexedMap, type } = params;
1853
+ const map = new type();
1854
+ if (serializedIndexedMap.height !== map.height) {
1855
+ throw new Error("wrong IndexedMap height");
1856
+ }
1857
+ const nodes = JSON.parse(serializedIndexedMap.nodes, (_, v) => {
1858
+ if (typeof v === "string" && v[0] === "n") {
1859
+ return bigintFromBase64(v.slice(1));
1860
+ }
1861
+ return v;
1862
+ });
1863
+ const sortedLeaves = JSON.parse(serializedIndexedMap.sortedLeaves).map((row) => {
1864
+ return {
1865
+ key: bigintFromBase64(row[0]),
1866
+ nextKey: bigintFromBase64(row[1]),
1867
+ value: bigintFromBase64(row[2]),
1868
+ index: Number(bigintFromBase64(row[3]))
1869
+ };
1870
+ });
1871
+ map.root = import_o1js6.Field.fromJSON(serializedIndexedMap.root);
1872
+ map.length = import_o1js6.Field.fromJSON(serializedIndexedMap.length);
1873
+ map.data.updateAsProver(() => {
1874
+ return {
1875
+ nodes: nodes.map((row) => [...row]),
1876
+ sortedLeaves: [...sortedLeaves]
1877
+ };
1878
+ });
1879
+ return map;
1880
+ }
1881
+
1882
+ // dist/node/mina/token/api.js
1883
+ var TokenAPI = class {
1884
+ constructor(params) {
1885
+ const { jwt, zkcloudworker, chain } = params;
1886
+ if (jwt === void 0)
1887
+ throw new Error("jwt is undefined");
1888
+ this.client = new zkCloudWorkerClient({
1889
+ jwt,
1890
+ chain,
1891
+ zkcloudworker
1892
+ });
1893
+ }
1894
+ async sendDeployTransaction(params) {
1895
+ const { symbol } = params;
1896
+ const transaction = JSON.stringify(params, null, 2);
1897
+ const answer = await this.client.execute({
1898
+ developer: "DFST",
1899
+ repo: "token-launchpad",
1900
+ transactions: [transaction],
1901
+ task: "deploy",
1902
+ args: JSON.stringify({ tokenAddress: params.tokenAddress }),
1903
+ metadata: `deploy token ${symbol}`
1904
+ });
1905
+ const jobId = answer.jobId;
1906
+ if (jobId === void 0)
1907
+ console.error("Deploy Job ID is undefined", { answer, symbol });
1908
+ return jobId;
1909
+ }
1910
+ async sendTransaction(params) {
1911
+ const { txType, symbol } = params;
1912
+ const transaction = JSON.stringify(params, null, 2);
1913
+ const answer = await this.client.execute({
1914
+ developer: "DFST",
1915
+ repo: "token-launchpad",
1916
+ transactions: [transaction],
1917
+ task: txType,
1918
+ args: JSON.stringify({ tokenAddress: params.tokenAddress }),
1919
+ metadata: `${txType} token${symbol ? ` ${symbol}` : ""}`
1920
+ });
1921
+ const jobId = answer.jobId;
1922
+ if (jobId === void 0)
1923
+ console.error("Job ID is undefined", { answer, txType, symbol });
1924
+ return jobId;
1925
+ }
1926
+ // Warning: this function will block the thread until the job is done and will print logs to the console
1927
+ // Do not use it in "use server" functions, use getResult instead
1928
+ async waitForJobResult(params) {
1929
+ const deployResult = await this.client.waitForJobResult(params);
1930
+ console.log("waitForJobResult result:", deployResult?.result?.result?.slice(0, 50));
1931
+ return deployResult?.result?.result ?? "error";
1932
+ }
1933
+ async getResult(jobId) {
1934
+ try {
1935
+ const callResult = await this.client.jobResult({ jobId });
1936
+ const jobStatus = callResult?.success === true ? callResult?.result?.jobStatus : void 0;
1937
+ if (!callResult.success) {
1938
+ return {
1939
+ success: false,
1940
+ error: callResult?.error,
1941
+ jobStatus
1942
+ };
1943
+ }
1944
+ const jobResult = callResult.result?.result;
1945
+ if (callResult.error)
1946
+ return {
1947
+ success: false,
1948
+ error: callResult.error,
1949
+ jobStatus
1950
+ };
1951
+ if (!jobResult)
1952
+ return { success: true, jobStatus };
1953
+ if (jobResult.toLowerCase().startsWith("error"))
1954
+ return {
1955
+ success: false,
1956
+ error: jobResult,
1957
+ jobStatus
1958
+ };
1959
+ try {
1960
+ const { success, tx, hash, error } = JSON.parse(jobResult);
1961
+ if (success === void 0)
1962
+ return {
1963
+ success: false,
1964
+ tx,
1965
+ hash,
1966
+ error,
1967
+ jobStatus
1968
+ };
1969
+ return { success, tx, hash, error, jobStatus };
1970
+ } catch (e) {
1971
+ return {
1972
+ success: false,
1973
+ error: `Error parsing job result: ${jobResult}`
1974
+ };
1975
+ }
1976
+ } catch (e) {
1977
+ return { success: false, error: `Error getting job result: ${e}` };
1978
+ }
1979
+ }
1980
+ };
1981
+
1982
+ // dist/node/mina/token/bid.js
1983
+ var import_tslib5 = require("tslib");
1984
+ var import_o1js13 = require("o1js");
1985
+
1986
+ // dist/node/mina/token/whitelist.js
1987
+ var import_o1js8 = require("o1js");
1988
+
1989
+ // dist/node/mina/storage/storage.js
1990
+ var import_o1js7 = require("o1js");
1991
+ var Storage = class _Storage extends (0, import_o1js7.Struct)({
1992
+ url: import_o1js7.Provable.Array(import_o1js7.Field, 2)
1993
+ }) {
1994
+ constructor(value) {
1995
+ super(value);
1996
+ }
1997
+ /**
1998
+ * Asserts that two Storage instances are equal.
1999
+ * @param a The first Storage instance.
2000
+ * @param b The second Storage instance.
2001
+ */
2002
+ static assertEquals(a, b) {
2003
+ a.url[0].assertEquals(b.url[0]);
2004
+ a.url[1].assertEquals(b.url[1]);
2005
+ }
2006
+ /**
2007
+ * Checks if two Storage instances are equal.
2008
+ * @param a The first Storage instance.
2009
+ * @param b The second Storage instance.
2010
+ * @returns A Bool indicating whether the two instances are equal.
2011
+ */
2012
+ static equals(a, b) {
2013
+ return a.url[0].equals(b.url[0]).and(a.url[1].equals(b.url[1]));
2014
+ }
2015
+ /**
2016
+ * Creates a Storage instance from a string.
2017
+ * @param url The string representing the storage URL.
2018
+ * @returns A new Storage instance.
2019
+ */
2020
+ static fromString(url) {
2021
+ const fields = import_o1js7.Encoding.stringToFields(url);
2022
+ if (fields.length !== 2)
2023
+ throw new Error("Invalid string length");
2024
+ return new _Storage({ url: [fields[0], fields[1]] });
2025
+ }
2026
+ /**
2027
+ * Converts the Storage instance to a string.
2028
+ * @returns The string representation of the storage URL.
2029
+ */
2030
+ toString() {
2031
+ if (this.url[0].toBigInt() === 0n && this.url[1].toBigInt() === 0n) {
2032
+ throw new Error("Invalid string");
2033
+ }
2034
+ return import_o1js7.Encoding.stringFromFields([this.url[0], this.url[1]]);
2035
+ }
2036
+ };
2037
+
2038
+ // dist/node/mina/storage/ipfs.js
2039
+ function createIpfsURL(params) {
2040
+ let { hash, gateway, apiToken } = params;
2041
+ gateway ??= process.env.PINATA_IPFS_GATEWAY ?? process.env.NEXT_PUBLIC_PINATA_IPFS_GATEWAY ?? process.env.REACT_APP_PINATA_IPFS_GATEWAY;
2042
+ apiToken ??= process.env.PINATA_GATEWAY_TOKEN ?? process.env.NEXT_PUBLIC_PINATA_GATEWAY_TOKEN ?? process.env.REACT_APP_PINATA_GATEWAY_TOKEN;
2043
+ if (!gateway) {
2044
+ gateway = "https://gateway.pinata.cloud/ipfs/";
2045
+ }
2046
+ return gateway + hash + (apiToken ? "?pinataGatewayToken=" + apiToken : "");
2047
+ }
2048
+
2049
+ // dist/node/mina/token/whitelist.js
2050
+ var { IndexedMerkleMap: IndexedMerkleMap2 } = import_o1js8.Experimental;
2051
+ var WHITELIST_HEIGHT = 20;
2052
+ var WhitelistMap = class extends IndexedMerkleMap2(WHITELIST_HEIGHT) {
2053
+ };
2054
+ var WhitelistMapOption = class extends (0, import_o1js8.Option)(WhitelistMap) {
2055
+ };
2056
+ var UInt64Option = class extends (0, import_o1js8.Option)(import_o1js8.UInt64) {
2057
+ };
2058
+ var WhitelistedAddress = class extends (0, import_o1js8.Struct)({
2059
+ address: import_o1js8.PublicKey,
2060
+ amount: import_o1js8.UInt64
2061
+ // Maximum permitted amount of the transaction
2062
+ }) {
2063
+ };
2064
+ var Whitelist = class _Whitelist extends (0, import_o1js8.Struct)({
2065
+ /** The root hash of the Merkle tree representing the whitelist. */
2066
+ root: import_o1js8.Field,
2067
+ /** Off-chain storage information, typically an IPFS hash pointing to the whitelist data. */
2068
+ storage: Storage
2069
+ }) {
2070
+ isNone() {
2071
+ return this.root.equals((0, import_o1js8.Field)(0)).or(Storage.equals(this.storage, Storage.empty()));
2072
+ }
2073
+ isSome() {
2074
+ return this.isNone().not();
2075
+ }
2076
+ async load() {
2077
+ const isNone = this.isNone();
2078
+ const map = await import_o1js8.Provable.witnessAsync(WhitelistMapOption, async () => {
2079
+ if (isNone.toBoolean())
2080
+ return WhitelistMapOption.none();
2081
+ else
2082
+ return WhitelistMapOption.fromValue(await loadIndexedMerkleMap({
2083
+ url: createIpfsURL({ hash: this.storage.toString() }),
2084
+ type: WhitelistMap
2085
+ }));
2086
+ });
2087
+ isNone.assertEquals(map.isSome.not());
2088
+ const root = import_o1js8.Provable.if(map.isSome, map.orElse(new WhitelistMap()).root, (0, import_o1js8.Field)(0));
2089
+ root.equals(this.root);
2090
+ return map;
2091
+ }
2092
+ /**
2093
+ * The function fetches a whitelisted amount associated with a given address using a map and returns it
2094
+ * as a UInt64Option.
2095
+ * @param {PublicKey} address - The `address` parameter is of type `PublicKey`, which represents a
2096
+ * public key used in cryptography for various purposes such as encryption, digital signatures, and
2097
+ * authentication. In the context of the `fetchWhitelistedAmount` function, the `address` parameter is
2098
+ * used to retrieve a whitelisted amount
2099
+ * @returns The `fetchWhitelistedAmount` function returns a `Promise` that resolves to a `UInt64Option`
2100
+ * object. This object contains a `value` property representing the amount retrieved from a map based
2101
+ * on the provided address. The `isSome` property indicates whether the value is present or not.
2102
+ * The value is not present if the whitelist is NOT empty and the address is NOT whitelisted.
2103
+ * The value is present if the whitelist is NOT empty or the address IS whitelisted.
2104
+ * The value is present and equals to UInt64.MAXINT() if the whitelist IS empty.
2105
+ */
2106
+ async getWhitelistedAmount(address) {
2107
+ const map = await this.load();
2108
+ const key = import_o1js8.Poseidon.hashPacked(import_o1js8.PublicKey, address);
2109
+ const value = map.orElse(new WhitelistMap()).getOption(key);
2110
+ const valueField = value.orElse(import_o1js8.UInt64.MAXINT().value);
2111
+ valueField.assertLessThanOrEqual(import_o1js8.UInt64.MAXINT().value);
2112
+ const amount = import_o1js8.UInt64.Unsafe.fromField(valueField);
2113
+ return new UInt64Option({
2114
+ value: amount,
2115
+ isSome: value.isSome.or(this.isNone())
2116
+ });
2117
+ }
2118
+ static empty() {
2119
+ return new _Whitelist({
2120
+ root: (0, import_o1js8.Field)(0),
2121
+ storage: Storage.empty()
2122
+ });
2123
+ }
2124
+ /**
2125
+ * Creates a new whitelist and pins it to IPFS.
2126
+ * @param params - The parameters for creating the whitelist.
2127
+ * @returns A new `Whitelist` instance.
2128
+ */
2129
+ static async create(params) {
2130
+ const { name = "whitelist.json", keyvalues = [{ key: "library", value: "zkcloudworker" }], timeout = 60 * 1e3, attempts = 5, auth } = params;
2131
+ const list = typeof params.list[0].address === "string" ? params.list.map((item) => new WhitelistedAddress({
2132
+ address: import_o1js8.PublicKey.fromBase58(item.address),
2133
+ amount: item.amount ? import_o1js8.UInt64.from(item.amount) : import_o1js8.UInt64.MAXINT()
2134
+ })) : params.list;
2135
+ const map = new WhitelistMap();
2136
+ for (const item of list) {
2137
+ map.insert(import_o1js8.Poseidon.hashPacked(import_o1js8.PublicKey, item.address), item.amount.toBigInt());
2138
+ }
2139
+ const serializedMap = serializeIndexedMap(map);
2140
+ const json = {
2141
+ map: serializedMap,
2142
+ whitelist: list.map((item) => ({
2143
+ address: item.address.toBase58(),
2144
+ amount: Number(item.amount.toBigInt())
2145
+ }))
2146
+ };
2147
+ let attempt = 0;
2148
+ const start = Date.now();
2149
+ let hash = await pinJSON({
2150
+ data: json,
2151
+ name,
2152
+ keyvalues,
2153
+ auth
2154
+ });
2155
+ while (!hash && attempt < attempts && Date.now() - start < timeout) {
2156
+ attempt++;
2157
+ await sleep(5e3 * attempt);
2158
+ hash = await pinJSON({
2159
+ data: json,
2160
+ name,
2161
+ keyvalues,
2162
+ auth
2163
+ });
2164
+ }
2165
+ if (!hash)
2166
+ throw new Error("Failed to pin whitelist");
2167
+ return new _Whitelist({
2168
+ root: map.root,
2169
+ storage: Storage.fromString(hash)
2170
+ });
2171
+ }
2172
+ };
2173
+
2174
+ // dist/node/mina/token/FungibleTokenContract.js
2175
+ var import_tslib = require("tslib");
2176
+ var import_o1js9 = require("o1js");
2177
+ var FungibleTokenErrors = {
2178
+ noAdminKey: "could not fetch admin contract key",
2179
+ noPermissionToChangeAdmin: "Not allowed to change admin contract",
2180
+ tokenPaused: "Token is currently paused",
2181
+ noPermissionToMint: "Not allowed to mint tokens",
2182
+ noPermissionToPause: "Not allowed to pause token",
2183
+ noPermissionToResume: "Not allowed to resume token",
2184
+ noTransferFromCirculation: "Can't transfer to/from the circulation account",
2185
+ noPermissionChangeAllowed: "Can't change permissions for access or receive on token accounts",
2186
+ flashMinting: "Flash-minting or unbalanced transaction detected. Please make sure that your transaction is balanced, and that your `AccountUpdate`s are ordered properly, so that tokens are not received before they are sent.",
2187
+ unbalancedTransaction: "Transaction is unbalanced"
2188
+ };
2189
+ function FungibleTokenContract(adminContract) {
2190
+ class FungibleToken2 extends import_o1js9.TokenContract {
2191
+ constructor() {
2192
+ super(...arguments);
2193
+ this.decimals = (0, import_o1js9.State)();
2194
+ this.admin = (0, import_o1js9.State)();
2195
+ this.paused = (0, import_o1js9.State)();
2196
+ this.events = {
2197
+ SetAdmin: SetAdminEvent,
2198
+ Pause: PauseEvent,
2199
+ Mint: MintEvent,
2200
+ Burn: BurnEvent,
2201
+ BalanceChange: BalanceChangeEvent
2202
+ };
2203
+ }
2204
+ async deploy(props) {
2205
+ await super.deploy(props);
2206
+ this.paused.set((0, import_o1js9.Bool)(true));
2207
+ this.account.zkappUri.set(props.src);
2208
+ this.account.tokenSymbol.set(props.symbol);
2209
+ this.account.permissions.set({
2210
+ ...import_o1js9.Permissions.default(),
2211
+ setVerificationKey: import_o1js9.Permissions.VerificationKey.impossibleDuringCurrentVersion(),
2212
+ setPermissions: import_o1js9.Permissions.impossible(),
2213
+ access: import_o1js9.Permissions.proof()
2214
+ });
2215
+ }
2216
+ /** Update the verification key.
2217
+ * Note that because we have set the permissions for setting the verification key to `impossibleDuringCurrentVersion()`, this will only be possible in case of a protocol update that requires an update.
2218
+ */
2219
+ async updateVerificationKey(vk) {
2220
+ this.account.verificationKey.set(vk);
2221
+ }
2222
+ /** Initializes the account for tracking total circulation.
2223
+ * @argument {PublicKey} admin - public key where the admin contract is deployed
2224
+ * @argument {UInt8} decimals - number of decimals for the token
2225
+ * @argument {Bool} startPaused - if set to `Bool(true), the contract will start in a mode where token minting and transfers are paused. This should be used for non-atomic deployments
2226
+ */
2227
+ async initialize(admin, decimals, startPaused) {
2228
+ this.account.provedState.requireEquals((0, import_o1js9.Bool)(false));
2229
+ this.admin.set(admin);
2230
+ this.decimals.set(decimals);
2231
+ this.paused.set((0, import_o1js9.Bool)(false));
2232
+ this.paused.set(startPaused);
2233
+ const accountUpdate = import_o1js9.AccountUpdate.createSigned(this.address, this.deriveTokenId());
2234
+ let permissions = import_o1js9.Permissions.default();
2235
+ permissions.send = import_o1js9.Permissions.none();
2236
+ permissions.setPermissions = import_o1js9.Permissions.impossible();
2237
+ accountUpdate.account.permissions.set(permissions);
2238
+ }
2239
+ async getAdminContract() {
2240
+ const admin = await import_o1js9.Provable.witnessAsync(import_o1js9.PublicKey, async () => {
2241
+ let pk = await this.admin.fetch();
2242
+ (0, import_o1js9.assert)(pk !== void 0, FungibleTokenErrors.noAdminKey);
2243
+ return pk;
2244
+ });
2245
+ this.admin.requireEquals(admin);
2246
+ return new adminContract(admin);
2247
+ }
2248
+ async setAdmin(admin) {
2249
+ const adminContract2 = await this.getAdminContract();
2250
+ const canChangeAdmin = await adminContract2.canChangeAdmin(admin);
2251
+ canChangeAdmin.assertTrue(FungibleTokenErrors.noPermissionToChangeAdmin);
2252
+ this.admin.set(admin);
2253
+ this.emitEvent("SetAdmin", new SetAdminEvent({ adminKey: admin }));
2254
+ }
2255
+ async mint(recipient, amount) {
2256
+ this.paused.getAndRequireEquals().assertFalse(FungibleTokenErrors.tokenPaused);
2257
+ const accountUpdate = this.internal.mint({ address: recipient, amount });
2258
+ const adminContract2 = await this.getAdminContract();
2259
+ const canMint = await adminContract2.canMint(accountUpdate);
2260
+ canMint.assertTrue(FungibleTokenErrors.noPermissionToMint);
2261
+ recipient.equals(this.address).assertFalse(FungibleTokenErrors.noTransferFromCirculation);
2262
+ this.approve(accountUpdate);
2263
+ this.emitEvent("Mint", new MintEvent({ recipient, amount }));
2264
+ const circulationUpdate = import_o1js9.AccountUpdate.create(this.address, this.deriveTokenId());
2265
+ circulationUpdate.balanceChange = import_o1js9.Int64.fromUnsigned(amount);
2266
+ return accountUpdate;
2267
+ }
2268
+ async burn(from, amount) {
2269
+ this.paused.getAndRequireEquals().assertFalse(FungibleTokenErrors.tokenPaused);
2270
+ const accountUpdate = this.internal.burn({ address: from, amount });
2271
+ const circulationUpdate = import_o1js9.AccountUpdate.create(this.address, this.deriveTokenId());
2272
+ from.equals(this.address).assertFalse(FungibleTokenErrors.noTransferFromCirculation);
2273
+ circulationUpdate.balanceChange = import_o1js9.Int64.fromUnsigned(amount).neg();
2274
+ this.emitEvent("Burn", new BurnEvent({ from, amount }));
2275
+ return accountUpdate;
2276
+ }
2277
+ async pause() {
2278
+ const adminContract2 = await this.getAdminContract();
2279
+ const canPause = await adminContract2.canPause();
2280
+ canPause.assertTrue(FungibleTokenErrors.noPermissionToPause);
2281
+ this.paused.set((0, import_o1js9.Bool)(true));
2282
+ this.emitEvent("Pause", new PauseEvent({ isPaused: (0, import_o1js9.Bool)(true) }));
2283
+ }
2284
+ async resume() {
2285
+ const adminContract2 = await this.getAdminContract();
2286
+ const canResume = await adminContract2.canResume();
2287
+ canResume.assertTrue(FungibleTokenErrors.noPermissionToResume);
2288
+ this.paused.set((0, import_o1js9.Bool)(false));
2289
+ this.emitEvent("Pause", new PauseEvent({ isPaused: (0, import_o1js9.Bool)(false) }));
2290
+ }
2291
+ async transfer(from, to, amount) {
2292
+ this.paused.getAndRequireEquals().assertFalse(FungibleTokenErrors.tokenPaused);
2293
+ from.equals(this.address).assertFalse(FungibleTokenErrors.noTransferFromCirculation);
2294
+ to.equals(this.address).assertFalse(FungibleTokenErrors.noTransferFromCirculation);
2295
+ this.internal.send({ from, to, amount });
2296
+ }
2297
+ checkPermissionsUpdate(update) {
2298
+ let permissions = update.update.permissions;
2299
+ let { access, receive } = permissions.value;
2300
+ let accessIsNone = import_o1js9.Provable.equal(import_o1js9.Types.AuthRequired, access, import_o1js9.Permissions.none());
2301
+ let receiveIsNone = import_o1js9.Provable.equal(import_o1js9.Types.AuthRequired, receive, import_o1js9.Permissions.none());
2302
+ let updateAllowed = accessIsNone.and(receiveIsNone);
2303
+ (0, import_o1js9.assert)(updateAllowed.or(permissions.isSome.not()), FungibleTokenErrors.noPermissionChangeAllowed);
2304
+ }
2305
+ /** Approve `AccountUpdate`s that have been created outside of the token contract.
2306
+ *
2307
+ * @argument {AccountUpdateForest} updates - The `AccountUpdate`s to approve. Note that the forest size is limited by the base token contract, @see TokenContract.MAX_ACCOUNT_UPDATES The current limit is 9.
2308
+ */
2309
+ async approveBase(updates) {
2310
+ this.paused.getAndRequireEquals().assertFalse(FungibleTokenErrors.tokenPaused);
2311
+ let totalBalance = import_o1js9.Int64.from(0);
2312
+ this.forEachUpdate(updates, (update, usesToken) => {
2313
+ this.checkPermissionsUpdate(update);
2314
+ this.emitEventIf(usesToken, "BalanceChange", new BalanceChangeEvent({
2315
+ address: update.publicKey,
2316
+ amount: update.balanceChange
2317
+ }));
2318
+ update.publicKey.equals(this.address).and(usesToken).assertFalse(FungibleTokenErrors.noTransferFromCirculation);
2319
+ totalBalance = import_o1js9.Provable.if(usesToken, totalBalance.add(update.balanceChange), totalBalance);
2320
+ totalBalance.isPositive().assertFalse(FungibleTokenErrors.flashMinting);
2321
+ });
2322
+ totalBalance.assertEquals(import_o1js9.Int64.zero, FungibleTokenErrors.unbalancedTransaction);
2323
+ }
2324
+ async getBalanceOf(address) {
2325
+ const account = import_o1js9.AccountUpdate.create(address, this.deriveTokenId()).account;
2326
+ const balance = account.balance.get();
2327
+ account.balance.requireEquals(balance);
2328
+ return balance;
2329
+ }
2330
+ /** Reports the current circulating supply
2331
+ * This does take into account currently unreduced actions.
2332
+ */
2333
+ async getCirculating() {
2334
+ let circulating = await this.getBalanceOf(this.address);
2335
+ return circulating;
2336
+ }
2337
+ async getDecimals() {
2338
+ return this.decimals.getAndRequireEquals();
2339
+ }
2340
+ }
2341
+ (0, import_tslib.__decorate)([
2342
+ (0, import_o1js9.state)(import_o1js9.UInt8),
2343
+ (0, import_tslib.__metadata)("design:type", Object)
2344
+ ], FungibleToken2.prototype, "decimals", void 0);
2345
+ (0, import_tslib.__decorate)([
2346
+ (0, import_o1js9.state)(import_o1js9.PublicKey),
2347
+ (0, import_tslib.__metadata)("design:type", Object)
2348
+ ], FungibleToken2.prototype, "admin", void 0);
2349
+ (0, import_tslib.__decorate)([
2350
+ (0, import_o1js9.state)(import_o1js9.Bool),
2351
+ (0, import_tslib.__metadata)("design:type", Object)
2352
+ ], FungibleToken2.prototype, "paused", void 0);
2353
+ (0, import_tslib.__decorate)([
2354
+ import_o1js9.method,
2355
+ (0, import_tslib.__metadata)("design:type", Function),
2356
+ (0, import_tslib.__metadata)("design:paramtypes", [import_o1js9.VerificationKey]),
2357
+ (0, import_tslib.__metadata)("design:returntype", Promise)
2358
+ ], FungibleToken2.prototype, "updateVerificationKey", null);
2359
+ (0, import_tslib.__decorate)([
2360
+ import_o1js9.method,
2361
+ (0, import_tslib.__metadata)("design:type", Function),
2362
+ (0, import_tslib.__metadata)("design:paramtypes", [import_o1js9.PublicKey, import_o1js9.UInt8, import_o1js9.Bool]),
2363
+ (0, import_tslib.__metadata)("design:returntype", Promise)
2364
+ ], FungibleToken2.prototype, "initialize", null);
2365
+ (0, import_tslib.__decorate)([
2366
+ import_o1js9.method,
2367
+ (0, import_tslib.__metadata)("design:type", Function),
2368
+ (0, import_tslib.__metadata)("design:paramtypes", [import_o1js9.PublicKey]),
2369
+ (0, import_tslib.__metadata)("design:returntype", Promise)
2370
+ ], FungibleToken2.prototype, "setAdmin", null);
2371
+ (0, import_tslib.__decorate)([
2372
+ import_o1js9.method.returns(import_o1js9.AccountUpdate),
2373
+ (0, import_tslib.__metadata)("design:type", Function),
2374
+ (0, import_tslib.__metadata)("design:paramtypes", [import_o1js9.PublicKey, import_o1js9.UInt64]),
2375
+ (0, import_tslib.__metadata)("design:returntype", Promise)
2376
+ ], FungibleToken2.prototype, "mint", null);
2377
+ (0, import_tslib.__decorate)([
2378
+ import_o1js9.method.returns(import_o1js9.AccountUpdate),
2379
+ (0, import_tslib.__metadata)("design:type", Function),
2380
+ (0, import_tslib.__metadata)("design:paramtypes", [import_o1js9.PublicKey, import_o1js9.UInt64]),
2381
+ (0, import_tslib.__metadata)("design:returntype", Promise)
2382
+ ], FungibleToken2.prototype, "burn", null);
2383
+ (0, import_tslib.__decorate)([
2384
+ import_o1js9.method,
2385
+ (0, import_tslib.__metadata)("design:type", Function),
2386
+ (0, import_tslib.__metadata)("design:paramtypes", []),
2387
+ (0, import_tslib.__metadata)("design:returntype", Promise)
2388
+ ], FungibleToken2.prototype, "pause", null);
2389
+ (0, import_tslib.__decorate)([
2390
+ import_o1js9.method,
2391
+ (0, import_tslib.__metadata)("design:type", Function),
2392
+ (0, import_tslib.__metadata)("design:paramtypes", []),
2393
+ (0, import_tslib.__metadata)("design:returntype", Promise)
2394
+ ], FungibleToken2.prototype, "resume", null);
2395
+ (0, import_tslib.__decorate)([
2396
+ import_o1js9.method,
2397
+ (0, import_tslib.__metadata)("design:type", Function),
2398
+ (0, import_tslib.__metadata)("design:paramtypes", [import_o1js9.PublicKey, import_o1js9.PublicKey, import_o1js9.UInt64]),
2399
+ (0, import_tslib.__metadata)("design:returntype", Promise)
2400
+ ], FungibleToken2.prototype, "transfer", null);
2401
+ (0, import_tslib.__decorate)([
2402
+ import_o1js9.method,
2403
+ (0, import_tslib.__metadata)("design:type", Function),
2404
+ (0, import_tslib.__metadata)("design:paramtypes", [import_o1js9.AccountUpdateForest]),
2405
+ (0, import_tslib.__metadata)("design:returntype", Promise)
2406
+ ], FungibleToken2.prototype, "approveBase", null);
2407
+ (0, import_tslib.__decorate)([
2408
+ import_o1js9.method.returns(import_o1js9.UInt64),
2409
+ (0, import_tslib.__metadata)("design:type", Function),
2410
+ (0, import_tslib.__metadata)("design:paramtypes", [import_o1js9.PublicKey]),
2411
+ (0, import_tslib.__metadata)("design:returntype", Promise)
2412
+ ], FungibleToken2.prototype, "getBalanceOf", null);
2413
+ (0, import_tslib.__decorate)([
2414
+ import_o1js9.method.returns(import_o1js9.UInt8),
2415
+ (0, import_tslib.__metadata)("design:type", Function),
2416
+ (0, import_tslib.__metadata)("design:paramtypes", []),
2417
+ (0, import_tslib.__metadata)("design:returntype", Promise)
2418
+ ], FungibleToken2.prototype, "getDecimals", null);
2419
+ return FungibleToken2;
2420
+ }
2421
+ var SetAdminEvent = class extends (0, import_o1js9.Struct)({
2422
+ adminKey: import_o1js9.PublicKey
2423
+ }) {
2424
+ };
2425
+ var PauseEvent = class extends (0, import_o1js9.Struct)({
2426
+ isPaused: import_o1js9.Bool
2427
+ }) {
2428
+ };
2429
+ var MintEvent = class extends (0, import_o1js9.Struct)({
2430
+ recipient: import_o1js9.PublicKey,
2431
+ amount: import_o1js9.UInt64
2432
+ }) {
2433
+ };
2434
+ var BurnEvent = class extends (0, import_o1js9.Struct)({
2435
+ from: import_o1js9.PublicKey,
2436
+ amount: import_o1js9.UInt64
2437
+ }) {
2438
+ };
2439
+ var BalanceChangeEvent = class extends (0, import_o1js9.Struct)({
2440
+ address: import_o1js9.PublicKey,
2441
+ amount: import_o1js9.Int64
2442
+ }) {
2443
+ };
2444
+
2445
+ // dist/node/mina/token/FungibleTokenAdmin.js
2446
+ var import_tslib2 = require("tslib");
2447
+ var import_o1js10 = require("o1js");
2448
+ var FungibleTokenAdmin = class extends import_o1js10.SmartContract {
2449
+ constructor() {
2450
+ super(...arguments);
2451
+ this.adminPublicKey = (0, import_o1js10.State)();
2452
+ }
2453
+ async deploy(props) {
2454
+ await super.deploy(props);
2455
+ this.adminPublicKey.set(props.adminPublicKey);
2456
+ this.account.permissions.set({
2457
+ ...import_o1js10.Permissions.default(),
2458
+ setVerificationKey: import_o1js10.Permissions.VerificationKey.impossibleDuringCurrentVersion(),
2459
+ setPermissions: import_o1js10.Permissions.impossible()
2460
+ });
2461
+ }
2462
+ /** Update the verification key.
2463
+ * Note that because we have set the permissions for setting the verification key to `impossibleDuringCurrentVersion()`, this will only be possible in case of a protocol update that requires an update.
2464
+ */
2465
+ async updateVerificationKey(vk) {
2466
+ this.account.verificationKey.set(vk);
2467
+ }
2468
+ async ensureAdminSignature() {
2469
+ const admin = await import_o1js10.Provable.witnessAsync(import_o1js10.PublicKey, async () => {
2470
+ let pk = await this.adminPublicKey.fetch();
2471
+ (0, import_o1js10.assert)(pk !== void 0, "could not fetch admin public key");
2472
+ return pk;
2473
+ });
2474
+ this.adminPublicKey.requireEquals(admin);
2475
+ return import_o1js10.AccountUpdate.createSigned(admin);
2476
+ }
2477
+ async canMint(_accountUpdate) {
2478
+ await this.ensureAdminSignature();
2479
+ return (0, import_o1js10.Bool)(true);
2480
+ }
2481
+ async canChangeAdmin(_admin) {
2482
+ await this.ensureAdminSignature();
2483
+ return (0, import_o1js10.Bool)(true);
2484
+ }
2485
+ async canPause() {
2486
+ await this.ensureAdminSignature();
2487
+ return (0, import_o1js10.Bool)(true);
2488
+ }
2489
+ async canResume() {
2490
+ await this.ensureAdminSignature();
2491
+ return (0, import_o1js10.Bool)(true);
2492
+ }
2493
+ };
2494
+ (0, import_tslib2.__decorate)([
2495
+ (0, import_o1js10.state)(import_o1js10.PublicKey),
2496
+ (0, import_tslib2.__metadata)("design:type", Object)
2497
+ ], FungibleTokenAdmin.prototype, "adminPublicKey", void 0);
2498
+ (0, import_tslib2.__decorate)([
2499
+ import_o1js10.method,
2500
+ (0, import_tslib2.__metadata)("design:type", Function),
2501
+ (0, import_tslib2.__metadata)("design:paramtypes", [import_o1js10.VerificationKey]),
2502
+ (0, import_tslib2.__metadata)("design:returntype", Promise)
2503
+ ], FungibleTokenAdmin.prototype, "updateVerificationKey", null);
2504
+ (0, import_tslib2.__decorate)([
2505
+ import_o1js10.method.returns(import_o1js10.Bool),
2506
+ (0, import_tslib2.__metadata)("design:type", Function),
2507
+ (0, import_tslib2.__metadata)("design:paramtypes", [import_o1js10.AccountUpdate]),
2508
+ (0, import_tslib2.__metadata)("design:returntype", Promise)
2509
+ ], FungibleTokenAdmin.prototype, "canMint", null);
2510
+ (0, import_tslib2.__decorate)([
2511
+ import_o1js10.method.returns(import_o1js10.Bool),
2512
+ (0, import_tslib2.__metadata)("design:type", Function),
2513
+ (0, import_tslib2.__metadata)("design:paramtypes", [import_o1js10.PublicKey]),
2514
+ (0, import_tslib2.__metadata)("design:returntype", Promise)
2515
+ ], FungibleTokenAdmin.prototype, "canChangeAdmin", null);
2516
+ (0, import_tslib2.__decorate)([
2517
+ import_o1js10.method.returns(import_o1js10.Bool),
2518
+ (0, import_tslib2.__metadata)("design:type", Function),
2519
+ (0, import_tslib2.__metadata)("design:paramtypes", []),
2520
+ (0, import_tslib2.__metadata)("design:returntype", Promise)
2521
+ ], FungibleTokenAdmin.prototype, "canPause", null);
2522
+ (0, import_tslib2.__decorate)([
2523
+ import_o1js10.method.returns(import_o1js10.Bool),
2524
+ (0, import_tslib2.__metadata)("design:type", Function),
2525
+ (0, import_tslib2.__metadata)("design:paramtypes", []),
2526
+ (0, import_tslib2.__metadata)("design:returntype", Promise)
2527
+ ], FungibleTokenAdmin.prototype, "canResume", null);
2528
+
2529
+ // dist/node/mina/token/FungibleTokenWhitelistedAdmin.js
2530
+ var import_tslib3 = require("tslib");
2531
+ var import_o1js11 = require("o1js");
2532
+ var FungibleTokenWhitelistedAdmin = class extends import_o1js11.SmartContract {
2533
+ constructor() {
2534
+ super(...arguments);
2535
+ this.adminPublicKey = (0, import_o1js11.State)();
2536
+ this.whitelist = (0, import_o1js11.State)();
2537
+ this.events = { updateWhitelist: Whitelist };
2538
+ }
2539
+ async deploy(props) {
2540
+ await super.deploy(props);
2541
+ this.adminPublicKey.set(props.adminPublicKey);
2542
+ this.whitelist.set(props.whitelist);
2543
+ this.account.permissions.set({
2544
+ ...import_o1js11.Permissions.default(),
2545
+ setVerificationKey: import_o1js11.Permissions.VerificationKey.impossibleDuringCurrentVersion(),
2546
+ setPermissions: import_o1js11.Permissions.impossible()
2547
+ });
2548
+ }
2549
+ /** Update the verification key.
2550
+ * Note that because we have set the permissions for setting the verification key to `impossibleDuringCurrentVersion()`, this will only be possible in case of a protocol update that requires an update.
2551
+ */
2552
+ async updateVerificationKey(vk) {
2553
+ this.account.verificationKey.set(vk);
2554
+ }
2555
+ async ensureAdminSignature() {
2556
+ const admin = await import_o1js11.Provable.witnessAsync(import_o1js11.PublicKey, async () => {
2557
+ let pk = await this.adminPublicKey.fetch();
2558
+ (0, import_o1js11.assert)(pk !== void 0, "could not fetch admin public key");
2559
+ return pk;
2560
+ });
2561
+ this.adminPublicKey.requireEquals(admin);
2562
+ return import_o1js11.AccountUpdate.createSigned(admin);
2563
+ }
2564
+ async canMint(_accountUpdate) {
2565
+ const address = _accountUpdate.body.publicKey;
2566
+ const balanceChange = _accountUpdate.body.balanceChange;
2567
+ balanceChange.isPositive().assertTrue();
2568
+ const whitelist = this.whitelist.getAndRequireEquals();
2569
+ const whitelistedAmount = await whitelist.getWhitelistedAmount(address);
2570
+ return balanceChange.magnitude.lessThanOrEqual(
2571
+ whitelistedAmount.orElse(import_o1js11.UInt64.from(0))
2572
+ // here can be a minimum amount allowed by travel rule instead of 0
2573
+ );
2574
+ }
2575
+ async canChangeAdmin(_admin) {
2576
+ await this.ensureAdminSignature();
2577
+ return (0, import_o1js11.Bool)(true);
2578
+ }
2579
+ async canPause() {
2580
+ await this.ensureAdminSignature();
2581
+ return (0, import_o1js11.Bool)(true);
2582
+ }
2583
+ async canResume() {
2584
+ await this.ensureAdminSignature();
2585
+ return (0, import_o1js11.Bool)(true);
2586
+ }
2587
+ async updateWhitelist(whitelist) {
2588
+ const admin = this.adminPublicKey.getAndRequireEquals();
2589
+ const sender = this.sender.getUnconstrained();
2590
+ const senderUpdate = import_o1js11.AccountUpdate.createSigned(sender);
2591
+ senderUpdate.body.useFullCommitment = (0, import_o1js11.Bool)(true);
2592
+ admin.assertEquals(sender);
2593
+ this.whitelist.set(whitelist);
2594
+ this.emitEvent("updateWhitelist", whitelist);
2595
+ }
2596
+ };
2597
+ (0, import_tslib3.__decorate)([
2598
+ (0, import_o1js11.state)(import_o1js11.PublicKey),
2599
+ (0, import_tslib3.__metadata)("design:type", Object)
2600
+ ], FungibleTokenWhitelistedAdmin.prototype, "adminPublicKey", void 0);
2601
+ (0, import_tslib3.__decorate)([
2602
+ (0, import_o1js11.state)(Whitelist),
2603
+ (0, import_tslib3.__metadata)("design:type", Object)
2604
+ ], FungibleTokenWhitelistedAdmin.prototype, "whitelist", void 0);
2605
+ (0, import_tslib3.__decorate)([
2606
+ import_o1js11.method,
2607
+ (0, import_tslib3.__metadata)("design:type", Function),
2608
+ (0, import_tslib3.__metadata)("design:paramtypes", [import_o1js11.VerificationKey]),
2609
+ (0, import_tslib3.__metadata)("design:returntype", Promise)
2610
+ ], FungibleTokenWhitelistedAdmin.prototype, "updateVerificationKey", null);
2611
+ (0, import_tslib3.__decorate)([
2612
+ import_o1js11.method.returns(import_o1js11.Bool),
2613
+ (0, import_tslib3.__metadata)("design:type", Function),
2614
+ (0, import_tslib3.__metadata)("design:paramtypes", [import_o1js11.AccountUpdate]),
2615
+ (0, import_tslib3.__metadata)("design:returntype", Promise)
2616
+ ], FungibleTokenWhitelistedAdmin.prototype, "canMint", null);
2617
+ (0, import_tslib3.__decorate)([
2618
+ import_o1js11.method.returns(import_o1js11.Bool),
2619
+ (0, import_tslib3.__metadata)("design:type", Function),
2620
+ (0, import_tslib3.__metadata)("design:paramtypes", [import_o1js11.PublicKey]),
2621
+ (0, import_tslib3.__metadata)("design:returntype", Promise)
2622
+ ], FungibleTokenWhitelistedAdmin.prototype, "canChangeAdmin", null);
2623
+ (0, import_tslib3.__decorate)([
2624
+ import_o1js11.method.returns(import_o1js11.Bool),
2625
+ (0, import_tslib3.__metadata)("design:type", Function),
2626
+ (0, import_tslib3.__metadata)("design:paramtypes", []),
2627
+ (0, import_tslib3.__metadata)("design:returntype", Promise)
2628
+ ], FungibleTokenWhitelistedAdmin.prototype, "canPause", null);
2629
+ (0, import_tslib3.__decorate)([
2630
+ import_o1js11.method.returns(import_o1js11.Bool),
2631
+ (0, import_tslib3.__metadata)("design:type", Function),
2632
+ (0, import_tslib3.__metadata)("design:paramtypes", []),
2633
+ (0, import_tslib3.__metadata)("design:returntype", Promise)
2634
+ ], FungibleTokenWhitelistedAdmin.prototype, "canResume", null);
2635
+ (0, import_tslib3.__decorate)([
2636
+ import_o1js11.method,
2637
+ (0, import_tslib3.__metadata)("design:type", Function),
2638
+ (0, import_tslib3.__metadata)("design:paramtypes", [Whitelist]),
2639
+ (0, import_tslib3.__metadata)("design:returntype", Promise)
2640
+ ], FungibleTokenWhitelistedAdmin.prototype, "updateWhitelist", null);
2641
+
2642
+ // dist/node/mina/token/offer.js
2643
+ var import_tslib4 = require("tslib");
2644
+ var import_o1js12 = require("o1js");
2645
+ var FungibleTokenOfferContract = class _FungibleTokenOfferContract extends import_o1js12.SmartContract {
2646
+ constructor() {
2647
+ super(...arguments);
2648
+ this.price = (0, import_o1js12.State)();
2649
+ this.seller = (0, import_o1js12.State)();
2650
+ this.token = (0, import_o1js12.State)();
2651
+ this.whitelist = (0, import_o1js12.State)();
2652
+ this.events = {
2653
+ offer: import_o1js12.UInt64,
2654
+ withdraw: import_o1js12.UInt64,
2655
+ buy: import_o1js12.UInt64,
2656
+ updateWhitelist: Whitelist
2657
+ };
2658
+ }
2659
+ async deploy(args) {
2660
+ await super.deploy(args);
2661
+ const verificationKey = args?.verificationKey ?? _FungibleTokenOfferContract._verificationKey;
2662
+ (0, import_o1js12.assert)(verificationKey !== void 0);
2663
+ const hash = typeof verificationKey.hash === "string" ? verificationKey.hash : verificationKey.hash.toJSON();
2664
+ const networkId = import_o1js12.Mina.getNetworkId();
2665
+ (0, import_o1js12.assert)(networkId === "mainnet" || networkId === "testnet");
2666
+ (0, import_o1js12.assert)(hash === tokenVerificationKeys[networkId].vk.FungibleTokenOfferContract.hash);
2667
+ (0, import_o1js12.assert)(verificationKey.data === tokenVerificationKeys[networkId].vk.FungibleTokenOfferContract.data);
2668
+ this.whitelist.set(args.whitelist);
2669
+ this.account.permissions.set({
2670
+ ...import_o1js12.Permissions.default(),
2671
+ send: import_o1js12.Permissions.proof(),
2672
+ setVerificationKey: import_o1js12.Permissions.VerificationKey.impossibleDuringCurrentVersion(),
2673
+ setPermissions: import_o1js12.Permissions.impossible()
2674
+ });
2675
+ }
2676
+ async initialize(seller, token, amount, price) {
2677
+ this.account.provedState.requireEquals((0, import_o1js12.Bool)(false));
2678
+ const tokenContract = new FungibleToken(token);
2679
+ const tokenId = tokenContract.deriveTokenId();
2680
+ tokenId.assertEquals(this.tokenId);
2681
+ await tokenContract.transfer(seller, this.address, amount);
2682
+ this.seller.set(seller);
2683
+ this.price.set(price);
2684
+ this.token.set(token);
2685
+ this.emitEvent("offer", amount);
2686
+ }
2687
+ async offer(amount, price) {
2688
+ const seller = this.seller.getAndRequireEquals();
2689
+ const token = this.token.getAndRequireEquals();
2690
+ const tokenContract = new FungibleToken(token);
2691
+ const tokenId = tokenContract.deriveTokenId();
2692
+ tokenId.assertEquals(this.tokenId);
2693
+ const balance = this.account.balance.getAndRequireEquals();
2694
+ const oldPrice = this.price.getAndRequireEquals();
2695
+ price.equals(oldPrice).or(balance.equals(import_o1js12.UInt64.from(0))).assertTrue();
2696
+ this.price.set(price);
2697
+ const sender = this.sender.getUnconstrained();
2698
+ const senderUpdate = import_o1js12.AccountUpdate.createSigned(sender);
2699
+ senderUpdate.body.useFullCommitment = (0, import_o1js12.Bool)(true);
2700
+ sender.assertEquals(seller);
2701
+ await tokenContract.transfer(sender, this.address, amount);
2702
+ this.emitEvent("offer", amount);
2703
+ }
2704
+ async withdraw(amount) {
2705
+ amount.equals(import_o1js12.UInt64.from(0)).assertFalse();
2706
+ this.account.balance.requireBetween(amount, import_o1js12.UInt64.MAXINT());
2707
+ const seller = this.seller.getAndRequireEquals();
2708
+ const token = this.token.getAndRequireEquals();
2709
+ const tokenContract = new FungibleToken(token);
2710
+ const tokenId = tokenContract.deriveTokenId();
2711
+ tokenId.assertEquals(this.tokenId);
2712
+ const sender = this.sender.getUnconstrained();
2713
+ const senderUpdate = import_o1js12.AccountUpdate.createSigned(sender, tokenId);
2714
+ senderUpdate.body.useFullCommitment = (0, import_o1js12.Bool)(true);
2715
+ sender.assertEquals(seller);
2716
+ let offerUpdate = this.send({ to: senderUpdate, amount });
2717
+ offerUpdate.body.mayUseToken = import_o1js12.AccountUpdate.MayUseToken.InheritFromParent;
2718
+ offerUpdate.body.useFullCommitment = (0, import_o1js12.Bool)(true);
2719
+ this.emitEvent("withdraw", amount);
2720
+ }
2721
+ async buy(amount) {
2722
+ amount.equals(import_o1js12.UInt64.from(0)).assertFalse();
2723
+ this.account.balance.requireBetween(amount, import_o1js12.UInt64.MAXINT());
2724
+ const seller = this.seller.getAndRequireEquals();
2725
+ const token = this.token.getAndRequireEquals();
2726
+ const tokenContract = new FungibleToken(token);
2727
+ const tokenId = tokenContract.deriveTokenId();
2728
+ tokenId.assertEquals(this.tokenId);
2729
+ const price = this.price.getAndRequireEquals();
2730
+ const totalPriceField = price.value.mul(amount.value).div((0, import_o1js12.Field)(1e9));
2731
+ totalPriceField.assertLessThan(import_o1js12.UInt64.MAXINT().value, "totalPrice overflow");
2732
+ const totalPrice = import_o1js12.UInt64.Unsafe.fromField(totalPriceField);
2733
+ const buyer = this.sender.getUnconstrained();
2734
+ const buyerUpdate = import_o1js12.AccountUpdate.createSigned(buyer);
2735
+ buyerUpdate.send({ to: seller, amount: totalPrice });
2736
+ buyerUpdate.body.useFullCommitment = (0, import_o1js12.Bool)(true);
2737
+ let offerUpdate = this.send({ to: buyer, amount });
2738
+ offerUpdate.body.mayUseToken = import_o1js12.AccountUpdate.MayUseToken.InheritFromParent;
2739
+ offerUpdate.body.useFullCommitment = (0, import_o1js12.Bool)(true);
2740
+ const whitelist = this.whitelist.getAndRequireEquals();
2741
+ const whitelistedAmount = await whitelist.getWhitelistedAmount(buyer);
2742
+ amount.assertLessThanOrEqual(whitelistedAmount.assertSome());
2743
+ this.emitEvent("buy", amount);
2744
+ }
2745
+ async updateWhitelist(whitelist) {
2746
+ const seller = this.seller.getAndRequireEquals();
2747
+ const sender = this.sender.getUnconstrained();
2748
+ const senderUpdate = import_o1js12.AccountUpdate.createSigned(sender);
2749
+ senderUpdate.body.useFullCommitment = (0, import_o1js12.Bool)(true);
2750
+ sender.assertEquals(seller);
2751
+ this.whitelist.set(whitelist);
2752
+ this.emitEvent("updateWhitelist", whitelist);
2753
+ }
2754
+ };
2755
+ (0, import_tslib4.__decorate)([
2756
+ (0, import_o1js12.state)(import_o1js12.UInt64),
2757
+ (0, import_tslib4.__metadata)("design:type", Object)
2758
+ ], FungibleTokenOfferContract.prototype, "price", void 0);
2759
+ (0, import_tslib4.__decorate)([
2760
+ (0, import_o1js12.state)(import_o1js12.PublicKey),
2761
+ (0, import_tslib4.__metadata)("design:type", Object)
2762
+ ], FungibleTokenOfferContract.prototype, "seller", void 0);
2763
+ (0, import_tslib4.__decorate)([
2764
+ (0, import_o1js12.state)(import_o1js12.PublicKey),
2765
+ (0, import_tslib4.__metadata)("design:type", Object)
2766
+ ], FungibleTokenOfferContract.prototype, "token", void 0);
2767
+ (0, import_tslib4.__decorate)([
2768
+ (0, import_o1js12.state)(Whitelist),
2769
+ (0, import_tslib4.__metadata)("design:type", Object)
2770
+ ], FungibleTokenOfferContract.prototype, "whitelist", void 0);
2771
+ (0, import_tslib4.__decorate)([
2772
+ import_o1js12.method,
2773
+ (0, import_tslib4.__metadata)("design:type", Function),
2774
+ (0, import_tslib4.__metadata)("design:paramtypes", [
2775
+ import_o1js12.PublicKey,
2776
+ import_o1js12.PublicKey,
2777
+ import_o1js12.UInt64,
2778
+ import_o1js12.UInt64
2779
+ ]),
2780
+ (0, import_tslib4.__metadata)("design:returntype", Promise)
2781
+ ], FungibleTokenOfferContract.prototype, "initialize", null);
2782
+ (0, import_tslib4.__decorate)([
2783
+ import_o1js12.method,
2784
+ (0, import_tslib4.__metadata)("design:type", Function),
2785
+ (0, import_tslib4.__metadata)("design:paramtypes", [import_o1js12.UInt64, import_o1js12.UInt64]),
2786
+ (0, import_tslib4.__metadata)("design:returntype", Promise)
2787
+ ], FungibleTokenOfferContract.prototype, "offer", null);
2788
+ (0, import_tslib4.__decorate)([
2789
+ import_o1js12.method,
2790
+ (0, import_tslib4.__metadata)("design:type", Function),
2791
+ (0, import_tslib4.__metadata)("design:paramtypes", [import_o1js12.UInt64]),
2792
+ (0, import_tslib4.__metadata)("design:returntype", Promise)
2793
+ ], FungibleTokenOfferContract.prototype, "withdraw", null);
2794
+ (0, import_tslib4.__decorate)([
2795
+ import_o1js12.method,
2796
+ (0, import_tslib4.__metadata)("design:type", Function),
2797
+ (0, import_tslib4.__metadata)("design:paramtypes", [import_o1js12.UInt64]),
2798
+ (0, import_tslib4.__metadata)("design:returntype", Promise)
2799
+ ], FungibleTokenOfferContract.prototype, "buy", null);
2800
+ (0, import_tslib4.__decorate)([
2801
+ import_o1js12.method,
2802
+ (0, import_tslib4.__metadata)("design:type", Function),
2803
+ (0, import_tslib4.__metadata)("design:paramtypes", [Whitelist]),
2804
+ (0, import_tslib4.__metadata)("design:returntype", Promise)
2805
+ ], FungibleTokenOfferContract.prototype, "updateWhitelist", null);
2806
+
2807
+ // dist/node/mina/token/token.js
2808
+ var FungibleToken = FungibleTokenContract(FungibleTokenAdmin);
2809
+ var WhitelistedFungibleToken = FungibleTokenContract(FungibleTokenWhitelistedAdmin);
2810
+ var tokenVerificationKeys = {
2811
+ mainnet: {
2812
+ o1js: "2.1.0",
2813
+ zkcloudworker: "0.18.9",
2814
+ vk: {
2815
+ FungibleToken: {
2816
+ hash: "27787098481477206239805523694633411816874383698563160451006881053714904356680",
2817
+ data: "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"
2818
+ },
2819
+ FungibleTokenAdmin: {
2820
+ hash: "25901604630376752069358432490423434073212977760589721765585739320126139736123",
2821
+ data: "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"
2822
+ },
2823
+ WhitelistedFungibleToken: {
2824
+ hash: "27787098481477206239805523694633411816874383698563160451006881053714904356680",
2825
+ data: "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"
2826
+ },
2827
+ FungibleTokenWhitelistedAdmin: {
2828
+ hash: "19641412157595882526013339127483017677791543136878603715474182835463393277622",
2829
+ data: "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"
2830
+ },
2831
+ FungibleTokenBidContract: {
2832
+ hash: "13290952274336741358452297924879435304865306432909699834625876541003088475079",
2833
+ data: "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"
2834
+ },
2835
+ FungibleTokenOfferContract: {
2836
+ hash: "2858136391761960286699306196905265168181712302492280978164878175630383743048",
2837
+ data: "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"
2838
+ },
2839
+ FungibleTokenAdminMF: {
2840
+ hash: "25901604630376752069358432490423434073212977760589721765585739320126139736123",
2841
+ data: "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"
2842
+ },
2843
+ FungibleTokenMF: {
2844
+ hash: "27787098481477206239805523694633411816874383698563160451006881053714904356680",
2845
+ data: "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"
2846
+ }
2847
+ }
2848
+ },
2849
+ testnet: {
2850
+ o1js: "2.1.0",
2851
+ zkcloudworker: "0.18.9",
2852
+ vk: {
2853
+ FungibleToken: {
2854
+ hash: "22278758441605771858700252645311428360030262698072838723799702480887091310093",
2855
+ data: "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"
2856
+ },
2857
+ FungibleTokenAdmin: {
2858
+ hash: "15958550144671703080408884627087990244648824766878280780120011347457437134053",
2859
+ data: "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"
2860
+ },
2861
+ WhitelistedFungibleToken: {
2862
+ hash: "22278758441605771858700252645311428360030262698072838723799702480887091310093",
2863
+ data: "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"
2864
+ },
2865
+ FungibleTokenWhitelistedAdmin: {
2866
+ hash: "20172938263834569171197221661527530681186299670687606810012808881888777415767",
2867
+ data: "AABIgngjlzGeGj09WH03U6PAznPEF4NnCaghyiMLYqkzJJTnJIjQ/flXNfq69aHqTStPkTNS+jISqhEnhS8wev0EUK7fc6S6eW/kzZpQ4IlA4HmsmYoqVrqUcH0nC9d5dyurX5dFqAhl70ORTXMcW6MQAwmZj5M2St77NQULH/4vEs/KmtbXh5L/PVBg5rtnJ0Bpqrj9NNEWqhK7o4jxPLAWAdBKUACv5LhteyoPTQX8HtlPnBdOjd79hwHh+nuYxjRCb/QDnoDXOe1ZCqq6nLQZZuVwBcmEjhoq8FcjsRjzDkrTF97QD+4SXZQYh4jkRNIl8WqPbrtULWJO16+2RdUgeTXdLNG8kDXdoFOQiTejTifmQMnzjrsmvTibkqkBYQTpk5sneLEtYXpGywYeW2RP9zC5JH+1fxC65V83QrOGOEUOFJU4jKvNYEO7KNjJe05f3PgU2pVadclJbP6+6gMEMXltCgr4uGwqxKmmeB3TIi98HybQg6RdkBg/eFoN2g7PHo62gR8PGOpn76m3O2y2j068EgL/7q4BDN7aFQwOJqy3rxdfAtnokkyljdASBaHr2DSEYqNRu/Owke7/6502AMV1ITIyTvBLSupBoq7wbeMRi9dx/CgkO0CxvWngO/EBmJVP5woDpFbxKjXW/U/LM/Nd6MC9yXwXLwCuLs8q2zXow6wynXSP1GdmSNkOIh3k4/aRIIDYhZow9Gbj5RgAMcuaZ1voy9M5hXZk0cD4Tw0orPnWQwkYU4NCVaWnGL0hmhRptL0eU1kH97ZpqfdT2HFdqa3iEsLOpanfY8bGfDkFqP+xOLzR5Pd8KAra/r986NWsCIPsbsFe+9wp8MT5IPiV4kibvkVxcKPpPAQjypPY1+G9hr9Ln4I2Yj8Fi50pbxOZtvDNVzCuFORlFe4Xc/ojh5+RMv9dfirl5Q8GtQmSMtHWQ4GPxTyWtxu3zpT1mx2p0jI8dGro/TSpb1AvPbCCPLh+4F6KLOkWXLWd80JchajkxiZ4auf95zxnPz42JHSduL5S9ROD4rC+wBJ1WDQrz4S+2uf8c+xeZ5bwvhXDr8wvKdwdpr5ITdfEGaAg5Lhuk+KUDRQFYPz6ACAIMRKc5P3v21FARkZC6fhmOrSAsQtl7jMHw/Ann++C2N0U2UHPgSKuVuYhKoNkatPCphaVC93TSuVZ/oOBvDDCTC3MTKPfSR2DpIirG51LVrBZpdb39teyvj7Wjodg/x6qEBkbypE2auYYUJdumiZ68efTOLx6DuCFiq9hp57+wEweAMSBmIB2rcihIpKXUZ7oNPyCocYsSPdGcKQBPoBn5wxtN52mEQMzQV7a8z5Xcc1ELJtbY/NB4zXzazB/d+iCDsdBrZuVkiToKUH1nVgwakhlB9BaMN4sJRuxxqJPr8MwLJkf2v2SL2DCna+iD7SvpXs0BhLgye9eRMqoUsccmzQf+GKbaNd9G7TXjWGJV8TBiP8/Enfv+E0C0fqhUbjKD0kZ42BwMaJ7JzZqy6eC2w6YpRbEzdddIezPNRbqFF450/CGhuUaN7p2w4JTmnMMziicy0HXINl9aveIYVW94ySLgomDk28P/hKl23kMqB2v50zKakB4cCX9gCvO7TEfMK8IuxTemGGnFYCqb8Bv9+xiEBZo7byQ8jxwVLduIesZSgQaAMerP0oIdLKSsuSZgBxYHb7jxpNs/ZHYeisEtzCz9J/P1Uqf8OBc45F2zVeYrfKgnRz22cIQeC6ELNV/HudcsEMm9ohcEMwxsbBlH0YTOVrLGjN5yoyxzTLcQ2woWOrX+NPEkZwTruodK+LKqkbSod2IEtnZ0iFzcSgVrDJfKqUy0IuAqbkOd2E19ka655S3qu09CfJ0SCHfxwNmAgBSgVuJLHteRRboNMLGTS+jJDWfXqia3OyhVh0CdTq1DVNEkaUJzsQ8v8FXnNvkmApQbHF2UkRFs7INd/pNzWkdSUXJH48mb0rEZjaVZNVbkfAEngcz+0N3Dza8gYWWoi7IdhrUfDlFV1RJQmNXlRh/FvL42OxthVMGkfYoJ9GhO2GMy8158ogCBdzUs0kfB7zH0cJ8MXCyTEJ8shOZ0209taxzudXuhJ4fbckpqXZt8jiKODZbW9kJSvuApUxzGDJxQHlV0pfyEvHfbrjbTX8XuCVeMflQfQ+E7GNvTGLSFscIUvyrjIeEmsFgC2O7mscNj1u8sAVgRIyricvvO3Q9tFzAMuowo9lp6R6Wxu8wptJJVsoofDJqqcWfANif4QRi7ipZ9TGbaQ1ojg90V0oLjU82Tk5NaNzrLcyu2gvjJcj7CtnnuM2uFMBd7FDfRH0GKFS4p/h22/dSqP1AVCwg0numEPO9WUF+4mfKCbAuh/wygr6rGKwg34ELkbzICik="
2868
+ },
2869
+ FungibleTokenBidContract: {
2870
+ hash: "21028578844692686241145580941807588328600986400769755733788301125980472965477",
2871
+ data: "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"
2872
+ },
2873
+ FungibleTokenOfferContract: {
2874
+ hash: "12073217068283876954049572004931286804667636618982691926234972243181859812345",
2875
+ data: "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"
2876
+ },
2877
+ FungibleTokenAdminMF: {
2878
+ hash: "15958550144671703080408884627087990244648824766878280780120011347457437134053",
2879
+ data: "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"
2880
+ },
2881
+ FungibleTokenMF: {
2882
+ hash: "22278758441605771858700252645311428360030262698072838723799702480887091310093",
2883
+ data: "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"
2884
+ }
2885
+ }
2886
+ }
2887
+ };
2888
+
2889
+ // dist/node/mina/token/bid.js
2890
+ var FungibleTokenBidContract = class _FungibleTokenBidContract extends import_o1js13.SmartContract {
2891
+ constructor() {
2892
+ super(...arguments);
2893
+ this.price = (0, import_o1js13.State)();
2894
+ this.buyer = (0, import_o1js13.State)();
2895
+ this.token = (0, import_o1js13.State)();
2896
+ this.whitelist = (0, import_o1js13.State)();
2897
+ this.events = {
2898
+ bid: import_o1js13.UInt64,
2899
+ withdraw: import_o1js13.UInt64,
2900
+ sell: import_o1js13.UInt64,
2901
+ updateWhitelist: Whitelist
2902
+ };
2903
+ }
2904
+ async deploy(args) {
2905
+ await super.deploy(args);
2906
+ const verificationKey = args?.verificationKey ?? _FungibleTokenBidContract._verificationKey;
2907
+ (0, import_o1js13.assert)(verificationKey !== void 0);
2908
+ const hash = typeof verificationKey.hash === "string" ? verificationKey.hash : verificationKey.hash.toJSON();
2909
+ const networkId = import_o1js13.Mina.getNetworkId();
2910
+ (0, import_o1js13.assert)(networkId === "mainnet" || networkId === "testnet");
2911
+ (0, import_o1js13.assert)(hash === tokenVerificationKeys[networkId].vk.FungibleTokenBidContract.hash);
2912
+ (0, import_o1js13.assert)(verificationKey.data === tokenVerificationKeys[networkId].vk.FungibleTokenBidContract.data);
2913
+ this.whitelist.set(args.whitelist);
2914
+ this.account.permissions.set({
2915
+ ...import_o1js13.Permissions.default(),
2916
+ send: import_o1js13.Permissions.proof(),
2917
+ setVerificationKey: import_o1js13.Permissions.VerificationKey.impossibleDuringCurrentVersion(),
2918
+ setPermissions: import_o1js13.Permissions.impossible()
2919
+ });
2920
+ }
2921
+ async initialize(token, amount, price) {
2922
+ this.account.provedState.requireEquals((0, import_o1js13.Bool)(false));
2923
+ amount.equals(import_o1js13.UInt64.from(0)).assertFalse();
2924
+ const totalPriceField = price.value.mul(amount.value).div((0, import_o1js13.Field)(1e9));
2925
+ totalPriceField.assertLessThan(import_o1js13.UInt64.MAXINT().value, "totalPrice overflow");
2926
+ const totalPrice = import_o1js13.UInt64.Unsafe.fromField(totalPriceField);
2927
+ const buyer = this.sender.getUnconstrained();
2928
+ const buyerUpdate = import_o1js13.AccountUpdate.createSigned(buyer);
2929
+ buyerUpdate.send({ to: this.address, amount: totalPrice });
2930
+ buyerUpdate.body.useFullCommitment = (0, import_o1js13.Bool)(true);
2931
+ this.buyer.set(buyer);
2932
+ this.price.set(price);
2933
+ this.token.set(token);
2934
+ this.emitEvent("bid", amount);
2935
+ }
2936
+ async bid(amount, price) {
2937
+ amount.equals(import_o1js13.UInt64.from(0)).assertFalse();
2938
+ const balance = this.account.balance.getAndRequireEquals();
2939
+ const oldPrice = this.price.getAndRequireEquals();
2940
+ price.equals(oldPrice).or(balance.equals(import_o1js13.UInt64.from(0))).assertTrue();
2941
+ this.price.set(price);
2942
+ const totalPriceField = price.value.mul(amount.value).div((0, import_o1js13.Field)(1e9));
2943
+ totalPriceField.assertLessThan(import_o1js13.UInt64.MAXINT().value, "totalPrice overflow");
2944
+ const totalPrice = import_o1js13.UInt64.Unsafe.fromField(totalPriceField);
2945
+ const sender = this.sender.getUnconstrained();
2946
+ const buyer = this.buyer.getAndRequireEquals();
2947
+ sender.assertEquals(buyer);
2948
+ const buyerUpdate = import_o1js13.AccountUpdate.createSigned(buyer);
2949
+ buyerUpdate.send({ to: this.address, amount: totalPrice });
2950
+ buyerUpdate.body.useFullCommitment = (0, import_o1js13.Bool)(true);
2951
+ this.price.set(price);
2952
+ this.emitEvent("bid", amount);
2953
+ }
2954
+ async withdraw(amountInMina) {
2955
+ amountInMina.equals(import_o1js13.UInt64.from(0)).assertFalse();
2956
+ this.account.balance.requireBetween(amountInMina, import_o1js13.UInt64.MAXINT());
2957
+ const buyer = this.buyer.getAndRequireEquals();
2958
+ const sender = this.sender.getUnconstrained();
2959
+ const senderUpdate = import_o1js13.AccountUpdate.createSigned(sender);
2960
+ senderUpdate.body.useFullCommitment = (0, import_o1js13.Bool)(true);
2961
+ sender.assertEquals(buyer);
2962
+ let bidUpdate = this.send({ to: senderUpdate, amount: amountInMina });
2963
+ bidUpdate.body.useFullCommitment = (0, import_o1js13.Bool)(true);
2964
+ this.emitEvent("withdraw", amountInMina);
2965
+ }
2966
+ async sell(amount) {
2967
+ amount.equals(import_o1js13.UInt64.from(0)).assertFalse();
2968
+ const price = this.price.getAndRequireEquals();
2969
+ const totalPriceField = price.value.mul(amount.value).div((0, import_o1js13.Field)(1e9));
2970
+ totalPriceField.assertLessThan(import_o1js13.UInt64.MAXINT().value, "totalPrice overflow");
2971
+ const totalPrice = import_o1js13.UInt64.Unsafe.fromField(totalPriceField);
2972
+ this.account.balance.requireBetween(totalPrice, import_o1js13.UInt64.MAXINT());
2973
+ const buyer = this.buyer.getAndRequireEquals();
2974
+ const token = this.token.getAndRequireEquals();
2975
+ const seller = this.sender.getUnconstrained();
2976
+ const sellerUpdate = this.send({ to: seller, amount: totalPrice });
2977
+ sellerUpdate.body.useFullCommitment = (0, import_o1js13.Bool)(true);
2978
+ sellerUpdate.requireSignature();
2979
+ const tokenContract = new FungibleToken(token);
2980
+ await tokenContract.transfer(seller, buyer, amount);
2981
+ this.emitEvent("sell", amount);
2982
+ }
2983
+ async updateWhitelist(whitelist) {
2984
+ const buyer = this.buyer.getAndRequireEquals();
2985
+ const sender = this.sender.getUnconstrained();
2986
+ const senderUpdate = import_o1js13.AccountUpdate.createSigned(sender);
2987
+ senderUpdate.body.useFullCommitment = (0, import_o1js13.Bool)(true);
2988
+ sender.assertEquals(buyer);
2989
+ this.whitelist.set(whitelist);
2990
+ this.emitEvent("updateWhitelist", whitelist);
2991
+ }
2992
+ };
2993
+ (0, import_tslib5.__decorate)([
2994
+ (0, import_o1js13.state)(import_o1js13.UInt64),
2995
+ (0, import_tslib5.__metadata)("design:type", Object)
2996
+ ], FungibleTokenBidContract.prototype, "price", void 0);
2997
+ (0, import_tslib5.__decorate)([
2998
+ (0, import_o1js13.state)(import_o1js13.PublicKey),
2999
+ (0, import_tslib5.__metadata)("design:type", Object)
3000
+ ], FungibleTokenBidContract.prototype, "buyer", void 0);
3001
+ (0, import_tslib5.__decorate)([
3002
+ (0, import_o1js13.state)(import_o1js13.PublicKey),
3003
+ (0, import_tslib5.__metadata)("design:type", Object)
3004
+ ], FungibleTokenBidContract.prototype, "token", void 0);
3005
+ (0, import_tslib5.__decorate)([
3006
+ (0, import_o1js13.state)(Whitelist),
3007
+ (0, import_tslib5.__metadata)("design:type", Object)
3008
+ ], FungibleTokenBidContract.prototype, "whitelist", void 0);
3009
+ (0, import_tslib5.__decorate)([
3010
+ import_o1js13.method,
3011
+ (0, import_tslib5.__metadata)("design:type", Function),
3012
+ (0, import_tslib5.__metadata)("design:paramtypes", [import_o1js13.PublicKey, import_o1js13.UInt64, import_o1js13.UInt64]),
3013
+ (0, import_tslib5.__metadata)("design:returntype", Promise)
3014
+ ], FungibleTokenBidContract.prototype, "initialize", null);
3015
+ (0, import_tslib5.__decorate)([
3016
+ import_o1js13.method,
3017
+ (0, import_tslib5.__metadata)("design:type", Function),
3018
+ (0, import_tslib5.__metadata)("design:paramtypes", [import_o1js13.UInt64, import_o1js13.UInt64]),
3019
+ (0, import_tslib5.__metadata)("design:returntype", Promise)
3020
+ ], FungibleTokenBidContract.prototype, "bid", null);
3021
+ (0, import_tslib5.__decorate)([
3022
+ import_o1js13.method,
3023
+ (0, import_tslib5.__metadata)("design:type", Function),
3024
+ (0, import_tslib5.__metadata)("design:paramtypes", [import_o1js13.UInt64]),
3025
+ (0, import_tslib5.__metadata)("design:returntype", Promise)
3026
+ ], FungibleTokenBidContract.prototype, "withdraw", null);
3027
+ (0, import_tslib5.__decorate)([
3028
+ import_o1js13.method,
3029
+ (0, import_tslib5.__metadata)("design:type", Function),
3030
+ (0, import_tslib5.__metadata)("design:paramtypes", [import_o1js13.UInt64]),
3031
+ (0, import_tslib5.__metadata)("design:returntype", Promise)
3032
+ ], FungibleTokenBidContract.prototype, "sell", null);
3033
+ (0, import_tslib5.__decorate)([
3034
+ import_o1js13.method,
3035
+ (0, import_tslib5.__metadata)("design:type", Function),
3036
+ (0, import_tslib5.__metadata)("design:paramtypes", [Whitelist]),
3037
+ (0, import_tslib5.__metadata)("design:returntype", Promise)
3038
+ ], FungibleTokenBidContract.prototype, "updateWhitelist", null);
3039
+
3040
+ // dist/node/mina/token/build.js
3041
+ var import_o1js14 = require("o1js");
3042
+ async function buildTokenDeployTransaction(params) {
3043
+ const { fee: fee2, sender, nonce, memo, tokenAddress, adminContractAddress, uri, symbol, developerAddress, developerFee, provingKey, provingFee, decimals, chain, whitelist } = params;
3044
+ const isWhitelisted = whitelist !== void 0;
3045
+ if (memo && typeof memo !== "string")
3046
+ throw new Error("Memo must be a string");
3047
+ if (memo && memo.length > 30)
3048
+ throw new Error("Memo must be less than 30 characters");
3049
+ if (!symbol || typeof symbol !== "string")
3050
+ throw new Error("Symbol must be a string");
3051
+ if (symbol.length >= 7)
3052
+ throw new Error("Symbol must be less than 7 characters");
3053
+ const adminContract = isWhitelisted ? FungibleTokenWhitelistedAdmin : FungibleTokenAdmin;
3054
+ const tokenContract = isWhitelisted ? WhitelistedFungibleToken : FungibleToken;
3055
+ const vk = tokenVerificationKeys[chain === "mainnet" ? "mainnet" : "testnet"].vk;
3056
+ if (!vk || !vk.FungibleTokenWhitelistedAdmin || !vk.FungibleTokenWhitelistedAdmin.hash || !vk.FungibleTokenWhitelistedAdmin.data || !vk.FungibleTokenAdmin || !vk.FungibleTokenAdmin.hash || !vk.FungibleTokenAdmin.data || !vk.WhitelistedFungibleToken || !vk.WhitelistedFungibleToken.hash || !vk.WhitelistedFungibleToken.data || !vk.FungibleToken || !vk.FungibleToken.hash || !vk.FungibleToken.data)
3057
+ throw new Error("Cannot get verification keys");
3058
+ const adminVerificationKey = isWhitelisted ? vk.FungibleTokenWhitelistedAdmin : vk.FungibleTokenAdmin;
3059
+ const tokenVerificationKey = isWhitelisted ? vk.WhitelistedFungibleToken : vk.FungibleToken;
3060
+ if (!adminVerificationKey || !tokenVerificationKey)
3061
+ throw new Error("Cannot get verification keys");
3062
+ await fetchMinaAccount({
3063
+ publicKey: sender,
3064
+ force: true
3065
+ });
3066
+ if (!import_o1js14.Mina.hasAccount(sender)) {
3067
+ throw new Error("Sender does not have account");
3068
+ }
3069
+ console.log("Sender balance:", await accountBalanceMina(sender));
3070
+ const whitelistedAddresses = whitelist ? await Whitelist.create({ list: whitelist, name: symbol }) : void 0;
3071
+ const zkToken = new tokenContract(tokenAddress);
3072
+ const zkAdmin = new adminContract(adminContractAddress);
3073
+ const tx = await import_o1js14.Mina.transaction({ sender, fee: fee2, memo: memo ?? `deploy ${symbol}`, nonce }, async () => {
3074
+ const feeAccountUpdate = import_o1js14.AccountUpdate.createSigned(sender);
3075
+ feeAccountUpdate.balance.subInPlace(3e9);
3076
+ feeAccountUpdate.send({
3077
+ to: provingKey,
3078
+ amount: provingFee
3079
+ });
3080
+ if (developerAddress && developerFee) {
3081
+ feeAccountUpdate.send({
3082
+ to: developerAddress,
3083
+ amount: developerFee
3084
+ });
3085
+ }
3086
+ if (isWhitelisted && !whitelistedAddresses) {
3087
+ throw new Error("Whitelisted addresses not found");
3088
+ }
3089
+ await zkAdmin.deploy({
3090
+ adminPublicKey: sender,
3091
+ verificationKey: adminVerificationKey,
3092
+ whitelist: whitelistedAddresses
3093
+ });
3094
+ zkAdmin.account.zkappUri.set(uri);
3095
+ await zkToken.deploy({
3096
+ symbol,
3097
+ src: uri,
3098
+ verificationKey: tokenVerificationKey
3099
+ });
3100
+ await zkToken.initialize(
3101
+ adminContractAddress,
3102
+ decimals,
3103
+ // We can set `startPaused` to `Bool(false)` here, because we are doing an atomic deployment
3104
+ // If you are not deploying the admin and token contracts in the same transaction,
3105
+ // it is safer to start the tokens paused, and resume them only after verifying that
3106
+ // the admin contract has been deployed
3107
+ (0, import_o1js14.Bool)(false)
3108
+ );
3109
+ });
3110
+ return {
3111
+ tx,
3112
+ isWhitelisted,
3113
+ adminVerificationKey: {
3114
+ hash: (0, import_o1js14.Field)(adminVerificationKey.hash),
3115
+ data: adminVerificationKey.data
3116
+ },
3117
+ tokenVerificationKey: {
3118
+ hash: (0, import_o1js14.Field)(tokenVerificationKey.hash),
3119
+ data: tokenVerificationKey.data
3120
+ }
3121
+ };
3122
+ }
3123
+ async function buildTokenTransaction(params) {
3124
+ const { txType, chain, fee: fee2, sender, nonce, tokenAddress, from, to, amount, price, developerAddress, developerFee, provingKey, provingFee, whitelist } = params;
3125
+ console.log(txType, "tx for", tokenAddress.toBase58());
3126
+ console.log("Sender:", sender.toBase58());
3127
+ if (txType === "offer" || txType === "bid" || // direction is money direction as no token is moving
3128
+ txType === "mint" || txType === "transfer" || txType === "sell") {
3129
+ if (sender.toBase58() != from.toBase58())
3130
+ throw new Error("Invalid sender");
3131
+ }
3132
+ if (txType === "buy" || txType === "withdrawOffer" || txType === "withdrawBid") {
3133
+ if (sender.toBase58() != to.toBase58())
3134
+ throw new Error("Invalid sender");
3135
+ }
3136
+ await fetchMinaAccount({
3137
+ publicKey: sender,
3138
+ force: true
3139
+ });
3140
+ if (!import_o1js14.Mina.hasAccount(sender)) {
3141
+ console.error("Sender does not have account");
3142
+ throw new Error("Sender does not have account");
3143
+ }
3144
+ const { symbol, adminContractAddress, adminAddress, isWhitelisted } = await getTokenSymbolAndAdmin({
3145
+ tokenAddress,
3146
+ chain
3147
+ });
3148
+ const memo = params.memo ?? `${txType} ${symbol}`;
3149
+ const whitelistedAdminContract = new FungibleTokenWhitelistedAdmin(adminContractAddress);
3150
+ const tokenContract = isWhitelisted ? WhitelistedFungibleToken : FungibleToken;
3151
+ if ((txType === "whitelistAdmin" || txType === "whitelistBid" || txType === "whitelistOffer") && !whitelist) {
3152
+ throw new Error("Whitelist is required");
3153
+ }
3154
+ const whitelistedAddresses = whitelist ? await Whitelist.create({ list: whitelist, name: symbol }) : void 0;
3155
+ const zkToken = new tokenContract(tokenAddress);
3156
+ const tokenId = zkToken.deriveTokenId();
3157
+ if (txType === "mint" && adminAddress.toBase58() !== sender.toBase58())
3158
+ throw new Error("Invalid sender for mint");
3159
+ await fetchMinaAccount({
3160
+ publicKey: tokenAddress,
3161
+ tokenId,
3162
+ force: true
3163
+ });
3164
+ await fetchMinaAccount({
3165
+ publicKey: from,
3166
+ tokenId,
3167
+ force: [
3168
+ "offer",
3169
+ "sell",
3170
+ "transfer",
3171
+ "withdrawOffer"
3172
+ ].includes(txType)
3173
+ });
3174
+ await fetchMinaAccount({
3175
+ publicKey: to,
3176
+ tokenId,
3177
+ force: [
3178
+ "sell",
3179
+ "whitelistAdmin",
3180
+ "withdrawBid",
3181
+ "withdrawOffer"
3182
+ ].includes(txType)
3183
+ });
3184
+ const isNewAccount = import_o1js14.Mina.hasAccount(to, tokenId) === false;
3185
+ const offerContract = new FungibleTokenOfferContract([
3186
+ "offer",
3187
+ "whitelistOffer"
3188
+ ].includes(txType) ? to : from, tokenId);
3189
+ const bidContract = new FungibleTokenBidContract([
3190
+ "bid"
3191
+ ].includes(txType) ? from : to, tokenId);
3192
+ const offerContractDeployment = new FungibleTokenOfferContract(to, tokenId);
3193
+ const bidContractDeployment = new FungibleTokenBidContract(from, tokenId);
3194
+ const vk = tokenVerificationKeys[chain === "mainnet" ? "mainnet" : "testnet"].vk;
3195
+ if (!vk || !vk.FungibleTokenOfferContract || !vk.FungibleTokenOfferContract.hash || !vk.FungibleTokenOfferContract.data || !vk.FungibleTokenBidContract || !vk.FungibleTokenBidContract.hash || !vk.FungibleTokenBidContract.data || !vk.FungibleTokenWhitelistedAdmin || !vk.FungibleTokenWhitelistedAdmin.hash || !vk.FungibleTokenWhitelistedAdmin.data || !vk.FungibleTokenAdmin || !vk.FungibleTokenAdmin.hash || !vk.FungibleTokenAdmin.data || !vk.WhitelistedFungibleToken || !vk.WhitelistedFungibleToken.hash || !vk.WhitelistedFungibleToken.data || !vk.FungibleToken || !vk.FungibleToken.hash || !vk.FungibleToken.data)
3196
+ throw new Error("Cannot get verification key");
3197
+ const adminVerificationKey = isWhitelisted ? vk.FungibleTokenWhitelistedAdmin : vk.FungibleTokenAdmin;
3198
+ const tokenVerificationKey = isWhitelisted ? vk.WhitelistedFungibleToken : vk.FungibleToken;
3199
+ const offerVerificationKey = FungibleTokenOfferContract._verificationKey ?? {
3200
+ hash: (0, import_o1js14.Field)(vk.FungibleTokenOfferContract.hash),
3201
+ data: vk.FungibleTokenOfferContract.data
3202
+ };
3203
+ const bidVerificationKey = FungibleTokenBidContract._verificationKey ?? {
3204
+ hash: (0, import_o1js14.Field)(vk.FungibleTokenBidContract.hash),
3205
+ data: vk.FungibleTokenBidContract.data
3206
+ };
3207
+ console.log("Sender balance:", await accountBalanceMina(sender));
3208
+ console.log("New account:", isNewAccount);
3209
+ const tx = await import_o1js14.Mina.transaction({ sender, fee: fee2, memo, nonce }, async () => {
3210
+ const feeAccountUpdate = import_o1js14.AccountUpdate.createSigned(sender);
3211
+ if (isNewAccount) {
3212
+ feeAccountUpdate.balance.subInPlace(1e9);
3213
+ }
3214
+ feeAccountUpdate.send({
3215
+ to: provingKey,
3216
+ amount: provingFee
3217
+ });
3218
+ if (developerAddress && developerFee) {
3219
+ feeAccountUpdate.send({
3220
+ to: developerAddress,
3221
+ amount: developerFee
3222
+ });
3223
+ }
3224
+ switch (txType) {
3225
+ case "mint":
3226
+ if (amount === void 0)
3227
+ throw new Error("Error: Amount is required");
3228
+ await zkToken.mint(to, amount);
3229
+ break;
3230
+ case "transfer":
3231
+ if (amount === void 0)
3232
+ throw new Error("Error: Amount is required");
3233
+ await zkToken.transfer(from, to, amount);
3234
+ break;
3235
+ case "offer":
3236
+ if (price === void 0)
3237
+ throw new Error("Error: Price is required");
3238
+ if (amount === void 0)
3239
+ throw new Error("Error: Amount is required");
3240
+ if (isNewAccount) {
3241
+ await offerContractDeployment.deploy({
3242
+ verificationKey: offerVerificationKey,
3243
+ whitelist: whitelistedAddresses ?? Whitelist.empty()
3244
+ });
3245
+ offerContract.account.zkappUri.set(`Offer for ${symbol}`);
3246
+ await offerContract.initialize(sender, tokenAddress, amount, price);
3247
+ await zkToken.approveAccountUpdates([
3248
+ offerContractDeployment.self,
3249
+ offerContract.self
3250
+ ]);
3251
+ } else {
3252
+ await offerContract.offer(amount, price);
3253
+ await zkToken.approveAccountUpdate(offerContract.self);
3254
+ }
3255
+ break;
3256
+ case "buy":
3257
+ if (amount === void 0)
3258
+ throw new Error("Error: Amount is required");
3259
+ await offerContract.buy(amount);
3260
+ await zkToken.approveAccountUpdate(offerContract.self);
3261
+ break;
3262
+ case "withdrawOffer":
3263
+ if (amount === void 0)
3264
+ throw new Error("Error: Amount is required");
3265
+ await offerContract.withdraw(amount);
3266
+ await zkToken.approveAccountUpdate(offerContract.self);
3267
+ break;
3268
+ case "bid":
3269
+ if (price === void 0)
3270
+ throw new Error("Error: Price is required");
3271
+ if (amount === void 0)
3272
+ throw new Error("Error: Amount is required");
3273
+ if (isNewAccount) {
3274
+ await bidContractDeployment.deploy({
3275
+ verificationKey: bidVerificationKey,
3276
+ whitelist: whitelistedAddresses ?? Whitelist.empty()
3277
+ });
3278
+ bidContract.account.zkappUri.set(`Bid for ${symbol}`);
3279
+ await bidContract.initialize(tokenAddress, amount, price);
3280
+ await zkToken.approveAccountUpdates([
3281
+ bidContractDeployment.self,
3282
+ bidContract.self
3283
+ ]);
3284
+ } else {
3285
+ await bidContract.bid(amount, price);
3286
+ await zkToken.approveAccountUpdate(bidContract.self);
3287
+ }
3288
+ break;
3289
+ case "sell":
3290
+ if (amount === void 0)
3291
+ throw new Error("Error: Amount is required");
3292
+ await bidContract.sell(amount);
3293
+ await zkToken.approveAccountUpdate(bidContract.self);
3294
+ break;
3295
+ case "withdrawBid":
3296
+ if (amount === void 0)
3297
+ throw new Error("Error: Amount is required");
3298
+ await bidContract.withdraw(amount);
3299
+ await zkToken.approveAccountUpdate(bidContract.self);
3300
+ break;
3301
+ case "whitelistAdmin":
3302
+ if (!whitelistedAddresses)
3303
+ throw new Error("Whitelist is required");
3304
+ await whitelistedAdminContract.updateWhitelist(whitelistedAddresses);
3305
+ break;
3306
+ case "whitelistBid":
3307
+ if (!whitelistedAddresses)
3308
+ throw new Error("Whitelist is required");
3309
+ await bidContract.updateWhitelist(whitelistedAddresses);
3310
+ break;
3311
+ case "whitelistOffer":
3312
+ if (!whitelistedAddresses)
3313
+ throw new Error("Whitelist is required");
3314
+ await offerContract.updateWhitelist(whitelistedAddresses);
3315
+ await zkToken.approveAccountUpdate(offerContract.self);
3316
+ break;
3317
+ default:
3318
+ throw new Error(`Unknown transaction type: ${txType}`);
3319
+ }
3320
+ });
3321
+ return {
3322
+ tx,
3323
+ isWhitelisted,
3324
+ adminContractAddress,
3325
+ adminAddress,
3326
+ symbol,
3327
+ adminVerificationKey: {
3328
+ hash: (0, import_o1js14.Field)(adminVerificationKey.hash),
3329
+ data: adminVerificationKey.data
3330
+ },
3331
+ tokenVerificationKey: {
3332
+ hash: (0, import_o1js14.Field)(tokenVerificationKey.hash),
3333
+ data: tokenVerificationKey.data
3334
+ },
3335
+ offerVerificationKey,
3336
+ bidVerificationKey
3337
+ };
3338
+ }
3339
+ async function getTokenSymbolAndAdmin(params) {
3340
+ const { tokenAddress, chain } = params;
3341
+ const vk = tokenVerificationKeys[chain === "mainnet" ? "mainnet" : "testnet"].vk;
3342
+ class FungibleTokenState extends (0, import_o1js14.Struct)({
3343
+ decimals: import_o1js14.UInt8,
3344
+ admin: import_o1js14.PublicKey,
3345
+ paused: import_o1js14.Bool
3346
+ }) {
3347
+ }
3348
+ const FungibleTokenStateSize = FungibleTokenState.sizeInFields();
3349
+ class FungibleTokenAdminState extends (0, import_o1js14.Struct)({
3350
+ adminPublicKey: import_o1js14.PublicKey
3351
+ }) {
3352
+ }
3353
+ const FungibleTokenAdminStateSize = FungibleTokenAdminState.sizeInFields();
3354
+ await fetchMinaAccount({ publicKey: tokenAddress, force: true });
3355
+ if (!import_o1js14.Mina.hasAccount(tokenAddress)) {
3356
+ throw new Error("Token contract account not found");
3357
+ }
3358
+ const account = import_o1js14.Mina.getAccount(tokenAddress);
3359
+ const verificationKey = account.zkapp?.verificationKey;
3360
+ if (!verificationKey) {
3361
+ throw new Error("Token contract verification key not found");
3362
+ }
3363
+ if (verificationKey.hash.toJSON() !== vk.FungibleToken.hash || verificationKey.data !== vk.FungibleToken.data || verificationKey.hash.toJSON() !== vk.WhitelistedFungibleToken.hash || verificationKey.data !== vk.WhitelistedFungibleToken.data) {
3364
+ throw new Error("Unknown token verification key");
3365
+ }
3366
+ if (account.zkapp?.appState === void 0) {
3367
+ throw new Error("Token contract state not found");
3368
+ }
3369
+ const state7 = FungibleTokenState.fromFields(account.zkapp?.appState.slice(0, FungibleTokenStateSize));
3370
+ const symbol = account.tokenSymbol;
3371
+ const adminContractPublicKey = state7.admin;
3372
+ await fetchMinaAccount({
3373
+ publicKey: adminContractPublicKey,
3374
+ force: true
3375
+ });
3376
+ if (!import_o1js14.Mina.hasAccount(adminContractPublicKey)) {
3377
+ throw new Error("Admin contract account not found");
3378
+ }
3379
+ const adminContract = import_o1js14.Mina.getAccount(adminContractPublicKey);
3380
+ const adminVerificationKey = adminContract.zkapp?.verificationKey;
3381
+ if (!adminVerificationKey) {
3382
+ throw new Error("Admin verification key not found");
3383
+ }
3384
+ let isWhitelisted = false;
3385
+ if (vk.FungibleTokenWhitelistedAdmin.hash === adminVerificationKey.hash.toJSON() && vk.FungibleTokenWhitelistedAdmin.data === adminVerificationKey.data) {
3386
+ isWhitelisted = true;
3387
+ } else if (vk.FungibleTokenAdmin.hash === adminVerificationKey.hash.toJSON() && vk.FungibleTokenAdmin.data === adminVerificationKey.data) {
3388
+ isWhitelisted = false;
3389
+ } else {
3390
+ throw new Error("Unknown admin verification key");
3391
+ }
3392
+ const adminAddress0 = adminContract.zkapp?.appState[0];
3393
+ const adminAddress1 = adminContract.zkapp?.appState[1];
3394
+ if (adminAddress0 === void 0 || adminAddress1 === void 0) {
3395
+ throw new Error("Cannot fetch admin address from admin contract");
3396
+ }
3397
+ const adminAddress = import_o1js14.PublicKey.fromFields([adminAddress0, adminAddress1]);
3398
+ return {
3399
+ adminContractAddress: adminContractPublicKey,
3400
+ adminAddress,
3401
+ symbol,
3402
+ isWhitelisted
3403
+ };
3404
+ }
3405
+
3406
+ // dist/node/mina/token/fee.js
3407
+ var LAUNCH_FEE = 1e9;
3408
+ var TRANSACTION_FEE = 1e8;
3409
+
3410
+ // dist/node/mina/token/vk.js
3411
+ var fungibleTokenVerificationKeys = {
3412
+ testnet: {
3413
+ admin: {
3414
+ hash: "15958550144671703080408884627087990244648824766878280780120011347457437134053",
3415
+ data: "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"
3416
+ },
3417
+ token: {
3418
+ hash: "22278758441605771858700252645311428360030262698072838723799702480887091310093",
3419
+ data: "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"
3420
+ }
3421
+ },
3422
+ mainnet: {
3423
+ admin: {
3424
+ hash: "25901604630376752069358432490423434073212977760589721765585739320126139736123",
3425
+ data: "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"
3426
+ },
3427
+ token: {
3428
+ hash: "27787098481477206239805523694633411816874383698563160451006881053714904356680",
3429
+ data: "AABoR9W/JCk+QV7xmR0EmMunepTBYRNFuyTe3jy0YL4FPMZvsY3S7Erek8aQc6iEbg0gx8yQZuX7/I9abchc2AM3/JhaHwmIVJYlvR+hIhruFPB3wgxMNv0w0gKKcrMUjwumIsjP5rBKR/iI66NePvgPuC29OEcvCy1WA7VGa4jkJdudep82RUdWGRWK2+TESBdYTcmhDVuKl71sFjmOdRsHPuHz9tgXl+pkmjmsRFUu0NL0uf7+4UZZ3qwo5JDu+CK6Ec77HZQNWTxobryIa5NH8CwGRTykkaJMUmjbfWiFPCUHzvcqpOIDa/P0WVqqmkAksmXroqqmKGk7zQBN+Ak0GHEPqQDSJIQv98Wm/EluR3MtPMixUI0OSCdbCe++KR4gIKwvRX+AyBCIcMUEuQ7CN4TcDQmD4dsnU3Ywu2cTLCmf1z6el9AHdoTNg5kHvhrxJtV5O5sUnQEW+LPdxSMkxmO3ao9cj4Pdjpf//o1wVN9GR9uyGgj7JxOzi0e1HC2DWmTr5hsWR+J7Pz5rAY5jv5xAcpzUgdqRLr+0Z5wQBovJXign+HwE1cLbTGjZjc2WzRyDEAUfk+VvpE9GcgUdANc/+/9LDBGscgjss4OnRo4dDv+cy1ilGE13RwrFqsMgPFtjm77FesP8kK20STAvJO2MpVDJBLRBUS3T2rKWlwuhL95iMJSSJp15EYPASeiSRhU71xGX0Ga6ZJUBPmwuN43AhoCb5DcuShlhi7CwjficYrtDo1u7ZpmnWP0tbaE1u3Cmua8TUIWLHYL9CoBo2HEP5858I/xbZpseBTXbUhQOgdQSqCj0ai5ibbIEWlzyeVctufQRm6pK4OGSnZvSP+km8zpVR15SVLkkzPAtmtpJ28bSInD1sm++/MMMz30+xP+7XMk6yCnAKS7Ryh+7LqDgPK2C3fPDaPe38v1PXDUseFa60FhJTq5ztwNXhVtkUUgBMObzMAH3yCYnFj41JvRuR9diVD4NJ0h3wxxcbGWD8ROvjUEUv2U9ouTlDggGZunJOaokUMypVHGFo2m6aD1kU1ijdmfOmX+cPmPOcCFxFP87ZayF0PDkmlcG57tWDwHcET43eCS+S3PWlOhqIFZ7I2B7aVCbWcj38kLUVQrXfZDtDoMO2w9HMTt+DX0bI84TT7Y8neo5A4vxwqLRTmXOUco5swl6krrbqdWcehU/l882C3IQcOyVS4j6tJvV7Z87QSHbGnw0iM/bp3WjCgd+XbMVKuLB1iwTlhgWJc0HMs3w9N0ZlssmVHaWTEorf/QDhPtXCCqwGlNLJgH7mO+P0Tmco9/vB6iGqQ66hwXZlTangzKx28yLvUiZraqXFF8bsmgkuxfzoTKsstEKJMiTF4q5UNl9Cixyht9LdXL76v/MRCzaVrhGoiJMueECkMxTgwLrNNq7h6j+xRf8lWaYTudxkUUFrAKTzRpbpAduRmpd4tjIYhM7umH0mhTnCK6ShwQz6ZsHBSbktYOxGFqHjMyPtx2k0+pZ+Qsu/GjsmeMbJSLcUPTObWIfFVco2SSBUteZsA3ZgP4jhEWWtOzXYIHjWqj3g9XOVuVJ4TcbO2FK4mVJ9ETnRxKH0AmGPnXb0Nc+sC9nRnDN2OTqPtXJkeRfI7jkHCFb79u8QPvuqhsYWVSS8bI3rXE1kWY1ZKYoC3FtfenG9e8haWYXUyk1783IQJ4W1jkscQTU1RZrL0cWoaCxIXnXsdDJStgz8B9EQ0uUEkfXSXYEbQtIA4DVKzTO4uqxOzafqAOLnvOxi5Vn95JCOu3CEAFr0WQEOnA2X3nw31spFvLj0jykGpn1ECHhW4Ft9EOkHDr4qDA8Mi5gH9EB+g0AhObwxj7RZB2Wq5PSmZw131mkHzgYOgD3JC9tlaGMSxesjF1O3+U3wUOLrrU89s128Y0PpiEzO6Jsm1aDzbF1pkz3asy0z+Enb4BMg/Jv5j/EZkKM6Okv746/ETIs69fv3e5Iucae7lyyYVNCYBtucWrOQK2Pfi4QzRZjkC29hj8OenHSn+75qcX/v5ejhSBAb24Bp1INNVgaF3VHGz1+ULEcs73b/b0K1AQJYfdkfD4fqrj1nUIlVYv3yw1SyEKClpoiBaLiRxg/04rgb3enmxe6msVApSIlAYs+qeRAIRDCU+ZensV1x4sS4VCjQgoPlo9sV7wJDUOTsUkgux38w39sqiSfONzmyhfXqZocojTv1m3vHh8gnCFUbZ/d3WvywDE67VPRlTYX5ZR80Yyjz3byDH2/+DWOsjv2q8KUv2mtgkiOTZ1D3tAF6Vl6tSWlixMYc1tfC8KDWDOq2eg7M72MqjfiMTuBPXr2ZB/nTdtCi9lDQQESzBmgJaV/KCZOAaIKQR9hibvy4vt3wlSZ9XTK+FFZPQc="
3430
+ }
3431
+ },
3432
+ testnet_v1: {
3433
+ admin: {
3434
+ hash: "1200635497217107248831982322269320244173535715339356861513501242012238077174",
3435
+ data: "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"
3436
+ },
3437
+ token: {
3438
+ hash: "25084457276132306637089336910977939820654927814172888515895248592725736067489",
3439
+ data: "AABoR9W/JCk+QV7xmR0EmMunepTBYRNFuyTe3jy0YL4FPMZvsY3S7Erek8aQc6iEbg0gx8yQZuX7/I9abchc2AM3/JhaHwmIVJYlvR+hIhruFPB3wgxMNv0w0gKKcrMUjwumIsjP5rBKR/iI66NePvgPuC29OEcvCy1WA7VGa4jkJdudep82RUdWGRWK2+TESBdYTcmhDVuKl71sFjmOdRsHPuHz9tgXl+pkmjmsRFUu0NL0uf7+4UZZ3qwo5JDu+CK6Ec77HZQNWTxobryIa5NH8CwGRTykkaJMUmjbfWiFPCUHzvcqpOIDa/P0WVqqmkAksmXroqqmKGk7zQBN+Ak0GHEPqQDSJIQv98Wm/EluR3MtPMixUI0OSCdbCe++KR4gIKwvRX+AyBCIcMUEuQ7CN4TcDQmD4dsnU3Ywu2cTLCmf1z6el9AHdoTNg5kHvhrxJtV5O5sUnQEW+LPdxSMkxmO3ao9cj4Pdjpf//o1wVN9GR9uyGgj7JxOzi0e1HC2DWmTr5hsWR+J7Pz5rAY5jv5xAcpzUgdqRLr+0Z5wQBovJXign+HwE1cLbTGjZjc2WzRyDEAUfk+VvpE9GcgUdAGxdMh8pRk2c3gIyZAR50aD7krfuev7xNcosFvHDLxoQT4kMIbvQCEm5Y1b4naLNO4venPN+UPSplqeglngyVg6hL95iMJSSJp15EYPASeiSRhU71xGX0Ga6ZJUBPmwuN43AhoCb5DcuShlhi7CwjficYrtDo1u7ZpmnWP0tbaE1u3Cmua8TUIWLHYL9CoBo2HEP5858I/xbZpseBTXbUhQOgdQSqCj0ai5ibbIEWlzyeVctufQRm6pK4OGSnZvSP+km8zpVR15SVLkkzPAtmtpJ28bSInD1sm++/MMMz30+xP+7XMk6yCnAKS7Ryh+7LqDgPK2C3fPDaPe38v1PXDUseFa60FhJTq5ztwNXhVtkUUgBMObzMAH3yCYnFj41JvRuR9diVD4NJ0h3wxxcbGWD8ROvjUEUv2U9ouTlDggGH6cSMvmo2suubVLTWjWQjiEruO1O9hD7RdrQdBpyUzQhwUjPR1emq/Nb/ZV75ra0TGTXOQzEItZ/Z7/3uP/0EPTMuFUkkmFI4SnN3lH07zi4IbwHvZzIofdlOqOKILs4QwZ38srG/YRk3+A6ruqaLY6wmtRqq3mm03DF0SqZEhM/l882C3IQcOyVS4j6tJvV7Z87QSHbGnw0iM/bp3WjCgd+XbMVKuLB1iwTlhgWJc0HMs3w9N0ZlssmVHaWTEorf/QDhPtXCCqwGlNLJgH7mO+P0Tmco9/vB6iGqQ66hwXZlTangzKx28yLvUiZraqXFF8bsmgkuxfzoTKsstEKJMiTF4q5UNl9Cixyht9LdXL76v/MRCzaVrhGoiJMueECkMxTgwLrNNq7h6j+xRf8lWaYTudxkUUFrAKTzRpbpAduRmpd4tjIYhM7umH0mhTnCK6ShwQz6ZsHBSbktYOxGFqHjMyPtx2k0+pZ+Qsu/GjsmeMbJSLcUPTObWIfFVco2SSBUteZsA3ZgP4jhEWWtOzXYIHjWqj3g9XOVuVJ4TcbO2FK4mVJ9ETnRxKH0AmGPnXb0Nc+sC9nRnDN2OTqPtXJkeRfI7jkHCFb79u8QPvuqhsYWVSS8bI3rXE1kWY1ZKYoC3FtfenG9e8haWYXUyk1783IQJ4W1jkscQTU1RZrL0cWoaCxIXnXsdDJStgz8B9EQ0uUEkfXSXYEbQtIA4DVKzTO4uqxOzafqAOLnvOxi5Vn95JCOu3CEAFr0WQEOnA2X3nw31spFvLj0jykGpn1ECHhW4Ft9EOkHDr4qDA8Mi5gH9EB+g0AhObwxj7RZB2Wq5PSmZw131mkHzgYOgD3JC9tlaGMSxesjF1O3+U3wUOLrrU89s128Y0PpiEzO6Jsm1aDzbF1pkz3asy0z+Enb4BMg/Jv5j/EZkKM6Okv746/ETIs69fv3e5Iucae7lyyYVNCYBtucWrOQK2Pfi4QzRZjkC29hj8OenHSn+75qcX/v5ejhSBAb24Bp1INNVgaF3VHGz1+ULEcs73b/b0K1AQJYfdkfD4fqrj1nUIlVYv3yw1SyEKClpoiBaLiRxg/04rgb3enmxe6msVApSIlAYs+qeRAIRDCU+ZensV1x4sS4VCjQgoPlo9sV7wJDUOTsUkgux38w39sqiSfONzmyhfXqZocojTv1m3vHh8gnCFUbZ/d3WvywDE67VPRlTYX5ZR80Yyjz3byDH2/+DWOsjv2q8KUv2mtgkiOTZ1D3tAF6Vl6tSWlixMYc1tfC8KDWDOq2eg7M72MqjfiMTuBPXr2ZB/nTdtCi9lDQQESzBmgJaV/KCZOAaIKQR9hibvy4vt3wlSZ9XTK+FFZPQc="
3440
+ }
3441
+ },
3442
+ mainnet_v1: {
3443
+ admin: {
3444
+ hash: "16115269877914581564299853766147447229664556890591132763176560855029019233817",
3445
+ data: "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"
3446
+ },
3447
+ token: {
3448
+ hash: "12320223354843720065815824451082596238990220882343256724550451075683722289248",
3449
+ data: "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"
3450
+ }
3451
+ }
3452
+ };
3453
+
3454
+ // dist/node/mina/transactions/blockberry.js
3455
+ async function getZkAppTxsFromBlockBerry(params) {
3456
+ const { account, chain, blockBerryApiKey } = params;
3457
+ const options = {
3458
+ method: "GET",
3459
+ headers: {
3460
+ accept: "application/json",
3461
+ "x-api-key": blockBerryApiKey
3462
+ }
3463
+ };
3464
+ try {
3465
+ const response = await fetch(`https://api.blockberry.one/mina-${chain}/v1/zkapps/accounts/${account}/txs?size=10&orderBy=DESC&sortBy=AGE`, options);
3466
+ if (!response.ok) {
3467
+ console.error("Cannot fetch zkApp txs for account:", account, chain, response.statusText);
3468
+ return void 0;
3469
+ }
3470
+ const result = await response.json();
3471
+ return result;
3472
+ } catch (err) {
3473
+ console.error("Cannot fetch zkApp txs for account - catch:", account, chain, err);
3474
+ return void 0;
3475
+ }
3476
+ }
3477
+ async function getPaymentTxsFromBlockBerry(params) {
3478
+ const { account, chain, blockBerryApiKey } = params;
3479
+ const options = {
3480
+ method: "GET",
3481
+ headers: {
3482
+ accept: "application/json",
3483
+ "x-api-key": blockBerryApiKey
3484
+ }
3485
+ };
3486
+ try {
3487
+ const response = await fetch(`https://api.blockberry.one/mina-${chain}/v1/accounts/` + account + "/txs?page=0&size=1&orderBy=DESC&sortBy=AGE&direction=OUT", options);
3488
+ if (!response.ok) {
3489
+ console.error("Cannot fetch payment txs for account:", account, chain, response.statusText);
3490
+ return void 0;
3491
+ }
3492
+ const result = await response.json();
3493
+ return result;
3494
+ } catch (err) {
3495
+ console.error("Cannot fetch payment txs for account - catch:", account, chain, err);
3496
+ return void 0;
3497
+ }
3498
+ }
3499
+ async function getZkAppTxFromBlockBerry(params) {
3500
+ const { hash, chain, blockBerryApiKey } = params;
3501
+ const options = {
3502
+ method: "GET",
3503
+ headers: {
3504
+ accept: "application/json",
3505
+ "x-api-key": blockBerryApiKey
3506
+ }
3507
+ };
3508
+ try {
3509
+ const response = await fetch(`https://api.blockberry.one/mina-${chain}/v1/zkapps/txs/${hash}`, options);
3510
+ if (response.ok) {
3511
+ const result = await response.json();
3512
+ return result;
3513
+ } else {
3514
+ console.error("getZkAppTxFromBlockBerry error while getting hash - not ok", { hash, chain, text: response.statusText, status: response.status });
3515
+ return void 0;
3516
+ }
3517
+ } catch (err) {
3518
+ console.error("getZkAppTxFromBlockBerry error while getting mainnet hash - catch", hash, chain, err);
3519
+ return void 0;
3520
+ }
3521
+ }
3522
+ async function getZkAppFromBlockBerry(params) {
3523
+ const { account, chain, blockBerryApiKey } = params;
3524
+ const options = {
3525
+ method: "GET",
3526
+ headers: {
3527
+ accept: "application/json",
3528
+ "x-api-key": blockBerryApiKey
3529
+ }
3530
+ };
3531
+ try {
3532
+ const response = await fetch(`https://api.blockberry.one/mina-${chain}/v1/zkapps/${account}`, options);
3533
+ if (response.ok) {
3534
+ const result = await response.json();
3535
+ return result;
3536
+ } else {
3537
+ console.error("getZkAppFromBlockBerry error while getting account", {
3538
+ account,
3539
+ chain,
3540
+ text: response.statusText,
3541
+ status: response.status
3542
+ });
3543
+ return void 0;
3544
+ }
3545
+ } catch (err) {
3546
+ console.error("getZkAppFromBlockBerry error while getting account - catch", account, chain, err);
3547
+ return void 0;
3548
+ }
3549
+ }
3550
+
3551
+ // dist/node/mina/transactions/nonce.js
3552
+ var import_o1js15 = require("o1js");
3553
+ async function getNonce(params) {
3554
+ const { account, chain, blockBerryApiKey } = params;
3555
+ try {
3556
+ if (account === void 0 || account === null || account === "") {
3557
+ return {
3558
+ success: false,
3559
+ nonce: -1,
3560
+ message: "Account is required"
3561
+ };
3562
+ }
3563
+ if (blockBerryApiKey === void 0 || blockBerryApiKey === null || blockBerryApiKey === "") {
3564
+ return {
3565
+ success: false,
3566
+ nonce: -1,
3567
+ message: "blockBerryApiKey is required"
3568
+ };
3569
+ }
3570
+ const zkAppTxsPromise = getZkAppTxsFromBlockBerry({
3571
+ account,
3572
+ chain,
3573
+ blockBerryApiKey
3574
+ });
3575
+ const paymentTxs = getPaymentTxsFromBlockBerry({
3576
+ account,
3577
+ chain,
3578
+ blockBerryApiKey
3579
+ });
3580
+ const paymentNonce = (await paymentTxs)?.data[0]?.nonce ?? -1;
3581
+ let zkNonce = -1;
3582
+ let found = false;
3583
+ const zkAppTxs = await zkAppTxsPromise;
3584
+ const size = zkAppTxs?.data?.length ?? 0;
3585
+ let i = 0;
3586
+ while (!found && i < size) {
3587
+ if (zkAppTxs?.data[i]?.proverAddress === account) {
3588
+ zkNonce = zkAppTxs?.data[i]?.nonce;
3589
+ found = true;
3590
+ }
3591
+ i++;
3592
+ }
3593
+ const nonce = Math.max(zkNonce, paymentNonce);
3594
+ return {
3595
+ success: true,
3596
+ nonce
3597
+ };
3598
+ } catch (error) {
3599
+ return {
3600
+ success: false,
3601
+ nonce: -1,
3602
+ message: String(error)
3603
+ };
3604
+ }
3605
+ }
3606
+ async function getAccountNonce(params) {
3607
+ const { account, chain = getCurrentNetwork().network.chainId, blockBerryApiKey, verbose = true } = params;
3608
+ const canUseBlockBerry = blockBerryApiKey !== void 0 && (chain === "devnet" || chain === "mainnet");
3609
+ if (chain === "zeko") {
3610
+ const publicKey = import_o1js15.PublicKey.fromBase58(account);
3611
+ await fetchMinaAccount({ publicKey });
3612
+ const nonce = Number(import_o1js15.Mina.getAccount(publicKey).nonce.toBigint());
3613
+ return nonce;
3614
+ } else {
3615
+ const blockberryNoncePromise = canUseBlockBerry ? getNonce({
3616
+ account,
3617
+ blockBerryApiKey,
3618
+ chain
3619
+ }) : void 0;
3620
+ const publicKey = import_o1js15.PublicKey.fromBase58(account);
3621
+ await fetchMinaAccount({ publicKey });
3622
+ const senderNonce = Number(import_o1js15.Mina.getAccount(publicKey).nonce.toBigint());
3623
+ const blockberryNonce = blockberryNoncePromise ? (await blockberryNoncePromise).nonce ?? -1 : -1;
3624
+ const nonce = Math.max(senderNonce, blockberryNonce + 1);
3625
+ if (verbose && nonce > senderNonce)
3626
+ console.log(`Nonce changed from ${senderNonce} to ${nonce} for ${account}`);
3627
+ return nonce;
3628
+ }
3629
+ }
3630
+
3631
+ // dist/node/mina/transactions/transaction.js
3632
+ var import_o1js16 = require("o1js");
3633
+ function transactionParams(serializedTransaction, signedJson) {
3634
+ const { sender, nonce, tx } = JSON.parse(serializedTransaction);
3635
+ const transaction = import_o1js16.Mina.Transaction.fromJSON(JSON.parse(tx));
3636
+ const memo = transaction.transaction.memo;
3637
+ return {
3638
+ fee: import_o1js16.UInt64.from(signedJson.zkappCommand.feePayer.body.fee),
3639
+ sender: import_o1js16.PublicKey.fromBase58(sender),
3640
+ nonce: Number(signedJson.zkappCommand.feePayer.body.nonce),
3641
+ memo
3642
+ };
3643
+ }
3644
+ function deserializeTransaction(serializedTransaction, txNew, signedJson) {
3645
+ const { tx, blindingValues, length, forestJSONs } = JSON.parse(serializedTransaction);
3646
+ const transaction = import_o1js16.Mina.Transaction.fromJSON(JSON.parse(tx));
3647
+ const forests = forestJSONs.map((f) => JSON.parse(f));
3648
+ if (length !== txNew.transaction.accountUpdates.length) {
3649
+ throw new Error("New Transaction length mismatch");
3650
+ }
3651
+ if (length !== transaction.transaction.accountUpdates.length) {
3652
+ throw new Error("Serialized Transaction length mismatch");
3653
+ }
3654
+ for (let i = 0; i < length; i++) {
3655
+ transaction.transaction.accountUpdates[i].lazyAuthorization = txNew.transaction.accountUpdates[i].lazyAuthorization;
3656
+ if (blindingValues[i] !== "") {
3657
+ if (transaction.transaction.accountUpdates[i].lazyAuthorization === void 0 || transaction.transaction.accountUpdates[i].lazyAuthorization.blindingValue === void 0) {
3658
+ throw new Error(`Lazy authorization blinding value is undefined for item ${i}`);
3659
+ }
3660
+ transaction.transaction.accountUpdates[i].lazyAuthorization.blindingValue = import_o1js16.Field.fromJSON(blindingValues[i]);
3661
+ }
3662
+ if (forests[i].length > 0) {
3663
+ if (transaction.transaction.accountUpdates[i].lazyAuthorization === void 0 || transaction.transaction.accountUpdates[i].lazyAuthorization.args === void 0) {
3664
+ throw new Error(`Lazy authorization args is undefined for item ${i}`);
3665
+ }
3666
+ deserializeLazyAuthorization(transaction.transaction.accountUpdates[i].lazyAuthorization.args, forests[i]);
3667
+ if (forests[i].restoredItems !== forests[i].length) {
3668
+ throw new Error(`Forest ${i} not fully restored`);
3669
+ }
3670
+ }
3671
+ }
3672
+ transaction.transaction.feePayer.authorization = signedJson.zkappCommand.feePayer.authorization;
3673
+ transaction.transaction.feePayer.body.fee = import_o1js16.UInt64.from(signedJson.zkappCommand.feePayer.body.fee);
3674
+ for (let i = 0; i < length; i++) {
3675
+ const signature = signedJson.zkappCommand.accountUpdates[i].authorization.signature;
3676
+ if (signature !== void 0 && signature !== null) {
3677
+ transaction.transaction.accountUpdates[i].authorization.signature = signedJson.zkappCommand.accountUpdates[i].authorization.signature;
3678
+ }
3679
+ }
3680
+ return transaction;
3681
+ }
3682
+ function serializeTransaction(tx) {
3683
+ const length = tx.transaction.accountUpdates.length;
3684
+ let i;
3685
+ const blindingValues = [];
3686
+ const forests = [];
3687
+ for (i = 0; i < length; i++) {
3688
+ const la = tx.transaction.accountUpdates[i].lazyAuthorization;
3689
+ if (la !== void 0 && la.blindingValue !== void 0 && la.kind === "lazy-proof")
3690
+ blindingValues.push(la.blindingValue.toJSON());
3691
+ else
3692
+ blindingValues.push("");
3693
+ const forest = { length: 0, items: [] };
3694
+ serializeLazyAuthorization(tx.transaction.accountUpdates[i].lazyAuthorization?.args, forest);
3695
+ forests.push(forest);
3696
+ }
3697
+ const serializedTransaction = JSON.stringify({
3698
+ tx: tx.toJSON(),
3699
+ blindingValues,
3700
+ forestJSONs: forests.map((f) => JSON.stringify(f)),
3701
+ length,
3702
+ fee: tx.transaction.feePayer.body.fee.toJSON(),
3703
+ sender: tx.transaction.feePayer.body.publicKey.toBase58(),
3704
+ nonce: tx.transaction.feePayer.body.nonce.toBigint().toString()
3705
+ }, null, 2);
3706
+ return serializedTransaction;
3707
+ }
3708
+ function serializeLazyAuthorization(lazyAuthorization, serialized) {
3709
+ if (lazyAuthorization?.hash !== void 0 && lazyAuthorization.hash.toJSON) {
3710
+ serialized.items.push({
3711
+ h: fieldToBase64(lazyAuthorization.hash)
3712
+ });
3713
+ }
3714
+ if (lazyAuthorization?.previousHash !== void 0 && lazyAuthorization.previousHash.toJSON) {
3715
+ serialized.items.push({
3716
+ p: fieldToBase64(lazyAuthorization.previousHash)
3717
+ });
3718
+ }
3719
+ if (lazyAuthorization?.callData !== void 0 && lazyAuthorization.callData.toJSON) {
3720
+ serialized.items.push({
3721
+ c: fieldToBase64(lazyAuthorization.callData)
3722
+ });
3723
+ }
3724
+ if (lazyAuthorization?.id !== void 0) {
3725
+ serialized.items.push({
3726
+ i: lazyAuthorization.id
3727
+ });
3728
+ }
3729
+ if (Array.isArray(lazyAuthorization)) {
3730
+ for (const item of lazyAuthorization) {
3731
+ serializeLazyAuthorization(item, serialized);
3732
+ }
3733
+ }
3734
+ if (typeof lazyAuthorization === "object") {
3735
+ for (const key in lazyAuthorization) {
3736
+ serializeLazyAuthorization(lazyAuthorization[key], serialized);
3737
+ }
3738
+ }
3739
+ serialized.length = serialized.items.length;
3740
+ }
3741
+ function deserializeLazyAuthorization(lazyAuthorization, serialized) {
3742
+ if (serialized.restoredItems === void 0)
3743
+ serialized.restoredItems = 0;
3744
+ if (lazyAuthorization?.hash !== void 0 && lazyAuthorization.hash.toJSON) {
3745
+ if (serialized.restoredItems >= serialized.length)
3746
+ throw new Error("Restored more items than expected");
3747
+ const hash = serialized.items[serialized.restoredItems].h;
3748
+ if (hash === void 0)
3749
+ throw new Error(`Hash is undefined for item ${serialized.restoredItems}`);
3750
+ lazyAuthorization.hash = fieldFromBase64(hash);
3751
+ serialized.restoredItems++;
3752
+ }
3753
+ if (lazyAuthorization?.previousHash !== void 0 && lazyAuthorization.previousHash.toJSON) {
3754
+ if (serialized.restoredItems >= serialized.length)
3755
+ throw new Error("Restored more items than expected");
3756
+ const previousHash = serialized.items[serialized.restoredItems].p;
3757
+ if (previousHash === void 0)
3758
+ throw new Error(`Previous hash is undefined for item ${serialized.restoredItems}`);
3759
+ lazyAuthorization.previousHash = fieldFromBase64(previousHash);
3760
+ serialized.restoredItems++;
3761
+ }
3762
+ if (lazyAuthorization?.callData !== void 0 && lazyAuthorization.callData.toJSON) {
3763
+ if (serialized.restoredItems >= serialized.length)
3764
+ throw new Error("Restored more items than expected");
3765
+ const callData = serialized.items[serialized.restoredItems].c;
3766
+ if (callData === void 0)
3767
+ throw new Error(`Call data is undefined for item ${serialized.restoredItems}`);
3768
+ lazyAuthorization.callData = fieldFromBase64(callData);
3769
+ serialized.restoredItems++;
3770
+ }
3771
+ if (lazyAuthorization?.id !== void 0) {
3772
+ if (serialized.restoredItems >= serialized.length)
3773
+ throw new Error("Restored more items than expected");
3774
+ const id = serialized.items[serialized.restoredItems].i;
3775
+ if (id === void 0)
3776
+ throw new Error(`Id is undefined for item ${serialized.restoredItems}`);
3777
+ lazyAuthorization.id = id;
3778
+ serialized.restoredItems++;
3779
+ }
3780
+ if (Array.isArray(lazyAuthorization)) {
3781
+ for (const item of lazyAuthorization) {
3782
+ deserializeLazyAuthorization(item, serialized);
3783
+ }
3784
+ }
3785
+ if (typeof lazyAuthorization === "object") {
3786
+ for (const key in lazyAuthorization) {
3787
+ deserializeLazyAuthorization(lazyAuthorization[key], serialized);
3788
+ }
3789
+ }
3790
+ }
3791
+
3792
+ // dist/node/mina/transactions/txstatus.js
3793
+ var TIMEOUT = 1e3 * 60 * 21;
3794
+ async function txStatusBlockberry(params) {
3795
+ const { hash, chain, time, blockBerryApiKey } = params;
3796
+ const tx = await getZkAppTxFromBlockBerry({ hash, chain, blockBerryApiKey });
3797
+ if (tx?.txStatus)
3798
+ return tx?.txStatus;
3799
+ if (Date.now() - time > (params.timeout ?? TIMEOUT)) {
3800
+ console.error("txStatus: Timeout while checking tx with blockberry", chain, hash);
3801
+ return "replaced";
3802
+ } else {
3803
+ return "pending";
3804
+ }
3805
+ }
3806
+
3807
+ // dist/node/mina/transactions/tiny-contract.js
3808
+ var import_tslib6 = require("tslib");
3809
+ var import_o1js17 = require("o1js");
3810
+ var TinyContract = class extends import_o1js17.SmartContract {
3811
+ constructor() {
3812
+ super(...arguments);
3813
+ this.value = (0, import_o1js17.State)();
3814
+ }
3815
+ async setValue(value) {
3816
+ this.value.set(value);
3817
+ }
3818
+ };
3819
+ (0, import_tslib6.__decorate)([
3820
+ (0, import_o1js17.state)(import_o1js17.Field),
3821
+ (0, import_tslib6.__metadata)("design:type", Object)
3822
+ ], TinyContract.prototype, "value", void 0);
3823
+ (0, import_tslib6.__decorate)([
3824
+ import_o1js17.method,
3825
+ (0, import_tslib6.__metadata)("design:type", Function),
3826
+ (0, import_tslib6.__metadata)("design:paramtypes", [import_o1js17.Field]),
3827
+ (0, import_tslib6.__metadata)("design:returntype", Promise)
3828
+ ], TinyContract.prototype, "setValue", null);
3829
+
3830
+ // dist/node/mina/transactions/send.js
3831
+ var import_o1js18 = require("o1js");
3832
+ async function sendTx(params) {
3833
+ const { tx, description = "", verbose = true, wait = true, chain = getCurrentNetwork().network.chainId } = params;
3834
+ const accountUpdates = JSON.parse(tx.toJSON()).accountUpdates;
3835
+ const auCount = [];
3836
+ let proofAuthorizationCount = 0;
3837
+ for (const au of accountUpdates) {
3838
+ const { publicKey, tokenId, authorizationKind } = au.body;
3839
+ if (au.authorization.proof) {
3840
+ proofAuthorizationCount++;
3841
+ if (authorizationKind.isProved === false)
3842
+ console.error("Proof authorization exists but isProved is false");
3843
+ } else if (authorizationKind.isProved === true)
3844
+ console.error("isProved is true but no proof authorization");
3845
+ const index = auCount.findIndex((item) => item.publicKey === publicKey && item.tokenId === tokenId);
3846
+ if (index === -1)
3847
+ auCount.push({ publicKey, tokenId, count: 1 });
3848
+ else
3849
+ auCount[index].count++;
3850
+ }
3851
+ if (verbose)
3852
+ console.log(`Account updates for ${description ?? "tx"}: ${auCount.length}, proof authorizations: ${proofAuthorizationCount}`);
3853
+ for (const au of auCount) {
3854
+ if (au.count > 1) {
3855
+ if (verbose)
3856
+ console.log(`DUPLICATE AU ${description ?? ""}: ${au.publicKey} ${au.tokenId !== "wSHV2S4qX9jFsLjQo8r1BsMLH2ZRKsZx6EJd1sbozGPieEC4Jf" ? "tokenId: " + au.tokenId : ""} count: ${au.count}`);
3857
+ }
3858
+ }
3859
+ try {
3860
+ let txSent;
3861
+ let sent = false;
3862
+ while (!sent) {
3863
+ txSent = await tx.safeSend();
3864
+ if (txSent.status == "pending") {
3865
+ sent = true;
3866
+ if (verbose)
3867
+ console.log(`${description ?? ""} tx sent: hash: ${txSent.hash} status: ${txSent.status}`);
3868
+ } else if (chain === "zeko") {
3869
+ if (verbose)
3870
+ console.log("Retrying Zeko tx");
3871
+ await sleep(1e4);
3872
+ } else {
3873
+ console.error(`${description} tx NOT sent: hash: ${txSent?.hash} status: ${txSent?.status}`, txSent.errors);
3874
+ return txSent;
3875
+ }
3876
+ }
3877
+ if (txSent === void 0)
3878
+ throw new Error("txSent is undefined");
3879
+ if (txSent.errors.length > 0) {
3880
+ console.error(`${description ?? ""} tx error: hash: ${txSent.hash} status: ${txSent.status} errors: ${txSent.errors}`);
3881
+ }
3882
+ if (txSent.status === "pending" && wait !== false && chain !== "zeko") {
3883
+ if (verbose)
3884
+ console.log(`Waiting for tx inclusion...`);
3885
+ const txIncluded = await txSent.safeWait();
3886
+ if (txIncluded.status === "included")
3887
+ if (verbose)
3888
+ console.log(`${description ?? ""} tx included into block: hash: ${txIncluded.hash} status: ${txIncluded.status}`);
3889
+ else
3890
+ console.error(`${description ?? ""} tx NOT included into block: hash: ${txIncluded.hash} status: ${txIncluded.status}`);
3891
+ if (chain !== "local") {
3892
+ const { publicKey, nonce } = tx.transaction.feePayer.body;
3893
+ const started = Date.now();
3894
+ while (Date.now() - started < 1e3 * 60 * 10) {
3895
+ const newNonce = (await fetchMinaAccount({
3896
+ publicKey,
3897
+ force: true
3898
+ })).account?.nonce;
3899
+ if (newNonce && Number(newNonce.toBigint()) > Number(nonce.toBigint()))
3900
+ return txIncluded;
3901
+ if (verbose)
3902
+ console.log(`Waiting for ${chain} to update state for ${Math.floor((Date.now() - started) / 1e3)} sec...`);
3903
+ await sleep(1e4);
3904
+ }
3905
+ console.error(`${chain} do not reflect nonce update for tx ${txIncluded.hash} with status ${txIncluded.status}`);
3906
+ }
3907
+ return txIncluded;
3908
+ } else
3909
+ return txSent;
3910
+ } catch (error) {
3911
+ if (chain !== "zeko")
3912
+ console.error("Error sending tx", error);
3913
+ }
3914
+ }
3915
+ async function getTxStatusFast(params) {
3916
+ const { hash, chain = getCurrentNetwork().network.chainId } = params;
3917
+ if (chain === "local" || chain === "zeko")
3918
+ return { success: true, result: true };
3919
+ try {
3920
+ const txStatus = await (0, import_o1js18.checkZkappTransaction)(hash);
3921
+ return {
3922
+ success: true,
3923
+ result: txStatus?.success ?? false
3924
+ };
3925
+ } catch (error) {
3926
+ console.error("getTxStatusFast error while getting tx status - catch", hash, error);
3927
+ return { success: false, error: error?.message ?? "Cannot get tx status" };
3928
+ }
3929
+ }
3930
+
3931
+ // dist/node/mina/transactions/account.js
3932
+ var import_o1js19 = require("o1js");
3933
+ async function accountExists(address, tokenId) {
3934
+ try {
3935
+ const publicKey = typeof address === "string" ? import_o1js19.PublicKey.fromBase58(address) : address;
3936
+ await fetchMinaAccount({ publicKey, tokenId, force: false });
3937
+ return import_o1js19.Mina.hasAccount(publicKey, tokenId);
3938
+ } catch (error) {
3939
+ return false;
3940
+ }
3941
+ }
3942
+ async function tokenBalance(address, tokenId) {
3943
+ try {
3944
+ const publicKey = typeof address === "string" ? import_o1js19.PublicKey.fromBase58(address) : address;
3945
+ await fetchMinaAccount({ publicKey, tokenId, force: false });
3946
+ return import_o1js19.Mina.hasAccount(publicKey, tokenId) ? Number(import_o1js19.Mina.getAccount(publicKey, tokenId).balance.toBigInt()) : void 0;
3947
+ } catch (error) {
3948
+ console.error("Cannot fetch account balance", error);
3949
+ return void 0;
3950
+ }
3951
+ }
3952
+ async function checkAddress(address) {
3953
+ if (!address || typeof address !== "string") {
3954
+ console.error("checkAddress params are invalid:", address);
3955
+ return false;
3956
+ }
3957
+ try {
3958
+ const publicKey = import_o1js19.PublicKey.fromBase58(address);
3959
+ if (address !== publicKey.toBase58()) {
3960
+ console.log("checkAddress: address is not valid", address, publicKey.toBase58());
3961
+ return false;
3962
+ }
3963
+ return true;
3964
+ } catch (error) {
3965
+ console.error("checkAddress catch", { address, error });
3966
+ return false;
3967
+ }
3968
+ }
3969
+ // Annotate the CommonJS export names for ESM import in node:
3970
+ 0 && (module.exports = {
3971
+ Cloud,
3972
+ Devnet,
3973
+ FungibleToken,
3974
+ FungibleTokenAdmin,
3975
+ FungibleTokenBidContract,
3976
+ FungibleTokenOfferContract,
3977
+ FungibleTokenWhitelistedAdmin,
3978
+ LAUNCH_FEE,
3979
+ Lightnet,
3980
+ Local,
3981
+ LocalCloud,
3982
+ LocalStorage,
3983
+ Mainnet,
3984
+ Memory,
3985
+ Storage,
3986
+ TRANSACTION_FEE,
3987
+ TinyContract,
3988
+ TokenAPI,
3989
+ UInt64Option,
3990
+ Whitelist,
3991
+ WhitelistMap,
3992
+ WhitelistMapOption,
3993
+ WhitelistedAddress,
3994
+ WhitelistedFungibleToken,
3995
+ Zeko,
3996
+ accountBalance,
3997
+ accountBalanceMina,
3998
+ accountExists,
3999
+ bigintFromBase56,
4000
+ bigintFromBase64,
4001
+ bigintToBase56,
4002
+ bigintToBase64,
4003
+ buildTokenDeployTransaction,
4004
+ buildTokenTransaction,
4005
+ checkAddress,
4006
+ checkMinaZkappTransaction,
4007
+ createIpfsURL,
4008
+ currentNetwork,
4009
+ defaultToken,
4010
+ deserializeFields,
4011
+ deserializeIndexedMerkleMap,
4012
+ deserializeTransaction,
4013
+ fee,
4014
+ fetchMinaAccount,
4015
+ fetchMinaActions,
4016
+ fieldFromBase56,
4017
+ fieldFromBase64,
4018
+ fieldToBase56,
4019
+ fieldToBase64,
4020
+ formatTime,
4021
+ fromBase,
4022
+ fungibleTokenVerificationKeys,
4023
+ getAccountFromGraphQL,
4024
+ getAccountNonce,
4025
+ getBalanceFromGraphQL,
4026
+ getCurrentNetwork,
4027
+ getDeployer,
4028
+ getNetworkIdHash,
4029
+ getNonce,
4030
+ getPaymentTxsFromBlockBerry,
4031
+ getTokenSymbolAndAdmin,
4032
+ getTxStatusFast,
4033
+ getZkAppFromBlockBerry,
4034
+ getZkAppTxFromBlockBerry,
4035
+ getZkAppTxsFromBlockBerry,
4036
+ initBlockchain,
4037
+ loadIndexedMerkleMap,
4038
+ makeString,
4039
+ networks,
4040
+ parseIndexedMapSerialized,
4041
+ pinJSON,
4042
+ saveIndexedMerkleMap,
4043
+ sendTx,
4044
+ serializeFields,
4045
+ serializeIndexedMap,
4046
+ serializeTransaction,
4047
+ sleep,
4048
+ toBase,
4049
+ tokenBalance,
4050
+ tokenVerificationKeys,
4051
+ transactionParams,
4052
+ txStatusBlockberry,
4053
+ zkCloudWorker,
4054
+ zkCloudWorkerClient
4055
+ });