@antseed/node 0.2.64 → 0.2.66

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 (49) hide show
  1. package/dist/discovery/announcer.d.ts +25 -0
  2. package/dist/discovery/announcer.d.ts.map +1 -1
  3. package/dist/discovery/announcer.js +85 -10
  4. package/dist/discovery/announcer.js.map +1 -1
  5. package/dist/discovery/metadata-codec.d.ts.map +1 -1
  6. package/dist/discovery/metadata-codec.js +25 -0
  7. package/dist/discovery/metadata-codec.js.map +1 -1
  8. package/dist/discovery/metadata-validator.d.ts +1 -1
  9. package/dist/discovery/metadata-validator.d.ts.map +1 -1
  10. package/dist/discovery/metadata-validator.js +24 -12
  11. package/dist/discovery/metadata-validator.js.map +1 -1
  12. package/dist/discovery/peer-metadata.d.ts +8 -1
  13. package/dist/discovery/peer-metadata.d.ts.map +1 -1
  14. package/dist/discovery/peer-metadata.js +1 -1
  15. package/dist/discovery/seller-address-resolver.d.ts +50 -0
  16. package/dist/discovery/seller-address-resolver.d.ts.map +1 -0
  17. package/dist/discovery/seller-address-resolver.js +115 -0
  18. package/dist/discovery/seller-address-resolver.js.map +1 -0
  19. package/dist/node.d.ts +8 -0
  20. package/dist/node.d.ts.map +1 -1
  21. package/dist/node.js +85 -8
  22. package/dist/node.js.map +1 -1
  23. package/dist/payments/buyer-payment-manager.d.ts +5 -2
  24. package/dist/payments/buyer-payment-manager.d.ts.map +1 -1
  25. package/dist/payments/buyer-payment-manager.js +8 -4
  26. package/dist/payments/buyer-payment-manager.js.map +1 -1
  27. package/dist/payments/buyer-payment-negotiator.d.ts +17 -1
  28. package/dist/payments/buyer-payment-negotiator.d.ts.map +1 -1
  29. package/dist/payments/buyer-payment-negotiator.js +80 -13
  30. package/dist/payments/buyer-payment-negotiator.js.map +1 -1
  31. package/dist/payments/evm/channels-client.d.ts +34 -1
  32. package/dist/payments/evm/channels-client.d.ts.map +1 -1
  33. package/dist/payments/evm/channels-client.js +100 -7
  34. package/dist/payments/evm/channels-client.js.map +1 -1
  35. package/dist/payments/readiness.d.ts +1 -1
  36. package/dist/payments/readiness.d.ts.map +1 -1
  37. package/dist/payments/readiness.js +10 -6
  38. package/dist/payments/readiness.js.map +1 -1
  39. package/dist/payments/seller-payment-manager.d.ts +6 -1
  40. package/dist/payments/seller-payment-manager.d.ts.map +1 -1
  41. package/dist/payments/seller-payment-manager.js +27 -8
  42. package/dist/payments/seller-payment-manager.js.map +1 -1
  43. package/dist/seller-request-handler.d.ts.map +1 -1
  44. package/dist/seller-request-handler.js +34 -23
  45. package/dist/seller-request-handler.js.map +1 -1
  46. package/dist/types/peer.d.ts +34 -2
  47. package/dist/types/peer.d.ts.map +1 -1
  48. package/dist/types/peer.js.map +1 -1
  49. package/package.json +2 -2
@@ -2,7 +2,7 @@ import type { PeerId } from "../types/peer.js";
2
2
  import type { PeerOffering } from "../types/capability.js";
3
3
  import type { ServiceApiProtocol } from "../types/service-api.js";
4
4
  import { WELL_KNOWN_SERVICE_API_PROTOCOLS } from "../types/service-api.js";
5
- export declare const METADATA_VERSION = 7;
5
+ export declare const METADATA_VERSION = 8;
6
6
  export declare const WELL_KNOWN_SERVICE_CATEGORIES: readonly ["privacy", "legal", "uncensored", "coding", "finance", "tee"];
7
7
  export { WELL_KNOWN_SERVICE_API_PROTOCOLS };
8
8
  export type { ServiceApiProtocol };
@@ -34,6 +34,13 @@ export interface PeerMetadata {
34
34
  trustScore?: number;
35
35
  onChainChannelCount?: number;
36
36
  onChainGhostCount?: number;
37
+ /**
38
+ * On-chain seller contract that fronts this peer (e.g. a DiemStakingProxy).
39
+ * Buyers resolve `seller = sellerContract` for channel flows and verify the
40
+ * binding by calling `sellerContract.isOperator(peerAddress)` on-chain.
41
+ * Stored as 40 lowercase hex chars (no `0x` prefix) matching `peerId` format.
42
+ */
43
+ sellerContract?: string;
37
44
  signature: string;
38
45
  }
39
46
  //# sourceMappingURL=peer-metadata.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"peer-metadata.d.ts","sourceRoot":"","sources":["../../src/discovery/peer-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAE3E,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,6BAA6B,yEAOhC,CAAC;AACX,OAAO,EAAE,gCAAgC,EAAE,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC,MAAM,WAAW,yBAAyB;IACxC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,EAAE,yBAAyB,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAC3D,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;CACnB"}
1
+ {"version":3,"file":"peer-metadata.d.ts","sourceRoot":"","sources":["../../src/discovery/peer-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,gCAAgC,EAAE,MAAM,yBAAyB,CAAC;AAE3E,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAClC,eAAO,MAAM,6BAA6B,yEAOhC,CAAC;AACX,OAAO,EAAE,gCAAgC,EAAE,CAAC;AAC5C,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAEnC,MAAM,WAAW,yBAAyB;IACxC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,wBAAwB,CAAC,EAAE,MAAM,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,cAAc,EAAE,yBAAyB,CAAC;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;IAC3D,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7C,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC3D,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,oBAAoB,EAAE,CAAC;IAClC,SAAS,CAAC,EAAE,YAAY,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB"}
@@ -1,5 +1,5 @@
1
1
  import { WELL_KNOWN_SERVICE_API_PROTOCOLS } from "../types/service-api.js";
2
- export const METADATA_VERSION = 7;
2
+ export const METADATA_VERSION = 8;
3
3
  export const WELL_KNOWN_SERVICE_CATEGORIES = [
4
4
  "privacy",
5
5
  "legal",
@@ -0,0 +1,50 @@
1
+ import type { PeerId } from "../types/peer.js";
2
+ import type { PeerMetadata } from "./peer-metadata.js";
3
+ /**
4
+ * Called by the resolver to ask the chain whether a peer is an authorized
5
+ * operator of a seller contract. Implementations typically wrap an
6
+ * `isOperator(address) view returns (bool)` call on the proxy.
7
+ */
8
+ export type IsOperatorChecker = (sellerContract: string, peerAddress: string) => Promise<boolean>;
9
+ export declare class SellerAuthorizationError extends Error {
10
+ constructor(reason: string);
11
+ }
12
+ /**
13
+ * Resolves the on-chain seller address for a peer.
14
+ *
15
+ * If the peer's metadata advertises a `sellerContract`, the resolver verifies
16
+ * via a single on-chain call (`proxy.isOperator(peerAddress)`) that the peer is
17
+ * an authorized operator for that contract. Result is cached per peer with a
18
+ * short TTL; cache misses go back to chain. Fail-closed on unknown peers.
19
+ */
20
+ export declare class SellerAddressResolver {
21
+ private readonly _cache;
22
+ private readonly _ttlMs;
23
+ private readonly _maxEntries;
24
+ private readonly _isOperator;
25
+ private readonly _rpcRetries;
26
+ private readonly _rpcRetryBackoffMs;
27
+ constructor(opts: {
28
+ isOperator: IsOperatorChecker;
29
+ ttlMs?: number;
30
+ maxEntries?: number;
31
+ rpcRetries?: number;
32
+ rpcRetryBackoffMs?: number;
33
+ });
34
+ /**
35
+ * - No sellerContract in metadata → return peerIdToAddress(peerId) (default).
36
+ * - sellerContract present and chain says peer is an operator → return sellerContract.
37
+ * - sellerContract present but chain says peer is NOT an operator → throw.
38
+ */
39
+ resolveSellerAddress(peerId: PeerId, metadata?: PeerMetadata): Promise<string>;
40
+ invalidate(peerId: PeerId): void;
41
+ /**
42
+ * Retry `isOperator` a small number of times with linear backoff before
43
+ * failing closed. Transient RPC blips (timeout, rate limit, fallback
44
+ * provider churn) would otherwise drop peers from discovery for the full
45
+ * negotiation attempt; a couple of cheap retries absorb the common case.
46
+ */
47
+ private _callIsOperatorWithRetry;
48
+ private _pruneCache;
49
+ }
50
+ //# sourceMappingURL=seller-address-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller-address-resolver.d.ts","sourceRoot":"","sources":["../../src/discovery/seller-address-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAQvD;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAC9B,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,MAAM,EAAE,MAAM;CAI3B;AAOD;;;;;;;GAOG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IACxD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAEhC,IAAI,EAAE;QAChB,UAAU,EAAE,iBAAiB,CAAC;QAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B;IAQD;;;;OAIG;IACG,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAoCpF,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIhC;;;;;OAKG;YACW,wBAAwB;IAyBtC,OAAO,CAAC,WAAW;CAgBpB"}
@@ -0,0 +1,115 @@
1
+ import { peerIdToAddress } from "../types/peer.js";
2
+ import { debugWarn } from "../utils/debug.js";
3
+ const DEFAULT_CACHE_TTL_MS = 5 * 60 * 1000;
4
+ const DEFAULT_CACHE_MAX_ENTRIES = 1024;
5
+ const DEFAULT_RPC_RETRIES = 2;
6
+ const DEFAULT_RPC_RETRY_BACKOFF_MS = 150;
7
+ export class SellerAuthorizationError extends Error {
8
+ constructor(reason) {
9
+ super(`seller authorization failed: ${reason}`);
10
+ this.name = "SellerAuthorizationError";
11
+ }
12
+ }
13
+ /**
14
+ * Resolves the on-chain seller address for a peer.
15
+ *
16
+ * If the peer's metadata advertises a `sellerContract`, the resolver verifies
17
+ * via a single on-chain call (`proxy.isOperator(peerAddress)`) that the peer is
18
+ * an authorized operator for that contract. Result is cached per peer with a
19
+ * short TTL; cache misses go back to chain. Fail-closed on unknown peers.
20
+ */
21
+ export class SellerAddressResolver {
22
+ _cache = new Map();
23
+ _ttlMs;
24
+ _maxEntries;
25
+ _isOperator;
26
+ _rpcRetries;
27
+ _rpcRetryBackoffMs;
28
+ constructor(opts) {
29
+ this._isOperator = opts.isOperator;
30
+ this._ttlMs = opts.ttlMs ?? DEFAULT_CACHE_TTL_MS;
31
+ this._maxEntries = opts.maxEntries ?? DEFAULT_CACHE_MAX_ENTRIES;
32
+ this._rpcRetries = opts.rpcRetries ?? DEFAULT_RPC_RETRIES;
33
+ this._rpcRetryBackoffMs = opts.rpcRetryBackoffMs ?? DEFAULT_RPC_RETRY_BACKOFF_MS;
34
+ }
35
+ /**
36
+ * - No sellerContract in metadata → return peerIdToAddress(peerId) (default).
37
+ * - sellerContract present and chain says peer is an operator → return sellerContract.
38
+ * - sellerContract present but chain says peer is NOT an operator → throw.
39
+ */
40
+ async resolveSellerAddress(peerId, metadata) {
41
+ const raw = metadata?.sellerContract;
42
+ if (!raw)
43
+ return peerIdToAddress(peerId);
44
+ // Normalize to lowercase `0x`-prefixed form so cache hits are stable
45
+ // regardless of casing upstream (defence in depth; the decoder already
46
+ // emits lowercase hex without the prefix).
47
+ const sellerContract = (raw.startsWith("0x") ? raw : "0x" + raw).toLowerCase();
48
+ const cached = this._cache.get(peerId);
49
+ if (cached &&
50
+ cached.sellerContract === sellerContract &&
51
+ Date.now() - cached.verifiedAt < this._ttlMs) {
52
+ // Refresh insertion order so eviction is true LRU, not FIFO.
53
+ this._cache.delete(peerId);
54
+ this._cache.set(peerId, cached);
55
+ return cached.sellerContract;
56
+ }
57
+ const peerAddress = peerIdToAddress(peerId);
58
+ const isAuthorized = await this._callIsOperatorWithRetry(sellerContract, peerAddress);
59
+ if (!isAuthorized) {
60
+ debugWarn(`[Resolver] peer ${peerId.slice(0, 12)}... is NOT an operator of ${sellerContract}`);
61
+ throw new SellerAuthorizationError("peer is not an authorized operator");
62
+ }
63
+ this._pruneCache();
64
+ this._cache.set(peerId, { sellerContract, verifiedAt: Date.now() });
65
+ return sellerContract;
66
+ }
67
+ invalidate(peerId) {
68
+ this._cache.delete(peerId);
69
+ }
70
+ /**
71
+ * Retry `isOperator` a small number of times with linear backoff before
72
+ * failing closed. Transient RPC blips (timeout, rate limit, fallback
73
+ * provider churn) would otherwise drop peers from discovery for the full
74
+ * negotiation attempt; a couple of cheap retries absorb the common case.
75
+ */
76
+ async _callIsOperatorWithRetry(sellerContract, peerAddress) {
77
+ const maxAttempts = Math.max(1, this._rpcRetries + 1);
78
+ let lastErr;
79
+ for (let attempt = 1; attempt <= maxAttempts; attempt++) {
80
+ try {
81
+ return await this._isOperator(sellerContract, peerAddress);
82
+ }
83
+ catch (err) {
84
+ lastErr = err;
85
+ if (attempt < maxAttempts) {
86
+ await new Promise((resolve) => setTimeout(resolve, this._rpcRetryBackoffMs * attempt));
87
+ continue;
88
+ }
89
+ }
90
+ }
91
+ debugWarn(`[Resolver] isOperator(${sellerContract}, ${peerAddress}) RPC failed after ${maxAttempts} attempt(s): ${lastErr instanceof Error ? lastErr.message : lastErr}`);
92
+ throw new SellerAuthorizationError("isOperator RPC failed");
93
+ }
94
+ _pruneCache() {
95
+ if (this._cache.size < this._maxEntries)
96
+ return;
97
+ const now = Date.now();
98
+ for (const [peerId, entry] of this._cache) {
99
+ if (now - entry.verifiedAt >= this._ttlMs)
100
+ this._cache.delete(peerId);
101
+ }
102
+ if (this._cache.size < this._maxEntries)
103
+ return;
104
+ // LRU eviction: `Map` iteration follows insertion order. The cache-hit
105
+ // path above `delete`s and re-`set`s the entry on every lookup, which
106
+ // moves it to the end of the iteration order. That makes
107
+ // `keys().next().value` the least-recently-used key here, not merely
108
+ // the first-inserted one — don't break that invariant without also
109
+ // updating the hit path.
110
+ const oldestKey = this._cache.keys().next().value;
111
+ if (oldestKey !== undefined)
112
+ this._cache.delete(oldestKey);
113
+ }
114
+ }
115
+ //# sourceMappingURL=seller-address-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller-address-resolver.js","sourceRoot":"","sources":["../../src/discovery/seller-address-resolver.ts"],"names":[],"mappings":"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"}
package/dist/node.d.ts CHANGED
@@ -5,6 +5,7 @@ import type { PeerInfo } from "./types/peer.js";
5
5
  import type { SerializedHttpRequest, SerializedHttpResponse } from "./types/http.js";
6
6
  import { type SellerSessionSnapshot } from "./metering/seller-session-tracker.js";
7
7
  import { ConnectionState } from "./types/connection.js";
8
+ import { type SellerContractConfig } from "./discovery/announcer.js";
8
9
  import type { Provider, ProviderStreamCallbacks } from "./interfaces/seller-provider.js";
9
10
  import type { Router } from "./interfaces/buyer-router.js";
10
11
  import { type PaymentConfig, type PaymentMethod } from "./payments/index.js";
@@ -93,6 +94,12 @@ export interface NodeConfig {
93
94
  identityStore?: IdentityStore;
94
95
  /** Optional explicit config.json path for runtime config reloads. */
95
96
  configPath?: string;
97
+ /**
98
+ * Optional on-chain seller contract (e.g. DiemStakingProxy). When set, the
99
+ * announcer publishes it in metadata; buyers verify the binding by calling
100
+ * `sellerContract.isOperator(peerAddress)`.
101
+ */
102
+ sellerContract?: SellerContractConfig;
96
103
  }
97
104
  export interface BuyerUsageChannelPoint {
98
105
  reservedAt: number;
@@ -130,6 +137,7 @@ export declare class AntseedNode extends EventEmitter {
130
137
  private _depositsClient;
131
138
  private _channelsClient;
132
139
  private _stakingClient;
140
+ private _sellerAddressResolver;
133
141
  private _identityClient;
134
142
  private _paymentMuxes;
135
143
  /** Seller-side request handler (provider matching, execution, load tracking). */
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"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"}
package/dist/node.js CHANGED
@@ -25,6 +25,8 @@ import { debugLog, debugWarn } from "./utils/debug.js";
25
25
  import { parsePublicAddress } from "./discovery/public-address.js";
26
26
  import { BuyerPaymentManager } from "./payments/buyer-payment-manager.js";
27
27
  import { BuyerPaymentNegotiator } from "./payments/buyer-payment-negotiator.js";
28
+ import { SellerAddressResolver } from "./discovery/seller-address-resolver.js";
29
+ import { Contract as EthersContract } from "ethers";
28
30
  import { SellerPaymentManager } from "./payments/seller-payment-manager.js";
29
31
  import { IdentityClient } from "./payments/evm/identity-client.js";
30
32
  import { SellerRequestHandler } from "./seller-request-handler.js";
@@ -58,6 +60,7 @@ export class AntseedNode extends EventEmitter {
58
60
  _depositsClient = null;
59
61
  _channelsClient = null;
60
62
  _stakingClient = null;
63
+ _sellerAddressResolver = null;
61
64
  _identityClient = null;
62
65
  _paymentMuxes = new Map();
63
66
  /** Seller-side request handler (provider matching, execution, load tracking). */
@@ -246,6 +249,7 @@ export class AntseedNode extends EventEmitter {
246
249
  this._channelsClient = null;
247
250
  this._stakingClient = null;
248
251
  this._identityClient = null;
252
+ this._sellerAddressResolver = null;
249
253
  this._buyerPaymentManager = null;
250
254
  this._buyerNegotiator = null;
251
255
  this._buyerHandler = null;
@@ -279,20 +283,63 @@ export class AntseedNode extends EventEmitter {
279
283
  peers.push(p);
280
284
  }
281
285
  }
282
- // Verify claimed on-chain stats against actual contract data
286
+ // Verify claimed on-chain stats against actual contract data, and
287
+ // populate volume/last-settled which are never announced by sellers.
288
+ //
289
+ // Concurrency is capped so a wildcard DHT lookup returning hundreds of
290
+ // peers doesn't fan out into hundreds of simultaneous eth_calls (resolver
291
+ // isOperator + getAgentId + getAgentStats per peer). Most RPC endpoints
292
+ // will rate-limit past ~10-20 concurrent calls; we stay well under that.
283
293
  if (this._channelsClient && this._stakingClient) {
284
- for (const p of peers) {
294
+ const channelsClient = this._channelsClient;
295
+ const stakingClient = this._stakingClient;
296
+ const resolver = this._sellerAddressResolver;
297
+ const DISCOVERY_RPC_CONCURRENCY = 8;
298
+ const queue = peers.slice();
299
+ const workers = [];
300
+ // Throttle on-chain reads across rapid discovery cycles. 60s is short
301
+ // enough that freshness feels real-time in the UI, and long enough that
302
+ // back-to-back `discoverPeers()` calls don't hammer the RPC endpoint.
303
+ const ON_CHAIN_STATS_TTL_MS = 60_000;
304
+ const nowMs = Date.now();
305
+ const verifyOne = async (p) => {
306
+ if (typeof p.onChainStatsFetchedAt === 'number'
307
+ && nowMs - p.onChainStatsFetchedAt < ON_CHAIN_STATS_TTL_MS) {
308
+ return;
309
+ }
285
310
  try {
286
- const evmAddress = peerIdToAddress(p.peerId);
287
- const agentId = await this._stakingClient.getAgentId(evmAddress);
288
- const stats = await this._channelsClient.getAgentStats(agentId);
311
+ const evmAddress = resolver
312
+ ? await resolver.resolveSellerAddress(p.peerId, p.metadata)
313
+ : peerIdToAddress(p.peerId);
314
+ const agentId = await stakingClient.getAgentId(evmAddress);
315
+ const stats = await channelsClient.getAgentStats(agentId);
289
316
  p.onChainChannelCount = stats.channelCount;
290
317
  p.onChainGhostCount = stats.ghostCount;
318
+ // totalVolumeUsdc is base-6 USDC. Clamp to safe-int range before
319
+ // narrowing to Number — ~9M USDC fits Number.MAX_SAFE_INTEGER.
320
+ const volumeMicros = stats.totalVolumeUsdc;
321
+ p.onChainTotalVolumeUsdcMicros = volumeMicros <= BigInt(Number.MAX_SAFE_INTEGER)
322
+ ? Number(volumeMicros)
323
+ : Number.MAX_SAFE_INTEGER;
324
+ p.onChainLastSettledAtSec = stats.lastSettledAt;
325
+ p.onChainStatsFetchedAt = Date.now();
291
326
  }
292
327
  catch {
293
- // Contract lookup failed for this peer — keep claimed data
328
+ // Per-peer verification failure — keep whatever seller metadata claimed
329
+ // (channelCount/ghostCount); volume/lastSettled remain undefined.
294
330
  }
331
+ };
332
+ for (let i = 0; i < Math.min(DISCOVERY_RPC_CONCURRENCY, queue.length); i++) {
333
+ workers.push((async () => {
334
+ for (;;) {
335
+ const next = queue.shift();
336
+ if (!next)
337
+ return;
338
+ await verifyOne(next);
339
+ }
340
+ })());
295
341
  }
342
+ await Promise.all(workers);
296
343
  }
297
344
  for (const p of peers) {
298
345
  debugLog(`[Node] peer ${p.peerId.slice(0, 12)}... providers=[${p.providers.join(",")}] addr=${p.publicAddress ?? "?"}`);
@@ -687,6 +734,7 @@ export class AntseedNode extends EventEmitter {
687
734
  signalingPort: actualSignalingPort,
688
735
  ...(this._channelsClient ? { channelsClient: this._channelsClient } : {}),
689
736
  ...(this._stakingClient ? { stakingClient: this._stakingClient, paymentsEnabled: true } : {}),
737
+ ...(this._config.sellerContract ? { sellerContract: this._config.sellerContract } : {}),
690
738
  };
691
739
  this._announcer = new PeerAnnouncer(announcerConfig);
692
740
  this._announcer.startPeriodicAnnounce();
@@ -762,10 +810,10 @@ export class AntseedNode extends EventEmitter {
762
810
  maxReserveAmountUsdc: BigInt(payments.maxReserveAmountUsdc ?? "1000000"), // $1.00 default per session (matches FIRST_SIGN_CAP)
763
811
  dataDir: paymentsDir,
764
812
  };
765
- this._buyerPaymentManager = new BuyerPaymentManager(identity, buyerPaymentConfig, this._channelStore);
813
+ this._buyerPaymentManager = new BuyerPaymentManager(identity, buyerPaymentConfig, this._channelStore, this._sellerAddressResolver ?? undefined);
766
814
  debugLog(`[Node] Buyer payment manager initialized (wallet=${identity.wallet.address.slice(0, 10)}... chainId=${buyerPaymentConfig.chainId} deposits=${buyerPaymentConfig.depositsContractAddress.slice(0, 10)}...)`);
767
815
  // Create negotiator that wraps the BPM with 402 handling and per-request auth
768
- this._buyerNegotiator = new BuyerPaymentNegotiator(identity, this._buyerPaymentManager, this._depositsClient, this._channelsClient, this._channelStore, {}, this);
816
+ this._buyerNegotiator = new BuyerPaymentNegotiator(identity, this._buyerPaymentManager, this._depositsClient, this._channelsClient, this._channelStore, {}, this, this._sellerAddressResolver ?? undefined);
769
817
  debugLog(`[Node] Buyer payment negotiator initialized`);
770
818
  }
771
819
  }
@@ -839,6 +887,30 @@ export class AntseedNode extends EventEmitter {
839
887
  ...(payments.chainId ? { evmChainId: payments.chainId } : {}),
840
888
  });
841
889
  debugLog(`[Node] ChannelsClient initialized (contract=${payments.channelsAddress.slice(0, 10)}...)`);
890
+ const channelsClientRef = this._channelsClient;
891
+ const isOperatorAbi = ["function isOperator(address) view returns (bool)"];
892
+ const SELLER_CONTRACTS_MAX = 256;
893
+ const sellerContracts = new Map();
894
+ this._sellerAddressResolver = new SellerAddressResolver({
895
+ isOperator: async (sellerContract, peerAddress) => {
896
+ let contract = sellerContracts.get(sellerContract);
897
+ if (contract) {
898
+ sellerContracts.delete(sellerContract);
899
+ sellerContracts.set(sellerContract, contract);
900
+ }
901
+ else {
902
+ contract = new EthersContract(sellerContract, isOperatorAbi, channelsClientRef.provider);
903
+ if (sellerContracts.size >= SELLER_CONTRACTS_MAX) {
904
+ const oldest = sellerContracts.keys().next().value;
905
+ if (oldest !== undefined)
906
+ sellerContracts.delete(oldest);
907
+ }
908
+ sellerContracts.set(sellerContract, contract);
909
+ }
910
+ return await contract.getFunction("isOperator")(peerAddress);
911
+ },
912
+ });
913
+ debugLog(`[Node] SellerAddressResolver initialized`);
842
914
  }
843
915
  // Initialize StakingClient
844
916
  if (payments.rpcUrl && payments.stakingAddress && payments.usdcAddress) {
@@ -1075,6 +1147,7 @@ export class AntseedNode extends EventEmitter {
1075
1147
  peerId: result.metadata.peerId,
1076
1148
  displayName: result.metadata.displayName,
1077
1149
  lastSeen: result.metadata.timestamp,
1150
+ metadata: result.metadata,
1078
1151
  providers,
1079
1152
  publicAddress: this._resolvePublicAddress(result),
1080
1153
  ...(hasProviderPricing ? { providerPricing: providerPricingEntries } : {}),
@@ -1085,6 +1158,10 @@ export class AntseedNode extends EventEmitter {
1085
1158
  defaultCachedInputUsdPerMillion: firstProvider?.defaultPricing.cachedInputUsdPerMillion,
1086
1159
  maxConcurrency: firstProvider?.maxConcurrency,
1087
1160
  currentLoad: firstProvider?.currentLoad,
1161
+ // channelCount/ghostCount are taken from seller-announced metadata as a
1162
+ // starting value. `discoverPeers`' verifyOne then reads the contract
1163
+ // directly and overwrites these fields with the authoritative values
1164
+ // (and populates volume + lastSettled, which sellers never announce).
1088
1165
  onChainChannelCount: result.metadata.onChainChannelCount,
1089
1166
  onChainGhostCount: result.metadata.onChainGhostCount,
1090
1167
  };