@haneullabs/kiosk 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 +1070 -0
- package/README.md +8 -0
- package/dist/cjs/bcs.d.ts +23 -0
- package/dist/cjs/bcs.js +50 -0
- package/dist/cjs/bcs.js.map +7 -0
- package/dist/cjs/client/kiosk-client.d.ts +76 -0
- package/dist/cjs/client/kiosk-client.js +123 -0
- package/dist/cjs/client/kiosk-client.js.map +7 -0
- package/dist/cjs/client/kiosk-transaction.d.ts +186 -0
- package/dist/cjs/client/kiosk-transaction.js +462 -0
- package/dist/cjs/client/kiosk-transaction.js.map +7 -0
- package/dist/cjs/client/tp-transaction.d.ts +114 -0
- package/dist/cjs/client/tp-transaction.js +307 -0
- package/dist/cjs/client/tp-transaction.js.map +7 -0
- package/dist/cjs/constants.d.ts +31 -0
- package/dist/cjs/constants.js +102 -0
- package/dist/cjs/constants.js.map +7 -0
- package/dist/cjs/index.d.ts +6 -0
- package/dist/cjs/index.js +24 -0
- package/dist/cjs/index.js.map +7 -0
- package/dist/cjs/package.json +5 -0
- package/dist/cjs/query/kiosk.d.ts +8 -0
- package/dist/cjs/query/kiosk.js +181 -0
- package/dist/cjs/query/kiosk.js.map +7 -0
- package/dist/cjs/query/transfer-policy.d.ts +29 -0
- package/dist/cjs/query/transfer-policy.js +92 -0
- package/dist/cjs/query/transfer-policy.js.map +7 -0
- package/dist/cjs/tx/kiosk.d.ts +71 -0
- package/dist/cjs/tx/kiosk.js +130 -0
- package/dist/cjs/tx/kiosk.js.map +7 -0
- package/dist/cjs/tx/personal-kiosk.d.ts +7 -0
- package/dist/cjs/tx/personal-kiosk.js +38 -0
- package/dist/cjs/tx/personal-kiosk.js.map +7 -0
- package/dist/cjs/tx/rules/attach.d.ts +7 -0
- package/dist/cjs/tx/rules/attach.js +62 -0
- package/dist/cjs/tx/rules/attach.js.map +7 -0
- package/dist/cjs/tx/rules/resolve.d.ts +15 -0
- package/dist/cjs/tx/rules/resolve.js +109 -0
- package/dist/cjs/tx/rules/resolve.js.map +7 -0
- package/dist/cjs/tx/transfer-policy.d.ts +29 -0
- package/dist/cjs/tx/transfer-policy.js +78 -0
- package/dist/cjs/tx/transfer-policy.js.map +7 -0
- package/dist/cjs/types/index.d.ts +27 -0
- package/dist/cjs/types/index.js +33 -0
- package/dist/cjs/types/index.js.map +7 -0
- package/dist/cjs/types/kiosk.d.ts +160 -0
- package/dist/cjs/types/kiosk.js +37 -0
- package/dist/cjs/types/kiosk.js.map +7 -0
- package/dist/cjs/types/transfer-policy.d.ts +53 -0
- package/dist/cjs/types/transfer-policy.js +35 -0
- package/dist/cjs/types/transfer-policy.js.map +7 -0
- package/dist/cjs/utils.d.ts +51 -0
- package/dist/cjs/utils.js +198 -0
- package/dist/cjs/utils.js.map +7 -0
- package/dist/esm/bcs.d.ts +23 -0
- package/dist/esm/bcs.js +35 -0
- package/dist/esm/bcs.js.map +7 -0
- package/dist/esm/client/kiosk-client.d.ts +76 -0
- package/dist/esm/client/kiosk-client.js +114 -0
- package/dist/esm/client/kiosk-client.js.map +7 -0
- package/dist/esm/client/kiosk-transaction.d.ts +186 -0
- package/dist/esm/client/kiosk-transaction.js +432 -0
- package/dist/esm/client/kiosk-transaction.js.map +7 -0
- package/dist/esm/client/tp-transaction.d.ts +114 -0
- package/dist/esm/client/tp-transaction.js +298 -0
- package/dist/esm/client/tp-transaction.js.map +7 -0
- package/dist/esm/constants.d.ts +31 -0
- package/dist/esm/constants.js +87 -0
- package/dist/esm/constants.js.map +7 -0
- package/dist/esm/index.d.ts +6 -0
- package/dist/esm/index.js +7 -0
- package/dist/esm/index.js.map +7 -0
- package/dist/esm/package.json +5 -0
- package/dist/esm/query/kiosk.d.ts +8 -0
- package/dist/esm/query/kiosk.js +169 -0
- package/dist/esm/query/kiosk.js.map +7 -0
- package/dist/esm/query/transfer-policy.d.ts +29 -0
- package/dist/esm/query/transfer-policy.js +76 -0
- package/dist/esm/query/transfer-policy.js.map +7 -0
- package/dist/esm/tx/kiosk.d.ts +71 -0
- package/dist/esm/tx/kiosk.js +110 -0
- package/dist/esm/tx/kiosk.js.map +7 -0
- package/dist/esm/tx/personal-kiosk.d.ts +7 -0
- package/dist/esm/tx/personal-kiosk.js +18 -0
- package/dist/esm/tx/personal-kiosk.js.map +7 -0
- package/dist/esm/tx/rules/attach.d.ts +7 -0
- package/dist/esm/tx/rules/attach.js +42 -0
- package/dist/esm/tx/rules/attach.js.map +7 -0
- package/dist/esm/tx/rules/resolve.d.ts +15 -0
- package/dist/esm/tx/rules/resolve.js +89 -0
- package/dist/esm/tx/rules/resolve.js.map +7 -0
- package/dist/esm/tx/transfer-policy.d.ts +29 -0
- package/dist/esm/tx/transfer-policy.js +58 -0
- package/dist/esm/tx/transfer-policy.js.map +7 -0
- package/dist/esm/types/index.d.ts +27 -0
- package/dist/esm/types/index.js +12 -0
- package/dist/esm/types/index.js.map +7 -0
- package/dist/esm/types/kiosk.d.ts +160 -0
- package/dist/esm/types/kiosk.js +17 -0
- package/dist/esm/types/kiosk.js.map +7 -0
- package/dist/esm/types/transfer-policy.d.ts +53 -0
- package/dist/esm/types/transfer-policy.js +15 -0
- package/dist/esm/types/transfer-policy.js.map +7 -0
- package/dist/esm/utils.d.ts +51 -0
- package/dist/esm/utils.js +183 -0
- package/dist/esm/utils.js.map +7 -0
- package/dist/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +59 -0
- package/src/bcs.ts +39 -0
- package/src/client/kiosk-client.ts +163 -0
- package/src/client/kiosk-transaction.ts +526 -0
- package/src/client/tp-transaction.ts +357 -0
- package/src/constants.ts +121 -0
- package/src/index.ts +9 -0
- package/src/query/kiosk.ts +264 -0
- package/src/query/transfer-policy.ts +134 -0
- package/src/tx/kiosk.ts +243 -0
- package/src/tx/personal-kiosk.ts +34 -0
- package/src/tx/rules/attach.ts +73 -0
- package/src/tx/rules/resolve.ts +126 -0
- package/src/tx/transfer-policy.ts +120 -0
- package/src/types/index.ts +35 -0
- package/src/types/kiosk.ts +178 -0
- package/src/types/transfer-policy.ts +71 -0
- package/src/utils.ts +286 -0
package/src/utils.ts
ADDED
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
// Copyright (c) Mysten Labs, Inc.
|
|
2
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
3
|
+
|
|
4
|
+
import type {
|
|
5
|
+
DynamicFieldInfo,
|
|
6
|
+
PaginationArguments,
|
|
7
|
+
HaneulClient,
|
|
8
|
+
HaneulObjectData,
|
|
9
|
+
HaneulObjectDataFilter,
|
|
10
|
+
HaneulObjectDataOptions,
|
|
11
|
+
HaneulObjectResponse,
|
|
12
|
+
} from '@haneullabs/haneul/client';
|
|
13
|
+
import {
|
|
14
|
+
fromBase64,
|
|
15
|
+
normalizeStructTag,
|
|
16
|
+
normalizeHaneulAddress,
|
|
17
|
+
parseStructTag,
|
|
18
|
+
} from '@haneullabs/haneul/utils';
|
|
19
|
+
|
|
20
|
+
import { KioskType } from './bcs.js';
|
|
21
|
+
import type { Kiosk, KioskData, KioskListing, TransferPolicyCap } from './types/index.js';
|
|
22
|
+
import { TRANSFER_POLICY_CAP_TYPE } from './types/index.js';
|
|
23
|
+
import { chunk } from '@haneullabs/utils';
|
|
24
|
+
|
|
25
|
+
const DEFAULT_QUERY_LIMIT = 50;
|
|
26
|
+
|
|
27
|
+
export async function getKioskObject(client: HaneulClient, id: string): Promise<Kiosk> {
|
|
28
|
+
const queryRes = await client.getObject({ id, options: { showBcs: true } });
|
|
29
|
+
|
|
30
|
+
if (!queryRes || queryRes.error || !queryRes.data) {
|
|
31
|
+
throw new Error(`Kiosk ${id} not found; ${queryRes.error}`);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
if (!queryRes.data.bcs || !('bcsBytes' in queryRes.data.bcs)) {
|
|
35
|
+
throw new Error(`Invalid kiosk query: ${id}, expected object, got package`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
return KioskType.parse(fromBase64(queryRes.data.bcs!.bcsBytes));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// helper to extract kiosk data from dynamic fields.
|
|
42
|
+
export function extractKioskData(
|
|
43
|
+
data: DynamicFieldInfo[],
|
|
44
|
+
listings: KioskListing[],
|
|
45
|
+
lockedItemIds: string[],
|
|
46
|
+
kioskId: string,
|
|
47
|
+
): KioskData {
|
|
48
|
+
return data.reduce<KioskData>(
|
|
49
|
+
(acc: KioskData, val: DynamicFieldInfo) => {
|
|
50
|
+
const type = val.name.type;
|
|
51
|
+
|
|
52
|
+
if (type.startsWith('0x2::kiosk::Item')) {
|
|
53
|
+
acc.itemIds.push(val.objectId);
|
|
54
|
+
acc.items.push({
|
|
55
|
+
objectId: val.objectId,
|
|
56
|
+
type: val.objectType,
|
|
57
|
+
isLocked: false,
|
|
58
|
+
kioskId,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (type.startsWith('0x2::kiosk::Listing')) {
|
|
62
|
+
acc.listingIds.push(val.objectId);
|
|
63
|
+
listings.push({
|
|
64
|
+
objectId: (val.name.value as { id: string }).id,
|
|
65
|
+
listingId: val.objectId,
|
|
66
|
+
isExclusive: (val.name.value as { is_exclusive: boolean }).is_exclusive,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (type.startsWith('0x2::kiosk::Lock')) {
|
|
70
|
+
lockedItemIds?.push((val.name.value as { id: string }).id);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (type.startsWith('0x2::kiosk_extension::ExtensionKey')) {
|
|
74
|
+
acc.extensions.push({
|
|
75
|
+
objectId: val.objectId,
|
|
76
|
+
type: normalizeStructTag(parseStructTag(val.name.type).typeParams[0]),
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
return acc;
|
|
81
|
+
},
|
|
82
|
+
{ items: [], itemIds: [], listingIds: [], extensions: [] },
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* A helper that attaches the listing prices to kiosk listings.
|
|
88
|
+
*/
|
|
89
|
+
export function attachListingsAndPrices(
|
|
90
|
+
kioskData: KioskData,
|
|
91
|
+
listings: KioskListing[],
|
|
92
|
+
listingObjects: HaneulObjectResponse[],
|
|
93
|
+
) {
|
|
94
|
+
// map item listings as {item_id: KioskListing}
|
|
95
|
+
// for easier mapping on the nex
|
|
96
|
+
const itemListings = listings.reduce<Record<string, KioskListing>>(
|
|
97
|
+
(acc: Record<string, KioskListing>, item, idx) => {
|
|
98
|
+
acc[item.objectId] = { ...item };
|
|
99
|
+
|
|
100
|
+
// return in case we don't have any listing objects.
|
|
101
|
+
// that's the case when we don't have the `listingPrices` included.
|
|
102
|
+
if (listingObjects.length === 0) return acc;
|
|
103
|
+
|
|
104
|
+
const content = listingObjects[idx].data?.content;
|
|
105
|
+
const data = content?.dataType === 'moveObject' ? content?.fields : null;
|
|
106
|
+
|
|
107
|
+
if (!data) return acc;
|
|
108
|
+
|
|
109
|
+
acc[item.objectId].price = (data as { value: string }).value;
|
|
110
|
+
return acc;
|
|
111
|
+
},
|
|
112
|
+
{},
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
kioskData.items.forEach((item) => {
|
|
116
|
+
item.listing = itemListings[item.objectId] || undefined;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* A helper that attaches the listing prices to kiosk listings.
|
|
122
|
+
*/
|
|
123
|
+
export function attachObjects(kioskData: KioskData, objects: HaneulObjectData[]) {
|
|
124
|
+
const mapping = objects.reduce<Record<string, HaneulObjectData>>(
|
|
125
|
+
(acc: Record<string, HaneulObjectData>, obj) => {
|
|
126
|
+
acc[obj.objectId] = obj;
|
|
127
|
+
return acc;
|
|
128
|
+
},
|
|
129
|
+
{},
|
|
130
|
+
);
|
|
131
|
+
|
|
132
|
+
kioskData.items.forEach((item) => {
|
|
133
|
+
item.data = mapping[item.objectId] || undefined;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* A Helper to attach locked state to items in Kiosk Data.
|
|
139
|
+
*/
|
|
140
|
+
export function attachLockedItems(kioskData: KioskData, lockedItemIds: string[]) {
|
|
141
|
+
// map lock status in an array of type { item_id: true }
|
|
142
|
+
const lockedStatuses = lockedItemIds.reduce<Record<string, boolean>>(
|
|
143
|
+
(acc: Record<string, boolean>, item: string) => {
|
|
144
|
+
acc[item] = true;
|
|
145
|
+
return acc;
|
|
146
|
+
},
|
|
147
|
+
{},
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
// parse lockedItemIds and attach their locked status.
|
|
151
|
+
kioskData.items.forEach((item) => {
|
|
152
|
+
item.isLocked = lockedStatuses[item.objectId] || false;
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* A helper to fetch all DF pages.
|
|
158
|
+
* We need that to fetch the kiosk DFs consistently, until we have
|
|
159
|
+
* RPC calls that allow filtering of Type / batch fetching of spec
|
|
160
|
+
*/
|
|
161
|
+
export async function getAllDynamicFields(
|
|
162
|
+
client: HaneulClient,
|
|
163
|
+
parentId: string,
|
|
164
|
+
pagination: PaginationArguments<string>,
|
|
165
|
+
) {
|
|
166
|
+
let hasNextPage = true;
|
|
167
|
+
let cursor = undefined;
|
|
168
|
+
const data: DynamicFieldInfo[] = [];
|
|
169
|
+
|
|
170
|
+
while (hasNextPage) {
|
|
171
|
+
const result = await client.getDynamicFields({
|
|
172
|
+
parentId,
|
|
173
|
+
limit: pagination.limit || undefined,
|
|
174
|
+
cursor,
|
|
175
|
+
});
|
|
176
|
+
data.push(...result.data);
|
|
177
|
+
hasNextPage = result.hasNextPage;
|
|
178
|
+
cursor = result.nextCursor;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
return data;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* A helper to fetch all objects that works with pagination.
|
|
186
|
+
* It will fetch all objects in the array, and limit it to 50/request.
|
|
187
|
+
* Requests are sent using `Promise.all`.
|
|
188
|
+
*/
|
|
189
|
+
export async function getAllObjects(
|
|
190
|
+
client: HaneulClient,
|
|
191
|
+
ids: string[],
|
|
192
|
+
options: HaneulObjectDataOptions,
|
|
193
|
+
limit: number = DEFAULT_QUERY_LIMIT,
|
|
194
|
+
) {
|
|
195
|
+
const chunks = chunk(ids, limit);
|
|
196
|
+
|
|
197
|
+
const results = await Promise.all(
|
|
198
|
+
chunks.map((chunk) => {
|
|
199
|
+
return client.multiGetObjects({
|
|
200
|
+
ids: chunk,
|
|
201
|
+
options,
|
|
202
|
+
});
|
|
203
|
+
}),
|
|
204
|
+
);
|
|
205
|
+
|
|
206
|
+
return results.flat();
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* A helper to return all owned objects, with an optional filter.
|
|
211
|
+
* It parses all the pages and returns the data.
|
|
212
|
+
*/
|
|
213
|
+
export async function getAllOwnedObjects({
|
|
214
|
+
client,
|
|
215
|
+
owner,
|
|
216
|
+
filter,
|
|
217
|
+
limit = DEFAULT_QUERY_LIMIT,
|
|
218
|
+
options = { showType: true, showContent: true },
|
|
219
|
+
}: {
|
|
220
|
+
client: HaneulClient;
|
|
221
|
+
owner: string;
|
|
222
|
+
filter?: HaneulObjectDataFilter;
|
|
223
|
+
options?: HaneulObjectDataOptions;
|
|
224
|
+
limit?: number;
|
|
225
|
+
}) {
|
|
226
|
+
let hasNextPage = true;
|
|
227
|
+
let cursor = undefined;
|
|
228
|
+
const data: HaneulObjectResponse[] = [];
|
|
229
|
+
|
|
230
|
+
while (hasNextPage) {
|
|
231
|
+
const result = await client.getOwnedObjects({
|
|
232
|
+
owner,
|
|
233
|
+
filter,
|
|
234
|
+
limit,
|
|
235
|
+
cursor,
|
|
236
|
+
options,
|
|
237
|
+
});
|
|
238
|
+
data.push(...result.data);
|
|
239
|
+
hasNextPage = result.hasNextPage;
|
|
240
|
+
cursor = result.nextCursor;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return data;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Converts a number to basis points.
|
|
248
|
+
* Supports up to 2 decimal points.
|
|
249
|
+
* E.g 9.95 -> 995
|
|
250
|
+
* @param percentage A percentage amount in the range [0, 100] including decimals.
|
|
251
|
+
*/
|
|
252
|
+
export function percentageToBasisPoints(percentage: number) {
|
|
253
|
+
if (percentage < 0 || percentage > 100)
|
|
254
|
+
throw new Error('Percentage needs to be in the [0,100] range.');
|
|
255
|
+
return Math.ceil(percentage * 100);
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* A helper to parse a transfer policy Cap into a usable object.
|
|
260
|
+
*/
|
|
261
|
+
export function parseTransferPolicyCapObject(
|
|
262
|
+
item: HaneulObjectResponse,
|
|
263
|
+
): TransferPolicyCap | undefined {
|
|
264
|
+
const type = (item?.data?.content as { type: string })?.type;
|
|
265
|
+
|
|
266
|
+
//@ts-ignore-next-line
|
|
267
|
+
const policy = item?.data?.content?.fields?.policy_id as string;
|
|
268
|
+
|
|
269
|
+
if (!type.includes(TRANSFER_POLICY_CAP_TYPE)) return undefined;
|
|
270
|
+
|
|
271
|
+
// Transform 0x2::transfer_policy::TransferPolicyCap<itemType> -> itemType
|
|
272
|
+
const objectType = type.replace(TRANSFER_POLICY_CAP_TYPE + '<', '').slice(0, -1);
|
|
273
|
+
|
|
274
|
+
return {
|
|
275
|
+
policyId: policy,
|
|
276
|
+
policyCapId: item.data?.objectId!,
|
|
277
|
+
type: objectType,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Normalizes the packageId part of a rule's type.
|
|
282
|
+
export function getNormalizedRuleType(rule: string) {
|
|
283
|
+
const normalizedRuleAddress = rule.split('::');
|
|
284
|
+
normalizedRuleAddress[0] = normalizeHaneulAddress(normalizedRuleAddress[0]);
|
|
285
|
+
return normalizedRuleAddress.join('::');
|
|
286
|
+
}
|