@obolos_tech/mcp-server 0.2.2 → 0.2.4
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/dist/index.js +0 -0
- package/dist/payment.js +97 -23
- package/dist/payment.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
File without changes
|
package/dist/payment.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Signs x402 payment requests using a private key (no browser wallet needed).
|
|
5
5
|
* Supports both v1 (exact) and v2 (x402x-router-settlement) payment schemes.
|
|
6
6
|
*/
|
|
7
|
-
import { createWalletClient, http, publicActions, formatUnits, } from 'viem';
|
|
7
|
+
import { createWalletClient, http, publicActions, formatUnits, keccak256, encodePacked, } from 'viem';
|
|
8
8
|
import { privateKeyToAccount } from 'viem/accounts';
|
|
9
9
|
import { base } from 'viem/chains';
|
|
10
10
|
const USDC_ADDRESS = '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913';
|
|
@@ -17,6 +17,42 @@ const USDC_ABI = [
|
|
|
17
17
|
type: 'function',
|
|
18
18
|
},
|
|
19
19
|
];
|
|
20
|
+
/**
|
|
21
|
+
* Calculate the SettlementRouter commitment hash.
|
|
22
|
+
* This must be used as the EIP-3009 nonce when signing for router settlement,
|
|
23
|
+
* because the on-chain contract recalculates and verifies it.
|
|
24
|
+
*/
|
|
25
|
+
function calculateCommitment(params) {
|
|
26
|
+
return keccak256(encodePacked([
|
|
27
|
+
'string', // protocol identifier
|
|
28
|
+
'uint256', // chainId
|
|
29
|
+
'address', // hub (settlementRouter)
|
|
30
|
+
'address', // token
|
|
31
|
+
'address', // from
|
|
32
|
+
'uint256', // value
|
|
33
|
+
'uint256', // validAfter
|
|
34
|
+
'uint256', // validBefore
|
|
35
|
+
'bytes32', // salt
|
|
36
|
+
'address', // payTo
|
|
37
|
+
'uint256', // facilitatorFee
|
|
38
|
+
'address', // hook
|
|
39
|
+
'bytes32', // keccak256(hookData)
|
|
40
|
+
], [
|
|
41
|
+
'X402/settle/v1',
|
|
42
|
+
params.chainId,
|
|
43
|
+
params.hub,
|
|
44
|
+
params.asset,
|
|
45
|
+
params.from,
|
|
46
|
+
params.value,
|
|
47
|
+
params.validAfter,
|
|
48
|
+
params.validBefore,
|
|
49
|
+
params.salt,
|
|
50
|
+
params.payTo,
|
|
51
|
+
params.facilitatorFee,
|
|
52
|
+
params.hook,
|
|
53
|
+
keccak256(params.hookData),
|
|
54
|
+
]));
|
|
55
|
+
}
|
|
20
56
|
export class PaymentSigner {
|
|
21
57
|
account;
|
|
22
58
|
client;
|
|
@@ -72,6 +108,10 @@ export class PaymentSigner {
|
|
|
72
108
|
if (!amount || !payTo) {
|
|
73
109
|
throw new Error('Missing amount or payTo in payment requirement');
|
|
74
110
|
}
|
|
111
|
+
// Check for x402x-router-settlement extension
|
|
112
|
+
const settlementKey = 'x402x-router-settlement';
|
|
113
|
+
const settlementExt = requirement.extra?.[settlementKey];
|
|
114
|
+
const settlementInfo = settlementExt?.info;
|
|
75
115
|
// Build EIP-712 typed data for the exact scheme
|
|
76
116
|
const deadline = BigInt(Math.floor(Date.now() / 1000) + 300); // 5 min
|
|
77
117
|
const amountBigInt = BigInt(amount);
|
|
@@ -92,10 +132,31 @@ export class PaymentSigner {
|
|
|
92
132
|
{ name: 'nonce', type: 'bytes32' },
|
|
93
133
|
],
|
|
94
134
|
};
|
|
95
|
-
//
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
135
|
+
// Determine the nonce: commitment hash for router settlement, random otherwise
|
|
136
|
+
let nonce;
|
|
137
|
+
if (settlementInfo?.settlementRouter && settlementInfo?.salt) {
|
|
138
|
+
// SettlementRouter requires nonce = commitment hash of all settlement params
|
|
139
|
+
nonce = calculateCommitment({
|
|
140
|
+
chainId: 8453n,
|
|
141
|
+
hub: settlementInfo.settlementRouter,
|
|
142
|
+
asset,
|
|
143
|
+
from: this.account.address,
|
|
144
|
+
value: amountBigInt,
|
|
145
|
+
validAfter: 0n,
|
|
146
|
+
validBefore: deadline,
|
|
147
|
+
salt: settlementInfo.salt,
|
|
148
|
+
payTo: settlementInfo.finalPayTo || payTo,
|
|
149
|
+
facilitatorFee: BigInt(settlementInfo.facilitatorFee || '0'),
|
|
150
|
+
hook: settlementInfo.hook,
|
|
151
|
+
hookData: settlementInfo.hookData,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
// Standard exact scheme — random nonce
|
|
156
|
+
const nonceBytes = new Uint8Array(32);
|
|
157
|
+
crypto.getRandomValues(nonceBytes);
|
|
158
|
+
nonce = `0x${Array.from(nonceBytes).map(b => b.toString(16).padStart(2, '0')).join('')}`;
|
|
159
|
+
}
|
|
99
160
|
const message = {
|
|
100
161
|
from: this.account.address,
|
|
101
162
|
to: payTo,
|
|
@@ -111,29 +172,42 @@ export class PaymentSigner {
|
|
|
111
172
|
primaryType: 'TransferWithAuthorization',
|
|
112
173
|
message,
|
|
113
174
|
});
|
|
114
|
-
|
|
175
|
+
const authorization = {
|
|
176
|
+
from: this.account.address,
|
|
177
|
+
to: payTo,
|
|
178
|
+
value: amount.toString(),
|
|
179
|
+
validAfter: '0',
|
|
180
|
+
validBefore: deadline.toString(),
|
|
181
|
+
nonce,
|
|
182
|
+
};
|
|
183
|
+
// Build v2 payment payload (includes accepted + extensions for facilitator)
|
|
184
|
+
if (paymentRequired.x402Version === 2) {
|
|
185
|
+
const paymentPayload = {
|
|
186
|
+
x402Version: 2,
|
|
187
|
+
scheme,
|
|
188
|
+
network,
|
|
189
|
+
payload: { signature, authorization },
|
|
190
|
+
// Echo back the accepted requirement so the proxy takes the v2 path
|
|
191
|
+
accepted: {
|
|
192
|
+
...requirement,
|
|
193
|
+
network,
|
|
194
|
+
},
|
|
195
|
+
};
|
|
196
|
+
// Forward settlement extensions if present in the 402 response
|
|
197
|
+
if (settlementExt) {
|
|
198
|
+
paymentPayload.extensions = { [settlementKey]: settlementExt };
|
|
199
|
+
}
|
|
200
|
+
const encoded = Buffer.from(JSON.stringify(paymentPayload)).toString('base64');
|
|
201
|
+
return { 'payment-signature': encoded };
|
|
202
|
+
}
|
|
203
|
+
// v1 fallback
|
|
115
204
|
const paymentPayload = {
|
|
116
|
-
x402Version:
|
|
205
|
+
x402Version: 1,
|
|
117
206
|
scheme,
|
|
118
207
|
network,
|
|
119
|
-
payload: {
|
|
120
|
-
signature,
|
|
121
|
-
authorization: {
|
|
122
|
-
from: this.account.address,
|
|
123
|
-
to: payTo,
|
|
124
|
-
value: amount.toString(),
|
|
125
|
-
validAfter: '0',
|
|
126
|
-
validBefore: deadline.toString(),
|
|
127
|
-
nonce,
|
|
128
|
-
},
|
|
129
|
-
},
|
|
208
|
+
payload: { signature, authorization },
|
|
130
209
|
};
|
|
131
|
-
// Encode as base64 for the payment header
|
|
132
210
|
const encoded = Buffer.from(JSON.stringify(paymentPayload)).toString('base64');
|
|
133
|
-
// Return appropriate headers based on version
|
|
134
|
-
if (paymentRequired.x402Version === 2) {
|
|
135
|
-
return { 'payment-signature': encoded };
|
|
136
|
-
}
|
|
137
211
|
return { 'x-payment': encoded };
|
|
138
212
|
}
|
|
139
213
|
}
|
package/dist/payment.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payment.js","sourceRoot":"","sources":["../src/payment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,kBAAkB,EAClB,IAAI,EACJ,aAAa,EACb,WAAW,
|
|
1
|
+
{"version":3,"file":"payment.js","sourceRoot":"","sources":["../src/payment.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EACL,kBAAkB,EAClB,IAAI,EACJ,aAAa,EACb,WAAW,EACX,SAAS,EACT,YAAY,GAGb,MAAM,MAAM,CAAC;AACd,OAAO,EAAE,mBAAmB,EAA0B,MAAM,eAAe,CAAC;AAC5E,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,MAAM,YAAY,GAAG,4CAAqD,CAAC;AAC3E,MAAM,QAAQ,GAAG;IACf;QACE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC9C,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QACxC,eAAe,EAAE,MAAM;QACvB,IAAI,EAAE,UAAU;KACjB;CACO,CAAC;AAEX;;;;GAIG;AACH,SAAS,mBAAmB,CAAC,MAa5B;IACC,OAAO,SAAS,CACd,YAAY,CACV;QACE,QAAQ,EAAI,sBAAsB;QAClC,SAAS,EAAG,UAAU;QACtB,SAAS,EAAG,yBAAyB;QACrC,SAAS,EAAG,QAAQ;QACpB,SAAS,EAAG,OAAO;QACnB,SAAS,EAAG,QAAQ;QACpB,SAAS,EAAG,aAAa;QACzB,SAAS,EAAG,cAAc;QAC1B,SAAS,EAAG,OAAO;QACnB,SAAS,EAAG,QAAQ;QACpB,SAAS,EAAG,iBAAiB;QAC7B,SAAS,EAAG,OAAO;QACnB,SAAS,EAAG,sBAAsB;KACnC,EACD;QACE,gBAAgB;QAChB,MAAM,CAAC,OAAO;QACd,MAAM,CAAC,GAAoB;QAC3B,MAAM,CAAC,KAAsB;QAC7B,MAAM,CAAC,IAAqB;QAC5B,MAAM,CAAC,KAAK;QACZ,MAAM,CAAC,UAAU;QACjB,MAAM,CAAC,WAAW;QAClB,MAAM,CAAC,IAAqB;QAC5B,MAAM,CAAC,KAAsB;QAC7B,MAAM,CAAC,cAAc;QACrB,MAAM,CAAC,IAAqB;QAC5B,SAAS,CAAC,MAAM,CAAC,QAAyB,CAAC;KAC5C,CACF,CACF,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,aAAa;IAChB,OAAO,CAAoB;IAC3B,MAAM,CAA8B;IAE5C,YAAY,UAAkB;QAC5B,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,UAAU,GAAG,KAAK,UAAU,EAAE,CAAC;QACjC,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,mBAAmB,CAAC,UAA2B,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,GAAG,kBAAkB,CAAC;YAC/B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI,EAAE;SAClB,CAAC,CAAC,MAAM,CAAC,aAAa,CAAQ,CAAC;IAClC,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,OAAO,GAAG,MAAO,IAAI,CAAC,MAAc,CAAC,YAAY,CAAC;YACtD,OAAO,EAAE,YAAY;YACrB,GAAG,EAAE,QAAQ;YACb,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;SAC7B,CAAC,CAAC;QACH,OAAO;YACL,GAAG,EAAE,OAAiB;YACtB,SAAS,EAAE,WAAW,CAAC,OAAiB,EAAE,CAAC,CAAC;SAC7C,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAC,eAAoB;QACpC,gDAAgD;QAChD,MAAM,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC;QACxC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,IAAI,OAAO,CAAC;QAC7C,MAAM,UAAU,GAAG,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC;QACjD,+EAA+E;QAC/E,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC;QAC9E,MAAM,MAAM,GAAG,WAAW,CAAC,iBAAiB,IAAI,WAAW,CAAC,MAAM,CAAC;QACnE,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;QAChC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,IAAI,YAAY,CAAC;QAEhD,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QAED,8CAA8C;QAC9C,MAAM,aAAa,GAAG,yBAAyB,CAAC;QAChD,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC,aAAa,CAAC,CAAC;QACzD,MAAM,cAAc,GAAG,aAAa,EAAE,IAAI,CAAC;QAE3C,gDAAgD;QAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ;QACtE,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAEpC,uFAAuF;QACvF,MAAM,MAAM,GAAG;YACb,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,IAAI,UAAU;YAC3C,OAAO,EAAE,WAAW,CAAC,KAAK,EAAE,OAAO,IAAI,GAAG;YAC1C,OAAO,EAAE,KAAK;YACd,iBAAiB,EAAE,KAAsB;SAC1C,CAAC;QAEF,MAAM,KAAK,GAAG;YACZ,yBAAyB,EAAE;gBACzB,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE;gBACjC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE;gBAC/B,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;gBAClC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE;gBACvC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE;gBACxC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;aACnC;SACF,CAAC;QAEF,+EAA+E;QAC/E,IAAI,KAAoB,CAAC;QACzB,IAAI,cAAc,EAAE,gBAAgB,IAAI,cAAc,EAAE,IAAI,EAAE,CAAC;YAC7D,6EAA6E;YAC7E,KAAK,GAAG,mBAAmB,CAAC;gBAC1B,OAAO,EAAE,KAAK;gBACd,GAAG,EAAE,cAAc,CAAC,gBAAgB;gBACpC,KAAK;gBACL,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;gBAC1B,KAAK,EAAE,YAAY;gBACnB,UAAU,EAAE,EAAE;gBACd,WAAW,EAAE,QAAQ;gBACrB,IAAI,EAAE,cAAc,CAAC,IAAI;gBACzB,KAAK,EAAE,cAAc,CAAC,UAAU,IAAI,KAAK;gBACzC,cAAc,EAAE,MAAM,CAAC,cAAc,CAAC,cAAc,IAAI,GAAG,CAAC;gBAC5D,IAAI,EAAE,cAAc,CAAC,IAAI;gBACzB,QAAQ,EAAE,cAAc,CAAC,QAAQ;aAClC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,uCAAuC;YACvC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;YACtC,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACnC,KAAK,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAmB,CAAC;QAC5G,CAAC;QAED,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC1B,EAAE,EAAE,KAAsB;YAC1B,KAAK,EAAE,YAAY;YACnB,UAAU,EAAE,EAAE;YACd,WAAW,EAAE,QAAQ;YACrB,KAAK;SACN,CAAC;QAEF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;YAChD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM;YACN,KAAK;YACL,WAAW,EAAE,2BAA2B;YACxC,OAAO;SACR,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG;YACpB,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC1B,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE;YACxB,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,QAAQ,CAAC,QAAQ,EAAE;YAChC,KAAK;SACN,CAAC;QAEF,4EAA4E;QAC5E,IAAI,eAAe,CAAC,WAAW,KAAK,CAAC,EAAE,CAAC;YACtC,MAAM,cAAc,GAA4B;gBAC9C,WAAW,EAAE,CAAC;gBACd,MAAM;gBACN,OAAO;gBACP,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE;gBACrC,oEAAoE;gBACpE,QAAQ,EAAE;oBACR,GAAG,WAAW;oBACd,OAAO;iBACR;aACF,CAAC;YAEF,+DAA+D;YAC/D,IAAI,aAAa,EAAE,CAAC;gBAClB,cAAc,CAAC,UAAU,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,aAAa,EAAE,CAAC;YACjE,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC/E,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,CAAC;QAC1C,CAAC;QAED,cAAc;QACd,MAAM,cAAc,GAAG;YACrB,WAAW,EAAE,CAAC;YACd,MAAM;YACN,OAAO;YACP,OAAO,EAAE,EAAE,SAAS,EAAE,aAAa,EAAE;SACtC,CAAC;QACF,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC/E,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;IAClC,CAAC;CACF"}
|