phygital-token-mcp 0.1.1

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 (40) hide show
  1. package/README.md +59 -0
  2. package/cursor-mcp.example.json +8 -0
  3. package/dist/index.d.ts +2 -0
  4. package/dist/index.js +481 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/docs.d.ts +17 -0
  7. package/dist/lib/docs.js +121 -0
  8. package/dist/lib/docs.js.map +1 -0
  9. package/dist/lib/format.d.ts +13 -0
  10. package/dist/lib/format.js +12 -0
  11. package/dist/lib/format.js.map +1 -0
  12. package/dist/lib/gating-json.d.ts +127 -0
  13. package/dist/lib/gating-json.js +346 -0
  14. package/dist/lib/gating-json.js.map +1 -0
  15. package/dist/lib/graphify.d.ts +2 -0
  16. package/dist/lib/graphify.js +35 -0
  17. package/dist/lib/graphify.js.map +1 -0
  18. package/dist/lib/instructions.d.ts +131 -0
  19. package/dist/lib/instructions.js +232 -0
  20. package/dist/lib/instructions.js.map +1 -0
  21. package/dist/lib/paths.d.ts +14 -0
  22. package/dist/lib/paths.js +77 -0
  23. package/dist/lib/paths.js.map +1 -0
  24. package/dist/lib/rpc.d.ts +3 -0
  25. package/dist/lib/rpc.js +22 -0
  26. package/dist/lib/rpc.js.map +1 -0
  27. package/dist/lib/sdk-surface.d.ts +33 -0
  28. package/dist/lib/sdk-surface.js +101 -0
  29. package/dist/lib/sdk-surface.js.map +1 -0
  30. package/dist/lib/verification.d.ts +43 -0
  31. package/dist/lib/verification.js +166 -0
  32. package/dist/lib/verification.js.map +1 -0
  33. package/docs/building-on-phygital/overview.md +46 -0
  34. package/docs/building-on-phygital/rust-cpi.md +55 -0
  35. package/docs/glossary.md +43 -0
  36. package/docs/sdk/surface-area.md +77 -0
  37. package/docs/verification/methods.md +58 -0
  38. package/docs/verification/overview.md +70 -0
  39. package/docs/verification/verify-asset-composable.md +97 -0
  40. package/package.json +52 -0
@@ -0,0 +1,35 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ import { pathExists, resolveGraphifyGraphPath, resolveRepoRoot } from "./paths.js";
4
+ const execFileAsync = promisify(execFile);
5
+ export async function runGraphify(mode, args) {
6
+ const repoRoot = resolveRepoRoot();
7
+ const graphPath = resolveGraphifyGraphPath();
8
+ const graphExists = await pathExists(graphPath);
9
+ if (!graphExists) {
10
+ throw new Error(`Graphify graph not found at ${graphPath}. Clone the phygital-token repo, run "graphify update .", and set PHYGITAL_TOKEN_REPO_ROOT to the repo root — or use search_docs / read_doc instead.`);
11
+ }
12
+ const commandArgs = [mode, ...args];
13
+ try {
14
+ const { stdout, stderr } = await execFileAsync("graphify", commandArgs, {
15
+ cwd: repoRoot,
16
+ maxBuffer: 10 * 1024 * 1024,
17
+ env: process.env,
18
+ });
19
+ const output = [stdout.trim(), stderr.trim()].filter(Boolean).join("\n");
20
+ return output || "(no output)";
21
+ }
22
+ catch (error) {
23
+ if (error && typeof error === "object" && "stdout" in error) {
24
+ const execError = error;
25
+ const output = [execError.stdout?.trim(), execError.stderr?.trim()]
26
+ .filter(Boolean)
27
+ .join("\n");
28
+ if (output) {
29
+ return output;
30
+ }
31
+ }
32
+ throw error;
33
+ }
34
+ }
35
+ //# sourceMappingURL=graphify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graphify.js","sourceRoot":"","sources":["../../src/lib/graphify.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,wBAAwB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAEnF,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAI1C,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,IAAkB,EAClB,IAAc;IAEd,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IACnC,MAAM,SAAS,GAAG,wBAAwB,EAAE,CAAC;IAC7C,MAAM,WAAW,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC;IAEhD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,+BAA+B,SAAS,sJAAsJ,CAC/L,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE,WAAW,EAAE;YACtE,GAAG,EAAE,QAAQ;YACb,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;YAC3B,GAAG,EAAE,OAAO,CAAC,GAAG;SACjB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzE,OAAO,MAAM,IAAI,aAAa,CAAC;IACjC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;YAC5D,MAAM,SAAS,GAAG,KAA+D,CAAC;YAClF,MAAM,MAAM,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC;iBAChE,MAAM,CAAC,OAAO,CAAC;iBACf,IAAI,CAAC,IAAI,CAAC,CAAC;YACd,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,131 @@
1
+ import { type Address } from "@solana/kit";
2
+ import { AssetType, type MetadataFields } from "phygital-token-sdk";
3
+ import type { OnChainCompositionPattern } from "./verification.js";
4
+ export declare function planCreateMint(fields: MetadataFields): {
5
+ instruction: string;
6
+ sdk: string;
7
+ metadata: MetadataFields;
8
+ requiredSigners: {
9
+ name: string;
10
+ role: string;
11
+ }[];
12
+ requiredAccounts: {
13
+ name: string;
14
+ role: string;
15
+ }[];
16
+ notes: string[];
17
+ };
18
+ export declare function planMintToken(input: {
19
+ assetPublicKey: string;
20
+ mint: string;
21
+ assetType: "Lockable" | "Transferable";
22
+ credentialId?: string;
23
+ }): Promise<{
24
+ instruction: string;
25
+ sdk: string;
26
+ assetType: "Lockable" | "Transferable";
27
+ derivedAccounts: {
28
+ assetPda: Address;
29
+ programAuthority: Address<string>;
30
+ programAuthorityTokenAccount: Address;
31
+ mint: string;
32
+ tokenProgram: Address<"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb">;
33
+ program: Address<"DdwhetyqgSB56XVcR33ySG5dFmvwbjSc5aSMHRg5Bk6A">;
34
+ };
35
+ requiredSigners: {
36
+ name: string;
37
+ role: string;
38
+ }[];
39
+ requiredInputs: {
40
+ secp256r1Pubkey: string;
41
+ credentialId: string;
42
+ assetType: AssetType;
43
+ };
44
+ notes: string[];
45
+ }>;
46
+ export declare function planTransfer(input: {
47
+ assetPublicKey: string;
48
+ recipient: string;
49
+ mint?: string;
50
+ currentOwner?: string;
51
+ }): Promise<{
52
+ flow: string[];
53
+ sdk: {
54
+ begin: string;
55
+ authenticate: string;
56
+ complete: string;
57
+ };
58
+ challenge: {
59
+ formula: string;
60
+ fetchedAt: string;
61
+ note: string;
62
+ };
63
+ derived: {
64
+ assetPda: Address;
65
+ assetPublicKey: string;
66
+ };
67
+ transferAccounts: {
68
+ sender: string;
69
+ recipient: string;
70
+ mint: string;
71
+ senderTokenAccount: string | Address;
72
+ recipientTokenAccount: string | Address;
73
+ tokenProgram: Address<"TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb">;
74
+ program: Address<"DdwhetyqgSB56XVcR33ySG5dFmvwbjSc5aSMHRg5Bk6A">;
75
+ };
76
+ instructions: string[];
77
+ notes: string[];
78
+ }>;
79
+ export declare function planVerifyAsset(input: {
80
+ message: string;
81
+ assetPublicKey?: string;
82
+ onChainPattern?: OnChainCompositionPattern;
83
+ }): Promise<{
84
+ onChainPattern: OnChainCompositionPattern;
85
+ patternName: string;
86
+ flow: string[];
87
+ sdk: {
88
+ begin: string;
89
+ authenticate: string;
90
+ buildArgs: string;
91
+ complete: string;
92
+ instruction: string;
93
+ offChainAuthOnly: string;
94
+ };
95
+ message: {
96
+ utf8: string;
97
+ byteLength: number;
98
+ onChainHash: string;
99
+ };
100
+ challenge: {
101
+ formula: string;
102
+ fetchedAt: string;
103
+ note: string;
104
+ };
105
+ derived: {
106
+ assetPda: string;
107
+ assetPublicKey: string | undefined;
108
+ } | undefined;
109
+ transactionLayout: {
110
+ order: string[];
111
+ verifyAssetAccounts: {
112
+ asset: string;
113
+ slot_hashes: string;
114
+ instructions_sysvar: string;
115
+ };
116
+ verifyAssetArgs: {
117
+ secp256r1VerifyArgs: string;
118
+ message: string;
119
+ };
120
+ };
121
+ programSide: string;
122
+ buildVerifyAssetArgsReturns: {
123
+ asset: string;
124
+ assetPda: string;
125
+ secp256r1Verify: string;
126
+ signedMessageIndex: string;
127
+ clientDataJson: string;
128
+ };
129
+ notes: string[];
130
+ }>;
131
+ export declare function parseAssetType(value: string): "Lockable" | "Transferable";
@@ -0,0 +1,232 @@
1
+ import { address, getAddressEncoder, getProgramDerivedAddress, } from "@solana/kit";
2
+ import { AssetType, PHYGITAL_TOKEN_PROGRAM_ADDRESS, findProgramAuthorityPda, parseSecp256r1Pubkey, validateMetadataFields, findAssetPda, } from "phygital-token-sdk";
3
+ import { sha256 } from "@noble/hashes/sha2.js";
4
+ const TOKEN_2022_PROGRAM_ADDRESS = address("TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb");
5
+ const ASSOCIATED_TOKEN_PROGRAM_ADDRESS = address("ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL");
6
+ async function findAssociatedTokenAddress(owner, mint, tokenProgram) {
7
+ const [ata] = await getProgramDerivedAddress({
8
+ programAddress: ASSOCIATED_TOKEN_PROGRAM_ADDRESS,
9
+ seeds: [
10
+ getAddressEncoder().encode(owner),
11
+ getAddressEncoder().encode(tokenProgram),
12
+ getAddressEncoder().encode(mint),
13
+ ],
14
+ });
15
+ return ata;
16
+ }
17
+ export function planCreateMint(fields) {
18
+ validateMetadataFields(fields);
19
+ return {
20
+ instruction: "create_mint",
21
+ sdk: "buildCreateMintInstructions",
22
+ metadata: fields,
23
+ requiredSigners: [
24
+ { name: "payer", role: "Pays rent and transaction fees" },
25
+ { name: "owner", role: "Design mint owner / update authority" },
26
+ { name: "groupMintAuthority", role: "Authority over the collection group mint" },
27
+ { name: "mint", role: "New design mint keypair (caller-supplied signer)" },
28
+ ],
29
+ requiredAccounts: [
30
+ { name: "groupMint", role: "Token-2022 collection (group) parent mint" },
31
+ ],
32
+ notes: [
33
+ "Creates a shared design mint (SFT template) within a collection.",
34
+ "Metadata name ≤ 32, symbol ≤ 10, uri ≤ 200 characters.",
35
+ ],
36
+ };
37
+ }
38
+ export async function planMintToken(input) {
39
+ const secp256r1Pubkey = parseSecp256r1Pubkey(input.assetPublicKey);
40
+ const assetPda = await findAssetPda(secp256r1Pubkey);
41
+ const [programAuthority] = await findProgramAuthorityPda();
42
+ const mint = address(input.mint);
43
+ const programAuthorityTokenAccount = await findAssociatedTokenAddress(programAuthority, mint, TOKEN_2022_PROGRAM_ADDRESS);
44
+ const assetType = input.assetType === "Lockable" ? AssetType.Lockable : AssetType.Transferable;
45
+ return {
46
+ instruction: "mint_token",
47
+ sdk: "buildMintTokenInstructions",
48
+ assetType: input.assetType,
49
+ derivedAccounts: {
50
+ assetPda,
51
+ programAuthority,
52
+ programAuthorityTokenAccount,
53
+ mint: input.mint,
54
+ tokenProgram: TOKEN_2022_PROGRAM_ADDRESS,
55
+ program: PHYGITAL_TOKEN_PROGRAM_ADDRESS,
56
+ },
57
+ requiredSigners: [
58
+ { name: "authority", role: "Mint authority for the design mint" },
59
+ ],
60
+ requiredInputs: {
61
+ secp256r1Pubkey: input.assetPublicKey,
62
+ credentialId: input.credentialId ?? "(base64url, 64 bytes when decoded)",
63
+ assetType,
64
+ },
65
+ notes: [
66
+ "Mints one SPL token into program custody and initializes the asset PDA.",
67
+ "Passkey pubkey must be compressed secp256r1 (33 bytes, 0x02/0x03 prefix).",
68
+ ],
69
+ };
70
+ }
71
+ export async function planTransfer(input) {
72
+ const assetPda = await findAssetPda(parseSecp256r1Pubkey(input.assetPublicKey));
73
+ const recipient = address(input.recipient);
74
+ let senderTokenAccount;
75
+ let recipientTokenAccount;
76
+ if (input.mint && input.currentOwner) {
77
+ const mint = address(input.mint);
78
+ const owner = address(input.currentOwner);
79
+ senderTokenAccount = await findAssociatedTokenAddress(owner, mint, TOKEN_2022_PROGRAM_ADDRESS);
80
+ recipientTokenAccount = await findAssociatedTokenAddress(recipient, mint, TOKEN_2022_PROGRAM_ADDRESS);
81
+ }
82
+ return {
83
+ flow: [
84
+ "1. beginTransfer({ rpc, displayInfo }) — fetch slot hash, build challenge",
85
+ "2. authenticatePasskeyForTransfer(session) — NFC/WebAuthn tap on physical asset",
86
+ "3. completeTransfer(session, webAuthnResponse, recipient) — build secp256r1_verify + execute_transfer",
87
+ ],
88
+ sdk: {
89
+ begin: "beginTransfer",
90
+ authenticate: "authenticatePasskeyForTransfer",
91
+ complete: "completeTransfer",
92
+ },
93
+ challenge: {
94
+ formula: "SHA256('transfer' || SHA256(assetPda) || slotHash)",
95
+ fetchedAt: "beginTransfer reads slot_hashes sysvar (~512 slot window)",
96
+ note: "Run beginTransfer with a live rpc to get challengeBase64 and slotNumber.",
97
+ },
98
+ derived: {
99
+ assetPda,
100
+ assetPublicKey: input.assetPublicKey,
101
+ },
102
+ transferAccounts: {
103
+ sender: input.currentOwner ?? "(fetch via fetchAssetDisplayInfo or on-chain asset account)",
104
+ recipient: input.recipient,
105
+ mint: input.mint ?? "(from asset / display info)",
106
+ senderTokenAccount: senderTokenAccount ??
107
+ "(ATA for currentOwner + mint — derive when mint and owner are known)",
108
+ recipientTokenAccount: recipientTokenAccount ??
109
+ "(ATA for recipient + mint — derive when mint is known)",
110
+ tokenProgram: TOKEN_2022_PROGRAM_ADDRESS,
111
+ program: PHYGITAL_TOKEN_PROGRAM_ADDRESS,
112
+ },
113
+ instructions: ["secp256r1_verify", "execute_transfer"],
114
+ notes: [
115
+ "Recipient is chosen at wallet confirmation — not bound in the passkey signature.",
116
+ "Challenge is slot-bound; complete the flow promptly (~512 slots).",
117
+ "Optional mint and currentOwner inputs enable ATA derivation in this plan output.",
118
+ ],
119
+ };
120
+ }
121
+ function buildVerifyAssetChallengeDescription(message) {
122
+ const messageBytes = new TextEncoder().encode(message);
123
+ const messageHash = sha256(messageBytes);
124
+ return `SHA256('verify_asset' || SHA256(message[${messageBytes.length} bytes]) || slotHash) — messageHash prefix: ${Buffer.from(messageHash.subarray(0, 8)).toString("hex")}…`;
125
+ }
126
+ export async function planVerifyAsset(input) {
127
+ const messageBytes = new TextEncoder().encode(input.message);
128
+ let assetPda;
129
+ if (input.assetPublicKey) {
130
+ assetPda = await findAssetPda(parseSecp256r1Pubkey(input.assetPublicKey));
131
+ }
132
+ const pattern = input.onChainPattern ?? "inspect";
133
+ const patternMeta = {
134
+ inspect: {
135
+ transactionOrder: ["secp256r1_verify", "verify_asset", "your_program_ix"],
136
+ clientSteps: [
137
+ "beginVerifyAsset({ rpc, message })",
138
+ "authenticatePasskeyForVerifyAsset(session)",
139
+ "completeVerifyAsset(session, response) — or buildVerifyAssetArgs + getVerifyAssetInstruction",
140
+ "buildYourProgramInstruction(/* same message bytes */)",
141
+ "sendTransaction([secp256r1Verify, verifyAssetIx, yourIx])",
142
+ ],
143
+ programSide: "Your Rust program scans instructions_sysvar for preceding verify_asset; validates message",
144
+ clientSdk: ["completeVerifyAsset", "getVerifyAssetInstruction"],
145
+ },
146
+ cpi: {
147
+ transactionOrder: ["secp256r1_verify", "your_program_ix"],
148
+ clientSteps: [
149
+ "beginVerifyAsset({ rpc, message })",
150
+ "authenticatePasskeyForVerifyAsset(session)",
151
+ "buildVerifyAssetArgs(session, response) — secp256r1Verify + verify args",
152
+ "buildYourProgramInstruction({ secp256r1VerifyArgs, message, assetPda })",
153
+ "sendTransaction([secp256r1Verify, yourIx]) — your program CPIs verify_asset",
154
+ ],
155
+ programSide: "Your Rust program CPIs verify_asset via VerifyAssetCpiBuilder (phygital-token-client)",
156
+ clientSdk: ["buildVerifyAssetArgs"],
157
+ },
158
+ standalone: {
159
+ transactionOrder: ["secp256r1_verify", "verify_asset"],
160
+ clientSteps: [
161
+ "beginVerifyAsset({ rpc, message })",
162
+ "authenticatePasskeyForVerifyAsset(session)",
163
+ "completeVerifyAsset(session, response)",
164
+ "sendTransaction([secp256r1Verify, verifyAssetIx])",
165
+ ],
166
+ programSide: "None — no custom program",
167
+ clientSdk: ["completeVerifyAsset"],
168
+ },
169
+ }[pattern];
170
+ return {
171
+ onChainPattern: pattern,
172
+ patternName: pattern === "inspect"
173
+ ? "A — client posts verify_asset, program inspects"
174
+ : pattern === "cpi"
175
+ ? "B — client posts secp256r1_verify, program CPIs verify_asset"
176
+ : "Standalone verify_asset",
177
+ flow: patternMeta.clientSteps,
178
+ sdk: {
179
+ begin: "beginVerifyAsset",
180
+ authenticate: "authenticatePasskeyForVerifyAsset",
181
+ buildArgs: "buildVerifyAssetArgs",
182
+ complete: "completeVerifyAsset",
183
+ instruction: "getVerifyAssetInstruction",
184
+ offChainAuthOnly: "verifyWithChallengeResponse (does NOT submit verify_asset)",
185
+ },
186
+ message: {
187
+ utf8: input.message,
188
+ byteLength: messageBytes.length,
189
+ onChainHash: "SHA256(message) — must match bytes passed to verify_asset",
190
+ },
191
+ challenge: {
192
+ formula: buildVerifyAssetChallengeDescription(input.message),
193
+ fetchedAt: "beginVerifyAsset reads slot_hashes sysvar (~512 slot window)",
194
+ note: "Run beginVerifyAsset with a live rpc to get challengeBase64 and slotNumber.",
195
+ },
196
+ derived: assetPda ? { assetPda, assetPublicKey: input.assetPublicKey } : undefined,
197
+ transactionLayout: {
198
+ order: patternMeta.transactionOrder,
199
+ verifyAssetAccounts: {
200
+ asset: "writable PDA matching passkey pubkey",
201
+ slot_hashes: "SysvarS1otHashes111111111111111111111111111",
202
+ instructions_sysvar: "Sysvar1nstructions1111111111111111111111111",
203
+ },
204
+ verifyAssetArgs: {
205
+ secp256r1VerifyArgs: "{ signedMessageIndex, slotNumber, clientDataJson }",
206
+ message: "same Uint8Array as beginVerifyAsset",
207
+ },
208
+ },
209
+ programSide: patternMeta.programSide,
210
+ buildVerifyAssetArgsReturns: {
211
+ asset: "decoded on-chain Asset account",
212
+ assetPda: "Address",
213
+ secp256r1Verify: "Instruction for Secp256r1SigVerify program",
214
+ signedMessageIndex: "number",
215
+ clientDataJson: "Uint8Array",
216
+ },
217
+ notes: [
218
+ "verifyWithChallengeResponse is off-chain only — it does not submit verify_asset.",
219
+ "Pattern A: client includes verify_asset; your program inspects instructions sysvar.",
220
+ "Pattern B: client uses buildVerifyAssetArgs; your program CPIs verify_asset.",
221
+ "verify_asset updates asset.last_transfer_slot; slot must be strictly increasing.",
222
+ ],
223
+ };
224
+ }
225
+ export function parseAssetType(value) {
226
+ const normalized = value.trim();
227
+ if (normalized === "Lockable" || normalized === "Transferable") {
228
+ return normalized;
229
+ }
230
+ throw new Error('assetType must be "Lockable" or "Transferable".');
231
+ }
232
+ //# sourceMappingURL=instructions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instructions.js","sourceRoot":"","sources":["../../src/lib/instructions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** MCP package root (`mcp/phygital-token/`). */
2
+ export declare const MCP_PACKAGE_ROOT: string;
3
+ export declare const MCP_DOCS_DIR: string;
4
+ export declare const GLOSSARY_PATH: string;
5
+ /** Monorepo root when developing in-tree; override with PHYGITAL_TOKEN_REPO_ROOT. */
6
+ export declare function resolveRepoRoot(): string;
7
+ /** SDK docs from the installed npm package, or monorepo fallback. */
8
+ export declare function resolveSdkDocsDir(): Promise<string | undefined>;
9
+ export declare function resolveSdkReadmePath(): Promise<string | undefined>;
10
+ export declare function resolveGraphifyGraphPath(): string;
11
+ export declare function resolveVerifyTsPath(): string;
12
+ export declare function resolveVerifyAssetTsPath(): string;
13
+ export declare function resolveRustVerifyAssetPath(): string;
14
+ export declare function pathExists(filePath: string): Promise<boolean>;
@@ -0,0 +1,77 @@
1
+ import { createRequire } from "node:module";
2
+ import { access } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ const PACKAGE_ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../..");
6
+ const require = createRequire(import.meta.url);
7
+ /** MCP package root (`mcp/phygital-token/`). */
8
+ export const MCP_PACKAGE_ROOT = PACKAGE_ROOT;
9
+ export const MCP_DOCS_DIR = path.join(PACKAGE_ROOT, "docs");
10
+ export const GLOSSARY_PATH = path.join(MCP_DOCS_DIR, "glossary.md");
11
+ /** Monorepo root when developing in-tree; override with PHYGITAL_TOKEN_REPO_ROOT. */
12
+ export function resolveRepoRoot() {
13
+ const override = process.env.PHYGITAL_TOKEN_REPO_ROOT?.trim();
14
+ if (override) {
15
+ return override;
16
+ }
17
+ return path.resolve(PACKAGE_ROOT, "../..");
18
+ }
19
+ function resolveSdkPackageRoot() {
20
+ try {
21
+ return path.dirname(require.resolve("phygital-token-sdk/package.json"));
22
+ }
23
+ catch {
24
+ return undefined;
25
+ }
26
+ }
27
+ /** SDK docs from the installed npm package, or monorepo fallback. */
28
+ export async function resolveSdkDocsDir() {
29
+ const sdkRoot = resolveSdkPackageRoot();
30
+ if (sdkRoot) {
31
+ const docsDir = path.join(sdkRoot, "docs");
32
+ if (await pathExists(docsDir)) {
33
+ return docsDir;
34
+ }
35
+ }
36
+ const monorepoDocs = path.join(resolveRepoRoot(), "clients/js/phygital-token/docs");
37
+ if (await pathExists(monorepoDocs)) {
38
+ return monorepoDocs;
39
+ }
40
+ return undefined;
41
+ }
42
+ export async function resolveSdkReadmePath() {
43
+ const sdkRoot = resolveSdkPackageRoot();
44
+ if (sdkRoot) {
45
+ const readmePath = path.join(sdkRoot, "README.md");
46
+ if (await pathExists(readmePath)) {
47
+ return readmePath;
48
+ }
49
+ }
50
+ const monorepoReadme = path.join(resolveRepoRoot(), "clients/js/phygital-token/README.md");
51
+ if (await pathExists(monorepoReadme)) {
52
+ return monorepoReadme;
53
+ }
54
+ return undefined;
55
+ }
56
+ export function resolveGraphifyGraphPath() {
57
+ return path.join(resolveRepoRoot(), "graphify-out/graph.json");
58
+ }
59
+ export function resolveVerifyTsPath() {
60
+ return path.join(resolveRepoRoot(), "clients/js/phygital-token/src/utils/verify.ts");
61
+ }
62
+ export function resolveVerifyAssetTsPath() {
63
+ return path.join(resolveRepoRoot(), "clients/js/phygital-token/src/instructions/verifyAsset.ts");
64
+ }
65
+ export function resolveRustVerifyAssetPath() {
66
+ return path.join(resolveRepoRoot(), "clients/rust/phygital-token/src/generated/instructions/verify_asset.rs");
67
+ }
68
+ export async function pathExists(filePath) {
69
+ try {
70
+ await access(filePath);
71
+ return true;
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ }
77
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/lib/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type Rpc, type SolanaRpcApi } from "@solana/kit";
2
+ export declare function getRpcUrl(override?: string): string;
3
+ export declare function createRpc(override?: string): Rpc<SolanaRpcApi>;
@@ -0,0 +1,22 @@
1
+ import { createSolanaRpc } from "@solana/kit";
2
+ let cachedRpc = null;
3
+ let cachedRpcUrl = null;
4
+ export function getRpcUrl(override) {
5
+ const url = override?.trim() ||
6
+ process.env.PHYGITAL_TOKEN_RPC_URL?.trim() ||
7
+ process.env.HELIUS_RPC_URL?.trim();
8
+ if (!url) {
9
+ throw new Error("RPC URL required. Pass rpcUrl to the tool or set PHYGITAL_TOKEN_RPC_URL (or HELIUS_RPC_URL).");
10
+ }
11
+ return url;
12
+ }
13
+ export function createRpc(override) {
14
+ const url = getRpcUrl(override);
15
+ if (cachedRpc && cachedRpcUrl === url) {
16
+ return cachedRpc;
17
+ }
18
+ cachedRpc = createSolanaRpc(url);
19
+ cachedRpcUrl = url;
20
+ return cachedRpc;
21
+ }
22
+ //# sourceMappingURL=rpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/lib/rpc.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAA+B,MAAM,aAAa,CAAC;AAE3E,IAAI,SAAS,GAA6B,IAAI,CAAC;AAC/C,IAAI,YAAY,GAAkB,IAAI,CAAC;AAEvC,MAAM,UAAU,SAAS,CAAC,QAAiB;IACzC,MAAM,GAAG,GACP,QAAQ,EAAE,IAAI,EAAE;QAChB,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,EAAE;QAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC;IAErC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,8FAA8F,CAC/F,CAAC;IACJ,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,QAAiB;IACzC,MAAM,GAAG,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEhC,IAAI,SAAS,IAAI,YAAY,KAAK,GAAG,EAAE,CAAC;QACtC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IACjC,YAAY,GAAG,GAAG,CAAC;IACnB,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,33 @@
1
+ export declare const SDK_SURFACE: {
2
+ readonly mint: readonly ["buildCreateMintInstructions", "buildMintTokenInstructions", "parseSecp256r1Pubkey", "parseCredentialId", "validateMetadataFields"];
3
+ readonly transfer: readonly ["beginTransfer", "authenticatePasskeyForTransfer", "completeTransfer"];
4
+ readonly verifyAssetComposable: readonly ["beginVerifyAsset", "authenticatePasskeyForVerifyAsset", "buildVerifyAssetArgs", "completeVerifyAsset"];
5
+ readonly verification: readonly ["verifyDynamicUrl", "verifyDynamicUrlWithoutCounterCheck", "verifyWithChallengeResponse", "verifyWithChallengeResponseOverNfc"];
6
+ readonly onChainComposition: {
7
+ readonly patternA_inspect: {
8
+ readonly client: readonly ["beginVerifyAsset", "completeVerifyAsset"];
9
+ readonly transaction: readonly ["secp256r1_verify", "verify_asset", "your_program_ix"];
10
+ readonly program: "inspect instructions sysvar for verify_asset message";
11
+ };
12
+ readonly patternB_cpi: {
13
+ readonly client: readonly ["beginVerifyAsset", "buildVerifyAssetArgs"];
14
+ readonly transaction: readonly ["secp256r1_verify", "your_program_ix"];
15
+ readonly program: "CPI verify_asset via VerifyAssetCpiBuilder";
16
+ };
17
+ };
18
+ readonly assetLookup: readonly ["findAssetPda", "fetchAssetFromCredentialId", "fetchAllAssetsFromOwner", "fetchAssetDisplayInfo", "resolveMedia"];
19
+ readonly gating: readonly ["Gating", "GatingTraitValue", "formatGatingPredicate", "summarizeGatingEvaluationFailure", "summarizeGatingFailure", "summarizeGatingTierFailure", "evaluateAssetGating"];
20
+ readonly gatingTypes: readonly ["EvaluateAssetGatingOptions", "GatingFilter", "GatingAssetPredicate", "GatingTier", "GatingEvaluationResult", "GatingFilterResult", "GatingTierEvaluationResult", "GatingTiersEvaluationResult"];
21
+ readonly generated: readonly ["getCreateMintInstructionAsync", "getMintTokenInstructionAsync", "getExecuteTransferInstructionAsync", "getVerifyAssetInstruction", "getSetLockStateInstruction", "fetchAsset", "findProgramAuthorityPda", "PHYGITAL_TOKEN_PROGRAM_ADDRESS"];
22
+ readonly rustClient: {
23
+ readonly crate: "phygital-token-client";
24
+ readonly path: "clients/rust/phygital-token";
25
+ readonly features: readonly ["anchor", "fetch"];
26
+ readonly cpi: readonly ["VerifyAssetCpi", "VerifyAssetCpiBuilder", "VerifyAssetInstructionArgs"];
27
+ readonly types: readonly ["Asset", "Secp256r1VerifyArgs", "AssetType"];
28
+ };
29
+ };
30
+ export declare function readSourceExcerpt(which: "verify.ts" | "verifyAsset.ts" | "rust_verify_asset.rs", maxLines?: number): Promise<{
31
+ path: string;
32
+ excerpt: string;
33
+ }>;