@iota/kiosk 0.0.0-dev-20251015065834
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 +198 -0
- package/LICENSE +201 -0
- package/README.md +39 -0
- package/dist/cjs/bcs.d.ts +38 -0
- package/dist/cjs/bcs.js +49 -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 +126 -0
- package/dist/cjs/client/kiosk-client.js.map +7 -0
- package/dist/cjs/client/kiosk-transaction.d.ts +185 -0
- package/dist/cjs/client/kiosk-transaction.js +473 -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 +312 -0
- package/dist/cjs/client/tp-transaction.js.map +7 -0
- package/dist/cjs/constants.d.ts +24 -0
- package/dist/cjs/constants.js +66 -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 +14 -0
- package/dist/cjs/query/kiosk.js +129 -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 +94 -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 +79 -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 +17 -0
- package/dist/cjs/types/index.js +20 -0
- package/dist/cjs/types/index.js.map +7 -0
- package/dist/cjs/types/kiosk.d.ts +159 -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 +51 -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 +201 -0
- package/dist/cjs/utils.js.map +7 -0
- package/dist/esm/bcs.d.ts +38 -0
- package/dist/esm/bcs.js +34 -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 +110 -0
- package/dist/esm/client/kiosk-client.js.map +7 -0
- package/dist/esm/client/kiosk-transaction.d.ts +185 -0
- package/dist/esm/client/kiosk-transaction.js +443 -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 +303 -0
- package/dist/esm/client/tp-transaction.js.map +7 -0
- package/dist/esm/constants.d.ts +24 -0
- package/dist/esm/constants.js +51 -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 +14 -0
- package/dist/esm/query/kiosk.js +117 -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 +78 -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 +59 -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 +17 -0
- package/dist/esm/types/index.js +3 -0
- package/dist/esm/types/index.js.map +7 -0
- package/dist/esm/types/kiosk.d.ts +159 -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 +51 -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 +186 -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 +53 -0
- package/src/bcs.ts +39 -0
- package/src/client/kiosk-client.ts +169 -0
- package/src/client/kiosk-transaction.ts +538 -0
- package/src/client/tp-transaction.ts +363 -0
- package/src/constants.ts +85 -0
- package/src/index.ts +10 -0
- package/src/query/kiosk.ts +193 -0
- package/src/query/transfer-policy.ts +137 -0
- package/src/tx/kiosk.ts +244 -0
- package/src/tx/personal-kiosk.ts +35 -0
- package/src/tx/rules/attach.ts +74 -0
- package/src/tx/rules/resolve.ts +87 -0
- package/src/tx/transfer-policy.ts +121 -0
- package/src/types/index.ts +25 -0
- package/src/types/kiosk.ts +178 -0
- package/src/types/transfer-policy.ts +70 -0
- package/src/utils.ts +289 -0
|
@@ -0,0 +1,201 @@
|
|
|
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 utils_exports = {};
|
|
20
|
+
__export(utils_exports, {
|
|
21
|
+
attachListingsAndPrices: () => attachListingsAndPrices,
|
|
22
|
+
attachLockedItems: () => attachLockedItems,
|
|
23
|
+
attachObjects: () => attachObjects,
|
|
24
|
+
extractKioskData: () => extractKioskData,
|
|
25
|
+
getAllDynamicFields: () => getAllDynamicFields,
|
|
26
|
+
getAllObjects: () => getAllObjects,
|
|
27
|
+
getAllOwnedObjects: () => getAllOwnedObjects,
|
|
28
|
+
getKioskObject: () => getKioskObject,
|
|
29
|
+
getNormalizedRuleType: () => getNormalizedRuleType,
|
|
30
|
+
parseTransferPolicyCapObject: () => parseTransferPolicyCapObject,
|
|
31
|
+
percentageToBasisPoints: () => percentageToBasisPoints
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(utils_exports);
|
|
34
|
+
var import_utils = require("@iota/iota-sdk/utils");
|
|
35
|
+
var import_bcs = require("./bcs.js");
|
|
36
|
+
var import_types = require("./types/index.js");
|
|
37
|
+
const DEFAULT_QUERY_LIMIT = 50;
|
|
38
|
+
async function getKioskObject(client, id) {
|
|
39
|
+
const queryRes = await client.getObject({ id, options: { showBcs: true } });
|
|
40
|
+
if (!queryRes || queryRes.error || !queryRes.data) {
|
|
41
|
+
throw new Error(`Kiosk ${id} not found; ${queryRes.error}`);
|
|
42
|
+
}
|
|
43
|
+
if (!queryRes.data.bcs || !("bcsBytes" in queryRes.data.bcs)) {
|
|
44
|
+
throw new Error(`Invalid kiosk query: ${id}, expected object, got package`);
|
|
45
|
+
}
|
|
46
|
+
return import_bcs.KioskType.parse((0, import_utils.fromBase64)(queryRes.data.bcs.bcsBytes));
|
|
47
|
+
}
|
|
48
|
+
function extractKioskData(data, listings, lockedItemIds, kioskId) {
|
|
49
|
+
return data.reduce(
|
|
50
|
+
(acc, val) => {
|
|
51
|
+
const type = val.name.type;
|
|
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.id,
|
|
65
|
+
listingId: val.objectId,
|
|
66
|
+
isExclusive: val.name.value.is_exclusive
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
if (type.startsWith("0x2::kiosk::Lock")) {
|
|
70
|
+
lockedItemIds?.push(val.name.value.id);
|
|
71
|
+
}
|
|
72
|
+
if (type.startsWith("0x2::kiosk_extension::ExtensionKey")) {
|
|
73
|
+
acc.extensions.push({
|
|
74
|
+
objectId: val.objectId,
|
|
75
|
+
type: (0, import_utils.normalizeStructTag)((0, import_utils.parseStructTag)(val.name.type).typeParams[0])
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return acc;
|
|
79
|
+
},
|
|
80
|
+
{ items: [], itemIds: [], listingIds: [], extensions: [] }
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
function attachListingsAndPrices(kioskData, listings, listingObjects) {
|
|
84
|
+
const itemListings = listings.reduce(
|
|
85
|
+
(acc, item, idx) => {
|
|
86
|
+
acc[item.objectId] = { ...item };
|
|
87
|
+
if (listingObjects.length === 0) return acc;
|
|
88
|
+
const content = listingObjects[idx].data?.content;
|
|
89
|
+
const data = content?.dataType === "moveObject" ? content?.fields : null;
|
|
90
|
+
if (!data) return acc;
|
|
91
|
+
acc[item.objectId].price = data.value;
|
|
92
|
+
return acc;
|
|
93
|
+
},
|
|
94
|
+
{}
|
|
95
|
+
);
|
|
96
|
+
kioskData.items.forEach((item) => {
|
|
97
|
+
item.listing = itemListings[item.objectId] || void 0;
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
function attachObjects(kioskData, objects) {
|
|
101
|
+
const mapping = objects.reduce(
|
|
102
|
+
(acc, obj) => {
|
|
103
|
+
acc[obj.objectId] = obj;
|
|
104
|
+
return acc;
|
|
105
|
+
},
|
|
106
|
+
{}
|
|
107
|
+
);
|
|
108
|
+
kioskData.items.forEach((item) => {
|
|
109
|
+
item.data = mapping[item.objectId] || void 0;
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
function attachLockedItems(kioskData, lockedItemIds) {
|
|
113
|
+
const lockedStatuses = lockedItemIds.reduce(
|
|
114
|
+
(acc, item) => {
|
|
115
|
+
acc[item] = true;
|
|
116
|
+
return acc;
|
|
117
|
+
},
|
|
118
|
+
{}
|
|
119
|
+
);
|
|
120
|
+
kioskData.items.forEach((item) => {
|
|
121
|
+
item.isLocked = lockedStatuses[item.objectId] || false;
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
async function getAllDynamicFields(client, parentId, pagination) {
|
|
125
|
+
let hasNextPage = true;
|
|
126
|
+
let cursor = void 0;
|
|
127
|
+
const data = [];
|
|
128
|
+
while (hasNextPage) {
|
|
129
|
+
const result = await client.getDynamicFields({
|
|
130
|
+
parentId,
|
|
131
|
+
limit: pagination.limit || void 0,
|
|
132
|
+
cursor
|
|
133
|
+
});
|
|
134
|
+
data.push(...result.data);
|
|
135
|
+
hasNextPage = result.hasNextPage;
|
|
136
|
+
cursor = result.nextCursor;
|
|
137
|
+
}
|
|
138
|
+
return data;
|
|
139
|
+
}
|
|
140
|
+
async function getAllObjects(client, ids, options, limit = DEFAULT_QUERY_LIMIT) {
|
|
141
|
+
const chunks = Array.from(
|
|
142
|
+
{ length: Math.ceil(ids.length / limit) },
|
|
143
|
+
(_, index) => ids.slice(index * limit, index * limit + limit)
|
|
144
|
+
);
|
|
145
|
+
const results = await Promise.all(
|
|
146
|
+
chunks.map((chunk) => {
|
|
147
|
+
return client.multiGetObjects({
|
|
148
|
+
ids: chunk,
|
|
149
|
+
options
|
|
150
|
+
});
|
|
151
|
+
})
|
|
152
|
+
);
|
|
153
|
+
return results.flat();
|
|
154
|
+
}
|
|
155
|
+
async function getAllOwnedObjects({
|
|
156
|
+
client,
|
|
157
|
+
owner,
|
|
158
|
+
filter,
|
|
159
|
+
limit = DEFAULT_QUERY_LIMIT,
|
|
160
|
+
options = { showType: true, showContent: true }
|
|
161
|
+
}) {
|
|
162
|
+
let hasNextPage = true;
|
|
163
|
+
let cursor = void 0;
|
|
164
|
+
const data = [];
|
|
165
|
+
while (hasNextPage) {
|
|
166
|
+
const result = await client.getOwnedObjects({
|
|
167
|
+
owner,
|
|
168
|
+
filter,
|
|
169
|
+
limit,
|
|
170
|
+
cursor,
|
|
171
|
+
options
|
|
172
|
+
});
|
|
173
|
+
data.push(...result.data);
|
|
174
|
+
hasNextPage = result.hasNextPage;
|
|
175
|
+
cursor = result.nextCursor;
|
|
176
|
+
}
|
|
177
|
+
return data;
|
|
178
|
+
}
|
|
179
|
+
function percentageToBasisPoints(percentage) {
|
|
180
|
+
if (percentage < 0 || percentage > 100)
|
|
181
|
+
throw new Error("Percentage needs to be in the [0,100] range.");
|
|
182
|
+
return Math.ceil(percentage * 100);
|
|
183
|
+
}
|
|
184
|
+
function parseTransferPolicyCapObject(item) {
|
|
185
|
+
const type = item?.data?.content?.type;
|
|
186
|
+
const policy = item?.data?.content?.fields?.policy_id;
|
|
187
|
+
if (!type.includes(import_types.TRANSFER_POLICY_CAP_TYPE)) return void 0;
|
|
188
|
+
const objectType = type.replace(import_types.TRANSFER_POLICY_CAP_TYPE + "<", "").slice(0, -1);
|
|
189
|
+
return {
|
|
190
|
+
policyId: policy,
|
|
191
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain
|
|
192
|
+
policyCapId: item.data?.objectId,
|
|
193
|
+
type: objectType
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
function getNormalizedRuleType(rule) {
|
|
197
|
+
const normalizedRuleAddress = rule.split("::");
|
|
198
|
+
normalizedRuleAddress[0] = (0, import_utils.normalizeIotaAddress)(normalizedRuleAddress[0]);
|
|
199
|
+
return normalizedRuleAddress.join("::");
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// Modifications Copyright (c) 2024 IOTA Stiftung\n// SPDX-License-Identifier: Apache-2.0\n\nimport type {\n DynamicFieldInfo,\n PaginationArguments,\n IotaClient,\n IotaObjectData,\n IotaObjectDataFilter,\n IotaObjectDataOptions,\n IotaObjectResponse,\n} from '@iota/iota-sdk/client';\nimport {\n fromBase64,\n normalizeStructTag,\n normalizeIotaAddress,\n parseStructTag,\n} from '@iota/iota-sdk/utils';\n\nimport { KioskType } from './bcs.js';\nimport type { Kiosk, KioskData, KioskListing, TransferPolicyCap } from './types/index.js';\nimport { TRANSFER_POLICY_CAP_TYPE } from './types/index.js';\n\nconst DEFAULT_QUERY_LIMIT = 50;\n\nexport async function getKioskObject(client: IotaClient, id: string): Promise<Kiosk> {\n const queryRes = await client.getObject({ id, options: { showBcs: true } });\n\n if (!queryRes || queryRes.error || !queryRes.data) {\n throw new Error(`Kiosk ${id} not found; ${queryRes.error}`);\n }\n\n if (!queryRes.data.bcs || !('bcsBytes' in queryRes.data.bcs)) {\n throw new Error(`Invalid kiosk query: ${id}, expected object, got package`);\n }\n\n return KioskType.parse(fromBase64(queryRes.data.bcs!.bcsBytes));\n}\n\n// helper to extract kiosk data from dynamic fields.\nexport function extractKioskData(\n data: DynamicFieldInfo[],\n listings: KioskListing[],\n lockedItemIds: string[],\n kioskId: string,\n): KioskData {\n return data.reduce<KioskData>(\n (acc: KioskData, val: DynamicFieldInfo) => {\n const type = val.name.type;\n\n if (type.startsWith('0x2::kiosk::Item')) {\n acc.itemIds.push(val.objectId);\n acc.items.push({\n objectId: val.objectId,\n type: val.objectType,\n isLocked: false,\n kioskId,\n });\n }\n if (type.startsWith('0x2::kiosk::Listing')) {\n acc.listingIds.push(val.objectId);\n listings.push({\n objectId: (val.name.value as { id: string }).id,\n listingId: val.objectId,\n isExclusive: (val.name.value as { is_exclusive: boolean }).is_exclusive,\n });\n }\n if (type.startsWith('0x2::kiosk::Lock')) {\n lockedItemIds?.push((val.name.value as { id: string }).id);\n }\n\n if (type.startsWith('0x2::kiosk_extension::ExtensionKey')) {\n acc.extensions.push({\n objectId: val.objectId,\n type: normalizeStructTag(parseStructTag(val.name.type).typeParams[0]),\n });\n }\n\n return acc;\n },\n { items: [], itemIds: [], listingIds: [], extensions: [] },\n );\n}\n\n/**\n * A helper that attaches the listing prices to kiosk listings.\n */\nexport function attachListingsAndPrices(\n kioskData: KioskData,\n listings: KioskListing[],\n listingObjects: IotaObjectResponse[],\n) {\n // map item listings as {item_id: KioskListing}\n // for easier mapping on the nex\n const itemListings = listings.reduce<Record<string, KioskListing>>(\n (acc: Record<string, KioskListing>, item, idx) => {\n acc[item.objectId] = { ...item };\n\n // return in case we don't have any listing objects.\n // that's the case when we don't have the `listingPrices` included.\n if (listingObjects.length === 0) return acc;\n\n const content = listingObjects[idx].data?.content;\n const data = content?.dataType === 'moveObject' ? content?.fields : null;\n\n if (!data) return acc;\n\n acc[item.objectId].price = (data as { value: string }).value;\n return acc;\n },\n {},\n );\n\n kioskData.items.forEach((item) => {\n item.listing = itemListings[item.objectId] || undefined;\n });\n}\n\n/**\n * A helper that attaches the listing prices to kiosk listings.\n */\nexport function attachObjects(kioskData: KioskData, objects: IotaObjectData[]) {\n const mapping = objects.reduce<Record<string, IotaObjectData>>(\n (acc: Record<string, IotaObjectData>, obj) => {\n acc[obj.objectId] = obj;\n return acc;\n },\n {},\n );\n\n kioskData.items.forEach((item) => {\n item.data = mapping[item.objectId] || undefined;\n });\n}\n\n/**\n * A Helper to attach locked state to items in Kiosk Data.\n */\nexport function attachLockedItems(kioskData: KioskData, lockedItemIds: string[]) {\n // map lock status in an array of type { item_id: true }\n const lockedStatuses = lockedItemIds.reduce<Record<string, boolean>>(\n (acc: Record<string, boolean>, item: string) => {\n acc[item] = true;\n return acc;\n },\n {},\n );\n\n // parse lockedItemIds and attach their locked status.\n kioskData.items.forEach((item) => {\n item.isLocked = lockedStatuses[item.objectId] || false;\n });\n}\n\n/**\n * A helper to fetch all DF pages.\n * We need that to fetch the kiosk DFs consistently, until we have\n * RPC calls that allow filtering of Type / batch fetching of spec\n */\nexport async function getAllDynamicFields(\n client: IotaClient,\n parentId: string,\n pagination: PaginationArguments<string>,\n) {\n let hasNextPage = true;\n let cursor = undefined;\n const data: DynamicFieldInfo[] = [];\n\n while (hasNextPage) {\n const result = await client.getDynamicFields({\n parentId,\n limit: pagination.limit || undefined,\n cursor,\n });\n data.push(...result.data);\n hasNextPage = result.hasNextPage;\n cursor = result.nextCursor;\n }\n\n return data;\n}\n\n/**\n * A helper to fetch all objects that works with pagination.\n * It will fetch all objects in the array, and limit it to 50/request.\n * Requests are sent using `Promise.all`.\n */\nexport async function getAllObjects(\n client: IotaClient,\n ids: string[],\n options: IotaObjectDataOptions,\n limit: number = DEFAULT_QUERY_LIMIT,\n) {\n const chunks = Array.from({ length: Math.ceil(ids.length / limit) }, (_, index) =>\n ids.slice(index * limit, index * limit + limit),\n );\n\n const results = await Promise.all(\n chunks.map((chunk) => {\n return client.multiGetObjects({\n ids: chunk,\n options,\n });\n }),\n );\n\n return results.flat();\n}\n\n/**\n * A helper to return all owned objects, with an optional filter.\n * It parses all the pages and returns the data.\n */\nexport async function getAllOwnedObjects({\n client,\n owner,\n filter,\n limit = DEFAULT_QUERY_LIMIT,\n options = { showType: true, showContent: true },\n}: {\n client: IotaClient;\n owner: string;\n filter?: IotaObjectDataFilter;\n options?: IotaObjectDataOptions;\n limit?: number;\n}) {\n let hasNextPage = true;\n let cursor = undefined;\n const data: IotaObjectResponse[] = [];\n\n while (hasNextPage) {\n const result = await client.getOwnedObjects({\n owner,\n filter,\n limit,\n cursor,\n options,\n });\n data.push(...result.data);\n hasNextPage = result.hasNextPage;\n cursor = result.nextCursor;\n }\n\n return data;\n}\n\n/**\n * Converts a number to basis points.\n * Supports up to 2 decimal points.\n * E.g 9.95 -> 995\n * @param percentage A percentage amount in the range [0, 100] including decimals.\n */\nexport function percentageToBasisPoints(percentage: number) {\n if (percentage < 0 || percentage > 100)\n throw new Error('Percentage needs to be in the [0,100] range.');\n return Math.ceil(percentage * 100);\n}\n\n/**\n * A helper to parse a transfer policy Cap into a usable object.\n */\nexport function parseTransferPolicyCapObject(\n item: IotaObjectResponse,\n): TransferPolicyCap | undefined {\n const type = (item?.data?.content as { type: string })?.type;\n\n //@ts-expect-error Silencing error here\n const policy = item?.data?.content?.fields?.policy_id as string;\n\n if (!type.includes(TRANSFER_POLICY_CAP_TYPE)) return undefined;\n\n // Transform 0x2::transfer_policy::TransferPolicyCap<itemType> -> itemType\n const objectType = type.replace(TRANSFER_POLICY_CAP_TYPE + '<', '').slice(0, -1);\n\n return {\n policyId: policy,\n // eslint-disable-next-line @typescript-eslint/no-non-null-asserted-optional-chain\n policyCapId: item.data?.objectId!,\n type: objectType,\n };\n}\n\n// Normalizes the packageId part of a rule's type.\nexport function getNormalizedRuleType(rule: string) {\n const normalizedRuleAddress = rule.split('::');\n normalizedRuleAddress[0] = normalizeIotaAddress(normalizedRuleAddress[0]);\n return normalizedRuleAddress.join('::');\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export declare const KioskType: import("@iota/iota-sdk/bcs").BcsType<{
|
|
2
|
+
id: string;
|
|
3
|
+
profits: string;
|
|
4
|
+
owner: string;
|
|
5
|
+
itemCount: number;
|
|
6
|
+
}, {
|
|
7
|
+
id: string | Uint8Array;
|
|
8
|
+
profits: string | number | bigint;
|
|
9
|
+
owner: string | Uint8Array;
|
|
10
|
+
itemCount: number;
|
|
11
|
+
}>;
|
|
12
|
+
export declare const KioskPurchaseCap: import("@iota/iota-sdk/bcs").BcsType<{
|
|
13
|
+
id: string;
|
|
14
|
+
kioskId: string;
|
|
15
|
+
itemId: string;
|
|
16
|
+
minPrice: string;
|
|
17
|
+
}, {
|
|
18
|
+
id: string | Uint8Array;
|
|
19
|
+
kioskId: string | Uint8Array;
|
|
20
|
+
itemId: string | Uint8Array;
|
|
21
|
+
minPrice: string | number | bigint;
|
|
22
|
+
}>;
|
|
23
|
+
export declare const TransferPolicyCreatedEvent: import("@iota/iota-sdk/bcs").BcsType<{
|
|
24
|
+
id: string;
|
|
25
|
+
}, {
|
|
26
|
+
id: string | Uint8Array;
|
|
27
|
+
}>;
|
|
28
|
+
export declare const TransferPolicyType: import("@iota/iota-sdk/bcs").BcsType<{
|
|
29
|
+
id: string;
|
|
30
|
+
balance: string;
|
|
31
|
+
rules: string[];
|
|
32
|
+
}, {
|
|
33
|
+
id: string | Uint8Array;
|
|
34
|
+
balance: string | number | bigint;
|
|
35
|
+
rules: Iterable<string> & {
|
|
36
|
+
length: number;
|
|
37
|
+
};
|
|
38
|
+
}>;
|
package/dist/esm/bcs.js
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { bcs } from "@iota/iota-sdk/bcs";
|
|
2
|
+
import {
|
|
3
|
+
KIOSK_PURCHASE_CAP,
|
|
4
|
+
KIOSK_TYPE,
|
|
5
|
+
TRANSFER_POLICY_CREATED_EVENT,
|
|
6
|
+
TRANSFER_POLICY_TYPE
|
|
7
|
+
} from "./types/index.js";
|
|
8
|
+
const KioskType = bcs.struct(KIOSK_TYPE, {
|
|
9
|
+
id: bcs.Address,
|
|
10
|
+
profits: bcs.u64(),
|
|
11
|
+
owner: bcs.Address,
|
|
12
|
+
itemCount: bcs.u32()
|
|
13
|
+
});
|
|
14
|
+
const KioskPurchaseCap = bcs.struct(KIOSK_PURCHASE_CAP, {
|
|
15
|
+
id: bcs.Address,
|
|
16
|
+
kioskId: bcs.Address,
|
|
17
|
+
itemId: bcs.Address,
|
|
18
|
+
minPrice: bcs.u64()
|
|
19
|
+
});
|
|
20
|
+
const TransferPolicyCreatedEvent = bcs.struct(TRANSFER_POLICY_CREATED_EVENT, {
|
|
21
|
+
id: bcs.Address
|
|
22
|
+
});
|
|
23
|
+
const TransferPolicyType = bcs.struct(TRANSFER_POLICY_TYPE, {
|
|
24
|
+
id: bcs.Address,
|
|
25
|
+
balance: bcs.u64(),
|
|
26
|
+
rules: bcs.vector(bcs.string())
|
|
27
|
+
});
|
|
28
|
+
export {
|
|
29
|
+
KioskPurchaseCap,
|
|
30
|
+
KioskType,
|
|
31
|
+
TransferPolicyCreatedEvent,
|
|
32
|
+
TransferPolicyType
|
|
33
|
+
};
|
|
34
|
+
//# sourceMappingURL=bcs.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/bcs.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// Modifications Copyright (c) 2024 IOTA Stiftung\n// SPDX-License-Identifier: Apache-2.0\n\nimport { bcs } from '@iota/iota-sdk/bcs';\n\nimport {\n KIOSK_PURCHASE_CAP,\n KIOSK_TYPE,\n TRANSFER_POLICY_CREATED_EVENT,\n TRANSFER_POLICY_TYPE,\n} from './types/index.js';\n\n// Register the `Kiosk` struct for faster queries.\nexport const KioskType = bcs.struct(KIOSK_TYPE, {\n id: bcs.Address,\n profits: bcs.u64(),\n owner: bcs.Address,\n itemCount: bcs.u32(),\n});\n\n// Register the `PurchaseCap` for faster queries.\nexport const KioskPurchaseCap = bcs.struct(KIOSK_PURCHASE_CAP, {\n id: bcs.Address,\n kioskId: bcs.Address,\n itemId: bcs.Address,\n minPrice: bcs.u64(),\n});\n\n// Register the `TransferPolicyCreated` event data.\nexport const TransferPolicyCreatedEvent = bcs.struct(TRANSFER_POLICY_CREATED_EVENT, {\n id: bcs.Address,\n});\n\nexport const TransferPolicyType = bcs.struct(TRANSFER_POLICY_TYPE, {\n id: bcs.Address,\n balance: bcs.u64(),\n rules: bcs.vector(bcs.string()),\n});\n"],
|
|
5
|
+
"mappings": "AAIA,SAAS,WAAW;AAEpB;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACG;AAGA,MAAM,YAAY,IAAI,OAAO,YAAY;AAAA,EAC5C,IAAI,IAAI;AAAA,EACR,SAAS,IAAI,IAAI;AAAA,EACjB,OAAO,IAAI;AAAA,EACX,WAAW,IAAI,IAAI;AACvB,CAAC;AAGM,MAAM,mBAAmB,IAAI,OAAO,oBAAoB;AAAA,EAC3D,IAAI,IAAI;AAAA,EACR,SAAS,IAAI;AAAA,EACb,QAAQ,IAAI;AAAA,EACZ,UAAU,IAAI,IAAI;AACtB,CAAC;AAGM,MAAM,6BAA6B,IAAI,OAAO,+BAA+B;AAAA,EAChF,IAAI,IAAI;AACZ,CAAC;AAEM,MAAM,qBAAqB,IAAI,OAAO,sBAAsB;AAAA,EAC/D,IAAI,IAAI;AAAA,EACR,SAAS,IAAI,IAAI;AAAA,EACjB,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC;AAClC,CAAC;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { NetworkId } from '@iota/iota-sdk/client';
|
|
2
|
+
import type { PaginationArguments, IotaClient } from '@iota/iota-sdk/client';
|
|
3
|
+
import type { BaseRulePackageIds, TransferPolicyRule } from '../constants.js';
|
|
4
|
+
import type { FetchKioskOptions, KioskClientOptions, KioskData, OwnedKiosks } from '../types/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* A Client that allows you to interact with kiosk.
|
|
7
|
+
* Offers utilities to query kiosk, craft transactions to edit your own kiosk,
|
|
8
|
+
* purchase, manage transfer policies, create new kiosks etc.
|
|
9
|
+
* If you pass packageIds, all functionality will be managed using these packages.
|
|
10
|
+
*/
|
|
11
|
+
export declare class KioskClient {
|
|
12
|
+
client: IotaClient;
|
|
13
|
+
network: NetworkId;
|
|
14
|
+
rules: TransferPolicyRule[];
|
|
15
|
+
packageIds?: BaseRulePackageIds;
|
|
16
|
+
constructor(options: KioskClientOptions);
|
|
17
|
+
/**
|
|
18
|
+
* Get an addresses's owned kiosks.
|
|
19
|
+
* @param address The address for which we want to retrieve the kiosks.
|
|
20
|
+
* @param pagination Optional pagination arguments.
|
|
21
|
+
* @returns An Object containing all the `kioskOwnerCap` objects as well as the kioskIds.
|
|
22
|
+
*/
|
|
23
|
+
getOwnedKiosks({ address, pagination, }: {
|
|
24
|
+
address: string;
|
|
25
|
+
pagination?: PaginationArguments<string>;
|
|
26
|
+
}): Promise<OwnedKiosks>;
|
|
27
|
+
/**
|
|
28
|
+
* Fetches the kiosk contents.
|
|
29
|
+
* @param id The ID of the kiosk to fetch.
|
|
30
|
+
* @param options Optional to control the fetch behavior.
|
|
31
|
+
* @returns
|
|
32
|
+
*/
|
|
33
|
+
getKiosk({ id, options, }: {
|
|
34
|
+
id: string;
|
|
35
|
+
options?: FetchKioskOptions;
|
|
36
|
+
}): Promise<KioskData>;
|
|
37
|
+
/**
|
|
38
|
+
* Fetch the extension data (if any) for a kiosk, by type
|
|
39
|
+
* @param kioskId The ID of the kiosk to lookup
|
|
40
|
+
* @param extensionType The Type of the extension (can be used from by using the type returned by `getKiosk()`)
|
|
41
|
+
*/
|
|
42
|
+
getKioskExtension({ kioskId, type }: {
|
|
43
|
+
kioskId: string;
|
|
44
|
+
type: string;
|
|
45
|
+
}): Promise<import("../types/kiosk.js").KioskExtension | null>;
|
|
46
|
+
/**
|
|
47
|
+
* Query the Transfer Policy(ies) for type `T`.
|
|
48
|
+
* @param type The Type we're querying for (E.g `0xMyAddress::hero::Hero`)
|
|
49
|
+
*/
|
|
50
|
+
getTransferPolicies({ type }: {
|
|
51
|
+
type: string;
|
|
52
|
+
}): Promise<import("../types/transfer-policy.js").TransferPolicy[]>;
|
|
53
|
+
/**
|
|
54
|
+
* Query all the owned transfer policies for an address.
|
|
55
|
+
* Returns `TransferPolicyCap` which uncludes `policyId, policyCapId, type`.
|
|
56
|
+
* @param address The address we're searching the owned transfer policies for.
|
|
57
|
+
*/
|
|
58
|
+
getOwnedTransferPolicies({ address }: {
|
|
59
|
+
address: string;
|
|
60
|
+
}): Promise<import("../types/transfer-policy.js").TransferPolicyCap[] | undefined>;
|
|
61
|
+
/**
|
|
62
|
+
* Query the Transfer Policy Cap for type `T`, owned by `address`
|
|
63
|
+
* @param type The Type `T` for the object
|
|
64
|
+
* @param address The address that owns the cap.
|
|
65
|
+
*/
|
|
66
|
+
getOwnedTransferPoliciesByType({ type, address }: {
|
|
67
|
+
type: string;
|
|
68
|
+
address: string;
|
|
69
|
+
}): Promise<import("../types/transfer-policy.js").TransferPolicyCap[]>;
|
|
70
|
+
addRuleResolver(rule: TransferPolicyRule): void;
|
|
71
|
+
/**
|
|
72
|
+
* A convenient helper to get the packageIds for our supported ruleset,
|
|
73
|
+
* based on `kioskClient` configuration.
|
|
74
|
+
*/
|
|
75
|
+
getRulePackageId(rule: 'kioskLockRulePackageId' | 'royaltyRulePackageId' | 'personalKioskRulePackageId' | 'floorPriceRulePackageId'): string;
|
|
76
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { getNetwork } from "@iota/iota-sdk/client";
|
|
2
|
+
import { getBaseRules, rules } from "../constants.js";
|
|
3
|
+
import { fetchKiosk, fetchKioskExtension, getOwnedKiosks } from "../query/kiosk.js";
|
|
4
|
+
import {
|
|
5
|
+
queryOwnedTransferPolicies,
|
|
6
|
+
queryTransferPolicy,
|
|
7
|
+
queryTransferPolicyCapsByType
|
|
8
|
+
} from "../query/transfer-policy.js";
|
|
9
|
+
class KioskClient {
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.client = options.client;
|
|
12
|
+
this.network = options.network;
|
|
13
|
+
this.rules = rules;
|
|
14
|
+
this.packageIds = options.packageIds;
|
|
15
|
+
if (options.packageIds) this.rules.push(...getBaseRules(options.packageIds));
|
|
16
|
+
}
|
|
17
|
+
/// Querying
|
|
18
|
+
/**
|
|
19
|
+
* Get an addresses's owned kiosks.
|
|
20
|
+
* @param address The address for which we want to retrieve the kiosks.
|
|
21
|
+
* @param pagination Optional pagination arguments.
|
|
22
|
+
* @returns An Object containing all the `kioskOwnerCap` objects as well as the kioskIds.
|
|
23
|
+
*/
|
|
24
|
+
async getOwnedKiosks({
|
|
25
|
+
address,
|
|
26
|
+
pagination
|
|
27
|
+
}) {
|
|
28
|
+
const personalPackageId = this.packageIds?.personalKioskRulePackageId || getNetwork(this.network).kiosk?.personalKioskRulePackageId || "";
|
|
29
|
+
return getOwnedKiosks(this.client, address, {
|
|
30
|
+
pagination,
|
|
31
|
+
personalKioskType: personalPackageId ? `${personalPackageId}::personal_kiosk::PersonalKioskCap` : ""
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Fetches the kiosk contents.
|
|
36
|
+
* @param id The ID of the kiosk to fetch.
|
|
37
|
+
* @param options Optional to control the fetch behavior.
|
|
38
|
+
* @returns
|
|
39
|
+
*/
|
|
40
|
+
async getKiosk({
|
|
41
|
+
id,
|
|
42
|
+
options
|
|
43
|
+
}) {
|
|
44
|
+
return (await fetchKiosk(
|
|
45
|
+
this.client,
|
|
46
|
+
id,
|
|
47
|
+
{
|
|
48
|
+
limit: 1e3
|
|
49
|
+
},
|
|
50
|
+
options || {}
|
|
51
|
+
)).data;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Fetch the extension data (if any) for a kiosk, by type
|
|
55
|
+
* @param kioskId The ID of the kiosk to lookup
|
|
56
|
+
* @param extensionType The Type of the extension (can be used from by using the type returned by `getKiosk()`)
|
|
57
|
+
*/
|
|
58
|
+
async getKioskExtension({ kioskId, type }) {
|
|
59
|
+
return fetchKioskExtension(this.client, kioskId, type);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Query the Transfer Policy(ies) for type `T`.
|
|
63
|
+
* @param type The Type we're querying for (E.g `0xMyAddress::hero::Hero`)
|
|
64
|
+
*/
|
|
65
|
+
async getTransferPolicies({ type }) {
|
|
66
|
+
return queryTransferPolicy(this.client, type);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Query all the owned transfer policies for an address.
|
|
70
|
+
* Returns `TransferPolicyCap` which uncludes `policyId, policyCapId, type`.
|
|
71
|
+
* @param address The address we're searching the owned transfer policies for.
|
|
72
|
+
*/
|
|
73
|
+
async getOwnedTransferPolicies({ address }) {
|
|
74
|
+
return queryOwnedTransferPolicies(this.client, address);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Query the Transfer Policy Cap for type `T`, owned by `address`
|
|
78
|
+
* @param type The Type `T` for the object
|
|
79
|
+
* @param address The address that owns the cap.
|
|
80
|
+
*/
|
|
81
|
+
async getOwnedTransferPoliciesByType({ type, address }) {
|
|
82
|
+
return queryTransferPolicyCapsByType(this.client, address, type);
|
|
83
|
+
}
|
|
84
|
+
// Someone would just have to create a `kiosk-client.ts` file in their project, initialize a KioskClient
|
|
85
|
+
// and call the `addRuleResolver` function. Each rule has a `resolve` function.
|
|
86
|
+
// The resolve function is automatically called on `purchaseAndResolve` function call.
|
|
87
|
+
addRuleResolver(rule) {
|
|
88
|
+
if (this.rules.find((x) => x.rule === rule.rule))
|
|
89
|
+
throw new Error(`Rule ${rule.rule} resolver already exists.`);
|
|
90
|
+
this.rules.push(rule);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* A convenient helper to get the packageIds for our supported ruleset,
|
|
94
|
+
* based on `kioskClient` configuration.
|
|
95
|
+
*/
|
|
96
|
+
getRulePackageId(rule) {
|
|
97
|
+
const rules2 = this.packageIds || {};
|
|
98
|
+
const network = this.network;
|
|
99
|
+
const networkKiosk = getNetwork(network).kiosk;
|
|
100
|
+
const rulePackageId = rules2[rule] || networkKiosk?.[rule];
|
|
101
|
+
if (!rulePackageId) {
|
|
102
|
+
throw new Error(`Missing packageId for rule ${rule}`);
|
|
103
|
+
}
|
|
104
|
+
return rulePackageId;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
export {
|
|
108
|
+
KioskClient
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=kiosk-client.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/client/kiosk-client.ts"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// Modifications Copyright (c) 2024 IOTA Stiftung\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { NetworkId } from '@iota/iota-sdk/client';\nimport { getNetwork } from '@iota/iota-sdk/client';\nimport type { PaginationArguments, IotaClient } from '@iota/iota-sdk/client';\n\nimport { getBaseRules, rules } from '../constants.js';\nimport type { BaseRulePackageIds, TransferPolicyRule } from '../constants.js';\nimport { fetchKiosk, fetchKioskExtension, getOwnedKiosks } from '../query/kiosk.js';\nimport {\n queryOwnedTransferPolicies,\n queryTransferPolicy,\n queryTransferPolicyCapsByType,\n} from '../query/transfer-policy.js';\nimport type {\n FetchKioskOptions,\n KioskClientOptions,\n KioskData,\n OwnedKiosks,\n} from '../types/index.js';\n\n/**\n * A Client that allows you to interact with kiosk.\n * Offers utilities to query kiosk, craft transactions to edit your own kiosk,\n * purchase, manage transfer policies, create new kiosks etc.\n * If you pass packageIds, all functionality will be managed using these packages.\n */\nexport class KioskClient {\n client: IotaClient;\n network: NetworkId;\n rules: TransferPolicyRule[];\n packageIds?: BaseRulePackageIds;\n\n constructor(options: KioskClientOptions) {\n this.client = options.client;\n this.network = options.network;\n this.rules = rules; // add all the default rules.\n this.packageIds = options.packageIds;\n\n // Add the custom Package Ids too on the rule list.\n // Only adds the rules that are passed in the packageId object.\n if (options.packageIds) this.rules.push(...getBaseRules(options.packageIds));\n }\n\n /// Querying\n\n /**\n * Get an addresses's owned kiosks.\n * @param address The address for which we want to retrieve the kiosks.\n * @param pagination Optional pagination arguments.\n * @returns An Object containing all the `kioskOwnerCap` objects as well as the kioskIds.\n */\n async getOwnedKiosks({\n address,\n pagination,\n }: {\n address: string;\n pagination?: PaginationArguments<string>;\n }): Promise<OwnedKiosks> {\n const personalPackageId =\n this.packageIds?.personalKioskRulePackageId ||\n getNetwork(this.network).kiosk?.personalKioskRulePackageId ||\n '';\n\n return getOwnedKiosks(this.client, address, {\n pagination,\n personalKioskType: personalPackageId\n ? `${personalPackageId}::personal_kiosk::PersonalKioskCap`\n : '',\n });\n }\n\n /**\n * Fetches the kiosk contents.\n * @param id The ID of the kiosk to fetch.\n * @param options Optional to control the fetch behavior.\n * @returns\n */\n async getKiosk({\n id,\n options,\n }: {\n id: string;\n options?: FetchKioskOptions;\n }): Promise<KioskData> {\n return (\n await fetchKiosk(\n this.client,\n id,\n {\n limit: 1000,\n },\n options || {},\n )\n ).data;\n }\n\n /**\n * Fetch the extension data (if any) for a kiosk, by type\n * @param kioskId The ID of the kiosk to lookup\n * @param extensionType The Type of the extension (can be used from by using the type returned by `getKiosk()`)\n */\n async getKioskExtension({ kioskId, type }: { kioskId: string; type: string }) {\n return fetchKioskExtension(this.client, kioskId, type);\n }\n\n /**\n * Query the Transfer Policy(ies) for type `T`.\n * @param type The Type we're querying for (E.g `0xMyAddress::hero::Hero`)\n */\n async getTransferPolicies({ type }: { type: string }) {\n return queryTransferPolicy(this.client, type);\n }\n\n /**\n * Query all the owned transfer policies for an address.\n * Returns `TransferPolicyCap` which uncludes `policyId, policyCapId, type`.\n * @param address The address we're searching the owned transfer policies for.\n */\n async getOwnedTransferPolicies({ address }: { address: string }) {\n return queryOwnedTransferPolicies(this.client, address);\n }\n\n /**\n * Query the Transfer Policy Cap for type `T`, owned by `address`\n * @param type The Type `T` for the object\n * @param address The address that owns the cap.\n */\n async getOwnedTransferPoliciesByType({ type, address }: { type: string; address: string }) {\n return queryTransferPolicyCapsByType(this.client, address, type);\n }\n\n // Someone would just have to create a `kiosk-client.ts` file in their project, initialize a KioskClient\n // and call the `addRuleResolver` function. Each rule has a `resolve` function.\n // The resolve function is automatically called on `purchaseAndResolve` function call.\n addRuleResolver(rule: TransferPolicyRule) {\n if (this.rules.find((x) => x.rule === rule.rule))\n throw new Error(`Rule ${rule.rule} resolver already exists.`);\n this.rules.push(rule);\n }\n\n /**\n * A convenient helper to get the packageIds for our supported ruleset,\n * based on `kioskClient` configuration.\n */\n getRulePackageId(\n rule:\n | 'kioskLockRulePackageId'\n | 'royaltyRulePackageId'\n | 'personalKioskRulePackageId'\n | 'floorPriceRulePackageId',\n ) {\n const rules = this.packageIds || {};\n const network = this.network;\n\n const networkKiosk = getNetwork(network).kiosk;\n\n const rulePackageId = rules[rule] || networkKiosk?.[rule];\n\n /// Check existence of rule throw an error if it's not found.\n if (!rulePackageId) {\n throw new Error(`Missing packageId for rule ${rule}`);\n }\n\n return rulePackageId;\n }\n}\n"],
|
|
5
|
+
"mappings": "AAKA,SAAS,kBAAkB;AAG3B,SAAS,cAAc,aAAa;AAEpC,SAAS,YAAY,qBAAqB,sBAAsB;AAChE;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,OACG;AAcA,MAAM,YAAY;AAAA,EAMrB,YAAY,SAA6B;AACrC,SAAK,SAAS,QAAQ;AACtB,SAAK,UAAU,QAAQ;AACvB,SAAK,QAAQ;AACb,SAAK,aAAa,QAAQ;AAI1B,QAAI,QAAQ,WAAY,MAAK,MAAM,KAAK,GAAG,aAAa,QAAQ,UAAU,CAAC;AAAA,EAC/E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM,eAAe;AAAA,IACjB;AAAA,IACA;AAAA,EACJ,GAGyB;AACrB,UAAM,oBACF,KAAK,YAAY,8BACjB,WAAW,KAAK,OAAO,EAAE,OAAO,8BAChC;AAEJ,WAAO,eAAe,KAAK,QAAQ,SAAS;AAAA,MACxC;AAAA,MACA,mBAAmB,oBACb,GAAG,iBAAiB,uCACpB;AAAA,IACV,CAAC;AAAA,EACL;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,SAAS;AAAA,IACX;AAAA,IACA;AAAA,EACJ,GAGuB;AACnB,YACI,MAAM;AAAA,MACF,KAAK;AAAA,MACL;AAAA,MACA;AAAA,QACI,OAAO;AAAA,MACX;AAAA,MACA,WAAW,CAAC;AAAA,IAChB,GACF;AAAA,EACN;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,kBAAkB,EAAE,SAAS,KAAK,GAAsC;AAC1E,WAAO,oBAAoB,KAAK,QAAQ,SAAS,IAAI;AAAA,EACzD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAoB,EAAE,KAAK,GAAqB;AAClD,WAAO,oBAAoB,KAAK,QAAQ,IAAI;AAAA,EAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,yBAAyB,EAAE,QAAQ,GAAwB;AAC7D,WAAO,2BAA2B,KAAK,QAAQ,OAAO;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,+BAA+B,EAAE,MAAM,QAAQ,GAAsC;AACvF,WAAO,8BAA8B,KAAK,QAAQ,SAAS,IAAI;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA,EAKA,gBAAgB,MAA0B;AACtC,QAAI,KAAK,MAAM,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI;AAC3C,YAAM,IAAI,MAAM,QAAQ,KAAK,IAAI,2BAA2B;AAChE,SAAK,MAAM,KAAK,IAAI;AAAA,EACxB;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,iBACI,MAKF;AACE,UAAMA,SAAQ,KAAK,cAAc,CAAC;AAClC,UAAM,UAAU,KAAK;AAErB,UAAM,eAAe,WAAW,OAAO,EAAE;AAEzC,UAAM,gBAAgBA,OAAM,IAAI,KAAK,eAAe,IAAI;AAGxD,QAAI,CAAC,eAAe;AAChB,YAAM,IAAI,MAAM,8BAA8B,IAAI,EAAE;AAAA,IACxD;AAEA,WAAO;AAAA,EACX;AACJ;",
|
|
6
|
+
"names": ["rules"]
|
|
7
|
+
}
|