solforge 0.1.6 → 0.2.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 (194) hide show
  1. package/.agi/agi.sqlite +0 -0
  2. package/.claude/settings.local.json +9 -0
  3. package/.github/workflows/release-binaries.yml +133 -0
  4. package/.tmp/.787ebcdbf7b8fde8-00000000.hm +0 -0
  5. package/.tmp/.bffe6efebdf8aedc-00000000.hm +0 -0
  6. package/AGENTS.md +271 -0
  7. package/CLAUDE.md +106 -0
  8. package/PROJECT_STRUCTURE.md +124 -0
  9. package/README.md +367 -393
  10. package/SOLANA_KIT_GUIDE.md +251 -0
  11. package/SOLFORGE.md +119 -0
  12. package/biome.json +34 -0
  13. package/bun.lock +743 -0
  14. package/docs/bun-single-file-executable.md +585 -0
  15. package/docs/cli-plan.md +154 -0
  16. package/docs/data-indexing-plan.md +214 -0
  17. package/docs/gui-roadmap.md +202 -0
  18. package/drizzle/0000_friendly_millenium_guard.sql +53 -0
  19. package/drizzle/0001_stale_sentinels.sql +2 -0
  20. package/drizzle/meta/0000_snapshot.json +329 -0
  21. package/drizzle/meta/0001_snapshot.json +345 -0
  22. package/drizzle/meta/_journal.json +20 -0
  23. package/drizzle.config.ts +12 -0
  24. package/index.ts +21 -0
  25. package/mint.sh +47 -0
  26. package/package.json +45 -69
  27. package/postcss.config.js +6 -0
  28. package/rpc-server.ts.backup +519 -0
  29. package/server/index.ts +5 -0
  30. package/server/lib/base58.ts +33 -0
  31. package/server/lib/faucet.ts +110 -0
  32. package/server/lib/spl-token.ts +57 -0
  33. package/server/methods/TEMPLATE.md +117 -0
  34. package/server/methods/account/get-account-info.ts +90 -0
  35. package/server/methods/account/get-balance.ts +27 -0
  36. package/server/methods/account/get-multiple-accounts.ts +83 -0
  37. package/server/methods/account/get-parsed-account-info.ts +21 -0
  38. package/server/methods/account/index.ts +12 -0
  39. package/server/methods/account/parsers/index.ts +52 -0
  40. package/server/methods/account/parsers/loader-upgradeable.ts +66 -0
  41. package/server/methods/account/parsers/spl-token.ts +237 -0
  42. package/server/methods/account/parsers/system.ts +4 -0
  43. package/server/methods/account/request-airdrop.ts +219 -0
  44. package/server/methods/admin/adopt-mint-authority.ts +94 -0
  45. package/server/methods/admin/clone-program-accounts.ts +55 -0
  46. package/server/methods/admin/clone-program.ts +152 -0
  47. package/server/methods/admin/clone-token-accounts.ts +117 -0
  48. package/server/methods/admin/clone-token-mint.ts +82 -0
  49. package/server/methods/admin/create-mint.ts +114 -0
  50. package/server/methods/admin/create-token-account.ts +137 -0
  51. package/server/methods/admin/helpers.ts +70 -0
  52. package/server/methods/admin/index.ts +10 -0
  53. package/server/methods/admin/list-mints.ts +21 -0
  54. package/server/methods/admin/load-program.ts +52 -0
  55. package/server/methods/admin/mint-to.ts +278 -0
  56. package/server/methods/block/get-block-height.ts +5 -0
  57. package/server/methods/block/get-block.ts +35 -0
  58. package/server/methods/block/get-blocks-with-limit.ts +23 -0
  59. package/server/methods/block/get-latest-blockhash.ts +12 -0
  60. package/server/methods/block/get-slot.ts +5 -0
  61. package/server/methods/block/index.ts +6 -0
  62. package/server/methods/block/is-blockhash-valid.ts +23 -0
  63. package/server/methods/epoch/get-cluster-nodes.ts +17 -0
  64. package/server/methods/epoch/get-epoch-info.ts +16 -0
  65. package/server/methods/epoch/get-epoch-schedule.ts +15 -0
  66. package/server/methods/epoch/get-highest-snapshot-slot.ts +9 -0
  67. package/server/methods/epoch/get-leader-schedule.ts +8 -0
  68. package/server/methods/epoch/get-max-retransmit-slot.ts +9 -0
  69. package/server/methods/epoch/get-max-shred-insert-slot.ts +9 -0
  70. package/server/methods/epoch/get-slot-leader.ts +6 -0
  71. package/server/methods/epoch/get-slot-leaders.ts +9 -0
  72. package/server/methods/epoch/get-stake-activation.ts +9 -0
  73. package/server/methods/epoch/get-stake-minimum-delegation.ts +9 -0
  74. package/server/methods/epoch/get-vote-accounts.ts +19 -0
  75. package/server/methods/epoch/index.ts +13 -0
  76. package/server/methods/epoch/minimum-ledger-slot.ts +5 -0
  77. package/server/methods/fee/get-fee-calculator-for-blockhash.ts +12 -0
  78. package/server/methods/fee/get-fee-for-message.ts +8 -0
  79. package/server/methods/fee/get-fee-rate-governor.ts +16 -0
  80. package/server/methods/fee/get-fees.ts +14 -0
  81. package/server/methods/fee/get-recent-prioritization-fees.ts +22 -0
  82. package/server/methods/fee/index.ts +5 -0
  83. package/server/methods/get-address-lookup-table.ts +31 -0
  84. package/server/methods/index.ts +265 -0
  85. package/server/methods/performance/get-recent-performance-samples.ts +25 -0
  86. package/server/methods/performance/get-transaction-count.ts +5 -0
  87. package/server/methods/performance/index.ts +2 -0
  88. package/server/methods/program/get-block-commitment.ts +9 -0
  89. package/server/methods/program/get-block-production.ts +14 -0
  90. package/server/methods/program/get-block-time.ts +21 -0
  91. package/server/methods/program/get-blocks.ts +11 -0
  92. package/server/methods/program/get-first-available-block.ts +9 -0
  93. package/server/methods/program/get-genesis-hash.ts +6 -0
  94. package/server/methods/program/get-identity.ts +6 -0
  95. package/server/methods/program/get-inflation-governor.ts +15 -0
  96. package/server/methods/program/get-inflation-rate.ts +10 -0
  97. package/server/methods/program/get-inflation-reward.ts +12 -0
  98. package/server/methods/program/get-largest-accounts.ts +8 -0
  99. package/server/methods/program/get-parsed-program-accounts.ts +12 -0
  100. package/server/methods/program/get-parsed-token-accounts-by-delegate.ts +12 -0
  101. package/server/methods/program/get-parsed-token-accounts-by-owner.ts +12 -0
  102. package/server/methods/program/get-program-accounts.ts +221 -0
  103. package/server/methods/program/get-supply.ts +13 -0
  104. package/server/methods/program/get-token-account-balance.ts +64 -0
  105. package/server/methods/program/get-token-accounts-by-delegate.ts +81 -0
  106. package/server/methods/program/get-token-accounts-by-owner.ts +390 -0
  107. package/server/methods/program/get-token-largest-accounts.ts +80 -0
  108. package/server/methods/program/get-token-supply.ts +38 -0
  109. package/server/methods/program/index.ts +21 -0
  110. package/server/methods/solforge/index.ts +155 -0
  111. package/server/methods/system/get-health.ts +5 -0
  112. package/server/methods/system/get-minimum-balance-for-rent-exemption.ts +13 -0
  113. package/server/methods/system/get-version.ts +9 -0
  114. package/server/methods/system/index.ts +3 -0
  115. package/server/methods/transaction/get-confirmed-transaction.ts +11 -0
  116. package/server/methods/transaction/get-parsed-transaction.ts +21 -0
  117. package/server/methods/transaction/get-signature-statuses.ts +72 -0
  118. package/server/methods/transaction/get-signatures-for-address.ts +45 -0
  119. package/server/methods/transaction/get-transaction.ts +428 -0
  120. package/server/methods/transaction/index.ts +7 -0
  121. package/server/methods/transaction/send-transaction.ts +232 -0
  122. package/server/methods/transaction/simulate-transaction.ts +56 -0
  123. package/server/rpc-server.ts +474 -0
  124. package/server/types.ts +74 -0
  125. package/server/ws-server.ts +171 -0
  126. package/sf.config.json +38 -0
  127. package/src/cli/bootstrap.ts +67 -0
  128. package/src/cli/commands/airdrop.ts +37 -0
  129. package/src/cli/commands/config.ts +39 -0
  130. package/src/cli/commands/mint.ts +187 -0
  131. package/src/cli/commands/program-clone.ts +124 -0
  132. package/src/cli/commands/program-load.ts +64 -0
  133. package/src/cli/commands/rpc-start.ts +46 -0
  134. package/src/cli/commands/token-adopt-authority.ts +37 -0
  135. package/src/cli/commands/token-clone.ts +113 -0
  136. package/src/cli/commands/token-create.ts +81 -0
  137. package/src/cli/main.ts +130 -0
  138. package/src/cli/run-solforge.ts +98 -0
  139. package/src/cli/setup-utils.ts +54 -0
  140. package/src/cli/setup-wizard.ts +256 -0
  141. package/src/cli/utils/args.ts +15 -0
  142. package/src/config/index.ts +130 -0
  143. package/src/db/index.ts +83 -0
  144. package/src/db/schema/accounts.ts +23 -0
  145. package/src/db/schema/address-signatures.ts +31 -0
  146. package/src/db/schema/index.ts +5 -0
  147. package/src/db/schema/meta-kv.ts +9 -0
  148. package/src/db/schema/transactions.ts +29 -0
  149. package/src/db/schema/tx-accounts.ts +33 -0
  150. package/src/db/tx-store.ts +229 -0
  151. package/src/gui/public/app.css +1 -0
  152. package/src/gui/public/index.html +19 -0
  153. package/src/gui/server.ts +297 -0
  154. package/src/gui/src/api.ts +127 -0
  155. package/src/gui/src/app.tsx +390 -0
  156. package/src/gui/src/components/airdrop-mint-form.tsx +216 -0
  157. package/src/gui/src/components/clone-program-modal.tsx +183 -0
  158. package/src/gui/src/components/clone-token-modal.tsx +211 -0
  159. package/src/gui/src/components/modal.tsx +127 -0
  160. package/src/gui/src/components/programs-panel.tsx +112 -0
  161. package/src/gui/src/components/status-panel.tsx +122 -0
  162. package/src/gui/src/components/tokens-panel.tsx +116 -0
  163. package/src/gui/src/hooks/use-interval.ts +17 -0
  164. package/src/gui/src/index.css +529 -0
  165. package/src/gui/src/main.tsx +17 -0
  166. package/src/migrations-bundled.ts +17 -0
  167. package/src/rpc/start.ts +44 -0
  168. package/tailwind.config.js +27 -0
  169. package/test-client.ts +120 -0
  170. package/tmp/inspect-html.ts +4 -0
  171. package/tmp/response-test.ts +5 -0
  172. package/tmp/test-html.ts +5 -0
  173. package/tmp/test-server.ts +13 -0
  174. package/tsconfig.json +24 -23
  175. package/LICENSE +0 -21
  176. package/scripts/postinstall.cjs +0 -103
  177. package/src/api-server-entry.ts +0 -109
  178. package/src/commands/add-program.ts +0 -337
  179. package/src/commands/init.ts +0 -122
  180. package/src/commands/list.ts +0 -136
  181. package/src/commands/mint.ts +0 -336
  182. package/src/commands/start.ts +0 -878
  183. package/src/commands/status.ts +0 -99
  184. package/src/commands/stop.ts +0 -406
  185. package/src/config/manager.ts +0 -157
  186. package/src/index.ts +0 -188
  187. package/src/services/api-server.ts +0 -532
  188. package/src/services/port-manager.ts +0 -177
  189. package/src/services/process-registry.ts +0 -154
  190. package/src/services/program-cloner.ts +0 -317
  191. package/src/services/token-cloner.ts +0 -809
  192. package/src/services/validator.ts +0 -295
  193. package/src/types/config.ts +0 -110
  194. package/src/utils/shell.ts +0 -110
@@ -0,0 +1,221 @@
1
+ import {
2
+ TOKEN_2022_PROGRAM_ID,
3
+ TOKEN_PROGRAM_ID,
4
+ unpackAccount,
5
+ unpackMint,
6
+ } from "@solana/spl-token";
7
+ import { PublicKey } from "@solana/web3.js";
8
+ import type { RpcMethodHandler } from "../../types";
9
+ import { parseUpgradeableLoader } from "../account/parsers/loader-upgradeable";
10
+
11
+ export const getProgramAccounts: RpcMethodHandler = async (
12
+ id,
13
+ params,
14
+ context,
15
+ ) => {
16
+ const [programId, cfg] = params || [];
17
+ try {
18
+ const programPk = new PublicKey(programId);
19
+ const programStr = programPk.toBase58();
20
+ const encoding: string = cfg?.encoding || "base64";
21
+ const dataSlice = cfg?.dataSlice as
22
+ | { offset: number; length: number }
23
+ | undefined;
24
+ const filters = (cfg?.filters || []) as Array<any>;
25
+ const limit = Math.max(1, Math.min(Number(cfg?.limit ?? 10000), 50000));
26
+
27
+ let rows: Array<{ address: string }> = [];
28
+ try {
29
+ rows = (await context.store?.getAccountsByOwner(programStr, limit)) || [];
30
+ } catch {}
31
+
32
+ const out: any[] = [];
33
+ for (const r of rows) {
34
+ try {
35
+ const pk = new PublicKey(r.address);
36
+ const acc = context.svm.getAccount(pk);
37
+ if (!acc) continue;
38
+
39
+ // dataSize filter
40
+ if (
41
+ filters.some((f) => typeof f?.dataSize === "number") &&
42
+ !filters.every(
43
+ (f) => f.dataSize == null || (acc.data?.length ?? 0) === f.dataSize,
44
+ )
45
+ )
46
+ continue;
47
+ // memcmp filters
48
+ const raw = new Uint8Array(acc.data || []);
49
+ let memcmpOk = true;
50
+ for (const f of filters) {
51
+ if (!f?.memcmp) continue;
52
+ const off = Number(f.memcmp.offset || 0);
53
+ const bytesStr: string = String(f.memcmp.bytes || "");
54
+ let needle: Uint8Array;
55
+ try {
56
+ needle = context.decodeBase58(bytesStr);
57
+ } catch {
58
+ try {
59
+ needle = Buffer.from(bytesStr, "base64");
60
+ } catch {
61
+ needle = new Uint8Array();
62
+ }
63
+ }
64
+ for (let i = 0; i < needle.length; i++) {
65
+ if (raw[off + i] !== needle[i]) {
66
+ memcmpOk = false;
67
+ break;
68
+ }
69
+ }
70
+ if (!memcmpOk) break;
71
+ }
72
+ if (!memcmpOk) continue;
73
+
74
+ if (
75
+ encoding === "jsonParsed" &&
76
+ (programPk.equals(TOKEN_PROGRAM_ID) ||
77
+ programPk.equals(TOKEN_2022_PROGRAM_ID))
78
+ ) {
79
+ if ((acc.data?.length ?? 0) < 165) continue;
80
+ const ownerPk = new PublicKey(acc.owner);
81
+ const dec = unpackAccount(
82
+ pk,
83
+ { data: Buffer.from(acc.data), owner: ownerPk },
84
+ programPk,
85
+ );
86
+ // mint decimals
87
+ let decimals = 0;
88
+ try {
89
+ const mintAcc = context.svm.getAccount(dec.mint);
90
+ if (mintAcc) {
91
+ const mintProg = new PublicKey(mintAcc.owner).equals(
92
+ TOKEN_2022_PROGRAM_ID,
93
+ )
94
+ ? TOKEN_2022_PROGRAM_ID
95
+ : TOKEN_PROGRAM_ID;
96
+ const mi = unpackMint(
97
+ dec.mint,
98
+ {
99
+ data: Buffer.from(mintAcc.data),
100
+ owner: new PublicKey(mintAcc.owner),
101
+ },
102
+ mintProg,
103
+ );
104
+ decimals = mi?.decimals ?? 0;
105
+ }
106
+ } catch {}
107
+ const amount = BigInt(dec.amount?.toString?.() ?? dec.amount ?? 0);
108
+ const ui = decimals >= 0 ? Number(amount) / 10 ** decimals : null;
109
+ const state = dec.isFrozen
110
+ ? "frozen"
111
+ : dec.isInitialized
112
+ ? "initialized"
113
+ : "uninitialized";
114
+ const programLabel = programPk.equals(TOKEN_2022_PROGRAM_ID)
115
+ ? "spl-token-2022"
116
+ : "spl-token";
117
+ out.push({
118
+ pubkey: r.address,
119
+ account: {
120
+ lamports: Number(acc.lamports || 0n),
121
+ owner: programStr,
122
+ executable: !!acc.executable,
123
+ rentEpoch: Number(acc.rentEpoch || 0),
124
+ data: {
125
+ program: programLabel,
126
+ parsed: {
127
+ type: "account",
128
+ info: {
129
+ mint: dec.mint.toBase58(),
130
+ owner: dec.owner.toBase58(),
131
+ tokenAmount: {
132
+ amount: amount.toString(),
133
+ decimals,
134
+ uiAmount: ui,
135
+ uiAmountString: (ui ?? 0).toString(),
136
+ },
137
+ state,
138
+ isNative: !!dec.isNative,
139
+ delegatedAmount: {
140
+ amount: BigInt(
141
+ dec.delegatedAmount?.toString?.() ??
142
+ dec.delegatedAmount ??
143
+ 0,
144
+ ).toString(),
145
+ decimals,
146
+ uiAmount: null,
147
+ uiAmountString: "0",
148
+ },
149
+ delegate: dec.delegate ? dec.delegate.toBase58() : null,
150
+ rentExemptReserve: dec.isNative
151
+ ? {
152
+ amount: BigInt(
153
+ dec.rentExemptReserve?.toString?.() ??
154
+ dec.rentExemptReserve ??
155
+ 0,
156
+ ).toString(),
157
+ decimals: 9,
158
+ uiAmount: null,
159
+ uiAmountString: "0",
160
+ }
161
+ : null,
162
+ closeAuthority: dec.closeAuthority
163
+ ? dec.closeAuthority.toBase58()
164
+ : null,
165
+ },
166
+ },
167
+ space: acc.data?.length ?? 0,
168
+ },
169
+ },
170
+ });
171
+ } else if (
172
+ encoding === "jsonParsed" &&
173
+ programStr === "BPFLoaderUpgradeab1e11111111111111111111111"
174
+ ) {
175
+ const parsed = parseUpgradeableLoader(programStr, raw, context);
176
+ out.push({
177
+ pubkey: r.address,
178
+ account: {
179
+ lamports: Number(acc.lamports || 0n),
180
+ owner: programStr,
181
+ executable: !!acc.executable,
182
+ rentEpoch: Number(acc.rentEpoch || 0),
183
+ data: parsed,
184
+ },
185
+ });
186
+ } else {
187
+ let bytes = Buffer.from(acc.data);
188
+ if (
189
+ dataSlice &&
190
+ Number.isFinite(dataSlice.offset) &&
191
+ Number.isFinite(dataSlice.length)
192
+ ) {
193
+ bytes = bytes.subarray(
194
+ dataSlice.offset,
195
+ dataSlice.offset + dataSlice.length,
196
+ );
197
+ }
198
+ out.push({
199
+ pubkey: r.address,
200
+ account: {
201
+ lamports: Number(acc.lamports || 0n),
202
+ owner: new PublicKey(acc.owner).toBase58(),
203
+ data: [bytes.toString("base64"), "base64"] as const,
204
+ executable: !!acc.executable,
205
+ rentEpoch: Number(acc.rentEpoch || 0),
206
+ },
207
+ });
208
+ }
209
+ } catch {}
210
+ }
211
+
212
+ return context.createSuccessResponse(id, out);
213
+ } catch (error: any) {
214
+ return context.createErrorResponse(
215
+ id,
216
+ -32602,
217
+ "Invalid params",
218
+ error.message,
219
+ );
220
+ }
221
+ };
@@ -0,0 +1,13 @@
1
+ import type { RpcMethodHandler } from "../../types";
2
+
3
+ export const getSupply: RpcMethodHandler = (id, _params, context) => {
4
+ return context.createSuccessResponse(id, {
5
+ context: { slot: Number(context.slot) },
6
+ value: {
7
+ circulating: 1000000000000,
8
+ nonCirculating: 0,
9
+ nonCirculatingAccounts: [],
10
+ total: 1000000000000,
11
+ },
12
+ });
13
+ };
@@ -0,0 +1,64 @@
1
+ import {
2
+ TOKEN_2022_PROGRAM_ID,
3
+ TOKEN_PROGRAM_ID,
4
+ unpackAccount,
5
+ unpackMint,
6
+ } from "@solana/spl-token";
7
+ import { PublicKey } from "@solana/web3.js";
8
+ import type { RpcMethodHandler } from "../../types";
9
+
10
+ export const getTokenAccountBalance: RpcMethodHandler = (
11
+ id,
12
+ params,
13
+ context,
14
+ ) => {
15
+ const [pubkey] = params || [];
16
+ try {
17
+ const pubkeyBytes = context.decodeBase58(pubkey);
18
+ const address = new PublicKey(pubkeyBytes);
19
+ const account = context.svm.getAccount(address);
20
+ if (!account)
21
+ return context.createErrorResponse(id, -32602, "Account not found");
22
+ const ownerPk = new PublicKey(account.owner);
23
+ const programPk = ownerPk.equals(TOKEN_2022_PROGRAM_ID)
24
+ ? TOKEN_2022_PROGRAM_ID
25
+ : TOKEN_PROGRAM_ID;
26
+ const decoded = unpackAccount(
27
+ address,
28
+ { data: Buffer.from(account.data), owner: ownerPk },
29
+ programPk,
30
+ );
31
+ const mintAcc = context.svm.getAccount(decoded.mint);
32
+ const mintInfo = mintAcc
33
+ ? unpackMint(
34
+ decoded.mint,
35
+ {
36
+ data: Buffer.from(mintAcc.data),
37
+ owner: new PublicKey(mintAcc.owner),
38
+ },
39
+ new PublicKey(mintAcc.owner).equals(TOKEN_2022_PROGRAM_ID)
40
+ ? TOKEN_2022_PROGRAM_ID
41
+ : TOKEN_PROGRAM_ID,
42
+ )
43
+ : null;
44
+ const decimals = mintInfo?.decimals ?? 0;
45
+ const amount = BigInt(decoded.amount?.toString?.() ?? decoded.amount ?? 0);
46
+ const ui = Number(amount) / 10 ** decimals;
47
+ return context.createSuccessResponse(id, {
48
+ context: { slot: Number(context.slot) },
49
+ value: {
50
+ amount: amount.toString(),
51
+ decimals,
52
+ uiAmount: ui,
53
+ uiAmountString: ui.toString(),
54
+ },
55
+ });
56
+ } catch (error: any) {
57
+ return context.createErrorResponse(
58
+ id,
59
+ -32602,
60
+ "Invalid params",
61
+ error.message,
62
+ );
63
+ }
64
+ };
@@ -0,0 +1,81 @@
1
+ import {
2
+ TOKEN_2022_PROGRAM_ID,
3
+ TOKEN_PROGRAM_ID,
4
+ unpackAccount,
5
+ } from "@solana/spl-token";
6
+ import { PublicKey } from "@solana/web3.js";
7
+ import type { RpcMethodHandler } from "../../types";
8
+
9
+ export const getTokenAccountsByDelegate: RpcMethodHandler = async (
10
+ id,
11
+ params,
12
+ context,
13
+ ) => {
14
+ const [delegateStr, filter, config] = params || [];
15
+ try {
16
+ const delegate = new PublicKey(delegateStr);
17
+ const requestedProgramId: string | null = filter?.programId
18
+ ? String(filter.programId)
19
+ : null;
20
+ const classicId = TOKEN_PROGRAM_ID.toBase58();
21
+ const token2022Id = TOKEN_2022_PROGRAM_ID.toBase58();
22
+ const programFilter =
23
+ requestedProgramId === token2022Id ? token2022Id : classicId;
24
+ const rows =
25
+ (await context.store?.getAccountsByOwner(programFilter, 50_000)) || [];
26
+ const out: any[] = [];
27
+ for (const r of rows) {
28
+ try {
29
+ const acc = context.svm.getAccount(new PublicKey(r.address));
30
+ if (!acc) continue;
31
+ if ((acc.data?.length ?? 0) < 165) continue;
32
+ const programPk =
33
+ programFilter === token2022Id
34
+ ? TOKEN_2022_PROGRAM_ID
35
+ : TOKEN_PROGRAM_ID;
36
+ const dec = unpackAccount(
37
+ new PublicKey(r.address),
38
+ { data: Buffer.from(acc.data), owner: new PublicKey(acc.owner) },
39
+ programPk,
40
+ );
41
+ if (!dec.delegate || !dec.delegate.equals(delegate)) continue;
42
+ if ((config?.encoding || "jsonParsed") === "jsonParsed") {
43
+ out.push({
44
+ pubkey: r.address,
45
+ account: {
46
+ lamports: Number(acc.lamports || 0n),
47
+ owner: TOKEN_PROGRAM_ID.toBase58(),
48
+ executable: !!acc.executable,
49
+ rentEpoch: Number(acc.rentEpoch || 0),
50
+ data: {
51
+ program: "spl-token",
52
+ parsed: { type: "account", info: {} },
53
+ space: data.length,
54
+ },
55
+ },
56
+ });
57
+ } else {
58
+ out.push({
59
+ pubkey: r.address,
60
+ account: {
61
+ lamports: Number(acc.lamports || 0n),
62
+ owner: TOKEN_PROGRAM_ID.toBase58(),
63
+ executable: !!acc.executable,
64
+ rentEpoch: Number(acc.rentEpoch || 0),
65
+ data: [
66
+ Buffer.from(acc.data).toString("base64"),
67
+ "base64",
68
+ ] as const,
69
+ },
70
+ });
71
+ }
72
+ } catch {}
73
+ }
74
+ return context.createSuccessResponse(id, {
75
+ context: { slot: Number(context.slot) },
76
+ value: out,
77
+ });
78
+ } catch (e: any) {
79
+ return context.createErrorResponse(id, -32602, "Invalid params", e.message);
80
+ }
81
+ };