@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,573 @@
|
|
|
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 __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
|
|
27
|
+
var claim_exports = {};
|
|
28
|
+
__export(claim_exports, {
|
|
29
|
+
ZkSendLink: () => ZkSendLink
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(claim_exports);
|
|
32
|
+
var import_bcs = require("@haneullabs/haneul/bcs");
|
|
33
|
+
var import_client = require("@haneullabs/haneul/client");
|
|
34
|
+
var import_ed25519 = require("@haneullabs/haneul/keypairs/ed25519");
|
|
35
|
+
var import_transactions = require("@haneullabs/haneul/transactions");
|
|
36
|
+
var import_utils = require("@haneullabs/haneul/utils");
|
|
37
|
+
var import_builder = require("./builder.js");
|
|
38
|
+
var import_utils2 = require("./utils.js");
|
|
39
|
+
var import_zk_bag = require("./zk-bag.js");
|
|
40
|
+
var _client, _contract, _network, _host, _path, _claimApi, _gasCoin, _hasSui, _ownedObjects, _ZkSendLink_instances, loadBagObject_fn, loadBag_fn, loadClaimedAssets_fn, createSponsoredTransaction_fn, executeSponsoredTransaction_fn, fetch_fn, listNonContractClaimableAssets_fn, createNonContractClaimTransaction_fn, loadOwnedObjects_fn;
|
|
41
|
+
const DEFAULT_ZK_SEND_LINK_OPTIONS = {
|
|
42
|
+
host: "https://api.slush.app",
|
|
43
|
+
path: "/claim",
|
|
44
|
+
network: "mainnet"
|
|
45
|
+
};
|
|
46
|
+
const HANEUL_COIN_TYPE = (0, import_utils.normalizeStructTag)(import_utils.HANEUL_TYPE_ARG);
|
|
47
|
+
const HANEUL_COIN_OBJECT_TYPE = (0, import_utils.normalizeStructTag)("0x2::coin::Coin<0x2::haneul::HANEUL>");
|
|
48
|
+
const _ZkSendLink = class _ZkSendLink {
|
|
49
|
+
constructor({
|
|
50
|
+
network = DEFAULT_ZK_SEND_LINK_OPTIONS.network,
|
|
51
|
+
client = new import_client.HaneulClient({ url: (0, import_client.getFullnodeUrl)(network) }),
|
|
52
|
+
keypair,
|
|
53
|
+
contract = (0, import_zk_bag.getContractIds)(network),
|
|
54
|
+
address,
|
|
55
|
+
host = DEFAULT_ZK_SEND_LINK_OPTIONS.host,
|
|
56
|
+
path = DEFAULT_ZK_SEND_LINK_OPTIONS.path,
|
|
57
|
+
claimApi = `${host}/api`,
|
|
58
|
+
isContractLink
|
|
59
|
+
}) {
|
|
60
|
+
__privateAdd(this, _ZkSendLink_instances);
|
|
61
|
+
__privateAdd(this, _client);
|
|
62
|
+
__privateAdd(this, _contract);
|
|
63
|
+
__privateAdd(this, _network);
|
|
64
|
+
__privateAdd(this, _host);
|
|
65
|
+
__privateAdd(this, _path);
|
|
66
|
+
__privateAdd(this, _claimApi);
|
|
67
|
+
// State for non-contract based links
|
|
68
|
+
__privateAdd(this, _gasCoin);
|
|
69
|
+
__privateAdd(this, _hasSui, false);
|
|
70
|
+
__privateAdd(this, _ownedObjects, []);
|
|
71
|
+
if (!keypair && !address) {
|
|
72
|
+
throw new Error("Either keypair or address must be provided");
|
|
73
|
+
}
|
|
74
|
+
__privateSet(this, _client, client);
|
|
75
|
+
this.keypair = keypair;
|
|
76
|
+
this.address = address ?? keypair.toHaneulAddress();
|
|
77
|
+
__privateSet(this, _claimApi, claimApi);
|
|
78
|
+
__privateSet(this, _network, network);
|
|
79
|
+
__privateSet(this, _host, host);
|
|
80
|
+
__privateSet(this, _path, path);
|
|
81
|
+
if (isContractLink) {
|
|
82
|
+
if (!contract) {
|
|
83
|
+
throw new Error("Contract options are required for contract based links");
|
|
84
|
+
}
|
|
85
|
+
__privateSet(this, _contract, new import_zk_bag.ZkBag(contract.packageId, contract));
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
static async fromUrl(url, options = {}) {
|
|
89
|
+
const parsed = new URL(url);
|
|
90
|
+
const isContractLink = parsed.hash.startsWith("#$");
|
|
91
|
+
const parsedNetwork = parsed.searchParams.get("network") === "testnet" ? "testnet" : "mainnet";
|
|
92
|
+
const network = options.network ?? parsedNetwork;
|
|
93
|
+
let link;
|
|
94
|
+
if (isContractLink) {
|
|
95
|
+
const keypair = import_ed25519.Ed25519Keypair.fromSecretKey((0, import_utils.fromBase64)(parsed.hash.slice(2)));
|
|
96
|
+
link = new _ZkSendLink({
|
|
97
|
+
...options,
|
|
98
|
+
keypair,
|
|
99
|
+
network,
|
|
100
|
+
host: `${parsed.protocol}//${parsed.host}`,
|
|
101
|
+
path: parsed.pathname,
|
|
102
|
+
isContractLink: true
|
|
103
|
+
});
|
|
104
|
+
} else {
|
|
105
|
+
const keypair = import_ed25519.Ed25519Keypair.fromSecretKey(
|
|
106
|
+
(0, import_utils.fromBase64)(isContractLink ? parsed.hash.slice(2) : parsed.hash.slice(1))
|
|
107
|
+
);
|
|
108
|
+
link = new _ZkSendLink({
|
|
109
|
+
...options,
|
|
110
|
+
keypair,
|
|
111
|
+
network,
|
|
112
|
+
host: `${parsed.protocol}//${parsed.host}`,
|
|
113
|
+
path: parsed.pathname,
|
|
114
|
+
isContractLink: false
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
await link.loadAssets();
|
|
118
|
+
return link;
|
|
119
|
+
}
|
|
120
|
+
static async fromAddress(address, options) {
|
|
121
|
+
const link = new _ZkSendLink({
|
|
122
|
+
...options,
|
|
123
|
+
address,
|
|
124
|
+
isContractLink: true
|
|
125
|
+
});
|
|
126
|
+
await link.loadAssets();
|
|
127
|
+
return link;
|
|
128
|
+
}
|
|
129
|
+
async loadClaimedStatus() {
|
|
130
|
+
await __privateMethod(this, _ZkSendLink_instances, loadBag_fn).call(this, { loadAssets: false });
|
|
131
|
+
}
|
|
132
|
+
async loadAssets(options = {}) {
|
|
133
|
+
if (__privateGet(this, _contract)) {
|
|
134
|
+
await __privateMethod(this, _ZkSendLink_instances, loadBag_fn).call(this, options);
|
|
135
|
+
} else {
|
|
136
|
+
await __privateMethod(this, _ZkSendLink_instances, loadOwnedObjects_fn).call(this, options);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
async claimAssets(address, {
|
|
140
|
+
reclaim,
|
|
141
|
+
sign
|
|
142
|
+
} = {}) {
|
|
143
|
+
if (!this.keypair && !sign) {
|
|
144
|
+
throw new Error("Cannot claim assets without links keypair");
|
|
145
|
+
}
|
|
146
|
+
if (this.claimed) {
|
|
147
|
+
throw new Error("Assets have already been claimed");
|
|
148
|
+
}
|
|
149
|
+
if (!this.assets) {
|
|
150
|
+
throw new Error(
|
|
151
|
+
"Link assets could not be loaded. Link has not been indexed or has already been claimed"
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
if (!__privateGet(this, _contract)) {
|
|
155
|
+
const bytes2 = await this.createClaimTransaction(address).build({
|
|
156
|
+
client: __privateGet(this, _client)
|
|
157
|
+
});
|
|
158
|
+
const signature2 = sign ? await sign(bytes2) : (await this.keypair.signTransaction(bytes2)).signature;
|
|
159
|
+
return __privateGet(this, _client).executeTransactionBlock({
|
|
160
|
+
transactionBlock: bytes2,
|
|
161
|
+
signature: signature2
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
if (!this.assets) {
|
|
165
|
+
await __privateMethod(this, _ZkSendLink_instances, loadBag_fn).call(this);
|
|
166
|
+
}
|
|
167
|
+
const tx = this.createClaimTransaction(address, { reclaim });
|
|
168
|
+
const sponsored = await __privateMethod(this, _ZkSendLink_instances, createSponsoredTransaction_fn).call(this, tx, address, reclaim ? address : this.keypair.toHaneulAddress());
|
|
169
|
+
const bytes = (0, import_utils.fromBase64)(sponsored.bytes);
|
|
170
|
+
const signature = sign ? await sign(bytes) : (await this.keypair.signTransaction(bytes)).signature;
|
|
171
|
+
const { digest } = await __privateMethod(this, _ZkSendLink_instances, executeSponsoredTransaction_fn).call(this, sponsored, signature);
|
|
172
|
+
const result = await __privateGet(this, _client).waitForTransaction({
|
|
173
|
+
digest,
|
|
174
|
+
options: { showEffects: true }
|
|
175
|
+
});
|
|
176
|
+
if (result.effects?.status.status !== "success") {
|
|
177
|
+
throw new Error(
|
|
178
|
+
`Claim transaction failed: ${result.effects?.status.error ?? "Unknown error"}`
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
return result;
|
|
182
|
+
}
|
|
183
|
+
createClaimTransaction(address, {
|
|
184
|
+
reclaim
|
|
185
|
+
} = {}) {
|
|
186
|
+
if (!__privateGet(this, _contract)) {
|
|
187
|
+
return __privateMethod(this, _ZkSendLink_instances, createNonContractClaimTransaction_fn).call(this, address);
|
|
188
|
+
}
|
|
189
|
+
if (!this.keypair && !reclaim) {
|
|
190
|
+
throw new Error("Cannot claim assets without the links keypair");
|
|
191
|
+
}
|
|
192
|
+
const tx = new import_transactions.Transaction();
|
|
193
|
+
const sender = reclaim ? address : this.keypair.toHaneulAddress();
|
|
194
|
+
tx.setSender(sender);
|
|
195
|
+
const store = tx.object(__privateGet(this, _contract).ids.bagStoreId);
|
|
196
|
+
const command = reclaim ? __privateGet(this, _contract).reclaim({ arguments: [store, this.address] }) : __privateGet(this, _contract).init_claim({ arguments: [store] });
|
|
197
|
+
const [bag, proof] = tx.add(command);
|
|
198
|
+
const objectsToTransfer = [];
|
|
199
|
+
const objects = [...this.assets?.coins ?? [], ...this.assets?.nfts ?? []];
|
|
200
|
+
for (const object of objects) {
|
|
201
|
+
objectsToTransfer.push(
|
|
202
|
+
__privateGet(this, _contract).claim({
|
|
203
|
+
arguments: [
|
|
204
|
+
bag,
|
|
205
|
+
proof,
|
|
206
|
+
tx.receivingRef({
|
|
207
|
+
objectId: object.objectId,
|
|
208
|
+
version: object.version,
|
|
209
|
+
digest: object.digest
|
|
210
|
+
})
|
|
211
|
+
],
|
|
212
|
+
typeArguments: [object.type]
|
|
213
|
+
})
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
if (objectsToTransfer.length > 0) {
|
|
217
|
+
tx.transferObjects(objectsToTransfer, address);
|
|
218
|
+
}
|
|
219
|
+
tx.add(__privateGet(this, _contract).finalize({ arguments: [bag, proof] }));
|
|
220
|
+
return tx;
|
|
221
|
+
}
|
|
222
|
+
async createRegenerateTransaction(sender, options = {}) {
|
|
223
|
+
if (!this.assets) {
|
|
224
|
+
await __privateMethod(this, _ZkSendLink_instances, loadBag_fn).call(this);
|
|
225
|
+
}
|
|
226
|
+
if (this.claimed) {
|
|
227
|
+
throw new Error("Assets have already been claimed");
|
|
228
|
+
}
|
|
229
|
+
if (!__privateGet(this, _contract)) {
|
|
230
|
+
throw new Error("Regenerating non-contract based links is not supported");
|
|
231
|
+
}
|
|
232
|
+
const tx = new import_transactions.Transaction();
|
|
233
|
+
tx.setSender(sender);
|
|
234
|
+
const store = tx.object(__privateGet(this, _contract).ids.bagStoreId);
|
|
235
|
+
const newLinkKp = import_ed25519.Ed25519Keypair.generate();
|
|
236
|
+
const newLink = new import_builder.ZkSendLinkBuilder({
|
|
237
|
+
...options,
|
|
238
|
+
sender,
|
|
239
|
+
client: __privateGet(this, _client),
|
|
240
|
+
contract: __privateGet(this, _contract).ids,
|
|
241
|
+
host: __privateGet(this, _host),
|
|
242
|
+
path: __privateGet(this, _path),
|
|
243
|
+
keypair: newLinkKp
|
|
244
|
+
});
|
|
245
|
+
const to = tx.pure.address(newLinkKp.toHaneulAddress());
|
|
246
|
+
tx.add(__privateGet(this, _contract).update_receiver({ arguments: [store, this.address, to] }));
|
|
247
|
+
return {
|
|
248
|
+
url: newLink.getLink(),
|
|
249
|
+
transaction: tx
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
_client = new WeakMap();
|
|
254
|
+
_contract = new WeakMap();
|
|
255
|
+
_network = new WeakMap();
|
|
256
|
+
_host = new WeakMap();
|
|
257
|
+
_path = new WeakMap();
|
|
258
|
+
_claimApi = new WeakMap();
|
|
259
|
+
_gasCoin = new WeakMap();
|
|
260
|
+
_hasSui = new WeakMap();
|
|
261
|
+
_ownedObjects = new WeakMap();
|
|
262
|
+
_ZkSendLink_instances = new WeakSet();
|
|
263
|
+
loadBagObject_fn = async function() {
|
|
264
|
+
if (!__privateGet(this, _contract)) {
|
|
265
|
+
throw new Error("Cannot load bag object for non-contract based links");
|
|
266
|
+
}
|
|
267
|
+
const bagField = await __privateGet(this, _client).getDynamicFieldObject({
|
|
268
|
+
parentId: __privateGet(this, _contract).ids.bagStoreTableId,
|
|
269
|
+
name: {
|
|
270
|
+
type: "address",
|
|
271
|
+
value: this.address
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
this.bagObject = bagField.data;
|
|
275
|
+
if (this.bagObject) {
|
|
276
|
+
this.claimed = false;
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
loadBag_fn = async function({
|
|
280
|
+
transaction,
|
|
281
|
+
loadAssets = true,
|
|
282
|
+
loadClaimedAssets = loadAssets
|
|
283
|
+
} = {}) {
|
|
284
|
+
if (!__privateGet(this, _contract)) {
|
|
285
|
+
return;
|
|
286
|
+
}
|
|
287
|
+
if (!this.bagObject || !this.claimed) {
|
|
288
|
+
await __privateMethod(this, _ZkSendLink_instances, loadBagObject_fn).call(this);
|
|
289
|
+
}
|
|
290
|
+
if (!loadAssets) {
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
if (!this.bagObject) {
|
|
294
|
+
if (loadClaimedAssets) {
|
|
295
|
+
await __privateMethod(this, _ZkSendLink_instances, loadClaimedAssets_fn).call(this);
|
|
296
|
+
}
|
|
297
|
+
return;
|
|
298
|
+
}
|
|
299
|
+
const bagId = this.bagObject.content.fields.value.fields?.id?.id;
|
|
300
|
+
if (bagId && transaction?.balanceChanges && transaction.objectChanges) {
|
|
301
|
+
this.assets = (0, import_utils2.getAssetsFromTransaction)({
|
|
302
|
+
transaction,
|
|
303
|
+
address: bagId,
|
|
304
|
+
isSent: false
|
|
305
|
+
});
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
const itemIds = this.bagObject?.content?.fields?.value?.fields?.item_ids.fields.contents;
|
|
309
|
+
this.creatorAddress = this.bagObject?.content?.fields?.value?.fields?.owner;
|
|
310
|
+
if (!itemIds) {
|
|
311
|
+
throw new Error("Invalid bag field");
|
|
312
|
+
}
|
|
313
|
+
const objectsResponse = await __privateGet(this, _client).multiGetObjects({
|
|
314
|
+
ids: itemIds,
|
|
315
|
+
options: {
|
|
316
|
+
showType: true,
|
|
317
|
+
showContent: true
|
|
318
|
+
}
|
|
319
|
+
});
|
|
320
|
+
this.assets = {
|
|
321
|
+
balances: [],
|
|
322
|
+
nfts: [],
|
|
323
|
+
coins: []
|
|
324
|
+
};
|
|
325
|
+
const balances = /* @__PURE__ */ new Map();
|
|
326
|
+
objectsResponse.forEach((object, i) => {
|
|
327
|
+
if (!object.data || !object.data.type) {
|
|
328
|
+
throw new Error(`Failed to load claimable object ${itemIds[i]}`);
|
|
329
|
+
}
|
|
330
|
+
const type = (0, import_utils.parseStructTag)((0, import_utils.normalizeStructTag)(object.data.type));
|
|
331
|
+
if (type.address === (0, import_utils.normalizeHaneulAddress)("0x2") && type.module === "coin" && type.name === "Coin") {
|
|
332
|
+
this.assets.coins.push({
|
|
333
|
+
objectId: object.data.objectId,
|
|
334
|
+
type: object.data.type,
|
|
335
|
+
version: object.data.version,
|
|
336
|
+
digest: object.data.digest
|
|
337
|
+
});
|
|
338
|
+
if (object.data.content?.dataType === "moveObject") {
|
|
339
|
+
const amount = BigInt(object.data.content.fields.balance);
|
|
340
|
+
const coinType = (0, import_utils.normalizeStructTag)(
|
|
341
|
+
(0, import_utils.parseStructTag)(object.data.content.type).typeParams[0]
|
|
342
|
+
);
|
|
343
|
+
if (!balances.has(coinType)) {
|
|
344
|
+
balances.set(coinType, { coinType, amount });
|
|
345
|
+
} else {
|
|
346
|
+
balances.get(coinType).amount += amount;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
} else {
|
|
350
|
+
this.assets.nfts.push({
|
|
351
|
+
objectId: object.data.objectId,
|
|
352
|
+
type: object.data.type,
|
|
353
|
+
version: object.data.version,
|
|
354
|
+
digest: object.data.digest
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
});
|
|
358
|
+
this.assets.balances = [...balances.values()];
|
|
359
|
+
};
|
|
360
|
+
loadClaimedAssets_fn = async function() {
|
|
361
|
+
const result = await __privateGet(this, _client).queryTransactionBlocks({
|
|
362
|
+
limit: 1,
|
|
363
|
+
filter: {
|
|
364
|
+
FromAddress: this.address
|
|
365
|
+
},
|
|
366
|
+
options: {
|
|
367
|
+
showObjectChanges: true,
|
|
368
|
+
showBalanceChanges: true,
|
|
369
|
+
showInput: true
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
if (!result?.data[0]) {
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
const [tx] = result.data;
|
|
376
|
+
if (tx.transaction?.data.transaction.kind !== "ProgrammableTransaction") {
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
const transfer = tx.transaction.data.transaction.transactions.findLast(
|
|
380
|
+
(tx2) => "TransferObjects" in tx2
|
|
381
|
+
);
|
|
382
|
+
if (!transfer) {
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
const receiverArg = transfer.TransferObjects[1];
|
|
386
|
+
if (!(typeof receiverArg === "object" && "Input" in receiverArg)) {
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
const input = tx.transaction.data.transaction.inputs[receiverArg.Input];
|
|
390
|
+
if (input.type !== "pure") {
|
|
391
|
+
return;
|
|
392
|
+
}
|
|
393
|
+
const receiver = typeof input.value === "string" ? input.value : import_bcs.bcs.Address.parse(new Uint8Array(input.value.Pure));
|
|
394
|
+
this.claimed = true;
|
|
395
|
+
this.claimedBy = receiver;
|
|
396
|
+
this.assets = (0, import_utils2.getAssetsFromTransaction)({
|
|
397
|
+
transaction: tx,
|
|
398
|
+
address: receiver,
|
|
399
|
+
isSent: false
|
|
400
|
+
});
|
|
401
|
+
};
|
|
402
|
+
createSponsoredTransaction_fn = async function(tx, claimer, sender) {
|
|
403
|
+
return __privateMethod(this, _ZkSendLink_instances, fetch_fn).call(this, "transaction-blocks/sponsor", {
|
|
404
|
+
method: "POST",
|
|
405
|
+
body: JSON.stringify({
|
|
406
|
+
network: __privateGet(this, _network),
|
|
407
|
+
sender,
|
|
408
|
+
claimer,
|
|
409
|
+
transactionBlockKindBytes: (0, import_utils.toBase64)(
|
|
410
|
+
await tx.build({
|
|
411
|
+
onlyTransactionKind: true,
|
|
412
|
+
client: __privateGet(this, _client)
|
|
413
|
+
})
|
|
414
|
+
)
|
|
415
|
+
})
|
|
416
|
+
});
|
|
417
|
+
};
|
|
418
|
+
executeSponsoredTransaction_fn = async function(input, signature) {
|
|
419
|
+
return __privateMethod(this, _ZkSendLink_instances, fetch_fn).call(this, `transaction-blocks/sponsor/${input.digest}`, {
|
|
420
|
+
method: "POST",
|
|
421
|
+
body: JSON.stringify({
|
|
422
|
+
signature
|
|
423
|
+
})
|
|
424
|
+
});
|
|
425
|
+
};
|
|
426
|
+
fetch_fn = async function(path, init) {
|
|
427
|
+
const res = await fetch(`${__privateGet(this, _claimApi)}/v1/${path}`, {
|
|
428
|
+
...init,
|
|
429
|
+
headers: {
|
|
430
|
+
...init.headers,
|
|
431
|
+
"Content-Type": "application/json"
|
|
432
|
+
}
|
|
433
|
+
});
|
|
434
|
+
if (!res.ok) {
|
|
435
|
+
console.error(`${__privateGet(this, _claimApi)}/v1/${path}`, await res.text());
|
|
436
|
+
throw new Error(`Request to claim API failed with status code ${res.status}`);
|
|
437
|
+
}
|
|
438
|
+
const { data } = await res.json();
|
|
439
|
+
return data;
|
|
440
|
+
};
|
|
441
|
+
listNonContractClaimableAssets_fn = async function() {
|
|
442
|
+
const balances = [];
|
|
443
|
+
const nfts = [];
|
|
444
|
+
const coins = [];
|
|
445
|
+
if (__privateGet(this, _ownedObjects).length === 0 && !__privateGet(this, _hasSui)) {
|
|
446
|
+
return {
|
|
447
|
+
balances,
|
|
448
|
+
nfts,
|
|
449
|
+
coins
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
const address = new import_ed25519.Ed25519Keypair().toHaneulAddress();
|
|
453
|
+
const normalizedAddress = (0, import_utils.normalizeHaneulAddress)(address);
|
|
454
|
+
const tx = this.createClaimTransaction(normalizedAddress);
|
|
455
|
+
if (__privateGet(this, _gasCoin) || !__privateGet(this, _hasSui)) {
|
|
456
|
+
tx.setGasPayment([]);
|
|
457
|
+
}
|
|
458
|
+
const dryRun = await __privateGet(this, _client).dryRunTransactionBlock({
|
|
459
|
+
transactionBlock: await tx.build({ client: __privateGet(this, _client) })
|
|
460
|
+
});
|
|
461
|
+
dryRun.balanceChanges.forEach((balanceChange) => {
|
|
462
|
+
if (BigInt(balanceChange.amount) > 0n && (0, import_utils2.isOwner)(balanceChange.owner, normalizedAddress)) {
|
|
463
|
+
balances.push({
|
|
464
|
+
coinType: (0, import_utils.normalizeStructTag)(balanceChange.coinType),
|
|
465
|
+
amount: BigInt(balanceChange.amount)
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
dryRun.objectChanges.forEach((objectChange) => {
|
|
470
|
+
if ("objectType" in objectChange) {
|
|
471
|
+
const type = (0, import_utils.parseStructTag)(objectChange.objectType);
|
|
472
|
+
if (type.address === (0, import_utils.normalizeHaneulAddress)("0x2") && type.module === "coin" && type.name === "Coin") {
|
|
473
|
+
if ((0, import_utils2.ownedAfterChange)(objectChange, normalizedAddress)) {
|
|
474
|
+
coins.push(objectChange);
|
|
475
|
+
}
|
|
476
|
+
return;
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
if ((0, import_utils2.ownedAfterChange)(objectChange, normalizedAddress)) {
|
|
480
|
+
nfts.push(objectChange);
|
|
481
|
+
}
|
|
482
|
+
});
|
|
483
|
+
return {
|
|
484
|
+
balances,
|
|
485
|
+
nfts,
|
|
486
|
+
coins
|
|
487
|
+
};
|
|
488
|
+
};
|
|
489
|
+
createNonContractClaimTransaction_fn = function(address) {
|
|
490
|
+
if (!this.keypair) {
|
|
491
|
+
throw new Error("Cannot claim assets without the links keypair");
|
|
492
|
+
}
|
|
493
|
+
const tx = new import_transactions.Transaction();
|
|
494
|
+
tx.setSender(this.keypair.toHaneulAddress());
|
|
495
|
+
const objectsToTransfer = __privateGet(this, _ownedObjects).filter((object) => {
|
|
496
|
+
if (__privateGet(this, _gasCoin)) {
|
|
497
|
+
if (object.objectId === __privateGet(this, _gasCoin).coinObjectId) {
|
|
498
|
+
return false;
|
|
499
|
+
}
|
|
500
|
+
} else if (object.type === HANEUL_COIN_OBJECT_TYPE) {
|
|
501
|
+
return false;
|
|
502
|
+
}
|
|
503
|
+
return true;
|
|
504
|
+
}).map((object) => tx.object(object.objectId));
|
|
505
|
+
if (__privateGet(this, _gasCoin) && this.creatorAddress) {
|
|
506
|
+
tx.transferObjects([tx.gas], this.creatorAddress);
|
|
507
|
+
} else {
|
|
508
|
+
objectsToTransfer.push(tx.gas);
|
|
509
|
+
}
|
|
510
|
+
if (objectsToTransfer.length > 0) {
|
|
511
|
+
tx.transferObjects(objectsToTransfer, address);
|
|
512
|
+
}
|
|
513
|
+
return tx;
|
|
514
|
+
};
|
|
515
|
+
loadOwnedObjects_fn = async function({
|
|
516
|
+
loadClaimedAssets = true
|
|
517
|
+
} = {}) {
|
|
518
|
+
this.assets = {
|
|
519
|
+
nfts: [],
|
|
520
|
+
balances: [],
|
|
521
|
+
coins: []
|
|
522
|
+
};
|
|
523
|
+
let nextCursor;
|
|
524
|
+
do {
|
|
525
|
+
const ownedObjects = await __privateGet(this, _client).getOwnedObjects({
|
|
526
|
+
cursor: nextCursor,
|
|
527
|
+
owner: this.address,
|
|
528
|
+
options: {
|
|
529
|
+
showType: true,
|
|
530
|
+
showContent: true
|
|
531
|
+
}
|
|
532
|
+
});
|
|
533
|
+
nextCursor = ownedObjects.hasNextPage ? ownedObjects.nextCursor : null;
|
|
534
|
+
for (const object of ownedObjects.data) {
|
|
535
|
+
if (object.data) {
|
|
536
|
+
__privateGet(this, _ownedObjects).push({
|
|
537
|
+
objectId: (0, import_utils.normalizeHaneulObjectId)(object.data.objectId),
|
|
538
|
+
version: object.data.version,
|
|
539
|
+
digest: object.data.digest,
|
|
540
|
+
type: (0, import_utils.normalizeStructTag)(object.data.type)
|
|
541
|
+
});
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
} while (nextCursor);
|
|
545
|
+
const coins = await __privateGet(this, _client).getCoins({
|
|
546
|
+
coinType: HANEUL_COIN_TYPE,
|
|
547
|
+
owner: this.address
|
|
548
|
+
});
|
|
549
|
+
__privateSet(this, _hasSui, coins.data.length > 0);
|
|
550
|
+
__privateSet(this, _gasCoin, coins.data.find((coin) => BigInt(coin.balance) % 1000n === 987n));
|
|
551
|
+
const result = await __privateGet(this, _client).queryTransactionBlocks({
|
|
552
|
+
limit: 1,
|
|
553
|
+
order: "ascending",
|
|
554
|
+
filter: {
|
|
555
|
+
ToAddress: this.address
|
|
556
|
+
},
|
|
557
|
+
options: {
|
|
558
|
+
showInput: true,
|
|
559
|
+
showBalanceChanges: true,
|
|
560
|
+
showObjectChanges: true
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
this.creatorAddress = result.data[0]?.transaction?.data.sender;
|
|
564
|
+
if (__privateGet(this, _hasSui) || __privateGet(this, _ownedObjects).length > 0) {
|
|
565
|
+
this.claimed = false;
|
|
566
|
+
this.assets = await __privateMethod(this, _ZkSendLink_instances, listNonContractClaimableAssets_fn).call(this);
|
|
567
|
+
} else if (result.data[0] && loadClaimedAssets) {
|
|
568
|
+
this.claimed = true;
|
|
569
|
+
await __privateMethod(this, _ZkSendLink_instances, loadClaimedAssets_fn).call(this);
|
|
570
|
+
}
|
|
571
|
+
};
|
|
572
|
+
let ZkSendLink = _ZkSendLink;
|
|
573
|
+
//# sourceMappingURL=claim.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/links/claim.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@haneullabs/haneul/bcs';\nimport { getFullnodeUrl, HaneulClient } from '@haneullabs/haneul/client';\nimport type {\n\tCoinStruct,\n\tHaneulObjectData,\n\tHaneulTransaction,\n\tHaneulTransactionBlockResponse,\n} from '@haneullabs/haneul/client';\nimport type { Keypair } from '@haneullabs/haneul/cryptography';\nimport { Ed25519Keypair } from '@haneullabs/haneul/keypairs/ed25519';\nimport type { TransactionObjectArgument } from '@haneullabs/haneul/transactions';\nimport { Transaction } from '@haneullabs/haneul/transactions';\nimport {\n\tfromBase64,\n\tnormalizeStructTag,\n\tnormalizeHaneulAddress,\n\tnormalizeHaneulObjectId,\n\tparseStructTag,\n\tHANEUL_TYPE_ARG,\n\ttoBase64,\n} from '@haneullabs/haneul/utils';\n\nimport type { ZkSendLinkBuilderOptions } from './builder.js';\nimport { ZkSendLinkBuilder } from './builder.js';\nimport type { LinkAssets } from './utils.js';\nimport { getAssetsFromTransaction, isOwner, ownedAfterChange } from './utils.js';\nimport type { ZkBagContractOptions } from './zk-bag.js';\nimport { getContractIds, ZkBag } from './zk-bag.js';\n\nconst DEFAULT_ZK_SEND_LINK_OPTIONS = {\n\thost: 'https://api.slush.app',\n\tpath: '/claim',\n\tnetwork: 'mainnet' as const,\n};\n\nconst HANEUL_COIN_TYPE = normalizeStructTag(HANEUL_TYPE_ARG);\nconst HANEUL_COIN_OBJECT_TYPE = normalizeStructTag('0x2::coin::Coin<0x2::haneul::HANEUL>');\n\nexport type ZkSendLinkOptions = {\n\tclaimApi?: string;\n\tkeypair?: Keypair;\n\tclient?: HaneulClient;\n\tnetwork?: 'mainnet' | 'testnet';\n\thost?: string;\n\tpath?: string;\n\taddress?: string;\n\tisContractLink: boolean;\n\tcontract?: ZkBagContractOptions | null;\n} & (\n\t| {\n\t\t\taddress: string;\n\t\t\tkeypair?: never;\n\t }\n\t| {\n\t\t\tkeypair: Keypair;\n\t\t\taddress?: never;\n\t }\n);\n\nexport class ZkSendLink {\n\taddress: string;\n\tkeypair?: Keypair;\n\tcreatorAddress?: string;\n\tassets?: LinkAssets;\n\tclaimed?: boolean;\n\tclaimedBy?: string;\n\tbagObject?: HaneulObjectData | null;\n\n\t#client: HaneulClient;\n\t#contract?: ZkBag<ZkBagContractOptions>;\n\t#network: 'mainnet' | 'testnet';\n\t#host: string;\n\t#path: string;\n\t#claimApi: string;\n\n\t// State for non-contract based links\n\t#gasCoin?: CoinStruct;\n\t#hasSui = false;\n\t#ownedObjects: {\n\t\tobjectId: string;\n\t\tversion: string;\n\t\tdigest: string;\n\t\ttype: string;\n\t}[] = [];\n\n\tconstructor({\n\t\tnetwork = DEFAULT_ZK_SEND_LINK_OPTIONS.network,\n\t\tclient = new HaneulClient({ url: getFullnodeUrl(network) }),\n\t\tkeypair,\n\t\tcontract = getContractIds(network),\n\t\taddress,\n\t\thost = DEFAULT_ZK_SEND_LINK_OPTIONS.host,\n\t\tpath = DEFAULT_ZK_SEND_LINK_OPTIONS.path,\n\t\tclaimApi = `${host}/api`,\n\t\tisContractLink,\n\t}: ZkSendLinkOptions) {\n\t\tif (!keypair && !address) {\n\t\t\tthrow new Error('Either keypair or address must be provided');\n\t\t}\n\n\t\tthis.#client = client;\n\t\tthis.keypair = keypair;\n\t\tthis.address = address ?? keypair!.toHaneulAddress();\n\t\tthis.#claimApi = claimApi;\n\t\tthis.#network = network;\n\t\tthis.#host = host;\n\t\tthis.#path = path;\n\n\t\tif (isContractLink) {\n\t\t\tif (!contract) {\n\t\t\t\tthrow new Error('Contract options are required for contract based links');\n\t\t\t}\n\n\t\t\tthis.#contract = new ZkBag(contract.packageId, contract);\n\t\t}\n\t}\n\n\tstatic async fromUrl(\n\t\turl: string,\n\t\toptions: Omit<ZkSendLinkOptions, 'keypair' | 'address' | 'isContractLink'> = {},\n\t) {\n\t\tconst parsed = new URL(url);\n\t\tconst isContractLink = parsed.hash.startsWith('#$');\n\t\tconst parsedNetwork = parsed.searchParams.get('network') === 'testnet' ? 'testnet' : 'mainnet';\n\t\tconst network = options.network ?? parsedNetwork;\n\n\t\tlet link: ZkSendLink;\n\t\tif (isContractLink) {\n\t\t\tconst keypair = Ed25519Keypair.fromSecretKey(fromBase64(parsed.hash.slice(2)));\n\t\t\tlink = new ZkSendLink({\n\t\t\t\t...options,\n\t\t\t\tkeypair,\n\t\t\t\tnetwork,\n\t\t\t\thost: `${parsed.protocol}//${parsed.host}`,\n\t\t\t\tpath: parsed.pathname,\n\t\t\t\tisContractLink: true,\n\t\t\t});\n\t\t} else {\n\t\t\tconst keypair = Ed25519Keypair.fromSecretKey(\n\t\t\t\tfromBase64(isContractLink ? parsed.hash.slice(2) : parsed.hash.slice(1)),\n\t\t\t);\n\t\t\tlink = new ZkSendLink({\n\t\t\t\t...options,\n\t\t\t\tkeypair,\n\t\t\t\tnetwork,\n\t\t\t\thost: `${parsed.protocol}//${parsed.host}`,\n\t\t\t\tpath: parsed.pathname,\n\t\t\t\tisContractLink: false,\n\t\t\t});\n\t\t}\n\n\t\tawait link.loadAssets();\n\n\t\treturn link;\n\t}\n\n\tstatic async fromAddress(\n\t\taddress: string,\n\t\toptions: Omit<ZkSendLinkOptions, 'keypair' | 'address' | 'isContractLink'>,\n\t) {\n\t\tconst link = new ZkSendLink({\n\t\t\t...options,\n\t\t\taddress,\n\t\t\tisContractLink: true,\n\t\t});\n\n\t\tawait link.loadAssets();\n\n\t\treturn link;\n\t}\n\n\tasync loadClaimedStatus() {\n\t\tawait this.#loadBag({ loadAssets: false });\n\t}\n\n\tasync loadAssets(\n\t\toptions: {\n\t\t\ttransaction?: HaneulTransactionBlockResponse;\n\t\t\tloadAssets?: boolean;\n\t\t\tloadClaimedAssets?: boolean;\n\t\t} = {},\n\t) {\n\t\tif (this.#contract) {\n\t\t\tawait this.#loadBag(options);\n\t\t} else {\n\t\t\tawait this.#loadOwnedObjects(options);\n\t\t}\n\t}\n\n\tasync claimAssets(\n\t\taddress: string,\n\t\t{\n\t\t\treclaim,\n\t\t\tsign,\n\t\t}:\n\t\t\t| { reclaim?: false; sign?: never }\n\t\t\t| {\n\t\t\t\t\treclaim: true;\n\t\t\t\t\tsign: (transaction: Uint8Array) => Promise<string>;\n\t\t\t } = {},\n\t) {\n\t\tif (!this.keypair && !sign) {\n\t\t\tthrow new Error('Cannot claim assets without links keypair');\n\t\t}\n\n\t\tif (this.claimed) {\n\t\t\tthrow new Error('Assets have already been claimed');\n\t\t}\n\n\t\tif (!this.assets) {\n\t\t\tthrow new Error(\n\t\t\t\t'Link assets could not be loaded. Link has not been indexed or has already been claimed',\n\t\t\t);\n\t\t}\n\n\t\tif (!this.#contract) {\n\t\t\tconst bytes = await this.createClaimTransaction(address).build({\n\t\t\t\tclient: this.#client,\n\t\t\t});\n\t\t\tconst signature = sign\n\t\t\t\t? await sign(bytes)\n\t\t\t\t: (await this.keypair!.signTransaction(bytes)).signature;\n\n\t\t\treturn this.#client.executeTransactionBlock({\n\t\t\t\ttransactionBlock: bytes,\n\t\t\t\tsignature,\n\t\t\t});\n\t\t}\n\n\t\tif (!this.assets) {\n\t\t\tawait this.#loadBag();\n\t\t}\n\n\t\tconst tx = this.createClaimTransaction(address, { reclaim });\n\n\t\tconst sponsored = await this.#createSponsoredTransaction(\n\t\t\ttx,\n\t\t\taddress,\n\t\t\treclaim ? address : this.keypair!.toHaneulAddress(),\n\t\t);\n\n\t\tconst bytes = fromBase64(sponsored.bytes);\n\t\tconst signature = sign\n\t\t\t? await sign(bytes)\n\t\t\t: (await this.keypair!.signTransaction(bytes)).signature;\n\n\t\tconst { digest } = await this.#executeSponsoredTransaction(sponsored, signature);\n\n\t\tconst result = await this.#client.waitForTransaction({\n\t\t\tdigest,\n\t\t\toptions: { showEffects: true },\n\t\t});\n\n\t\tif (result.effects?.status.status !== 'success') {\n\t\t\tthrow new Error(\n\t\t\t\t`Claim transaction failed: ${result.effects?.status.error ?? 'Unknown error'}`,\n\t\t\t);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tcreateClaimTransaction(\n\t\taddress: string,\n\t\t{\n\t\t\treclaim,\n\t\t}: {\n\t\t\treclaim?: boolean;\n\t\t} = {},\n\t) {\n\t\tif (!this.#contract) {\n\t\t\treturn this.#createNonContractClaimTransaction(address);\n\t\t}\n\n\t\tif (!this.keypair && !reclaim) {\n\t\t\tthrow new Error('Cannot claim assets without the links keypair');\n\t\t}\n\n\t\tconst tx = new Transaction();\n\t\tconst sender = reclaim ? address : this.keypair!.toHaneulAddress();\n\t\ttx.setSender(sender);\n\n\t\tconst store = tx.object(this.#contract.ids.bagStoreId);\n\t\tconst command = reclaim\n\t\t\t? this.#contract.reclaim({ arguments: [store, this.address] })\n\t\t\t: this.#contract.init_claim({ arguments: [store] });\n\n\t\tconst [bag, proof] = tx.add(command);\n\n\t\tconst objectsToTransfer: TransactionObjectArgument[] = [];\n\n\t\tconst objects = [...(this.assets?.coins ?? []), ...(this.assets?.nfts ?? [])];\n\n\t\tfor (const object of objects) {\n\t\t\tobjectsToTransfer.push(\n\t\t\t\tthis.#contract.claim({\n\t\t\t\t\targuments: [\n\t\t\t\t\t\tbag,\n\t\t\t\t\t\tproof,\n\t\t\t\t\t\ttx.receivingRef({\n\t\t\t\t\t\t\tobjectId: object.objectId,\n\t\t\t\t\t\t\tversion: object.version,\n\t\t\t\t\t\t\tdigest: object.digest,\n\t\t\t\t\t\t}),\n\t\t\t\t\t],\n\t\t\t\t\ttypeArguments: [object.type],\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (objectsToTransfer.length > 0) {\n\t\t\ttx.transferObjects(objectsToTransfer, address);\n\t\t}\n\n\t\ttx.add(this.#contract.finalize({ arguments: [bag, proof] }));\n\n\t\treturn tx;\n\t}\n\n\tasync createRegenerateTransaction(\n\t\tsender: string,\n\t\toptions: Omit<ZkSendLinkBuilderOptions, 'sender'> = {},\n\t) {\n\t\tif (!this.assets) {\n\t\t\tawait this.#loadBag();\n\t\t}\n\n\t\tif (this.claimed) {\n\t\t\tthrow new Error('Assets have already been claimed');\n\t\t}\n\n\t\tif (!this.#contract) {\n\t\t\tthrow new Error('Regenerating non-contract based links is not supported');\n\t\t}\n\n\t\tconst tx = new Transaction();\n\t\ttx.setSender(sender);\n\n\t\tconst store = tx.object(this.#contract.ids.bagStoreId);\n\n\t\tconst newLinkKp = Ed25519Keypair.generate();\n\n\t\tconst newLink = new ZkSendLinkBuilder({\n\t\t\t...options,\n\t\t\tsender,\n\t\t\tclient: this.#client,\n\t\t\tcontract: this.#contract.ids,\n\t\t\thost: this.#host,\n\t\t\tpath: this.#path,\n\t\t\tkeypair: newLinkKp,\n\t\t});\n\n\t\tconst to = tx.pure.address(newLinkKp.toHaneulAddress());\n\n\t\ttx.add(this.#contract.update_receiver({ arguments: [store, this.address, to] }));\n\n\t\treturn {\n\t\t\turl: newLink.getLink(),\n\t\t\ttransaction: tx,\n\t\t};\n\t}\n\n\tasync #loadBagObject() {\n\t\tif (!this.#contract) {\n\t\t\tthrow new Error('Cannot load bag object for non-contract based links');\n\t\t}\n\t\tconst bagField = await this.#client.getDynamicFieldObject({\n\t\t\tparentId: this.#contract.ids.bagStoreTableId,\n\t\t\tname: {\n\t\t\t\ttype: 'address',\n\t\t\t\tvalue: this.address,\n\t\t\t},\n\t\t});\n\n\t\tthis.bagObject = bagField.data;\n\n\t\tif (this.bagObject) {\n\t\t\tthis.claimed = false;\n\t\t}\n\t}\n\n\tasync #loadBag({\n\t\ttransaction,\n\t\tloadAssets = true,\n\t\tloadClaimedAssets = loadAssets,\n\t}: {\n\t\ttransaction?: HaneulTransactionBlockResponse;\n\t\tloadAssets?: boolean;\n\t\tloadClaimedAssets?: boolean;\n\t} = {}) {\n\t\tif (!this.#contract) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.bagObject || !this.claimed) {\n\t\t\tawait this.#loadBagObject();\n\t\t}\n\n\t\tif (!loadAssets) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this.bagObject) {\n\t\t\tif (loadClaimedAssets) {\n\t\t\t\tawait this.#loadClaimedAssets();\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\tconst bagId = (this.bagObject as any).content.fields.value.fields?.id?.id;\n\n\t\tif (bagId && transaction?.balanceChanges && transaction.objectChanges) {\n\t\t\tthis.assets = getAssetsFromTransaction({\n\t\t\t\ttransaction,\n\t\t\t\taddress: bagId,\n\t\t\t\tisSent: false,\n\t\t\t});\n\n\t\t\treturn;\n\t\t}\n\n\t\tconst itemIds: string[] | undefined = (this.bagObject as any)?.content?.fields?.value?.fields\n\t\t\t?.item_ids.fields.contents;\n\n\t\tthis.creatorAddress = (this.bagObject as any)?.content?.fields?.value?.fields?.owner;\n\n\t\tif (!itemIds) {\n\t\t\tthrow new Error('Invalid bag field');\n\t\t}\n\n\t\tconst objectsResponse = await this.#client.multiGetObjects({\n\t\t\tids: itemIds,\n\t\t\toptions: {\n\t\t\t\tshowType: true,\n\t\t\t\tshowContent: true,\n\t\t\t},\n\t\t});\n\n\t\tthis.assets = {\n\t\t\tbalances: [],\n\t\t\tnfts: [],\n\t\t\tcoins: [],\n\t\t};\n\n\t\tconst balances = new Map<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tcoinType: string;\n\t\t\t\tamount: bigint;\n\t\t\t}\n\t\t>();\n\n\t\tobjectsResponse.forEach((object, i) => {\n\t\t\tif (!object.data || !object.data.type) {\n\t\t\t\tthrow new Error(`Failed to load claimable object ${itemIds[i]}`);\n\t\t\t}\n\n\t\t\tconst type = parseStructTag(normalizeStructTag(object.data.type));\n\n\t\t\tif (\n\t\t\t\ttype.address === normalizeHaneulAddress('0x2') &&\n\t\t\t\ttype.module === 'coin' &&\n\t\t\t\ttype.name === 'Coin'\n\t\t\t) {\n\t\t\t\tthis.assets!.coins.push({\n\t\t\t\t\tobjectId: object.data.objectId,\n\t\t\t\t\ttype: object.data.type,\n\t\t\t\t\tversion: object.data.version,\n\t\t\t\t\tdigest: object.data.digest,\n\t\t\t\t});\n\n\t\t\t\tif (object.data.content?.dataType === 'moveObject') {\n\t\t\t\t\tconst amount = BigInt((object.data.content.fields as Record<string, string>).balance);\n\t\t\t\t\tconst coinType = normalizeStructTag(\n\t\t\t\t\t\tparseStructTag(object.data.content.type).typeParams[0],\n\t\t\t\t\t);\n\t\t\t\t\tif (!balances.has(coinType)) {\n\t\t\t\t\t\tbalances.set(coinType, { coinType, amount });\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbalances.get(coinType)!.amount += amount;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.assets!.nfts.push({\n\t\t\t\t\tobjectId: object.data.objectId,\n\t\t\t\t\ttype: object.data.type,\n\t\t\t\t\tversion: object.data.version,\n\t\t\t\t\tdigest: object.data.digest,\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tthis.assets.balances = [...balances.values()];\n\t}\n\n\tasync #loadClaimedAssets() {\n\t\tconst result = await this.#client.queryTransactionBlocks({\n\t\t\tlimit: 1,\n\t\t\tfilter: {\n\t\t\t\tFromAddress: this.address,\n\t\t\t},\n\t\t\toptions: {\n\t\t\t\tshowObjectChanges: true,\n\t\t\t\tshowBalanceChanges: true,\n\t\t\t\tshowInput: true,\n\t\t\t},\n\t\t});\n\n\t\tif (!result?.data[0]) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst [tx] = result.data;\n\n\t\tif (tx.transaction?.data.transaction.kind !== 'ProgrammableTransaction') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst transfer = tx.transaction.data.transaction.transactions.findLast(\n\t\t\t(tx): tx is Extract<HaneulTransaction, { TransferObjects: unknown }> => 'TransferObjects' in tx,\n\t\t);\n\n\t\tif (!transfer) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst receiverArg = transfer.TransferObjects[1];\n\n\t\tif (!(typeof receiverArg === 'object' && 'Input' in receiverArg)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst input = tx.transaction.data.transaction.inputs[receiverArg.Input];\n\n\t\tif (input.type !== 'pure') {\n\t\t\treturn;\n\t\t}\n\n\t\tconst receiver =\n\t\t\ttypeof input.value === 'string'\n\t\t\t\t? input.value\n\t\t\t\t: bcs.Address.parse(new Uint8Array((input.value as { Pure: number[] }).Pure));\n\n\t\tthis.claimed = true;\n\t\tthis.claimedBy = receiver;\n\t\tthis.assets = getAssetsFromTransaction({\n\t\t\ttransaction: tx,\n\t\t\taddress: receiver,\n\t\t\tisSent: false,\n\t\t});\n\t}\n\n\tasync #createSponsoredTransaction(tx: Transaction, claimer: string, sender: string) {\n\t\treturn this.#fetch<{ digest: string; bytes: string }>('transaction-blocks/sponsor', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: JSON.stringify({\n\t\t\t\tnetwork: this.#network,\n\t\t\t\tsender,\n\t\t\t\tclaimer,\n\t\t\t\ttransactionBlockKindBytes: toBase64(\n\t\t\t\t\tawait tx.build({\n\t\t\t\t\t\tonlyTransactionKind: true,\n\t\t\t\t\t\tclient: this.#client,\n\t\t\t\t\t}),\n\t\t\t\t),\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync #executeSponsoredTransaction(input: { digest: string; bytes: string }, signature: string) {\n\t\treturn this.#fetch<{ digest: string }>(`transaction-blocks/sponsor/${input.digest}`, {\n\t\t\tmethod: 'POST',\n\t\t\tbody: JSON.stringify({\n\t\t\t\tsignature,\n\t\t\t}),\n\t\t});\n\t}\n\n\tasync #fetch<T = unknown>(path: string, init: RequestInit): Promise<T> {\n\t\tconst res = await fetch(`${this.#claimApi}/v1/${path}`, {\n\t\t\t...init,\n\t\t\theaders: {\n\t\t\t\t...init.headers,\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t},\n\t\t});\n\n\t\tif (!res.ok) {\n\t\t\tconsole.error(`${this.#claimApi}/v1/${path}`, await res.text());\n\t\t\tthrow new Error(`Request to claim API failed with status code ${res.status}`);\n\t\t}\n\n\t\tconst { data } = await res.json();\n\n\t\treturn data as T;\n\t}\n\n\tasync #listNonContractClaimableAssets() {\n\t\tconst balances: {\n\t\t\tcoinType: string;\n\t\t\tamount: bigint;\n\t\t}[] = [];\n\n\t\tconst nfts: {\n\t\t\tobjectId: string;\n\t\t\ttype: string;\n\t\t\tversion: string;\n\t\t\tdigest: string;\n\t\t}[] = [];\n\n\t\tconst coins: {\n\t\t\tobjectId: string;\n\t\t\ttype: string;\n\t\t\tversion: string;\n\t\t\tdigest: string;\n\t\t}[] = [];\n\n\t\tif (this.#ownedObjects.length === 0 && !this.#hasSui) {\n\t\t\treturn {\n\t\t\t\tbalances,\n\t\t\t\tnfts,\n\t\t\t\tcoins,\n\t\t\t};\n\t\t}\n\n\t\tconst address = new Ed25519Keypair().toHaneulAddress();\n\t\tconst normalizedAddress = normalizeHaneulAddress(address);\n\n\t\tconst tx = this.createClaimTransaction(normalizedAddress);\n\n\t\tif (this.#gasCoin || !this.#hasSui) {\n\t\t\ttx.setGasPayment([]);\n\t\t}\n\n\t\tconst dryRun = await this.#client.dryRunTransactionBlock({\n\t\t\ttransactionBlock: await tx.build({ client: this.#client }),\n\t\t});\n\n\t\tdryRun.balanceChanges.forEach((balanceChange) => {\n\t\t\tif (BigInt(balanceChange.amount) > 0n && isOwner(balanceChange.owner, normalizedAddress)) {\n\t\t\t\tbalances.push({\n\t\t\t\t\tcoinType: normalizeStructTag(balanceChange.coinType),\n\t\t\t\t\tamount: BigInt(balanceChange.amount),\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\tdryRun.objectChanges.forEach((objectChange) => {\n\t\t\tif ('objectType' in objectChange) {\n\t\t\t\tconst type = parseStructTag(objectChange.objectType);\n\n\t\t\t\tif (\n\t\t\t\t\ttype.address === normalizeHaneulAddress('0x2') &&\n\t\t\t\t\ttype.module === 'coin' &&\n\t\t\t\t\ttype.name === 'Coin'\n\t\t\t\t) {\n\t\t\t\t\tif (ownedAfterChange(objectChange, normalizedAddress)) {\n\t\t\t\t\t\tcoins.push(objectChange);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ownedAfterChange(objectChange, normalizedAddress)) {\n\t\t\t\tnfts.push(objectChange);\n\t\t\t}\n\t\t});\n\n\t\treturn {\n\t\t\tbalances,\n\t\t\tnfts,\n\t\t\tcoins,\n\t\t};\n\t}\n\n\t#createNonContractClaimTransaction(address: string) {\n\t\tif (!this.keypair) {\n\t\t\tthrow new Error('Cannot claim assets without the links keypair');\n\t\t}\n\n\t\tconst tx = new Transaction();\n\t\ttx.setSender(this.keypair.toHaneulAddress());\n\n\t\tconst objectsToTransfer: TransactionObjectArgument[] = this.#ownedObjects\n\t\t\t.filter((object) => {\n\t\t\t\tif (this.#gasCoin) {\n\t\t\t\t\tif (object.objectId === this.#gasCoin.coinObjectId) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t} else if (object.type === HANEUL_COIN_OBJECT_TYPE) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t})\n\t\t\t.map((object) => tx.object(object.objectId));\n\n\t\tif (this.#gasCoin && this.creatorAddress) {\n\t\t\ttx.transferObjects([tx.gas], this.creatorAddress);\n\t\t} else {\n\t\t\tobjectsToTransfer.push(tx.gas);\n\t\t}\n\n\t\tif (objectsToTransfer.length > 0) {\n\t\t\ttx.transferObjects(objectsToTransfer, address);\n\t\t}\n\n\t\treturn tx;\n\t}\n\n\tasync #loadOwnedObjects({\n\t\tloadClaimedAssets = true,\n\t}: {\n\t\tloadClaimedAssets?: boolean;\n\t} = {}) {\n\t\tthis.assets = {\n\t\t\tnfts: [],\n\t\t\tbalances: [],\n\t\t\tcoins: [],\n\t\t};\n\n\t\tlet nextCursor: string | null | undefined;\n\t\tdo {\n\t\t\tconst ownedObjects = await this.#client.getOwnedObjects({\n\t\t\t\tcursor: nextCursor,\n\t\t\t\towner: this.address,\n\t\t\t\toptions: {\n\t\t\t\t\tshowType: true,\n\t\t\t\t\tshowContent: true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\t// RPC response returns cursor even if there are no more pages\n\t\t\tnextCursor = ownedObjects.hasNextPage ? ownedObjects.nextCursor : null;\n\t\t\tfor (const object of ownedObjects.data) {\n\t\t\t\tif (object.data) {\n\t\t\t\t\tthis.#ownedObjects.push({\n\t\t\t\t\t\tobjectId: normalizeHaneulObjectId(object.data.objectId),\n\t\t\t\t\t\tversion: object.data.version,\n\t\t\t\t\t\tdigest: object.data.digest,\n\t\t\t\t\t\ttype: normalizeStructTag(object.data.type!),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t} while (nextCursor);\n\n\t\tconst coins = await this.#client.getCoins({\n\t\t\tcoinType: HANEUL_COIN_TYPE,\n\t\t\towner: this.address,\n\t\t});\n\n\t\tthis.#hasSui = coins.data.length > 0;\n\t\tthis.#gasCoin = coins.data.find((coin) => BigInt(coin.balance) % 1000n === 987n);\n\n\t\tconst result = await this.#client.queryTransactionBlocks({\n\t\t\tlimit: 1,\n\t\t\torder: 'ascending',\n\t\t\tfilter: {\n\t\t\t\tToAddress: this.address,\n\t\t\t},\n\t\t\toptions: {\n\t\t\t\tshowInput: true,\n\t\t\t\tshowBalanceChanges: true,\n\t\t\t\tshowObjectChanges: true,\n\t\t\t},\n\t\t});\n\n\t\tthis.creatorAddress = result.data[0]?.transaction?.data.sender;\n\n\t\tif (this.#hasSui || this.#ownedObjects.length > 0) {\n\t\t\tthis.claimed = false;\n\t\t\tthis.assets = await this.#listNonContractClaimableAssets();\n\t\t} else if (result.data[0] && loadClaimedAssets) {\n\t\t\tthis.claimed = true;\n\t\t\tawait this.#loadClaimedAssets();\n\t\t}\n\t}\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["import_utils", "bytes", "signature", "tx"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { HaneulTransactionBlockResponseOptions } from '@haneullabs/haneul/client';
|
|
2
|
+
import { HaneulClient } from '@haneullabs/haneul/client';
|
|
3
|
+
import { ZkSendLink } from './claim.js';
|
|
4
|
+
import type { ZkBagContractOptions } from './zk-bag.js';
|
|
5
|
+
export declare function getSentTransactionsWithLinks({ address, cursor, limit, network, contract, client, loadAssets, loadClaimedAssets, options, ...linkOptions }: {
|
|
6
|
+
address: string;
|
|
7
|
+
contract?: ZkBagContractOptions;
|
|
8
|
+
cursor?: string;
|
|
9
|
+
limit?: number;
|
|
10
|
+
network?: 'mainnet' | 'testnet';
|
|
11
|
+
loadAssets?: boolean;
|
|
12
|
+
loadClaimedAssets?: boolean;
|
|
13
|
+
host?: string;
|
|
14
|
+
path?: string;
|
|
15
|
+
claimApi?: string;
|
|
16
|
+
client?: HaneulClient;
|
|
17
|
+
options?: HaneulTransactionBlockResponseOptions;
|
|
18
|
+
}): Promise<{
|
|
19
|
+
data: {
|
|
20
|
+
transaction: import("@haneullabs/haneul/client").HaneulTransactionBlockResponse;
|
|
21
|
+
links: ZkSendLink[];
|
|
22
|
+
}[];
|
|
23
|
+
nextCursor: string | null | undefined;
|
|
24
|
+
hasNextPage: boolean;
|
|
25
|
+
}>;
|