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.
- package/dist/node/index.cjs +4055 -0
- package/package.json +5 -8
- package/dist/ts/index.cjs +0 -418768
- package/dist/ts/mina/token/FungibleToken.d.ts +0 -338
- package/dist/ts/mina/token/FungibleToken.js +0 -292
- package/dist/ts/mina/token/FungibleToken.js.map +0 -1
- package/dist/web/mina/token/FungibleToken.d.ts +0 -338
- package/dist/web/mina/token/FungibleToken.js +0 -292
- package/dist/web/mina/token/FungibleToken.js.map +0 -1
- /package/dist/{ts → node}/cloud/config.d.ts +0 -0
- /package/dist/{ts → node}/cloud/config.js +0 -0
- /package/dist/{ts → node}/cloud/config.js.map +0 -0
- /package/dist/{ts → node}/cloud/index.d.ts +0 -0
- /package/dist/{ts → node}/cloud/index.js +0 -0
- /package/dist/{ts → node}/cloud/index.js.map +0 -0
- /package/dist/{ts → node}/cloud/networks.d.ts +0 -0
- /package/dist/{ts → node}/cloud/networks.js +0 -0
- /package/dist/{ts → node}/cloud/networks.js.map +0 -0
- /package/dist/{ts → node}/cloud/utils/base64.d.ts +0 -0
- /package/dist/{ts → node}/cloud/utils/base64.js +0 -0
- /package/dist/{ts → node}/cloud/utils/base64.js.map +0 -0
- /package/dist/{ts → node}/cloud/utils/graphql.d.ts +0 -0
- /package/dist/{ts → node}/cloud/utils/graphql.js +0 -0
- /package/dist/{ts → node}/cloud/utils/graphql.js.map +0 -0
- /package/dist/{ts → node}/cloud/utils/index.d.ts +0 -0
- /package/dist/{ts → node}/cloud/utils/index.js +0 -0
- /package/dist/{ts → node}/cloud/utils/index.js.map +0 -0
- /package/dist/{ts → node}/cloud/utils/utils.d.ts +0 -0
- /package/dist/{ts → node}/cloud/utils/utils.js +0 -0
- /package/dist/{ts → node}/cloud/utils/utils.js.map +0 -0
- /package/dist/{ts → node}/cloud/worker/cloud.d.ts +0 -0
- /package/dist/{ts → node}/cloud/worker/cloud.js +0 -0
- /package/dist/{ts → node}/cloud/worker/cloud.js.map +0 -0
- /package/dist/{ts → node}/cloud/worker/index.d.ts +0 -0
- /package/dist/{ts → node}/cloud/worker/index.js +0 -0
- /package/dist/{ts → node}/cloud/worker/index.js.map +0 -0
- /package/dist/{ts → node}/cloud/worker/job.d.ts +0 -0
- /package/dist/{ts → node}/cloud/worker/job.js +0 -0
- /package/dist/{ts → node}/cloud/worker/job.js.map +0 -0
- /package/dist/{ts → node}/cloud/worker/task.d.ts +0 -0
- /package/dist/{ts → node}/cloud/worker/task.js +0 -0
- /package/dist/{ts → node}/cloud/worker/task.js.map +0 -0
- /package/dist/{ts → node}/cloud/worker/transaction.d.ts +0 -0
- /package/dist/{ts → node}/cloud/worker/transaction.js +0 -0
- /package/dist/{ts → node}/cloud/worker/transaction.js.map +0 -0
- /package/dist/{ts → node}/cloud/worker/worker.d.ts +0 -0
- /package/dist/{ts → node}/cloud/worker/worker.js +0 -0
- /package/dist/{ts → node}/cloud/worker/worker.js.map +0 -0
- /package/dist/{ts → node}/index.d.ts +0 -0
- /package/dist/{ts → node}/index.js +0 -0
- /package/dist/{ts → node}/index.js.map +0 -0
- /package/dist/{ts → node}/mina/api/api.d.ts +0 -0
- /package/dist/{ts → node}/mina/api/api.js +0 -0
- /package/dist/{ts → node}/mina/api/api.js.map +0 -0
- /package/dist/{ts → node}/mina/index.d.ts +0 -0
- /package/dist/{ts → node}/mina/index.js +0 -0
- /package/dist/{ts → node}/mina/index.js.map +0 -0
- /package/dist/{ts → node}/mina/local/local.d.ts +0 -0
- /package/dist/{ts → node}/mina/local/local.js +0 -0
- /package/dist/{ts → node}/mina/local/local.js.map +0 -0
- /package/dist/{ts → node}/mina/storage/index.d.ts +0 -0
- /package/dist/{ts → node}/mina/storage/index.js +0 -0
- /package/dist/{ts → node}/mina/storage/index.js.map +0 -0
- /package/dist/{ts → node}/mina/storage/ipfs.d.ts +0 -0
- /package/dist/{ts → node}/mina/storage/ipfs.js +0 -0
- /package/dist/{ts → node}/mina/storage/ipfs.js.map +0 -0
- /package/dist/{ts → node}/mina/storage/pinata.d.ts +0 -0
- /package/dist/{ts → node}/mina/storage/pinata.js +0 -0
- /package/dist/{ts → node}/mina/storage/pinata.js.map +0 -0
- /package/dist/{ts → node}/mina/storage/storage.d.ts +0 -0
- /package/dist/{ts → node}/mina/storage/storage.js +0 -0
- /package/dist/{ts → node}/mina/storage/storage.js.map +0 -0
- /package/dist/{ts → node}/mina/token/FungibleTokenAdmin.d.ts +0 -0
- /package/dist/{ts → node}/mina/token/FungibleTokenAdmin.js +0 -0
- /package/dist/{ts → node}/mina/token/FungibleTokenAdmin.js.map +0 -0
- /package/dist/{ts → node}/mina/token/FungibleTokenContract.d.ts +0 -0
- /package/dist/{ts → node}/mina/token/FungibleTokenContract.js +0 -0
- /package/dist/{ts → node}/mina/token/FungibleTokenContract.js.map +0 -0
- /package/dist/{ts → node}/mina/token/FungibleTokenWhitelistedAdmin.d.ts +0 -0
- /package/dist/{ts → node}/mina/token/FungibleTokenWhitelistedAdmin.js +0 -0
- /package/dist/{ts → node}/mina/token/FungibleTokenWhitelistedAdmin.js.map +0 -0
- /package/dist/{ts → node}/mina/token/api.d.ts +0 -0
- /package/dist/{ts → node}/mina/token/api.js +0 -0
- /package/dist/{ts → node}/mina/token/api.js.map +0 -0
- /package/dist/{ts → node}/mina/token/bid.d.ts +0 -0
- /package/dist/{ts → node}/mina/token/bid.js +0 -0
- /package/dist/{ts → node}/mina/token/bid.js.map +0 -0
- /package/dist/{ts → node}/mina/token/build.d.ts +0 -0
- /package/dist/{ts → node}/mina/token/build.js +0 -0
- /package/dist/{ts → node}/mina/token/build.js.map +0 -0
- /package/dist/{ts → node}/mina/token/fee.d.ts +0 -0
- /package/dist/{ts → node}/mina/token/fee.js +0 -0
- /package/dist/{ts → node}/mina/token/fee.js.map +0 -0
- /package/dist/{ts → node}/mina/token/index.d.ts +0 -0
- /package/dist/{ts → node}/mina/token/index.js +0 -0
- /package/dist/{ts → node}/mina/token/index.js.map +0 -0
- /package/dist/{ts → node}/mina/token/offer.d.ts +0 -0
- /package/dist/{ts → node}/mina/token/offer.js +0 -0
- /package/dist/{ts → node}/mina/token/offer.js.map +0 -0
- /package/dist/{ts → node}/mina/token/token.d.ts +0 -0
- /package/dist/{ts → node}/mina/token/token.js +0 -0
- /package/dist/{ts → node}/mina/token/token.js.map +0 -0
- /package/dist/{ts → node}/mina/token/vk.d.ts +0 -0
- /package/dist/{ts → node}/mina/token/vk.js +0 -0
- /package/dist/{ts → node}/mina/token/vk.js.map +0 -0
- /package/dist/{ts → node}/mina/token/whitelist.d.ts +0 -0
- /package/dist/{ts → node}/mina/token/whitelist.js +0 -0
- /package/dist/{ts → node}/mina/token/whitelist.js.map +0 -0
- /package/dist/{ts → node}/mina/transactions/account.d.ts +0 -0
- /package/dist/{ts → node}/mina/transactions/account.js +0 -0
- /package/dist/{ts → node}/mina/transactions/account.js.map +0 -0
- /package/dist/{ts → node}/mina/transactions/blockberry.d.ts +0 -0
- /package/dist/{ts → node}/mina/transactions/blockberry.js +0 -0
- /package/dist/{ts → node}/mina/transactions/blockberry.js.map +0 -0
- /package/dist/{ts → node}/mina/transactions/chain.d.ts +0 -0
- /package/dist/{ts → node}/mina/transactions/chain.js +0 -0
- /package/dist/{ts → node}/mina/transactions/chain.js.map +0 -0
- /package/dist/{ts → node}/mina/transactions/index.d.ts +0 -0
- /package/dist/{ts → node}/mina/transactions/index.js +0 -0
- /package/dist/{ts → node}/mina/transactions/index.js.map +0 -0
- /package/dist/{ts → node}/mina/transactions/nonce.d.ts +0 -0
- /package/dist/{ts → node}/mina/transactions/nonce.js +0 -0
- /package/dist/{ts → node}/mina/transactions/nonce.js.map +0 -0
- /package/dist/{ts → node}/mina/transactions/send.d.ts +0 -0
- /package/dist/{ts → node}/mina/transactions/send.js +0 -0
- /package/dist/{ts → node}/mina/transactions/send.js.map +0 -0
- /package/dist/{ts → node}/mina/transactions/tiny-contract.d.ts +0 -0
- /package/dist/{ts → node}/mina/transactions/tiny-contract.js +0 -0
- /package/dist/{ts → node}/mina/transactions/tiny-contract.js.map +0 -0
- /package/dist/{ts → node}/mina/transactions/transaction.d.ts +0 -0
- /package/dist/{ts → node}/mina/transactions/transaction.js +0 -0
- /package/dist/{ts → node}/mina/transactions/transaction.js.map +0 -0
- /package/dist/{ts → node}/mina/transactions/txstatus.d.ts +0 -0
- /package/dist/{ts → node}/mina/transactions/txstatus.js +0 -0
- /package/dist/{ts → node}/mina/transactions/txstatus.js.map +0 -0
- /package/dist/{ts → node}/mina/utils/base64.d.ts +0 -0
- /package/dist/{ts → node}/mina/utils/base64.js +0 -0
- /package/dist/{ts → node}/mina/utils/base64.js.map +0 -0
- /package/dist/{ts → node}/mina/utils/fee.d.ts +0 -0
- /package/dist/{ts → node}/mina/utils/fee.js +0 -0
- /package/dist/{ts → node}/mina/utils/fee.js.map +0 -0
- /package/dist/{ts → node}/mina/utils/fetch.d.ts +0 -0
- /package/dist/{ts → node}/mina/utils/fetch.js +0 -0
- /package/dist/{ts → node}/mina/utils/fetch.js.map +0 -0
- /package/dist/{ts → node}/mina/utils/fields.d.ts +0 -0
- /package/dist/{ts → node}/mina/utils/fields.js +0 -0
- /package/dist/{ts → node}/mina/utils/fields.js.map +0 -0
- /package/dist/{ts → node}/mina/utils/index.d.ts +0 -0
- /package/dist/{ts → node}/mina/utils/index.js +0 -0
- /package/dist/{ts → node}/mina/utils/index.js.map +0 -0
- /package/dist/{ts → node}/mina/utils/indexed-map.d.ts +0 -0
- /package/dist/{ts → node}/mina/utils/indexed-map.js +0 -0
- /package/dist/{ts → node}/mina/utils/indexed-map.js.map +0 -0
- /package/dist/{ts → node}/mina/utils/mina.d.ts +0 -0
- /package/dist/{ts → node}/mina/utils/mina.js +0 -0
- /package/dist/{ts → node}/mina/utils/mina.js.map +0 -0
- /package/dist/{ts → node}/mina/verification/index.d.ts +0 -0
- /package/dist/{ts → node}/mina/verification/index.js +0 -0
- /package/dist/{ts → node}/mina/verification/index.js.map +0 -0
- /package/dist/{ts → node}/mina/verification/verification.d.ts +0 -0
- /package/dist/{ts → node}/mina/verification/verification.js +0 -0
- /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: "AABvj1TjS95sAoY8puZRG2h4hxjs9c5enwfo4vZAQC/COWHgEjNupRIxb3LVxaRU2mkaG94By4OqrJ3M7YXNs4oiAhMdOuU5+NrHN3RCJtswX+WPvwaHJnihtSy2FcJPyghvBVTi2i7dtWIPQLVDIzC5ARu8f8H9JWjzjVVYE/rQLruuq2qUsCrqdVsdRaw+6OjIFeAXS6mzvrVv5iYGslg5CV5mgLBg3xC408jZJ0pe8ua2mcIEDMGEdSR/+VuhPQaqxZTJPBVhazVc1P9gRyS26SdOohL85UmEc4duqlJOOlXOFuwOT6dvoiUcdQtzuPp1pzA/LHueqm9yQG9mlT0Df8uY/A+rwM4l/ypTP/o0+5GCM9jJf9bl/z0DpGWheCJY+LZbIGeBUOpg0Gx1+KZsD9ivWJ0vxNz8zKcAS1i3FqFhahkJHiiKgikn6Qig5+Yf3MJs0WKSNkCkgW2B48srVTR9ykLyO+68NiWLEnLXvJd+rmUHR4K92whqctZZ8zvd2+5u+b62pkvFqqZZ9r24SMQOe9Bl2ZfMew2DyFLMPzwTowHw8onMEXcVKabFs9zQVp66AMf/wlipirNztdguAP2Hmpi/swGffC3cXDOY7T51PcPNIq+JcNbtKixzm7oIFyZ0FUgAhg5L7sDAkgRAXnQlKGuhGr24T+lV1YAdTheSiQ4YBcpnqpfVYnYG5iziTEdl5+3SENlC7E6MhR2PDoc/TmMvbEHnhNlo6tskqcmEUBQj+At5EO2NmogFDJIN6sRfrXOdH5l+QV7vR2v385RKRtfnmcJeUQcpq5/JTgVwagDJ/FarTN5jFsrBBRTeW3yZ5/CfVNA7NNWxoKhjBaHVIhn/fLT5sFLYzYdCx/uTsusyZmE2d6iqnLS+j1IXNJX/zR0ZD3aGuoUc4MaFZQnN5om4dfpbloe4Roob3BuDhBHTKoYC+nVsyEvDRyiYLEOjJ45/bSwTCfwngYKtNmo3sVTvQ9mqBf0cLdBCn8skp3S/gz324TFm8iJ+t8EWUdazjEF5SUgJ9OwSu7zKajU0z/lSuyQnY0u+PSkffBqQbMqayligd7M5K8XrSUs4vcz8xdT/N2lmYysr8WKzFxePtNnTBtOZwACL2/MwrhmYUhUwRHJP7qo1NJU0dD43n9ABs5DJ2D7S/qWyvx9G38ACltexG+ZMj8niqYfJiy0MqH5O4Df/c6DNekL1d6QYnjO0/3LMvY/f/y1+b7nPHI8+1Wqp5jZH8UsuN63SSMdfBEe6x46AG/R+YS/wH78GKekabWu9QQnUJdjXyXiqF4qRebvfcmpQz91anvVz3ggBqCv4sYqCIvP0ysDtMdi36zFErV+8SdUu+NsPDGvdPSCGdLuC25izxb21up2HORmlM5R7yuIW3rCiq8DeLD0OHjqOBZ+IEv9zEkb5fHTJvxoxnZlArtZSBpD6iIDPVDymuK+BsOggZav3K+TytjeD2Gcld5NfyRISFWUIMkZNFQRL8AQpET6RJnG1HSW0CaRfNeomtjCBWIr85wFCrp06j/D1J8B3EyhloZLJJ6ywxt41smXVugxA8LRTO+6lVBOBF14jHQCCUl6u7uiWCe1z4/bC5wQXPwWSljp8NVU8Erp1U9ModNK7W63Pkh0efvgSD5d0nLzbfa0jTdxZ1JkfKsnvYk43Ed+vmXooHZhUeZAIX8ZCizhb1Gfvm02JFwxYXmiYAOp5wkGzweU2I5zo8r5yZFI1r4XibNQs7eAfKGRv3gh8/EuLkX/bdettgPvNsI8ndpQ3kL/V8W2PQN4/hjC9AKCYBeXQG42bRncYZdLe++R2KA1ZdPDxQPF3sxUIKhzmRWqbozrtv310Maorwv6eZJjldlCJwICR9QgcDwDuNj+UFJnX3RWsdIWsUbI1T4wO0sE2sBiMX/OqmiGJEAnBegioistlFyfRvm54h+duNOl/ol1Fva7NoXvsL/wThAWUly7bnc7/Al2bBQlUrmEX46UnKXzYntkZDee7Lx1u1BBkJAj/5BH1YZOPmMCh498rBUiHmc+4uQqebqNSHdOSgC39ESss4u7GNhWj3fi9XXta6UT9wapEMGq0WTg2Kry6xNP2YZ5X8eaapRQc/KzYgz9XjQL6TKpqNuGEbRlmfYvIuoFbnOkZI7RYoGp3YheMs1pQErwOxLzZa9W3Okwx16TSDwPLR0xMdAyogMrOdKN4JSMyNnmOaoVf6PkN+K9fz7RuHtvgjKpuz4vsK5Z2wRneqPrnfu6PkgHcRQrd0SxqCbN23Z/yp8qOcN6XU49iCNEBjztT00tolQ9hCPMSE/eTZ+ioez7m3pJFVks3T5Rk/e+6MeowJWIOv20x6CPS9mhpr1JPwdNFrWdgs19VsobntCpF/rWxksdrYyk="
|
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: "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"
|
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: "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"
|
3430
|
+
}
|
3431
|
+
},
|
3432
|
+
testnet_v1: {
|
3433
|
+
admin: {
|
3434
|
+
hash: "1200635497217107248831982322269320244173535715339356861513501242012238077174",
|
3435
|
+
data: "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"
|
3436
|
+
},
|
3437
|
+
token: {
|
3438
|
+
hash: "25084457276132306637089336910977939820654927814172888515895248592725736067489",
|
3439
|
+
data: "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"
|
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
|
+
});
|