@antseed/node 0.2.94 → 0.2.95

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 (91) hide show
  1. package/dist/buyer-request-handler.d.ts +4 -1
  2. package/dist/buyer-request-handler.d.ts.map +1 -1
  3. package/dist/buyer-request-handler.js +83 -4
  4. package/dist/buyer-request-handler.js.map +1 -1
  5. package/dist/discovery/http-metadata-resolver.d.ts +7 -0
  6. package/dist/discovery/http-metadata-resolver.d.ts.map +1 -1
  7. package/dist/discovery/http-metadata-resolver.js +16 -3
  8. package/dist/discovery/http-metadata-resolver.js.map +1 -1
  9. package/dist/index.d.ts +7 -2
  10. package/dist/index.d.ts.map +1 -1
  11. package/dist/index.js +4 -1
  12. package/dist/index.js.map +1 -1
  13. package/dist/node.d.ts +16 -2
  14. package/dist/node.d.ts.map +1 -1
  15. package/dist/node.js +115 -20
  16. package/dist/node.js.map +1 -1
  17. package/dist/p2p/payment-codec.d.ts +9 -1
  18. package/dist/p2p/payment-codec.d.ts.map +1 -1
  19. package/dist/p2p/payment-codec.js +67 -0
  20. package/dist/p2p/payment-codec.js.map +1 -1
  21. package/dist/p2p/payment-mux.d.ts +13 -1
  22. package/dist/p2p/payment-mux.d.ts.map +1 -1
  23. package/dist/p2p/payment-mux.js +44 -0
  24. package/dist/p2p/payment-mux.js.map +1 -1
  25. package/dist/payments/buyer-free-usage-manager.d.ts +39 -0
  26. package/dist/payments/buyer-free-usage-manager.d.ts.map +1 -0
  27. package/dist/payments/buyer-free-usage-manager.js +280 -0
  28. package/dist/payments/buyer-free-usage-manager.js.map +1 -0
  29. package/dist/payments/buyer-payment-manager.d.ts +2 -4
  30. package/dist/payments/buyer-payment-manager.d.ts.map +1 -1
  31. package/dist/payments/buyer-payment-manager.js +34 -110
  32. package/dist/payments/buyer-payment-manager.js.map +1 -1
  33. package/dist/payments/buyer-payment-negotiator.d.ts +6 -2
  34. package/dist/payments/buyer-payment-negotiator.d.ts.map +1 -1
  35. package/dist/payments/buyer-payment-negotiator.js +41 -13
  36. package/dist/payments/buyer-payment-negotiator.js.map +1 -1
  37. package/dist/payments/chain-config.d.ts +3 -2
  38. package/dist/payments/chain-config.d.ts.map +1 -1
  39. package/dist/payments/chain-config.js +4 -4
  40. package/dist/payments/chain-config.js.map +1 -1
  41. package/dist/payments/channel-session-state.d.ts +2 -1
  42. package/dist/payments/channel-session-state.d.ts.map +1 -1
  43. package/dist/payments/channel-session-state.js +4 -3
  44. package/dist/payments/channel-session-state.js.map +1 -1
  45. package/dist/payments/channel-store.d.ts +31 -15
  46. package/dist/payments/channel-store.d.ts.map +1 -1
  47. package/dist/payments/channel-store.js +74 -35
  48. package/dist/payments/channel-store.js.map +1 -1
  49. package/dist/payments/channel-usage-accounting.d.ts +18 -0
  50. package/dist/payments/channel-usage-accounting.d.ts.map +1 -0
  51. package/dist/payments/channel-usage-accounting.js +66 -0
  52. package/dist/payments/channel-usage-accounting.js.map +1 -0
  53. package/dist/payments/evm/free-usage-client.d.ts +34 -0
  54. package/dist/payments/evm/free-usage-client.d.ts.map +1 -0
  55. package/dist/payments/evm/free-usage-client.js +61 -0
  56. package/dist/payments/evm/free-usage-client.js.map +1 -0
  57. package/dist/payments/evm/signatures.d.ts +70 -0
  58. package/dist/payments/evm/signatures.d.ts.map +1 -1
  59. package/dist/payments/evm/signatures.js +89 -0
  60. package/dist/payments/evm/signatures.js.map +1 -1
  61. package/dist/payments/index.d.ts +10 -6
  62. package/dist/payments/index.d.ts.map +1 -1
  63. package/dist/payments/index.js +7 -4
  64. package/dist/payments/index.js.map +1 -1
  65. package/dist/payments/seller-free-usage-manager.d.ts +44 -0
  66. package/dist/payments/seller-free-usage-manager.d.ts.map +1 -0
  67. package/dist/payments/seller-free-usage-manager.js +350 -0
  68. package/dist/payments/seller-free-usage-manager.js.map +1 -0
  69. package/dist/payments/seller-payment-manager.d.ts.map +1 -1
  70. package/dist/payments/seller-payment-manager.js +21 -20
  71. package/dist/payments/seller-payment-manager.js.map +1 -1
  72. package/dist/payments/types.d.ts +2 -0
  73. package/dist/payments/types.d.ts.map +1 -1
  74. package/dist/seller-request-handler.d.ts +2 -0
  75. package/dist/seller-request-handler.d.ts.map +1 -1
  76. package/dist/seller-request-handler.js +8 -0
  77. package/dist/seller-request-handler.js.map +1 -1
  78. package/dist/storage/migrations/channels/004_add_channel_kind.d.ts +3 -0
  79. package/dist/storage/migrations/channels/004_add_channel_kind.d.ts.map +1 -0
  80. package/dist/storage/migrations/channels/004_add_channel_kind.js +16 -0
  81. package/dist/storage/migrations/channels/004_add_channel_kind.js.map +1 -0
  82. package/dist/storage/migrations/channels/index.d.ts.map +1 -1
  83. package/dist/storage/migrations/channels/index.js +2 -1
  84. package/dist/storage/migrations/channels/index.js.map +1 -1
  85. package/dist/types/protocol.d.ts +47 -0
  86. package/dist/types/protocol.d.ts.map +1 -1
  87. package/dist/types/protocol.js +4 -0
  88. package/dist/types/protocol.js.map +1 -1
  89. package/dist/verification/samples.js +1 -1
  90. package/dist/verification/samples.js.map +1 -1
  91. package/package.json +1 -1
@@ -22,6 +22,20 @@ export const SET_OPERATOR_TYPES = {
22
22
  { name: 'nonce', type: 'uint256' },
23
23
  ],
24
24
  };
25
+ export const FREE_USAGE_OPEN_TYPES = {
26
+ FreeUsageOpen: [
27
+ { name: 'channelId', type: 'bytes32' },
28
+ { name: 'deadline', type: 'uint256' },
29
+ ],
30
+ };
31
+ export const FREE_USAGE_AUTH_TYPES = {
32
+ FreeUsageAuth: [
33
+ { name: 'channelId', type: 'bytes32' },
34
+ { name: 'sequence', type: 'uint256' },
35
+ { name: 'metadataHash', type: 'bytes32' },
36
+ { name: 'deadline', type: 'uint256' },
37
+ ],
38
+ };
25
39
  export const METADATA_VERSION = 2n;
26
40
  const SERVICE_METADATA_ABI_TYPE = 'tuple(bytes32 serviceId,uint256 cumulativeAmount,uint256 cumulativeInputTokens,uint256 cumulativeCachedInputTokens,uint256 cumulativeOutputTokens,uint256 cumulativeRequestCount)[]';
27
41
  export function encodeMetadata(metadata) {
@@ -38,6 +52,35 @@ export function encodeMetadata(metadata) {
38
52
  export function getServiceMetadataId(service) {
39
53
  return id(service.trim());
40
54
  }
55
+ export function withServiceMetadata(metadata, service, delta) {
56
+ if (!service || service.trim().length === 0)
57
+ return metadata;
58
+ const serviceId = getServiceMetadataId(service);
59
+ const byServiceId = new Map();
60
+ for (const entry of metadata.services ?? []) {
61
+ byServiceId.set(entry.serviceId, { ...entry });
62
+ }
63
+ const existing = byServiceId.get(serviceId) ?? {
64
+ serviceId,
65
+ cumulativeAmount: 0n,
66
+ cumulativeInputTokens: 0n,
67
+ cumulativeCachedInputTokens: 0n,
68
+ cumulativeOutputTokens: 0n,
69
+ cumulativeRequestCount: 0n,
70
+ };
71
+ byServiceId.set(serviceId, {
72
+ serviceId,
73
+ cumulativeAmount: existing.cumulativeAmount + delta.amount,
74
+ cumulativeInputTokens: existing.cumulativeInputTokens + delta.inputTokens,
75
+ cumulativeCachedInputTokens: existing.cumulativeCachedInputTokens + delta.cachedInputTokens,
76
+ cumulativeOutputTokens: existing.cumulativeOutputTokens + delta.outputTokens,
77
+ cumulativeRequestCount: existing.cumulativeRequestCount + delta.requests,
78
+ });
79
+ return {
80
+ ...metadata,
81
+ services: [...byServiceId.values()].sort((a, b) => a.serviceId < b.serviceId ? -1 : a.serviceId > b.serviceId ? 1 : 0),
82
+ };
83
+ }
41
84
  export function computeMetadataHash(metadata) {
42
85
  return keccak256(encodeMetadata(metadata));
43
86
  }
@@ -48,6 +91,28 @@ export const ZERO_METADATA = {
48
91
  services: [],
49
92
  };
50
93
  export const ZERO_METADATA_HASH = computeMetadataHash(ZERO_METADATA);
94
+ export const FREE_USAGE_METADATA_VERSION = 1n;
95
+ export function encodeFreeUsageMetadata(metadata) {
96
+ const coder = AbiCoder.defaultAbiCoder();
97
+ const services = [...(metadata.services ?? [])].sort((a, b) => a.serviceId < b.serviceId ? -1 : a.serviceId > b.serviceId ? 1 : 0);
98
+ return coder.encode(['uint256', 'uint256', 'uint256', 'uint256', SERVICE_METADATA_ABI_TYPE], [
99
+ FREE_USAGE_METADATA_VERSION,
100
+ metadata.cumulativeInputTokens,
101
+ metadata.cumulativeOutputTokens,
102
+ metadata.cumulativeRequestCount,
103
+ services,
104
+ ]);
105
+ }
106
+ export function computeFreeUsageMetadataHash(metadata) {
107
+ return keccak256(encodeFreeUsageMetadata(metadata));
108
+ }
109
+ export const ZERO_FREE_USAGE_METADATA = {
110
+ cumulativeInputTokens: 0n,
111
+ cumulativeOutputTokens: 0n,
112
+ cumulativeRequestCount: 0n,
113
+ services: [],
114
+ };
115
+ export const ZERO_FREE_USAGE_METADATA_HASH = computeFreeUsageMetadataHash(ZERO_FREE_USAGE_METADATA);
51
116
  // =========================================================================
52
117
  // Channel ID computation (must match AntseedChannels.computeChannelId)
53
118
  // =========================================================================
@@ -59,6 +124,16 @@ export function computeChannelId(buyer, seller, salt) {
59
124
  const coder = AbiCoder.defaultAbiCoder();
60
125
  return keccak256(coder.encode(['address', 'address', 'bytes32'], [buyer, seller, salt]));
61
126
  }
127
+ export const FREE_USAGE_CHANNEL_DOMAIN = id('ANTSEED_FREE_USAGE_CHANNEL');
128
+ /**
129
+ * Compute the deterministic free usage channelId.
130
+ * Domain-separated from AntseedChannels.computeChannelId so a paid and free
131
+ * channel cannot share an ID even if buyer, seller, and salt are identical.
132
+ */
133
+ export function computeFreeUsageChannelId(buyer, seller, salt) {
134
+ const coder = AbiCoder.defaultAbiCoder();
135
+ return keccak256(coder.encode(['bytes32', 'address', 'address', 'bytes32'], [FREE_USAGE_CHANNEL_DOMAIN, buyer, seller, salt]));
136
+ }
62
137
  // =========================================================================
63
138
  // EIP-712 Domain helpers
64
139
  // =========================================================================
@@ -78,6 +153,14 @@ export function makeDepositsDomain(chainId, contractAddress) {
78
153
  verifyingContract: contractAddress,
79
154
  };
80
155
  }
156
+ export function makeFreeUsageDomain(chainId, contractAddress) {
157
+ return {
158
+ name: 'AntseedFreeUsage',
159
+ version: '1',
160
+ chainId,
161
+ verifyingContract: contractAddress,
162
+ };
163
+ }
81
164
  // =========================================================================
82
165
  // Signing functions — EIP-712 (on-chain)
83
166
  // =========================================================================
@@ -90,4 +173,10 @@ export async function signReserveAuth(signer, domain, msg) {
90
173
  export async function signSetOperator(signer, domain, msg) {
91
174
  return signer.signTypedData(domain, SET_OPERATOR_TYPES, msg);
92
175
  }
176
+ export async function signFreeUsageOpen(signer, domain, msg) {
177
+ return signer.signTypedData(domain, FREE_USAGE_OPEN_TYPES, msg);
178
+ }
179
+ export async function signFreeUsageAuth(signer, domain, msg) {
180
+ return signer.signTypedData(domain, FREE_USAGE_AUTH_TYPES, msg);
181
+ }
93
182
  //# sourceMappingURL=signatures.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"signatures.js","sourceRoot":"","sources":["../../../src/payments/evm/signatures.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE5F,4EAA4E;AAC5E,0EAA0E;AAC1E,4EAA4E;AAE5E,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,YAAY,EAAE;QACZ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;QACtC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE;QAC7C,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE;KAC1C;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,WAAW,EAAE;QACX,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;QACtC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;QACtC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;KACtC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,WAAW,EAAE;QACX,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;QACrC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;KACnC;CACF,CAAC;AAkEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAEnC,MAAM,yBAAyB,GAC7B,qLAAqL,CAAC;AAExL,MAAM,UAAU,cAAc,CAAC,QAA8B;IAC3D,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC5D,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACnE,CAAC;IACF,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,yBAAyB,CAAC,EACvE;QACE,gBAAgB;QAChB,QAAQ,CAAC,qBAAqB;QAC9B,QAAQ,CAAC,sBAAsB;QAC/B,QAAQ,CAAC,sBAAsB;QAC/B,QAAQ;KACT,CACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe;IAClD,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAA8B;IAChE,OAAO,SAAS,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAyB;IACjD,qBAAqB,EAAE,EAAE;IACzB,sBAAsB,EAAE,EAAE;IAC1B,sBAAsB,EAAE,EAAE;IAC1B,QAAQ,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAW,mBAAmB,CAAC,aAAa,CAAC,CAAC;AAE7E,4EAA4E;AAC5E,uEAAuE;AACvE,4EAA4E;AAE5E;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,KAAa,EACb,MAAc,EACd,IAAY;IAEZ,MAAM,KAAK,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;IACzC,OAAO,SAAS,CAAC,KAAK,CAAC,MAAM,CAC3B,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,EACjC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CACtB,CAAC,CAAC;AACL,CAAC;AAED,4EAA4E;AAC5E,yBAAyB;AACzB,4EAA4E;AAE5E,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,eAAuB;IACzE,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,GAAG;QACZ,OAAO;QACP,iBAAiB,EAAE,eAAe;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAe,EAAE,eAAuB;IACzE,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE,GAAG;QACZ,OAAO;QACP,iBAAiB,EAAE,eAAe;KACnC,CAAC;AACJ,CAAC;AAED,4EAA4E;AAC5E,yCAAyC;AACzC,4EAA4E;AAE5E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAsB,EACtB,MAAuB,EACvB,GAAwB;IAExB,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,mBAAmB,EAAE,GAAG,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAsB,EACtB,MAAuB,EACvB,GAAuB;IAEvB,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,MAAsB,EACtB,MAAuB,EACvB,GAAuB;IAEvB,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,kBAAkB,EAAE,GAAG,CAAC,CAAC;AAC/D,CAAC"}
1
+ {"version":3,"file":"signatures.js","sourceRoot":"","sources":["../../../src/payments/evm/signatures.ts"],"names":[],"mappings":"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"}
@@ -6,22 +6,26 @@ export { DepositsClient } from './evm/deposits-client.js';
6
6
  export type { DepositsClientConfig, BuyerBalanceInfo } from './evm/deposits-client.js';
7
7
  export { ChannelsClient } from './evm/channels-client.js';
8
8
  export type { ChannelsClientConfig, ChannelInfo, AgentStats, CloseRequestedEvent } from './evm/channels-client.js';
9
+ export { FreeUsageClient } from './evm/free-usage-client.js';
10
+ export type { FreeUsageClientConfig, FreeUsageChannelInfo, FreeUsageAgentStats } from './evm/free-usage-client.js';
9
11
  export { IdentityClient } from './evm/identity-client.js';
10
12
  export type { IdentityClientConfig } from './evm/identity-client.js';
11
13
  export { StakingClient } from './evm/staking-client.js';
12
14
  export type { StakingClientConfig } from './evm/staking-client.js';
13
- export { signSpendingAuth, signReserveAuth, signSetOperator, makeChannelsDomain, makeDepositsDomain, SPENDING_AUTH_TYPES, RESERVE_AUTH_TYPES, SET_OPERATOR_TYPES, computeMetadataHash, encodeMetadata, getServiceMetadataId, METADATA_VERSION, computeChannelId, ZERO_METADATA, ZERO_METADATA_HASH, } from './evm/signatures.js';
14
- export type { SpendingAuthMessage, ReserveAuthMessage, SetOperatorMessage, SpendingAuthMetadata, SpendingAuthServiceMetadata } from './evm/signatures.js';
15
+ export { signSpendingAuth, signReserveAuth, signFreeUsageOpen, signFreeUsageAuth, signSetOperator, makeChannelsDomain, makeDepositsDomain, makeFreeUsageDomain, SPENDING_AUTH_TYPES, RESERVE_AUTH_TYPES, FREE_USAGE_OPEN_TYPES, FREE_USAGE_AUTH_TYPES, SET_OPERATOR_TYPES, computeMetadataHash, encodeMetadata, computeFreeUsageMetadataHash, encodeFreeUsageMetadata, getServiceMetadataId, METADATA_VERSION, FREE_USAGE_METADATA_VERSION, computeChannelId, computeFreeUsageChannelId, FREE_USAGE_CHANNEL_DOMAIN, ZERO_METADATA, ZERO_METADATA_HASH, ZERO_FREE_USAGE_METADATA, ZERO_FREE_USAGE_METADATA_HASH, } from './evm/signatures.js';
16
+ export type { SpendingAuthMessage, ReserveAuthMessage, SetOperatorMessage, FreeUsageOpenMessage, FreeUsageAuthMessage, SpendingAuthMetadata, SpendingAuthServiceMetadata, FreeUsageMetadata, FreeUsageServiceMetadata, } from './evm/signatures.js';
15
17
  export { ANTSTokenClient } from './evm/ants-token-client.js';
16
18
  export type { ANTSTokenClientConfig } from './evm/ants-token-client.js';
17
19
  export { EmissionsClient } from './evm/emissions-client.js';
18
20
  export type { EmissionsClientConfig, EmissionsEpochParams } from './evm/emissions-client.js';
19
- export { SubPoolClient } from './evm/subpool-client.js';
20
- export type { SubPoolClientConfig } from './evm/subpool-client.js';
21
- export { ChannelStore, CHANNEL_STATUS } from './channel-store.js';
22
- export type { StoredChannel, StoredReceipt } from './channel-store.js';
21
+ export { ChannelStore, CHANNEL_KIND, CHANNEL_ROLE, CHANNEL_STATUS } from './channel-store.js';
22
+ export type { ChannelKind, ChannelRole, ChannelStatus, StoredChannel, StoredReceipt } from './channel-store.js';
23
23
  export { BuyerPaymentManager } from './buyer-payment-manager.js';
24
24
  export type { BuyerPaymentConfig, PerRequestAuthResult } from './buyer-payment-manager.js';
25
+ export { BuyerFreeUsageManager } from './buyer-free-usage-manager.js';
26
+ export type { BuyerFreeUsageConfig } from './buyer-free-usage-manager.js';
27
+ export { SellerFreeUsageManager } from './seller-free-usage-manager.js';
28
+ export type { SellerFreeUsageConfig } from './seller-free-usage-manager.js';
25
29
  export { BuyerPaymentNegotiator } from './buyer-payment-negotiator.js';
26
30
  export type { BuyerNegotiatorConfig, Handle402Result, NegotiationEmitter } from './buyer-payment-negotiator.js';
27
31
  export { SellerPaymentManager, DEFAULT_MIN_SETTLE_DELTA_STR } from './seller-payment-manager.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/payments/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,aAAa,EACb,OAAO,EACP,UAAU,EACV,eAAe,EACf,WAAW,EACX,aAAa,EACb,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAG3D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGzD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAGvF,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EAAE,oBAAoB,EAAE,WAAW,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAGnH,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,YAAY,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAGrE,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAG1J,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,YAAY,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGxE,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,YAAY,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAG7F,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,YAAY,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAGnE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAClE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAG3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,YAAY,EAAE,qBAAqB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAGhH,OAAO,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AACjG,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAGvE,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC/F,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAGnD,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/payments/index.ts"],"names":[],"mappings":"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"}
@@ -6,21 +6,24 @@ export { BaseEvmClient } from './evm/base-evm-client.js';
6
6
  export { DepositsClient } from './evm/deposits-client.js';
7
7
  // Channels client (reserve, settle, timeout)
8
8
  export { ChannelsClient } from './evm/channels-client.js';
9
+ // Free usage client (zero-price signed usage)
10
+ export { FreeUsageClient } from './evm/free-usage-client.js';
9
11
  // Identity client (ERC-8004 IdentityRegistry)
10
12
  export { IdentityClient } from './evm/identity-client.js';
11
13
  // Staking client (seller staking, token rate, slashing)
12
14
  export { StakingClient } from './evm/staking-client.js';
13
- export { signSpendingAuth, signReserveAuth, signSetOperator, makeChannelsDomain, makeDepositsDomain, SPENDING_AUTH_TYPES, RESERVE_AUTH_TYPES, SET_OPERATOR_TYPES, computeMetadataHash, encodeMetadata, getServiceMetadataId, METADATA_VERSION, computeChannelId, ZERO_METADATA, ZERO_METADATA_HASH, } from './evm/signatures.js';
15
+ export { signSpendingAuth, signReserveAuth, signFreeUsageOpen, signFreeUsageAuth, signSetOperator, makeChannelsDomain, makeDepositsDomain, makeFreeUsageDomain, SPENDING_AUTH_TYPES, RESERVE_AUTH_TYPES, FREE_USAGE_OPEN_TYPES, FREE_USAGE_AUTH_TYPES, SET_OPERATOR_TYPES, computeMetadataHash, encodeMetadata, computeFreeUsageMetadataHash, encodeFreeUsageMetadata, getServiceMetadataId, METADATA_VERSION, FREE_USAGE_METADATA_VERSION, computeChannelId, computeFreeUsageChannelId, FREE_USAGE_CHANNEL_DOMAIN, ZERO_METADATA, ZERO_METADATA_HASH, ZERO_FREE_USAGE_METADATA, ZERO_FREE_USAGE_METADATA_HASH, } from './evm/signatures.js';
14
16
  // ANTS token
15
17
  export { ANTSTokenClient } from './evm/ants-token-client.js';
16
18
  // Emissions
17
19
  export { EmissionsClient } from './evm/emissions-client.js';
18
- // Subscription Pool
19
- export { SubPoolClient } from './evm/subpool-client.js';
20
20
  // Channel persistence
21
- export { ChannelStore, CHANNEL_STATUS } from './channel-store.js';
21
+ export { ChannelStore, CHANNEL_KIND, CHANNEL_ROLE, CHANNEL_STATUS } from './channel-store.js';
22
22
  // Buyer payment manager
23
23
  export { BuyerPaymentManager } from './buyer-payment-manager.js';
24
+ // Free usage managers
25
+ export { BuyerFreeUsageManager } from './buyer-free-usage-manager.js';
26
+ export { SellerFreeUsageManager } from './seller-free-usage-manager.js';
24
27
  // Buyer payment negotiator (402 handling, SpendingAuth flow, cost tracking)
25
28
  export { BuyerPaymentNegotiator } from './buyer-payment-negotiator.js';
26
29
  // Seller payment manager
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/payments/index.ts"],"names":[],"mappings":"AAWA,+CAA+C;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,kBAAkB;AAClB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,oDAAoD;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,6CAA6C;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,8CAA8C;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,wDAAwD;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,kBAAkB,GACnB,MAAM,qBAAqB,CAAC;AAG7B,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG7D,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,oBAAoB;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,sBAAsB;AACtB,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGlE,wBAAwB;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,4EAA4E;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,yBAAyB;AACzB,OAAO,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAGjG,oBAAoB;AACpB,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAG/F,mBAAmB;AACnB,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/payments/index.ts"],"names":[],"mappings":"AAWA,+CAA+C;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAGtD,kBAAkB;AAClB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,oDAAoD;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,6CAA6C;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,8CAA8C;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG7D,8CAA8C;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAG1D,wDAAwD;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAGxD,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,qBAAqB,EACrB,kBAAkB,EAClB,mBAAmB,EACnB,cAAc,EACd,4BAA4B,EAC5B,uBAAuB,EACvB,oBAAoB,EACpB,gBAAgB,EAChB,2BAA2B,EAC3B,gBAAgB,EAChB,yBAAyB,EACzB,yBAAyB,EACzB,aAAa,EACb,kBAAkB,EAClB,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC;AAa7B,aAAa;AACb,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAG7D,YAAY;AACZ,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAG5D,sBAAsB;AACtB,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAG9F,wBAAwB;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,sBAAsB;AACtB,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAGxE,4EAA4E;AAC5E,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAGvE,yBAAyB;AACzB,OAAO,EAAE,oBAAoB,EAAE,4BAA4B,EAAE,MAAM,6BAA6B,CAAC;AAGjG,oBAAoB;AACpB,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAG/F,mBAAmB;AACnB,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { Identity } from '../p2p/identity.js';
2
+ import type { PaymentMux } from '../p2p/payment-mux.js';
3
+ import type { FreeUsageAuthPayload, FreeUsageOpenPayload } from '../types/protocol.js';
4
+ import { FreeUsageClient } from './evm/free-usage-client.js';
5
+ export interface SellerFreeUsageConfig {
6
+ rpcUrl: string;
7
+ fallbackRpcUrls?: string[];
8
+ freeUsageContractAddress: string;
9
+ chainId: number;
10
+ recordBatchSize?: number;
11
+ recordFlushIntervalMs?: number;
12
+ }
13
+ export declare class SellerFreeUsageManager {
14
+ private readonly _signer;
15
+ private readonly _client;
16
+ private readonly _domain;
17
+ private readonly _sellerEvmAddr;
18
+ private readonly _recordBatchSize;
19
+ private readonly _recordFlushIntervalMs;
20
+ private readonly _sessions;
21
+ private readonly _buyerLocks;
22
+ constructor(identity: Identity, config: SellerFreeUsageConfig);
23
+ get client(): FreeUsageClient;
24
+ handleOpen(buyerPeerId: string, payload: FreeUsageOpenPayload, paymentMux: PaymentMux): void;
25
+ handleAuth(buyerPeerId: string, payload: FreeUsageAuthPayload, paymentMux: PaymentMux): void;
26
+ onPeerDisconnect(buyerPeerId: string): void;
27
+ flushAllPendingRecords(): Promise<void>;
28
+ reportUsageRequest(buyerPeerId: string, paymentMux: PaymentMux, usage: {
29
+ requestId?: string;
30
+ inputTokens: number;
31
+ outputTokens: number;
32
+ service?: string;
33
+ }): void;
34
+ private _handleOpenInner;
35
+ private _openOnChain;
36
+ private _handleAuthInner;
37
+ private _scheduleRecordFlush;
38
+ private _clearFlushTimer;
39
+ private _flushPendingRecord;
40
+ private _doFlushPendingRecord;
41
+ private _tryGetExistingSession;
42
+ private _decodeFreeUsageMetadata;
43
+ }
44
+ //# sourceMappingURL=seller-free-usage-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seller-free-usage-manager.d.ts","sourceRoot":"","sources":["../../src/payments/seller-free-usage-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EACV,oBAAoB,EACpB,oBAAoB,EAErB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAS7D,MAAM,WAAW,qBAAqB;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,wBAAwB,EAAE,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAkDD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkB;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyC;IACjE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA6C;IACvE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoC;gBAEpD,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,qBAAqB;IAc7D,IAAI,MAAM,IAAI,eAAe,CAE5B;IAED,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI;IAU5F,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI;IAU5F,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;IAoBrC,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAS7C,kBAAkB,CAChB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,GACzF,IAAI;YA0CO,gBAAgB;YAyDhB,YAAY;YAiBZ,gBAAgB;IAmF9B,OAAO,CAAC,oBAAoB;IAmB5B,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,mBAAmB;YAkBb,qBAAqB;YA+DrB,sBAAsB;IAQpC,OAAO,CAAC,wBAAwB;CAcjC"}
@@ -0,0 +1,350 @@
1
+ import { AbiCoder, keccak256, verifyTypedData } from 'ethers';
2
+ import { peerIdToAddress } from '../types/peer.js';
3
+ import { debugLog, debugWarn } from '../utils/debug.js';
4
+ import { FreeUsageClient } from './evm/free-usage-client.js';
5
+ import { computeFreeUsageChannelId, FREE_USAGE_AUTH_TYPES, FREE_USAGE_METADATA_VERSION, FREE_USAGE_OPEN_TYPES, makeFreeUsageDomain, } from './evm/signatures.js';
6
+ const FREE_USAGE_METADATA_ABI = [
7
+ 'uint256',
8
+ 'uint256',
9
+ 'uint256',
10
+ 'uint256',
11
+ 'tuple(bytes32 serviceId,uint256 cumulativeAmount,uint256 cumulativeInputTokens,uint256 cumulativeCachedInputTokens,uint256 cumulativeOutputTokens,uint256 cumulativeRequestCount)[]',
12
+ ];
13
+ const DEFAULT_RECORD_BATCH_SIZE = 16;
14
+ const DEFAULT_RECORD_FLUSH_INTERVAL_MS = 10_000;
15
+ function normalizeTokenCount(value) {
16
+ if (!Number.isFinite(value) || value <= 0)
17
+ return 0n;
18
+ return BigInt(Math.trunc(value));
19
+ }
20
+ export class SellerFreeUsageManager {
21
+ _signer;
22
+ _client;
23
+ _domain;
24
+ _sellerEvmAddr;
25
+ _recordBatchSize;
26
+ _recordFlushIntervalMs;
27
+ _sessions = new Map();
28
+ _buyerLocks = new Map();
29
+ constructor(identity, config) {
30
+ this._signer = identity.wallet;
31
+ this._sellerEvmAddr = identity.wallet.address;
32
+ this._domain = makeFreeUsageDomain(config.chainId, config.freeUsageContractAddress);
33
+ this._recordBatchSize = Math.max(1, Math.trunc(config.recordBatchSize ?? DEFAULT_RECORD_BATCH_SIZE));
34
+ this._recordFlushIntervalMs = Math.max(1, Math.trunc(config.recordFlushIntervalMs ?? DEFAULT_RECORD_FLUSH_INTERVAL_MS));
35
+ this._client = new FreeUsageClient({
36
+ rpcUrl: config.rpcUrl,
37
+ ...(config.fallbackRpcUrls ? { fallbackRpcUrls: config.fallbackRpcUrls } : {}),
38
+ contractAddress: config.freeUsageContractAddress,
39
+ evmChainId: config.chainId,
40
+ });
41
+ }
42
+ get client() {
43
+ return this._client;
44
+ }
45
+ handleOpen(buyerPeerId, payload, paymentMux) {
46
+ const lock = (this._buyerLocks.get(buyerPeerId) ?? Promise.resolve()).then(async () => {
47
+ await this._handleOpenInner(buyerPeerId, payload, paymentMux);
48
+ });
49
+ this._buyerLocks.set(buyerPeerId, lock.catch(() => { }));
50
+ void lock.catch((err) => {
51
+ debugWarn(`[SellerFreeUsage] Open failed for ${buyerPeerId.slice(0, 12)}...: ${err instanceof Error ? err.message : err}`);
52
+ });
53
+ }
54
+ handleAuth(buyerPeerId, payload, paymentMux) {
55
+ const lock = (this._buyerLocks.get(buyerPeerId) ?? Promise.resolve()).then(async () => {
56
+ await this._handleAuthInner(buyerPeerId, payload, paymentMux);
57
+ });
58
+ this._buyerLocks.set(buyerPeerId, lock.catch(() => { }));
59
+ void lock.catch((err) => {
60
+ debugWarn(`[SellerFreeUsage] UsageAuth failed for ${buyerPeerId.slice(0, 12)}...: ${err instanceof Error ? err.message : err}`);
61
+ });
62
+ }
63
+ onPeerDisconnect(buyerPeerId) {
64
+ const session = this._sessions.get(buyerPeerId);
65
+ if (session) {
66
+ this._clearFlushTimer(session);
67
+ session.closeRequested = true;
68
+ if (session.pendingRecord || session.flushPromise) {
69
+ void this._flushPendingRecord(buyerPeerId, session).finally(() => {
70
+ if (this._sessions.get(buyerPeerId) === session) {
71
+ this._sessions.delete(buyerPeerId);
72
+ }
73
+ });
74
+ }
75
+ else {
76
+ this._sessions.delete(buyerPeerId);
77
+ }
78
+ }
79
+ else {
80
+ this._sessions.delete(buyerPeerId);
81
+ }
82
+ this._buyerLocks.delete(buyerPeerId);
83
+ }
84
+ async flushAllPendingRecords() {
85
+ await Promise.all([...this._sessions.entries()].map(([buyerPeerId, session]) => {
86
+ this._clearFlushTimer(session);
87
+ return this._flushPendingRecord(buyerPeerId, session);
88
+ }));
89
+ }
90
+ reportUsageRequest(buyerPeerId, paymentMux, usage) {
91
+ const session = this._sessions.get(buyerPeerId);
92
+ if (!session) {
93
+ debugWarn(`[SellerFreeUsage] Cannot request usage auth for ${buyerPeerId.slice(0, 12)}...: no free usage channel`);
94
+ return;
95
+ }
96
+ const nextSequence = (session.requestedSequence > session.acceptedSequence
97
+ ? session.requestedSequence
98
+ : session.acceptedSequence) + 1n;
99
+ const payload = {
100
+ channelId: session.channelId,
101
+ requiredSequence: nextSequence.toString(),
102
+ currentAcceptedSequence: session.acceptedSequence.toString(),
103
+ ...(usage.requestId ? { requestId: usage.requestId } : {}),
104
+ inputTokens: normalizeTokenCount(usage.inputTokens).toString(),
105
+ outputTokens: normalizeTokenCount(usage.outputTokens).toString(),
106
+ ...(usage.service ? { service: usage.service } : {}),
107
+ };
108
+ try {
109
+ paymentMux.sendNeedFreeUsageAuth(payload);
110
+ const inputTokens = normalizeTokenCount(usage.inputTokens);
111
+ const outputTokens = normalizeTokenCount(usage.outputTokens);
112
+ session.requestedSequence = nextSequence;
113
+ session.requestedInputTokens += inputTokens;
114
+ session.requestedOutputTokens += outputTokens;
115
+ session.requestedRequestCount += 1n;
116
+ session.expectedUsageBySequence.set(nextSequence.toString(), {
117
+ cumulativeInputTokens: session.requestedInputTokens,
118
+ cumulativeOutputTokens: session.requestedOutputTokens,
119
+ cumulativeRequestCount: session.requestedRequestCount,
120
+ });
121
+ debugLog(`[SellerFreeUsage] NeedFreeUsageAuth sent to ${buyerPeerId.slice(0, 12)}... ` +
122
+ `channel=${session.channelId.slice(0, 18)}... sequence=${nextSequence}`);
123
+ }
124
+ catch (err) {
125
+ debugWarn(`[SellerFreeUsage] NeedFreeUsageAuth send failed: ${err instanceof Error ? err.message : err}`);
126
+ }
127
+ }
128
+ async _handleOpenInner(buyerPeerId, payload, paymentMux) {
129
+ const buyerEvmAddr = peerIdToAddress(buyerPeerId);
130
+ const expectedChannelId = computeFreeUsageChannelId(buyerEvmAddr, this._sellerEvmAddr, payload.salt);
131
+ if (expectedChannelId.toLowerCase() !== payload.channelId.toLowerCase()) {
132
+ throw new Error(`channelId mismatch expected=${expectedChannelId} got=${payload.channelId}`);
133
+ }
134
+ if (payload.deadline <= Math.floor(Date.now() / 1000)) {
135
+ throw new Error('free usage open expired');
136
+ }
137
+ const recovered = verifyTypedData(this._domain, FREE_USAGE_OPEN_TYPES, { channelId: payload.channelId, deadline: BigInt(payload.deadline) }, payload.openSig);
138
+ if (recovered.toLowerCase() !== buyerEvmAddr.toLowerCase()) {
139
+ throw new Error(`invalid FreeUsageOpen signer recovered=${recovered} expected=${buyerEvmAddr}`);
140
+ }
141
+ const openPromise = this._openOnChain(buyerEvmAddr, payload);
142
+ const session = {
143
+ channelId: payload.channelId,
144
+ buyerEvmAddr,
145
+ salt: payload.salt,
146
+ deadline: payload.deadline,
147
+ acceptedSequence: 0n,
148
+ requestedSequence: 0n,
149
+ requestedInputTokens: 0n,
150
+ requestedOutputTokens: 0n,
151
+ requestedRequestCount: 0n,
152
+ expectedUsageBySequence: new Map(),
153
+ openPromise,
154
+ pendingRecord: null,
155
+ recordsSinceFlush: 0,
156
+ flushTimer: null,
157
+ flushPromise: null,
158
+ closeRequested: false,
159
+ };
160
+ this._sessions.set(buyerPeerId, session);
161
+ try {
162
+ await openPromise;
163
+ }
164
+ catch (err) {
165
+ if (this._sessions.get(buyerPeerId) === session) {
166
+ this._sessions.delete(buyerPeerId);
167
+ }
168
+ throw err;
169
+ }
170
+ paymentMux.sendFreeUsageAck({ channelId: payload.channelId, acceptedSequence: '0' });
171
+ debugLog(`[SellerFreeUsage] Open reported on-chain channel=${payload.channelId.slice(0, 18)}...`);
172
+ }
173
+ async _openOnChain(buyerEvmAddr, payload) {
174
+ try {
175
+ await this._client.open(this._signer, buyerEvmAddr, payload.salt, BigInt(payload.deadline), payload.openSig);
176
+ }
177
+ catch (err) {
178
+ const existing = await this._tryGetExistingSession(payload.channelId);
179
+ if (existing
180
+ && existing.status === 1
181
+ && existing.buyer.toLowerCase() === buyerEvmAddr.toLowerCase()
182
+ && existing.seller.toLowerCase() === this._sellerEvmAddr.toLowerCase()) {
183
+ return;
184
+ }
185
+ throw err;
186
+ }
187
+ }
188
+ async _handleAuthInner(buyerPeerId, payload, paymentMux) {
189
+ const session = this._sessions.get(buyerPeerId);
190
+ if (!session || session.channelId.toLowerCase() !== payload.channelId.toLowerCase()) {
191
+ throw new Error(`unknown free usage channel ${payload.channelId}`);
192
+ }
193
+ const sequence = BigInt(payload.sequence);
194
+ if (sequence <= session.acceptedSequence) {
195
+ paymentMux.sendFreeUsageAck({
196
+ channelId: payload.channelId,
197
+ acceptedSequence: session.acceptedSequence.toString(),
198
+ });
199
+ return;
200
+ }
201
+ const metadataHash = keccak256(payload.metadata);
202
+ if (metadataHash.toLowerCase() !== payload.metadataHash.toLowerCase()) {
203
+ throw new Error('metadataHash mismatch');
204
+ }
205
+ const sequenceKey = sequence.toString();
206
+ const expectedUsage = session.expectedUsageBySequence.get(sequenceKey);
207
+ if (!expectedUsage) {
208
+ throw new Error(`unexpected free usage sequence ${sequence}`);
209
+ }
210
+ // The seller enforces aggregate counters it measured; per-service tuples
211
+ // remain buyer-attributed audit metadata.
212
+ const signedUsage = this._decodeFreeUsageMetadata(payload.metadata);
213
+ const payloadInputTokens = BigInt(payload.cumulativeInputTokens);
214
+ const payloadOutputTokens = BigInt(payload.cumulativeOutputTokens);
215
+ if (payloadInputTokens !== signedUsage.cumulativeInputTokens
216
+ || payloadOutputTokens !== signedUsage.cumulativeOutputTokens
217
+ || signedUsage.cumulativeInputTokens !== expectedUsage.cumulativeInputTokens
218
+ || signedUsage.cumulativeOutputTokens !== expectedUsage.cumulativeOutputTokens
219
+ || signedUsage.cumulativeRequestCount !== expectedUsage.cumulativeRequestCount) {
220
+ throw new Error(`free usage totals mismatch sequence=${sequence} ` +
221
+ `expected(in=${expectedUsage.cumulativeInputTokens},out=${expectedUsage.cumulativeOutputTokens},requests=${expectedUsage.cumulativeRequestCount}) ` +
222
+ `got(in=${signedUsage.cumulativeInputTokens},out=${signedUsage.cumulativeOutputTokens},requests=${signedUsage.cumulativeRequestCount})`);
223
+ }
224
+ const recovered = verifyTypedData(this._domain, FREE_USAGE_AUTH_TYPES, {
225
+ channelId: payload.channelId,
226
+ sequence,
227
+ metadataHash: payload.metadataHash,
228
+ deadline: BigInt(payload.deadline),
229
+ }, payload.usageSig);
230
+ if (recovered.toLowerCase() !== session.buyerEvmAddr.toLowerCase()) {
231
+ throw new Error(`invalid FreeUsageAuth signer recovered=${recovered} expected=${session.buyerEvmAddr}`);
232
+ }
233
+ session.pendingRecord = {
234
+ sequence,
235
+ metadata: payload.metadata,
236
+ deadline: BigInt(payload.deadline),
237
+ usageSig: payload.usageSig,
238
+ };
239
+ session.recordsSinceFlush += 1;
240
+ session.acceptedSequence = sequence;
241
+ for (const key of session.expectedUsageBySequence.keys()) {
242
+ if (BigInt(key) <= sequence)
243
+ session.expectedUsageBySequence.delete(key);
244
+ }
245
+ paymentMux.sendFreeUsageAck({
246
+ channelId: payload.channelId,
247
+ acceptedSequence: sequence.toString(),
248
+ });
249
+ this._scheduleRecordFlush(buyerPeerId, session);
250
+ debugLog(`[SellerFreeUsage] Usage auth accepted channel=${payload.channelId.slice(0, 18)}... ` +
251
+ `sequence=${sequence}`);
252
+ }
253
+ _scheduleRecordFlush(buyerPeerId, session, opts = {}) {
254
+ if (!session.pendingRecord || session.flushPromise)
255
+ return;
256
+ if (!opts.retry && session.recordsSinceFlush >= this._recordBatchSize) {
257
+ this._clearFlushTimer(session);
258
+ void this._flushPendingRecord(buyerPeerId, session);
259
+ return;
260
+ }
261
+ if (session.flushTimer)
262
+ return;
263
+ session.flushTimer = setTimeout(() => {
264
+ session.flushTimer = null;
265
+ void this._flushPendingRecord(buyerPeerId, session);
266
+ }, this._recordFlushIntervalMs);
267
+ session.flushTimer.unref?.();
268
+ }
269
+ _clearFlushTimer(session) {
270
+ if (!session.flushTimer)
271
+ return;
272
+ clearTimeout(session.flushTimer);
273
+ session.flushTimer = null;
274
+ }
275
+ _flushPendingRecord(buyerPeerId, session) {
276
+ if (!session.pendingRecord)
277
+ return Promise.resolve();
278
+ if (session.flushPromise)
279
+ return session.flushPromise;
280
+ let promise;
281
+ promise = (async () => {
282
+ const flushed = await this._doFlushPendingRecord(buyerPeerId, session);
283
+ if (session.flushPromise === promise) {
284
+ session.flushPromise = null;
285
+ }
286
+ if (session.pendingRecord && !session.closeRequested) {
287
+ this._scheduleRecordFlush(buyerPeerId, session, flushed ? {} : { retry: true });
288
+ }
289
+ })();
290
+ session.flushPromise = promise;
291
+ return promise;
292
+ }
293
+ async _doFlushPendingRecord(buyerPeerId, session) {
294
+ const record = session.pendingRecord;
295
+ if (!record)
296
+ return true;
297
+ this._clearFlushTimer(session);
298
+ try {
299
+ await session.openPromise;
300
+ const closeRequested = session.closeRequested;
301
+ if (closeRequested) {
302
+ await this._client.close(this._signer, session.channelId, record.sequence, record.metadata, record.deadline, record.usageSig);
303
+ }
304
+ else {
305
+ await this._client.record(this._signer, session.channelId, record.sequence, record.metadata, record.deadline, record.usageSig);
306
+ }
307
+ if (!closeRequested && session.closeRequested) {
308
+ await this._client.close(this._signer, session.channelId, record.sequence, record.metadata, record.deadline, record.usageSig);
309
+ }
310
+ const pending = session.pendingRecord;
311
+ if (!pending || pending.sequence <= record.sequence) {
312
+ session.pendingRecord = null;
313
+ session.recordsSinceFlush = 0;
314
+ }
315
+ else {
316
+ const delta = pending.sequence - record.sequence;
317
+ session.recordsSinceFlush = Number(delta > BigInt(Number.MAX_SAFE_INTEGER) ? BigInt(Number.MAX_SAFE_INTEGER) : delta);
318
+ }
319
+ debugLog(`[SellerFreeUsage] Usage ${session.closeRequested ? 'closed' : 'reported'} on-chain channel=${session.channelId.slice(0, 18)}... ` +
320
+ `sequence=${record.sequence}`);
321
+ return true;
322
+ }
323
+ catch (err) {
324
+ debugWarn(`[SellerFreeUsage] Deferred record failed for ${buyerPeerId.slice(0, 12)}... ` +
325
+ `channel=${session.channelId.slice(0, 18)}... sequence=${record.sequence}: ` +
326
+ `${err instanceof Error ? err.message : err}`);
327
+ return false;
328
+ }
329
+ }
330
+ async _tryGetExistingSession(channelId) {
331
+ try {
332
+ return await this._client.getSession(channelId);
333
+ }
334
+ catch {
335
+ return null;
336
+ }
337
+ }
338
+ _decodeFreeUsageMetadata(metadata) {
339
+ const [version, inputTokens, outputTokens, requestCount] = AbiCoder.defaultAbiCoder().decode(FREE_USAGE_METADATA_ABI, metadata);
340
+ if (BigInt(version) !== FREE_USAGE_METADATA_VERSION) {
341
+ throw new Error(`unsupported free usage metadata version ${version}`);
342
+ }
343
+ return {
344
+ cumulativeInputTokens: BigInt(inputTokens),
345
+ cumulativeOutputTokens: BigInt(outputTokens),
346
+ cumulativeRequestCount: BigInt(requestCount),
347
+ };
348
+ }
349
+ }
350
+ //# sourceMappingURL=seller-free-usage-manager.js.map