@gl-36/sdk 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +81 -2
  3. package/dist/account.d.ts +35 -0
  4. package/dist/account.d.ts.map +1 -0
  5. package/dist/account.js +63 -0
  6. package/dist/account.js.map +1 -0
  7. package/dist/constants.d.ts +41 -0
  8. package/dist/constants.d.ts.map +1 -0
  9. package/dist/constants.js +39 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/errors.d.ts +33 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +77 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/index.d.ts +10 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +10 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/instructions.d.ts +27 -0
  20. package/dist/instructions.d.ts.map +1 -0
  21. package/dist/instructions.js +137 -0
  22. package/dist/instructions.js.map +1 -0
  23. package/dist/logs.d.ts +32 -0
  24. package/dist/logs.d.ts.map +1 -0
  25. package/dist/logs.js +63 -0
  26. package/dist/logs.js.map +1 -0
  27. package/dist/pda.d.ts +3 -0
  28. package/dist/pda.d.ts.map +1 -0
  29. package/dist/pda.js +14 -0
  30. package/dist/pda.js.map +1 -0
  31. package/dist/price.d.ts +5 -0
  32. package/dist/price.d.ts.map +1 -0
  33. package/dist/price.js +38 -0
  34. package/dist/price.js.map +1 -0
  35. package/dist/rpc.d.ts +26 -0
  36. package/dist/rpc.d.ts.map +1 -0
  37. package/dist/rpc.js +70 -0
  38. package/dist/rpc.js.map +1 -0
  39. package/dist/seed.d.ts +9 -0
  40. package/dist/seed.d.ts.map +1 -0
  41. package/dist/seed.js +18 -0
  42. package/dist/seed.js.map +1 -0
  43. package/package.json +56 -4
  44. package/src/account.ts +109 -0
  45. package/src/constants.ts +50 -0
  46. package/src/errors.ts +89 -0
  47. package/src/index.ts +9 -0
  48. package/src/instructions.ts +186 -0
  49. package/src/logs.ts +77 -0
  50. package/src/pda.ts +14 -0
  51. package/src/price.ts +39 -0
  52. package/src/rpc.ts +127 -0
  53. package/src/seed.ts +30 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 GL-36 contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,82 @@
1
- # Temporary Holding Version
1
+ # @gl-36/sdk
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ TypeScript SDK for [GL-36](https://gl36.org), an NFT standard for Solana where a token takes 36 bytes: 32 for the owner and 4 for a listing price. A whole collection lives in one program-owned account, so one RPC call reads every token, owner and listing, and trading is built into the program.
4
+
5
+ Built on [`@solana/kit`](https://github.com/anza-xyz/kit). ESM with types, no other dependencies, Node 20.19+ and browsers.
6
+
7
+ > The program has not been audited.
8
+
9
+ ```bash
10
+ npm install @gl-36/sdk @solana/kit
11
+ ```
12
+
13
+ ## Read a collection
14
+
15
+ ```ts
16
+ import { address, createSolanaRpc } from "@solana/kit";
17
+ import { PROGRAM_ID, collectionState, fetchCollection, listedSlots, priceToSol } from "@gl-36/sdk";
18
+
19
+ const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");
20
+ const collection = address("<collection address>");
21
+ const fetched = await fetchCollection(rpc, collection, {
22
+ programId: PROGRAM_ID.mainnet,
23
+ });
24
+ const col = fetched!.collection;
25
+
26
+ console.log(`${col.minted} of ${col.maxSupply} minted, ${collectionState(col)}`);
27
+ for (const slot of listedSlots(col)) console.log(slot.id, slot.owner, priceToSol(slot.price));
28
+ ```
29
+
30
+ ## Mint, list and buy
31
+
32
+ Builders return plain kit `Instruction`s for any transaction pipeline and any Wallet Standard signer.
33
+
34
+ ```ts
35
+ import { buyIx, listIx, mintIx, parseProgramError, solToPrice } from "@gl-36/sdk";
36
+
37
+ const program = PROGRAM_ID.mainnet;
38
+ await send(me, [mintIx(program, me, collection, col.creator, 3)]);
39
+ await send(owner, [listIx(program, owner, collection, 7, solToPrice("0.25"))]);
40
+
41
+ const slot = col.slots[7];
42
+ try {
43
+ await send(buyer, [buyIx(program, buyer, collection, slot.owner, col.treasury, 7, slot.price)]);
44
+ } catch (e) {
45
+ if (parseProgramError(e, { programId: program })?.name === "SellerMismatch") {
46
+ console.log("Sold or moved in the meantime");
47
+ }
48
+ }
49
+ ```
50
+
51
+ `buyIx` takes the seller and the price the buyer saw, so a stale listing fails instead of overpaying.
52
+
53
+ ## API
54
+
55
+ | Area | Exports |
56
+ | --- | --- |
57
+ | Addresses | `PROGRAM_ID`, `SYSTEM_PROGRAM`, `SLOT_HASHES`, `findCollection` |
58
+ | Instructions | `initIx`, `mintIx`, `transferIx`, `listIx`, `buyIx`, `closeIx`, `settleIx`, `withdrawExcessIx`, `INSTRUCTION` |
59
+ | RPC | `fetchCollection`, `fetchHeader`, `fetchSlot`, `findCollections`, `getLamportsPerByte` |
60
+ | Decoding | `decodeCollection`, `decodeHeader`, `decodeSlot`, `isCollectionAccount`, `collectionState`, `entropySlot`, `listedSlots`, `slotsOwnedBy` |
61
+ | Layout | `HEADER_LEN`, `SLOT_LEN`, `HEADER_OFFSET`, `SLOT_OFFSET`, `accountLength`, `slotOffset`, `rentExemptMinimum` |
62
+ | Logs and errors | `parseLogs`, `parseProgramError`, `ERR`, `errorName` |
63
+ | Prices | `solToPrice`, `priceToSol`, `priceToLamports`, `lamportsToPrice` |
64
+ | Seeds | `tokenSeed` |
65
+
66
+ Builders throw a `RangeError` for arguments the program would refuse. Full reference: [gl36.org/docs/client](https://gl36.org/docs/client/).
67
+
68
+ ## Development
69
+
70
+ From the repository root:
71
+
72
+ ```bash
73
+ npm install
74
+ npm test
75
+ npm run build
76
+ ```
77
+
78
+ `npm test` runs the unit tests and, if `program/target/deploy/gl36.so` is built, the LiteSVM tests against the real program.
79
+
80
+ ## License
81
+
82
+ MIT
@@ -0,0 +1,35 @@
1
+ import { type Address } from "@solana/kit";
2
+ export interface Slot {
3
+ id: number;
4
+ owner: Address;
5
+ price: number;
6
+ }
7
+ export interface CollectionHeader {
8
+ bump: number;
9
+ flags: number;
10
+ maxSupply: number;
11
+ minted: number;
12
+ feeBps: number;
13
+ nonce: number;
14
+ mintPrice: bigint;
15
+ creator: Address;
16
+ treasury: Address;
17
+ closeSlot: bigint;
18
+ entropy: Uint8Array;
19
+ generatorHash: Uint8Array;
20
+ }
21
+ export interface Collection extends CollectionHeader {
22
+ slots: Slot[];
23
+ }
24
+ export type CollectionState = "open" | "closed" | "settled";
25
+ export declare const accountLength: (minted: number) => number;
26
+ export declare const slotOffset: (id: number) => number;
27
+ export declare function isCollectionAccount(data: Uint8Array): boolean;
28
+ export declare function decodeHeader(data: Uint8Array): CollectionHeader;
29
+ export declare function decodeSlot(bytes: Uint8Array, id: number): Slot;
30
+ export declare function decodeCollection(data: Uint8Array): Collection;
31
+ export declare function collectionState(c: Pick<CollectionHeader, "flags">): CollectionState;
32
+ export declare const entropySlot: (c: Pick<CollectionHeader, "closeSlot">) => bigint;
33
+ export declare const listedSlots: (c: Pick<Collection, "slots">) => Slot[];
34
+ export declare const slotsOwnedBy: (c: Pick<Collection, "slots">, owner: Address) => Slot[];
35
+ //# sourceMappingURL=account.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.d.ts","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAa9D,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,UAAU,CAAC;IACpB,aAAa,EAAE,UAAU,CAAC;CAC3B;AAED,MAAM,WAAW,UAAW,SAAQ,gBAAgB;IAClD,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE5D,eAAO,MAAM,aAAa,GAAI,QAAQ,MAAM,WAAmC,CAAC;AAEhF,eAAO,MAAM,UAAU,GAAI,IAAI,MAAM,WAA+B,CAAC;AAMrE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAG7D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,gBAAgB,CAmB/D;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAO9D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAW7D;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,GAAG,eAAe,CAInF;AAED,eAAO,MAAM,WAAW,GAAI,GAAG,IAAI,CAAC,gBAAgB,EAAE,WAAW,CAAC,KAAG,MAAoC,CAAC;AAE1G,eAAO,MAAM,WAAW,GAAI,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,KAAG,IAAI,EACsB,CAAC;AAEtF,eAAO,MAAM,YAAY,GAAI,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,OAAO,OAAO,KAAG,IAAI,EACtC,CAAC"}
@@ -0,0 +1,63 @@
1
+ import { getAddressDecoder } from "@solana/kit";
2
+ import { COLLECTION_TAG, FLAG_CLOSED, FLAG_SETTLED, HEADER_LEN, HEADER_OFFSET as O, LAYOUT_VERSION, SETTLE_DELAY, SLOT_LEN, SLOT_OFFSET, } from "./constants.js";
3
+ export const accountLength = (minted) => HEADER_LEN + minted * SLOT_LEN;
4
+ export const slotOffset = (id) => HEADER_LEN + id * SLOT_LEN;
5
+ const view = (data) => new DataView(data.buffer, data.byteOffset, data.byteLength);
6
+ const key = (data, off) => getAddressDecoder().decode(data.subarray(off, off + 32));
7
+ export function isCollectionAccount(data) {
8
+ if (data.length < HEADER_LEN || data[O.tag] !== COLLECTION_TAG || data[O.version] !== LAYOUT_VERSION)
9
+ return false;
10
+ return data.length === accountLength(view(data).getUint16(O.minted, true));
11
+ }
12
+ export function decodeHeader(data) {
13
+ if (data.length < HEADER_LEN || data[O.tag] !== COLLECTION_TAG || data[O.version] !== LAYOUT_VERSION) {
14
+ throw new Error("not a GL-36 collection account");
15
+ }
16
+ const v = view(data);
17
+ return {
18
+ bump: data[O.bump],
19
+ flags: data[O.flags],
20
+ maxSupply: v.getUint16(O.maxSupply, true),
21
+ minted: v.getUint16(O.minted, true),
22
+ feeBps: v.getUint16(O.feeBps, true),
23
+ nonce: v.getUint32(O.nonce, true),
24
+ mintPrice: v.getBigUint64(O.mintPrice, true),
25
+ creator: key(data, O.creator),
26
+ treasury: key(data, O.treasury),
27
+ closeSlot: v.getBigUint64(O.closeSlot, true),
28
+ entropy: data.slice(O.entropy, O.entropy + 32),
29
+ generatorHash: data.slice(O.generatorHash, O.generatorHash + 32),
30
+ };
31
+ }
32
+ export function decodeSlot(bytes, id) {
33
+ if (bytes.length < SLOT_LEN)
34
+ throw new Error(`a slot is ${SLOT_LEN} bytes, got ${bytes.length}`);
35
+ return {
36
+ id,
37
+ owner: key(bytes, SLOT_OFFSET.owner),
38
+ price: view(bytes).getUint32(SLOT_OFFSET.price, true),
39
+ };
40
+ }
41
+ export function decodeCollection(data) {
42
+ const header = decodeHeader(data);
43
+ if (data.length < accountLength(header.minted)) {
44
+ throw new Error(`account holds ${data.length} bytes, ${accountLength(header.minted)} needed for ${header.minted} slots`);
45
+ }
46
+ const slots = [];
47
+ for (let id = 0; id < header.minted; id++) {
48
+ const o = slotOffset(id);
49
+ slots.push(decodeSlot(data.subarray(o, o + SLOT_LEN), id));
50
+ }
51
+ return { ...header, slots };
52
+ }
53
+ export function collectionState(c) {
54
+ if (c.flags & FLAG_SETTLED)
55
+ return "settled";
56
+ if (c.flags & FLAG_CLOSED)
57
+ return "closed";
58
+ return "open";
59
+ }
60
+ export const entropySlot = (c) => c.closeSlot + SETTLE_DELAY;
61
+ export const listedSlots = (c) => c.slots.filter((s) => s.price > 0).sort((a, b) => a.price - b.price || a.id - b.id);
62
+ export const slotsOwnedBy = (c, owner) => c.slots.filter((s) => s.owner === owner);
63
+ //# sourceMappingURL=account.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account.js","sourceRoot":"","sources":["../src/account.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { Address } from "@solana/kit";
2
+ export declare const PROGRAM_ID: {
3
+ readonly mainnet: Address;
4
+ };
5
+ export type Cluster = keyof typeof PROGRAM_ID;
6
+ export declare const SYSTEM_PROGRAM: Address;
7
+ export declare const SLOT_HASHES: Address;
8
+ export declare const COLLECTION_TAG = 1;
9
+ export declare const LAYOUT_VERSION = 1;
10
+ export declare const HEADER_LEN = 224;
11
+ export declare const SLOT_LEN = 36;
12
+ export declare const ACCOUNT_OVERHEAD = 128;
13
+ export declare const PRICE_UNIT = 1000n;
14
+ export declare const MAX_PRICE = 4294967295;
15
+ export declare const MAX_SUPPLY = 65535;
16
+ export declare const MAX_MINT_BATCH = 10;
17
+ export declare const MAX_FEE_BPS = 1000;
18
+ export declare const FLAG_SETTLED = 1;
19
+ export declare const FLAG_CLOSED = 2;
20
+ export declare const SETTLE_DELAY = 32n;
21
+ export declare const HEADER_OFFSET: {
22
+ readonly tag: 0;
23
+ readonly version: 1;
24
+ readonly bump: 2;
25
+ readonly flags: 3;
26
+ readonly maxSupply: 4;
27
+ readonly minted: 6;
28
+ readonly feeBps: 8;
29
+ readonly nonce: 12;
30
+ readonly mintPrice: 16;
31
+ readonly creator: 24;
32
+ readonly treasury: 56;
33
+ readonly closeSlot: 88;
34
+ readonly entropy: 152;
35
+ readonly generatorHash: 184;
36
+ };
37
+ export declare const SLOT_OFFSET: {
38
+ readonly owner: 0;
39
+ readonly price: 32;
40
+ };
41
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,UAAU;sBACsC,OAAO;CAC1D,CAAC;AAEX,MAAM,MAAM,OAAO,GAAG,MAAM,OAAO,UAAU,CAAC;AAE9C,eAAO,MAAM,cAAc,EAAyC,OAAO,CAAC;AAC5E,eAAO,MAAM,WAAW,EAAoD,OAAO,CAAC;AAEpF,eAAO,MAAM,cAAc,IAAI,CAAC;AAChC,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,eAAO,MAAM,UAAU,MAAM,CAAC;AAC9B,eAAO,MAAM,QAAQ,KAAK,CAAC;AAC3B,eAAO,MAAM,gBAAgB,MAAM,CAAC;AAEpC,eAAO,MAAM,UAAU,QAAS,CAAC;AACjC,eAAO,MAAM,SAAS,aAAc,CAAC;AACrC,eAAO,MAAM,UAAU,QAAS,CAAC;AACjC,eAAO,MAAM,cAAc,KAAK,CAAC;AACjC,eAAO,MAAM,WAAW,OAAQ,CAAC;AAEjC,eAAO,MAAM,YAAY,IAAI,CAAC;AAC9B,eAAO,MAAM,WAAW,IAAI,CAAC;AAE7B,eAAO,MAAM,YAAY,MAAM,CAAC;AAEhC,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;CAehB,CAAC;AAEX,eAAO,MAAM,WAAW;;;CAGd,CAAC"}
@@ -0,0 +1,39 @@
1
+ export const PROGRAM_ID = {
2
+ mainnet: "GtUakBxu2UXwv68PkLYmkzyAUtLXwqhtbi7W8GUmPmTb",
3
+ };
4
+ export const SYSTEM_PROGRAM = "11111111111111111111111111111111";
5
+ export const SLOT_HASHES = "SysvarS1otHashes111111111111111111111111111";
6
+ export const COLLECTION_TAG = 1;
7
+ export const LAYOUT_VERSION = 1;
8
+ export const HEADER_LEN = 224;
9
+ export const SLOT_LEN = 36;
10
+ export const ACCOUNT_OVERHEAD = 128;
11
+ export const PRICE_UNIT = 1000n;
12
+ export const MAX_PRICE = 0xffff_ffff;
13
+ export const MAX_SUPPLY = 0xffff;
14
+ export const MAX_MINT_BATCH = 10;
15
+ export const MAX_FEE_BPS = 1_000;
16
+ export const FLAG_SETTLED = 1;
17
+ export const FLAG_CLOSED = 2;
18
+ export const SETTLE_DELAY = 32n;
19
+ export const HEADER_OFFSET = {
20
+ tag: 0,
21
+ version: 1,
22
+ bump: 2,
23
+ flags: 3,
24
+ maxSupply: 4,
25
+ minted: 6,
26
+ feeBps: 8,
27
+ nonce: 12,
28
+ mintPrice: 16,
29
+ creator: 24,
30
+ treasury: 56,
31
+ closeSlot: 88,
32
+ entropy: 152,
33
+ generatorHash: 184,
34
+ };
35
+ export const SLOT_OFFSET = {
36
+ owner: 0,
37
+ price: 32,
38
+ };
39
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,OAAO,EAAE,8CAAyD;CAC1D,CAAC;AAIX,MAAM,CAAC,MAAM,cAAc,GAAG,kCAA6C,CAAC;AAC5E,MAAM,CAAC,MAAM,WAAW,GAAG,6CAAwD,CAAC;AAEpF,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAChC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC;AAEhC,MAAM,CAAC,MAAM,UAAU,GAAG,GAAG,CAAC;AAC9B,MAAM,CAAC,MAAM,QAAQ,GAAG,EAAE,CAAC;AAC3B,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAEpC,MAAM,CAAC,MAAM,UAAU,GAAG,KAAM,CAAC;AACjC,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,CAAC;AACrC,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AACjC,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC;AAEjC,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC;AAE7B,MAAM,CAAC,MAAM,YAAY,GAAG,GAAG,CAAC;AAEhC,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,GAAG,EAAE,CAAC;IACN,OAAO,EAAE,CAAC;IACV,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;IACR,SAAS,EAAE,CAAC;IACZ,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,EAAE;IACT,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,EAAE;IACX,QAAQ,EAAE,EAAE;IACZ,SAAS,EAAE,EAAE;IACb,OAAO,EAAE,GAAG;IACZ,aAAa,EAAE,GAAG;CACV,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,KAAK,EAAE,CAAC;IACR,KAAK,EAAE,EAAE;CACD,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type Address } from "@solana/kit";
2
+ export declare const ERR: {
3
+ readonly SoldOut: 1;
4
+ readonly BadBatch: 2;
5
+ readonly NotOwner: 3;
6
+ readonly NotListed: 4;
7
+ readonly PriceAboveMax: 5;
8
+ readonly SellerMismatch: 6;
9
+ readonly SelfBuy: 7;
10
+ readonly NotClosed: 8;
11
+ readonly AlreadySettled: 9;
12
+ readonly MintClosed: 10;
13
+ readonly BadFee: 11;
14
+ readonly BadSupply: 12;
15
+ readonly WrongCreator: 13;
16
+ readonly WrongTreasury: 14;
17
+ readonly BadId: 15;
18
+ readonly SameOwner: 16;
19
+ readonly BadSysvar: 17;
20
+ readonly TooEarly: 18;
21
+ };
22
+ export type ErrorName = keyof typeof ERR;
23
+ export declare const errorName: (code: number) => ErrorName | undefined;
24
+ export interface ProgramError {
25
+ code: number;
26
+ name: ErrorName | undefined;
27
+ program?: Address;
28
+ instructionIndex?: number;
29
+ }
30
+ export declare function parseProgramError(error: unknown, options?: {
31
+ programId?: Address;
32
+ }): ProgramError | null;
33
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAGnG,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;CAmBN,CAAC;AAEX,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,GAAG,CAAC;AAIzC,eAAO,MAAM,SAAS,GAAI,MAAM,MAAM,KAAG,SAAS,GAAG,SAA4B,CAAC;AAElF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,GAAG,SAAS,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AA6BD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE;IAAE,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,YAAY,GAAG,IAAI,CAwB5G"}
package/dist/errors.js ADDED
@@ -0,0 +1,77 @@
1
+ import { isSolanaError, SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM } from "@solana/kit";
2
+ import { SYSTEM_PROGRAM } from "./constants.js";
3
+ export const ERR = {
4
+ SoldOut: 1,
5
+ BadBatch: 2,
6
+ NotOwner: 3,
7
+ NotListed: 4,
8
+ PriceAboveMax: 5,
9
+ SellerMismatch: 6,
10
+ SelfBuy: 7,
11
+ NotClosed: 8,
12
+ AlreadySettled: 9,
13
+ MintClosed: 10,
14
+ BadFee: 11,
15
+ BadSupply: 12,
16
+ WrongCreator: 13,
17
+ WrongTreasury: 14,
18
+ BadId: 15,
19
+ SameOwner: 16,
20
+ BadSysvar: 17,
21
+ TooEarly: 18,
22
+ };
23
+ const NAMES = new Map(Object.entries(ERR).map(([k, v]) => [v, k]));
24
+ export const errorName = (code) => NAMES.get(code);
25
+ const FAILED = /^Program (\w+) failed: custom program error: 0x([0-9a-f]+)/i;
26
+ const CUSTOM = /custom program error: 0x([0-9a-f]+)/i;
27
+ function chain(error) {
28
+ const out = [];
29
+ for (let e = error, depth = 0; e != null && depth < 8; depth++) {
30
+ out.push(e);
31
+ e = typeof e === "object" ? e.cause : undefined;
32
+ }
33
+ return out;
34
+ }
35
+ function logsOf(error) {
36
+ if (Array.isArray(error))
37
+ return error.filter((l) => typeof l === "string");
38
+ for (const e of chain(error)) {
39
+ const logs = e?.context?.logs ?? e?.logs;
40
+ if (Array.isArray(logs))
41
+ return logs.filter((l) => typeof l === "string");
42
+ }
43
+ return [];
44
+ }
45
+ function named(code, program, programId) {
46
+ if (program === undefined)
47
+ return errorName(code);
48
+ if (programId !== undefined)
49
+ return program === programId ? errorName(code) : undefined;
50
+ return program === SYSTEM_PROGRAM ? undefined : errorName(code);
51
+ }
52
+ export function parseProgramError(error, options = {}) {
53
+ for (const line of logsOf(error)) {
54
+ const m = FAILED.exec(line);
55
+ if (m) {
56
+ const program = m[1];
57
+ const code = Number.parseInt(m[2], 16);
58
+ return { code, name: named(code, program, options.programId), program };
59
+ }
60
+ }
61
+ for (const e of chain(error)) {
62
+ if (isSolanaError(e, SOLANA_ERROR__INSTRUCTION_ERROR__CUSTOM)) {
63
+ const { code, index } = e.context;
64
+ return { code, name: errorName(code), instructionIndex: index };
65
+ }
66
+ }
67
+ for (const e of chain(error)) {
68
+ const text = typeof e === "string" ? e : e instanceof Error ? e.message : "";
69
+ const m = CUSTOM.exec(text);
70
+ if (m) {
71
+ const code = Number.parseInt(m[1], 16);
72
+ return { code, name: errorName(code) };
73
+ }
74
+ }
75
+ return null;
76
+ }
77
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export * from "./constants.ts";
2
+ export * from "./account.ts";
3
+ export * from "./pda.ts";
4
+ export * from "./instructions.ts";
5
+ export * from "./errors.ts";
6
+ export * from "./logs.ts";
7
+ export * from "./price.ts";
8
+ export * from "./seed.ts";
9
+ export * from "./rpc.ts";
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,10 @@
1
+ export * from "./constants.js";
2
+ export * from "./account.js";
3
+ export * from "./pda.js";
4
+ export * from "./instructions.js";
5
+ export * from "./errors.js";
6
+ export * from "./logs.js";
7
+ export * from "./price.js";
8
+ export * from "./seed.js";
9
+ export * from "./rpc.js";
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { type Address, type Instruction, type TransactionSigner } from "@solana/kit";
2
+ export declare const INSTRUCTION: {
3
+ readonly init: 0;
4
+ readonly mint: 1;
5
+ readonly transfer: 2;
6
+ readonly list: 3;
7
+ readonly buy: 4;
8
+ readonly close: 5;
9
+ readonly withdrawExcess: 6;
10
+ readonly settle: 7;
11
+ };
12
+ export interface InitArgs {
13
+ nonce: number;
14
+ maxSupply: number;
15
+ feeBps: number;
16
+ mintPrice: bigint;
17
+ generatorHash: Uint8Array;
18
+ }
19
+ export declare function initIx(programId: Address, creator: TransactionSigner, collection: Address, treasury: Address, a: InitArgs): Instruction;
20
+ export declare function mintIx(programId: Address, minter: TransactionSigner, collection: Address, creator: Address, count: number): Instruction;
21
+ export declare function transferIx(programId: Address, owner: TransactionSigner, collection: Address, newOwner: Address, id: number): Instruction;
22
+ export declare function listIx(programId: Address, owner: TransactionSigner, collection: Address, id: number, price: number): Instruction;
23
+ export declare function buyIx(programId: Address, buyer: TransactionSigner, collection: Address, seller: Address, treasury: Address, id: number, maxPrice: number): Instruction;
24
+ export declare function closeIx(programId: Address, creator: TransactionSigner, collection: Address): Instruction;
25
+ export declare function settleIx(programId: Address, collection: Address): Instruction;
26
+ export declare function withdrawExcessIx(programId: Address, creator: TransactionSigner, collection: Address): Instruction;
27
+ //# sourceMappingURL=instructions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.d.ts","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,OAAO,EAAE,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGlG,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAC;AAEX,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,UAAU,CAAC;CAC3B;AAqDD,wBAAgB,MAAM,CACpB,SAAS,EAAE,OAAO,EAClB,OAAO,EAAE,iBAAiB,EAC1B,UAAU,EAAE,OAAO,EACnB,QAAQ,EAAE,OAAO,EACjB,CAAC,EAAE,QAAQ,GACV,WAAW,CAkBb;AAED,wBAAgB,MAAM,CACpB,SAAS,EAAE,OAAO,EAClB,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,OAAO,EACnB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,GACZ,WAAW,CAOb;AAED,wBAAgB,UAAU,CACxB,SAAS,EAAE,OAAO,EAClB,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,OAAO,EACnB,QAAQ,EAAE,OAAO,EACjB,EAAE,EAAE,MAAM,GACT,WAAW,CAOb;AAED,wBAAgB,MAAM,CACpB,SAAS,EAAE,OAAO,EAClB,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,OAAO,EACnB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,GACZ,WAAW,CAQb;AAED,wBAAgB,KAAK,CACnB,SAAS,EAAE,OAAO,EAClB,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,OAAO,EACnB,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,OAAO,EACjB,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,GACf,WAAW,CAQb;AAED,wBAAgB,OAAO,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,OAAO,GAAG,WAAW,CAMxG;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,GAAG,WAAW,CAM7E;AAED,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,OAAO,GAAG,WAAW,CAMjH"}
@@ -0,0 +1,137 @@
1
+ import { AccountRole } from "@solana/kit";
2
+ import { MAX_FEE_BPS, MAX_MINT_BATCH, MAX_PRICE, MAX_SUPPLY, SLOT_HASHES, SYSTEM_PROGRAM } from "./constants.js";
3
+ export const INSTRUCTION = {
4
+ init: 0,
5
+ mint: 1,
6
+ transfer: 2,
7
+ list: 3,
8
+ buy: 4,
9
+ close: 5,
10
+ withdrawExcess: 6,
11
+ settle: 7,
12
+ };
13
+ class Writer {
14
+ buf;
15
+ view;
16
+ off = 0;
17
+ constructor(len) {
18
+ this.buf = new Uint8Array(len);
19
+ this.view = new DataView(this.buf.buffer);
20
+ }
21
+ u8(v) {
22
+ this.view.setUint8(this.off, v);
23
+ this.off += 1;
24
+ return this;
25
+ }
26
+ u16(v) {
27
+ this.view.setUint16(this.off, v, true);
28
+ this.off += 2;
29
+ return this;
30
+ }
31
+ u32(v) {
32
+ this.view.setUint32(this.off, v, true);
33
+ this.off += 4;
34
+ return this;
35
+ }
36
+ u64(v) {
37
+ this.view.setBigUint64(this.off, v, true);
38
+ this.off += 8;
39
+ return this;
40
+ }
41
+ bytes(b) {
42
+ this.buf.set(b, this.off);
43
+ this.off += b.length;
44
+ return this;
45
+ }
46
+ }
47
+ function int(name, v, min, max) {
48
+ if (!Number.isInteger(v) || v < min || v > max)
49
+ throw new RangeError(`${name} must be an integer from ${min} to ${max}, got ${v}`);
50
+ }
51
+ function bytes32(name, b) {
52
+ if (b.length !== 32)
53
+ throw new RangeError(`${name} must be 32 bytes, got ${b.length}`);
54
+ }
55
+ const signer = (s, writable) => ({
56
+ address: s.address,
57
+ role: writable ? AccountRole.WRITABLE_SIGNER : AccountRole.READONLY_SIGNER,
58
+ signer: s,
59
+ });
60
+ const w = (address) => ({ address, role: AccountRole.WRITABLE });
61
+ const r = (address) => ({ address, role: AccountRole.READONLY });
62
+ export function initIx(programId, creator, collection, treasury, a) {
63
+ int("nonce", a.nonce, 0, 0xffff_ffff);
64
+ int("maxSupply", a.maxSupply, 1, MAX_SUPPLY);
65
+ int("feeBps", a.feeBps, 0, MAX_FEE_BPS);
66
+ if (a.mintPrice < 0n || a.mintPrice > 0xffffffffffffffffn)
67
+ throw new RangeError(`mintPrice must be a u64, got ${a.mintPrice}`);
68
+ bytes32("generatorHash", a.generatorHash);
69
+ const data = new Writer(49)
70
+ .u8(INSTRUCTION.init)
71
+ .u32(a.nonce)
72
+ .u16(a.maxSupply)
73
+ .u16(a.feeBps)
74
+ .u64(a.mintPrice)
75
+ .bytes(a.generatorHash).buf;
76
+ return {
77
+ programAddress: programId,
78
+ accounts: [signer(creator, true), w(collection), r(treasury), r(SYSTEM_PROGRAM)],
79
+ data,
80
+ };
81
+ }
82
+ export function mintIx(programId, minter, collection, creator, count) {
83
+ int("count", count, 1, MAX_MINT_BATCH);
84
+ return {
85
+ programAddress: programId,
86
+ accounts: [signer(minter, true), w(collection), w(creator), r(SYSTEM_PROGRAM)],
87
+ data: new Writer(2).u8(INSTRUCTION.mint).u8(count).buf,
88
+ };
89
+ }
90
+ export function transferIx(programId, owner, collection, newOwner, id) {
91
+ int("id", id, 0, MAX_SUPPLY - 1);
92
+ return {
93
+ programAddress: programId,
94
+ accounts: [signer(owner, false), w(collection), r(newOwner)],
95
+ data: new Writer(3).u8(INSTRUCTION.transfer).u16(id).buf,
96
+ };
97
+ }
98
+ export function listIx(programId, owner, collection, id, price) {
99
+ int("id", id, 0, MAX_SUPPLY - 1);
100
+ int("price", price, 0, MAX_PRICE);
101
+ return {
102
+ programAddress: programId,
103
+ accounts: [signer(owner, false), w(collection)],
104
+ data: new Writer(7).u8(INSTRUCTION.list).u16(id).u32(price).buf,
105
+ };
106
+ }
107
+ export function buyIx(programId, buyer, collection, seller, treasury, id, maxPrice) {
108
+ int("id", id, 0, MAX_SUPPLY - 1);
109
+ int("maxPrice", maxPrice, 1, MAX_PRICE);
110
+ return {
111
+ programAddress: programId,
112
+ accounts: [signer(buyer, true), w(collection), w(seller), w(treasury), r(SYSTEM_PROGRAM)],
113
+ data: new Writer(7).u8(INSTRUCTION.buy).u16(id).u32(maxPrice).buf,
114
+ };
115
+ }
116
+ export function closeIx(programId, creator, collection) {
117
+ return {
118
+ programAddress: programId,
119
+ accounts: [signer(creator, false), w(collection)],
120
+ data: new Uint8Array([INSTRUCTION.close]),
121
+ };
122
+ }
123
+ export function settleIx(programId, collection) {
124
+ return {
125
+ programAddress: programId,
126
+ accounts: [w(collection), r(SLOT_HASHES)],
127
+ data: new Uint8Array([INSTRUCTION.settle]),
128
+ };
129
+ }
130
+ export function withdrawExcessIx(programId, creator, collection) {
131
+ return {
132
+ programAddress: programId,
133
+ accounts: [signer(creator, true), w(collection)],
134
+ data: new Uint8Array([INSTRUCTION.withdrawExcess]),
135
+ };
136
+ }
137
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../src/instructions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA0D,MAAM,aAAa,CAAC;AAClG,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEjH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,CAAC;IACP,GAAG,EAAE,CAAC;IACN,KAAK,EAAE,CAAC;IACR,cAAc,EAAE,CAAC;IACjB,MAAM,EAAE,CAAC;CACD,CAAC;AAUX,MAAM,MAAM;IACV,GAAG,CAAa;IAChB,IAAI,CAAW;IACf,GAAG,GAAG,CAAC,CAAC;IACR,YAAY,GAAW;QACrB,IAAI,CAAC,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IACD,EAAE,CAAC,CAAS;QACV,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IACD,GAAG,CAAC,CAAS;QACX,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IACD,GAAG,CAAC,CAAS;QACX,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IACD,GAAG,CAAC,CAAS;QACX,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IACD,KAAK,CAAC,CAAa;QACjB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAED,SAAS,GAAG,CAAC,IAAY,EAAE,CAAS,EAAE,GAAW,EAAE,GAAW;IAC5D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG;QAAE,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,4BAA4B,GAAG,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;AACrI,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,CAAa;IAC1C,IAAI,CAAC,CAAC,MAAM,KAAK,EAAE;QAAE,MAAM,IAAI,UAAU,CAAC,GAAG,IAAI,0BAA0B,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,MAAM,GAAG,CAAC,CAAoB,EAAE,QAAiB,EAAE,EAAE,CAAC,CAAC;IAC3D,OAAO,EAAE,CAAC,CAAC,OAAO;IAClB,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC,eAAe;IAC1E,MAAM,EAAE,CAAC;CACV,CAAC,CAAC;AACH,MAAM,CAAC,GAAG,CAAC,OAAgB,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC1E,MAAM,CAAC,GAAG,CAAC,OAAgB,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC;AAE1E,MAAM,UAAU,MAAM,CACpB,SAAkB,EAClB,OAA0B,EAC1B,UAAmB,EACnB,QAAiB,EACjB,CAAW;IAEX,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;IACtC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC;IAC7C,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,WAAW,CAAC,CAAC;IACxC,IAAI,CAAC,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC,CAAC,SAAS,GAAG,mBAAsB;QAAE,MAAM,IAAI,UAAU,CAAC,gCAAgC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;IAClI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;SACxB,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;SACpB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;SACZ,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;SAChB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;SACb,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;SAChB,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC;IAC9B,OAAO;QACL,cAAc,EAAE,SAAS;QACzB,QAAQ,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAChF,IAAI;KACL,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CACpB,SAAkB,EAClB,MAAyB,EACzB,UAAmB,EACnB,OAAgB,EAChB,KAAa;IAEb,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,cAAc,CAAC,CAAC;IACvC,OAAO;QACL,cAAc,EAAE,SAAS;QACzB,QAAQ,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QAC9E,IAAI,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG;KACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,SAAkB,EAClB,KAAwB,EACxB,UAAmB,EACnB,QAAiB,EACjB,EAAU;IAEV,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;IACjC,OAAO;QACL,cAAc,EAAE,SAAS;QACzB,QAAQ,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC5D,IAAI,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG;KACzD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,MAAM,CACpB,SAAkB,EAClB,KAAwB,EACxB,UAAmB,EACnB,EAAU,EACV,KAAa;IAEb,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;IACjC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAClC,OAAO;QACL,cAAc,EAAE,SAAS;QACzB,QAAQ,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG;KAChE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CACnB,SAAkB,EAClB,KAAwB,EACxB,UAAmB,EACnB,MAAe,EACf,QAAiB,EACjB,EAAU,EACV,QAAgB;IAEhB,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,EAAE,UAAU,GAAG,CAAC,CAAC,CAAC;IACjC,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IACxC,OAAO;QACL,cAAc,EAAE,SAAS;QACzB,QAAQ,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;QACzF,IAAI,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG;KAClE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,SAAkB,EAAE,OAA0B,EAAE,UAAmB;IACzF,OAAO;QACL,cAAc,EAAE,SAAS;QACzB,QAAQ,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,SAAkB,EAAE,UAAmB;IAC9D,OAAO;QACL,cAAc,EAAE,SAAS;QACzB,QAAQ,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC;QACzC,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,SAAkB,EAAE,OAA0B,EAAE,UAAmB;IAClG,OAAO;QACL,cAAc,EAAE,SAAS;QACzB,QAAQ,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QAChD,IAAI,EAAE,IAAI,UAAU,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;KACnD,CAAC;AACJ,CAAC"}