@agentxv2/sdk 0.3.0

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 (90) hide show
  1. package/README.md +195 -0
  2. package/dist/a2a/a2a.d.ts +37 -0
  3. package/dist/a2a/a2a.d.ts.map +1 -0
  4. package/dist/a2a/a2a.js +252 -0
  5. package/dist/a2a/a2a.js.map +1 -0
  6. package/dist/a2a/index.d.ts +4 -0
  7. package/dist/a2a/index.d.ts.map +1 -0
  8. package/dist/a2a/index.js +4 -0
  9. package/dist/a2a/index.js.map +1 -0
  10. package/dist/agent/agent-runner.d.ts +124 -0
  11. package/dist/agent/agent-runner.d.ts.map +1 -0
  12. package/dist/agent/agent-runner.js +249 -0
  13. package/dist/agent/agent-runner.js.map +1 -0
  14. package/dist/agent/index.d.ts +3 -0
  15. package/dist/agent/index.d.ts.map +1 -0
  16. package/dist/agent/index.js +3 -0
  17. package/dist/agent/index.js.map +1 -0
  18. package/dist/config/config.d.ts +31 -0
  19. package/dist/config/config.d.ts.map +1 -0
  20. package/dist/config/config.js +95 -0
  21. package/dist/config/config.js.map +1 -0
  22. package/dist/config/index.d.ts +4 -0
  23. package/dist/config/index.d.ts.map +1 -0
  24. package/dist/config/index.js +4 -0
  25. package/dist/config/index.js.map +1 -0
  26. package/dist/core/crypto.d.ts +62 -0
  27. package/dist/core/crypto.d.ts.map +1 -0
  28. package/dist/core/crypto.js +291 -0
  29. package/dist/core/crypto.js.map +1 -0
  30. package/dist/core/index.d.ts +3 -0
  31. package/dist/core/index.d.ts.map +1 -0
  32. package/dist/core/index.js +4 -0
  33. package/dist/core/index.js.map +1 -0
  34. package/dist/core/types.d.ts +296 -0
  35. package/dist/core/types.d.ts.map +1 -0
  36. package/dist/core/types.js +30 -0
  37. package/dist/core/types.js.map +1 -0
  38. package/dist/index.d.ts +10 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +32 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/mcp/connector.d.ts +43 -0
  43. package/dist/mcp/connector.d.ts.map +1 -0
  44. package/dist/mcp/connector.js +79 -0
  45. package/dist/mcp/connector.js.map +1 -0
  46. package/dist/mcp/index.d.ts +4 -0
  47. package/dist/mcp/index.d.ts.map +1 -0
  48. package/dist/mcp/index.js +4 -0
  49. package/dist/mcp/index.js.map +1 -0
  50. package/dist/react/index.d.ts +4 -0
  51. package/dist/react/index.d.ts.map +1 -0
  52. package/dist/react/index.js +3 -0
  53. package/dist/react/index.js.map +1 -0
  54. package/dist/react/useAgentRunner.d.ts +16 -0
  55. package/dist/react/useAgentRunner.d.ts.map +1 -0
  56. package/dist/react/useAgentRunner.js +204 -0
  57. package/dist/react/useAgentRunner.js.map +1 -0
  58. package/dist/registry/agent-registry.d.ts +52 -0
  59. package/dist/registry/agent-registry.d.ts.map +1 -0
  60. package/dist/registry/agent-registry.js +221 -0
  61. package/dist/registry/agent-registry.js.map +1 -0
  62. package/dist/registry/index.d.ts +7 -0
  63. package/dist/registry/index.d.ts.map +1 -0
  64. package/dist/registry/index.js +6 -0
  65. package/dist/registry/index.js.map +1 -0
  66. package/dist/registry/ipfs-fetcher.d.ts +39 -0
  67. package/dist/registry/ipfs-fetcher.d.ts.map +1 -0
  68. package/dist/registry/ipfs-fetcher.js +139 -0
  69. package/dist/registry/ipfs-fetcher.js.map +1 -0
  70. package/dist/reputation/index.d.ts +4 -0
  71. package/dist/reputation/index.d.ts.map +1 -0
  72. package/dist/reputation/index.js +4 -0
  73. package/dist/reputation/index.js.map +1 -0
  74. package/dist/reputation/reputation.d.ts +26 -0
  75. package/dist/reputation/reputation.d.ts.map +1 -0
  76. package/dist/reputation/reputation.js +113 -0
  77. package/dist/reputation/reputation.js.map +1 -0
  78. package/dist/subscription/agent-x402.d.ts +33 -0
  79. package/dist/subscription/agent-x402.d.ts.map +1 -0
  80. package/dist/subscription/agent-x402.js +144 -0
  81. package/dist/subscription/agent-x402.js.map +1 -0
  82. package/dist/subscription/index.d.ts +6 -0
  83. package/dist/subscription/index.d.ts.map +1 -0
  84. package/dist/subscription/index.js +5 -0
  85. package/dist/subscription/index.js.map +1 -0
  86. package/dist/subscription/subscription.d.ts +67 -0
  87. package/dist/subscription/subscription.d.ts.map +1 -0
  88. package/dist/subscription/subscription.js +346 -0
  89. package/dist/subscription/subscription.js.map +1 -0
  90. package/package.json +69 -0
@@ -0,0 +1,33 @@
1
+ import type { PublicClient, WalletClient, Address } from 'viem';
2
+ export interface AgentX402Config {
3
+ subscriptionManagerAddress: Address;
4
+ publicClient: PublicClient;
5
+ walletClient: WalletClient;
6
+ }
7
+ export declare class AgentX402 {
8
+ private config;
9
+ constructor(config: AgentX402Config);
10
+ /**
11
+ * Require active subscription — or throw with auto-pay info.
12
+ *
13
+ * Usage:
14
+ * await x402.requireSubscription(agentId, address, { planIds: [1,2,3] })
15
+ *
16
+ * On success, returns silently.
17
+ * On failure, throws AgentXError with paymentInfo populated
18
+ * so the caller can auto-pay via wallet/X402.
19
+ */
20
+ requireSubscription(agentId: number, address: Address, opts?: {
21
+ planIds?: number[];
22
+ }): Promise<void>;
23
+ /**
24
+ * Subscribe to a plan + wait for receipt.
25
+ * Returns subscriptionId from the Subscribed event.
26
+ *
27
+ * NOTE: For ERC20 plans, the caller must approve token spending
28
+ * BEFORE calling this method. Use X402 SDK or wagmi's useWriteContract
29
+ * for the approve step.
30
+ */
31
+ subscribeAndWait(planId: number, price: bigint, payToken: Address): Promise<number>;
32
+ }
33
+ //# sourceMappingURL=agent-x402.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-x402.d.ts","sourceRoot":"","sources":["../../src/subscription/agent-x402.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,MAAM,CAAA;AA4C/D,MAAM,WAAW,eAAe;IAC9B,0BAA0B,EAAE,OAAO,CAAA;IACnC,YAAY,EAAE,YAAY,CAAA;IAC1B,YAAY,EAAE,YAAY,CAAA;CAC3B;AAID,qBAAa,SAAS;IACR,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;IAE3C;;;;;;;;;OASG;IACG,mBAAmB,CACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAC5B,OAAO,CAAC,IAAI,CAAC;IAsDhB;;;;;;;OAOG;IACG,gBAAgB,CACpB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,OAAO,GAChB,OAAO,CAAC,MAAM,CAAC;CAwBnB"}
@@ -0,0 +1,144 @@
1
+ // ---------------------------------------------------------------------------
2
+ // agentx-protocol — AgentX402: Auto-Subscription Gate
3
+ // ---------------------------------------------------------------------------
4
+ // Standardized error handling for wallet/X402 integration.
5
+ //
6
+ // AgentX does NOT implement X402 or wallet logic.
7
+ // Instead, it provides a clean subscription guard with structured
8
+ // error metadata so external payment layers can react.
9
+ //
10
+ // Flow:
11
+ // App/Agent → AgentRunner.useAgent(id)
12
+ // → NOT_SUBSCRIBED error + { agentId }
13
+ // → X402 + AgentX402.requireSubscription() checks plans
14
+ // → Wallet/X402 layer: user/Agent approves + subscribes
15
+ // → App/Agent retries AgentRunner.useAgent(id)
16
+ // → ✅ success
17
+ // ---------------------------------------------------------------------------
18
+ import { AgentXError, AgentXErrorCode } from '../core/types';
19
+ // ── ABI Fragments (v3 compatible) ──────────────────────────────────────────
20
+ const getPlanAbi = {
21
+ inputs: [{ name: 'planId', type: 'uint256' }],
22
+ name: 'getPlan',
23
+ outputs: [
24
+ { name: 'planId', type: 'uint256' },
25
+ { name: 'agentId', type: 'uint256' },
26
+ { name: 'creator', type: 'address' },
27
+ { name: 'price', type: 'uint256' },
28
+ { name: 'period', type: 'string' },
29
+ { name: 'active', type: 'bool' },
30
+ { name: 'payToken', type: 'address' },
31
+ { name: 'trialDays', type: 'uint256' },
32
+ ],
33
+ stateMutability: 'view',
34
+ type: 'function',
35
+ };
36
+ const subscribeAbi = {
37
+ inputs: [{ name: 'planId', type: 'uint256' }],
38
+ name: 'subscribe',
39
+ outputs: [{ name: 'subscriptionId', type: 'uint256' }],
40
+ stateMutability: 'payable',
41
+ type: 'function',
42
+ };
43
+ const hasActiveSubAbi = {
44
+ inputs: [
45
+ { name: 'subscriber', type: 'address' },
46
+ { name: 'agentId', type: 'uint256' },
47
+ ],
48
+ name: 'hasActiveSubscription',
49
+ outputs: [{ name: '', type: 'bool' }],
50
+ stateMutability: 'view',
51
+ type: 'function',
52
+ };
53
+ // ── AgentX402 ──────────────────────────────────────────────────────────────
54
+ export class AgentX402 {
55
+ config;
56
+ constructor(config) {
57
+ this.config = config;
58
+ }
59
+ /**
60
+ * Require active subscription — or throw with auto-pay info.
61
+ *
62
+ * Usage:
63
+ * await x402.requireSubscription(agentId, address, { planIds: [1,2,3] })
64
+ *
65
+ * On success, returns silently.
66
+ * On failure, throws AgentXError with paymentInfo populated
67
+ * so the caller can auto-pay via wallet/X402.
68
+ */
69
+ async requireSubscription(agentId, address, opts) {
70
+ const { publicClient, subscriptionManagerAddress } = this.config;
71
+ const isActive = (await publicClient.readContract({
72
+ address: subscriptionManagerAddress,
73
+ abi: [hasActiveSubAbi],
74
+ functionName: 'hasActiveSubscription',
75
+ args: [address, BigInt(agentId)],
76
+ }));
77
+ if (isActive)
78
+ return; // ✅ already subscribed
79
+ // ── Build payment info for X402 layer ──
80
+ const plans = [];
81
+ if (opts?.planIds && opts.planIds.length > 0) {
82
+ for (const planId of opts.planIds) {
83
+ try {
84
+ const plan = (await publicClient.readContract({
85
+ address: subscriptionManagerAddress,
86
+ abi: [getPlanAbi],
87
+ functionName: 'getPlan',
88
+ args: [BigInt(planId)],
89
+ }));
90
+ const planAgentId = Number(plan[1]);
91
+ const planActive = plan[5];
92
+ if (planActive && planAgentId === agentId) {
93
+ plans.push({
94
+ planId: Number(plan[0]),
95
+ price: plan[3],
96
+ period: plan[4],
97
+ payToken: plan[6],
98
+ trialDays: Number(plan[7]),
99
+ });
100
+ }
101
+ }
102
+ catch {
103
+ // skip invalid plan IDs silently
104
+ }
105
+ }
106
+ }
107
+ const err = new AgentXError(AgentXErrorCode.NOT_SUBSCRIBED, `No active subscription for Agent #${agentId}. Use error.paymentInfo for auto-subscribe via X402/wallet.`);
108
+ err.paymentInfo = {
109
+ agentId,
110
+ plans: plans.length > 0 ? plans : undefined,
111
+ };
112
+ throw err;
113
+ }
114
+ /**
115
+ * Subscribe to a plan + wait for receipt.
116
+ * Returns subscriptionId from the Subscribed event.
117
+ *
118
+ * NOTE: For ERC20 plans, the caller must approve token spending
119
+ * BEFORE calling this method. Use X402 SDK or wagmi's useWriteContract
120
+ * for the approve step.
121
+ */
122
+ async subscribeAndWait(planId, price, payToken) {
123
+ const { publicClient, walletClient, subscriptionManagerAddress } = this.config;
124
+ const isETH = payToken === '0x0000000000000000000000000000000000000000';
125
+ const { request } = await publicClient.simulateContract({
126
+ address: subscriptionManagerAddress,
127
+ abi: [subscribeAbi],
128
+ functionName: 'subscribe',
129
+ args: [BigInt(planId)],
130
+ account: walletClient.account?.address,
131
+ value: isETH ? price : 0n,
132
+ });
133
+ const hash = await walletClient.writeContract(request);
134
+ const receipt = await publicClient.waitForTransactionReceipt({ hash });
135
+ // Parse subscriptionId from Subscribed event (topic[1])
136
+ // event Subscribed(uint256 indexed subscriptionId, ...)
137
+ const subIdHex = receipt.logs[0]?.topics?.[1];
138
+ if (!subIdHex || subIdHex === '0x') {
139
+ throw new Error('Failed to parse subscriptionId from Subscribed event');
140
+ }
141
+ return Number(BigInt(subIdHex));
142
+ }
143
+ }
144
+ //# sourceMappingURL=agent-x402.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-x402.js","sourceRoot":"","sources":["../../src/subscription/agent-x402.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { SubscriptionManager, guardSubscription } from './subscription';
2
+ export type { SubscriptionConfig, PlanDetail, SubscriptionDetail } from './subscription';
3
+ export { AgentX402 } from './agent-x402';
4
+ export type { AgentX402Config } from './agent-x402';
5
+ export declare const SUBSCRIPTION_VERSION = "0.2.0";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/subscription/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AACvE,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACxF,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AACnD,eAAO,MAAM,oBAAoB,UAAU,CAAA"}
@@ -0,0 +1,5 @@
1
+ // @agentx/sdk — Subscription module v2
2
+ export { SubscriptionManager, guardSubscription } from './subscription';
3
+ export { AgentX402 } from './agent-x402';
4
+ export const SUBSCRIPTION_VERSION = '0.2.0';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/subscription/index.ts"],"names":[],"mappings":"AAAA,uCAAuC;AACvC,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAEvE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC,MAAM,CAAC,MAAM,oBAAoB,GAAG,OAAO,CAAA"}
@@ -0,0 +1,67 @@
1
+ import type { PublicClient, WalletClient, Address, Hash } from 'viem';
2
+ import type { AgentSubscription } from '../core/types';
3
+ export interface SubscriptionConfig {
4
+ contractAddress: Address;
5
+ publicClient: PublicClient;
6
+ walletClient: WalletClient;
7
+ }
8
+ export interface PlanDetail {
9
+ planId: number;
10
+ agentId: number;
11
+ creator: Address;
12
+ price: bigint;
13
+ period: string;
14
+ active: boolean;
15
+ payToken: Address;
16
+ trialDays: number;
17
+ }
18
+ export interface SubscriptionDetail {
19
+ subscriptionId: number;
20
+ subscriber: Address;
21
+ agentId: number;
22
+ status: number;
23
+ startedAt: number;
24
+ expiresAt: number;
25
+ period: string;
26
+ payToken: Address;
27
+ amountPaid: bigint;
28
+ trialActive: boolean;
29
+ trialEndsAt: number;
30
+ fundsReleased: boolean;
31
+ }
32
+ export declare class SubscriptionManager {
33
+ private address;
34
+ private publicClient;
35
+ private walletClient;
36
+ constructor(config: SubscriptionConfig);
37
+ /** Get current platform fee in basis points (e.g. 250 = 2.5%). */
38
+ getPlatformFeeBps(): Promise<number>;
39
+ /** Check if a token is whitelisted for payments. */
40
+ isTokenWhitelisted(token: Address): Promise<boolean>;
41
+ /** Get full plan details with v2 fields. */
42
+ getPlan(planId: number): Promise<PlanDetail>;
43
+ /**
44
+ * Subscribe to a plan.
45
+ * For ETH plans: pass valueWei = plan.price.
46
+ * For ERC20 plans: auto-detects from plan.payToken, calls approve + subscribe.
47
+ * User must have approved this contract for plan.price tokens.
48
+ */
49
+ subscribe(planId: number, opts?: {
50
+ valueWei?: bigint;
51
+ approveTokenFirst?: boolean;
52
+ }): Promise<{
53
+ subscriptionId: number;
54
+ txHash: Hash;
55
+ }>;
56
+ /** Release escrowed funds to creator after trial window ends. */
57
+ releaseFunds(subscriptionId: number): Promise<Hash>;
58
+ /** Cancel subscription (trial refund if within window). */
59
+ cancel(subscriptionId: number): Promise<Hash>;
60
+ hasActiveSubscription(subscriber: Address, agentId: number): Promise<boolean>;
61
+ getSubscription(subscriber: Address, agentId: number): Promise<AgentSubscription | null>;
62
+ /** Get full subscription detail with v2 fields (trial, payToken, fundsReleased). */
63
+ getSubscriptionDetail(subscriptionId: number): Promise<SubscriptionDetail>;
64
+ getUserSubscriptions(user: Address): Promise<number[]>;
65
+ }
66
+ export declare function guardSubscription(manager: SubscriptionManager, user: Address, agentId: number): Promise<AgentSubscription>;
67
+ //# sourceMappingURL=subscription.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription.d.ts","sourceRoot":"","sources":["../../src/subscription/subscription.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AACrE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AAgJtD,MAAM,WAAW,kBAAkB;IACjC,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,YAAY,CAAA;IAC1B,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,QAAQ,EAAE,OAAO,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAA;IACtB,UAAU,EAAE,OAAO,CAAA;IACnB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,OAAO,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;CACvB;AAID,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,YAAY,CAAc;gBAEtB,MAAM,EAAE,kBAAkB;IAQtC,kEAAkE;IAC5D,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAS1C,oDAAoD;IAC9C,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAY1D,4CAA4C;IACtC,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAkBlD;;;;;OAKG;IACG,SAAS,CACb,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAE,GACxD,OAAO,CAAC;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,IAAI,CAAA;KAAE,CAAC;IAuDpD,iEAAiE;IAC3D,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAczD,2DAA2D;IACrD,MAAM,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB7C,qBAAqB,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAU7E,eAAe,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAqB9F,oFAAoF;IAC9E,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAoB1E,oBAAoB,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CAS7D;AAID,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,mBAAmB,EAC5B,IAAI,EAAE,OAAO,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC,CAW5B"}
@@ -0,0 +1,346 @@
1
+ // ---------------------------------------------------------------------------
2
+ // @agentx/sdk — Subscription Manager v2
3
+ // ---------------------------------------------------------------------------
4
+ // Wraps SubscriptionManager v2 contract (escrow, platform fee, multi-currency).
5
+ // Uses viem PublicClient / WalletClient (chain-agnostic).
6
+ // ---------------------------------------------------------------------------
7
+ // ── ABI Fragments (v2) ─────────────────────────────────────────────────────
8
+ const SUBSCRIPTION_ABI_V2 = {
9
+ // Admin
10
+ platformFeeBps: {
11
+ inputs: [], name: 'platformFeeBps',
12
+ outputs: [{ name: '', type: 'uint256' }],
13
+ stateMutability: 'view', type: 'function',
14
+ },
15
+ tokenWhitelist: {
16
+ inputs: [{ name: 'token', type: 'address' }],
17
+ name: 'tokenWhitelist',
18
+ outputs: [{ name: '', type: 'bool' }],
19
+ stateMutability: 'view', type: 'function',
20
+ },
21
+ // Plans
22
+ createPlan: {
23
+ inputs: [
24
+ { name: 'agentId', type: 'uint256' },
25
+ { name: 'price', type: 'uint256' },
26
+ { name: 'period', type: 'string' },
27
+ { name: 'payToken', type: 'address' },
28
+ { name: 'trialDays', type: 'uint256' },
29
+ ],
30
+ name: 'createPlan',
31
+ outputs: [{ name: 'planId', type: 'uint256' }],
32
+ stateMutability: 'nonpayable', type: 'function',
33
+ },
34
+ getPlan: {
35
+ inputs: [{ name: 'planId', type: 'uint256' }],
36
+ name: 'getPlan',
37
+ outputs: [
38
+ { name: 'planId', type: 'uint256' },
39
+ { name: 'agentId', type: 'uint256' },
40
+ { name: 'creator', type: 'address' },
41
+ { name: 'price', type: 'uint256' },
42
+ { name: 'period', type: 'string' },
43
+ { name: 'active', type: 'bool' },
44
+ { name: 'payToken', type: 'address' },
45
+ { name: 'trialDays', type: 'uint256' },
46
+ ],
47
+ stateMutability: 'view', type: 'function',
48
+ },
49
+ // Subscribe
50
+ subscribe: {
51
+ inputs: [{ name: 'planId', type: 'uint256' }],
52
+ name: 'subscribe',
53
+ outputs: [{ name: 'subscriptionId', type: 'uint256' }],
54
+ stateMutability: 'payable', type: 'function',
55
+ },
56
+ // Trial / Release
57
+ releaseFunds: {
58
+ inputs: [{ name: 'subscriptionId', type: 'uint256' }],
59
+ name: 'releaseFunds',
60
+ outputs: [],
61
+ stateMutability: 'nonpayable', type: 'function',
62
+ },
63
+ cancelSubscription: {
64
+ inputs: [{ name: 'subscriptionId', type: 'uint256' }],
65
+ name: 'cancelSubscription',
66
+ outputs: [],
67
+ stateMutability: 'nonpayable', type: 'function',
68
+ },
69
+ // Queries
70
+ getSubscription: {
71
+ inputs: [
72
+ { name: 'subscriber', type: 'address' },
73
+ { name: 'agentId', type: 'uint256' },
74
+ ],
75
+ name: 'getSubscription',
76
+ outputs: [
77
+ { name: 'subscriptionId', type: 'uint256' },
78
+ { name: 'subscriber', type: 'address' },
79
+ { name: 'agentId', type: 'uint256' },
80
+ { name: 'status', type: 'uint8' },
81
+ { name: 'startedAt', type: 'uint256' },
82
+ { name: 'expiresAt', type: 'uint256' },
83
+ { name: 'period', type: 'string' },
84
+ ],
85
+ stateMutability: 'view', type: 'function',
86
+ },
87
+ hasActiveSubscription: {
88
+ inputs: [
89
+ { name: 'subscriber', type: 'address' },
90
+ { name: 'agentId', type: 'uint256' },
91
+ ],
92
+ name: 'hasActiveSubscription',
93
+ outputs: [{ name: '', type: 'bool' }],
94
+ stateMutability: 'view', type: 'function',
95
+ },
96
+ getUserSubscriptions: {
97
+ inputs: [{ name: 'user', type: 'address' }],
98
+ name: 'getUserSubscriptions',
99
+ outputs: [{ name: '', type: 'uint256[]' }],
100
+ stateMutability: 'view', type: 'function',
101
+ },
102
+ getSubscriptionDetail: {
103
+ inputs: [{ name: 'subscriptionId', type: 'uint256' }],
104
+ name: 'getSubscriptionDetail',
105
+ outputs: [
106
+ { name: 'subscriptionId', type: 'uint256' },
107
+ { name: 'subscriber', type: 'address' },
108
+ { name: 'agentId', type: 'uint256' },
109
+ { name: 'status', type: 'uint8' },
110
+ { name: 'startedAt', type: 'uint256' },
111
+ { name: 'expiresAt', type: 'uint256' },
112
+ { name: 'period', type: 'string' },
113
+ { name: 'payToken', type: 'address' },
114
+ { name: 'amountPaid', type: 'uint256' },
115
+ { name: 'trialActive', type: 'bool' },
116
+ { name: 'trialEndsAt', type: 'uint256' },
117
+ { name: 'fundsReleased', type: 'bool' },
118
+ ],
119
+ stateMutability: 'view', type: 'function',
120
+ },
121
+ };
122
+ // ── ERC20 ABI (approve) ────────────────────────────────────────────────────
123
+ const ERC20_ABI = {
124
+ approve: {
125
+ inputs: [
126
+ { name: 'spender', type: 'address' },
127
+ { name: 'amount', type: 'uint256' },
128
+ ],
129
+ name: 'approve',
130
+ outputs: [{ name: '', type: 'bool' }],
131
+ stateMutability: 'nonpayable', type: 'function',
132
+ },
133
+ allowance: {
134
+ inputs: [
135
+ { name: 'owner', type: 'address' },
136
+ { name: 'spender', type: 'address' },
137
+ ],
138
+ name: 'allowance',
139
+ outputs: [{ name: '', type: 'uint256' }],
140
+ stateMutability: 'view', type: 'function',
141
+ },
142
+ };
143
+ // ── Subscription Manager ───────────────────────────────────────────────────
144
+ export class SubscriptionManager {
145
+ address;
146
+ publicClient;
147
+ walletClient;
148
+ constructor(config) {
149
+ this.address = config.contractAddress;
150
+ this.publicClient = config.publicClient;
151
+ this.walletClient = config.walletClient;
152
+ }
153
+ // ── Config Read ──────────────────────────────────────────────────────────
154
+ /** Get current platform fee in basis points (e.g. 250 = 2.5%). */
155
+ async getPlatformFeeBps() {
156
+ const result = await this.publicClient.readContract({
157
+ address: this.address,
158
+ abi: [SUBSCRIPTION_ABI_V2.platformFeeBps],
159
+ functionName: 'platformFeeBps',
160
+ });
161
+ return Number(result);
162
+ }
163
+ /** Check if a token is whitelisted for payments. */
164
+ async isTokenWhitelisted(token) {
165
+ const result = await this.publicClient.readContract({
166
+ address: this.address,
167
+ abi: [SUBSCRIPTION_ABI_V2.tokenWhitelist],
168
+ functionName: 'tokenWhitelist',
169
+ args: [token],
170
+ });
171
+ return result;
172
+ }
173
+ // ── Plans ────────────────────────────────────────────────────────────────
174
+ /** Get full plan details with v2 fields. */
175
+ async getPlan(planId) {
176
+ const result = await this.publicClient.readContract({
177
+ address: this.address,
178
+ abi: [SUBSCRIPTION_ABI_V2.getPlan],
179
+ functionName: 'getPlan',
180
+ args: [BigInt(planId)],
181
+ });
182
+ const [pid, aid, creator, price, period, active, payToken, trialDays] = result;
183
+ return {
184
+ planId: Number(pid), agentId: Number(aid),
185
+ creator: creator, price, period, active,
186
+ payToken: payToken, trialDays: Number(trialDays),
187
+ };
188
+ }
189
+ // ── Subscribe ────────────────────────────────────────────────────────────
190
+ /**
191
+ * Subscribe to a plan.
192
+ * For ETH plans: pass valueWei = plan.price.
193
+ * For ERC20 plans: auto-detects from plan.payToken, calls approve + subscribe.
194
+ * User must have approved this contract for plan.price tokens.
195
+ */
196
+ async subscribe(planId, opts) {
197
+ const [account] = await this.walletClient.getAddresses();
198
+ if (!account)
199
+ throw new Error('Wallet not connected');
200
+ const plan = await this.getPlan(planId);
201
+ if (!plan.active)
202
+ throw new Error('Plan not active');
203
+ if (plan.payToken === '0x0000000000000000000000000000000000000000') {
204
+ // ── ETH ──
205
+ const value = opts?.valueWei ?? plan.price;
206
+ const { request } = await this.publicClient.simulateContract({
207
+ account,
208
+ address: this.address,
209
+ abi: [SUBSCRIPTION_ABI_V2.subscribe],
210
+ functionName: 'subscribe',
211
+ args: [BigInt(planId)],
212
+ value,
213
+ });
214
+ const hash = await this.walletClient.writeContract(request);
215
+ return { subscriptionId: 0, txHash: hash };
216
+ }
217
+ else {
218
+ // ── ERC20 ──
219
+ // Optionally approve first
220
+ if (opts?.approveTokenFirst !== false) {
221
+ const allowance = await this.publicClient.readContract({
222
+ address: plan.payToken,
223
+ abi: [ERC20_ABI.allowance],
224
+ functionName: 'allowance',
225
+ args: [account, this.address],
226
+ });
227
+ if (allowance < plan.price) {
228
+ const { request: approveReq } = await this.publicClient.simulateContract({
229
+ account,
230
+ address: plan.payToken,
231
+ abi: [ERC20_ABI.approve],
232
+ functionName: 'approve',
233
+ args: [this.address, plan.price],
234
+ });
235
+ await this.walletClient.writeContract(approveReq);
236
+ }
237
+ }
238
+ const { request } = await this.publicClient.simulateContract({
239
+ account,
240
+ address: this.address,
241
+ abi: [SUBSCRIPTION_ABI_V2.subscribe],
242
+ functionName: 'subscribe',
243
+ args: [BigInt(planId)],
244
+ });
245
+ const hash = await this.walletClient.writeContract(request);
246
+ return { subscriptionId: 0, txHash: hash };
247
+ }
248
+ }
249
+ /** Release escrowed funds to creator after trial window ends. */
250
+ async releaseFunds(subscriptionId) {
251
+ const [account] = await this.walletClient.getAddresses();
252
+ if (!account)
253
+ throw new Error('Wallet not connected');
254
+ const { request } = await this.publicClient.simulateContract({
255
+ account,
256
+ address: this.address,
257
+ abi: [SUBSCRIPTION_ABI_V2.releaseFunds],
258
+ functionName: 'releaseFunds',
259
+ args: [BigInt(subscriptionId)],
260
+ });
261
+ return this.walletClient.writeContract(request);
262
+ }
263
+ /** Cancel subscription (trial refund if within window). */
264
+ async cancel(subscriptionId) {
265
+ const [account] = await this.walletClient.getAddresses();
266
+ if (!account)
267
+ throw new Error('Wallet not connected');
268
+ const { request } = await this.publicClient.simulateContract({
269
+ account,
270
+ address: this.address,
271
+ abi: [SUBSCRIPTION_ABI_V2.cancelSubscription],
272
+ functionName: 'cancelSubscription',
273
+ args: [BigInt(subscriptionId)],
274
+ });
275
+ return this.walletClient.writeContract(request);
276
+ }
277
+ // ── Read ─────────────────────────────────────────────────────────────────
278
+ async hasActiveSubscription(subscriber, agentId) {
279
+ const result = await this.publicClient.readContract({
280
+ address: this.address,
281
+ abi: [SUBSCRIPTION_ABI_V2.hasActiveSubscription],
282
+ functionName: 'hasActiveSubscription',
283
+ args: [subscriber, BigInt(agentId)],
284
+ });
285
+ return result;
286
+ }
287
+ async getSubscription(subscriber, agentId) {
288
+ const result = await this.publicClient.readContract({
289
+ address: this.address,
290
+ abi: [SUBSCRIPTION_ABI_V2.getSubscription],
291
+ functionName: 'getSubscription',
292
+ args: [subscriber, BigInt(agentId)],
293
+ });
294
+ const [subId, sub, aId, status, started, expires, period] = result;
295
+ if (Number(subId) === 0)
296
+ return null;
297
+ return {
298
+ subscriptionId: Number(subId),
299
+ subscriber: sub,
300
+ agentId: Number(aId),
301
+ status: ['active', 'expired', 'cancelled', 'pending'][status],
302
+ startedAt: Number(started),
303
+ expiresAt: Number(expires),
304
+ period,
305
+ };
306
+ }
307
+ /** Get full subscription detail with v2 fields (trial, payToken, fundsReleased). */
308
+ async getSubscriptionDetail(subscriptionId) {
309
+ const result = await this.publicClient.readContract({
310
+ address: this.address,
311
+ abi: [SUBSCRIPTION_ABI_V2.getSubscriptionDetail],
312
+ functionName: 'getSubscriptionDetail',
313
+ args: [BigInt(subscriptionId)],
314
+ });
315
+ const [sid, sub, aId, status, started, expires, period, payToken, amountPaid, trialActive, trialEndsAt, fundsReleased] = result;
316
+ return {
317
+ subscriptionId: Number(sid), subscriber: sub,
318
+ agentId: Number(aId), status, startedAt: Number(started),
319
+ expiresAt: Number(expires), period,
320
+ payToken: payToken, amountPaid,
321
+ trialActive, trialEndsAt: Number(trialEndsAt), fundsReleased,
322
+ };
323
+ }
324
+ async getUserSubscriptions(user) {
325
+ const result = await this.publicClient.readContract({
326
+ address: this.address,
327
+ abi: [SUBSCRIPTION_ABI_V2.getUserSubscriptions],
328
+ functionName: 'getUserSubscriptions',
329
+ args: [user],
330
+ });
331
+ return result.map(Number);
332
+ }
333
+ }
334
+ // ── Subscription Guard ─────────────────────────────────────────────────────
335
+ export async function guardSubscription(manager, user, agentId) {
336
+ const active = await manager.hasActiveSubscription(user, agentId);
337
+ if (!active) {
338
+ throw new Error(`No active subscription for agent #${agentId}. ` +
339
+ `Address ${user} must purchase a subscription first.`);
340
+ }
341
+ const sub = await manager.getSubscription(user, agentId);
342
+ if (!sub)
343
+ throw new Error(`Subscription not found for agent #${agentId}`);
344
+ return sub;
345
+ }
346
+ //# sourceMappingURL=subscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subscription.js","sourceRoot":"","sources":["../../src/subscription/subscription.ts"],"names":[],"mappings":"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"}