paytaca-cli 0.6.1 → 0.7.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/README.md +153 -37
- package/dist/ai/autoRefill.d.ts +27 -0
- package/dist/ai/autoRefill.d.ts.map +1 -0
- package/dist/ai/autoRefill.js +75 -0
- package/dist/ai/autoRefill.js.map +1 -0
- package/dist/ai/client.d.ts +73 -0
- package/dist/ai/client.d.ts.map +1 -0
- package/dist/ai/client.js +90 -0
- package/dist/ai/client.js.map +1 -0
- package/dist/ai/config.d.ts +7 -0
- package/dist/ai/config.d.ts.map +1 -0
- package/dist/ai/config.js +16 -0
- package/dist/ai/config.js.map +1 -0
- package/dist/ai/configure.d.ts +61 -0
- package/dist/ai/configure.d.ts.map +1 -0
- package/dist/ai/configure.js +452 -0
- package/dist/ai/configure.js.map +1 -0
- package/dist/ai/credits.d.ts +27 -0
- package/dist/ai/credits.d.ts.map +1 -0
- package/dist/ai/credits.js +99 -0
- package/dist/ai/credits.js.map +1 -0
- package/dist/ai/models.d.ts +13 -0
- package/dist/ai/models.d.ts.map +1 -0
- package/dist/ai/models.js +49 -0
- package/dist/ai/models.js.map +1 -0
- package/dist/ai/oauth.d.ts +45 -0
- package/dist/ai/oauth.d.ts.map +1 -0
- package/dist/ai/oauth.js +137 -0
- package/dist/ai/oauth.js.map +1 -0
- package/dist/ai/purchase.d.ts +30 -0
- package/dist/ai/purchase.d.ts.map +1 -0
- package/dist/ai/purchase.js +456 -0
- package/dist/ai/purchase.js.map +1 -0
- package/dist/commands/address.d.ts.map +1 -1
- package/dist/commands/address.js +88 -36
- package/dist/commands/address.js.map +1 -1
- package/dist/commands/ai.d.ts +9 -0
- package/dist/commands/ai.d.ts.map +1 -0
- package/dist/commands/ai.js +675 -0
- package/dist/commands/ai.js.map +1 -0
- package/dist/commands/balance.d.ts.map +1 -1
- package/dist/commands/balance.js +68 -129
- package/dist/commands/balance.js.map +1 -1
- package/dist/commands/history.d.ts.map +1 -1
- package/dist/commands/history.js +38 -78
- package/dist/commands/history.js.map +1 -1
- package/dist/commands/mcp.d.ts +14 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +68 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/pay.js +1 -1
- package/dist/commands/pay.js.map +1 -1
- package/dist/commands/receive.d.ts +1 -8
- package/dist/commands/receive.d.ts.map +1 -1
- package/dist/commands/receive.js +51 -124
- package/dist/commands/receive.js.map +1 -1
- package/dist/commands/send.d.ts +0 -10
- package/dist/commands/send.d.ts.map +1 -1
- package/dist/commands/send.js +40 -50
- package/dist/commands/send.js.map +1 -1
- package/dist/commands/swap.js +1 -1
- package/dist/commands/swap.js.map +1 -1
- package/dist/commands/token.d.ts +1 -9
- package/dist/commands/token.d.ts.map +1 -1
- package/dist/commands/token.js +192 -289
- package/dist/commands/token.js.map +1 -1
- package/dist/core/context.d.ts +30 -0
- package/dist/core/context.d.ts.map +1 -0
- package/dist/core/context.js +45 -0
- package/dist/core/context.js.map +1 -0
- package/dist/core/wallet.d.ts +130 -0
- package/dist/core/wallet.d.ts.map +1 -0
- package/dist/core/wallet.js +276 -0
- package/dist/core/wallet.js.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp/server.d.ts +8 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +24 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +5 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +473 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/utils/format.d.ts +23 -0
- package/dist/utils/format.d.ts.map +1 -0
- package/dist/utils/format.js +62 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/x402.js +1 -1
- package/dist/utils/x402.js.map +1 -1
- package/dist/wallet/index.d.ts +13 -0
- package/dist/wallet/index.d.ts.map +1 -1
- package/dist/wallet/index.js +18 -0
- package/dist/wallet/index.js.map +1 -1
- package/dist/wallet/keys.d.ts.map +1 -1
- package/dist/wallet/keys.js +2 -0
- package/dist/wallet/keys.js.map +1 -1
- package/package.json +7 -3
- package/dist/commands/wallet.test.d.ts +0 -2
- package/dist/commands/wallet.test.d.ts.map +0 -1
- package/dist/commands/wallet.test.js +0 -68
- package/dist/commands/wallet.test.js.map +0 -1
- package/dist/nostr/chat.test.d.ts +0 -2
- package/dist/nostr/chat.test.d.ts.map +0 -1
- package/dist/nostr/chat.test.js +0 -121
- package/dist/nostr/chat.test.js.map +0 -1
- package/dist/nostr/store.test.d.ts +0 -2
- package/dist/nostr/store.test.d.ts.map +0 -1
- package/dist/nostr/store.test.js +0 -456
- package/dist/nostr/store.test.js.map +0 -1
- package/dist/utils/prices.test.d.ts +0 -5
- package/dist/utils/prices.test.d.ts.map +0 -1
- package/dist/utils/prices.test.js +0 -62
- package/dist/utils/prices.test.js.map +0 -1
- package/dist/utils/x402.test.d.ts +0 -2
- package/dist/utils/x402.test.d.ts.map +0 -1
- package/dist/utils/x402.test.js +0 -216
- package/dist/utils/x402.test.js.map +0 -1
- package/dist/wallet/cauldron/pools.test.d.ts +0 -3
- package/dist/wallet/cauldron/pools.test.d.ts.map +0 -1
- package/dist/wallet/cauldron/pools.test.js +0 -149
- package/dist/wallet/cauldron/pools.test.js.map +0 -1
- package/dist/wallet/cauldron/swap.test.d.ts +0 -2
- package/dist/wallet/cauldron/swap.test.d.ts.map +0 -1
- package/dist/wallet/cauldron/swap.test.js +0 -179
- package/dist/wallet/cauldron/swap.test.js.map +0 -1
- package/skills/README.md +0 -68
- package/skills/paytaca-send/SKILL.md +0 -159
- package/skills/paytaca-wallet/SKILL.md +0 -164
- package/skills/paytaca-x402/SKILL.md +0 -130
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
4
|
+
import { registerTools } from './tools.js';
|
|
5
|
+
function readVersion() {
|
|
6
|
+
try {
|
|
7
|
+
const pkg = JSON.parse(readFileSync(new URL('../../package.json', import.meta.url), 'utf-8'));
|
|
8
|
+
return pkg.version || '0.0.0';
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return '0.0.0';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function createServer(opts = {}) {
|
|
15
|
+
const server = new McpServer({ name: 'paytaca', version: readVersion() }, { capabilities: { tools: {} } });
|
|
16
|
+
registerTools(server, opts);
|
|
17
|
+
return server;
|
|
18
|
+
}
|
|
19
|
+
export async function runMcpServer(opts = {}) {
|
|
20
|
+
const server = createServer(opts);
|
|
21
|
+
const transport = new StdioServerTransport();
|
|
22
|
+
await server.connect(transport);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAA;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE1C,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CACtE,CAAA;QACD,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAA;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAA;IAChB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAqC,EAAE;IAClE,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,EAC3C,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAChC,CAAA;IACD,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;IAC3B,OAAO,MAAM,CAAA;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAqC,EAAE;IACxE,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IACjC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AACjC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AAyPxE,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,IAAI,GAAE;IAAE,cAAc,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,IAAI,CA6WN"}
|
|
@@ -0,0 +1,473 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { getBalanceView, getHistoryView, getReceiveAddressView, getTokenBalances, getTokenDetail, sendBch, sendToken, isValidBchAddress, } from '../core/wallet.js';
|
|
3
|
+
import { WalletNotConfiguredError } from '../core/context.js';
|
|
4
|
+
import { loadWalletRef } from '../wallet/index.js';
|
|
5
|
+
import { getConfig } from '../ai/client.js';
|
|
6
|
+
import { listModels, listPlans, selectModel, formatPriceUsd, formatDuration } from '../ai/models.js';
|
|
7
|
+
import { getWalletStatus, summarizeCredits, summarizeAllCredits, buildPurchaseHint, formatRemaining, } from '../ai/credits.js';
|
|
8
|
+
import { buyPlan } from '../ai/purchase.js';
|
|
9
|
+
import { armAutoRefill, disarmAutoRefill, readAutoRefillState, remainingBudget, } from '../ai/autoRefill.js';
|
|
10
|
+
function text(value) {
|
|
11
|
+
return { content: [{ type: 'text', text: value }] };
|
|
12
|
+
}
|
|
13
|
+
function json(value) {
|
|
14
|
+
return text(JSON.stringify(value, null, 2));
|
|
15
|
+
}
|
|
16
|
+
function clientName(server) {
|
|
17
|
+
return server.server.getClientVersion()?.name ?? '';
|
|
18
|
+
}
|
|
19
|
+
function creditsResponse(server, sessions, hint, payload) {
|
|
20
|
+
const name = clientName(server);
|
|
21
|
+
if (name.startsWith('pi-mcp')) {
|
|
22
|
+
return {
|
|
23
|
+
content: [{ type: 'text', text: creditsText(sessions, hint) }],
|
|
24
|
+
structuredContent: payload,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
if (name === 'opencode') {
|
|
28
|
+
return {
|
|
29
|
+
content: [{ type: 'text', text: creditsMarkdown(sessions, hint) }],
|
|
30
|
+
structuredContent: payload,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
return json(payload);
|
|
34
|
+
}
|
|
35
|
+
function creditRows(sessions) {
|
|
36
|
+
return sessions.map((session) => ({
|
|
37
|
+
name: session.displayName || session.modelId || 'unknown',
|
|
38
|
+
status: session.active ? 'active' : 'inactive',
|
|
39
|
+
remaining: formatRemaining(session.timeRemainingSeconds),
|
|
40
|
+
used: formatRemaining(session.timeUsedSeconds),
|
|
41
|
+
limit: session.tokenLimit != null ? session.tokenLimit.toLocaleString('en-US') : '-',
|
|
42
|
+
}));
|
|
43
|
+
}
|
|
44
|
+
function creditsText(sessions, hint) {
|
|
45
|
+
const lines = ['Paytaca AI credits', ''];
|
|
46
|
+
if (sessions.length === 0) {
|
|
47
|
+
lines.push('No AI credit sessions found.');
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
const rows = creditRows(sessions);
|
|
51
|
+
const width = (key, header) => Math.max(header.length, ...rows.map((row) => row[key].length));
|
|
52
|
+
const nameWidth = width('name', 'Model');
|
|
53
|
+
const statusWidth = width('status', 'Status');
|
|
54
|
+
const remainingWidth = width('remaining', 'Remaining');
|
|
55
|
+
const usedWidth = width('used', 'Used');
|
|
56
|
+
const limitWidth = width('limit', 'Token limit');
|
|
57
|
+
const row = (...cells) => cells.map((cell, i) => cell.padEnd([nameWidth, statusWidth, remainingWidth, usedWidth, limitWidth][i])).join(' ');
|
|
58
|
+
lines.push(row('Model', 'Status', 'Remaining', 'Used', 'Token limit'));
|
|
59
|
+
for (const r of rows) {
|
|
60
|
+
lines.push(row(r.name, r.status, r.remaining, r.used, r.limit));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
if (hint) {
|
|
64
|
+
lines.push('', hint.message);
|
|
65
|
+
}
|
|
66
|
+
return lines.join('\n');
|
|
67
|
+
}
|
|
68
|
+
function creditsMarkdown(sessions, hint) {
|
|
69
|
+
const lines = ['## Paytaca AI credits', ''];
|
|
70
|
+
if (sessions.length === 0) {
|
|
71
|
+
lines.push('No AI credit sessions found.');
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
lines.push('| Model | Status | Remaining | Used | Token limit |');
|
|
75
|
+
lines.push('| --- | --- | --- | --- | --- |');
|
|
76
|
+
for (const r of creditRows(sessions)) {
|
|
77
|
+
lines.push(`| ${r.name} | ${r.status} | ${r.remaining} | ${r.used} | ${r.limit} |`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (hint) {
|
|
81
|
+
lines.push('', hint.message);
|
|
82
|
+
}
|
|
83
|
+
return lines.join('\n');
|
|
84
|
+
}
|
|
85
|
+
function planPriceCell(tier) {
|
|
86
|
+
if (!tier)
|
|
87
|
+
return '—';
|
|
88
|
+
return formatPriceUsd(tier.price_usd);
|
|
89
|
+
}
|
|
90
|
+
function plansMarkdown(plans) {
|
|
91
|
+
const lines = ['## Paytaca AI plans', ''];
|
|
92
|
+
if (plans.length === 0) {
|
|
93
|
+
lines.push('No plans found.');
|
|
94
|
+
return lines.join('\n');
|
|
95
|
+
}
|
|
96
|
+
const durations = Array.from(new Set(plans.flatMap((model) => model.plans.map((plan) => Number(plan.minutes))))).sort((a, b) => a - b);
|
|
97
|
+
const header = ['Model', ...durations.map(formatDuration)];
|
|
98
|
+
lines.push(`| ${header.join(' | ')} |`);
|
|
99
|
+
lines.push(`| ${header.map(() => '---').join(' | ')} |`);
|
|
100
|
+
for (const model of plans) {
|
|
101
|
+
const byMinutes = new Map(model.plans.map((plan) => [Number(plan.minutes), plan]));
|
|
102
|
+
const cells = [
|
|
103
|
+
`${model.displayName} (\`${model.id}\`)`,
|
|
104
|
+
...durations.map((minutes) => planPriceCell(byMinutes.get(minutes))),
|
|
105
|
+
];
|
|
106
|
+
lines.push(`| ${cells.join(' | ')} |`);
|
|
107
|
+
}
|
|
108
|
+
return lines.join('\n');
|
|
109
|
+
}
|
|
110
|
+
function plansText(plans) {
|
|
111
|
+
const lines = ['Paytaca AI plans', ''];
|
|
112
|
+
if (plans.length === 0) {
|
|
113
|
+
lines.push('No plans found.');
|
|
114
|
+
return lines.join('\n');
|
|
115
|
+
}
|
|
116
|
+
const durations = Array.from(new Set(plans.flatMap((model) => model.plans.map((plan) => Number(plan.minutes))))).sort((a, b) => a - b);
|
|
117
|
+
const headers = ['Model', ...durations.map(formatDuration)];
|
|
118
|
+
const rows = plans.map((model) => {
|
|
119
|
+
const byMinutes = new Map(model.plans.map((plan) => [Number(plan.minutes), plan]));
|
|
120
|
+
return [
|
|
121
|
+
`${model.displayName} (${model.id})`,
|
|
122
|
+
...durations.map((minutes) => planPriceCell(byMinutes.get(minutes))),
|
|
123
|
+
];
|
|
124
|
+
});
|
|
125
|
+
const widths = headers.map((header, i) => Math.max(header.length, ...rows.map((row) => row[i].length)));
|
|
126
|
+
const render = (cells) => cells.map((cell, i) => cell.padEnd(widths[i])).join(' ');
|
|
127
|
+
lines.push(render(headers));
|
|
128
|
+
for (const row of rows) {
|
|
129
|
+
lines.push(render(row));
|
|
130
|
+
}
|
|
131
|
+
return lines.join('\n');
|
|
132
|
+
}
|
|
133
|
+
function plansResponse(server, plans) {
|
|
134
|
+
const name = clientName(server);
|
|
135
|
+
if (name.startsWith('pi-mcp')) {
|
|
136
|
+
return {
|
|
137
|
+
content: [{ type: 'text', text: plansText(plans) }],
|
|
138
|
+
structuredContent: { models: plans },
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
if (name === 'opencode') {
|
|
142
|
+
return {
|
|
143
|
+
content: [{ type: 'text', text: plansMarkdown(plans) }],
|
|
144
|
+
structuredContent: { models: plans },
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
return json(plans);
|
|
148
|
+
}
|
|
149
|
+
function fail(err) {
|
|
150
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
151
|
+
return { content: [{ type: 'text', text: message }], isError: true };
|
|
152
|
+
}
|
|
153
|
+
async function resolvePurchaseHint(modelQuery, backend) {
|
|
154
|
+
try {
|
|
155
|
+
const config = await getConfig({ backendUrl: backend });
|
|
156
|
+
const model = modelQuery ? selectModel(listModels(config), modelQuery) : null;
|
|
157
|
+
return buildPurchaseHint(model);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const HELP = `Paytaca MCP tools
|
|
164
|
+
|
|
165
|
+
Wallet (read):
|
|
166
|
+
get_balance BCH balance (mainnet/chipnet)
|
|
167
|
+
get_transactions Paginated transaction history
|
|
168
|
+
get_receiving_address Derive a receiving address (+ BIP21/PayPro URI)
|
|
169
|
+
get_tokens List CashToken balances or inspect one category
|
|
170
|
+
|
|
171
|
+
Wallet (spend):
|
|
172
|
+
send Send BCH or a CashToken to an address
|
|
173
|
+
|
|
174
|
+
Paytaca AI:
|
|
175
|
+
get_models List AI models
|
|
176
|
+
get_plans Plan pricing per AI model
|
|
177
|
+
get_credits Remaining AI time credits
|
|
178
|
+
buy_plan Buy an AI plan with BCH or LIFT (spends funds)
|
|
179
|
+
auto_refill Arm/disarm/inspect automatic plan refills
|
|
180
|
+
|
|
181
|
+
Notes:
|
|
182
|
+
- All tools accept an optional "chipnet" flag (default mainnet).
|
|
183
|
+
- send and buy_plan spend real funds from the active wallet; the MCP host
|
|
184
|
+
is responsible for asking the user for approval before invoking them.
|
|
185
|
+
- When get_credits reports an inactive session it includes a purchaseHint.
|
|
186
|
+
Relay purchaseHint.message (it contains the exact copy-paste command to
|
|
187
|
+
buy more time); do not replace it with upsell or "what next" questions.
|
|
188
|
+
- Wallet is resolved from the OS keychain (run "paytaca wallet create" first).`;
|
|
189
|
+
export function registerTools(server, opts = {}) {
|
|
190
|
+
const cn = (value) => value ?? Boolean(opts.defaultChipnet);
|
|
191
|
+
server.registerTool('get_help', {
|
|
192
|
+
title: 'Paytaca help',
|
|
193
|
+
description: 'List the Paytaca MCP tools and usage notes.',
|
|
194
|
+
inputSchema: {},
|
|
195
|
+
annotations: { readOnlyHint: true, openWorldHint: false },
|
|
196
|
+
}, async () => text(HELP));
|
|
197
|
+
server.registerTool('get_balance', {
|
|
198
|
+
title: 'Get BCH balance',
|
|
199
|
+
description: 'Return the BCH balance (in BCH and sats) of the active wallet.',
|
|
200
|
+
inputSchema: { chipnet: z.boolean().optional() },
|
|
201
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
202
|
+
}, async ({ chipnet }) => {
|
|
203
|
+
try {
|
|
204
|
+
return json(await getBalanceView(cn(chipnet)));
|
|
205
|
+
}
|
|
206
|
+
catch (err) {
|
|
207
|
+
return fail(err);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
server.registerTool('get_transactions', {
|
|
211
|
+
title: 'Get transaction history',
|
|
212
|
+
description: 'Return paginated BCH/CashToken transaction history.',
|
|
213
|
+
inputSchema: {
|
|
214
|
+
chipnet: z.boolean().optional(),
|
|
215
|
+
type: z.enum(['all', 'incoming', 'outgoing']).optional(),
|
|
216
|
+
page: z.number().int().positive().optional(),
|
|
217
|
+
token_category: z.string().optional(),
|
|
218
|
+
},
|
|
219
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
220
|
+
}, async ({ chipnet, type, page, token_category }) => {
|
|
221
|
+
try {
|
|
222
|
+
return json(await getHistoryView({
|
|
223
|
+
page: page ?? 1,
|
|
224
|
+
recordType: type ?? 'all',
|
|
225
|
+
tokenId: token_category || '',
|
|
226
|
+
}, cn(chipnet)));
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
return fail(err);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
server.registerTool('get_receiving_address', {
|
|
233
|
+
title: 'Get receiving address',
|
|
234
|
+
description: 'Derive a receiving address. With token_category, returns a token-aware (z-prefix) address and a PayPro URI. With amount, embeds the requested amount.',
|
|
235
|
+
inputSchema: {
|
|
236
|
+
chipnet: z.boolean().optional(),
|
|
237
|
+
index: z.number().int().nonnegative().optional(),
|
|
238
|
+
token: z.boolean().optional(),
|
|
239
|
+
token_category: z.string().optional(),
|
|
240
|
+
amount: z.number().positive().optional(),
|
|
241
|
+
},
|
|
242
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
243
|
+
}, async ({ chipnet, index, token, token_category, amount }) => {
|
|
244
|
+
try {
|
|
245
|
+
return json(await getReceiveAddressView({
|
|
246
|
+
index: index ?? 0,
|
|
247
|
+
token: Boolean(token) || Boolean(token_category),
|
|
248
|
+
category: token_category,
|
|
249
|
+
amount,
|
|
250
|
+
}, cn(chipnet)));
|
|
251
|
+
}
|
|
252
|
+
catch (err) {
|
|
253
|
+
return fail(err);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
server.registerTool('get_tokens', {
|
|
257
|
+
title: 'Get CashToken balances',
|
|
258
|
+
description: 'List CashToken holdings, or return details for one token when token_category is given.',
|
|
259
|
+
inputSchema: {
|
|
260
|
+
chipnet: z.boolean().optional(),
|
|
261
|
+
token_category: z.string().optional(),
|
|
262
|
+
include_zero: z.boolean().optional(),
|
|
263
|
+
},
|
|
264
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
265
|
+
}, async ({ chipnet, token_category, include_zero }) => {
|
|
266
|
+
try {
|
|
267
|
+
if (token_category) {
|
|
268
|
+
return json(await getTokenDetail(token_category, cn(chipnet)));
|
|
269
|
+
}
|
|
270
|
+
return json(await getTokenBalances(cn(chipnet), {
|
|
271
|
+
includeZero: Boolean(include_zero),
|
|
272
|
+
}));
|
|
273
|
+
}
|
|
274
|
+
catch (err) {
|
|
275
|
+
return fail(err);
|
|
276
|
+
}
|
|
277
|
+
});
|
|
278
|
+
server.registerTool('send', {
|
|
279
|
+
title: 'Send funds',
|
|
280
|
+
description: 'Send BCH, or a CashToken when token_category is given. Token amounts are in base units. SPENDS REAL FUNDS.',
|
|
281
|
+
inputSchema: {
|
|
282
|
+
address: z.string(),
|
|
283
|
+
amount: z.string(),
|
|
284
|
+
unit: z.enum(['bch', 'sats']).optional(),
|
|
285
|
+
token_category: z.string().optional(),
|
|
286
|
+
chipnet: z.boolean().optional(),
|
|
287
|
+
},
|
|
288
|
+
annotations: {
|
|
289
|
+
readOnlyHint: false,
|
|
290
|
+
destructiveHint: true,
|
|
291
|
+
idempotentHint: false,
|
|
292
|
+
openWorldHint: true,
|
|
293
|
+
},
|
|
294
|
+
}, async ({ address, amount, unit, token_category, chipnet }) => {
|
|
295
|
+
const isChipnet = cn(chipnet);
|
|
296
|
+
try {
|
|
297
|
+
if (!isValidBchAddress(address, isChipnet)) {
|
|
298
|
+
return fail(new Error('Invalid BCH address.'));
|
|
299
|
+
}
|
|
300
|
+
if (token_category) {
|
|
301
|
+
let tokenAmount;
|
|
302
|
+
try {
|
|
303
|
+
tokenAmount = BigInt(amount);
|
|
304
|
+
}
|
|
305
|
+
catch {
|
|
306
|
+
return fail(new Error('Token amount must be an integer.'));
|
|
307
|
+
}
|
|
308
|
+
if (tokenAmount <= 0n) {
|
|
309
|
+
return fail(new Error('Token amount must be positive.'));
|
|
310
|
+
}
|
|
311
|
+
return json(await sendToken({ category: token_category, amount: tokenAmount, address }, isChipnet));
|
|
312
|
+
}
|
|
313
|
+
const parsed = Number(amount);
|
|
314
|
+
if (!isFinite(parsed) || parsed <= 0) {
|
|
315
|
+
return fail(new Error('Amount must be a positive number.'));
|
|
316
|
+
}
|
|
317
|
+
const amountBch = unit === 'sats' ? parsed / 1e8 : parsed;
|
|
318
|
+
return json(await sendBch({ address, amountBch }, isChipnet));
|
|
319
|
+
}
|
|
320
|
+
catch (err) {
|
|
321
|
+
return fail(err);
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
server.registerTool('get_models', {
|
|
325
|
+
title: 'List AI models',
|
|
326
|
+
description: 'List the Paytaca AI models available for purchase.',
|
|
327
|
+
inputSchema: { backend: z.string().optional() },
|
|
328
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
329
|
+
}, async ({ backend }) => {
|
|
330
|
+
try {
|
|
331
|
+
const config = await getConfig({ backendUrl: backend });
|
|
332
|
+
return json(listModels(config));
|
|
333
|
+
}
|
|
334
|
+
catch (err) {
|
|
335
|
+
return fail(err);
|
|
336
|
+
}
|
|
337
|
+
});
|
|
338
|
+
server.registerTool('get_plans', {
|
|
339
|
+
title: 'Get AI plan pricing',
|
|
340
|
+
description: 'Return plan pricing per model. Pass model to filter a single model.',
|
|
341
|
+
inputSchema: {
|
|
342
|
+
model: z.string().optional(),
|
|
343
|
+
backend: z.string().optional(),
|
|
344
|
+
},
|
|
345
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
346
|
+
}, async ({ model, backend }) => {
|
|
347
|
+
try {
|
|
348
|
+
const config = await getConfig({ backendUrl: backend });
|
|
349
|
+
return plansResponse(server, listPlans(config, model));
|
|
350
|
+
}
|
|
351
|
+
catch (err) {
|
|
352
|
+
return fail(err);
|
|
353
|
+
}
|
|
354
|
+
});
|
|
355
|
+
server.registerTool('get_credits', {
|
|
356
|
+
title: 'Get AI time credits',
|
|
357
|
+
description: 'Return remaining Paytaca AI time credits for all models, or for one model when "model" is given. When a session is inactive, includes a purchaseHint whose "message" is the exact text to relay to the user (a copy-paste top-up command) instead of upsell or follow-up questions.',
|
|
358
|
+
inputSchema: {
|
|
359
|
+
model: z.string().optional(),
|
|
360
|
+
chipnet: z.boolean().optional(),
|
|
361
|
+
backend: z.string().optional(),
|
|
362
|
+
},
|
|
363
|
+
annotations: { readOnlyHint: true, openWorldHint: true },
|
|
364
|
+
}, async ({ model, chipnet, backend }) => {
|
|
365
|
+
try {
|
|
366
|
+
const wallet = loadWalletRef();
|
|
367
|
+
if (!wallet)
|
|
368
|
+
throw new WalletNotConfiguredError();
|
|
369
|
+
const status = await getWalletStatus(wallet.walletHash, {
|
|
370
|
+
modelId: model,
|
|
371
|
+
backendUrl: backend,
|
|
372
|
+
});
|
|
373
|
+
if (!model) {
|
|
374
|
+
const sessions = summarizeAllCredits(status);
|
|
375
|
+
const payload = { sessions };
|
|
376
|
+
let hint = null;
|
|
377
|
+
if (!sessions.some((s) => s.active)) {
|
|
378
|
+
hint = await resolvePurchaseHint(sessions[0]?.modelId ?? undefined, backend);
|
|
379
|
+
if (hint)
|
|
380
|
+
payload.purchaseHint = hint;
|
|
381
|
+
}
|
|
382
|
+
return creditsResponse(server, sessions, hint, payload);
|
|
383
|
+
}
|
|
384
|
+
const summary = summarizeCredits(status, model);
|
|
385
|
+
const payload = { ...summary };
|
|
386
|
+
let hint = null;
|
|
387
|
+
if (!summary.active) {
|
|
388
|
+
hint = await resolvePurchaseHint(model, backend);
|
|
389
|
+
if (hint)
|
|
390
|
+
payload.purchaseHint = hint;
|
|
391
|
+
}
|
|
392
|
+
return creditsResponse(server, [summary], hint, payload);
|
|
393
|
+
}
|
|
394
|
+
catch (err) {
|
|
395
|
+
return fail(err);
|
|
396
|
+
}
|
|
397
|
+
});
|
|
398
|
+
server.registerTool('buy_plan', {
|
|
399
|
+
title: 'Buy an AI plan',
|
|
400
|
+
description: 'Purchase an AI plan for a model and duration, paying with BCH or LIFT via x402. SPENDS REAL FUNDS. The MCP host must obtain user approval before calling this.',
|
|
401
|
+
inputSchema: {
|
|
402
|
+
model: z.string(),
|
|
403
|
+
minutes: z.number().int().positive(),
|
|
404
|
+
payment_method: z.enum(['bch', 'lift']).optional(),
|
|
405
|
+
chipnet: z.boolean().optional(),
|
|
406
|
+
backend: z.string().optional(),
|
|
407
|
+
},
|
|
408
|
+
annotations: {
|
|
409
|
+
readOnlyHint: false,
|
|
410
|
+
destructiveHint: true,
|
|
411
|
+
idempotentHint: false,
|
|
412
|
+
openWorldHint: true,
|
|
413
|
+
},
|
|
414
|
+
}, async ({ model, minutes, payment_method, chipnet, backend }) => {
|
|
415
|
+
try {
|
|
416
|
+
return json(await buyPlan({
|
|
417
|
+
model,
|
|
418
|
+
minutes,
|
|
419
|
+
paymentMethod: payment_method ?? 'bch',
|
|
420
|
+
isChipnet: cn(chipnet),
|
|
421
|
+
backendUrl: backend,
|
|
422
|
+
confirmed: true,
|
|
423
|
+
}));
|
|
424
|
+
}
|
|
425
|
+
catch (err) {
|
|
426
|
+
return fail(err);
|
|
427
|
+
}
|
|
428
|
+
});
|
|
429
|
+
server.registerTool('auto_refill', {
|
|
430
|
+
title: 'Manage auto-refill',
|
|
431
|
+
description: 'Arm, disarm, or inspect automatic plan refills. Arming buys a plan silently when credits run out, up to max_minutes.',
|
|
432
|
+
inputSchema: {
|
|
433
|
+
enabled: z.boolean().optional(),
|
|
434
|
+
model: z.string().optional(),
|
|
435
|
+
minutes: z.number().int().positive().optional(),
|
|
436
|
+
max_minutes: z.number().int().positive().optional(),
|
|
437
|
+
payment_method: z.enum(['bch', 'lift']).optional(),
|
|
438
|
+
},
|
|
439
|
+
annotations: {
|
|
440
|
+
readOnlyHint: false,
|
|
441
|
+
destructiveHint: true,
|
|
442
|
+
idempotentHint: false,
|
|
443
|
+
openWorldHint: false,
|
|
444
|
+
},
|
|
445
|
+
}, async ({ enabled, model, minutes, max_minutes, payment_method }) => {
|
|
446
|
+
try {
|
|
447
|
+
if (enabled === false) {
|
|
448
|
+
return json(disarmAutoRefill());
|
|
449
|
+
}
|
|
450
|
+
if (enabled === true) {
|
|
451
|
+
if (!model || !minutes || !max_minutes) {
|
|
452
|
+
return fail(new Error('Arming auto-refill requires model, minutes, and max_minutes.'));
|
|
453
|
+
}
|
|
454
|
+
return json(armAutoRefill({
|
|
455
|
+
model,
|
|
456
|
+
minutes,
|
|
457
|
+
maxMinutes: max_minutes,
|
|
458
|
+
paymentMethod: payment_method ?? 'bch',
|
|
459
|
+
}));
|
|
460
|
+
}
|
|
461
|
+
const state = readAutoRefillState();
|
|
462
|
+
return json({
|
|
463
|
+
armed: Boolean(state?.enabled),
|
|
464
|
+
remainingMinutes: remainingBudget(state),
|
|
465
|
+
state,
|
|
466
|
+
});
|
|
467
|
+
}
|
|
468
|
+
catch (err) {
|
|
469
|
+
return fail(err);
|
|
470
|
+
}
|
|
471
|
+
});
|
|
472
|
+
}
|
|
473
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/mcp/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared display/formatting helpers.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions only — no chalk, no I/O — so both the CLI renderers
|
|
5
|
+
* and the core layer can use them.
|
|
6
|
+
*/
|
|
7
|
+
/** Convert BCH to satoshis (1 BCH = 100,000,000 sats). */
|
|
8
|
+
export declare function bchToSats(bch: number): number;
|
|
9
|
+
/** Convert satoshis to BCH. */
|
|
10
|
+
export declare function satsToBch(sats: number): number;
|
|
11
|
+
/** Format a number with thousands separators. */
|
|
12
|
+
export declare function formatSats(sats: number): string;
|
|
13
|
+
/** Format a token amount (base units) using its decimals. */
|
|
14
|
+
export declare function formatTokenAmount(rawAmount: number, decimals: number): string;
|
|
15
|
+
/** Format an ISO date string to a concise local representation. */
|
|
16
|
+
export declare function formatDate(isoDate: string): string;
|
|
17
|
+
/** Truncate a txid for display. */
|
|
18
|
+
export declare function shortTxid(txid: string): string;
|
|
19
|
+
/** Truncate a hex string for display. */
|
|
20
|
+
export declare function shortHex(hex: string, len?: number): string;
|
|
21
|
+
/** Block explorer transaction URL for the given network. */
|
|
22
|
+
export declare function explorerTxUrl(txid: string, isChipnet: boolean): string;
|
|
23
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,0DAA0D;AAC1D,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED,+BAA+B;AAC/B,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,iDAAiD;AACjD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO7E;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAWlD;AAED,mCAAmC;AACnC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG9C;AAED,yCAAyC;AACzC,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,GAAE,MAAU,GAAG,MAAM,CAG7D;AAED,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,GAAG,MAAM,CAKtE"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared display/formatting helpers.
|
|
3
|
+
*
|
|
4
|
+
* Pure functions only — no chalk, no I/O — so both the CLI renderers
|
|
5
|
+
* and the core layer can use them.
|
|
6
|
+
*/
|
|
7
|
+
/** Convert BCH to satoshis (1 BCH = 100,000,000 sats). */
|
|
8
|
+
export function bchToSats(bch) {
|
|
9
|
+
return Math.round(bch * 1e8);
|
|
10
|
+
}
|
|
11
|
+
/** Convert satoshis to BCH. */
|
|
12
|
+
export function satsToBch(sats) {
|
|
13
|
+
return sats / 1e8;
|
|
14
|
+
}
|
|
15
|
+
/** Format a number with thousands separators. */
|
|
16
|
+
export function formatSats(sats) {
|
|
17
|
+
return sats.toLocaleString('en-US');
|
|
18
|
+
}
|
|
19
|
+
/** Format a token amount (base units) using its decimals. */
|
|
20
|
+
export function formatTokenAmount(rawAmount, decimals) {
|
|
21
|
+
if (decimals === 0)
|
|
22
|
+
return rawAmount.toLocaleString('en-US');
|
|
23
|
+
const scaled = rawAmount / Math.pow(10, decimals);
|
|
24
|
+
return scaled.toLocaleString('en-US', {
|
|
25
|
+
minimumFractionDigits: 0,
|
|
26
|
+
maximumFractionDigits: decimals,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
/** Format an ISO date string to a concise local representation. */
|
|
30
|
+
export function formatDate(isoDate) {
|
|
31
|
+
const d = new Date(isoDate);
|
|
32
|
+
if (isNaN(d.getTime()))
|
|
33
|
+
return isoDate;
|
|
34
|
+
return d.toLocaleString('en-US', {
|
|
35
|
+
year: 'numeric',
|
|
36
|
+
month: 'short',
|
|
37
|
+
day: '2-digit',
|
|
38
|
+
hour: '2-digit',
|
|
39
|
+
minute: '2-digit',
|
|
40
|
+
hour12: false,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/** Truncate a txid for display. */
|
|
44
|
+
export function shortTxid(txid) {
|
|
45
|
+
if (txid.length <= 20)
|
|
46
|
+
return txid;
|
|
47
|
+
return txid.slice(0, 10) + '...' + txid.slice(-10);
|
|
48
|
+
}
|
|
49
|
+
/** Truncate a hex string for display. */
|
|
50
|
+
export function shortHex(hex, len = 8) {
|
|
51
|
+
if (hex.length <= len * 2 + 3)
|
|
52
|
+
return hex;
|
|
53
|
+
return hex.slice(0, len) + '...' + hex.slice(-len);
|
|
54
|
+
}
|
|
55
|
+
/** Block explorer transaction URL for the given network. */
|
|
56
|
+
export function explorerTxUrl(txid, isChipnet) {
|
|
57
|
+
const base = isChipnet
|
|
58
|
+
? 'https://chipnet.bchexplorer.info/tx/'
|
|
59
|
+
: 'https://bchexplorer.info/tx/';
|
|
60
|
+
return `${base}${txid}`;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/utils/format.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,0DAA0D;AAC1D,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,CAAA;AAC9B,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI,GAAG,GAAG,CAAA;AACnB,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,OAAO,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;AACrC,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,iBAAiB,CAAC,SAAiB,EAAE,QAAgB;IACnE,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,CAAA;IAC5D,MAAM,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAA;IACjD,OAAO,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE;QACpC,qBAAqB,EAAE,CAAC;QACxB,qBAAqB,EAAE,QAAQ;KAChC,CAAC,CAAA;AACJ,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3B,IAAI,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAAE,OAAO,OAAO,CAAA;IACtC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE;QAC/B,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,OAAO;QACd,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,SAAS;QACf,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,KAAK;KACd,CAAC,CAAA;AACJ,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE;QAAE,OAAO,IAAI,CAAA;IAClC,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAA;AACpD,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,MAAc,CAAC;IACnD,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAA;IACzC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAA;AACpD,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,SAAkB;IAC5D,MAAM,IAAI,GAAG,SAAS;QACpB,CAAC,CAAC,sCAAsC;QACxC,CAAC,CAAC,8BAA8B,CAAA;IAClC,OAAO,GAAG,IAAI,GAAG,IAAI,EAAE,CAAA;AACzB,CAAC"}
|
package/dist/utils/x402.js
CHANGED
|
@@ -93,7 +93,7 @@ export function signMessageBCH(message, privateKeyHex, compressed = true) {
|
|
|
93
93
|
const prefixedMessage = Buffer.concat([prefixBytes, lengthByte, messageBytes]);
|
|
94
94
|
const hash = crypto.createHash('sha256').update(crypto.createHash('sha256').update(prefixedMessage).digest()).digest();
|
|
95
95
|
const privateKey = Buffer.from(privateKeyHex, 'hex');
|
|
96
|
-
const signature = secp256k1.signMessageHashDER(
|
|
96
|
+
const signature = secp256k1.signMessageHashDER(privateKey, hash);
|
|
97
97
|
return Buffer.from(signature).toString('base64');
|
|
98
98
|
}
|
|
99
99
|
export async function signAuthorization(authorization, signMessage) {
|