zkcloudworker 0.5.1 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/ts/src/api/api.js +14 -6
- package/lib/ts/src/index.d.ts +3 -2
- package/lib/ts/src/index.js +3 -2
- package/lib/ts/src/utils/base64.d.ts +5 -0
- package/lib/ts/src/utils/base64.js +90 -0
- package/lib/ts/src/{fetch.js → utils/fetch.js} +24 -6
- package/lib/ts/src/utils/fields.d.ts +3 -0
- package/lib/ts/src/utils/fields.js +33 -0
- package/lib/ts/tsconfig.tsbuildinfo +1 -1
- package/lib/web/src/api/api.js +260 -275
- package/lib/web/src/api/api.js.map +1 -1
- package/lib/web/src/cloud/cloud.js +12 -25
- package/lib/web/src/cloud/cloud.js.map +1 -1
- package/lib/web/src/cloud/files.js +59 -68
- package/lib/web/src/cloud/files.js.map +1 -1
- package/lib/web/src/cloud/local.js +221 -259
- package/lib/web/src/cloud/local.js.map +1 -1
- package/lib/web/src/encryption/encryption.js +2 -5
- package/lib/web/src/encryption/encryption.js.map +1 -1
- package/lib/web/src/encryption/messages.js +24 -29
- package/lib/web/src/encryption/messages.js.map +1 -1
- package/lib/web/src/encryption/nats-client.js +67 -83
- package/lib/web/src/encryption/nats-client.js.map +1 -1
- package/lib/web/src/fee.js +3 -6
- package/lib/web/src/fee.js.map +1 -1
- package/lib/web/src/index.d.ts +3 -2
- package/lib/web/src/index.js +3 -2
- package/lib/web/src/index.js.map +1 -1
- package/lib/web/src/mina.js +60 -67
- package/lib/web/src/mina.js.map +1 -1
- package/lib/web/src/utils/base64.d.ts +5 -0
- package/lib/web/src/utils/base64.js +84 -0
- package/lib/web/src/utils/base64.js.map +1 -0
- package/lib/web/src/utils/fetch.js +79 -0
- package/lib/web/src/utils/fetch.js.map +1 -0
- package/lib/web/src/utils/fields.d.ts +3 -0
- package/lib/web/src/utils/fields.js +29 -0
- package/lib/web/src/utils/fields.js.map +1 -0
- package/lib/web/tsconfig.web.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/lib/ts/src/api/client-api.d.ts +0 -147
- package/lib/ts/src/api/client-api.js +0 -122
- package/lib/web/src/api/client-api.d.ts +0 -147
- package/lib/web/src/api/client-api.js +0 -134
- package/lib/web/src/api/client-api.js.map +0 -1
- package/lib/web/src/fetch.js +0 -68
- package/lib/web/src/fetch.js.map +0 -1
- /package/lib/ts/src/{fetch.d.ts → utils/fetch.d.ts} +0 -0
- /package/lib/web/src/{fetch.d.ts → utils/fetch.d.ts} +0 -0
@@ -1,36 +1,31 @@
|
|
1
|
-
import { __awaiter } from "tslib";
|
2
1
|
import { connect, JSONCodec } from "nats";
|
3
2
|
import config from "../config";
|
4
3
|
const { NATS_SERVER } = config;
|
5
4
|
const codec = JSONCodec();
|
6
|
-
export function postReadyMessage(clientAddress, workerAddress) {
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
return response;
|
19
|
-
});
|
5
|
+
export async function postReadyMessage(clientAddress, workerAddress) {
|
6
|
+
// connect to the NATS server and send a 'ready' request
|
7
|
+
const nc = await connect({ servers: NATS_SERVER });
|
8
|
+
const msg = await nc.request(`zkcw:${clientAddress}`, codec.encode({
|
9
|
+
post: "ready",
|
10
|
+
params: { key: workerAddress },
|
11
|
+
}));
|
12
|
+
const response = codec.decode(msg.data);
|
13
|
+
console.log("Response: ", response);
|
14
|
+
// disconnect and clean all pending
|
15
|
+
await nc.drain();
|
16
|
+
return response;
|
20
17
|
}
|
21
|
-
export function postDoneMessage(clientAddress, encrypted) {
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
return response;
|
34
|
-
});
|
18
|
+
export async function postDoneMessage(clientAddress, encrypted) {
|
19
|
+
// connect to the NATS server and send a 'ready' request
|
20
|
+
const nc = await connect({ servers: NATS_SERVER });
|
21
|
+
const msg = await nc.request(`zkcw:${clientAddress}`, codec.encode({
|
22
|
+
post: "done",
|
23
|
+
params: { result: encrypted },
|
24
|
+
}));
|
25
|
+
const response = codec.decode(msg.data);
|
26
|
+
console.log("Response: ", response);
|
27
|
+
// disconnect and clean all pending
|
28
|
+
await nc.drain();
|
29
|
+
return response;
|
35
30
|
}
|
36
31
|
//# sourceMappingURL=messages.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../../src/encryption/messages.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../../../src/encryption/messages.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,MAAM,MAAM,WAAW,CAAC;AAE/B,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC;AAE/B,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,aAAqB,EACrB,aAAqB;IAErB,wDAAwD;IACxD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,GAAQ,MAAM,EAAE,CAAC,OAAO,CAC/B,QAAQ,aAAa,EAAE,EACvB,KAAK,CAAC,MAAM,CAAC;QACX,IAAI,EAAE,OAAO;QACb,MAAM,EAAE,EAAE,GAAG,EAAE,aAAa,EAAE;KAC/B,CAAC,CACH,CAAC;IACF,MAAM,QAAQ,GAAQ,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAEpC,mCAAmC;IACnC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IAEjB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,aAAqB,EACrB,SAAiB;IAEjB,wDAAwD;IACxD,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACnD,MAAM,GAAG,GAAQ,MAAM,EAAE,CAAC,OAAO,CAC/B,QAAQ,aAAa,EAAE,EACvB,KAAK,CAAC,MAAM,CAAC;QACX,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE;KAC9B,CAAC,CACH,CAAC;IACF,MAAM,QAAQ,GAAQ,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAEpC,mCAAmC;IACnC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;IAEjB,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
@@ -1,95 +1,79 @@
|
|
1
|
-
import { __asyncValues, __awaiter } from "tslib";
|
2
1
|
import { connect, JSONCodec } from "nats";
|
3
2
|
import { initializeBindings } from "o1js";
|
4
3
|
import { CipherText } from "./encryption";
|
5
4
|
import config from "../config";
|
6
5
|
const { NATS_SERVER } = config;
|
7
|
-
export function listen(subject) {
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
yield initializeBindings();
|
6
|
+
export async function listen(subject) {
|
7
|
+
// Create a JSON codec for encoding and decoding messages
|
8
|
+
const codec = JSONCodec();
|
9
|
+
const connection = await connect({ servers: NATS_SERVER });
|
10
|
+
// Subscribe to the subject
|
11
|
+
const subscription = connection.subscribe(subject);
|
12
|
+
console.log(`Subscribed to subject ${subject}`);
|
13
|
+
// Process messages received on the subscribed subject
|
14
|
+
(async () => {
|
15
|
+
// Error decoding message: Error: Could not encrypt message={}
|
16
|
+
// Error: Poseidon.Sponge(): bindings are not initialized, try calling `await initializeBindings()` first.
|
17
|
+
// This shouldn't have happened and indicates an internal bug.
|
18
|
+
await initializeBindings();
|
19
|
+
for await (const msg of subscription) {
|
22
20
|
try {
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
command: "execute",
|
52
|
-
encrypted: encryptedPayload,
|
53
|
-
},
|
54
|
-
error: undefined,
|
55
|
-
}));
|
56
|
-
}
|
57
|
-
break;
|
58
|
-
case "done":
|
59
|
-
{
|
60
|
-
let result = params.result || "";
|
61
|
-
console.log("Received 'done' message from worker");
|
62
|
-
msg.respond(codec.encode({
|
63
|
-
success: true,
|
64
|
-
data: { status: "closed" },
|
65
|
-
error: undefined,
|
66
|
-
}));
|
67
|
-
// we want to insure that messages that are in flight
|
68
|
-
// get processed, so we are going to drain the
|
69
|
-
// connection. Drain is the same as close, but makes
|
70
|
-
// sure that all messages in flight get seen
|
71
|
-
// by the iterator. After calling drain on the connection
|
72
|
-
// the connection closes.
|
73
|
-
setTimeout(() => __awaiter(this, void 0, void 0, function* () {
|
74
|
-
yield connection.drain();
|
75
|
-
}), 1000);
|
76
|
-
}
|
77
|
-
break;
|
21
|
+
const data = codec.decode(msg.data);
|
22
|
+
//console.log(`Received message on subject ${subject}:`, data);
|
23
|
+
// Perform processing logic here
|
24
|
+
const { post, params } = data;
|
25
|
+
// console.log(`Post: `, post, params);
|
26
|
+
switch (post) {
|
27
|
+
case "ready":
|
28
|
+
{
|
29
|
+
// the workers announces it is ready
|
30
|
+
// and we receive the worker's publicKey
|
31
|
+
let workerKey = params.key || "";
|
32
|
+
console.log("Received 'ready' message from worker");
|
33
|
+
console.log("Worker publicKey: ", workerKey);
|
34
|
+
// we will use its key to encrypt the message
|
35
|
+
const encryptedPayload = CipherText.encrypt(JSON.stringify({
|
36
|
+
value: Math.ceil(Math.random() * 100).toString(),
|
37
|
+
}), workerKey);
|
38
|
+
console.log("Encrypted payload: ", encryptedPayload);
|
39
|
+
// we reply with the command we want the worker to execute
|
40
|
+
// and with the encrypted payload
|
41
|
+
msg.respond(codec.encode({
|
42
|
+
success: true,
|
43
|
+
data: {
|
44
|
+
command: "execute",
|
45
|
+
encrypted: encryptedPayload,
|
46
|
+
},
|
47
|
+
error: undefined,
|
48
|
+
}));
|
78
49
|
}
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
50
|
+
break;
|
51
|
+
case "done":
|
52
|
+
{
|
53
|
+
let result = params.result || "";
|
54
|
+
console.log("Received 'done' message from worker");
|
55
|
+
msg.respond(codec.encode({
|
56
|
+
success: true,
|
57
|
+
data: { status: "closed" },
|
58
|
+
error: undefined,
|
59
|
+
}));
|
60
|
+
// we want to insure that messages that are in flight
|
61
|
+
// get processed, so we are going to drain the
|
62
|
+
// connection. Drain is the same as close, but makes
|
63
|
+
// sure that all messages in flight get seen
|
64
|
+
// by the iterator. After calling drain on the connection
|
65
|
+
// the connection closes.
|
66
|
+
setTimeout(async () => {
|
67
|
+
await connection.drain();
|
68
|
+
}, 1000);
|
69
|
+
}
|
70
|
+
break;
|
83
71
|
}
|
84
72
|
}
|
85
|
-
catch (
|
86
|
-
|
87
|
-
try {
|
88
|
-
if (!_d && !_a && (_b = subscription_1.return)) yield _b.call(subscription_1);
|
89
|
-
}
|
90
|
-
finally { if (e_1) throw e_1.error; }
|
73
|
+
catch (err) {
|
74
|
+
console.error("Error decoding message: ", err);
|
91
75
|
}
|
92
|
-
}
|
93
|
-
});
|
76
|
+
}
|
77
|
+
})();
|
94
78
|
}
|
95
79
|
//# sourceMappingURL=nats-client.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"nats-client.js","sourceRoot":"","sources":["../../../../../src/encryption/nats-client.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"nats-client.js","sourceRoot":"","sources":["../../../../../src/encryption/nats-client.ts"],"names":[],"mappings":"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"}
|
package/lib/web/src/fee.js
CHANGED
@@ -1,10 +1,7 @@
|
|
1
|
-
import { __awaiter } from "tslib";
|
2
1
|
import { UInt64 } from "o1js";
|
3
2
|
import config from "./config";
|
4
|
-
export function fee() {
|
5
|
-
|
6
|
-
|
7
|
-
return UInt64.fromJSON(config.MINAFEE);
|
8
|
-
});
|
3
|
+
export async function fee() {
|
4
|
+
//TODO: update after mainnet launch
|
5
|
+
return UInt64.fromJSON(config.MINAFEE);
|
9
6
|
}
|
10
7
|
//# sourceMappingURL=fee.js.map
|
package/lib/web/src/fee.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"fee.js","sourceRoot":"","sources":["../../../../src/fee.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"fee.js","sourceRoot":"","sources":["../../../../src/fee.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,MAAM,MAAM,UAAU,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,GAAG;IACvB,mCAAmC;IACnC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACzC,CAAC"}
|
package/lib/web/src/index.d.ts
CHANGED
@@ -5,9 +5,10 @@ export * from "./cloud/job";
|
|
5
5
|
export * from "./cloud/task";
|
6
6
|
export * from "./mina";
|
7
7
|
export * from "./fee";
|
8
|
-
export * from "./fetch";
|
9
8
|
export * from "./networks";
|
10
|
-
export * from "./api/client-api";
|
11
9
|
export * from "./encryption/encryption";
|
12
10
|
export * from "./encryption/nats-client";
|
13
11
|
export * from "./encryption/messages";
|
12
|
+
export * from "./utils/fields";
|
13
|
+
export * from "./utils/base64";
|
14
|
+
export * from "./utils/fetch";
|
package/lib/web/src/index.js
CHANGED
@@ -5,10 +5,11 @@ export * from "./cloud/job";
|
|
5
5
|
export * from "./cloud/task";
|
6
6
|
export * from "./mina";
|
7
7
|
export * from "./fee";
|
8
|
-
export * from "./fetch";
|
9
8
|
export * from "./networks";
|
10
|
-
export * from "./api/client-api";
|
11
9
|
export * from "./encryption/encryption";
|
12
10
|
export * from "./encryption/nats-client";
|
13
11
|
export * from "./encryption/messages";
|
12
|
+
export * from "./utils/fields";
|
13
|
+
export * from "./utils/base64";
|
14
|
+
export * from "./utils/fetch";
|
14
15
|
//# sourceMappingURL=index.js.map
|
package/lib/web/src/index.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,OAAO,CAAC;AACtB,cAAc,
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,OAAO,CAAC;AACtB,cAAc,YAAY,CAAC;AAC3B,cAAc,yBAAyB,CAAC;AACxC,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC"}
|
package/lib/web/src/mina.js
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
import { __awaiter } from "tslib";
|
2
1
|
export { initBlockchain, Memory, makeString, sleep, accountBalance, accountBalanceMina, formatTime, currentNetwork, getNetworkIdHash, getCurrentNetwork, getDeployer, };
|
3
2
|
import { Mina, PrivateKey, UInt64, fetchAccount, Encoding, Poseidon, Lightnet, } from "o1js";
|
4
3
|
import { networks, Local } from "./networks";
|
@@ -23,80 +22,74 @@ function getDeployer() {
|
|
23
22
|
return undefined;
|
24
23
|
return currentNetwork.keys[0];
|
25
24
|
}
|
26
|
-
function initBlockchain(
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
proofsEnabled: true,
|
36
|
-
});
|
37
|
-
Mina.setActiveInstance(local);
|
38
|
-
if (deployersNumber > local.testAccounts.length)
|
39
|
-
throw new Error("Not enough test accounts");
|
40
|
-
currentNetwork = {
|
41
|
-
keys: local.testAccounts,
|
42
|
-
network: Local,
|
43
|
-
networkIdHash,
|
44
|
-
};
|
45
|
-
return currentNetwork;
|
46
|
-
}
|
47
|
-
const network = networks.find((n) => n.chainId === instance);
|
48
|
-
if (network === undefined) {
|
49
|
-
throw new Error("Unknown network");
|
50
|
-
}
|
51
|
-
const networkInstance = Mina.Network({
|
52
|
-
mina: network.mina,
|
53
|
-
archive: network.archive,
|
54
|
-
lightnetAccountManager: network.accountManager,
|
25
|
+
async function initBlockchain(instance, deployersNumber = 0) {
|
26
|
+
if (instance === "mainnet") {
|
27
|
+
throw new Error("Mainnet is not supported yet by zkApps");
|
28
|
+
}
|
29
|
+
const networkIdHash = Poseidon.hash(Encoding.stringToFields(instance));
|
30
|
+
// await used for compatibility with future versions of o1js
|
31
|
+
if (instance === "local") {
|
32
|
+
const local = await Mina.LocalBlockchain({
|
33
|
+
proofsEnabled: true,
|
55
34
|
});
|
56
|
-
Mina.setActiveInstance(
|
57
|
-
|
58
|
-
|
59
|
-
if (instance === "lighnet") {
|
60
|
-
for (let i = 0; i < deployersNumber; i++) {
|
61
|
-
const keyPair = yield Lightnet.acquireKeyPair();
|
62
|
-
const key = Mina.TestPublicKey(keyPair.privateKey);
|
63
|
-
keys.push(key);
|
64
|
-
}
|
65
|
-
}
|
66
|
-
else {
|
67
|
-
const deployers = process.env.DEPLOYERS;
|
68
|
-
if (deployers === undefined ||
|
69
|
-
Array.isArray(deployers) === false ||
|
70
|
-
deployers.length < deployersNumber)
|
71
|
-
throw new Error("Deployers are not set");
|
72
|
-
for (let i = 0; i < deployersNumber; i++) {
|
73
|
-
const privateKey = PrivateKey.fromBase58(deployers[i]);
|
74
|
-
const key = Mina.TestPublicKey(privateKey);
|
75
|
-
keys.push(key);
|
76
|
-
}
|
77
|
-
}
|
78
|
-
}
|
35
|
+
Mina.setActiveInstance(local);
|
36
|
+
if (deployersNumber > local.testAccounts.length)
|
37
|
+
throw new Error("Not enough test accounts");
|
79
38
|
currentNetwork = {
|
80
|
-
keys,
|
81
|
-
network,
|
39
|
+
keys: local.testAccounts,
|
40
|
+
network: Local,
|
82
41
|
networkIdHash,
|
83
42
|
};
|
84
43
|
return currentNetwork;
|
44
|
+
}
|
45
|
+
const network = networks.find((n) => n.chainId === instance);
|
46
|
+
if (network === undefined) {
|
47
|
+
throw new Error("Unknown network");
|
48
|
+
}
|
49
|
+
const networkInstance = Mina.Network({
|
50
|
+
mina: network.mina,
|
51
|
+
archive: network.archive,
|
52
|
+
lightnetAccountManager: network.accountManager,
|
85
53
|
});
|
54
|
+
Mina.setActiveInstance(networkInstance);
|
55
|
+
const keys = [];
|
56
|
+
if (deployersNumber > 0) {
|
57
|
+
if (instance === "lighnet") {
|
58
|
+
for (let i = 0; i < deployersNumber; i++) {
|
59
|
+
const keyPair = await Lightnet.acquireKeyPair();
|
60
|
+
const key = Mina.TestPublicKey(keyPair.privateKey);
|
61
|
+
keys.push(key);
|
62
|
+
}
|
63
|
+
}
|
64
|
+
else {
|
65
|
+
const deployers = process.env.DEPLOYERS;
|
66
|
+
if (deployers === undefined ||
|
67
|
+
Array.isArray(deployers) === false ||
|
68
|
+
deployers.length < deployersNumber)
|
69
|
+
throw new Error("Deployers are not set");
|
70
|
+
for (let i = 0; i < deployersNumber; i++) {
|
71
|
+
const privateKey = PrivateKey.fromBase58(deployers[i]);
|
72
|
+
const key = Mina.TestPublicKey(privateKey);
|
73
|
+
keys.push(key);
|
74
|
+
}
|
75
|
+
}
|
76
|
+
}
|
77
|
+
currentNetwork = {
|
78
|
+
keys,
|
79
|
+
network,
|
80
|
+
networkIdHash,
|
81
|
+
};
|
82
|
+
return currentNetwork;
|
86
83
|
}
|
87
|
-
function accountBalance(address) {
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
return UInt64.from(0);
|
94
|
-
});
|
84
|
+
async function accountBalance(address) {
|
85
|
+
await fetchAccount({ publicKey: address });
|
86
|
+
if (Mina.hasAccount(address))
|
87
|
+
return Mina.getBalance(address);
|
88
|
+
else
|
89
|
+
return UInt64.from(0);
|
95
90
|
}
|
96
|
-
function accountBalanceMina(address) {
|
97
|
-
return
|
98
|
-
return Number((yield accountBalance(address)).toBigInt()) / 1e9;
|
99
|
-
});
|
91
|
+
async function accountBalanceMina(address) {
|
92
|
+
return Number((await accountBalance(address)).toBigInt()) / 1e9;
|
100
93
|
}
|
101
94
|
function sleep(ms) {
|
102
95
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
package/lib/web/src/mina.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"mina.js","sourceRoot":"","sources":["../../../../src/mina.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"mina.js","sourceRoot":"","sources":["../../../../src/mina.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,5 @@
|
|
1
|
+
import { Field } from "o1js";
|
2
|
+
export declare function fieldToBase64(field: Field): string;
|
3
|
+
export declare function bigintToBase64(value: bigint): string;
|
4
|
+
export declare function fieldFromBase64(str: string): Field;
|
5
|
+
export declare function bigintFromBase64(str: string): bigint;
|
@@ -0,0 +1,84 @@
|
|
1
|
+
import { Field } from "o1js";
|
2
|
+
// URL friendly base64 encoding
|
3
|
+
const TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
|
4
|
+
export function fieldToBase64(field) {
|
5
|
+
const digits = toBase(field.toBigInt(), 64n);
|
6
|
+
//console.log("digits:", digits);
|
7
|
+
const str = digits.map((x) => TABLE[Number(x)]).join("");
|
8
|
+
//console.log("str:", str);
|
9
|
+
return str;
|
10
|
+
}
|
11
|
+
export function bigintToBase64(value) {
|
12
|
+
const digits = toBase(value, 64n);
|
13
|
+
//console.log("digits:", digits);
|
14
|
+
const str = digits.map((x) => TABLE[Number(x)]).join("");
|
15
|
+
//console.log("str:", str);
|
16
|
+
return str;
|
17
|
+
}
|
18
|
+
export function fieldFromBase64(str) {
|
19
|
+
const base64Digits = str.split("").map((x) => BigInt(TABLE.indexOf(x)));
|
20
|
+
const x = fromBase(base64Digits, 64n);
|
21
|
+
return Field(x);
|
22
|
+
}
|
23
|
+
export function bigintFromBase64(str) {
|
24
|
+
const base64Digits = str.split("").map((x) => BigInt(TABLE.indexOf(x)));
|
25
|
+
const x = fromBase(base64Digits, 64n);
|
26
|
+
return x;
|
27
|
+
}
|
28
|
+
function fromBase(digits, base) {
|
29
|
+
if (base <= 0n)
|
30
|
+
throw Error("fromBase: base must be positive");
|
31
|
+
// compute powers base, base^2, base^4, ..., base^(2^k)
|
32
|
+
// with largest k s.t. n = 2^k < digits.length
|
33
|
+
let basePowers = [];
|
34
|
+
for (let power = base, n = 1; n < digits.length; power **= 2n, n *= 2) {
|
35
|
+
basePowers.push(power);
|
36
|
+
}
|
37
|
+
let k = basePowers.length;
|
38
|
+
// pad digits array with zeros s.t. digits.length === 2^k
|
39
|
+
digits = digits.concat(Array(2 ** k - digits.length).fill(0n));
|
40
|
+
// accumulate [x0, x1, x2, x3, ...] -> [x0 + base*x1, x2 + base*x3, ...] -> [x0 + base*x1 + base^2*(x2 + base*x3), ...] -> ...
|
41
|
+
// until we end up with a single element
|
42
|
+
for (let i = 0; i < k; i++) {
|
43
|
+
let newDigits = Array(digits.length >> 1);
|
44
|
+
let basePower = basePowers[i];
|
45
|
+
for (let j = 0; j < newDigits.length; j++) {
|
46
|
+
newDigits[j] = digits[2 * j] + basePower * digits[2 * j + 1];
|
47
|
+
}
|
48
|
+
digits = newDigits;
|
49
|
+
}
|
50
|
+
console.assert(digits.length === 1);
|
51
|
+
let [digit] = digits;
|
52
|
+
return digit;
|
53
|
+
}
|
54
|
+
function toBase(x, base) {
|
55
|
+
if (base <= 0n)
|
56
|
+
throw Error("toBase: base must be positive");
|
57
|
+
// compute powers base, base^2, base^4, ..., base^(2^k)
|
58
|
+
// with largest k s.t. base^(2^k) < x
|
59
|
+
let basePowers = [];
|
60
|
+
for (let power = base; power <= x; power **= 2n) {
|
61
|
+
basePowers.push(power);
|
62
|
+
}
|
63
|
+
let digits = [x]; // single digit w.r.t base^(2^(k+1))
|
64
|
+
// successively split digits w.r.t. base^(2^j) into digits w.r.t. base^(2^(j-1))
|
65
|
+
// until we arrive at digits w.r.t. base
|
66
|
+
let k = basePowers.length;
|
67
|
+
for (let i = 0; i < k; i++) {
|
68
|
+
let newDigits = Array(2 * digits.length);
|
69
|
+
let basePower = basePowers[k - 1 - i];
|
70
|
+
for (let j = 0; j < digits.length; j++) {
|
71
|
+
let x = digits[j];
|
72
|
+
let high = x / basePower;
|
73
|
+
newDigits[2 * j + 1] = high;
|
74
|
+
newDigits[2 * j] = x - high * basePower;
|
75
|
+
}
|
76
|
+
digits = newDigits;
|
77
|
+
}
|
78
|
+
// pop "leading" zero digits
|
79
|
+
while (digits[digits.length - 1] === 0n) {
|
80
|
+
digits.pop();
|
81
|
+
}
|
82
|
+
return digits;
|
83
|
+
}
|
84
|
+
//# sourceMappingURL=base64.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"base64.js","sourceRoot":"","sources":["../../../../../src/utils/base64.ts"],"names":[],"mappings":"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"}
|