solforge 0.2.11 → 0.2.13
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/package.json +4 -8
- package/docs/API.md +0 -379
- package/docs/CONFIGURATION.md +0 -407
- package/docs/bun-single-file-executable.md +0 -585
- package/docs/cli-plan.md +0 -154
- package/docs/data-indexing-plan.md +0 -214
- package/docs/gui-roadmap.md +0 -202
- package/scripts/decode-b58.ts +0 -10
- package/scripts/install.sh +0 -112
- package/server/index.ts +0 -5
- package/server/lib/base58.ts +0 -33
- package/server/lib/faucet.ts +0 -110
- package/server/lib/instruction-parser.ts +0 -328
- package/server/lib/parsers/spl-associated-token-account.ts +0 -50
- package/server/lib/parsers/spl-token.ts +0 -340
- package/server/lib/spl-token.ts +0 -57
- package/server/methods/TEMPLATE.md +0 -117
- package/server/methods/account/get-account-info.ts +0 -86
- package/server/methods/account/get-balance.ts +0 -23
- package/server/methods/account/get-multiple-accounts.ts +0 -84
- package/server/methods/account/get-parsed-account-info.ts +0 -17
- package/server/methods/account/index.ts +0 -12
- package/server/methods/account/parsers/index.ts +0 -52
- package/server/methods/account/parsers/loader-upgradeable.ts +0 -79
- package/server/methods/account/parsers/spl-token.ts +0 -256
- package/server/methods/account/parsers/system.ts +0 -4
- package/server/methods/account/request-airdrop.ts +0 -271
- package/server/methods/admin/adopt-mint-authority.ts +0 -94
- package/server/methods/admin/clone-program-accounts.ts +0 -55
- package/server/methods/admin/clone-program.ts +0 -152
- package/server/methods/admin/clone-token-accounts.ts +0 -117
- package/server/methods/admin/clone-token-mint.ts +0 -82
- package/server/methods/admin/create-mint.ts +0 -114
- package/server/methods/admin/create-token-account.ts +0 -137
- package/server/methods/admin/helpers.ts +0 -70
- package/server/methods/admin/index.ts +0 -10
- package/server/methods/admin/list-mints.ts +0 -21
- package/server/methods/admin/load-program.ts +0 -52
- package/server/methods/admin/mint-to.ts +0 -266
- package/server/methods/block/get-block-height.ts +0 -5
- package/server/methods/block/get-block.ts +0 -31
- package/server/methods/block/get-blocks-with-limit.ts +0 -19
- package/server/methods/block/get-latest-blockhash.ts +0 -12
- package/server/methods/block/get-slot.ts +0 -5
- package/server/methods/block/index.ts +0 -6
- package/server/methods/block/is-blockhash-valid.ts +0 -19
- package/server/methods/epoch/get-cluster-nodes.ts +0 -17
- package/server/methods/epoch/get-epoch-info.ts +0 -16
- package/server/methods/epoch/get-epoch-schedule.ts +0 -15
- package/server/methods/epoch/get-highest-snapshot-slot.ts +0 -9
- package/server/methods/epoch/get-leader-schedule.ts +0 -8
- package/server/methods/epoch/get-max-retransmit-slot.ts +0 -9
- package/server/methods/epoch/get-max-shred-insert-slot.ts +0 -9
- package/server/methods/epoch/get-slot-leader.ts +0 -6
- package/server/methods/epoch/get-slot-leaders.ts +0 -9
- package/server/methods/epoch/get-stake-activation.ts +0 -9
- package/server/methods/epoch/get-stake-minimum-delegation.ts +0 -9
- package/server/methods/epoch/get-vote-accounts.ts +0 -19
- package/server/methods/epoch/index.ts +0 -13
- package/server/methods/epoch/minimum-ledger-slot.ts +0 -5
- package/server/methods/fee/get-fee-calculator-for-blockhash.ts +0 -12
- package/server/methods/fee/get-fee-for-message.ts +0 -8
- package/server/methods/fee/get-fee-rate-governor.ts +0 -16
- package/server/methods/fee/get-fees.ts +0 -14
- package/server/methods/fee/get-recent-prioritization-fees.ts +0 -22
- package/server/methods/fee/index.ts +0 -5
- package/server/methods/get-address-lookup-table.ts +0 -27
- package/server/methods/index.ts +0 -265
- package/server/methods/performance/get-recent-performance-samples.ts +0 -25
- package/server/methods/performance/get-transaction-count.ts +0 -5
- package/server/methods/performance/index.ts +0 -2
- package/server/methods/program/get-block-commitment.ts +0 -9
- package/server/methods/program/get-block-production.ts +0 -14
- package/server/methods/program/get-block-time.ts +0 -21
- package/server/methods/program/get-blocks.ts +0 -11
- package/server/methods/program/get-first-available-block.ts +0 -9
- package/server/methods/program/get-genesis-hash.ts +0 -6
- package/server/methods/program/get-identity.ts +0 -6
- package/server/methods/program/get-inflation-governor.ts +0 -15
- package/server/methods/program/get-inflation-rate.ts +0 -10
- package/server/methods/program/get-inflation-reward.ts +0 -12
- package/server/methods/program/get-largest-accounts.ts +0 -8
- package/server/methods/program/get-parsed-program-accounts.ts +0 -12
- package/server/methods/program/get-parsed-token-accounts-by-delegate.ts +0 -12
- package/server/methods/program/get-parsed-token-accounts-by-owner.ts +0 -12
- package/server/methods/program/get-program-accounts.ts +0 -221
- package/server/methods/program/get-supply.ts +0 -13
- package/server/methods/program/get-token-account-balance.ts +0 -60
- package/server/methods/program/get-token-accounts-by-delegate.ts +0 -82
- package/server/methods/program/get-token-accounts-by-owner.ts +0 -416
- package/server/methods/program/get-token-largest-accounts.ts +0 -81
- package/server/methods/program/get-token-supply.ts +0 -39
- package/server/methods/program/index.ts +0 -21
- package/server/methods/solforge/index.ts +0 -158
- package/server/methods/system/get-health.ts +0 -5
- package/server/methods/system/get-minimum-balance-for-rent-exemption.ts +0 -13
- package/server/methods/system/get-version.ts +0 -9
- package/server/methods/system/index.ts +0 -3
- package/server/methods/transaction/get-confirmed-transaction.ts +0 -11
- package/server/methods/transaction/get-parsed-transaction.ts +0 -17
- package/server/methods/transaction/get-signature-statuses.ts +0 -79
- package/server/methods/transaction/get-signatures-for-address.ts +0 -41
- package/server/methods/transaction/get-transaction.ts +0 -639
- package/server/methods/transaction/index.ts +0 -7
- package/server/methods/transaction/inner-instructions.test.ts +0 -104
- package/server/methods/transaction/send-transaction.ts +0 -469
- package/server/methods/transaction/simulate-transaction.ts +0 -57
- package/server/rpc-server.ts +0 -521
- package/server/types.ts +0 -109
- package/server/ws-server.ts +0 -178
- package/src/api-server-entry.ts +0 -109
- package/src/cli/bootstrap.ts +0 -67
- package/src/cli/commands/airdrop.ts +0 -37
- package/src/cli/commands/config.ts +0 -39
- package/src/cli/commands/mint.ts +0 -187
- package/src/cli/commands/program-clone.ts +0 -122
- package/src/cli/commands/program-load.ts +0 -64
- package/src/cli/commands/rpc-start.ts +0 -49
- package/src/cli/commands/token-adopt-authority.ts +0 -37
- package/src/cli/commands/token-clone.ts +0 -112
- package/src/cli/commands/token-create.ts +0 -81
- package/src/cli/main.ts +0 -152
- package/src/cli/run-solforge.ts +0 -112
- package/src/cli/setup-utils.ts +0 -54
- package/src/cli/setup-wizard.ts +0 -258
- package/src/cli/utils/args.ts +0 -15
- package/src/commands/add-program.ts +0 -333
- package/src/commands/init.ts +0 -122
- package/src/commands/list.ts +0 -136
- package/src/commands/mint.ts +0 -287
- package/src/commands/start.ts +0 -881
- package/src/commands/status.ts +0 -99
- package/src/commands/stop.ts +0 -405
- package/src/config/index.ts +0 -146
- package/src/config/manager.ts +0 -157
- package/src/db/index.ts +0 -83
- package/src/db/schema/accounts.ts +0 -23
- package/src/db/schema/address-signatures.ts +0 -31
- package/src/db/schema/index.ts +0 -6
- package/src/db/schema/meta-kv.ts +0 -9
- package/src/db/schema/transactions.ts +0 -36
- package/src/db/schema/tx-account-states.ts +0 -23
- package/src/db/schema/tx-accounts.ts +0 -33
- package/src/db/tx-store.ts +0 -264
- package/src/gui/public/app.css +0 -1556
- package/src/gui/public/build/main.css +0 -1569
- package/src/gui/public/build/main.js +0 -303
- package/src/gui/public/build/main.js.txt +0 -231
- package/src/gui/public/index.html +0 -19
- package/src/gui/server.ts +0 -296
- package/src/gui/src/api.ts +0 -127
- package/src/gui/src/app.tsx +0 -441
- package/src/gui/src/components/airdrop-mint-form.tsx +0 -246
- package/src/gui/src/components/clone-program-modal.tsx +0 -202
- package/src/gui/src/components/clone-token-modal.tsx +0 -230
- package/src/gui/src/components/modal.tsx +0 -134
- package/src/gui/src/components/programs-panel.tsx +0 -124
- package/src/gui/src/components/status-panel.tsx +0 -136
- package/src/gui/src/components/tokens-panel.tsx +0 -122
- package/src/gui/src/hooks/use-interval.ts +0 -17
- package/src/gui/src/index.css +0 -557
- package/src/gui/src/main.tsx +0 -17
- package/src/index.ts +0 -216
- package/src/migrations-bundled.ts +0 -23
- package/src/rpc/start.ts +0 -44
- package/src/services/api-server.ts +0 -504
- package/src/services/port-manager.ts +0 -174
- package/src/services/process-registry.ts +0 -153
- package/src/services/program-cloner.ts +0 -317
- package/src/services/token-cloner.ts +0 -811
- package/src/services/validator.ts +0 -293
- package/src/types/config.ts +0 -110
- package/src/utils/shell.ts +0 -110
- package/src/utils/token-loader.ts +0 -115
- /package/{start.js → start.cjs} +0 -0
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { RpcMethodHandler } from "../../types";
|
|
2
|
-
|
|
3
|
-
export const getInflationReward: RpcMethodHandler = (id, params, context) => {
|
|
4
|
-
const [addresses] = params || [[]];
|
|
5
|
-
const rewards = (addresses || []).map(() => ({
|
|
6
|
-
amount: 0,
|
|
7
|
-
effectiveSlot: Number(context.slot),
|
|
8
|
-
epoch: 0,
|
|
9
|
-
postBalance: 1000000000,
|
|
10
|
-
}));
|
|
11
|
-
return context.createSuccessResponse(id, rewards);
|
|
12
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { RpcMethodHandler } from "../../types";
|
|
2
|
-
import { getProgramAccounts } from "./get-program-accounts";
|
|
3
|
-
|
|
4
|
-
export const getParsedProgramAccounts: RpcMethodHandler = (
|
|
5
|
-
id,
|
|
6
|
-
params,
|
|
7
|
-
context,
|
|
8
|
-
) => {
|
|
9
|
-
const [programId, config] = params || [];
|
|
10
|
-
const cfg = { ...(config || {}), encoding: "jsonParsed" };
|
|
11
|
-
return getProgramAccounts(id, [programId, cfg], context);
|
|
12
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { RpcMethodHandler } from "../../types";
|
|
2
|
-
import { getTokenAccountsByDelegate } from "./get-token-accounts-by-delegate";
|
|
3
|
-
|
|
4
|
-
export const getParsedTokenAccountsByDelegate: RpcMethodHandler = (
|
|
5
|
-
id,
|
|
6
|
-
params,
|
|
7
|
-
context,
|
|
8
|
-
) => {
|
|
9
|
-
const [delegate, filter, config] = params || [];
|
|
10
|
-
const cfg = { ...(config || {}), encoding: "jsonParsed" };
|
|
11
|
-
return getTokenAccountsByDelegate(id, [delegate, filter, cfg], context);
|
|
12
|
-
};
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { RpcMethodHandler } from "../../types";
|
|
2
|
-
import { getTokenAccountsByOwner } from "./get-token-accounts-by-owner";
|
|
3
|
-
|
|
4
|
-
export const getParsedTokenAccountsByOwner: RpcMethodHandler = (
|
|
5
|
-
id,
|
|
6
|
-
params,
|
|
7
|
-
context,
|
|
8
|
-
) => {
|
|
9
|
-
const [owner, filter, config] = params || [];
|
|
10
|
-
const cfg = { ...(config || {}), encoding: "jsonParsed" };
|
|
11
|
-
return getTokenAccountsByOwner(id, [owner, filter, cfg], context);
|
|
12
|
-
};
|
|
@@ -1,221 +0,0 @@
|
|
|
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
|
-
type GpaFilter = {
|
|
25
|
-
dataSize?: number;
|
|
26
|
-
memcmp?: { offset?: number; bytes?: string };
|
|
27
|
-
};
|
|
28
|
-
const filters: GpaFilter[] = (cfg?.filters as unknown as GpaFilter[]) || [];
|
|
29
|
-
const limit = Math.max(1, Math.min(Number(cfg?.limit ?? 10000), 50000));
|
|
30
|
-
|
|
31
|
-
let rows: Array<{ address: string }> = [];
|
|
32
|
-
try {
|
|
33
|
-
rows = (await context.store?.getAccountsByOwner(programStr, limit)) || [];
|
|
34
|
-
} catch {}
|
|
35
|
-
|
|
36
|
-
const out: unknown[] = [];
|
|
37
|
-
for (const r of rows) {
|
|
38
|
-
try {
|
|
39
|
-
const pk = new PublicKey(r.address);
|
|
40
|
-
const acc = context.svm.getAccount(pk);
|
|
41
|
-
if (!acc) continue;
|
|
42
|
-
|
|
43
|
-
// dataSize filter
|
|
44
|
-
if (
|
|
45
|
-
filters.some((f) => typeof f?.dataSize === "number") &&
|
|
46
|
-
!filters.every(
|
|
47
|
-
(f) => f.dataSize == null || (acc.data?.length ?? 0) === f.dataSize,
|
|
48
|
-
)
|
|
49
|
-
)
|
|
50
|
-
continue;
|
|
51
|
-
// memcmp filters
|
|
52
|
-
const raw = new Uint8Array(acc.data || []);
|
|
53
|
-
let memcmpOk = true;
|
|
54
|
-
for (const f of filters) {
|
|
55
|
-
if (!f?.memcmp) continue;
|
|
56
|
-
const off = Number(f.memcmp.offset || 0);
|
|
57
|
-
const bytesStr: string = String(f.memcmp.bytes || "");
|
|
58
|
-
let needle: Uint8Array;
|
|
59
|
-
try {
|
|
60
|
-
needle = context.decodeBase58(bytesStr);
|
|
61
|
-
} catch {
|
|
62
|
-
try {
|
|
63
|
-
needle = Buffer.from(bytesStr, "base64");
|
|
64
|
-
} catch {
|
|
65
|
-
needle = new Uint8Array();
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
for (let i = 0; i < needle.length; i++) {
|
|
69
|
-
if (raw[off + i] !== needle[i]) {
|
|
70
|
-
memcmpOk = false;
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
if (!memcmpOk) break;
|
|
75
|
-
}
|
|
76
|
-
if (!memcmpOk) continue;
|
|
77
|
-
|
|
78
|
-
if (
|
|
79
|
-
encoding === "jsonParsed" &&
|
|
80
|
-
(programPk.equals(TOKEN_PROGRAM_ID) ||
|
|
81
|
-
programPk.equals(TOKEN_2022_PROGRAM_ID))
|
|
82
|
-
) {
|
|
83
|
-
if ((acc.data?.length ?? 0) < 165) continue;
|
|
84
|
-
const ownerPk = new PublicKey(acc.owner);
|
|
85
|
-
const dec = unpackAccount(
|
|
86
|
-
pk,
|
|
87
|
-
{ data: Buffer.from(acc.data), owner: ownerPk },
|
|
88
|
-
programPk,
|
|
89
|
-
);
|
|
90
|
-
// mint decimals
|
|
91
|
-
let decimals = 0;
|
|
92
|
-
try {
|
|
93
|
-
const mintAcc = context.svm.getAccount(dec.mint);
|
|
94
|
-
if (mintAcc) {
|
|
95
|
-
const mintProg = new PublicKey(mintAcc.owner).equals(
|
|
96
|
-
TOKEN_2022_PROGRAM_ID,
|
|
97
|
-
)
|
|
98
|
-
? TOKEN_2022_PROGRAM_ID
|
|
99
|
-
: TOKEN_PROGRAM_ID;
|
|
100
|
-
const mi = unpackMint(
|
|
101
|
-
dec.mint,
|
|
102
|
-
{
|
|
103
|
-
data: Buffer.from(mintAcc.data),
|
|
104
|
-
owner: new PublicKey(mintAcc.owner),
|
|
105
|
-
},
|
|
106
|
-
mintProg,
|
|
107
|
-
);
|
|
108
|
-
decimals = mi?.decimals ?? 0;
|
|
109
|
-
}
|
|
110
|
-
} catch {}
|
|
111
|
-
const amount = BigInt(dec.amount?.toString?.() ?? dec.amount ?? 0);
|
|
112
|
-
const ui = decimals >= 0 ? Number(amount) / 10 ** decimals : null;
|
|
113
|
-
const state = dec.isFrozen
|
|
114
|
-
? "frozen"
|
|
115
|
-
: dec.isInitialized
|
|
116
|
-
? "initialized"
|
|
117
|
-
: "uninitialized";
|
|
118
|
-
const programLabel = programPk.equals(TOKEN_2022_PROGRAM_ID)
|
|
119
|
-
? "spl-token-2022"
|
|
120
|
-
: "spl-token";
|
|
121
|
-
out.push({
|
|
122
|
-
pubkey: r.address,
|
|
123
|
-
account: {
|
|
124
|
-
lamports: Number(acc.lamports || 0n),
|
|
125
|
-
owner: programStr,
|
|
126
|
-
executable: !!acc.executable,
|
|
127
|
-
rentEpoch: Number(acc.rentEpoch || 0),
|
|
128
|
-
data: {
|
|
129
|
-
program: programLabel,
|
|
130
|
-
parsed: {
|
|
131
|
-
type: "account",
|
|
132
|
-
info: {
|
|
133
|
-
mint: dec.mint.toBase58(),
|
|
134
|
-
owner: dec.owner.toBase58(),
|
|
135
|
-
tokenAmount: {
|
|
136
|
-
amount: amount.toString(),
|
|
137
|
-
decimals,
|
|
138
|
-
uiAmount: ui,
|
|
139
|
-
uiAmountString: (ui ?? 0).toString(),
|
|
140
|
-
},
|
|
141
|
-
state,
|
|
142
|
-
isNative: !!dec.isNative,
|
|
143
|
-
delegatedAmount: {
|
|
144
|
-
amount: BigInt(
|
|
145
|
-
dec.delegatedAmount?.toString?.() ??
|
|
146
|
-
dec.delegatedAmount ??
|
|
147
|
-
0,
|
|
148
|
-
).toString(),
|
|
149
|
-
decimals,
|
|
150
|
-
uiAmount: null,
|
|
151
|
-
uiAmountString: "0",
|
|
152
|
-
},
|
|
153
|
-
delegate: dec.delegate ? dec.delegate.toBase58() : null,
|
|
154
|
-
rentExemptReserve: dec.isNative
|
|
155
|
-
? {
|
|
156
|
-
amount: BigInt(
|
|
157
|
-
dec.rentExemptReserve?.toString?.() ??
|
|
158
|
-
dec.rentExemptReserve ??
|
|
159
|
-
0,
|
|
160
|
-
).toString(),
|
|
161
|
-
decimals: 9,
|
|
162
|
-
uiAmount: null,
|
|
163
|
-
uiAmountString: "0",
|
|
164
|
-
}
|
|
165
|
-
: null,
|
|
166
|
-
closeAuthority: dec.closeAuthority
|
|
167
|
-
? dec.closeAuthority.toBase58()
|
|
168
|
-
: null,
|
|
169
|
-
},
|
|
170
|
-
},
|
|
171
|
-
space: acc.data?.length ?? 0,
|
|
172
|
-
},
|
|
173
|
-
},
|
|
174
|
-
});
|
|
175
|
-
} else if (
|
|
176
|
-
encoding === "jsonParsed" &&
|
|
177
|
-
programStr === "BPFLoaderUpgradeab1e11111111111111111111111"
|
|
178
|
-
) {
|
|
179
|
-
const parsed = parseUpgradeableLoader(programStr, raw, context);
|
|
180
|
-
out.push({
|
|
181
|
-
pubkey: r.address,
|
|
182
|
-
account: {
|
|
183
|
-
lamports: Number(acc.lamports || 0n),
|
|
184
|
-
owner: programStr,
|
|
185
|
-
executable: !!acc.executable,
|
|
186
|
-
rentEpoch: Number(acc.rentEpoch || 0),
|
|
187
|
-
data: parsed,
|
|
188
|
-
},
|
|
189
|
-
});
|
|
190
|
-
} else {
|
|
191
|
-
let bytes = Buffer.from(acc.data);
|
|
192
|
-
if (
|
|
193
|
-
dataSlice &&
|
|
194
|
-
Number.isFinite(dataSlice.offset) &&
|
|
195
|
-
Number.isFinite(dataSlice.length)
|
|
196
|
-
) {
|
|
197
|
-
bytes = bytes.subarray(
|
|
198
|
-
dataSlice.offset,
|
|
199
|
-
dataSlice.offset + dataSlice.length,
|
|
200
|
-
);
|
|
201
|
-
}
|
|
202
|
-
out.push({
|
|
203
|
-
pubkey: r.address,
|
|
204
|
-
account: {
|
|
205
|
-
lamports: Number(acc.lamports || 0n),
|
|
206
|
-
owner: new PublicKey(acc.owner).toBase58(),
|
|
207
|
-
data: [bytes.toString("base64"), "base64"] as const,
|
|
208
|
-
executable: !!acc.executable,
|
|
209
|
-
rentEpoch: Number(acc.rentEpoch || 0),
|
|
210
|
-
},
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
} catch {}
|
|
214
|
-
}
|
|
215
|
-
|
|
216
|
-
return context.createSuccessResponse(id, out);
|
|
217
|
-
} catch (error: unknown) {
|
|
218
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
219
|
-
return context.createErrorResponse(id, -32602, "Invalid params", message);
|
|
220
|
-
}
|
|
221
|
-
};
|
|
@@ -1,13 +0,0 @@
|
|
|
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
|
-
};
|
|
@@ -1,60 +0,0 @@
|
|
|
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: unknown) {
|
|
57
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
58
|
-
return context.createErrorResponse(id, -32602, "Invalid params", message);
|
|
59
|
-
}
|
|
60
|
-
};
|
|
@@ -1,82 +0,0 @@
|
|
|
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: unknown[] = [];
|
|
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: unknown) {
|
|
79
|
-
const message = e instanceof Error ? e.message : String(e);
|
|
80
|
-
return context.createErrorResponse(id, -32602, "Invalid params", message);
|
|
81
|
-
}
|
|
82
|
-
};
|