@silvana-one/coordination 1.0.23 → 1.0.25
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/build.d.ts +5 -0
- package/dist/node/build.js +21 -0
- package/dist/node/build.js.map +1 -0
- package/dist/node/faucet.d.ts +34 -0
- package/dist/node/faucet.js +91 -0
- package/dist/node/faucet.js.map +1 -0
- package/dist/node/index.cjs +337 -4
- package/dist/node/index.d.ts +5 -0
- package/dist/node/index.js +5 -0
- package/dist/node/index.js.map +1 -1
- package/dist/node/ipfs.d.ts +13 -0
- package/dist/node/ipfs.js +88 -0
- package/dist/node/ipfs.js.map +1 -0
- package/dist/node/public-key.d.ts +24 -0
- package/dist/node/public-key.js +44 -0
- package/dist/node/public-key.js.map +1 -0
- package/dist/node/publish.js.map +1 -1
- package/dist/node/upgrade.js +1 -12
- package/dist/node/upgrade.js.map +1 -1
- package/dist/node/walrus.d.ts +12 -0
- package/dist/node/walrus.js +73 -0
- package/dist/node/walrus.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.web.tsbuildinfo +1 -1
- package/dist/web/build.d.ts +5 -0
- package/dist/web/build.js +21 -0
- package/dist/web/build.js.map +1 -0
- package/dist/web/faucet.d.ts +34 -0
- package/dist/web/faucet.js +91 -0
- package/dist/web/faucet.js.map +1 -0
- package/dist/web/index.d.ts +5 -0
- package/dist/web/index.js +5 -0
- package/dist/web/index.js.map +1 -1
- package/dist/web/ipfs.d.ts +13 -0
- package/dist/web/ipfs.js +88 -0
- package/dist/web/ipfs.js.map +1 -0
- package/dist/web/public-key.d.ts +24 -0
- package/dist/web/public-key.js +44 -0
- package/dist/web/public-key.js.map +1 -0
- package/dist/web/publish.js.map +1 -1
- package/dist/web/upgrade.js +1 -12
- package/dist/web/upgrade.js.map +1 -1
- package/dist/web/walrus.d.ts +12 -0
- package/dist/web/walrus.js +73 -0
- package/dist/web/walrus.js.map +1 -0
- package/package.json +6 -5
- package/src/build.ts +33 -0
- package/src/faucet.ts +145 -0
- package/src/index.ts +5 -0
- package/src/ipfs.ts +105 -0
- package/src/public-key.ts +66 -0
- package/src/publish.ts +0 -2
- package/src/upgrade.ts +1 -18
- package/src/walrus.ts +96 -0
package/dist/web/ipfs.js
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { PinataSDK } from "pinata";
|
|
2
|
+
// IPFS
|
|
3
|
+
const pinataJwt = process.env.PINATA_JWT;
|
|
4
|
+
const pinataGateway = process.env.PINATA_GATEWAY_URL;
|
|
5
|
+
const pinataGatewayKey = process.env.PINATA_GATEWAY_API_KEY;
|
|
6
|
+
const pinata = new PinataSDK({
|
|
7
|
+
pinataJwt,
|
|
8
|
+
pinataGateway,
|
|
9
|
+
pinataGatewayKey,
|
|
10
|
+
});
|
|
11
|
+
export async function saveToIPFS(params) {
|
|
12
|
+
try {
|
|
13
|
+
if (!pinataJwt || !pinataGateway || !pinataGatewayKey) {
|
|
14
|
+
throw new Error("PINATA_JWT, PINATA_GATEWAY_URL, or PINATA_GATEWAY_API_KEY is not set");
|
|
15
|
+
}
|
|
16
|
+
const { data, filename, owner, days, description } = params;
|
|
17
|
+
if (data === undefined || data === null)
|
|
18
|
+
throw new Error("data is not set");
|
|
19
|
+
if (typeof data !== "string")
|
|
20
|
+
throw new Error("data is not a string");
|
|
21
|
+
if (data.length === 0)
|
|
22
|
+
throw new Error("data is empty");
|
|
23
|
+
const file = new File([data], filename ?? "da", {
|
|
24
|
+
type: "text/plain",
|
|
25
|
+
});
|
|
26
|
+
const expiry = days ? Date.now() + days * 24 * 60 * 60 * 1000 : undefined;
|
|
27
|
+
const keyvalues = {
|
|
28
|
+
app: "dex:devnet",
|
|
29
|
+
owner: owner ?? "",
|
|
30
|
+
expires: expiry ? new Date(expiry).toISOString() : "never",
|
|
31
|
+
expiry: expiry ? expiry.toString() : "0",
|
|
32
|
+
description: description ?? "",
|
|
33
|
+
type: "text/plain",
|
|
34
|
+
mime_type: "text/plain",
|
|
35
|
+
};
|
|
36
|
+
const upload = await pinata.upload.public
|
|
37
|
+
.file(file, {
|
|
38
|
+
metadata: {
|
|
39
|
+
name: filename ?? "da",
|
|
40
|
+
keyvalues,
|
|
41
|
+
},
|
|
42
|
+
})
|
|
43
|
+
.name(filename ?? "da");
|
|
44
|
+
console.log("IPFS: ", upload.cid);
|
|
45
|
+
return upload.cid;
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
console.error("Save to IPFS failed", error.message);
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function readFromIPFS(params) {
|
|
53
|
+
const { blobId } = params;
|
|
54
|
+
if (!blobId) {
|
|
55
|
+
throw new Error("blobId is not set");
|
|
56
|
+
}
|
|
57
|
+
try {
|
|
58
|
+
if (!pinataJwt || !pinataGateway || !pinataGatewayKey) {
|
|
59
|
+
throw new Error("PINATA_JWT, PINATA_GATEWAY_URL, or PINATA_GATEWAY_API_KEY is not set");
|
|
60
|
+
}
|
|
61
|
+
const url = await getIPFSUrl({ blobId });
|
|
62
|
+
const response = await fetch(url);
|
|
63
|
+
if (!response.ok) {
|
|
64
|
+
throw new Error("Failed to fetch from IPFS");
|
|
65
|
+
}
|
|
66
|
+
const data = await response.text();
|
|
67
|
+
return data;
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
console.error("Read from IPFS failed", error);
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export async function getIPFSUrl(params) {
|
|
75
|
+
const { blobId } = params;
|
|
76
|
+
if (!blobId) {
|
|
77
|
+
throw new Error("blobId is not set");
|
|
78
|
+
}
|
|
79
|
+
const gateway = process.env.PINATA_GATEWAY_URL ?? "https://gateway.pinata.cloud/ipfs/";
|
|
80
|
+
const apiToken = process.env.PINATA_GATEWAY_API_KEY;
|
|
81
|
+
const url = "https://" +
|
|
82
|
+
gateway +
|
|
83
|
+
"/ipfs/" +
|
|
84
|
+
blobId +
|
|
85
|
+
(apiToken ? "?pinataGatewayToken=" + apiToken : "");
|
|
86
|
+
return url;
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=ipfs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ipfs.js","sourceRoot":"","sources":["../../src/ipfs.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare function publicKeyToU256(publicKey: string): bigint;
|
|
2
|
+
export declare function u256ToFields(u256: bigint): {
|
|
3
|
+
x: bigint;
|
|
4
|
+
isOdd: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function u256ToPublicKey(u256: bigint): string;
|
|
7
|
+
export declare function convertMinaPublicKey(publicKey: string): {
|
|
8
|
+
x: bigint;
|
|
9
|
+
isOdd: boolean;
|
|
10
|
+
};
|
|
11
|
+
export declare function convertMinaPublicKeyToFields(publicKey?: string): bigint[];
|
|
12
|
+
export declare function signFields(params: {
|
|
13
|
+
privateKey: string;
|
|
14
|
+
fields: bigint[];
|
|
15
|
+
}): {
|
|
16
|
+
signature: string;
|
|
17
|
+
data: bigint[];
|
|
18
|
+
publicKey: string;
|
|
19
|
+
};
|
|
20
|
+
export declare function verifyFields(params: {
|
|
21
|
+
publicKey: string;
|
|
22
|
+
fields: bigint[];
|
|
23
|
+
signature: string;
|
|
24
|
+
}): boolean;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import Client from "mina-signer";
|
|
2
|
+
import { convertFieldsToPublicKey } from "./base58/public-key.js";
|
|
3
|
+
const client = new Client({
|
|
4
|
+
network: "testnet",
|
|
5
|
+
});
|
|
6
|
+
export function publicKeyToU256(publicKey) {
|
|
7
|
+
const raw = client.publicKeyToRaw(publicKey);
|
|
8
|
+
const swappedRaw = raw
|
|
9
|
+
.match(/.{1,2}/g)
|
|
10
|
+
?.reverse()
|
|
11
|
+
.join("") || "";
|
|
12
|
+
const u256 = BigInt("0x" + swappedRaw);
|
|
13
|
+
return u256;
|
|
14
|
+
}
|
|
15
|
+
const MAX_BIT = 2n ** 255n;
|
|
16
|
+
export function u256ToFields(u256) {
|
|
17
|
+
const isOdd = (u256 & MAX_BIT) != 0n;
|
|
18
|
+
const x = u256 - (isOdd ? MAX_BIT : 0n);
|
|
19
|
+
return { x, isOdd };
|
|
20
|
+
}
|
|
21
|
+
export function u256ToPublicKey(u256) {
|
|
22
|
+
const { x, isOdd } = u256ToFields(u256);
|
|
23
|
+
return convertFieldsToPublicKey({ x, isOdd });
|
|
24
|
+
}
|
|
25
|
+
export function convertMinaPublicKey(publicKey) {
|
|
26
|
+
const u256 = publicKeyToU256(publicKey);
|
|
27
|
+
return u256ToFields(u256);
|
|
28
|
+
}
|
|
29
|
+
export function convertMinaPublicKeyToFields(publicKey) {
|
|
30
|
+
if (!publicKey)
|
|
31
|
+
return [];
|
|
32
|
+
const { x, isOdd } = convertMinaPublicKey(publicKey);
|
|
33
|
+
return [x, isOdd ? 1n : 0n];
|
|
34
|
+
}
|
|
35
|
+
export function signFields(params) {
|
|
36
|
+
const { privateKey, fields } = params;
|
|
37
|
+
const signedData = client.signFields(fields.map(BigInt), privateKey);
|
|
38
|
+
return signedData;
|
|
39
|
+
}
|
|
40
|
+
export function verifyFields(params) {
|
|
41
|
+
const { publicKey, fields, signature } = params;
|
|
42
|
+
return client.verifyFields({ data: fields, publicKey, signature });
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=public-key.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-key.js","sourceRoot":"","sources":["../../src/public-key.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAElE,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC;IACxB,OAAO,EAAE,SAAS;CACnB,CAAC,CAAC;AAEH,MAAM,UAAU,eAAe,CAAC,SAAiB;IAC/C,MAAM,GAAG,GAAG,MAAM,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IAC7C,MAAM,UAAU,GACd,GAAG;SACA,KAAK,CAAC,SAAS,CAAC;QACjB,EAAE,OAAO,EAAE;SACV,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC;IACpB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,OAAO,GAAW,EAAE,IAAI,IAAI,CAAC;AAEnC,MAAM,UAAU,YAAY,CAAC,IAAY;IAIvC,MAAM,KAAK,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IACrC,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACxC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,wBAAwB,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IAIpD,MAAM,IAAI,GAAG,eAAe,CAAC,SAAS,CAAC,CAAC;IACxC,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,SAAkB;IAC7D,IAAI,CAAC,SAAS;QAAE,OAAO,EAAE,CAAC;IAC1B,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACrD,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAgD;IAKzE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IACtC,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;IACrE,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAI5B;IACC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAChD,OAAO,MAAM,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;AACrE,CAAC"}
|
package/dist/web/publish.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/publish.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/publish.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAIpC;IAGC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAClD,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IACvC,MAAM,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC;IAC7B,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC;QAC1C,OAAO;QACP,YAAY;KACb,CAAC,CAAC;IACH,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,eAAe,CACxC;QACE;YACE,MAAM,EAAE,YAAY;SACrB;KACF,EACD,OAAO,CACR,CAAC;IACF,oDAAoD;IACpD,oBAAoB;IACpB,MAAM;IACN,oDAAoD;IACpD,aAAa;IACb,mCAAmC;IACnC,6BAA6B;IAC7B,2BAA2B;IAC3B,OAAO;IACP,MAAM;IACN,+BAA+B;IAE/B,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACtB,2BAA2B;IAC3B,2BAA2B;IAC3B,uCAAuC;IACvC,gCAAgC;IAEhC,uCAAuC;IACvC,uBAAuB;IACvB,mCAAmC;IACnC,qBAAqB;IACrB,uBAAuB;IACvB,MAAM;IACN,0BAA0B;IAC1B,OAAO,EAAE,EAAE,EAAE,CAAC;AAChB,CAAC"}
|
package/dist/web/upgrade.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Transaction, UpgradePolicy
|
|
1
|
+
import { Transaction, UpgradePolicy } from "@mysten/sui/transactions";
|
|
2
2
|
import { suiClient } from "./sui-client.js";
|
|
3
3
|
export async function buildUpgradeTx(params) {
|
|
4
4
|
const { modules, dependencies, digest, address, keypair, packageID, upgradeCap, } = params;
|
|
@@ -17,12 +17,10 @@ export async function buildUpgradeTx(params) {
|
|
|
17
17
|
modules,
|
|
18
18
|
dependencies,
|
|
19
19
|
});
|
|
20
|
-
//console.log("upgradeData", upgradeData);
|
|
21
20
|
const commitData = tx.moveCall({
|
|
22
21
|
target: "0x2::package::commit_upgrade",
|
|
23
22
|
arguments: [tx.object(upgradeCap), upgradeData],
|
|
24
23
|
});
|
|
25
|
-
//console.log("commitData", commitData);
|
|
26
24
|
const paginatedCoins = await suiClient.getCoins({
|
|
27
25
|
owner: address,
|
|
28
26
|
});
|
|
@@ -33,19 +31,10 @@ export async function buildUpgradeTx(params) {
|
|
|
33
31
|
digest: coin.digest,
|
|
34
32
|
};
|
|
35
33
|
});
|
|
36
|
-
//console.log("coins", coins);
|
|
37
34
|
tx.setSender(address);
|
|
38
35
|
tx.setGasOwner(address);
|
|
39
36
|
tx.setGasPayment(coins);
|
|
40
|
-
//console.log("tx", await tx.toJSON());
|
|
41
37
|
tx.setGasBudget(300_000_000);
|
|
42
|
-
//console.log("tx", await tx.toJSON());
|
|
43
|
-
console.time("sign");
|
|
44
|
-
// const signedTx = await tx.sign({
|
|
45
|
-
// signer: keypair,
|
|
46
|
-
// client: suiClient,
|
|
47
|
-
// });
|
|
48
|
-
console.timeEnd("sign");
|
|
49
38
|
return { tx };
|
|
50
39
|
}
|
|
51
40
|
//# sourceMappingURL=upgrade.js.map
|
package/dist/web/upgrade.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/upgrade.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/upgrade.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAQpC;IAGC,MAAM,EACJ,OAAO,EACP,YAAY,EACZ,MAAM,EACN,OAAO,EACP,OAAO,EACP,SAAS,EACT,UAAU,GACX,GAAG,MAAM,CAAC;IACX,MAAM,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC;IAC7B,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,CAAC;QACzB,MAAM,EAAE,iCAAiC;QACzC,SAAS,EAAE;YACT,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC;YACrB,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC;YACpC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC;SAC7B;KACF,CAAC,CAAC;IACH,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC;QAC7B,OAAO,EAAE,SAAS;QAClB,MAAM;QACN,OAAO;QACP,YAAY;KACb,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,EAAE,CAAC,QAAQ,CAAC;QAC7B,MAAM,EAAE,8BAA8B;QACtC,SAAS,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,WAAW,CAAC;KAChD,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC;QAC9C,KAAK,EAAE,OAAO;KACf,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QAC7C,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,YAAY;YAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACtB,EAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACxB,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACxB,EAAE,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IAE7B,OAAO,EAAE,EAAE,EAAE,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const walrusDaemon: "local" | "testnet";
|
|
2
|
+
export declare function saveToWalrus({ data, address, numEpochs, }: {
|
|
3
|
+
data: string;
|
|
4
|
+
address?: string;
|
|
5
|
+
numEpochs?: number;
|
|
6
|
+
}): Promise<string | undefined>;
|
|
7
|
+
export declare function readFromWalrus({ blobId, }: {
|
|
8
|
+
blobId: string;
|
|
9
|
+
}): Promise<string | undefined>;
|
|
10
|
+
export declare function getWalrusUrl(params: {
|
|
11
|
+
blobId: string;
|
|
12
|
+
}): Promise<string>;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
export const walrusDaemon = (process.env.NEXT_PUBLIC_WALRUS_DAEMON ||
|
|
2
|
+
process.env.WALRUS_DAEMON ||
|
|
3
|
+
"testnet");
|
|
4
|
+
const daemon = walrusDaemon === "local" ? "local" : "testnet";
|
|
5
|
+
const basePublisherUrl = daemon === "local"
|
|
6
|
+
? "http://127.0.0.1:31415"
|
|
7
|
+
: "https://wal-publisher-testnet.staketab.org";
|
|
8
|
+
//"https://publisher.walrus-testnet.walrus.space";
|
|
9
|
+
const readerUrl = daemon === "local"
|
|
10
|
+
? "http://127.0.0.1:31415/v1/blobs/"
|
|
11
|
+
: "https://wal-aggregator-testnet.staketab.org/v1/blobs/";
|
|
12
|
+
//"https://aggregator.walrus-testnet.walrus.space/v1/blobs/";
|
|
13
|
+
const MIN_EPOCHS = 14;
|
|
14
|
+
const MAX_EPOCHS = 53;
|
|
15
|
+
export async function saveToWalrus({ data, address, numEpochs = MIN_EPOCHS, }) {
|
|
16
|
+
let sendToParam = address ? `&send_object_to=${address}` : "";
|
|
17
|
+
let epochs = numEpochs < MIN_EPOCHS
|
|
18
|
+
? MIN_EPOCHS
|
|
19
|
+
: numEpochs > MAX_EPOCHS
|
|
20
|
+
? MAX_EPOCHS
|
|
21
|
+
: numEpochs;
|
|
22
|
+
console.log("Writing to Walrus");
|
|
23
|
+
console.time("written");
|
|
24
|
+
const response = await fetch(`${basePublisherUrl}/v1/blobs?epochs=${epochs}${sendToParam}`, {
|
|
25
|
+
method: "PUT",
|
|
26
|
+
body: data,
|
|
27
|
+
});
|
|
28
|
+
console.timeEnd("written");
|
|
29
|
+
if (response.status === 200) {
|
|
30
|
+
const info = await response.json();
|
|
31
|
+
//console.log("info", info);
|
|
32
|
+
const blobId = info?.newlyCreated?.blobObject?.blobId ?? info?.alreadyCertified?.blobId;
|
|
33
|
+
console.log("Walrus blobId", blobId);
|
|
34
|
+
return blobId;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
console.error("saveToDA failed:", {
|
|
38
|
+
statusText: response.statusText,
|
|
39
|
+
status: response.status,
|
|
40
|
+
});
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function readFromWalrus({ blobId, }) {
|
|
45
|
+
if (!blobId) {
|
|
46
|
+
throw new Error("blobId is not provided");
|
|
47
|
+
}
|
|
48
|
+
console.log("Reading walrus blob", blobId);
|
|
49
|
+
console.time("read");
|
|
50
|
+
const response = await fetch(`${readerUrl}${blobId}`);
|
|
51
|
+
console.timeEnd("read");
|
|
52
|
+
if (!response.ok) {
|
|
53
|
+
console.error("readFromDA failed:", {
|
|
54
|
+
statusText: response.statusText,
|
|
55
|
+
status: response.status,
|
|
56
|
+
});
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
const blob = await response.text();
|
|
61
|
+
//console.log("blob", blob);
|
|
62
|
+
return blob;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export async function getWalrusUrl(params) {
|
|
66
|
+
const { blobId } = params;
|
|
67
|
+
if (!blobId) {
|
|
68
|
+
throw new Error("blobId is not set");
|
|
69
|
+
}
|
|
70
|
+
const url = `${readerUrl}${blobId}`;
|
|
71
|
+
return url;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=walrus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walrus.js","sourceRoot":"","sources":["../../src/walrus.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@silvana-one/coordination",
|
|
3
3
|
"description": "Silvana Coordination Client",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.25",
|
|
5
5
|
"author": "DFST",
|
|
6
6
|
"bugs": "https://github.com/SilvanaOne/silvana-lib/issues",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@mysten/sui": "^1.
|
|
8
|
+
"@mysten/sui": "^1.36.0",
|
|
9
9
|
"mina-signer": "^3.0.7",
|
|
10
|
-
"nanoid": "^5.1.5"
|
|
10
|
+
"nanoid": "^5.1.5",
|
|
11
|
+
"pinata": "^2.4.9"
|
|
11
12
|
},
|
|
12
13
|
"devDependencies": {
|
|
13
|
-
"@types/node": "^24.0.
|
|
14
|
-
"esbuild": "^0.25.
|
|
14
|
+
"@types/node": "^24.0.14",
|
|
15
|
+
"esbuild": "^0.25.6",
|
|
15
16
|
"typescript": "^5.8.3"
|
|
16
17
|
},
|
|
17
18
|
"engines": {
|
package/src/build.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export async function buildMovePackage(path: string): Promise<{
|
|
2
|
+
modules: string[];
|
|
3
|
+
dependencies: string[];
|
|
4
|
+
digest: number[];
|
|
5
|
+
}> {
|
|
6
|
+
const { execSync } = await import("child_process");
|
|
7
|
+
let bytes:
|
|
8
|
+
| {
|
|
9
|
+
modules: string[];
|
|
10
|
+
dependencies: string[];
|
|
11
|
+
digest: number[];
|
|
12
|
+
}
|
|
13
|
+
| undefined = undefined;
|
|
14
|
+
|
|
15
|
+
console.log("Running sui client publish command...");
|
|
16
|
+
try {
|
|
17
|
+
const output = execSync(
|
|
18
|
+
`sui move build --dump-bytecode-as-base64 --ignore-chain --path ${path}`,
|
|
19
|
+
{
|
|
20
|
+
encoding: "utf-8",
|
|
21
|
+
}
|
|
22
|
+
);
|
|
23
|
+
bytes = JSON.parse(output);
|
|
24
|
+
if (!bytes) {
|
|
25
|
+
throw new Error("Error building package");
|
|
26
|
+
}
|
|
27
|
+
return bytes;
|
|
28
|
+
//console.log("Command output:", bytes);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
console.error("Error running command:", error);
|
|
31
|
+
throw error;
|
|
32
|
+
}
|
|
33
|
+
}
|
package/src/faucet.ts
ADDED
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use server";
|
|
2
|
+
|
|
3
|
+
import { Ed25519Keypair } from "@mysten/sui/keypairs/ed25519";
|
|
4
|
+
|
|
5
|
+
export async function silvanaFaucet(params: {
|
|
6
|
+
address: string;
|
|
7
|
+
amount?: number;
|
|
8
|
+
}): Promise<{
|
|
9
|
+
message: string;
|
|
10
|
+
success: true;
|
|
11
|
+
transaction_hash: string;
|
|
12
|
+
}> {
|
|
13
|
+
const { address, amount = 1 } = params;
|
|
14
|
+
const response = await fetch(`${silvanaFaucetEndpoint()}/fund`, {
|
|
15
|
+
method: "POST",
|
|
16
|
+
headers: {
|
|
17
|
+
"Content-Type": "application/json",
|
|
18
|
+
},
|
|
19
|
+
body: JSON.stringify({
|
|
20
|
+
address,
|
|
21
|
+
amount,
|
|
22
|
+
}),
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
if (!response.ok) {
|
|
26
|
+
throw new Error(
|
|
27
|
+
`Failed to fund address: ${address} ${amount} ${response.status} ${response.statusText}`
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return response.json();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export async function silvanaFaucetGetKey(
|
|
35
|
+
params: {
|
|
36
|
+
autoReturn: boolean;
|
|
37
|
+
} = {
|
|
38
|
+
autoReturn: false,
|
|
39
|
+
}
|
|
40
|
+
): Promise<{
|
|
41
|
+
key_pair: {
|
|
42
|
+
address: string;
|
|
43
|
+
issued_at: string;
|
|
44
|
+
private_key_bech32: string;
|
|
45
|
+
private_key_hex: string;
|
|
46
|
+
public_key: string;
|
|
47
|
+
};
|
|
48
|
+
message: string;
|
|
49
|
+
success: true;
|
|
50
|
+
}> {
|
|
51
|
+
const response = await fetch(`${silvanaFaucetEndpoint()}/get_key`, {
|
|
52
|
+
method: "POST",
|
|
53
|
+
headers: {
|
|
54
|
+
"Content-Type": "application/json",
|
|
55
|
+
},
|
|
56
|
+
body: JSON.stringify({
|
|
57
|
+
auto_return: params.autoReturn,
|
|
58
|
+
}),
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
if (!response.ok) {
|
|
62
|
+
throw new Error(
|
|
63
|
+
`Failed to get key: ${response.status} ${response.statusText}`
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return response.json();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export async function silvanaFaucetPingKey(params: {
|
|
71
|
+
address: string;
|
|
72
|
+
}): Promise<{
|
|
73
|
+
message: string;
|
|
74
|
+
success: boolean;
|
|
75
|
+
}> {
|
|
76
|
+
const { address } = params;
|
|
77
|
+
if (!address) {
|
|
78
|
+
return {
|
|
79
|
+
message: "Address is required",
|
|
80
|
+
success: false,
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const response = await fetch(`${silvanaFaucetEndpoint()}/ping_key`, {
|
|
84
|
+
method: "POST",
|
|
85
|
+
headers: {
|
|
86
|
+
"Content-Type": "application/json",
|
|
87
|
+
},
|
|
88
|
+
body: JSON.stringify({
|
|
89
|
+
address,
|
|
90
|
+
}),
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
if (!response.ok) {
|
|
94
|
+
throw new Error(
|
|
95
|
+
`Failed to return key: ${response.status} ${response.statusText}`
|
|
96
|
+
);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return response.json();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export async function silvanaFaucetReturnKey(params: {
|
|
103
|
+
address?: string;
|
|
104
|
+
secretKey?: string;
|
|
105
|
+
}): Promise<{
|
|
106
|
+
message: string;
|
|
107
|
+
success: boolean;
|
|
108
|
+
}> {
|
|
109
|
+
const address =
|
|
110
|
+
params.address ??
|
|
111
|
+
(params.secretKey
|
|
112
|
+
? Ed25519Keypair.fromSecretKey(params.secretKey).toSuiAddress()
|
|
113
|
+
: undefined);
|
|
114
|
+
if (!address) {
|
|
115
|
+
return {
|
|
116
|
+
message: "Address or secret key is required",
|
|
117
|
+
success: false,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const response = await fetch(`${silvanaFaucetEndpoint()}/return_key`, {
|
|
121
|
+
method: "POST",
|
|
122
|
+
headers: {
|
|
123
|
+
"Content-Type": "application/json",
|
|
124
|
+
},
|
|
125
|
+
body: JSON.stringify({
|
|
126
|
+
address,
|
|
127
|
+
}),
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
if (!response.ok) {
|
|
131
|
+
throw new Error(
|
|
132
|
+
`Failed to return key: ${response.status} ${response.statusText}`
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
return response.json();
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function silvanaFaucetEndpoint(): string {
|
|
140
|
+
const silvanaFaucetEndpoint = process.env.SILVANA_FAUCET_ENDPOINT!;
|
|
141
|
+
if (!silvanaFaucetEndpoint) {
|
|
142
|
+
throw new Error("SILVANA_FAUCET_ENDPOINT is not set");
|
|
143
|
+
}
|
|
144
|
+
return silvanaFaucetEndpoint;
|
|
145
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -7,3 +7,8 @@ export * from "./upgrade.js";
|
|
|
7
7
|
export * from "./mvr.js";
|
|
8
8
|
export * from "./agent.js";
|
|
9
9
|
export * from "./fetch.js";
|
|
10
|
+
export * from "./build.js";
|
|
11
|
+
export * from "./walrus.js";
|
|
12
|
+
export * from "./faucet.js";
|
|
13
|
+
export * from "./ipfs.js";
|
|
14
|
+
export * from "./public-key.js";
|
package/src/ipfs.ts
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { PinataSDK } from "pinata";
|
|
2
|
+
|
|
3
|
+
// IPFS
|
|
4
|
+
const pinataJwt = process.env.PINATA_JWT;
|
|
5
|
+
const pinataGateway = process.env.PINATA_GATEWAY_URL;
|
|
6
|
+
const pinataGatewayKey = process.env.PINATA_GATEWAY_API_KEY;
|
|
7
|
+
|
|
8
|
+
const pinata = new PinataSDK({
|
|
9
|
+
pinataJwt,
|
|
10
|
+
pinataGateway,
|
|
11
|
+
pinataGatewayKey,
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
export async function saveToIPFS(params: {
|
|
15
|
+
data: string;
|
|
16
|
+
filename?: string;
|
|
17
|
+
owner?: string;
|
|
18
|
+
days?: number;
|
|
19
|
+
description?: string;
|
|
20
|
+
}): Promise<string | undefined> {
|
|
21
|
+
try {
|
|
22
|
+
if (!pinataJwt || !pinataGateway || !pinataGatewayKey) {
|
|
23
|
+
throw new Error(
|
|
24
|
+
"PINATA_JWT, PINATA_GATEWAY_URL, or PINATA_GATEWAY_API_KEY is not set"
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
const { data, filename, owner, days, description } = params;
|
|
28
|
+
if (data === undefined || data === null) throw new Error("data is not set");
|
|
29
|
+
if (typeof data !== "string") throw new Error("data is not a string");
|
|
30
|
+
if (data.length === 0) throw new Error("data is empty");
|
|
31
|
+
|
|
32
|
+
const file = new File([data], filename ?? "da", {
|
|
33
|
+
type: "text/plain",
|
|
34
|
+
});
|
|
35
|
+
const expiry = days ? Date.now() + days * 24 * 60 * 60 * 1000 : undefined;
|
|
36
|
+
const keyvalues = {
|
|
37
|
+
app: "dex:devnet",
|
|
38
|
+
owner: owner ?? "",
|
|
39
|
+
expires: expiry ? new Date(expiry).toISOString() : "never",
|
|
40
|
+
expiry: expiry ? expiry.toString() : "0",
|
|
41
|
+
description: description ?? "",
|
|
42
|
+
type: "text/plain",
|
|
43
|
+
mime_type: "text/plain",
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const upload = await pinata.upload.public
|
|
47
|
+
.file(file, {
|
|
48
|
+
metadata: {
|
|
49
|
+
name: filename ?? "da",
|
|
50
|
+
keyvalues,
|
|
51
|
+
},
|
|
52
|
+
})
|
|
53
|
+
.name(filename ?? "da");
|
|
54
|
+
|
|
55
|
+
console.log("IPFS: ", upload.cid);
|
|
56
|
+
return upload.cid;
|
|
57
|
+
} catch (error: any) {
|
|
58
|
+
console.error("Save to IPFS failed", error.message);
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export async function readFromIPFS(params: {
|
|
64
|
+
blobId: string;
|
|
65
|
+
}): Promise<string | undefined> {
|
|
66
|
+
const { blobId } = params;
|
|
67
|
+
if (!blobId) {
|
|
68
|
+
throw new Error("blobId is not set");
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
if (!pinataJwt || !pinataGateway || !pinataGatewayKey) {
|
|
72
|
+
throw new Error(
|
|
73
|
+
"PINATA_JWT, PINATA_GATEWAY_URL, or PINATA_GATEWAY_API_KEY is not set"
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
const url = await getIPFSUrl({ blobId });
|
|
77
|
+
const response = await fetch(url);
|
|
78
|
+
if (!response.ok) {
|
|
79
|
+
throw new Error("Failed to fetch from IPFS");
|
|
80
|
+
}
|
|
81
|
+
const data = await response.text();
|
|
82
|
+
return data;
|
|
83
|
+
} catch (error: any) {
|
|
84
|
+
console.error("Read from IPFS failed", error);
|
|
85
|
+
return undefined;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export async function getIPFSUrl(params: { blobId: string }): Promise<string> {
|
|
90
|
+
const { blobId } = params;
|
|
91
|
+
if (!blobId) {
|
|
92
|
+
throw new Error("blobId is not set");
|
|
93
|
+
}
|
|
94
|
+
const gateway =
|
|
95
|
+
process.env.PINATA_GATEWAY_URL ?? "https://gateway.pinata.cloud/ipfs/";
|
|
96
|
+
const apiToken = process.env.PINATA_GATEWAY_API_KEY;
|
|
97
|
+
|
|
98
|
+
const url =
|
|
99
|
+
"https://" +
|
|
100
|
+
gateway +
|
|
101
|
+
"/ipfs/" +
|
|
102
|
+
blobId +
|
|
103
|
+
(apiToken ? "?pinataGatewayToken=" + apiToken : "");
|
|
104
|
+
return url;
|
|
105
|
+
}
|