@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
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# `@haneullabs/zksend`
|
|
@@ -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,38 @@
|
|
|
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 __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var index_exports = {};
|
|
20
|
+
__export(index_exports, {
|
|
21
|
+
MAINNET_CONTRACT_IDS: () => import_zk_bag2.MAINNET_CONTRACT_IDS,
|
|
22
|
+
TESTNET_CONTRACT_IDS: () => import_zk_bag2.TESTNET_CONTRACT_IDS,
|
|
23
|
+
ZkBag: () => import_zk_bag.ZkBag,
|
|
24
|
+
ZkSendLink: () => import_claim.ZkSendLink,
|
|
25
|
+
ZkSendLinkBuilder: () => import_builder.ZkSendLinkBuilder,
|
|
26
|
+
getSentTransactionsWithLinks: () => import_get_sent_transactions.getSentTransactionsWithLinks,
|
|
27
|
+
isClaimTransaction: () => import_utils.isClaimTransaction,
|
|
28
|
+
listCreatedLinks: () => import_list_created_links.listCreatedLinks
|
|
29
|
+
});
|
|
30
|
+
module.exports = __toCommonJS(index_exports);
|
|
31
|
+
var import_builder = require("./links/builder.js");
|
|
32
|
+
var import_claim = require("./links/claim.js");
|
|
33
|
+
var import_zk_bag = require("./links/zk-bag.js");
|
|
34
|
+
var import_utils = require("./links/utils.js");
|
|
35
|
+
var import_list_created_links = require("./links/list-created-links.js");
|
|
36
|
+
var import_get_sent_transactions = require("./links/get-sent-transactions.js");
|
|
37
|
+
var import_zk_bag2 = require("./links/zk-bag.js");
|
|
38
|
+
//# 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": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,qBAIO;AACP,mBAAmD;AACnD,oBAAiD;AACjD,mBAAmC;AACnC,gCAAiC;AACjC,mCAA6C;AAE7C,IAAAA,iBAA2D;",
|
|
6
|
+
"names": ["import_zk_bag"]
|
|
7
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { HaneulClient } from '@haneullabs/haneul/client';
|
|
2
|
+
import type { Keypair, Signer } from '@haneullabs/haneul/cryptography';
|
|
3
|
+
import type { TransactionObjectArgument, TransactionObjectInput } from '@haneullabs/haneul/transactions';
|
|
4
|
+
import { Transaction } from '@haneullabs/haneul/transactions';
|
|
5
|
+
import type { ZkBagContractOptions } from './zk-bag.js';
|
|
6
|
+
export interface ZkSendLinkBuilderOptions {
|
|
7
|
+
host?: string;
|
|
8
|
+
path?: string;
|
|
9
|
+
keypair?: Keypair;
|
|
10
|
+
network?: 'mainnet' | 'testnet';
|
|
11
|
+
client?: HaneulClient;
|
|
12
|
+
sender: string;
|
|
13
|
+
contract?: ZkBagContractOptions | null;
|
|
14
|
+
}
|
|
15
|
+
export interface CreateZkSendLinkOptions {
|
|
16
|
+
transaction?: Transaction;
|
|
17
|
+
calculateGas?: (options: {
|
|
18
|
+
balances: Map<string, bigint>;
|
|
19
|
+
objects: TransactionObjectInput[];
|
|
20
|
+
gasEstimateFromDryRun: bigint;
|
|
21
|
+
}) => Promise<bigint> | bigint;
|
|
22
|
+
}
|
|
23
|
+
export declare class ZkSendLinkBuilder {
|
|
24
|
+
#private;
|
|
25
|
+
objectIds: Set<string>;
|
|
26
|
+
objectRefs: {
|
|
27
|
+
ref: TransactionObjectArgument;
|
|
28
|
+
type: string;
|
|
29
|
+
}[];
|
|
30
|
+
balances: Map<string, bigint>;
|
|
31
|
+
sender: string;
|
|
32
|
+
network: 'mainnet' | 'testnet';
|
|
33
|
+
keypair: Keypair;
|
|
34
|
+
constructor({ host, path, keypair, network, client, sender, contract, }: ZkSendLinkBuilderOptions);
|
|
35
|
+
addClaimableGeunhwa(amount: bigint): void;
|
|
36
|
+
addClaimableBalance(coinType: string, amount: bigint): void;
|
|
37
|
+
addClaimableObject(id: string): void;
|
|
38
|
+
addClaimableObjectRef(ref: TransactionObjectArgument, type: string): void;
|
|
39
|
+
getLink(): string;
|
|
40
|
+
create({ signer, ...options }: CreateZkSendLinkOptions & {
|
|
41
|
+
signer: Signer;
|
|
42
|
+
waitForTransaction?: boolean;
|
|
43
|
+
}): Promise<import("@haneullabs/haneul/client").HaneulTransactionBlockResponse>;
|
|
44
|
+
createSendTransaction({ transaction, calculateGas, }?: CreateZkSendLinkOptions): Promise<Transaction>;
|
|
45
|
+
createSendToAddressTransaction({ transaction, address, }: CreateZkSendLinkOptions & {
|
|
46
|
+
address: string;
|
|
47
|
+
}): Promise<Transaction>;
|
|
48
|
+
static createLinks({ links, network, client, transaction, contract: contractIds, }: {
|
|
49
|
+
transaction?: Transaction;
|
|
50
|
+
client?: HaneulClient;
|
|
51
|
+
network?: 'mainnet' | 'testnet';
|
|
52
|
+
links: ZkSendLinkBuilder[];
|
|
53
|
+
contract?: ZkBagContractOptions;
|
|
54
|
+
}): Promise<Transaction>;
|
|
55
|
+
}
|
|
@@ -0,0 +1,361 @@
|
|
|
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 builder_exports = {};
|
|
28
|
+
__export(builder_exports, {
|
|
29
|
+
ZkSendLinkBuilder: () => ZkSendLinkBuilder
|
|
30
|
+
});
|
|
31
|
+
module.exports = __toCommonJS(builder_exports);
|
|
32
|
+
var import_client = require("@haneullabs/haneul/client");
|
|
33
|
+
var import_cryptography = require("@haneullabs/haneul/cryptography");
|
|
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_zk_bag = require("./zk-bag.js");
|
|
38
|
+
var _host, _path, _client, _coinsByType, _contract, _ZkSendLinkBuilder_instances, objectsToTransfer_fn, createSendTransactionWithoutContract_fn, estimateClaimGasFee_fn, getCoinsByType_fn;
|
|
39
|
+
const DEFAULT_ZK_SEND_LINK_OPTIONS = {
|
|
40
|
+
host: "https://my.slush.app",
|
|
41
|
+
path: "/claim",
|
|
42
|
+
network: "mainnet"
|
|
43
|
+
};
|
|
44
|
+
const HANEUL_COIN_TYPE = (0, import_utils.normalizeStructTag)(import_utils.HANEUL_TYPE_ARG);
|
|
45
|
+
const _ZkSendLinkBuilder = class _ZkSendLinkBuilder {
|
|
46
|
+
constructor({
|
|
47
|
+
host = DEFAULT_ZK_SEND_LINK_OPTIONS.host,
|
|
48
|
+
path = DEFAULT_ZK_SEND_LINK_OPTIONS.path,
|
|
49
|
+
keypair = new import_ed25519.Ed25519Keypair(),
|
|
50
|
+
network = DEFAULT_ZK_SEND_LINK_OPTIONS.network,
|
|
51
|
+
client = new import_client.HaneulClient({ url: (0, import_client.getFullnodeUrl)(network) }),
|
|
52
|
+
sender,
|
|
53
|
+
contract = (0, import_zk_bag.getContractIds)(network)
|
|
54
|
+
}) {
|
|
55
|
+
__privateAdd(this, _ZkSendLinkBuilder_instances);
|
|
56
|
+
this.objectIds = /* @__PURE__ */ new Set();
|
|
57
|
+
this.objectRefs = [];
|
|
58
|
+
this.balances = /* @__PURE__ */ new Map();
|
|
59
|
+
__privateAdd(this, _host);
|
|
60
|
+
__privateAdd(this, _path);
|
|
61
|
+
__privateAdd(this, _client);
|
|
62
|
+
__privateAdd(this, _coinsByType, /* @__PURE__ */ new Map());
|
|
63
|
+
__privateAdd(this, _contract);
|
|
64
|
+
__privateSet(this, _host, host);
|
|
65
|
+
__privateSet(this, _path, path);
|
|
66
|
+
this.keypair = keypair;
|
|
67
|
+
__privateSet(this, _client, client);
|
|
68
|
+
this.sender = (0, import_utils.normalizeHaneulAddress)(sender);
|
|
69
|
+
this.network = network;
|
|
70
|
+
if (contract) {
|
|
71
|
+
__privateSet(this, _contract, new import_zk_bag.ZkBag(contract.packageId, contract));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
addClaimableGeunhwa(amount) {
|
|
75
|
+
this.addClaimableBalance(HANEUL_COIN_TYPE, amount);
|
|
76
|
+
}
|
|
77
|
+
addClaimableBalance(coinType, amount) {
|
|
78
|
+
const normalizedType = (0, import_utils.normalizeStructTag)(coinType);
|
|
79
|
+
this.balances.set(normalizedType, (this.balances.get(normalizedType) ?? 0n) + amount);
|
|
80
|
+
}
|
|
81
|
+
addClaimableObject(id) {
|
|
82
|
+
this.objectIds.add(id);
|
|
83
|
+
}
|
|
84
|
+
addClaimableObjectRef(ref, type) {
|
|
85
|
+
this.objectRefs.push({ ref, type });
|
|
86
|
+
}
|
|
87
|
+
getLink() {
|
|
88
|
+
const link = new URL(__privateGet(this, _host));
|
|
89
|
+
link.pathname = __privateGet(this, _path);
|
|
90
|
+
link.hash = `${__privateGet(this, _contract) ? "$" : ""}${(0, import_utils.toBase64)(
|
|
91
|
+
(0, import_cryptography.decodeHaneulPrivateKey)(this.keypair.getSecretKey()).secretKey
|
|
92
|
+
)}`;
|
|
93
|
+
if (this.network !== "mainnet") {
|
|
94
|
+
link.searchParams.set("network", this.network);
|
|
95
|
+
}
|
|
96
|
+
return link.toString();
|
|
97
|
+
}
|
|
98
|
+
async create({
|
|
99
|
+
signer,
|
|
100
|
+
...options
|
|
101
|
+
}) {
|
|
102
|
+
const tx = await this.createSendTransaction(options);
|
|
103
|
+
const result = await __privateGet(this, _client).signAndExecuteTransaction({
|
|
104
|
+
transaction: await tx.build({ client: __privateGet(this, _client) }),
|
|
105
|
+
signer,
|
|
106
|
+
options: {
|
|
107
|
+
showEffects: true
|
|
108
|
+
}
|
|
109
|
+
});
|
|
110
|
+
if (result.effects?.status.status !== "success") {
|
|
111
|
+
throw new Error(`Transaction failed: ${result.effects?.status.error ?? "Unknown error"}`);
|
|
112
|
+
}
|
|
113
|
+
if (options.waitForTransaction) {
|
|
114
|
+
await __privateGet(this, _client).waitForTransaction({ digest: result.digest });
|
|
115
|
+
}
|
|
116
|
+
return result;
|
|
117
|
+
}
|
|
118
|
+
async createSendTransaction({
|
|
119
|
+
transaction = new import_transactions.Transaction(),
|
|
120
|
+
calculateGas
|
|
121
|
+
} = {}) {
|
|
122
|
+
if (!__privateGet(this, _contract)) {
|
|
123
|
+
return __privateMethod(this, _ZkSendLinkBuilder_instances, createSendTransactionWithoutContract_fn).call(this, { transaction, calculateGas });
|
|
124
|
+
}
|
|
125
|
+
transaction.setSenderIfNotSet(this.sender);
|
|
126
|
+
return _ZkSendLinkBuilder.createLinks({
|
|
127
|
+
transaction,
|
|
128
|
+
network: this.network,
|
|
129
|
+
client: __privateGet(this, _client),
|
|
130
|
+
contract: __privateGet(this, _contract).ids,
|
|
131
|
+
links: [this]
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
async createSendToAddressTransaction({
|
|
135
|
+
transaction = new import_transactions.Transaction(),
|
|
136
|
+
address
|
|
137
|
+
}) {
|
|
138
|
+
const objectsToTransfer = (await __privateMethod(this, _ZkSendLinkBuilder_instances, objectsToTransfer_fn).call(this, transaction)).map((obj) => obj.ref);
|
|
139
|
+
transaction.setSenderIfNotSet(this.sender);
|
|
140
|
+
transaction.transferObjects(objectsToTransfer, address);
|
|
141
|
+
return transaction;
|
|
142
|
+
}
|
|
143
|
+
static async createLinks({
|
|
144
|
+
links,
|
|
145
|
+
network = "mainnet",
|
|
146
|
+
client = new import_client.HaneulClient({ url: (0, import_client.getFullnodeUrl)(network) }),
|
|
147
|
+
transaction = new import_transactions.Transaction(),
|
|
148
|
+
contract: contractIds = (0, import_zk_bag.getContractIds)(network)
|
|
149
|
+
}) {
|
|
150
|
+
const contract = new import_zk_bag.ZkBag(contractIds.packageId, contractIds);
|
|
151
|
+
const store = transaction.object(contract.ids.bagStoreId);
|
|
152
|
+
const coinsByType = /* @__PURE__ */ new Map();
|
|
153
|
+
const allIds = links.flatMap((link) => [...link.objectIds]);
|
|
154
|
+
const sender = links[0].sender;
|
|
155
|
+
transaction.setSenderIfNotSet(sender);
|
|
156
|
+
await Promise.all(
|
|
157
|
+
[...new Set(links.flatMap((link) => [...link.balances.keys()]))].map(async (coinType) => {
|
|
158
|
+
const coins = await client.getCoins({
|
|
159
|
+
coinType,
|
|
160
|
+
owner: sender
|
|
161
|
+
});
|
|
162
|
+
coinsByType.set(
|
|
163
|
+
coinType,
|
|
164
|
+
coins.data.filter((coin) => !allIds.includes(coin.coinObjectId))
|
|
165
|
+
);
|
|
166
|
+
})
|
|
167
|
+
);
|
|
168
|
+
const objectRefs = /* @__PURE__ */ new Map();
|
|
169
|
+
const pageSize = 50;
|
|
170
|
+
let offset = 0;
|
|
171
|
+
while (offset < allIds.length) {
|
|
172
|
+
const chunk = allIds.slice(offset, offset + pageSize);
|
|
173
|
+
offset += pageSize;
|
|
174
|
+
const objects = await client.multiGetObjects({
|
|
175
|
+
ids: chunk,
|
|
176
|
+
options: {
|
|
177
|
+
showType: true
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
for (const [i, res] of objects.entries()) {
|
|
181
|
+
if (!res.data || res.error) {
|
|
182
|
+
throw new Error(`Failed to load object ${chunk[i]} (${res.error?.code})`);
|
|
183
|
+
}
|
|
184
|
+
objectRefs.set(chunk[i], {
|
|
185
|
+
ref: transaction.objectRef({
|
|
186
|
+
version: res.data.version,
|
|
187
|
+
digest: res.data.digest,
|
|
188
|
+
objectId: res.data.objectId
|
|
189
|
+
}),
|
|
190
|
+
type: res.data.type
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
const mergedCoins = /* @__PURE__ */ new Map([
|
|
195
|
+
[HANEUL_COIN_TYPE, transaction.gas]
|
|
196
|
+
]);
|
|
197
|
+
for (const [coinType, coins] of coinsByType) {
|
|
198
|
+
if (coinType === HANEUL_COIN_TYPE) {
|
|
199
|
+
continue;
|
|
200
|
+
}
|
|
201
|
+
const [first, ...rest] = coins.map(
|
|
202
|
+
(coin) => transaction.objectRef({
|
|
203
|
+
objectId: coin.coinObjectId,
|
|
204
|
+
version: coin.version,
|
|
205
|
+
digest: coin.digest
|
|
206
|
+
})
|
|
207
|
+
);
|
|
208
|
+
if (rest.length > 0) {
|
|
209
|
+
transaction.mergeCoins(first, rest);
|
|
210
|
+
}
|
|
211
|
+
mergedCoins.set(coinType, transaction.object(first));
|
|
212
|
+
}
|
|
213
|
+
for (const link of links) {
|
|
214
|
+
const receiver = link.keypair.toHaneulAddress();
|
|
215
|
+
transaction.add(contract.new({ arguments: [store, receiver] }));
|
|
216
|
+
link.objectRefs.forEach(({ ref, type }) => {
|
|
217
|
+
transaction.add(
|
|
218
|
+
contract.add({
|
|
219
|
+
arguments: [store, receiver, ref],
|
|
220
|
+
typeArguments: [type]
|
|
221
|
+
})
|
|
222
|
+
);
|
|
223
|
+
});
|
|
224
|
+
link.objectIds.forEach((id) => {
|
|
225
|
+
const object = objectRefs.get(id);
|
|
226
|
+
if (!object) {
|
|
227
|
+
throw new Error(`Object ${id} not found`);
|
|
228
|
+
}
|
|
229
|
+
transaction.add(
|
|
230
|
+
contract.add({
|
|
231
|
+
arguments: [store, receiver, object.ref],
|
|
232
|
+
typeArguments: [object.type]
|
|
233
|
+
})
|
|
234
|
+
);
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
for (const [coinType, merged] of mergedCoins) {
|
|
238
|
+
const linksWithCoin = links.filter((link) => link.balances.has(coinType));
|
|
239
|
+
if (linksWithCoin.length === 0) {
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
const balances = linksWithCoin.map((link) => link.balances.get(coinType));
|
|
243
|
+
const splits = transaction.splitCoins(merged, balances);
|
|
244
|
+
for (const [i, link] of linksWithCoin.entries()) {
|
|
245
|
+
transaction.add(
|
|
246
|
+
contract.add({
|
|
247
|
+
arguments: [store, link.keypair.toHaneulAddress(), splits[i]],
|
|
248
|
+
typeArguments: [`0x2::coin::Coin<${coinType}>`]
|
|
249
|
+
})
|
|
250
|
+
);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return transaction;
|
|
254
|
+
}
|
|
255
|
+
};
|
|
256
|
+
_host = new WeakMap();
|
|
257
|
+
_path = new WeakMap();
|
|
258
|
+
_client = new WeakMap();
|
|
259
|
+
_coinsByType = new WeakMap();
|
|
260
|
+
_contract = new WeakMap();
|
|
261
|
+
_ZkSendLinkBuilder_instances = new WeakSet();
|
|
262
|
+
objectsToTransfer_fn = async function(tx) {
|
|
263
|
+
const objectIDs = [...this.objectIds];
|
|
264
|
+
const refsWithType = this.objectRefs.concat(
|
|
265
|
+
(objectIDs.length > 0 ? await __privateGet(this, _client).multiGetObjects({
|
|
266
|
+
ids: objectIDs,
|
|
267
|
+
options: {
|
|
268
|
+
showType: true
|
|
269
|
+
}
|
|
270
|
+
}) : []).map((res, i) => {
|
|
271
|
+
if (!res.data || res.error) {
|
|
272
|
+
throw new Error(`Failed to load object ${objectIDs[i]} (${res.error?.code})`);
|
|
273
|
+
}
|
|
274
|
+
return {
|
|
275
|
+
ref: tx.objectRef({
|
|
276
|
+
version: res.data.version,
|
|
277
|
+
digest: res.data.digest,
|
|
278
|
+
objectId: res.data.objectId
|
|
279
|
+
}),
|
|
280
|
+
type: res.data.type
|
|
281
|
+
};
|
|
282
|
+
})
|
|
283
|
+
);
|
|
284
|
+
for (const [coinType, amount] of this.balances) {
|
|
285
|
+
if (coinType === HANEUL_COIN_TYPE) {
|
|
286
|
+
const [sui] = tx.splitCoins(tx.gas, [amount]);
|
|
287
|
+
refsWithType.push({
|
|
288
|
+
ref: sui,
|
|
289
|
+
type: `0x2::coin::Coin<${coinType}>`
|
|
290
|
+
});
|
|
291
|
+
} else {
|
|
292
|
+
const coins = (await __privateMethod(this, _ZkSendLinkBuilder_instances, getCoinsByType_fn).call(this, coinType)).map((coin) => coin.coinObjectId);
|
|
293
|
+
if (coins.length > 1) {
|
|
294
|
+
tx.mergeCoins(coins[0], coins.slice(1));
|
|
295
|
+
}
|
|
296
|
+
const [split] = tx.splitCoins(coins[0], [amount]);
|
|
297
|
+
refsWithType.push({
|
|
298
|
+
ref: split,
|
|
299
|
+
type: `0x2::coin::Coin<${coinType}>`
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return refsWithType;
|
|
304
|
+
};
|
|
305
|
+
createSendTransactionWithoutContract_fn = async function({
|
|
306
|
+
transaction: tx = new import_transactions.Transaction(),
|
|
307
|
+
calculateGas
|
|
308
|
+
} = {}) {
|
|
309
|
+
const gasEstimateFromDryRun = await __privateMethod(this, _ZkSendLinkBuilder_instances, estimateClaimGasFee_fn).call(this);
|
|
310
|
+
const baseGasAmount = calculateGas ? await calculateGas({
|
|
311
|
+
balances: this.balances,
|
|
312
|
+
objects: [...this.objectIds],
|
|
313
|
+
gasEstimateFromDryRun
|
|
314
|
+
}) : gasEstimateFromDryRun * 2n;
|
|
315
|
+
const gasWithBuffer = baseGasAmount + 1013n;
|
|
316
|
+
const roundedGasAmount = gasWithBuffer - gasWithBuffer % 1000n - 13n;
|
|
317
|
+
const address = this.keypair.toHaneulAddress();
|
|
318
|
+
const objectsToTransfer = (await __privateMethod(this, _ZkSendLinkBuilder_instances, objectsToTransfer_fn).call(this, tx)).map((obj) => obj.ref);
|
|
319
|
+
const [gas] = tx.splitCoins(tx.gas, [roundedGasAmount]);
|
|
320
|
+
objectsToTransfer.push(gas);
|
|
321
|
+
tx.setSenderIfNotSet(this.sender);
|
|
322
|
+
tx.transferObjects(objectsToTransfer, address);
|
|
323
|
+
return tx;
|
|
324
|
+
};
|
|
325
|
+
estimateClaimGasFee_fn = async function() {
|
|
326
|
+
const tx = new import_transactions.Transaction();
|
|
327
|
+
tx.setSender(this.sender);
|
|
328
|
+
tx.setGasPayment([]);
|
|
329
|
+
tx.transferObjects([tx.gas], this.keypair.toHaneulAddress());
|
|
330
|
+
const idsToTransfer = [...this.objectIds];
|
|
331
|
+
for (const [coinType] of this.balances) {
|
|
332
|
+
const coins = await __privateMethod(this, _ZkSendLinkBuilder_instances, getCoinsByType_fn).call(this, coinType);
|
|
333
|
+
if (!coins.length) {
|
|
334
|
+
throw new Error(`Sending account does not contain any coins of type ${coinType}`);
|
|
335
|
+
}
|
|
336
|
+
idsToTransfer.push(coins[0].coinObjectId);
|
|
337
|
+
}
|
|
338
|
+
if (idsToTransfer.length > 0) {
|
|
339
|
+
tx.transferObjects(
|
|
340
|
+
idsToTransfer.map((id) => tx.object(id)),
|
|
341
|
+
this.keypair.toHaneulAddress()
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
const result = await __privateGet(this, _client).dryRunTransactionBlock({
|
|
345
|
+
transactionBlock: await tx.build({ client: __privateGet(this, _client) })
|
|
346
|
+
});
|
|
347
|
+
return BigInt(result.effects.gasUsed.computationCost) + BigInt(result.effects.gasUsed.storageCost) - BigInt(result.effects.gasUsed.storageRebate);
|
|
348
|
+
};
|
|
349
|
+
getCoinsByType_fn = async function(coinType) {
|
|
350
|
+
if (__privateGet(this, _coinsByType).has(coinType)) {
|
|
351
|
+
return __privateGet(this, _coinsByType).get(coinType);
|
|
352
|
+
}
|
|
353
|
+
const coins = await __privateGet(this, _client).getCoins({
|
|
354
|
+
coinType,
|
|
355
|
+
owner: this.sender
|
|
356
|
+
});
|
|
357
|
+
__privateGet(this, _coinsByType).set(coinType, coins.data);
|
|
358
|
+
return coins.data;
|
|
359
|
+
};
|
|
360
|
+
let ZkSendLinkBuilder = _ZkSendLinkBuilder;
|
|
361
|
+
//# 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
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { HaneulClient } from '@haneullabs/haneul/client';
|
|
2
|
+
import type { HaneulObjectData, HaneulTransactionBlockResponse } from '@haneullabs/haneul/client';
|
|
3
|
+
import type { Keypair } from '@haneullabs/haneul/cryptography';
|
|
4
|
+
import { Transaction } from '@haneullabs/haneul/transactions';
|
|
5
|
+
import type { ZkSendLinkBuilderOptions } from './builder.js';
|
|
6
|
+
import type { LinkAssets } from './utils.js';
|
|
7
|
+
import type { ZkBagContractOptions } from './zk-bag.js';
|
|
8
|
+
export type ZkSendLinkOptions = {
|
|
9
|
+
claimApi?: string;
|
|
10
|
+
keypair?: Keypair;
|
|
11
|
+
client?: HaneulClient;
|
|
12
|
+
network?: 'mainnet' | 'testnet';
|
|
13
|
+
host?: string;
|
|
14
|
+
path?: string;
|
|
15
|
+
address?: string;
|
|
16
|
+
isContractLink: boolean;
|
|
17
|
+
contract?: ZkBagContractOptions | null;
|
|
18
|
+
} & ({
|
|
19
|
+
address: string;
|
|
20
|
+
keypair?: never;
|
|
21
|
+
} | {
|
|
22
|
+
keypair: Keypair;
|
|
23
|
+
address?: never;
|
|
24
|
+
});
|
|
25
|
+
export declare class ZkSendLink {
|
|
26
|
+
#private;
|
|
27
|
+
address: string;
|
|
28
|
+
keypair?: Keypair;
|
|
29
|
+
creatorAddress?: string;
|
|
30
|
+
assets?: LinkAssets;
|
|
31
|
+
claimed?: boolean;
|
|
32
|
+
claimedBy?: string;
|
|
33
|
+
bagObject?: HaneulObjectData | null;
|
|
34
|
+
constructor({ network, client, keypair, contract, address, host, path, claimApi, isContractLink, }: ZkSendLinkOptions);
|
|
35
|
+
static fromUrl(url: string, options?: Omit<ZkSendLinkOptions, 'keypair' | 'address' | 'isContractLink'>): Promise<ZkSendLink>;
|
|
36
|
+
static fromAddress(address: string, options: Omit<ZkSendLinkOptions, 'keypair' | 'address' | 'isContractLink'>): Promise<ZkSendLink>;
|
|
37
|
+
loadClaimedStatus(): Promise<void>;
|
|
38
|
+
loadAssets(options?: {
|
|
39
|
+
transaction?: HaneulTransactionBlockResponse;
|
|
40
|
+
loadAssets?: boolean;
|
|
41
|
+
loadClaimedAssets?: boolean;
|
|
42
|
+
}): Promise<void>;
|
|
43
|
+
claimAssets(address: string, { reclaim, sign, }?: {
|
|
44
|
+
reclaim?: false;
|
|
45
|
+
sign?: never;
|
|
46
|
+
} | {
|
|
47
|
+
reclaim: true;
|
|
48
|
+
sign: (transaction: Uint8Array) => Promise<string>;
|
|
49
|
+
}): Promise<HaneulTransactionBlockResponse>;
|
|
50
|
+
createClaimTransaction(address: string, { reclaim, }?: {
|
|
51
|
+
reclaim?: boolean;
|
|
52
|
+
}): Transaction;
|
|
53
|
+
createRegenerateTransaction(sender: string, options?: Omit<ZkSendLinkBuilderOptions, 'sender'>): Promise<{
|
|
54
|
+
url: string;
|
|
55
|
+
transaction: Transaction;
|
|
56
|
+
}>;
|
|
57
|
+
}
|