@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.
- package/dist/discovery/announcer.d.ts +25 -0
- package/dist/discovery/announcer.d.ts.map +1 -1
- package/dist/discovery/announcer.js +85 -10
- package/dist/discovery/announcer.js.map +1 -1
- package/dist/discovery/metadata-codec.d.ts.map +1 -1
- package/dist/discovery/metadata-codec.js +25 -0
- package/dist/discovery/metadata-codec.js.map +1 -1
- package/dist/discovery/metadata-validator.d.ts +1 -1
- package/dist/discovery/metadata-validator.d.ts.map +1 -1
- package/dist/discovery/metadata-validator.js +24 -12
- package/dist/discovery/metadata-validator.js.map +1 -1
- package/dist/discovery/peer-metadata.d.ts +8 -1
- package/dist/discovery/peer-metadata.d.ts.map +1 -1
- package/dist/discovery/peer-metadata.js +1 -1
- package/dist/discovery/seller-address-resolver.d.ts +50 -0
- package/dist/discovery/seller-address-resolver.d.ts.map +1 -0
- package/dist/discovery/seller-address-resolver.js +115 -0
- package/dist/discovery/seller-address-resolver.js.map +1 -0
- package/dist/node.d.ts +8 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +85 -8
- package/dist/node.js.map +1 -1
- package/dist/payments/buyer-payment-manager.d.ts +5 -2
- package/dist/payments/buyer-payment-manager.d.ts.map +1 -1
- package/dist/payments/buyer-payment-manager.js +8 -4
- package/dist/payments/buyer-payment-manager.js.map +1 -1
- package/dist/payments/buyer-payment-negotiator.d.ts +17 -1
- package/dist/payments/buyer-payment-negotiator.d.ts.map +1 -1
- package/dist/payments/buyer-payment-negotiator.js +80 -13
- package/dist/payments/buyer-payment-negotiator.js.map +1 -1
- package/dist/payments/evm/channels-client.d.ts +34 -1
- package/dist/payments/evm/channels-client.d.ts.map +1 -1
- package/dist/payments/evm/channels-client.js +100 -7
- package/dist/payments/evm/channels-client.js.map +1 -1
- package/dist/payments/readiness.d.ts +1 -1
- package/dist/payments/readiness.d.ts.map +1 -1
- package/dist/payments/readiness.js +10 -6
- package/dist/payments/readiness.js.map +1 -1
- package/dist/payments/seller-payment-manager.d.ts +6 -1
- package/dist/payments/seller-payment-manager.d.ts.map +1 -1
- package/dist/payments/seller-payment-manager.js +27 -8
- package/dist/payments/seller-payment-manager.js.map +1 -1
- package/dist/seller-request-handler.d.ts.map +1 -1
- package/dist/seller-request-handler.js +34 -23
- package/dist/seller-request-handler.js.map +1 -1
- package/dist/types/peer.d.ts +34 -2
- package/dist/types/peer.d.ts.map +1 -1
- package/dist/types/peer.js.map +1 -1
- 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 =
|
|
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"}
|
|
@@ -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). */
|
package/dist/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAI3C,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEjE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAA6B,MAAM,iBAAiB,CAAC;AAE3E,OAAO,KAAK,EACV,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,iBAAiB,CAAC;AAIzB,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;
|
|
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
|
-
|
|
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 =
|
|
287
|
-
|
|
288
|
-
|
|
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
|
-
//
|
|
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
|
};
|