@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.
Files changed (52) hide show
  1. package/CHANGELOG.md +1084 -0
  2. package/README.md +1 -0
  3. package/dist/cjs/index.d.ts +7 -0
  4. package/dist/cjs/index.js +38 -0
  5. package/dist/cjs/index.js.map +7 -0
  6. package/dist/cjs/index.test.d.ts +4 -0
  7. package/dist/cjs/links/builder.d.ts +55 -0
  8. package/dist/cjs/links/builder.js +361 -0
  9. package/dist/cjs/links/builder.js.map +7 -0
  10. package/dist/cjs/links/claim.d.ts +57 -0
  11. package/dist/cjs/links/claim.js +573 -0
  12. package/dist/cjs/links/claim.js.map +7 -0
  13. package/dist/cjs/links/get-sent-transactions.d.ts +25 -0
  14. package/dist/cjs/links/get-sent-transactions.js +134 -0
  15. package/dist/cjs/links/get-sent-transactions.js.map +7 -0
  16. package/dist/cjs/links/list-created-links.d.ts +24 -0
  17. package/dist/cjs/links/list-created-links.js +124 -0
  18. package/dist/cjs/links/list-created-links.js.map +7 -0
  19. package/dist/cjs/links/utils.d.ts +34 -0
  20. package/dist/cjs/links/utils.js +132 -0
  21. package/dist/cjs/links/utils.js.map +7 -0
  22. package/dist/cjs/links/zk-bag.d.ts +72 -0
  23. package/dist/cjs/links/zk-bag.js +145 -0
  24. package/dist/cjs/links/zk-bag.js.map +7 -0
  25. package/dist/cjs/package.json +5 -0
  26. package/dist/esm/index.d.ts +7 -0
  27. package/dist/esm/index.js +20 -0
  28. package/dist/esm/index.js.map +7 -0
  29. package/dist/esm/index.test.d.ts +4 -0
  30. package/dist/esm/links/builder.d.ts +55 -0
  31. package/dist/esm/links/builder.js +341 -0
  32. package/dist/esm/links/builder.js.map +7 -0
  33. package/dist/esm/links/claim.d.ts +57 -0
  34. package/dist/esm/links/claim.js +561 -0
  35. package/dist/esm/links/claim.js.map +7 -0
  36. package/dist/esm/links/get-sent-transactions.d.ts +25 -0
  37. package/dist/esm/links/get-sent-transactions.js +114 -0
  38. package/dist/esm/links/get-sent-transactions.js.map +7 -0
  39. package/dist/esm/links/list-created-links.d.ts +24 -0
  40. package/dist/esm/links/list-created-links.js +104 -0
  41. package/dist/esm/links/list-created-links.js.map +7 -0
  42. package/dist/esm/links/utils.d.ts +34 -0
  43. package/dist/esm/links/utils.js +112 -0
  44. package/dist/esm/links/utils.js.map +7 -0
  45. package/dist/esm/links/zk-bag.d.ts +72 -0
  46. package/dist/esm/links/zk-bag.js +125 -0
  47. package/dist/esm/links/zk-bag.js.map +7 -0
  48. package/dist/esm/package.json +5 -0
  49. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  50. package/dist/tsconfig.tsbuildinfo +1 -0
  51. package/experimental/unified-adapter/package.json +6 -0
  52. 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,5 @@
1
+ {
2
+ "private": true,
3
+ "type": "commonjs",
4
+ "sideEffects": false
5
+ }
@@ -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,4 @@
1
+ export declare const DEMO_BEAR_CONFIG: {
2
+ packageId: string;
3
+ type: string;
4
+ };
@@ -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
+ }