cryptoiz-mcp 4.15.3 → 4.15.5

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 (2) hide show
  1. package/index.js +41 -34
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -9,7 +9,7 @@ import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprot
9
9
  import { Connection, Keypair, PublicKey, Transaction, SystemProgram, VersionedTransaction, TransactionMessage } from '@solana/web3.js';
10
10
  import bs58 from 'bs58';
11
11
 
12
- var VERSION = 'v4.15.3';
12
+ var VERSION = 'v4.15.5';
13
13
  var GATEWAY = 'https://rehqwsypjnjirhuiapqh.supabase.co/functions/v1/mcp-x402-gateway';
14
14
  var RECIPIENT = 'DsKmdkYx49Xc1WhqMUAztwhdYPTqieyC98VmnnJdgpXX';
15
15
  var USDC_MINT = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
@@ -41,9 +41,14 @@ function findATA(wallet, mint) {
41
41
  }
42
42
 
43
43
  // ===== V2: Build partially-signed tx for Dexter facilitator =====
44
- // Dexter pays gas (feePayer), user only signs the transfer
45
- // Tx MUST contain 3 instructions in order: SetComputeUnitLimit, SetComputeUnitPrice, SPL Transfer
44
+ // Reference: @x402/svm exact/client/scheme.ts (Coinbase reference SDK)
45
+ // Tx MUST contain exactly 4 instructions in this order:
46
+ // 1. SetComputeUnitLimit (20000)
47
+ // 2. SetComputeUnitPrice (1 microLamport)
48
+ // 3. TransferChecked (SPL Token)
49
+ // 4. Memo (random 16-byte nonce hex)
46
50
  var COMPUTE_BUDGET_PROGRAM = 'ComputeBudget111111111111111111111111111111';
51
+ var MEMO_PROGRAM = 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr';
47
52
 
48
53
  async function buildV2PaymentPayload(amount, feePayerAddr) {
49
54
  var kp = getKeypair();
@@ -53,55 +58,59 @@ async function buildV2PaymentPayload(amount, feePayerAddr) {
53
58
  var recipientATA = findATA(RECIPIENT, USDC_MINT);
54
59
  var feePayerPk = new PublicKey(feePayerAddr);
55
60
  var computeBudgetPk = new PublicKey(COMPUTE_BUDGET_PROGRAM);
61
+ var memoProgramPk = new PublicKey(MEMO_PROGRAM);
62
+ var tokenProgramPk = new PublicKey(TOKEN_PROGRAM);
63
+ var usdcMintPk = new PublicKey(USDC_MINT);
56
64
 
57
- // Instruction 1: SetComputeUnitLimit (instruction index 2, u32 units)
65
+ // Instruction 1: SetComputeUnitLimit = 20000 (per @x402/svm constants)
58
66
  var setLimitData = Buffer.alloc(5);
59
67
  setLimitData.writeUInt8(2, 0);
60
- setLimitData.writeUInt32LE(200000, 1);
61
- var setLimitIx = {
62
- programId: computeBudgetPk,
63
- keys: [],
64
- data: setLimitData,
65
- };
68
+ setLimitData.writeUInt32LE(20000, 1);
69
+ var setLimitIx = { programId: computeBudgetPk, keys: [], data: setLimitData };
66
70
 
67
- // Instruction 2: SetComputeUnitPrice (instruction index 3, u64 microLamports)
71
+ // Instruction 2: SetComputeUnitPrice = 1 microLamport (per @x402/svm constants)
68
72
  var setPriceData = Buffer.alloc(9);
69
73
  setPriceData.writeUInt8(3, 0);
70
- setPriceData.writeUInt32LE(50000, 1); // 50000 microLamports
74
+ setPriceData.writeUInt32LE(1, 1);
71
75
  setPriceData.writeUInt32LE(0, 5);
72
- var setPriceIx = {
73
- programId: computeBudgetPk,
74
- keys: [],
75
- data: setPriceData,
76
- };
76
+ var setPriceIx = { programId: computeBudgetPk, keys: [], data: setPriceData };
77
77
 
78
- // Instruction 3: SPL Token Transfer
79
- var tokenProgramPk = new PublicKey(TOKEN_PROGRAM);
78
+ // Instruction 3: TransferChecked (SPL Token)
79
+ // Accounts order: [source, mint, destination, authority]
80
80
  var transferKeys = [
81
81
  { pubkey: userATA, isSigner: false, isWritable: true },
82
+ { pubkey: usdcMintPk, isSigner: false, isWritable: false },
82
83
  { pubkey: recipientATA, isSigner: false, isWritable: true },
83
84
  { pubkey: kp.publicKey, isSigner: true, isWritable: false },
84
85
  ];
85
- var transferData = Buffer.alloc(9);
86
- transferData.writeUInt8(3, 0);
86
+ var transferData = Buffer.alloc(10);
87
+ transferData.writeUInt8(12, 0); // TransferChecked = instruction index 12
87
88
  var lo = amount & 0xFFFFFFFF;
88
89
  var hi = Math.floor(amount / 0x100000000) & 0xFFFFFFFF;
89
90
  transferData.writeUInt32LE(lo, 1);
90
91
  transferData.writeUInt32LE(hi, 5);
91
- var transferIx = {
92
- programId: tokenProgramPk,
93
- keys: transferKeys,
94
- data: transferData,
95
- };
92
+ transferData.writeUInt8(6, 9); // USDC decimals = 6
93
+ var transferIx = { programId: tokenProgramPk, keys: transferKeys, data: transferData };
94
+
95
+ // Instruction 4: Memo with random 16-byte nonce (per @x402/svm reference)
96
+ var nonceBytes = new Uint8Array(16);
97
+ for (var i = 0; i < 16; i++) { nonceBytes[i] = Math.floor(Math.random() * 256); }
98
+ var nonceHex = '';
99
+ for (var j = 0; j < 16; j++) {
100
+ var h = nonceBytes[j].toString(16);
101
+ nonceHex = nonceHex + (h.length < 2 ? '0' + h : h);
102
+ }
103
+ var memoData = Buffer.from(nonceHex, 'utf8');
104
+ var memoIx = { programId: memoProgramPk, keys: [], data: memoData };
96
105
 
97
106
  // Get recent blockhash
98
107
  var bhResult = await conn.getLatestBlockhash('confirmed');
99
108
 
100
- // Build V0 message: feePayer = Dexter, 3 instructions in required order
109
+ // Build V0 message: feePayer = Dexter, 4 instructions in spec order
101
110
  var message = new TransactionMessage({
102
111
  payerKey: feePayerPk,
103
112
  recentBlockhash: bhResult.blockhash,
104
- instructions: [setLimitIx, setPriceIx, transferIx],
113
+ instructions: [setLimitIx, setPriceIx, transferIx, memoIx],
105
114
  }).compileToV0Message();
106
115
 
107
116
  var vtx = new VersionedTransaction(message);
@@ -112,7 +121,7 @@ async function buildV2PaymentPayload(amount, feePayerAddr) {
112
121
  var serialized = vtx.serialize();
113
122
  var txB64 = Buffer.from(serialized).toString('base64');
114
123
 
115
- console.error('[cryptoiz-mcp] V2 tx built: 3 instructions (ComputeLimit + ComputePrice + Transfer), feePayer=' + feePayerAddr.substring(0, 8) + '...');
124
+ console.error('[cryptoiz-mcp] V2 tx: 4 ix (Limit=20000 + Price=1 + TransferChecked + Memo), feePayer=' + feePayerAddr.substring(0, 8) + '..., nonce=' + nonceHex.substring(0, 8) + '...');
116
125
  return txB64;
117
126
  }
118
127
 
@@ -230,17 +239,15 @@ async function callTool(toolName, args) {
230
239
  var headerName = '';
231
240
 
232
241
  if (useV2 && paymentRequirements.extra && paymentRequirements.extra.feePayer) {
233
- // V2: Build partially-signed tx, Dexter pays gas
242
+ // V2: Build partially-signed tx with 4 instructions, Dexter pays gas
234
243
  var v2FeePayer = paymentRequirements.extra.feePayer;
235
- console.error('[cryptoiz-mcp] V2 mode: building 3-instruction tx for Dexter, feePayer=' + v2FeePayer.substring(0, 8) + '...');
244
+ console.error('[cryptoiz-mcp] V2 mode: 4-ix tx (Limit+Price+TransferChecked+Memo), feePayer=' + v2FeePayer.substring(0, 8) + '...');
236
245
  try {
237
246
  var txB64 = await buildV2PaymentPayload(amount, v2FeePayer);
238
247
 
239
- // Build V2 payment payload per x402 spec
248
+ // Payload format per @x402/svm reference: only x402Version + payload.transaction
240
249
  var v2Payload = {
241
250
  x402Version: 2,
242
- scheme: 'exact',
243
- network: paymentRequirements.network || 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp',
244
251
  payload: {
245
252
  transaction: txB64,
246
253
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cryptoiz-mcp",
3
- "version": "4.15.3",
3
+ "version": "4.15.5",
4
4
  "description": "CryptoIZ MCP Server - Solana DEX trading signals via Claude Desktop with x402 USDC micropayments (V2 Dexter facilitator)",
5
5
  "main": "index.js",
6
6
  "type": "module",