@springmint/x402-payment 1.0.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.
- package/LICENSE +21 -0
- package/README.md +261 -0
- package/SKILL.md +159 -0
- package/dist/cli/254.index.js +222 -0
- package/dist/cli/743.index.js +102795 -0
- package/dist/cli/cli.d.ts +1 -0
- package/dist/cli/cli.d.ts.map +1 -0
- package/dist/cli/client.d.ts +62 -0
- package/dist/cli/client.d.ts.map +1 -0
- package/dist/cli/config.d.ts +13 -0
- package/dist/cli/config.d.ts.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/package.json +3 -0
- package/dist/cli/x402_invoke.js +643 -0
- package/dist/lib/client.d.ts +63 -0
- package/dist/lib/client.d.ts.map +1 -0
- package/dist/lib/client.js +108 -0
- package/dist/lib/client.js.map +1 -0
- package/dist/lib/config.d.ts +14 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +110 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/index.d.ts +4 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +3 -0
- package/dist/lib/index.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export interface CreateClientOptions {
|
|
2
|
+
/** TRON private key. If not provided, will be auto-discovered from env/config files. */
|
|
3
|
+
tronPrivateKey?: string;
|
|
4
|
+
/** EVM private key. If not provided, will be auto-discovered from env/config files. */
|
|
5
|
+
evmPrivateKey?: string;
|
|
6
|
+
/** TronGrid API key. If not provided, will be auto-discovered from env/config files. */
|
|
7
|
+
tronGridApiKey?: string;
|
|
8
|
+
/** Suppress log output. Default: false. */
|
|
9
|
+
silent?: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Create a fully configured X402Client with TRON and EVM payment mechanisms registered.
|
|
13
|
+
*
|
|
14
|
+
* Automatically discovers private keys from environment variables, config files,
|
|
15
|
+
* and mcporter config. You can also pass keys explicitly.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createX402Client(options?: CreateClientOptions): Promise<import("@springmint/x402").X402Client>;
|
|
18
|
+
/**
|
|
19
|
+
* Create a fetch client that automatically handles HTTP 402 Payment Required responses.
|
|
20
|
+
*
|
|
21
|
+
* Usage:
|
|
22
|
+
* ```ts
|
|
23
|
+
* const fetchClient = await createX402FetchClient();
|
|
24
|
+
* const response = await fetchClient.request("https://paid-api.com/endpoint", {
|
|
25
|
+
* method: "POST",
|
|
26
|
+
* headers: { "Content-Type": "application/json" },
|
|
27
|
+
* body: JSON.stringify({ key: "value" }),
|
|
28
|
+
* });
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export declare function createX402FetchClient(options?: CreateClientOptions): Promise<import("@springmint/x402").X402FetchClient>;
|
|
32
|
+
/**
|
|
33
|
+
* High-level helper: invoke an x402-enabled endpoint and return the parsed response.
|
|
34
|
+
*
|
|
35
|
+
* Supports two modes:
|
|
36
|
+
* - **Entrypoint mode**: provide `entrypoint` to call `{url}/entrypoints/{entrypoint}/invoke`
|
|
37
|
+
* - **Direct mode**: omit `entrypoint` to request the URL directly
|
|
38
|
+
*
|
|
39
|
+
* Usage:
|
|
40
|
+
* ```ts
|
|
41
|
+
* // Entrypoint mode
|
|
42
|
+
* const result = await invokeEndpoint("https://api.example.com", {
|
|
43
|
+
* entrypoint: "chat",
|
|
44
|
+
* input: { prompt: "hello" },
|
|
45
|
+
* });
|
|
46
|
+
*
|
|
47
|
+
* // Direct mode
|
|
48
|
+
* const result = await invokeEndpoint("https://api.example.com/some/path", {
|
|
49
|
+
* method: "GET",
|
|
50
|
+
* });
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export declare function invokeEndpoint(url: string, options?: {
|
|
54
|
+
entrypoint?: string;
|
|
55
|
+
input?: any;
|
|
56
|
+
method?: string;
|
|
57
|
+
clientOptions?: CreateClientOptions;
|
|
58
|
+
}): Promise<{
|
|
59
|
+
status: number;
|
|
60
|
+
headers: Record<string, string>;
|
|
61
|
+
body: any;
|
|
62
|
+
}>;
|
|
63
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,mBAAmB;IAClC,wFAAwF;IACxF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,uFAAuF;IACvF,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,wFAAwF;IACxF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,mBAAwB,kDA2CvE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,GAAE,mBAAwB,uDAI5E;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,mBAAmB,CAAC;CAChC,GACL,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,EAAE,GAAG,CAAA;CAAE,CAAC,CAoCzE"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { findPrivateKey, findApiKey } from "./config.js";
|
|
2
|
+
/**
|
|
3
|
+
* Create a fully configured X402Client with TRON and EVM payment mechanisms registered.
|
|
4
|
+
*
|
|
5
|
+
* Automatically discovers private keys from environment variables, config files,
|
|
6
|
+
* and mcporter config. You can also pass keys explicitly.
|
|
7
|
+
*/
|
|
8
|
+
export async function createX402Client(options = {}) {
|
|
9
|
+
const { TronClientSigner, EvmClientSigner, X402Client, ExactTronClientMechanism, ExactEvmClientMechanism, ExactPermitTronClientMechanism, ExactPermitEvmClientMechanism, SufficientBalancePolicy, } = await import("@springmint/x402");
|
|
10
|
+
const tronKey = options.tronPrivateKey ?? (await findPrivateKey("tron"));
|
|
11
|
+
const evmKey = options.evmPrivateKey ?? (await findPrivateKey("evm"));
|
|
12
|
+
const apiKey = options.tronGridApiKey ?? (await findApiKey());
|
|
13
|
+
if (apiKey)
|
|
14
|
+
process.env.TRON_GRID_API_KEY = apiKey;
|
|
15
|
+
const log = options.silent ? () => { } : (...args) => console.error("[x402]", ...args);
|
|
16
|
+
const client = new X402Client();
|
|
17
|
+
if (tronKey) {
|
|
18
|
+
const signer = new TronClientSigner(tronKey);
|
|
19
|
+
const networks = ["mainnet", "nile", "shasta", "*"];
|
|
20
|
+
for (const net of networks) {
|
|
21
|
+
const networkId = net === "*" ? "tron:*" : `tron:${net}`;
|
|
22
|
+
client.register(networkId, new ExactTronClientMechanism(signer));
|
|
23
|
+
client.register(networkId, new ExactPermitTronClientMechanism(signer));
|
|
24
|
+
}
|
|
25
|
+
log("TRON mechanisms enabled.");
|
|
26
|
+
}
|
|
27
|
+
if (evmKey) {
|
|
28
|
+
const signer = new EvmClientSigner(evmKey);
|
|
29
|
+
client.register("eip155:*", new ExactEvmClientMechanism(signer));
|
|
30
|
+
client.register("eip155:*", new ExactPermitEvmClientMechanism(signer));
|
|
31
|
+
log("EVM mechanisms enabled.");
|
|
32
|
+
}
|
|
33
|
+
client.registerPolicy(new SufficientBalancePolicy(client));
|
|
34
|
+
return client;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Create a fetch client that automatically handles HTTP 402 Payment Required responses.
|
|
38
|
+
*
|
|
39
|
+
* Usage:
|
|
40
|
+
* ```ts
|
|
41
|
+
* const fetchClient = await createX402FetchClient();
|
|
42
|
+
* const response = await fetchClient.request("https://paid-api.com/endpoint", {
|
|
43
|
+
* method: "POST",
|
|
44
|
+
* headers: { "Content-Type": "application/json" },
|
|
45
|
+
* body: JSON.stringify({ key: "value" }),
|
|
46
|
+
* });
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export async function createX402FetchClient(options = {}) {
|
|
50
|
+
const { X402FetchClient } = await import("@springmint/x402");
|
|
51
|
+
const client = await createX402Client(options);
|
|
52
|
+
return new X402FetchClient(client);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* High-level helper: invoke an x402-enabled endpoint and return the parsed response.
|
|
56
|
+
*
|
|
57
|
+
* Supports two modes:
|
|
58
|
+
* - **Entrypoint mode**: provide `entrypoint` to call `{url}/entrypoints/{entrypoint}/invoke`
|
|
59
|
+
* - **Direct mode**: omit `entrypoint` to request the URL directly
|
|
60
|
+
*
|
|
61
|
+
* Usage:
|
|
62
|
+
* ```ts
|
|
63
|
+
* // Entrypoint mode
|
|
64
|
+
* const result = await invokeEndpoint("https://api.example.com", {
|
|
65
|
+
* entrypoint: "chat",
|
|
66
|
+
* input: { prompt: "hello" },
|
|
67
|
+
* });
|
|
68
|
+
*
|
|
69
|
+
* // Direct mode
|
|
70
|
+
* const result = await invokeEndpoint("https://api.example.com/some/path", {
|
|
71
|
+
* method: "GET",
|
|
72
|
+
* });
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export async function invokeEndpoint(url, options = {}) {
|
|
76
|
+
const fetchClient = await createX402FetchClient(options.clientOptions);
|
|
77
|
+
let finalUrl = url;
|
|
78
|
+
let finalMethod = options.method || "GET";
|
|
79
|
+
let finalBody = undefined;
|
|
80
|
+
if (options.entrypoint) {
|
|
81
|
+
const baseUrl = url.endsWith("/") ? url.slice(0, -1) : url;
|
|
82
|
+
finalUrl = `${baseUrl}/entrypoints/${options.entrypoint}/invoke`;
|
|
83
|
+
finalMethod = "POST";
|
|
84
|
+
finalBody = JSON.stringify({ input: options.input ?? {} });
|
|
85
|
+
}
|
|
86
|
+
else if (options.input) {
|
|
87
|
+
finalBody = typeof options.input === "string" ? options.input : JSON.stringify(options.input);
|
|
88
|
+
}
|
|
89
|
+
const response = await fetchClient.request(finalUrl, {
|
|
90
|
+
method: finalMethod,
|
|
91
|
+
headers: { "Content-Type": "application/json" },
|
|
92
|
+
body: finalBody,
|
|
93
|
+
});
|
|
94
|
+
const contentType = response.headers.get("content-type") || "";
|
|
95
|
+
let body;
|
|
96
|
+
if (contentType.includes("application/json")) {
|
|
97
|
+
body = await response.json();
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
body = await response.text();
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
status: response.status,
|
|
104
|
+
headers: Object.fromEntries(response.headers.entries()),
|
|
105
|
+
body,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Search for a private key from environment variables, config files, and mcporter config.
|
|
3
|
+
*
|
|
4
|
+
* Lookup order:
|
|
5
|
+
* 1. Environment variables (TRON_PRIVATE_KEY / EVM_PRIVATE_KEY / ETH_PRIVATE_KEY / PRIVATE_KEY)
|
|
6
|
+
* 2. Local config files (./x402-config.json, ~/.x402-config.json)
|
|
7
|
+
* 3. mcporter config (~/.mcporter/mcporter.json)
|
|
8
|
+
*/
|
|
9
|
+
export declare function findPrivateKey(type: "tron" | "evm"): Promise<string | undefined>;
|
|
10
|
+
/**
|
|
11
|
+
* Search for TronGrid API key from environment variables, config files, and mcporter config.
|
|
12
|
+
*/
|
|
13
|
+
export declare function findApiKey(): Promise<string | undefined>;
|
|
14
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAmDtF;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgC9D"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import * as os from "os";
|
|
4
|
+
/**
|
|
5
|
+
* Search for a private key from environment variables, config files, and mcporter config.
|
|
6
|
+
*
|
|
7
|
+
* Lookup order:
|
|
8
|
+
* 1. Environment variables (TRON_PRIVATE_KEY / EVM_PRIVATE_KEY / ETH_PRIVATE_KEY / PRIVATE_KEY)
|
|
9
|
+
* 2. Local config files (./x402-config.json, ~/.x402-config.json)
|
|
10
|
+
* 3. mcporter config (~/.mcporter/mcporter.json)
|
|
11
|
+
*/
|
|
12
|
+
export async function findPrivateKey(type) {
|
|
13
|
+
// 1. Check environment variables
|
|
14
|
+
if (type === "tron") {
|
|
15
|
+
if (process.env.TRON_PRIVATE_KEY)
|
|
16
|
+
return process.env.TRON_PRIVATE_KEY;
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
if (process.env.EVM_PRIVATE_KEY)
|
|
20
|
+
return process.env.EVM_PRIVATE_KEY;
|
|
21
|
+
if (process.env.ETH_PRIVATE_KEY)
|
|
22
|
+
return process.env.ETH_PRIVATE_KEY;
|
|
23
|
+
}
|
|
24
|
+
if (process.env.PRIVATE_KEY)
|
|
25
|
+
return process.env.PRIVATE_KEY;
|
|
26
|
+
// 2. Check local config files
|
|
27
|
+
const configFiles = [path.join(process.cwd(), "x402-config.json"), path.join(os.homedir(), ".x402-config.json")];
|
|
28
|
+
for (const file of configFiles) {
|
|
29
|
+
if (fs.existsSync(file)) {
|
|
30
|
+
try {
|
|
31
|
+
const config = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
32
|
+
if (type === "tron") {
|
|
33
|
+
const key = config.tron_private_key || config.private_key;
|
|
34
|
+
if (key)
|
|
35
|
+
return key;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
const key = config.evm_private_key || config.eth_private_key || config.private_key;
|
|
39
|
+
if (key)
|
|
40
|
+
return key;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
/* ignore */
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// 3. Check mcporter config
|
|
49
|
+
const mcporterPath = path.join(os.homedir(), ".mcporter", "mcporter.json");
|
|
50
|
+
if (fs.existsSync(mcporterPath)) {
|
|
51
|
+
try {
|
|
52
|
+
const config = JSON.parse(fs.readFileSync(mcporterPath, "utf8"));
|
|
53
|
+
if (config.mcpServers) {
|
|
54
|
+
for (const serverName in config.mcpServers) {
|
|
55
|
+
const s = config.mcpServers[serverName];
|
|
56
|
+
if (type === "tron" && s?.env?.TRON_PRIVATE_KEY)
|
|
57
|
+
return s.env.TRON_PRIVATE_KEY;
|
|
58
|
+
if (type === "evm" && (s?.env?.EVM_PRIVATE_KEY || s?.env?.ETH_PRIVATE_KEY)) {
|
|
59
|
+
return s.env.EVM_PRIVATE_KEY || s.env.ETH_PRIVATE_KEY;
|
|
60
|
+
}
|
|
61
|
+
if (s?.env?.PRIVATE_KEY)
|
|
62
|
+
return s.env.PRIVATE_KEY;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
/* ignore */
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Search for TronGrid API key from environment variables, config files, and mcporter config.
|
|
74
|
+
*/
|
|
75
|
+
export async function findApiKey() {
|
|
76
|
+
if (process.env.TRON_GRID_API_KEY)
|
|
77
|
+
return process.env.TRON_GRID_API_KEY;
|
|
78
|
+
const configFiles = [path.join(process.cwd(), "x402-config.json"), path.join(os.homedir(), ".x402-config.json")];
|
|
79
|
+
for (const file of configFiles) {
|
|
80
|
+
if (fs.existsSync(file)) {
|
|
81
|
+
try {
|
|
82
|
+
const config = JSON.parse(fs.readFileSync(file, "utf8"));
|
|
83
|
+
const key = config.tron_grid_api_key || config.api_key;
|
|
84
|
+
if (key)
|
|
85
|
+
return key;
|
|
86
|
+
}
|
|
87
|
+
catch (e) {
|
|
88
|
+
/* ignore */
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const mcporterPath = path.join(os.homedir(), ".mcporter", "mcporter.json");
|
|
93
|
+
if (fs.existsSync(mcporterPath)) {
|
|
94
|
+
try {
|
|
95
|
+
const config = JSON.parse(fs.readFileSync(mcporterPath, "utf8"));
|
|
96
|
+
if (config.mcpServers) {
|
|
97
|
+
for (const serverName in config.mcpServers) {
|
|
98
|
+
const s = config.mcpServers[serverName];
|
|
99
|
+
if (s?.env?.TRON_GRID_API_KEY)
|
|
100
|
+
return s.env.TRON_GRID_API_KEY;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
catch (e) {
|
|
105
|
+
/* ignore */
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return undefined;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACtF,YAAY,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@springmint/x402-payment",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "x402 payment SDK - Add x402 pay-per-use capability to your AI agent skills and Node.js applications",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "dist/lib/index.js",
|
|
8
|
+
"types": "dist/lib/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/lib/index.js",
|
|
12
|
+
"types": "./dist/lib/index.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"bin": "dist/cli/x402_invoke.js",
|
|
16
|
+
"files": [
|
|
17
|
+
"dist/lib",
|
|
18
|
+
"dist/cli",
|
|
19
|
+
"SKILL.md"
|
|
20
|
+
],
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=18.0.0"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"rm": "rm -rf ./dist",
|
|
26
|
+
"build": "yarn rm && tsc && ncc build src/cli.ts -o dist/cli && mv dist/cli/index.js dist/cli/x402_invoke.js",
|
|
27
|
+
"build:lib": "tsc",
|
|
28
|
+
"build:cli": "ncc build src/cli.ts -o dist/cli && mv dist/cli/index.js dist/cli/x402_invoke.js",
|
|
29
|
+
"start": "node dist/cli/x402_invoke.js"
|
|
30
|
+
},
|
|
31
|
+
"keywords": [
|
|
32
|
+
"x402",
|
|
33
|
+
"payment",
|
|
34
|
+
"ai-agent",
|
|
35
|
+
"skill",
|
|
36
|
+
"sdk",
|
|
37
|
+
"usdt",
|
|
38
|
+
"usdc",
|
|
39
|
+
"tron",
|
|
40
|
+
"evm",
|
|
41
|
+
"bsc",
|
|
42
|
+
"402",
|
|
43
|
+
"pay-per-use"
|
|
44
|
+
],
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "https://github.com/springmint/x402-skill.git"
|
|
48
|
+
},
|
|
49
|
+
"publishConfig": {
|
|
50
|
+
"access": "public"
|
|
51
|
+
},
|
|
52
|
+
"devDependencies": {
|
|
53
|
+
"@types/node": "^25.3.5",
|
|
54
|
+
"@vercel/ncc": "^0.38.4",
|
|
55
|
+
"typescript": "^5.9.3"
|
|
56
|
+
},
|
|
57
|
+
"dependencies": {
|
|
58
|
+
"@springmint/x402": "^0.1.1",
|
|
59
|
+
"tronweb": "^6.0.0",
|
|
60
|
+
"viem": "^2.46.3"
|
|
61
|
+
}
|
|
62
|
+
}
|