@haneullabs/zksend 0.1.0
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/CHANGELOG.md +1084 -0
- package/README.md +1 -0
- package/dist/cjs/index.d.ts +7 -0
- package/dist/cjs/index.js +38 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/index.test.d.ts +4 -0
- package/dist/cjs/links/builder.d.ts +55 -0
- package/dist/cjs/links/builder.js +361 -0
- package/dist/cjs/links/builder.js.map +7 -0
- package/dist/cjs/links/claim.d.ts +57 -0
- package/dist/cjs/links/claim.js +573 -0
- package/dist/cjs/links/claim.js.map +7 -0
- package/dist/cjs/links/get-sent-transactions.d.ts +25 -0
- package/dist/cjs/links/get-sent-transactions.js +134 -0
- package/dist/cjs/links/get-sent-transactions.js.map +7 -0
- package/dist/cjs/links/list-created-links.d.ts +24 -0
- package/dist/cjs/links/list-created-links.js +124 -0
- package/dist/cjs/links/list-created-links.js.map +7 -0
- package/dist/cjs/links/utils.d.ts +34 -0
- package/dist/cjs/links/utils.js +132 -0
- package/dist/cjs/links/utils.js.map +7 -0
- package/dist/cjs/links/zk-bag.d.ts +72 -0
- package/dist/cjs/links/zk-bag.js +145 -0
- package/dist/cjs/links/zk-bag.js.map +7 -0
- package/dist/cjs/package.json +5 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.js +20 -0
- package/dist/esm/index.js.map +7 -0
- package/dist/esm/index.test.d.ts +4 -0
- package/dist/esm/links/builder.d.ts +55 -0
- package/dist/esm/links/builder.js +341 -0
- package/dist/esm/links/builder.js.map +7 -0
- package/dist/esm/links/claim.d.ts +57 -0
- package/dist/esm/links/claim.js +561 -0
- package/dist/esm/links/claim.js.map +7 -0
- package/dist/esm/links/get-sent-transactions.d.ts +25 -0
- package/dist/esm/links/get-sent-transactions.js +114 -0
- package/dist/esm/links/get-sent-transactions.js.map +7 -0
- package/dist/esm/links/list-created-links.d.ts +24 -0
- package/dist/esm/links/list-created-links.js +104 -0
- package/dist/esm/links/list-created-links.js.map +7 -0
- package/dist/esm/links/utils.d.ts +34 -0
- package/dist/esm/links/utils.js +112 -0
- package/dist/esm/links/utils.js.map +7 -0
- package/dist/esm/links/zk-bag.d.ts +72 -0
- package/dist/esm/links/zk-bag.js +125 -0
- package/dist/esm/links/zk-bag.js.map +7 -0
- package/dist/esm/package.json +5 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/experimental/unified-adapter/package.json +6 -0
- package/package.json +60 -0
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __typeError = (msg) => {
|
|
7
|
+
throw TypeError(msg);
|
|
8
|
+
};
|
|
9
|
+
var __export = (target, all) => {
|
|
10
|
+
for (var name in all)
|
|
11
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
12
|
+
};
|
|
13
|
+
var __copyProps = (to, from, except, desc) => {
|
|
14
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
15
|
+
for (let key of __getOwnPropNames(from))
|
|
16
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
17
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
18
|
+
}
|
|
19
|
+
return to;
|
|
20
|
+
};
|
|
21
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
22
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
23
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
24
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
25
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
26
|
+
var zk_bag_exports = {};
|
|
27
|
+
__export(zk_bag_exports, {
|
|
28
|
+
MAINNET_CONTRACT_IDS: () => MAINNET_CONTRACT_IDS,
|
|
29
|
+
TESTNET_CONTRACT_IDS: () => TESTNET_CONTRACT_IDS,
|
|
30
|
+
ZkBag: () => ZkBag,
|
|
31
|
+
getContractIds: () => getContractIds
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(zk_bag_exports);
|
|
34
|
+
var _package, _module;
|
|
35
|
+
const TESTNET_CONTRACT_IDS = {
|
|
36
|
+
packageId: "0x036fee67274d0d85c3532f58296abe0dee86b93864f1b2b9074be6adb388f138",
|
|
37
|
+
bagStoreId: "0x5c63e71734c82c48a3cb9124c54001d1a09736cfb1668b3b30cd92a96dd4d0ce",
|
|
38
|
+
bagStoreTableId: "0x4e1bc4085d64005e03eb4eab2510d527aeba9548cda431cb8f149ff37451f870"
|
|
39
|
+
};
|
|
40
|
+
const MAINNET_CONTRACT_IDS = {
|
|
41
|
+
packageId: "0x5bb7d0bb3240011336ca9015f553b2646302a4f05f821160344e9ec5a988f740",
|
|
42
|
+
bagStoreId: "0x65b215a3f2a951c94313a89c43f0adbd2fd9ea78a0badf81e27d1c9868a8b6fe",
|
|
43
|
+
bagStoreTableId: "0x616db54ca564660cd58e36a4548be68b289371ef2611485c62c374a60960084e"
|
|
44
|
+
};
|
|
45
|
+
function getContractIds(network) {
|
|
46
|
+
if (!network) {
|
|
47
|
+
return MAINNET_CONTRACT_IDS;
|
|
48
|
+
}
|
|
49
|
+
return network === "mainnet" ? MAINNET_CONTRACT_IDS : TESTNET_CONTRACT_IDS;
|
|
50
|
+
}
|
|
51
|
+
class ZkBag {
|
|
52
|
+
constructor(packageAddress, ids) {
|
|
53
|
+
__privateAdd(this, _package);
|
|
54
|
+
__privateAdd(this, _module, "zk_bag");
|
|
55
|
+
__privateSet(this, _package, packageAddress);
|
|
56
|
+
this.ids = ids;
|
|
57
|
+
}
|
|
58
|
+
new({
|
|
59
|
+
arguments: [store, receiver]
|
|
60
|
+
}) {
|
|
61
|
+
return (tx) => {
|
|
62
|
+
tx.moveCall({
|
|
63
|
+
target: `${__privateGet(this, _package)}::${__privateGet(this, _module)}::new`,
|
|
64
|
+
arguments: [
|
|
65
|
+
tx.object(store),
|
|
66
|
+
typeof receiver === "string" ? tx.pure.address(receiver) : receiver
|
|
67
|
+
]
|
|
68
|
+
});
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
add({
|
|
72
|
+
arguments: [store, receiver, item],
|
|
73
|
+
typeArguments
|
|
74
|
+
}) {
|
|
75
|
+
return (tx) => tx.moveCall({
|
|
76
|
+
target: `${__privateGet(this, _package)}::${__privateGet(this, _module)}::add`,
|
|
77
|
+
arguments: [
|
|
78
|
+
tx.object(store),
|
|
79
|
+
typeof receiver === "string" ? tx.pure.address(receiver) : receiver,
|
|
80
|
+
tx.object(item)
|
|
81
|
+
],
|
|
82
|
+
typeArguments
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
init_claim({ arguments: [store] }) {
|
|
86
|
+
return (tx) => {
|
|
87
|
+
const [bag, claimProof] = tx.moveCall({
|
|
88
|
+
target: `${__privateGet(this, _package)}::${__privateGet(this, _module)}::init_claim`,
|
|
89
|
+
arguments: [tx.object(store)]
|
|
90
|
+
});
|
|
91
|
+
return [bag, claimProof];
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
reclaim({
|
|
95
|
+
arguments: [store, receiver]
|
|
96
|
+
}) {
|
|
97
|
+
return (tx) => {
|
|
98
|
+
const [bag, claimProof] = tx.moveCall({
|
|
99
|
+
target: `${__privateGet(this, _package)}::${__privateGet(this, _module)}::reclaim`,
|
|
100
|
+
arguments: [
|
|
101
|
+
tx.object(store),
|
|
102
|
+
typeof receiver === "string" ? tx.pure.address(receiver) : receiver
|
|
103
|
+
]
|
|
104
|
+
});
|
|
105
|
+
return [bag, claimProof];
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
claim({
|
|
109
|
+
arguments: [bag, claim, id],
|
|
110
|
+
typeArguments
|
|
111
|
+
}) {
|
|
112
|
+
return (tx) => tx.moveCall({
|
|
113
|
+
target: `${__privateGet(this, _package)}::${__privateGet(this, _module)}::claim`,
|
|
114
|
+
arguments: [tx.object(bag), tx.object(claim), typeof id === "string" ? tx.object(id) : id],
|
|
115
|
+
typeArguments
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
finalize({
|
|
119
|
+
arguments: [bag, claim]
|
|
120
|
+
}) {
|
|
121
|
+
return (tx) => {
|
|
122
|
+
tx.moveCall({
|
|
123
|
+
target: `${__privateGet(this, _package)}::${__privateGet(this, _module)}::finalize`,
|
|
124
|
+
arguments: [tx.object(bag), tx.object(claim)]
|
|
125
|
+
});
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
update_receiver({
|
|
129
|
+
arguments: [bag, from, to]
|
|
130
|
+
}) {
|
|
131
|
+
return (tx) => {
|
|
132
|
+
tx.moveCall({
|
|
133
|
+
target: `${__privateGet(this, _package)}::${__privateGet(this, _module)}::update_receiver`,
|
|
134
|
+
arguments: [
|
|
135
|
+
tx.object(bag),
|
|
136
|
+
typeof from === "string" ? tx.pure.address(from) : from,
|
|
137
|
+
typeof to === "string" ? tx.pure.address(to) : to
|
|
138
|
+
]
|
|
139
|
+
});
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
_package = new WeakMap();
|
|
144
|
+
_module = new WeakMap();
|
|
145
|
+
//# sourceMappingURL=zk-bag.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/links/zk-bag.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Argument, Transaction, TransactionObjectArgument } from '@haneullabs/haneul/transactions';\n\nexport interface ZkBagContractOptions {\n\tpackageId: string;\n\tbagStoreId: string;\n\tbagStoreTableId: string;\n}\n\nexport const TESTNET_CONTRACT_IDS: ZkBagContractOptions = {\n\tpackageId: '0x036fee67274d0d85c3532f58296abe0dee86b93864f1b2b9074be6adb388f138',\n\tbagStoreId: '0x5c63e71734c82c48a3cb9124c54001d1a09736cfb1668b3b30cd92a96dd4d0ce',\n\tbagStoreTableId: '0x4e1bc4085d64005e03eb4eab2510d527aeba9548cda431cb8f149ff37451f870',\n};\n\nexport const MAINNET_CONTRACT_IDS: ZkBagContractOptions = {\n\tpackageId: '0x5bb7d0bb3240011336ca9015f553b2646302a4f05f821160344e9ec5a988f740',\n\tbagStoreId: '0x65b215a3f2a951c94313a89c43f0adbd2fd9ea78a0badf81e27d1c9868a8b6fe',\n\tbagStoreTableId: '0x616db54ca564660cd58e36a4548be68b289371ef2611485c62c374a60960084e',\n};\n\nexport function getContractIds(network?: 'mainnet' | 'testnet') {\n\tif (!network) {\n\t\treturn MAINNET_CONTRACT_IDS;\n\t}\n\n\treturn network === 'mainnet' ? MAINNET_CONTRACT_IDS : TESTNET_CONTRACT_IDS;\n}\n\nexport class ZkBag<IDs> {\n\t#package: string;\n\t#module = 'zk_bag' as const;\n\tids: IDs;\n\n\tconstructor(packageAddress: string, ids: IDs) {\n\t\tthis.#package = packageAddress;\n\t\tthis.ids = ids;\n\t}\n\n\tnew({\n\t\targuments: [store, receiver],\n\t}: {\n\t\targuments: [store: TransactionObjectArgument | string, receiver: Argument | string];\n\t}) {\n\t\treturn (tx: Transaction) => {\n\t\t\ttx.moveCall({\n\t\t\t\ttarget: `${this.#package}::${this.#module}::new`,\n\t\t\t\targuments: [\n\t\t\t\t\ttx.object(store),\n\t\t\t\t\ttypeof receiver === 'string' ? tx.pure.address(receiver) : receiver,\n\t\t\t\t],\n\t\t\t});\n\t\t};\n\t}\n\n\tadd({\n\t\targuments: [store, receiver, item],\n\t\ttypeArguments,\n\t}: {\n\t\targuments: [\n\t\t\tstore: TransactionObjectArgument | string,\n\t\t\treceiver: Argument | string,\n\t\t\titem: TransactionObjectArgument | string,\n\t\t];\n\t\ttypeArguments: [string];\n\t}): (tx: Transaction) => Extract<Argument, { $kind: 'Result' }> {\n\t\treturn (tx: Transaction) =>\n\t\t\ttx.moveCall({\n\t\t\t\ttarget: `${this.#package}::${this.#module}::add`,\n\t\t\t\targuments: [\n\t\t\t\t\ttx.object(store),\n\t\t\t\t\ttypeof receiver === 'string' ? tx.pure.address(receiver) : receiver,\n\t\t\t\t\ttx.object(item),\n\t\t\t\t],\n\t\t\t\ttypeArguments: typeArguments,\n\t\t\t});\n\t}\n\n\tinit_claim({ arguments: [store] }: { arguments: [store: TransactionObjectArgument | string] }) {\n\t\treturn (tx: Transaction) => {\n\t\t\tconst [bag, claimProof] = tx.moveCall({\n\t\t\t\ttarget: `${this.#package}::${this.#module}::init_claim`,\n\t\t\t\targuments: [tx.object(store)],\n\t\t\t});\n\n\t\t\treturn [bag, claimProof] as const;\n\t\t};\n\t}\n\n\treclaim({\n\t\targuments: [store, receiver],\n\t}: {\n\t\targuments: [store: TransactionObjectArgument | string, receiver: Argument | string];\n\t}) {\n\t\treturn (tx: Transaction) => {\n\t\t\tconst [bag, claimProof] = tx.moveCall({\n\t\t\t\ttarget: `${this.#package}::${this.#module}::reclaim`,\n\t\t\t\targuments: [\n\t\t\t\t\ttx.object(store),\n\t\t\t\t\ttypeof receiver === 'string' ? tx.pure.address(receiver) : receiver,\n\t\t\t\t],\n\t\t\t});\n\n\t\t\treturn [bag, claimProof] as const;\n\t\t};\n\t}\n\n\tclaim({\n\t\targuments: [bag, claim, id],\n\t\ttypeArguments,\n\t}: {\n\t\targuments: [\n\t\t\tbag: TransactionObjectArgument | string,\n\t\t\tclaim: Extract<Argument, { $kind: 'NestedResult' }>,\n\t\t\tid: TransactionObjectArgument | string,\n\t\t];\n\t\ttypeArguments: [string];\n\t}): (tx: Transaction) => Extract<Argument, { $kind: 'Result' }> {\n\t\treturn (tx: Transaction) =>\n\t\t\ttx.moveCall({\n\t\t\t\ttarget: `${this.#package}::${this.#module}::claim`,\n\t\t\t\targuments: [tx.object(bag), tx.object(claim), typeof id === 'string' ? tx.object(id) : id],\n\t\t\t\ttypeArguments,\n\t\t\t});\n\t}\n\n\tfinalize({\n\t\targuments: [bag, claim],\n\t}: {\n\t\targuments: [\n\t\t\tbag: TransactionObjectArgument | string,\n\t\t\tclaim: Extract<Argument, { $kind: 'NestedResult' }>,\n\t\t];\n\t}) {\n\t\treturn (tx: Transaction) => {\n\t\t\ttx.moveCall({\n\t\t\t\ttarget: `${this.#package}::${this.#module}::finalize`,\n\t\t\t\targuments: [tx.object(bag), tx.object(claim)],\n\t\t\t});\n\t\t};\n\t}\n\n\tupdate_receiver({\n\t\targuments: [bag, from, to],\n\t}: {\n\t\targuments: [\n\t\t\tbag: TransactionObjectArgument | string,\n\t\t\tfrom: Argument | string,\n\t\t\tto: Argument | string,\n\t\t];\n\t}) {\n\t\treturn (tx: Transaction) => {\n\t\t\ttx.moveCall({\n\t\t\t\ttarget: `${this.#package}::${this.#module}::update_receiver`,\n\t\t\t\targuments: [\n\t\t\t\t\ttx.object(bag),\n\t\t\t\t\ttypeof from === 'string' ? tx.pure.address(from) : from,\n\t\t\t\t\ttypeof to === 'string' ? tx.pure.address(to) : to,\n\t\t\t\t],\n\t\t\t});\n\t\t};\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { ZkSendLinkBuilder, type ZkSendLinkBuilderOptions, type CreateZkSendLinkOptions, } from './links/builder.js';
|
|
2
|
+
export { ZkSendLink, type ZkSendLinkOptions } from './links/claim.js';
|
|
3
|
+
export { type ZkBagContractOptions, ZkBag } from './links/zk-bag.js';
|
|
4
|
+
export { isClaimTransaction } from './links/utils.js';
|
|
5
|
+
export { listCreatedLinks } from './links/list-created-links.js';
|
|
6
|
+
export { getSentTransactionsWithLinks } from './links/get-sent-transactions.js';
|
|
7
|
+
export { MAINNET_CONTRACT_IDS, TESTNET_CONTRACT_IDS } from './links/zk-bag.js';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ZkSendLinkBuilder
|
|
3
|
+
} from "./links/builder.js";
|
|
4
|
+
import { ZkSendLink } from "./links/claim.js";
|
|
5
|
+
import { ZkBag } from "./links/zk-bag.js";
|
|
6
|
+
import { isClaimTransaction } from "./links/utils.js";
|
|
7
|
+
import { listCreatedLinks } from "./links/list-created-links.js";
|
|
8
|
+
import { getSentTransactionsWithLinks } from "./links/get-sent-transactions.js";
|
|
9
|
+
import { MAINNET_CONTRACT_IDS, TESTNET_CONTRACT_IDS } from "./links/zk-bag.js";
|
|
10
|
+
export {
|
|
11
|
+
MAINNET_CONTRACT_IDS,
|
|
12
|
+
TESTNET_CONTRACT_IDS,
|
|
13
|
+
ZkBag,
|
|
14
|
+
ZkSendLink,
|
|
15
|
+
ZkSendLinkBuilder,
|
|
16
|
+
getSentTransactionsWithLinks,
|
|
17
|
+
isClaimTransaction,
|
|
18
|
+
listCreatedLinks
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/index.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport {\n\tZkSendLinkBuilder,\n\ttype ZkSendLinkBuilderOptions,\n\ttype CreateZkSendLinkOptions,\n} from './links/builder.js';\nexport { ZkSendLink, type ZkSendLinkOptions } from './links/claim.js';\nexport { type ZkBagContractOptions, ZkBag } from './links/zk-bag.js';\nexport { isClaimTransaction } from './links/utils.js';\nexport { listCreatedLinks } from './links/list-created-links.js';\nexport { getSentTransactionsWithLinks } from './links/get-sent-transactions.js';\n\nexport { MAINNET_CONTRACT_IDS, TESTNET_CONTRACT_IDS } from './links/zk-bag.js';\n"],
|
|
5
|
+
"mappings": "AAGA;AAAA,EACC;AAAA,OAGM;AACP,SAAS,kBAA0C;AACnD,SAAoC,aAAa;AACjD,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AACjC,SAAS,oCAAoC;AAE7C,SAAS,sBAAsB,4BAA4B;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { HaneulClient } from '@haneullabs/haneul/client';
|
|
2
|
+
import type { Keypair, Signer } from '@haneullabs/haneul/cryptography';
|
|
3
|
+
import type { TransactionObjectArgument, TransactionObjectInput } from '@haneullabs/haneul/transactions';
|
|
4
|
+
import { Transaction } from '@haneullabs/haneul/transactions';
|
|
5
|
+
import type { ZkBagContractOptions } from './zk-bag.js';
|
|
6
|
+
export interface ZkSendLinkBuilderOptions {
|
|
7
|
+
host?: string;
|
|
8
|
+
path?: string;
|
|
9
|
+
keypair?: Keypair;
|
|
10
|
+
network?: 'mainnet' | 'testnet';
|
|
11
|
+
client?: HaneulClient;
|
|
12
|
+
sender: string;
|
|
13
|
+
contract?: ZkBagContractOptions | null;
|
|
14
|
+
}
|
|
15
|
+
export interface CreateZkSendLinkOptions {
|
|
16
|
+
transaction?: Transaction;
|
|
17
|
+
calculateGas?: (options: {
|
|
18
|
+
balances: Map<string, bigint>;
|
|
19
|
+
objects: TransactionObjectInput[];
|
|
20
|
+
gasEstimateFromDryRun: bigint;
|
|
21
|
+
}) => Promise<bigint> | bigint;
|
|
22
|
+
}
|
|
23
|
+
export declare class ZkSendLinkBuilder {
|
|
24
|
+
#private;
|
|
25
|
+
objectIds: Set<string>;
|
|
26
|
+
objectRefs: {
|
|
27
|
+
ref: TransactionObjectArgument;
|
|
28
|
+
type: string;
|
|
29
|
+
}[];
|
|
30
|
+
balances: Map<string, bigint>;
|
|
31
|
+
sender: string;
|
|
32
|
+
network: 'mainnet' | 'testnet';
|
|
33
|
+
keypair: Keypair;
|
|
34
|
+
constructor({ host, path, keypair, network, client, sender, contract, }: ZkSendLinkBuilderOptions);
|
|
35
|
+
addClaimableGeunhwa(amount: bigint): void;
|
|
36
|
+
addClaimableBalance(coinType: string, amount: bigint): void;
|
|
37
|
+
addClaimableObject(id: string): void;
|
|
38
|
+
addClaimableObjectRef(ref: TransactionObjectArgument, type: string): void;
|
|
39
|
+
getLink(): string;
|
|
40
|
+
create({ signer, ...options }: CreateZkSendLinkOptions & {
|
|
41
|
+
signer: Signer;
|
|
42
|
+
waitForTransaction?: boolean;
|
|
43
|
+
}): Promise<import("@haneullabs/haneul/client").HaneulTransactionBlockResponse>;
|
|
44
|
+
createSendTransaction({ transaction, calculateGas, }?: CreateZkSendLinkOptions): Promise<Transaction>;
|
|
45
|
+
createSendToAddressTransaction({ transaction, address, }: CreateZkSendLinkOptions & {
|
|
46
|
+
address: string;
|
|
47
|
+
}): Promise<Transaction>;
|
|
48
|
+
static createLinks({ links, network, client, transaction, contract: contractIds, }: {
|
|
49
|
+
transaction?: Transaction;
|
|
50
|
+
client?: HaneulClient;
|
|
51
|
+
network?: 'mainnet' | 'testnet';
|
|
52
|
+
links: ZkSendLinkBuilder[];
|
|
53
|
+
contract?: ZkBagContractOptions;
|
|
54
|
+
}): Promise<Transaction>;
|
|
55
|
+
}
|
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
var __typeError = (msg) => {
|
|
2
|
+
throw TypeError(msg);
|
|
3
|
+
};
|
|
4
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
5
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
6
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
7
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
|
|
8
|
+
var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
9
|
+
var _host, _path, _client, _coinsByType, _contract, _ZkSendLinkBuilder_instances, objectsToTransfer_fn, createSendTransactionWithoutContract_fn, estimateClaimGasFee_fn, getCoinsByType_fn;
|
|
10
|
+
import { getFullnodeUrl, HaneulClient } from "@haneullabs/haneul/client";
|
|
11
|
+
import { decodeHaneulPrivateKey } from "@haneullabs/haneul/cryptography";
|
|
12
|
+
import { Ed25519Keypair } from "@haneullabs/haneul/keypairs/ed25519";
|
|
13
|
+
import { Transaction } from "@haneullabs/haneul/transactions";
|
|
14
|
+
import { normalizeStructTag, normalizeHaneulAddress, HANEUL_TYPE_ARG, toBase64 } from "@haneullabs/haneul/utils";
|
|
15
|
+
import { getContractIds, ZkBag } from "./zk-bag.js";
|
|
16
|
+
const DEFAULT_ZK_SEND_LINK_OPTIONS = {
|
|
17
|
+
host: "https://my.slush.app",
|
|
18
|
+
path: "/claim",
|
|
19
|
+
network: "mainnet"
|
|
20
|
+
};
|
|
21
|
+
const HANEUL_COIN_TYPE = normalizeStructTag(HANEUL_TYPE_ARG);
|
|
22
|
+
const _ZkSendLinkBuilder = class _ZkSendLinkBuilder {
|
|
23
|
+
constructor({
|
|
24
|
+
host = DEFAULT_ZK_SEND_LINK_OPTIONS.host,
|
|
25
|
+
path = DEFAULT_ZK_SEND_LINK_OPTIONS.path,
|
|
26
|
+
keypair = new Ed25519Keypair(),
|
|
27
|
+
network = DEFAULT_ZK_SEND_LINK_OPTIONS.network,
|
|
28
|
+
client = new HaneulClient({ url: getFullnodeUrl(network) }),
|
|
29
|
+
sender,
|
|
30
|
+
contract = getContractIds(network)
|
|
31
|
+
}) {
|
|
32
|
+
__privateAdd(this, _ZkSendLinkBuilder_instances);
|
|
33
|
+
this.objectIds = /* @__PURE__ */ new Set();
|
|
34
|
+
this.objectRefs = [];
|
|
35
|
+
this.balances = /* @__PURE__ */ new Map();
|
|
36
|
+
__privateAdd(this, _host);
|
|
37
|
+
__privateAdd(this, _path);
|
|
38
|
+
__privateAdd(this, _client);
|
|
39
|
+
__privateAdd(this, _coinsByType, /* @__PURE__ */ new Map());
|
|
40
|
+
__privateAdd(this, _contract);
|
|
41
|
+
__privateSet(this, _host, host);
|
|
42
|
+
__privateSet(this, _path, path);
|
|
43
|
+
this.keypair = keypair;
|
|
44
|
+
__privateSet(this, _client, client);
|
|
45
|
+
this.sender = normalizeHaneulAddress(sender);
|
|
46
|
+
this.network = network;
|
|
47
|
+
if (contract) {
|
|
48
|
+
__privateSet(this, _contract, new ZkBag(contract.packageId, contract));
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
addClaimableGeunhwa(amount) {
|
|
52
|
+
this.addClaimableBalance(HANEUL_COIN_TYPE, amount);
|
|
53
|
+
}
|
|
54
|
+
addClaimableBalance(coinType, amount) {
|
|
55
|
+
const normalizedType = normalizeStructTag(coinType);
|
|
56
|
+
this.balances.set(normalizedType, (this.balances.get(normalizedType) ?? 0n) + amount);
|
|
57
|
+
}
|
|
58
|
+
addClaimableObject(id) {
|
|
59
|
+
this.objectIds.add(id);
|
|
60
|
+
}
|
|
61
|
+
addClaimableObjectRef(ref, type) {
|
|
62
|
+
this.objectRefs.push({ ref, type });
|
|
63
|
+
}
|
|
64
|
+
getLink() {
|
|
65
|
+
const link = new URL(__privateGet(this, _host));
|
|
66
|
+
link.pathname = __privateGet(this, _path);
|
|
67
|
+
link.hash = `${__privateGet(this, _contract) ? "$" : ""}${toBase64(
|
|
68
|
+
decodeHaneulPrivateKey(this.keypair.getSecretKey()).secretKey
|
|
69
|
+
)}`;
|
|
70
|
+
if (this.network !== "mainnet") {
|
|
71
|
+
link.searchParams.set("network", this.network);
|
|
72
|
+
}
|
|
73
|
+
return link.toString();
|
|
74
|
+
}
|
|
75
|
+
async create({
|
|
76
|
+
signer,
|
|
77
|
+
...options
|
|
78
|
+
}) {
|
|
79
|
+
const tx = await this.createSendTransaction(options);
|
|
80
|
+
const result = await __privateGet(this, _client).signAndExecuteTransaction({
|
|
81
|
+
transaction: await tx.build({ client: __privateGet(this, _client) }),
|
|
82
|
+
signer,
|
|
83
|
+
options: {
|
|
84
|
+
showEffects: true
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
if (result.effects?.status.status !== "success") {
|
|
88
|
+
throw new Error(`Transaction failed: ${result.effects?.status.error ?? "Unknown error"}`);
|
|
89
|
+
}
|
|
90
|
+
if (options.waitForTransaction) {
|
|
91
|
+
await __privateGet(this, _client).waitForTransaction({ digest: result.digest });
|
|
92
|
+
}
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
async createSendTransaction({
|
|
96
|
+
transaction = new Transaction(),
|
|
97
|
+
calculateGas
|
|
98
|
+
} = {}) {
|
|
99
|
+
if (!__privateGet(this, _contract)) {
|
|
100
|
+
return __privateMethod(this, _ZkSendLinkBuilder_instances, createSendTransactionWithoutContract_fn).call(this, { transaction, calculateGas });
|
|
101
|
+
}
|
|
102
|
+
transaction.setSenderIfNotSet(this.sender);
|
|
103
|
+
return _ZkSendLinkBuilder.createLinks({
|
|
104
|
+
transaction,
|
|
105
|
+
network: this.network,
|
|
106
|
+
client: __privateGet(this, _client),
|
|
107
|
+
contract: __privateGet(this, _contract).ids,
|
|
108
|
+
links: [this]
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
async createSendToAddressTransaction({
|
|
112
|
+
transaction = new Transaction(),
|
|
113
|
+
address
|
|
114
|
+
}) {
|
|
115
|
+
const objectsToTransfer = (await __privateMethod(this, _ZkSendLinkBuilder_instances, objectsToTransfer_fn).call(this, transaction)).map((obj) => obj.ref);
|
|
116
|
+
transaction.setSenderIfNotSet(this.sender);
|
|
117
|
+
transaction.transferObjects(objectsToTransfer, address);
|
|
118
|
+
return transaction;
|
|
119
|
+
}
|
|
120
|
+
static async createLinks({
|
|
121
|
+
links,
|
|
122
|
+
network = "mainnet",
|
|
123
|
+
client = new HaneulClient({ url: getFullnodeUrl(network) }),
|
|
124
|
+
transaction = new Transaction(),
|
|
125
|
+
contract: contractIds = getContractIds(network)
|
|
126
|
+
}) {
|
|
127
|
+
const contract = new ZkBag(contractIds.packageId, contractIds);
|
|
128
|
+
const store = transaction.object(contract.ids.bagStoreId);
|
|
129
|
+
const coinsByType = /* @__PURE__ */ new Map();
|
|
130
|
+
const allIds = links.flatMap((link) => [...link.objectIds]);
|
|
131
|
+
const sender = links[0].sender;
|
|
132
|
+
transaction.setSenderIfNotSet(sender);
|
|
133
|
+
await Promise.all(
|
|
134
|
+
[...new Set(links.flatMap((link) => [...link.balances.keys()]))].map(async (coinType) => {
|
|
135
|
+
const coins = await client.getCoins({
|
|
136
|
+
coinType,
|
|
137
|
+
owner: sender
|
|
138
|
+
});
|
|
139
|
+
coinsByType.set(
|
|
140
|
+
coinType,
|
|
141
|
+
coins.data.filter((coin) => !allIds.includes(coin.coinObjectId))
|
|
142
|
+
);
|
|
143
|
+
})
|
|
144
|
+
);
|
|
145
|
+
const objectRefs = /* @__PURE__ */ new Map();
|
|
146
|
+
const pageSize = 50;
|
|
147
|
+
let offset = 0;
|
|
148
|
+
while (offset < allIds.length) {
|
|
149
|
+
const chunk = allIds.slice(offset, offset + pageSize);
|
|
150
|
+
offset += pageSize;
|
|
151
|
+
const objects = await client.multiGetObjects({
|
|
152
|
+
ids: chunk,
|
|
153
|
+
options: {
|
|
154
|
+
showType: true
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
for (const [i, res] of objects.entries()) {
|
|
158
|
+
if (!res.data || res.error) {
|
|
159
|
+
throw new Error(`Failed to load object ${chunk[i]} (${res.error?.code})`);
|
|
160
|
+
}
|
|
161
|
+
objectRefs.set(chunk[i], {
|
|
162
|
+
ref: transaction.objectRef({
|
|
163
|
+
version: res.data.version,
|
|
164
|
+
digest: res.data.digest,
|
|
165
|
+
objectId: res.data.objectId
|
|
166
|
+
}),
|
|
167
|
+
type: res.data.type
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const mergedCoins = /* @__PURE__ */ new Map([
|
|
172
|
+
[HANEUL_COIN_TYPE, transaction.gas]
|
|
173
|
+
]);
|
|
174
|
+
for (const [coinType, coins] of coinsByType) {
|
|
175
|
+
if (coinType === HANEUL_COIN_TYPE) {
|
|
176
|
+
continue;
|
|
177
|
+
}
|
|
178
|
+
const [first, ...rest] = coins.map(
|
|
179
|
+
(coin) => transaction.objectRef({
|
|
180
|
+
objectId: coin.coinObjectId,
|
|
181
|
+
version: coin.version,
|
|
182
|
+
digest: coin.digest
|
|
183
|
+
})
|
|
184
|
+
);
|
|
185
|
+
if (rest.length > 0) {
|
|
186
|
+
transaction.mergeCoins(first, rest);
|
|
187
|
+
}
|
|
188
|
+
mergedCoins.set(coinType, transaction.object(first));
|
|
189
|
+
}
|
|
190
|
+
for (const link of links) {
|
|
191
|
+
const receiver = link.keypair.toHaneulAddress();
|
|
192
|
+
transaction.add(contract.new({ arguments: [store, receiver] }));
|
|
193
|
+
link.objectRefs.forEach(({ ref, type }) => {
|
|
194
|
+
transaction.add(
|
|
195
|
+
contract.add({
|
|
196
|
+
arguments: [store, receiver, ref],
|
|
197
|
+
typeArguments: [type]
|
|
198
|
+
})
|
|
199
|
+
);
|
|
200
|
+
});
|
|
201
|
+
link.objectIds.forEach((id) => {
|
|
202
|
+
const object = objectRefs.get(id);
|
|
203
|
+
if (!object) {
|
|
204
|
+
throw new Error(`Object ${id} not found`);
|
|
205
|
+
}
|
|
206
|
+
transaction.add(
|
|
207
|
+
contract.add({
|
|
208
|
+
arguments: [store, receiver, object.ref],
|
|
209
|
+
typeArguments: [object.type]
|
|
210
|
+
})
|
|
211
|
+
);
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
for (const [coinType, merged] of mergedCoins) {
|
|
215
|
+
const linksWithCoin = links.filter((link) => link.balances.has(coinType));
|
|
216
|
+
if (linksWithCoin.length === 0) {
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
const balances = linksWithCoin.map((link) => link.balances.get(coinType));
|
|
220
|
+
const splits = transaction.splitCoins(merged, balances);
|
|
221
|
+
for (const [i, link] of linksWithCoin.entries()) {
|
|
222
|
+
transaction.add(
|
|
223
|
+
contract.add({
|
|
224
|
+
arguments: [store, link.keypair.toHaneulAddress(), splits[i]],
|
|
225
|
+
typeArguments: [`0x2::coin::Coin<${coinType}>`]
|
|
226
|
+
})
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return transaction;
|
|
231
|
+
}
|
|
232
|
+
};
|
|
233
|
+
_host = new WeakMap();
|
|
234
|
+
_path = new WeakMap();
|
|
235
|
+
_client = new WeakMap();
|
|
236
|
+
_coinsByType = new WeakMap();
|
|
237
|
+
_contract = new WeakMap();
|
|
238
|
+
_ZkSendLinkBuilder_instances = new WeakSet();
|
|
239
|
+
objectsToTransfer_fn = async function(tx) {
|
|
240
|
+
const objectIDs = [...this.objectIds];
|
|
241
|
+
const refsWithType = this.objectRefs.concat(
|
|
242
|
+
(objectIDs.length > 0 ? await __privateGet(this, _client).multiGetObjects({
|
|
243
|
+
ids: objectIDs,
|
|
244
|
+
options: {
|
|
245
|
+
showType: true
|
|
246
|
+
}
|
|
247
|
+
}) : []).map((res, i) => {
|
|
248
|
+
if (!res.data || res.error) {
|
|
249
|
+
throw new Error(`Failed to load object ${objectIDs[i]} (${res.error?.code})`);
|
|
250
|
+
}
|
|
251
|
+
return {
|
|
252
|
+
ref: tx.objectRef({
|
|
253
|
+
version: res.data.version,
|
|
254
|
+
digest: res.data.digest,
|
|
255
|
+
objectId: res.data.objectId
|
|
256
|
+
}),
|
|
257
|
+
type: res.data.type
|
|
258
|
+
};
|
|
259
|
+
})
|
|
260
|
+
);
|
|
261
|
+
for (const [coinType, amount] of this.balances) {
|
|
262
|
+
if (coinType === HANEUL_COIN_TYPE) {
|
|
263
|
+
const [sui] = tx.splitCoins(tx.gas, [amount]);
|
|
264
|
+
refsWithType.push({
|
|
265
|
+
ref: sui,
|
|
266
|
+
type: `0x2::coin::Coin<${coinType}>`
|
|
267
|
+
});
|
|
268
|
+
} else {
|
|
269
|
+
const coins = (await __privateMethod(this, _ZkSendLinkBuilder_instances, getCoinsByType_fn).call(this, coinType)).map((coin) => coin.coinObjectId);
|
|
270
|
+
if (coins.length > 1) {
|
|
271
|
+
tx.mergeCoins(coins[0], coins.slice(1));
|
|
272
|
+
}
|
|
273
|
+
const [split] = tx.splitCoins(coins[0], [amount]);
|
|
274
|
+
refsWithType.push({
|
|
275
|
+
ref: split,
|
|
276
|
+
type: `0x2::coin::Coin<${coinType}>`
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return refsWithType;
|
|
281
|
+
};
|
|
282
|
+
createSendTransactionWithoutContract_fn = async function({
|
|
283
|
+
transaction: tx = new Transaction(),
|
|
284
|
+
calculateGas
|
|
285
|
+
} = {}) {
|
|
286
|
+
const gasEstimateFromDryRun = await __privateMethod(this, _ZkSendLinkBuilder_instances, estimateClaimGasFee_fn).call(this);
|
|
287
|
+
const baseGasAmount = calculateGas ? await calculateGas({
|
|
288
|
+
balances: this.balances,
|
|
289
|
+
objects: [...this.objectIds],
|
|
290
|
+
gasEstimateFromDryRun
|
|
291
|
+
}) : gasEstimateFromDryRun * 2n;
|
|
292
|
+
const gasWithBuffer = baseGasAmount + 1013n;
|
|
293
|
+
const roundedGasAmount = gasWithBuffer - gasWithBuffer % 1000n - 13n;
|
|
294
|
+
const address = this.keypair.toHaneulAddress();
|
|
295
|
+
const objectsToTransfer = (await __privateMethod(this, _ZkSendLinkBuilder_instances, objectsToTransfer_fn).call(this, tx)).map((obj) => obj.ref);
|
|
296
|
+
const [gas] = tx.splitCoins(tx.gas, [roundedGasAmount]);
|
|
297
|
+
objectsToTransfer.push(gas);
|
|
298
|
+
tx.setSenderIfNotSet(this.sender);
|
|
299
|
+
tx.transferObjects(objectsToTransfer, address);
|
|
300
|
+
return tx;
|
|
301
|
+
};
|
|
302
|
+
estimateClaimGasFee_fn = async function() {
|
|
303
|
+
const tx = new Transaction();
|
|
304
|
+
tx.setSender(this.sender);
|
|
305
|
+
tx.setGasPayment([]);
|
|
306
|
+
tx.transferObjects([tx.gas], this.keypair.toHaneulAddress());
|
|
307
|
+
const idsToTransfer = [...this.objectIds];
|
|
308
|
+
for (const [coinType] of this.balances) {
|
|
309
|
+
const coins = await __privateMethod(this, _ZkSendLinkBuilder_instances, getCoinsByType_fn).call(this, coinType);
|
|
310
|
+
if (!coins.length) {
|
|
311
|
+
throw new Error(`Sending account does not contain any coins of type ${coinType}`);
|
|
312
|
+
}
|
|
313
|
+
idsToTransfer.push(coins[0].coinObjectId);
|
|
314
|
+
}
|
|
315
|
+
if (idsToTransfer.length > 0) {
|
|
316
|
+
tx.transferObjects(
|
|
317
|
+
idsToTransfer.map((id) => tx.object(id)),
|
|
318
|
+
this.keypair.toHaneulAddress()
|
|
319
|
+
);
|
|
320
|
+
}
|
|
321
|
+
const result = await __privateGet(this, _client).dryRunTransactionBlock({
|
|
322
|
+
transactionBlock: await tx.build({ client: __privateGet(this, _client) })
|
|
323
|
+
});
|
|
324
|
+
return BigInt(result.effects.gasUsed.computationCost) + BigInt(result.effects.gasUsed.storageCost) - BigInt(result.effects.gasUsed.storageRebate);
|
|
325
|
+
};
|
|
326
|
+
getCoinsByType_fn = async function(coinType) {
|
|
327
|
+
if (__privateGet(this, _coinsByType).has(coinType)) {
|
|
328
|
+
return __privateGet(this, _coinsByType).get(coinType);
|
|
329
|
+
}
|
|
330
|
+
const coins = await __privateGet(this, _client).getCoins({
|
|
331
|
+
coinType,
|
|
332
|
+
owner: this.sender
|
|
333
|
+
});
|
|
334
|
+
__privateGet(this, _coinsByType).set(coinType, coins.data);
|
|
335
|
+
return coins.data;
|
|
336
|
+
};
|
|
337
|
+
let ZkSendLinkBuilder = _ZkSendLinkBuilder;
|
|
338
|
+
export {
|
|
339
|
+
ZkSendLinkBuilder
|
|
340
|
+
};
|
|
341
|
+
//# sourceMappingURL=builder.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/links/builder.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { getFullnodeUrl, HaneulClient } from '@haneullabs/haneul/client';\nimport type { CoinStruct } from '@haneullabs/haneul/client';\nimport { decodeHaneulPrivateKey } from '@haneullabs/haneul/cryptography';\nimport type { Keypair, Signer } from '@haneullabs/haneul/cryptography';\nimport { Ed25519Keypair } from '@haneullabs/haneul/keypairs/ed25519';\nimport type { TransactionObjectArgument, TransactionObjectInput } from '@haneullabs/haneul/transactions';\nimport { Transaction } from '@haneullabs/haneul/transactions';\nimport { normalizeStructTag, normalizeHaneulAddress, HANEUL_TYPE_ARG, toBase64 } from '@haneullabs/haneul/utils';\n\nimport type { ZkBagContractOptions } from './zk-bag.js';\nimport { getContractIds, ZkBag } from './zk-bag.js';\n\nexport interface ZkSendLinkBuilderOptions {\n\thost?: string;\n\tpath?: string;\n\tkeypair?: Keypair;\n\tnetwork?: 'mainnet' | 'testnet';\n\tclient?: HaneulClient;\n\tsender: string;\n\tcontract?: ZkBagContractOptions | null;\n}\n\nconst DEFAULT_ZK_SEND_LINK_OPTIONS = {\n\thost: 'https://my.slush.app',\n\tpath: '/claim',\n\tnetwork: 'mainnet' as const,\n};\n\nconst HANEUL_COIN_TYPE = normalizeStructTag(HANEUL_TYPE_ARG);\n\nexport interface CreateZkSendLinkOptions {\n\ttransaction?: Transaction;\n\tcalculateGas?: (options: {\n\t\tbalances: Map<string, bigint>;\n\t\tobjects: TransactionObjectInput[];\n\t\tgasEstimateFromDryRun: bigint;\n\t}) => Promise<bigint> | bigint;\n}\n\nexport class ZkSendLinkBuilder {\n\tobjectIds = new Set<string>();\n\tobjectRefs: {\n\t\tref: TransactionObjectArgument;\n\t\ttype: string;\n\t}[] = [];\n\tbalances = new Map<string, bigint>();\n\tsender: string;\n\tnetwork: 'mainnet' | 'testnet';\n\t#host: string;\n\t#path: string;\n\tkeypair: Keypair;\n\t#client: HaneulClient;\n\t#coinsByType = new Map<string, CoinStruct[]>();\n\t#contract?: ZkBag<ZkBagContractOptions>;\n\n\tconstructor({\n\t\thost = DEFAULT_ZK_SEND_LINK_OPTIONS.host,\n\t\tpath = DEFAULT_ZK_SEND_LINK_OPTIONS.path,\n\t\tkeypair = new Ed25519Keypair(),\n\t\tnetwork = DEFAULT_ZK_SEND_LINK_OPTIONS.network,\n\t\tclient = new HaneulClient({ url: getFullnodeUrl(network) }),\n\t\tsender,\n\t\tcontract = getContractIds(network),\n\t}: ZkSendLinkBuilderOptions) {\n\t\tthis.#host = host;\n\t\tthis.#path = path;\n\t\tthis.keypair = keypair;\n\t\tthis.#client = client;\n\t\tthis.sender = normalizeHaneulAddress(sender);\n\t\tthis.network = network;\n\n\t\tif (contract) {\n\t\t\tthis.#contract = new ZkBag(contract.packageId, contract);\n\t\t}\n\t}\n\n\taddClaimableGeunhwa(amount: bigint) {\n\t\tthis.addClaimableBalance(HANEUL_COIN_TYPE, amount);\n\t}\n\n\taddClaimableBalance(coinType: string, amount: bigint) {\n\t\tconst normalizedType = normalizeStructTag(coinType);\n\t\tthis.balances.set(normalizedType, (this.balances.get(normalizedType) ?? 0n) + amount);\n\t}\n\n\taddClaimableObject(id: string) {\n\t\tthis.objectIds.add(id);\n\t}\n\n\taddClaimableObjectRef(ref: TransactionObjectArgument, type: string) {\n\t\tthis.objectRefs.push({ ref, type });\n\t}\n\n\tgetLink(): string {\n\t\tconst link = new URL(this.#host);\n\t\tlink.pathname = this.#path;\n\t\tlink.hash = `${this.#contract ? '$' : ''}${toBase64(\n\t\t\tdecodeHaneulPrivateKey(this.keypair.getSecretKey()).secretKey,\n\t\t)}`;\n\n\t\tif (this.network !== 'mainnet') {\n\t\t\tlink.searchParams.set('network', this.network);\n\t\t}\n\n\t\treturn link.toString();\n\t}\n\n\tasync create({\n\t\tsigner,\n\t\t...options\n\t}: CreateZkSendLinkOptions & {\n\t\tsigner: Signer;\n\t\twaitForTransaction?: boolean;\n\t}) {\n\t\tconst tx = await this.createSendTransaction(options);\n\n\t\tconst result = await this.#client.signAndExecuteTransaction({\n\t\t\ttransaction: await tx.build({ client: this.#client }),\n\t\t\tsigner,\n\t\t\toptions: {\n\t\t\t\tshowEffects: true,\n\t\t\t},\n\t\t});\n\n\t\tif (result.effects?.status.status !== 'success') {\n\t\t\tthrow new Error(`Transaction failed: ${result.effects?.status.error ?? 'Unknown error'}`);\n\t\t}\n\n\t\tif (options.waitForTransaction) {\n\t\t\tawait this.#client.waitForTransaction({ digest: result.digest });\n\t\t}\n\n\t\treturn result;\n\t}\n\tasync createSendTransaction({\n\t\ttransaction = new Transaction(),\n\t\tcalculateGas,\n\t}: CreateZkSendLinkOptions = {}) {\n\t\tif (!this.#contract) {\n\t\t\treturn this.#createSendTransactionWithoutContract({ transaction, calculateGas });\n\t\t}\n\n\t\ttransaction.setSenderIfNotSet(this.sender);\n\n\t\treturn ZkSendLinkBuilder.createLinks({\n\t\t\ttransaction,\n\t\t\tnetwork: this.network,\n\t\t\tclient: this.#client,\n\t\t\tcontract: this.#contract.ids,\n\t\t\tlinks: [this],\n\t\t});\n\t}\n\n\tasync createSendToAddressTransaction({\n\t\ttransaction = new Transaction(),\n\t\taddress,\n\t}: CreateZkSendLinkOptions & {\n\t\taddress: string;\n\t}) {\n\t\tconst objectsToTransfer = (await this.#objectsToTransfer(transaction)).map((obj) => obj.ref);\n\n\t\ttransaction.setSenderIfNotSet(this.sender);\n\t\ttransaction.transferObjects(objectsToTransfer, address);\n\n\t\treturn transaction;\n\t}\n\n\tasync #objectsToTransfer(tx: Transaction) {\n\t\tconst objectIDs = [...this.objectIds];\n\t\tconst refsWithType = this.objectRefs.concat(\n\t\t\t(objectIDs.length > 0\n\t\t\t\t? await this.#client.multiGetObjects({\n\t\t\t\t\t\tids: objectIDs,\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tshowType: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t: []\n\t\t\t).map((res, i) => {\n\t\t\t\tif (!res.data || res.error) {\n\t\t\t\t\tthrow new Error(`Failed to load object ${objectIDs[i]} (${res.error?.code})`);\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tref: tx.objectRef({\n\t\t\t\t\t\tversion: res.data.version,\n\t\t\t\t\t\tdigest: res.data.digest,\n\t\t\t\t\t\tobjectId: res.data.objectId,\n\t\t\t\t\t}),\n\t\t\t\t\ttype: res.data.type!,\n\t\t\t\t};\n\t\t\t}),\n\t\t);\n\n\t\tfor (const [coinType, amount] of this.balances) {\n\t\t\tif (coinType === HANEUL_COIN_TYPE) {\n\t\t\t\tconst [sui] = tx.splitCoins(tx.gas, [amount]);\n\t\t\t\trefsWithType.push({\n\t\t\t\t\tref: sui,\n\t\t\t\t\ttype: `0x2::coin::Coin<${coinType}>`,\n\t\t\t\t} as never);\n\t\t\t} else {\n\t\t\t\tconst coins = (await this.#getCoinsByType(coinType)).map((coin) => coin.coinObjectId);\n\n\t\t\t\tif (coins.length > 1) {\n\t\t\t\t\ttx.mergeCoins(coins[0], coins.slice(1));\n\t\t\t\t}\n\t\t\t\tconst [split] = tx.splitCoins(coins[0], [amount]);\n\t\t\t\trefsWithType.push({\n\t\t\t\t\tref: split,\n\t\t\t\t\ttype: `0x2::coin::Coin<${coinType}>`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn refsWithType;\n\t}\n\n\tasync #createSendTransactionWithoutContract({\n\t\ttransaction: tx = new Transaction(),\n\t\tcalculateGas,\n\t}: CreateZkSendLinkOptions = {}) {\n\t\tconst gasEstimateFromDryRun = await this.#estimateClaimGasFee();\n\t\tconst baseGasAmount = calculateGas\n\t\t\t? await calculateGas({\n\t\t\t\t\tbalances: this.balances,\n\t\t\t\t\tobjects: [...this.objectIds],\n\t\t\t\t\tgasEstimateFromDryRun,\n\t\t\t\t})\n\t\t\t: gasEstimateFromDryRun * 2n;\n\n\t\t// Ensure that rounded gas is not less than the calculated gas\n\t\tconst gasWithBuffer = baseGasAmount + 1013n;\n\t\t// Ensure that gas amount ends in 987\n\t\tconst roundedGasAmount = gasWithBuffer - (gasWithBuffer % 1000n) - 13n;\n\n\t\tconst address = this.keypair.toHaneulAddress();\n\t\tconst objectsToTransfer = (await this.#objectsToTransfer(tx)).map((obj) => obj.ref);\n\t\tconst [gas] = tx.splitCoins(tx.gas, [roundedGasAmount]);\n\t\tobjectsToTransfer.push(gas);\n\n\t\ttx.setSenderIfNotSet(this.sender);\n\t\ttx.transferObjects(objectsToTransfer, address);\n\n\t\treturn tx;\n\t}\n\n\tasync #estimateClaimGasFee(): Promise<bigint> {\n\t\tconst tx = new Transaction();\n\t\ttx.setSender(this.sender);\n\t\ttx.setGasPayment([]);\n\t\ttx.transferObjects([tx.gas], this.keypair.toHaneulAddress());\n\n\t\tconst idsToTransfer = [...this.objectIds];\n\n\t\tfor (const [coinType] of this.balances) {\n\t\t\tconst coins = await this.#getCoinsByType(coinType);\n\n\t\t\tif (!coins.length) {\n\t\t\t\tthrow new Error(`Sending account does not contain any coins of type ${coinType}`);\n\t\t\t}\n\n\t\t\tidsToTransfer.push(coins[0].coinObjectId);\n\t\t}\n\n\t\tif (idsToTransfer.length > 0) {\n\t\t\ttx.transferObjects(\n\t\t\t\tidsToTransfer.map((id) => tx.object(id)),\n\t\t\t\tthis.keypair.toHaneulAddress(),\n\t\t\t);\n\t\t}\n\n\t\tconst result = await this.#client.dryRunTransactionBlock({\n\t\t\ttransactionBlock: await tx.build({ client: this.#client }),\n\t\t});\n\n\t\treturn (\n\t\t\tBigInt(result.effects.gasUsed.computationCost) +\n\t\t\tBigInt(result.effects.gasUsed.storageCost) -\n\t\t\tBigInt(result.effects.gasUsed.storageRebate)\n\t\t);\n\t}\n\n\tasync #getCoinsByType(coinType: string) {\n\t\tif (this.#coinsByType.has(coinType)) {\n\t\t\treturn this.#coinsByType.get(coinType)!;\n\t\t}\n\n\t\tconst coins = await this.#client.getCoins({\n\t\t\tcoinType,\n\t\t\towner: this.sender,\n\t\t});\n\n\t\tthis.#coinsByType.set(coinType, coins.data);\n\n\t\treturn coins.data;\n\t}\n\n\tstatic async createLinks({\n\t\tlinks,\n\t\tnetwork = 'mainnet',\n\t\tclient = new HaneulClient({ url: getFullnodeUrl(network) }),\n\t\ttransaction = new Transaction(),\n\t\tcontract: contractIds = getContractIds(network),\n\t}: {\n\t\ttransaction?: Transaction;\n\t\tclient?: HaneulClient;\n\t\tnetwork?: 'mainnet' | 'testnet';\n\t\tlinks: ZkSendLinkBuilder[];\n\t\tcontract?: ZkBagContractOptions;\n\t}) {\n\t\tconst contract = new ZkBag(contractIds.packageId, contractIds);\n\t\tconst store = transaction.object(contract.ids.bagStoreId);\n\n\t\tconst coinsByType = new Map<string, CoinStruct[]>();\n\t\tconst allIds = links.flatMap((link) => [...link.objectIds]);\n\t\tconst sender = links[0].sender;\n\t\ttransaction.setSenderIfNotSet(sender);\n\n\t\tawait Promise.all(\n\t\t\t[...new Set(links.flatMap((link) => [...link.balances.keys()]))].map(async (coinType) => {\n\t\t\t\tconst coins = await client.getCoins({\n\t\t\t\t\tcoinType,\n\t\t\t\t\towner: sender,\n\t\t\t\t});\n\n\t\t\t\tcoinsByType.set(\n\t\t\t\t\tcoinType,\n\t\t\t\t\tcoins.data.filter((coin) => !allIds.includes(coin.coinObjectId)),\n\t\t\t\t);\n\t\t\t}),\n\t\t);\n\n\t\tconst objectRefs = new Map<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tref: TransactionObjectArgument;\n\t\t\t\ttype: string;\n\t\t\t}\n\t\t>();\n\n\t\tconst pageSize = 50;\n\t\tlet offset = 0;\n\t\twhile (offset < allIds.length) {\n\t\t\tconst chunk = allIds.slice(offset, offset + pageSize);\n\t\t\toffset += pageSize;\n\n\t\t\tconst objects = await client.multiGetObjects({\n\t\t\t\tids: chunk,\n\t\t\t\toptions: {\n\t\t\t\t\tshowType: true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tfor (const [i, res] of objects.entries()) {\n\t\t\t\tif (!res.data || res.error) {\n\t\t\t\t\tthrow new Error(`Failed to load object ${chunk[i]} (${res.error?.code})`);\n\t\t\t\t}\n\t\t\t\tobjectRefs.set(chunk[i], {\n\t\t\t\t\tref: transaction.objectRef({\n\t\t\t\t\t\tversion: res.data.version,\n\t\t\t\t\t\tdigest: res.data.digest,\n\t\t\t\t\t\tobjectId: res.data.objectId,\n\t\t\t\t\t}),\n\t\t\t\t\ttype: res.data.type!,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst mergedCoins = new Map<string, TransactionObjectArgument>([\n\t\t\t[HANEUL_COIN_TYPE, transaction.gas],\n\t\t]);\n\n\t\tfor (const [coinType, coins] of coinsByType) {\n\t\t\tif (coinType === HANEUL_COIN_TYPE) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst [first, ...rest] = coins.map((coin) =>\n\t\t\t\ttransaction.objectRef({\n\t\t\t\t\tobjectId: coin.coinObjectId,\n\t\t\t\t\tversion: coin.version,\n\t\t\t\t\tdigest: coin.digest,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tif (rest.length > 0) {\n\t\t\t\ttransaction.mergeCoins(first, rest);\n\t\t\t}\n\t\t\tmergedCoins.set(coinType, transaction.object(first));\n\t\t}\n\n\t\tfor (const link of links) {\n\t\t\tconst receiver = link.keypair.toHaneulAddress();\n\t\t\ttransaction.add(contract.new({ arguments: [store, receiver] }));\n\n\t\t\tlink.objectRefs.forEach(({ ref, type }) => {\n\t\t\t\ttransaction.add(\n\t\t\t\t\tcontract.add({\n\t\t\t\t\t\targuments: [store, receiver, ref],\n\t\t\t\t\t\ttypeArguments: [type],\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\tlink.objectIds.forEach((id) => {\n\t\t\t\tconst object = objectRefs.get(id);\n\t\t\t\tif (!object) {\n\t\t\t\t\tthrow new Error(`Object ${id} not found`);\n\t\t\t\t}\n\t\t\t\ttransaction.add(\n\t\t\t\t\tcontract.add({\n\t\t\t\t\t\targuments: [store, receiver, object.ref],\n\t\t\t\t\t\ttypeArguments: [object.type],\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\t\tfor (const [coinType, merged] of mergedCoins) {\n\t\t\tconst linksWithCoin = links.filter((link) => link.balances.has(coinType));\n\t\t\tif (linksWithCoin.length === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst balances = linksWithCoin.map((link) => link.balances.get(coinType)!);\n\t\t\tconst splits = transaction.splitCoins(merged, balances);\n\t\t\tfor (const [i, link] of linksWithCoin.entries()) {\n\t\t\t\ttransaction.add(\n\t\t\t\t\tcontract.add({\n\t\t\t\t\t\targuments: [store, link.keypair.toHaneulAddress(), splits[i]],\n\t\t\t\t\t\ttypeArguments: [`0x2::coin::Coin<${coinType}>`],\n\t\t\t\t\t}),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn transaction;\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|