@antseed/node 0.2.26 → 0.2.27

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 (111) hide show
  1. package/README.md +74 -1
  2. package/dist/discovery/announcer.d.ts +2 -0
  3. package/dist/discovery/announcer.d.ts.map +1 -1
  4. package/dist/discovery/announcer.js +10 -6
  5. package/dist/discovery/announcer.js.map +1 -1
  6. package/dist/discovery/index.d.ts +0 -1
  7. package/dist/discovery/index.d.ts.map +1 -1
  8. package/dist/discovery/index.js +0 -1
  9. package/dist/discovery/index.js.map +1 -1
  10. package/dist/discovery/reputation-verifier.d.ts +7 -4
  11. package/dist/discovery/reputation-verifier.d.ts.map +1 -1
  12. package/dist/discovery/reputation-verifier.js +33 -9
  13. package/dist/discovery/reputation-verifier.js.map +1 -1
  14. package/dist/index.d.ts +12 -3
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +6 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/node.d.ts +60 -33
  19. package/dist/node.d.ts.map +1 -1
  20. package/dist/node.js +640 -324
  21. package/dist/node.js.map +1 -1
  22. package/dist/p2p/connection-manager.d.ts.map +1 -1
  23. package/dist/p2p/connection-manager.js +6 -0
  24. package/dist/p2p/connection-manager.js.map +1 -1
  25. package/dist/p2p/identity.d.ts +27 -3
  26. package/dist/p2p/identity.d.ts.map +1 -1
  27. package/dist/p2p/identity.js +52 -13
  28. package/dist/p2p/identity.js.map +1 -1
  29. package/dist/p2p/index.d.ts +0 -2
  30. package/dist/p2p/index.d.ts.map +1 -1
  31. package/dist/p2p/index.js +0 -2
  32. package/dist/p2p/index.js.map +1 -1
  33. package/dist/p2p/payment-codec.d.ts +7 -13
  34. package/dist/p2p/payment-codec.d.ts.map +1 -1
  35. package/dist/p2p/payment-codec.js +32 -50
  36. package/dist/p2p/payment-codec.js.map +1 -1
  37. package/dist/p2p/payment-mux.d.ts +11 -20
  38. package/dist/p2p/payment-mux.d.ts.map +1 -1
  39. package/dist/p2p/payment-mux.js +36 -52
  40. package/dist/p2p/payment-mux.js.map +1 -1
  41. package/dist/payments/buyer-payment-manager.d.ts +34 -93
  42. package/dist/payments/buyer-payment-manager.d.ts.map +1 -1
  43. package/dist/payments/buyer-payment-manager.js +184 -189
  44. package/dist/payments/buyer-payment-manager.js.map +1 -1
  45. package/dist/payments/chain-config.d.ts +38 -0
  46. package/dist/payments/chain-config.d.ts.map +1 -0
  47. package/dist/payments/chain-config.js +60 -0
  48. package/dist/payments/chain-config.js.map +1 -0
  49. package/dist/payments/evm/ants-token-client.d.ts +16 -0
  50. package/dist/payments/evm/ants-token-client.d.ts.map +1 -0
  51. package/dist/payments/evm/ants-token-client.js +66 -0
  52. package/dist/payments/evm/ants-token-client.js.map +1 -0
  53. package/dist/payments/evm/base-evm-client.d.ts +13 -0
  54. package/dist/payments/evm/base-evm-client.d.ts.map +1 -0
  55. package/dist/payments/evm/base-evm-client.js +38 -0
  56. package/dist/payments/evm/base-evm-client.js.map +1 -0
  57. package/dist/payments/evm/emissions-client.d.ts +23 -0
  58. package/dist/payments/evm/emissions-client.d.ts.map +1 -0
  59. package/dist/payments/evm/emissions-client.js +84 -0
  60. package/dist/payments/evm/emissions-client.js.map +1 -0
  61. package/dist/payments/evm/escrow-client.d.ts +57 -36
  62. package/dist/payments/evm/escrow-client.d.ts.map +1 -1
  63. package/dist/payments/evm/escrow-client.js +200 -93
  64. package/dist/payments/evm/escrow-client.js.map +1 -1
  65. package/dist/payments/evm/identity-client.d.ts +34 -0
  66. package/dist/payments/evm/identity-client.d.ts.map +1 -0
  67. package/dist/payments/evm/identity-client.js +125 -0
  68. package/dist/payments/evm/identity-client.js.map +1 -0
  69. package/dist/payments/evm/signatures.d.ts +18 -5
  70. package/dist/payments/evm/signatures.d.ts.map +1 -1
  71. package/dist/payments/evm/signatures.js +21 -12
  72. package/dist/payments/evm/signatures.js.map +1 -1
  73. package/dist/payments/evm/subpool-client.d.ts +30 -0
  74. package/dist/payments/evm/subpool-client.d.ts.map +1 -0
  75. package/dist/payments/evm/subpool-client.js +158 -0
  76. package/dist/payments/evm/subpool-client.js.map +1 -0
  77. package/dist/payments/index.d.ts +20 -7
  78. package/dist/payments/index.d.ts.map +1 -1
  79. package/dist/payments/index.js +17 -6
  80. package/dist/payments/index.js.map +1 -1
  81. package/dist/payments/readiness.d.ts +12 -0
  82. package/dist/payments/readiness.d.ts.map +1 -0
  83. package/dist/payments/readiness.js +64 -0
  84. package/dist/payments/readiness.js.map +1 -0
  85. package/dist/payments/seller-payment-manager.d.ts +74 -34
  86. package/dist/payments/seller-payment-manager.d.ts.map +1 -1
  87. package/dist/payments/seller-payment-manager.js +327 -118
  88. package/dist/payments/seller-payment-manager.js.map +1 -1
  89. package/dist/payments/session-store.d.ts +65 -0
  90. package/dist/payments/session-store.d.ts.map +1 -0
  91. package/dist/payments/session-store.js +243 -0
  92. package/dist/payments/session-store.js.map +1 -0
  93. package/dist/payments/usdc-utils.d.ts +9 -0
  94. package/dist/payments/usdc-utils.d.ts.map +1 -0
  95. package/dist/payments/usdc-utils.js +17 -0
  96. package/dist/payments/usdc-utils.js.map +1 -0
  97. package/dist/types/http.d.ts +2 -0
  98. package/dist/types/http.d.ts.map +1 -1
  99. package/dist/types/http.js +2 -0
  100. package/dist/types/http.js.map +1 -1
  101. package/dist/types/index.d.ts +0 -1
  102. package/dist/types/index.d.ts.map +1 -1
  103. package/dist/types/index.js +0 -1
  104. package/dist/types/index.js.map +1 -1
  105. package/dist/types/metering.d.ts +1 -1
  106. package/dist/types/metering.d.ts.map +1 -1
  107. package/dist/types/protocol.d.ts +43 -60
  108. package/dist/types/protocol.d.ts.map +1 -1
  109. package/dist/types/protocol.js +5 -8
  110. package/dist/types/protocol.js.map +1 -1
  111. package/package.json +3 -2
@@ -1,161 +1,370 @@
1
+ import { createHash } from 'node:crypto';
1
2
  import { verifyTypedData } from 'ethers';
2
- import { EscrowClient } from './evm/escrow-client.js';
3
- import { identityToEvmWallet } from './evm/keypair.js';
4
- import { makeEscrowDomain, SPENDING_AUTH_V2_TYPES } from './evm/signatures.js';
3
+ import { BaseEscrowClient } from './evm/escrow-client.js';
4
+ import { identityToEvmWallet, identityToEvmAddress } from './evm/keypair.js';
5
+ import { SPENDING_AUTH_TYPES, makeEscrowDomain, buildReceiptMessage, buildAckMessage, signMessageEd25519, verifyMessageEd25519, } from './evm/signatures.js';
6
+ import { bytesToHex, hexToBytes } from '../utils/hex.js';
5
7
  import { debugLog, debugWarn } from '../utils/debug.js';
8
+ /** Default settle timeout: 24 hours. */
9
+ const DEFAULT_SETTLE_TIMEOUT_SECS = 86400;
10
+ /**
11
+ * Manages seller-side payment sessions using the settle-then-reserve
12
+ * atomic flow with persistent session storage.
13
+ */
6
14
  export class SellerPaymentManager {
15
+ _identity;
7
16
  _signer;
8
- _escrow;
17
+ _escrowClient;
9
18
  _config;
10
- _sessions = new Map();
11
- constructor(identity, config) {
19
+ _sessionStore;
20
+ /** In-memory cache of active buyer peerIds for fast has-session checks. */
21
+ _activeBuyers = new Set();
22
+ /** Debounce: track sessions that already sent a top-up request. */
23
+ _topUpRequested = new Set();
24
+ /** Cached seller tokenRate (fetched once from escrow, used for top-up threshold). */
25
+ _tokenRate = null;
26
+ /** Cached FIRST_SIGN_CAP from escrow contract. */
27
+ _firstSignCap = null;
28
+ /** Per-buyer mutex to prevent concurrent handleSpendingAuth for the same buyer. */
29
+ _buyerLocks = new Map();
30
+ constructor(identity, config, sessionStore) {
31
+ this._identity = identity;
12
32
  this._config = config;
13
33
  this._signer = identityToEvmWallet(identity);
14
- this._escrow = new EscrowClient({
34
+ this._escrowClient = new BaseEscrowClient({
15
35
  rpcUrl: config.rpcUrl,
16
36
  contractAddress: config.contractAddress,
17
37
  usdcAddress: config.usdcAddress,
18
- chainId: config.chainId,
19
38
  });
39
+ this._sessionStore = sessionStore;
40
+ // Hydrate _activeBuyers from persisted sessions so hasSession() works after restart
41
+ const activeSessions = this._sessionStore.getActiveSessions('seller');
42
+ for (const session of activeSessions) {
43
+ this._activeBuyers.add(session.peerId);
44
+ }
20
45
  }
21
- get signer() { return this._signer; }
22
- get escrowClient() { return this._escrow; }
23
- hasSession(buyerPeerId) {
24
- const s = this._sessions.get(buyerPeerId);
25
- return !!s && !s.settled;
46
+ get escrowClient() {
47
+ return this._escrowClient;
26
48
  }
27
- setBuyerEvmAddress(buyerPeerId, evmAddress) {
28
- const session = this._sessions.get(buyerPeerId);
29
- if (session)
30
- session.buyerEvmAddr = evmAddress;
49
+ // ── SpendingAuth handler (settle-then-reserve) ────────────────
50
+ /**
51
+ * Handle incoming SpendingAuth from a buyer.
52
+ * 1. Verify EIP-712 signature
53
+ * 2. Settle prior session if one exists
54
+ * 3. Reserve new session on-chain
55
+ * 4. Store and send AuthAck
56
+ */
57
+ async handleSpendingAuth(buyerPeerId, buyerEvmAddr, payload, paymentMux) {
58
+ // Per-buyer mutex: serialize concurrent auths for the same buyer
59
+ const existing = this._buyerLocks.get(buyerPeerId);
60
+ const lock = (existing ?? Promise.resolve()).then(() => this._handleSpendingAuthInner(buyerPeerId, buyerEvmAddr, payload, paymentMux));
61
+ this._buyerLocks.set(buyerPeerId, lock.catch(() => { }));
62
+ return lock;
31
63
  }
32
- async handleSpendingAuthV2(buyerPeerId, buyerEvmAddr, payload, paymentMux) {
33
- const now = Math.floor(Date.now() / 1000);
34
- if (!payload.deadline || payload.deadline <= now) {
35
- debugWarn(`[SellerPayment] Expired SpendingAuthV2 from ${buyerPeerId.slice(0, 12)}... deadline=${payload.deadline}`);
36
- return;
37
- }
38
- let maxAmount;
39
- let previousConsumption;
64
+ async _handleSpendingAuthInner(buyerPeerId, buyerEvmAddr, payload, paymentMux) {
40
65
  try {
41
- maxAmount = BigInt(payload.maxAmountUsdc);
42
- previousConsumption = BigInt(payload.previousConsumption ?? '0');
66
+ // 1. Verify EIP-712 signature
67
+ const domain = makeEscrowDomain(this._config.chainId, this._config.contractAddress);
68
+ const msg = {
69
+ seller: identityToEvmAddress(this._identity),
70
+ sessionId: payload.sessionId,
71
+ maxAmount: BigInt(payload.maxAmountUsdc),
72
+ nonce: payload.nonce,
73
+ deadline: payload.deadline,
74
+ previousConsumption: BigInt(payload.previousConsumption),
75
+ previousSessionId: payload.previousSessionId,
76
+ };
77
+ const recoveredAddr = verifyTypedData(domain, SPENDING_AUTH_TYPES, msg, payload.buyerSig);
78
+ if (recoveredAddr.toLowerCase() !== buyerEvmAddr.toLowerCase()) {
79
+ debugWarn(`[SellerPayment] Invalid SpendingAuth signature: recovered=${recoveredAddr} expected=${buyerEvmAddr}`);
80
+ return;
81
+ }
82
+ debugLog(`[SellerPayment] SpendingAuth verified for buyer ${buyerPeerId.slice(0, 12)}...`);
83
+ // 2. Settle prior session if exists
84
+ const priorSession = this._sessionStore.getActiveSessionByPeer(buyerPeerId, 'seller');
85
+ if (priorSession && priorSession.status === 'active') {
86
+ const buyerClaimed = BigInt(payload.previousConsumption);
87
+ const sellerDelivered = BigInt(priorSession.tokensDelivered);
88
+ // Settle with buyer's claimed value — proof chain requires
89
+ // previousConsumption == settledTokenCount on-chain.
90
+ // We do NOT use max(seller, buyer) because that would let the seller
91
+ // overcharge the buyer for tokens the buyer may not have received.
92
+ try {
93
+ debugLog(`[SellerPayment] Settling prior session ${priorSession.sessionId.slice(0, 18)}... tokens=${buyerClaimed} (seller delivered=${sellerDelivered})`);
94
+ await this._escrowClient.settle(this._signer, priorSession.sessionId, buyerClaimed);
95
+ this._sessionStore.updateSessionStatus(priorSession.sessionId, 'settled', buyerClaimed.toString());
96
+ this._topUpRequested.delete(priorSession.sessionId);
97
+ }
98
+ catch (err) {
99
+ debugWarn(`[SellerPayment] Failed to settle prior session: ${err instanceof Error ? err.message : err}`);
100
+ // Do NOT proceed to reserve — proof chain is broken. Buyer will timeout and retry.
101
+ return;
102
+ }
103
+ // If buyer significantly understated consumption (> 20% gap), reject the
104
+ // new SpendingAuth. Seller accepts the loss on this session but refuses to
105
+ // continue serving a dishonest buyer. The 20% tolerance accounts for receipt
106
+ // delivery timing (buyer may not have received the final receipt).
107
+ if (sellerDelivered > 0n && buyerClaimed < sellerDelivered * 80n / 100n) {
108
+ debugWarn(`[SellerPayment] Rejecting SpendingAuth — buyer under-reports consumption: ` +
109
+ `claimed=${buyerClaimed} delivered=${sellerDelivered}`);
110
+ return;
111
+ }
112
+ }
113
+ // 3. Fetch tokenRate BEFORE reserve so a failure here doesn't orphan
114
+ // an on-chain reservation the seller can't serve.
115
+ const sellerEvmAddr = identityToEvmAddress(this._identity);
116
+ const account = await this._escrowClient.getSellerAccount(sellerEvmAddr);
117
+ this._tokenRate = account.tokenRate;
118
+ if (this._tokenRate === 0n) {
119
+ throw new Error('Token rate is 0 — set rate with antseed setTokenRate before serving');
120
+ }
121
+ // 4. Reserve new session on-chain
122
+ debugLog(`[SellerPayment] Reserving session ${payload.sessionId.slice(0, 18)}... on-chain`);
123
+ await this._escrowClient.reserve(this._signer, buyerEvmAddr, payload.sessionId, BigInt(payload.maxAmountUsdc), BigInt(payload.nonce), BigInt(payload.deadline), BigInt(payload.previousConsumption), payload.previousSessionId, payload.buyerSig);
124
+ // 5. Store new session
125
+ const now = Date.now();
126
+ const session = {
127
+ sessionId: payload.sessionId,
128
+ peerId: buyerPeerId,
129
+ role: 'seller',
130
+ sellerEvmAddr,
131
+ buyerEvmAddr,
132
+ nonce: payload.nonce,
133
+ authMax: payload.maxAmountUsdc,
134
+ deadline: payload.deadline,
135
+ previousSessionId: payload.previousSessionId,
136
+ previousConsumption: payload.previousConsumption,
137
+ tokensDelivered: '0',
138
+ requestCount: 0,
139
+ reservedAt: now,
140
+ settledAt: null,
141
+ settledAmount: null,
142
+ status: 'active',
143
+ createdAt: now,
144
+ updatedAt: now,
145
+ };
146
+ this._sessionStore.upsertSession(session);
147
+ this._activeBuyers.add(buyerPeerId);
148
+ // 6. Send AuthAck
149
+ paymentMux.sendAuthAck({
150
+ sessionId: payload.sessionId,
151
+ nonce: payload.nonce,
152
+ });
153
+ debugLog(`[SellerPayment] AuthAck sent for session ${payload.sessionId.slice(0, 18)}...`);
43
154
  }
44
- catch {
45
- debugWarn(`[SellerPayment] Invalid amounts in SpendingAuthV2 from ${buyerPeerId.slice(0, 12)}...`);
46
- return;
155
+ catch (err) {
156
+ debugWarn(`[SellerPayment] Failed to process SpendingAuth: ${err instanceof Error ? err.message : err}`);
47
157
  }
48
- const previousSessionId = payload.previousSessionId ?? ('0x' + '00'.repeat(32));
49
- const sellerAddr = await this._signer.getAddress();
50
- const domain = makeEscrowDomain(this._config.chainId, this._config.contractAddress);
51
- const recovered = verifyTypedData(domain, SPENDING_AUTH_V2_TYPES, {
52
- seller: sellerAddr,
53
- sessionId: payload.sessionId,
54
- maxAmount,
55
- nonce: payload.nonce,
56
- deadline: payload.deadline,
57
- previousConsumption,
58
- previousSessionId,
59
- }, payload.buyerSig);
60
- if (recovered.toLowerCase() !== buyerEvmAddr.toLowerCase()) {
61
- debugWarn(`[SellerPayment] Invalid V2 sig from ${buyerPeerId.slice(0, 12)}... recovered=${recovered.slice(0, 10)}... expected=${buyerEvmAddr.slice(0, 10)}...`);
158
+ }
159
+ // ── Receipt sending ───────────────────────────────────────────
160
+ /**
161
+ * Send a bilateral receipt to the buyer after processing a request.
162
+ * Also triggers TopUpRequest if consumption exceeds 80% of authMax.
163
+ */
164
+ async sendReceipt(buyerPeerId, paymentMux, responseBody, tokensDelivered) {
165
+ const session = this._sessionStore.getActiveSessionByPeer(buyerPeerId, 'seller');
166
+ if (!session) {
167
+ debugWarn(`[SellerPayment] No active session for buyer ${buyerPeerId.slice(0, 12)}... — skipping receipt`);
62
168
  return;
63
169
  }
64
- const prevSession = this._sessions.get(buyerPeerId);
65
- if (prevSession && !prevSession.settled) {
66
- debugLog(`[SellerPayment] Settling previous session ${prevSession.sessionId.slice(0, 18)}... before reserve()`);
67
- try {
68
- const chargeAmount = this._computeChargeAmount(prevSession);
69
- await this._escrow.settle(this._signer, prevSession.sessionId, chargeAmount);
70
- prevSession.settled = true;
71
- }
72
- catch (err) {
73
- debugWarn(`[SellerPayment] Failed to settle previous session: ${err}`);
74
- }
170
+ // Update tokens — cap at the effective token limit so the receipt total
171
+ // always matches what settle() will store as settledTokenCount on-chain.
172
+ // Without this cap, the buyer's previousConsumption (from tokensDelivered)
173
+ // would exceed settledTokenCount (= maxAmount / tokenRate), breaking the
174
+ // proof chain with InvalidProofChain on the next reserve().
175
+ const authMax = BigInt(session.authMax);
176
+ const tokenRate = this._tokenRate;
177
+ if (tokenRate === null || tokenRate === 0n) {
178
+ throw new Error('Token rate unavailable — cannot send receipt without on-chain rate');
179
+ }
180
+ const effectiveTokenCap = authMax / tokenRate;
181
+ let newTotal = BigInt(session.tokensDelivered) + tokensDelivered;
182
+ if (newTotal > effectiveTokenCap) {
183
+ newTotal = effectiveTokenCap;
184
+ }
185
+ const newRequestCount = session.requestCount + 1;
186
+ this._sessionStore.updateTokensDelivered(session.sessionId, newTotal.toString(), newRequestCount);
187
+ // SHA-256 hash of response body
188
+ const responseHash = createHash('sha256').update(responseBody).digest();
189
+ // Build receipt message and sign with Ed25519
190
+ const sessionIdBytes = hexToBytes(session.sessionId.replace(/^0x/, ''));
191
+ const receiptMsg = buildReceiptMessage(sessionIdBytes, newTotal, newRequestCount, new Uint8Array(responseHash));
192
+ const sellerSig = await signMessageEd25519(this._identity, receiptMsg);
193
+ paymentMux.sendSellerReceipt({
194
+ sessionId: session.sessionId,
195
+ runningTotal: newTotal.toString(),
196
+ requestCount: newRequestCount,
197
+ responseHash: bytesToHex(new Uint8Array(responseHash)),
198
+ sellerSig: bytesToHex(sellerSig),
199
+ });
200
+ // Store receipt
201
+ this._sessionStore.insertReceipt({
202
+ sessionId: session.sessionId,
203
+ runningTotal: newTotal.toString(),
204
+ requestCount: newRequestCount,
205
+ responseHash: bytesToHex(new Uint8Array(responseHash)),
206
+ sellerSig: bytesToHex(sellerSig),
207
+ buyerAckSig: null,
208
+ createdAt: Date.now(),
209
+ });
210
+ debugLog(`[SellerPayment] Receipt sent: session=${session.sessionId.slice(0, 18)}... total=${newTotal} count=${newRequestCount}`);
211
+ // TopUpRequest if > 80% of USDC cap consumed (send at most once per session)
212
+ const usdcConsumed = newTotal * tokenRate;
213
+ if (authMax > 0n && usdcConsumed * 100n > authMax * 80n && !this._topUpRequested.has(session.sessionId)) {
214
+ this._topUpRequested.add(session.sessionId);
215
+ const additionalAmount = authMax; // Request same amount again
216
+ paymentMux.sendTopUpRequest({
217
+ sessionId: session.sessionId,
218
+ currentUsed: newTotal.toString(),
219
+ currentMax: authMax.toString(),
220
+ requestedAdditional: additionalAmount.toString(),
221
+ });
222
+ debugLog(`[SellerPayment] TopUpRequest sent: session=${session.sessionId.slice(0, 18)}... (${newTotal}/${authMax})`);
223
+ }
224
+ }
225
+ // ── BuyerAck handler ──────────────────────────────────────────
226
+ async handleBuyerAck(buyerPeerId, payload) {
227
+ const session = this._sessionStore.getActiveSessionByPeer(buyerPeerId, 'seller');
228
+ if (!session) {
229
+ debugWarn(`[SellerPayment] BuyerAck for unknown buyer: ${buyerPeerId.slice(0, 12)}...`);
230
+ return;
75
231
  }
76
232
  try {
77
- await this._escrow.reserve(this._signer, payload.sessionId, buyerEvmAddr, maxAmount, payload.nonce, payload.deadline, previousConsumption, previousSessionId, payload.buyerSig);
233
+ // Verify buyer's Ed25519 ack signature
234
+ const buyerPublicKey = hexToBytes(buyerPeerId);
235
+ const sessionIdBytes = hexToBytes(session.sessionId.replace(/^0x/, ''));
236
+ const ackMsg = buildAckMessage(sessionIdBytes, BigInt(payload.runningTotal), payload.requestCount);
237
+ const sigBytes = hexToBytes(payload.buyerSig);
238
+ const valid = await verifyMessageEd25519(buyerPublicKey, sigBytes, ackMsg);
239
+ if (!valid) {
240
+ debugWarn(`[SellerPayment] Invalid BuyerAck signature from ${buyerPeerId.slice(0, 12)}...`);
241
+ return;
242
+ }
243
+ // Store the ack directly via targeted UPDATE (no-op if no matching receipt)
244
+ this._sessionStore.updateReceiptAck(session.sessionId, payload.runningTotal, payload.requestCount, payload.buyerSig);
245
+ debugLog(`[SellerPayment] BuyerAck received: session=${session.sessionId.slice(0, 18)}... count=${payload.requestCount} total=${payload.runningTotal}`);
78
246
  }
79
247
  catch (err) {
80
- debugWarn(`[SellerPayment] reserve() failed for ${buyerPeerId.slice(0, 12)}...: ${err}`);
81
- return;
248
+ debugWarn(`[SellerPayment] Failed to process BuyerAck: ${err instanceof Error ? err.message : err}`);
82
249
  }
83
- this._sessions.set(buyerPeerId, {
84
- sessionId: payload.sessionId,
85
- buyerPeerId,
86
- buyerEvmAddr,
87
- nonce: payload.nonce,
88
- authMax: maxAmount,
89
- deadline: payload.deadline,
90
- buyerSig: payload.buyerSig,
91
- previousConsumption,
92
- previousSessionId,
93
- tokensDelivered: 0n,
94
- reservedAt: Date.now(),
95
- settled: false,
96
- });
97
- paymentMux.sendAuthAck({ sessionId: payload.sessionId, nonce: payload.nonce });
98
- debugLog(`[SellerPayment] AuthAck sent for session=${payload.sessionId.slice(0, 18)}...`);
99
250
  }
100
- addTokensDelivered(buyerPeerId, tokens) {
101
- const session = this._sessions.get(buyerPeerId);
102
- if (!session || session.settled)
251
+ // ── Disconnect handling ───────────────────────────────────────
252
+ onBuyerDisconnect(buyerPeerId) {
253
+ const session = this._sessionStore.getActiveSessionByPeer(buyerPeerId, 'seller');
254
+ if (!session)
103
255
  return;
104
- session.tokensDelivered += tokens;
105
- debugLog(`[SellerPayment] Tokens accrued for ${buyerPeerId.slice(0, 12)}...: ${session.tokensDelivered}`);
256
+ // Don't settle immediately — wait for buyer to return with next auth.
257
+ // Session persists in store; timeout checker will handle ghost scenarios.
258
+ this._activeBuyers.delete(buyerPeerId);
259
+ debugLog(`[SellerPayment] Buyer ${buyerPeerId.slice(0, 12)}... disconnected — session ${session.sessionId.slice(0, 18)}... preserved for reconnect`);
106
260
  }
107
- async onBuyerDisconnect(buyerPeerId) {
108
- const session = this._sessions.get(buyerPeerId);
109
- if (!session || session.settled) {
110
- this._sessions.delete(buyerPeerId);
111
- return;
112
- }
113
- const settleTimeoutMs = 24 * 60 * 60 * 1000;
114
- const elapsed = Date.now() - session.reservedAt;
115
- if (elapsed >= settleTimeoutMs) {
116
- debugLog(`[SellerPayment] settleTimeout() for ghost session ${session.sessionId.slice(0, 18)}...`);
261
+ // ── Timeout management ────────────────────────────────────────
262
+ /**
263
+ * Check for and settle timed-out sessions.
264
+ * Called periodically and on startup for recovery.
265
+ */
266
+ async checkTimeouts() {
267
+ const timeoutSecs = this._config.settleTimeoutSecs ?? DEFAULT_SETTLE_TIMEOUT_SECS;
268
+ const timedOut = this._sessionStore.getTimedOutSessions(timeoutSecs);
269
+ for (const session of timedOut) {
270
+ if (session.status !== 'active')
271
+ continue;
117
272
  try {
118
- await this._escrow.settleTimeout(this._signer, session.sessionId);
119
- session.settled = true;
273
+ const delivered = BigInt(session.tokensDelivered);
274
+ if (delivered > 0n) {
275
+ // Seller delivered tokens — settle normally to get paid and avoid ghost penalty
276
+ debugLog(`[SellerPayment] Settling timed-out session ${session.sessionId.slice(0, 18)}... with ${delivered} tokens delivered`);
277
+ await this._escrowClient.settle(this._signer, session.sessionId, delivered);
278
+ this._sessionStore.updateSessionStatus(session.sessionId, 'settled', delivered.toString());
279
+ }
280
+ else {
281
+ // No delivery — use settleTimeout (records ghost, releases buyer funds)
282
+ debugLog(`[SellerPayment] Settling timed-out session ${session.sessionId.slice(0, 18)}... (no delivery)`);
283
+ await this._escrowClient.settleTimeout(this._signer, session.sessionId);
284
+ this._sessionStore.updateSessionStatus(session.sessionId, 'timeout');
285
+ }
286
+ this._activeBuyers.delete(session.peerId);
287
+ this._topUpRequested.delete(session.sessionId);
120
288
  }
121
289
  catch (err) {
122
- debugWarn(`[SellerPayment] settleTimeout() failed: ${err}`);
290
+ debugWarn(`[SellerPayment] Failed to settle timeout for ${session.sessionId.slice(0, 18)}...: ${err instanceof Error ? err.message : err}`);
123
291
  }
124
292
  }
125
- else {
126
- debugLog('[SellerPayment] Buyer disconnected, session not yet timeout-eligible. Will settle on next SpendingAuthV2.');
127
- }
128
- this._sessions.delete(buyerPeerId);
129
293
  }
130
- async settleSession(buyerPeerId, chargeAmount) {
131
- const session = this._sessions.get(buyerPeerId);
132
- if (!session || session.settled)
133
- return;
294
+ // ── Queries ───────────────────────────────────────────────────
295
+ hasSession(buyerPeerId) {
296
+ return this._activeBuyers.has(buyerPeerId);
297
+ }
298
+ /** Minimum interval between init retry attempts. */
299
+ _lastInitAttemptMs = 0;
300
+ static INIT_RETRY_INTERVAL_MS = 30_000;
301
+ /**
302
+ * Pre-fetch on-chain data (tokenRate, FIRST_SIGN_CAP) so PaymentRequired
303
+ * messages can be sent without blocking on RPC calls.
304
+ */
305
+ async init() {
306
+ this._lastInitAttemptMs = Date.now();
134
307
  try {
135
- await this._escrow.settle(this._signer, session.sessionId, chargeAmount);
136
- session.settled = true;
137
- debugLog(`[SellerPayment] Settled session ${session.sessionId.slice(0, 18)}... charged=${chargeAmount}`);
308
+ const sellerEvmAddr = identityToEvmAddress(this._identity);
309
+ const [account, firstSignCap] = await Promise.all([
310
+ this._escrowClient.getSellerAccount(sellerEvmAddr),
311
+ this._escrowClient.getFirstSignCap(),
312
+ ]);
313
+ this._tokenRate = account.tokenRate;
314
+ this._firstSignCap = firstSignCap;
315
+ debugLog(`[SellerPayment] Cached on-chain data: tokenRate=${this._tokenRate} firstSignCap=${this._firstSignCap}`);
138
316
  }
139
317
  catch (err) {
140
- debugWarn(`[SellerPayment] settle() failed: ${err}`);
141
- throw err;
318
+ debugWarn(`[SellerPayment] Failed to pre-fetch on-chain data: ${err instanceof Error ? err.message : err}`);
142
319
  }
143
320
  }
144
- async claimEarnings() {
145
- return this._escrow.claimEarnings(this._signer);
146
- }
147
- async stake(amount) {
148
- return this._escrow.stake(this._signer, amount);
149
- }
150
- async unstake(amount) {
151
- return this._escrow.unstake(this._signer, amount);
321
+ /** Retry init if on-chain data is missing and enough time has passed. */
322
+ async ensureInitialized() {
323
+ if (this._tokenRate !== null && this._firstSignCap !== null)
324
+ return;
325
+ if (Date.now() - this._lastInitAttemptMs < SellerPaymentManager.INIT_RETRY_INTERVAL_MS)
326
+ return;
327
+ await this.init();
152
328
  }
153
- async getPendingEarnings() {
154
- const addr = await this._signer.getAddress();
155
- return this._escrow.getSellerPendingEarnings(addr);
329
+ static DEFAULT_SUGGESTED_AMOUNT = 100000n; // $0.10
330
+ /**
331
+ * Build the PaymentRequired payload for a buyer that doesn't have a session.
332
+ * Returns null if on-chain data isn't available yet.
333
+ * For returning buyers (proven-sign eligible), uses the configured proven-sign
334
+ * amount instead of the first-sign amount (both default to $0.10).
335
+ */
336
+ getPaymentRequirements(requestId, buyerPeerId, pricing) {
337
+ const sellerEvmAddr = identityToEvmAddress(this._identity);
338
+ const tokenRate = this._tokenRate;
339
+ const firstSignCap = this._firstSignCap;
340
+ if (tokenRate === null || firstSignCap === null) {
341
+ return null;
342
+ }
343
+ const defaultAmount = SellerPaymentManager.DEFAULT_SUGGESTED_AMOUNT;
344
+ const firstSignAmount = this._config.firstSignAmountUsdc
345
+ ? BigInt(this._config.firstSignAmountUsdc) : defaultAmount;
346
+ const provenSignAmount = this._config.provenSignAmountUsdc
347
+ ? BigInt(this._config.provenSignAmountUsdc) : defaultAmount;
348
+ let suggestedAmount = firstSignAmount;
349
+ if (buyerPeerId) {
350
+ const priorSession = this._sessionStore.getLatestSession(buyerPeerId, 'seller');
351
+ if (priorSession && BigInt(priorSession.tokensDelivered) > 0n) {
352
+ suggestedAmount = provenSignAmount;
353
+ }
354
+ }
355
+ return {
356
+ sellerEvmAddr,
357
+ tokenRate: tokenRate.toString(),
358
+ firstSignCap: firstSignCap.toString(),
359
+ suggestedAmount: suggestedAmount.toString(),
360
+ requestId,
361
+ ...(pricing?.inputUsdPerMillion != null ? { inputUsdPerMillion: pricing.inputUsdPerMillion } : {}),
362
+ ...(pricing?.outputUsdPerMillion != null ? { outputUsdPerMillion: pricing.outputUsdPerMillion } : {}),
363
+ };
156
364
  }
157
- _computeChargeAmount(session) {
158
- return session.authMax;
365
+ // ── Lifecycle ─────────────────────────────────────────────────
366
+ close() {
367
+ // SessionStore is shared with BuyerPaymentManager, closed from node.ts
159
368
  }
160
369
  }
161
370
  //# sourceMappingURL=seller-payment-manager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"seller-payment-manager.js","sourceRoot":"","sources":["../../src/payments/seller-payment-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"seller-payment-manager.js","sourceRoot":"","sources":["../../src/payments/seller-payment-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ export declare const SESSION_STATUS: {
2
+ readonly ACTIVE: "active";
3
+ readonly SETTLED: "settled";
4
+ readonly TIMEOUT: "timeout";
5
+ readonly GHOST: "ghost";
6
+ };
7
+ export interface StoredSession {
8
+ sessionId: string;
9
+ peerId: string;
10
+ role: 'buyer' | 'seller';
11
+ sellerEvmAddr: string;
12
+ buyerEvmAddr: string;
13
+ nonce: number;
14
+ authMax: string;
15
+ deadline: number;
16
+ previousSessionId: string;
17
+ previousConsumption: string;
18
+ tokensDelivered: string;
19
+ requestCount: number;
20
+ reservedAt: number;
21
+ settledAt: number | null;
22
+ settledAmount: string | null;
23
+ status: 'active' | 'settled' | 'timeout' | 'ghost';
24
+ createdAt: number;
25
+ updatedAt: number;
26
+ }
27
+ export interface StoredReceipt {
28
+ id?: number;
29
+ sessionId: string;
30
+ runningTotal: string;
31
+ requestCount: number;
32
+ responseHash: string;
33
+ sellerSig: string;
34
+ buyerAckSig: string | null;
35
+ createdAt: number;
36
+ }
37
+ export declare class SessionStore {
38
+ private _db;
39
+ /** Cached transaction function for updateDeliveredAndInsertReceipt (compiled once). */
40
+ private readonly _updateDeliveredAndInsertReceiptTxn;
41
+ private readonly _stmts;
42
+ constructor(dataDir: string);
43
+ private _createTables;
44
+ private _prepareStatements;
45
+ upsertSession(session: StoredSession): void;
46
+ getSession(sessionId: string): StoredSession | null;
47
+ getActiveSessionByPeer(peerId: string, role: string): StoredSession | null;
48
+ getLatestSession(peerId: string, role: string): StoredSession | null;
49
+ updateSessionStatus(sessionId: string, status: string, settledAmount?: string): void;
50
+ updateTokensDelivered(sessionId: string, tokens: string, requestCount: number): void;
51
+ getMaxNonce(role: string): number;
52
+ /** List all sessions ordered by most recent first. */
53
+ listAllSessions(limit?: number): StoredSession[];
54
+ /** Get all active sessions for a given role (buyer or seller). */
55
+ getActiveSessions(role: string): StoredSession[];
56
+ getTimedOutSessions(timeoutSeconds: number): StoredSession[];
57
+ insertReceipt(receipt: Omit<StoredReceipt, 'id'>): void;
58
+ getReceipts(sessionId: string): StoredReceipt[];
59
+ /** Atomically update tokens delivered and insert receipt in a single transaction. */
60
+ updateDeliveredAndInsertReceipt(sessionId: string, tokens: string, requestCount: number, receipt: Omit<StoredReceipt, 'id'>): void;
61
+ /** Update receipt ack directly by composite key (no load-all-then-filter). */
62
+ updateReceiptAck(sessionId: string, runningTotal: string, requestCount: number, buyerAckSig: string): void;
63
+ close(): void;
64
+ }
65
+ //# sourceMappingURL=session-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-store.d.ts","sourceRoot":"","sources":["../../src/payments/session-store.ts"],"names":[],"mappings":"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"}