@xgamesfun/solana 0.26.1 → 0.26.3

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.
@@ -9,8 +9,9 @@ An economy is one JSON spec (`xsolana.json` in the project) on **loot**, a Solan
9
9
  writes or deploys a contract: the spec is checked, simulated and priced by the `xsolana_*` tools, and the project's
10
10
  owner puts it live by approving in their own wallet. It runs on **devnet** until the program is audited.
11
11
 
12
- The tools are the `xsolana_*` MCP tools. Without MCP, the same from a terminal: `npx -y @xgamesfun/solana@0.26.1 <guide|examples|check|simulate|cost|explain|review|publish|status> [xsolana.json]`,
13
- or `npx -y @xgamesfun/solana@0.26.1 tool <name> '<json>'` for any tool (always with the exact version).
12
+ The tools are the `xsolana_*` MCP tools. Without MCP, the same from a terminal: `npx -y @xgamesfun/solana@0.26.3 <guide|examples|check|simulate|cost|explain|review|publish|status> [xsolana.json]`,
13
+ `npx -y @xgamesfun/solana@0.26.3 token <mint>` for a coin made elsewhere,
14
+ or `npx -y @xgamesfun/solana@0.26.3 tool <name> '<json>'` for any tool (always with the exact version).
14
15
 
15
16
  ## Rules (always)
16
17
 
@@ -26,8 +27,9 @@ or `npx -y @xgamesfun/solana@0.26.1 tool <name> '<json>'` for any tool (always w
26
27
  `xsolana_simulate`, `xsolana_cost` and `xsolana_explain`, never your own arithmetic. What a player pays is the tools'
27
28
  "in all" number for that action (price, fee, oracle, network and rent that never comes back): quote it as is.
28
29
  6. **Flag the law once.** The first time the checker raises `W-CHANCE-PRIZE` (paid chance at money: boxes with
29
- prizes, lotteries, contests), `W-CHANCE-ITEMS` (paid random collectibles a player can resell: loot boxes, gacha) or
30
- `W-REVENUE-SHARE` (stakers paid from sales), say it in one plain sentence. Don't repeat it in later answers, or add
30
+ prizes, lotteries, contests), `W-CHANCE-ITEMS` (paid random collectibles a player can resell: loot boxes, gacha),
31
+ `W-REVENUE-SHARE` (stakers paid from sales) or `W-TOKEN-SALE` (a presale: people pay for a share of a new token),
32
+ say it in one plain sentence. Don't repeat it in later answers, or add
31
33
  legal notes to pages and apps you build, unless the person asks or a flag of a new kind appears. When they ask about
32
34
  the law, answer what you know and leave the rest to their lawyer: you are not one. Never call anything an
33
35
  investment, a return or passive income, and never promise it is safe. The approval page shows the flags and that
@@ -121,13 +123,33 @@ or `npx -y @xgamesfun/solana@0.26.1 tool <name> '<json>'` for any tool (always w
121
123
  level would cost. Run it again after every change that touches a route that pays.
122
124
  9. **When they say "put it live"**: `xsolana_publish` lists every step and its cost and gives the command. Tell them to
123
125
  run it themselves in the project folder, exactly as `xsolana_publish` gives it (it names the exact version:
124
- `npx -y @xgamesfun/solana@0.26.1 approve xsolana.json`; never drop the version). It opens a page on their computer where
126
+ `npx -y @xgamesfun/solana@0.26.3 approve xsolana.json`; never drop the version). It opens a page on their computer where
125
127
  they connect a devnet wallet and approve; what lands is written back into `xsolana.json`. You publish nothing.
126
128
  10. **After it is live**: `xsolana_status` shows each part on chain; read it before acting on what the person says
127
129
  happened. A later change is the same loop: save, publish, and the approval sends only what changed. What only the
128
130
  owner signs (open or decide a contest, pay out) goes on an owner page they approve in their own wallet:
129
131
  `references/after-launch.md`.
130
132
 
133
+ ## When they ask for a token
134
+
135
+ "A token for my game" is one of four things. Find out which from what they say it is for, before writing anything
136
+ (ask only when they haven't said):
137
+
138
+ | They mean | It is | In the spec |
139
+ | --------------------------------------------------------------------------- | ---------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
140
+ | points, tickets, shards: what players earn and spend in the game | a token the project mints as its rules say | `source: "project"`, given by a recipe's or a grant's prize (`"from": "mint"`), a farm's `rate` (`"minted": true`) or a schedule (`"does": "issue"`) |
141
+ | "our own coin, 10 million, we hand it out", a community token | a fixed supply, all of it to the owner, no more ever | `source: "project"` with `supply`; pools are seeded from it, and a presale (a contest), sealed vesting (a schedule) and a farm hand it out |
142
+ | "a coin people can trade", "on pump.fun", "a bonding curve", "creator fees" | a market, which loot does not run | they launch it on a launchpad or an AMM, in their own wallet; then `xsolana_token {"mint": …}` gives its entry, and loot's shops, boxes, farms and gates use it |
143
+ | "our token", "the coin we launched", "this mint" | a coin that exists | `xsolana_token {"mint": …}`: its entry with decimals, program and `powers` read from the chain. Never type them by hand, and never guess an address |
144
+
145
+ Say what each gives up. The first two have no public market: nobody trades them unless the project lists them
146
+ somewhere itself. A coin launched on a market usually has nobody left who can mint it (`xsolana_token` says so): the
147
+ economy pays out only what its owner puts into its pools. On devnet a coin trades nothing of value.
148
+
149
+ A token the setup makes is named on chain as it goes live, so ask for its name, its ticker and a picture first
150
+ (`references/telling-the-person.md`). Whatever the kind, rule 6 holds: never call a token an investment or promise it
151
+ a price.
152
+
131
153
  ## Building the app around it
132
154
 
133
155
  A game, a site or a bot calls the live economy with the player's own wallet, through the package's player module
@@ -119,7 +119,7 @@ maps to a part of the spec (`xsolana_guide` has every field).
119
119
  | "holders of the ticket claim a free badge once" | an open grant: no `vouchers`, `keys` or `list`, a `gate` of the ticket, and `limits.perWallet: 1` (each ticket shown claims once too) |
120
120
  | "bring your own NFT", "any NFT of a partner collection can play", "holders of X get" | a `gate` (or a farm's, or odds') rule with `collection`: the collection's address; the project's notes about each NFT (a level) go in its Sheet |
121
121
  | "our own token, 10 million, we keep it", "a fixed supply", "a community token" | `source: "project"` with `supply`: going live mints all of it to the owner and turns minting off for good; pools are seeded from it |
122
- | "our token", "the coin we already launched", "this mint" | `source: "existing"` with `mint` and `decimals` (ask for the address). loot doesn't put a token on a market: for trading, launch it on a token launchpad or an exchange first |
122
+ | "our token", "the coin we already launched", "this mint" | `source: "existing"`: ask for the mint's address, and `xsolana_token {"mint": …}` gives the whole entry (decimals, program, `powers`). loot doesn't put a token on a market: for trading, launch it on a token launchpad or an exchange first (SKILL.md, "When they ask for a token") |
123
123
  | "Token-2022", "a transfer fee" | `program: "token-2022"` and `powers.transferFeePercent` |
124
124
  | "tokens only, no NFTs" | `"collection": false`: no collection is made (no collectibles; normal items and tokens work) |
125
125
  | "mint into our existing collection", "two collections" | `collections`: Core collections the owner's wallet already controls, each with the project added as an update delegate; an item's `collection` names the one it is minted into |
@@ -26,7 +26,9 @@ and the spec differ (a limit, an amount, a key not set yet), change one of them
26
26
  6. **Flags for the law, once.** `W-CHANCE-PRIZE`: "Players pay for a chance at money. That is gambling in many places once
27
27
  it is real money; this runs on devnet only." `W-CHANCE-ITEMS`: "Players pay for random items they can resell: some
28
28
  places treat that as gambling, and many require the odds to be shown." `W-REVENUE-SHARE`: "Stakers are paid from
29
- what players spend; regulators look at that when they decide whether a token is a security." Say each once, the
29
+ what players spend; regulators look at that when they decide whether a token is a security." `W-TOKEN-SALE`:
30
+ "People pay for a share of a new token; selling a token to raise money is what securities law looks at first."
31
+ Say each once, the
30
32
  first time the checker raises it; then leave them, saying them again only when the person asks or a flag of a new
31
33
  kind appears, and keep them out of pages and apps unless asked. The approval page shows them, with the program's
32
34
  status (not independently audited, as is, at their own risk, theirs to make legal where they offer it), and keeps
@@ -117,6 +119,13 @@ Don'ts:
117
119
  otherwise, and until it is filled those prizes pay nothing.
118
120
  - **A token the project mints** (`source: "project"`) is how points, tickets, attempts and shards work; an existing coin
119
121
  needs its mint address and decimals from the person (ask; never guess an address).
122
+ - **A token the setup makes is named on chain as it goes live**: its `name`, its `symbol` and its `uri` (a link to a
123
+ JSON file the project hosts, `{ "name", "symbol", "image": "https://…" }`), which is what wallets and explorers show.
124
+ Ask for the name, the ticker and a picture before going live: with no `uri` it shows by name and ticker with no
125
+ picture. Only the owner's wallet can change the three later (Token Metadata's rule, not loot's), and these tools
126
+ don't change a live token's yet, so get them right first. The record costs about 0.014 SOL (`xsolana_cost` says it:
127
+ rent, and 0.01 SOL Token Metadata keeps). A token that went live before the tools wrote one has none and
128
+ can't be given one: only a mint's own authority can name it, and its minting was handed on or turned off.
120
129
  - **NFTs the project has no authority over** (any collection but its own): they count as they are. Say that
121
130
  whatever their collection lets be written on an NFT (even by its holder) is what a gate or a boost reads, and that
122
131
  the project's notes about one (levels, uses) live in its Sheet, which the authority writes and pays for. Every
@@ -0,0 +1,40 @@
1
+ /** A record's size: Token Metadata pads every one to it, whatever its name, ticker and link. */
2
+ export declare const METADATA_BYTES = 607;
3
+ /** What Token Metadata keeps in each record it makes, on top of the record's rent: its own fee. */
4
+ export declare const METADATA_FEE = 10000000n;
5
+ /** The longest name, ticker and link a record takes, in UTF-8 bytes. */
6
+ export declare const METADATA_LIMITS: Readonly<{
7
+ name: 32;
8
+ symbol: 10;
9
+ uri: 200;
10
+ }>;
11
+ /** The address of a mint's Token Metadata record. */
12
+ export declare const metadataAddress: (mint: any) => any;
13
+ /**
14
+ * Token Metadata's CreateV1 for a fungible token whose mint exists: its name, its ticker and a link to a JSON file with
15
+ * its picture ('' for none). `authority` is the mint's authority and signs; it becomes the record's update authority,
16
+ * the only one who can change the record later. `payer` pays its rent and Token Metadata's fee (`METADATA_FEE`).
17
+ * The mint is listed read-only: this path of Token Metadata writes nothing to a mint that exists. That is the
18
+ * program's behaviour, not a lock: in a setup's own transaction the mint is writable all the same (the same
19
+ * transaction makes it), so the tests read its supply and authorities back after the record is made. The record says
20
+ * a fungible token whatever the decimals (CreateMetadataAccountV3 would call one of 0 decimals an asset, which
21
+ * wallets list with collectibles).
22
+ */
23
+ export declare function createFungibleMetadataIx({ mint, authority, payer, name, symbol, uri }: {
24
+ authority: any;
25
+ mint: any;
26
+ name: any;
27
+ payer?: any;
28
+ symbol: any;
29
+ uri?: string | undefined;
30
+ }): {
31
+ programId: string;
32
+ keys: {
33
+ pubkey: any;
34
+ isSigner: any;
35
+ isWritable: any;
36
+ }[];
37
+ data: Uint8Array<any>;
38
+ };
39
+ /** The update authority a Token Metadata record names (who can change its name, ticker and link). */
40
+ export declare const metadataUpdateAuthority: (data: any) => string | null;
@@ -23,3 +23,32 @@ export declare function parseMint(address: any, owner: any, data: any, metadataD
23
23
  symbol: string | null;
24
24
  uri: string | null;
25
25
  } | null;
26
+ /**
27
+ * A token made elsewhere as an economy spec names it: its `tokens` entry (`source: "existing"`), every field read from
28
+ * the chain so nothing is typed in by hand: the mint, its decimals and token program, its name and ticker when it has
29
+ * a name record, and `powers` (token2022.js `powersOf`: what the mint's own keys can do). `account`: the mint's
30
+ * ({ owner, data }); `record`: its Token Metadata record's data, when there is one. `key`: what the spec will call it
31
+ * (default: its ticker in the letters a key takes, else "token"). `project`: the loot project, whose own tokens read
32
+ * `mintAuthority: "project"`; `epoch`: the chain's current epoch, for a transfer fee since changed (`powersOf`). The
33
+ * name and ticker are cut to what a spec takes, on one line. Wrapped SOL is SOL (`{ key: "sol", source: "sol" }`).
34
+ * Null when `account` is no mint.
35
+ */
36
+ export declare function tokenEntry(address: any, account: any, record?: null, { key, project, epoch }?: {
37
+ epoch?: null | undefined;
38
+ key?: null | undefined;
39
+ project?: null | undefined;
40
+ }): {
41
+ key: string;
42
+ source: string;
43
+ } | {
44
+ key: string;
45
+ source: string;
46
+ name?: string | undefined;
47
+ symbol?: string | undefined;
48
+ decimals: any;
49
+ program: string;
50
+ mint: any;
51
+ powers: {
52
+ mintAuthority: string;
53
+ } | null;
54
+ } | null;
@@ -26,6 +26,44 @@ export declare function mintPowers({ owner, data }: {
26
26
  data: any;
27
27
  owner: any;
28
28
  }): any[];
29
+ /**
30
+ * What a mint's own keys can do, as an economy spec's `powers` says it (schema `token.powers`), read from the mint's
31
+ * account (`owner`, its token program; `data`), so nobody has to look it up and type it in. Only what is so is named:
32
+ * a plain mint nobody can mint more of reads `{ mintAuthority: 'none' }`. `project`: the loot project's address, when
33
+ * known, whose own tokens read `mintAuthority: 'project'`; any other minter is `'someone else'`.
34
+ * freeze: a freeze authority; permanentDelegate; transferHook (a hook program, or an authority who can name one);
35
+ * transferFeePercent and feeChangeable (its authority is still there); closeAuthority; pausable; defaultState (the
36
+ * mint sets what new accounts start as) and defaultFrozen (they start frozen); nonTransferable;
37
+ * confidentialTransfers.
38
+ * A mint holds two transfer fees: the one in force until an epoch, and the one from that epoch on. With `epoch` (the
39
+ * chain's current one) the fee read is the one that applies: the newer once its epoch has come, else the higher of
40
+ * the two (the fee today, or the one already set to follow). Without it, the higher of the two: never less than what
41
+ * a transfer pays, and a fee since lowered still reads at its old rate.
42
+ * Returns null when the account is not a mint of either token program.
43
+ */
44
+ export declare function powersOf({ owner, data }: {
45
+ data: any;
46
+ owner: any;
47
+ }, { project, epoch }?: {
48
+ epoch?: null | undefined;
49
+ project?: null | undefined;
50
+ }): {
51
+ mintAuthority: string;
52
+ } | null;
53
+ /**
54
+ * What a Token-2022 mint's state does today that its powers don't say: `paused` (a pause is on: nothing moves),
55
+ * `scaled` (ScaledUiAmount or InterestBearing: wallets show amounts multiplied by a rate, not the base units the
56
+ * program moves and an economy counts in) and `scaler` (somebody can still change that rate). All false for a classic
57
+ * mint, or one with none of them.
58
+ */
59
+ export declare function mintState({ owner, data }: {
60
+ data: any;
61
+ owner: any;
62
+ }): {
63
+ paused: boolean;
64
+ scaled: boolean;
65
+ scaler: boolean;
66
+ };
29
67
  /** Whether a token account requires a memo on every transfer into it. */
30
68
  export declare function requiresMemo(accountData: any): boolean;
31
69
  /** The hook's list of extra accounts for this mint. */
@@ -2,6 +2,7 @@
2
2
  export declare function setupCost(plan: any, economy: any): {
3
3
  accounts: any;
4
4
  rentSol: any;
5
+ metadataFeesSol: any;
5
6
  programFeesSol: any;
6
7
  networkFeesSol: any;
7
8
  seeds: {};
@@ -51,6 +52,7 @@ export declare function cost(economy: any, { now, only, live }?: {
51
52
  setup: {
52
53
  accounts: any;
53
54
  rentSol: any;
55
+ metadataFeesSol: any;
54
56
  programFeesSol: any;
55
57
  networkFeesSol: any;
56
58
  seeds: {};
@@ -4,6 +4,7 @@ export declare const LEGAL: Readonly<{
4
4
  'W-CHANCE-ITEMS': "Players pay for random items they can resell (a loot box). Some places treat that as gambling and many require the odds shown: show them on the page, and get a lawyer before real money.";
5
5
  'W-AUCTION-SHILL': "Anyone, the seller included, can bid to push an auction’s price up (shill bidding): a reserve is the honest way to set a floor.";
6
6
  'W-REVENUE-SHARE': "Stakers are paid from what players spend, which regulators look at when they decide whether a token is a security: before real money, get a lawyer, or pay rewards from emissions instead.";
7
+ 'W-TOKEN-SALE': "People pay for a share of a new token (a presale). Selling a token to raise money is what securities law looks at first, and many places limit who may buy: before real money, get a lawyer.";
7
8
  }>;
8
9
  /** The legal flags a checker verdict raises, each once, in the order the checker raised them: [{ code, says }]. */
9
10
  export declare const legalFlags: (verdict: any) => {
@@ -30,11 +30,11 @@ export declare function tableBatches(t: any): never[][];
30
30
  export declare function partPrize(o: any, m: any): "Raffled" | {
31
31
  Stash: any[];
32
32
  } | {
33
- Item?: undefined;
34
33
  Compressed: {
35
34
  item: any;
36
35
  tree: string;
37
36
  };
37
+ Item?: undefined;
38
38
  Held?: undefined;
39
39
  Nft?: undefined;
40
40
  Roll?: undefined;
@@ -137,8 +137,8 @@ export declare function boxArgs(b: any, m: any): {
137
137
  Item: any[];
138
138
  Collection?: undefined;
139
139
  } | {
140
- Item?: undefined;
141
140
  Collection: any[];
141
+ Item?: undefined;
142
142
  };
143
143
  key: any;
144
144
  test: any;
@@ -159,8 +159,8 @@ export declare function boxArgs(b: any, m: any): {
159
159
  Item: any[];
160
160
  Collection?: undefined;
161
161
  } | {
162
- Item?: undefined;
163
162
  Collection: any[];
163
+ Item?: undefined;
164
164
  };
165
165
  key: any;
166
166
  test: any;
@@ -341,11 +341,11 @@ export declare function scheduleArgs(s: any, m: any): {
341
341
  * of the pool), an item (a compressed NFT of it into the project's tree, "@tree"), one NFT of a stash, or a roll of a box.
342
342
  */
343
343
  export declare function prizeArgs(p: any, m: any): "Raffled" | {
344
- Item?: undefined;
345
344
  Compressed: {
346
345
  item: any;
347
346
  tree: string;
348
347
  };
348
+ Item?: undefined;
349
349
  Held?: undefined;
350
350
  Nft?: undefined;
351
351
  Roll?: undefined;
@@ -464,8 +464,8 @@ export declare function lotteryArgs(l: any, m: any): {
464
464
  Item: any[];
465
465
  Collection?: undefined;
466
466
  } | {
467
- Item?: undefined;
468
467
  Collection: any[];
468
+ Item?: undefined;
469
469
  };
470
470
  key: any;
471
471
  test: any;
@@ -514,8 +514,8 @@ export declare function lotteryArgs(l: any, m: any): {
514
514
  Item: any[];
515
515
  Collection?: undefined;
516
516
  } | {
517
- Item?: undefined;
518
517
  Collection: any[];
518
+ Item?: undefined;
519
519
  };
520
520
  key: any;
521
521
  test: any;
@@ -608,8 +608,8 @@ export declare function contestArgs(c: any, m: any, at?: any): {
608
608
  Item: any[];
609
609
  Collection?: undefined;
610
610
  } | {
611
- Item?: undefined;
612
611
  Collection: any[];
612
+ Item?: undefined;
613
613
  };
614
614
  key: any;
615
615
  test: any;
@@ -619,11 +619,11 @@ export declare function contestArgs(c: any, m: any, at?: any): {
619
619
  min_pot: bigint;
620
620
  stake: bigint;
621
621
  prize: string | {
622
- Item?: undefined;
623
622
  Compressed: {
624
623
  item: any;
625
624
  tree: string;
626
625
  };
626
+ Item?: undefined;
627
627
  Held?: undefined;
628
628
  Nft?: undefined;
629
629
  Roll?: undefined;
@@ -682,8 +682,8 @@ export declare function contestArgs(c: any, m: any, at?: any): {
682
682
  Item: any[];
683
683
  Collection?: undefined;
684
684
  } | {
685
- Item?: undefined;
686
685
  Collection: any[];
686
+ Item?: undefined;
687
687
  };
688
688
  key: any;
689
689
  test: any;
@@ -700,8 +700,8 @@ export declare function farmArgs(f: any, m: any): {
700
700
  Item: any[];
701
701
  Collection?: undefined;
702
702
  } | {
703
- Item?: undefined;
704
703
  Collection: any[];
704
+ Item?: undefined;
705
705
  };
706
706
  key: any;
707
707
  test: any;
@@ -780,8 +780,8 @@ export declare function auctionArgs(a: any, m: any): {
780
780
  Item: any[];
781
781
  Collection?: undefined;
782
782
  } | {
783
- Item?: undefined;
784
783
  Collection: any[];
784
+ Item?: undefined;
785
785
  };
786
786
  key: any;
787
787
  test: any;
@@ -792,8 +792,8 @@ export declare function auctionArgs(a: any, m: any): {
792
792
  Item: any[];
793
793
  Collection?: undefined;
794
794
  } | {
795
- Item?: undefined;
796
795
  Collection: any[];
796
+ Item?: undefined;
797
797
  };
798
798
  key: any;
799
799
  test: any;
@@ -801,11 +801,11 @@ export declare function auctionArgs(a: any, m: any): {
801
801
  };
802
802
  export declare function grantArgs(g: any, m: any): {
803
803
  gives: string | {
804
- Item?: undefined;
805
804
  Compressed: {
806
805
  item: any;
807
806
  tree: string;
808
807
  };
808
+ Item?: undefined;
809
809
  Held?: undefined;
810
810
  Nft?: undefined;
811
811
  Roll?: undefined;
@@ -911,8 +911,8 @@ export declare function grantArgs(g: any, m: any): {
911
911
  Item: any[];
912
912
  Collection?: undefined;
913
913
  } | {
914
- Item?: undefined;
915
914
  Collection: any[];
915
+ Item?: undefined;
916
916
  };
917
917
  key: any;
918
918
  test: any;
@@ -260,13 +260,13 @@ export declare function runTool(name: any, input?: {}, ctx?: {}): Promise<{
260
260
  warnings: any[];
261
261
  text: string;
262
262
  } | {
263
+ setupSol?: undefined;
263
264
  ok: boolean;
264
265
  transactions: number;
265
266
  approvals: number;
266
267
  steps: never[];
267
268
  text: string;
268
269
  command?: undefined;
269
- setupSol?: undefined;
270
270
  } | {
271
271
  ok: boolean;
272
272
  command: string;
@@ -297,6 +297,58 @@ export declare function runTool(name: any, input?: {}, ctx?: {}): Promise<{
297
297
  kind?: string | undefined;
298
298
  })[];
299
299
  text: string;
300
+ } | {
301
+ mint?: undefined;
302
+ ok: boolean;
303
+ text: string;
304
+ token?: undefined;
305
+ } | {
306
+ mint?: undefined;
307
+ ok: boolean;
308
+ token: {
309
+ key: string;
310
+ source: string;
311
+ } | {
312
+ key: string;
313
+ source: string;
314
+ name?: string | undefined;
315
+ symbol?: string | undefined;
316
+ decimals: any;
317
+ program: string;
318
+ mint: any;
319
+ powers: {
320
+ mintAuthority: string;
321
+ } | null;
322
+ };
323
+ text: string;
324
+ } | {
325
+ ok: boolean;
326
+ token: {
327
+ key: string;
328
+ source: string;
329
+ } | {
330
+ key: string;
331
+ source: string;
332
+ name?: string | undefined;
333
+ symbol?: string | undefined;
334
+ decimals: any;
335
+ program: string;
336
+ mint: any;
337
+ powers: {
338
+ mintAuthority: string;
339
+ } | null;
340
+ };
341
+ mint: {
342
+ address: string;
343
+ program: string;
344
+ decimals: any;
345
+ supply: string;
346
+ name: any;
347
+ symbol: any;
348
+ mintAuthority: string | null;
349
+ freezeAuthority: string | null;
350
+ };
351
+ text: string;
300
352
  } | {
301
353
  program: string;
302
354
  cluster: "devnet";