@agentxv2/sdk 0.3.0 → 0.4.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.
- package/README.md +25 -16
- package/dist/core.d.mts +64 -0
- package/dist/core.d.ts +64 -0
- package/dist/core.js +275 -0
- package/dist/core.js.map +1 -0
- package/dist/core.mjs +240 -0
- package/dist/core.mjs.map +1 -0
- package/dist/{agent/agent-runner.d.ts → index-DhXVi_ub.d.ts} +94 -10
- package/dist/index-eQO4iaOr.d.mts +208 -0
- package/dist/index.d.mts +269 -0
- package/dist/index.d.ts +269 -10
- package/dist/index.js +2416 -31
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2363 -0
- package/dist/index.mjs.map +1 -0
- package/dist/react.d.mts +3 -0
- package/dist/react.d.ts +3 -0
- package/dist/react.js +755 -0
- package/dist/react.js.map +1 -0
- package/dist/react.mjs +735 -0
- package/dist/react.mjs.map +1 -0
- package/dist/{core/types.d.ts → types-2aHUvS4M.d.mts} +34 -33
- package/dist/types-2aHUvS4M.d.ts +297 -0
- package/package.json +12 -11
- package/dist/a2a/a2a.d.ts +0 -37
- package/dist/a2a/a2a.d.ts.map +0 -1
- package/dist/a2a/a2a.js +0 -252
- package/dist/a2a/a2a.js.map +0 -1
- package/dist/a2a/index.d.ts +0 -4
- package/dist/a2a/index.d.ts.map +0 -1
- package/dist/a2a/index.js +0 -4
- package/dist/a2a/index.js.map +0 -1
- package/dist/agent/agent-runner.d.ts.map +0 -1
- package/dist/agent/agent-runner.js +0 -249
- package/dist/agent/agent-runner.js.map +0 -1
- package/dist/agent/index.d.ts +0 -3
- package/dist/agent/index.d.ts.map +0 -1
- package/dist/agent/index.js +0 -3
- package/dist/agent/index.js.map +0 -1
- package/dist/config/config.d.ts +0 -31
- package/dist/config/config.d.ts.map +0 -1
- package/dist/config/config.js +0 -95
- package/dist/config/config.js.map +0 -1
- package/dist/config/index.d.ts +0 -4
- package/dist/config/index.d.ts.map +0 -1
- package/dist/config/index.js +0 -4
- package/dist/config/index.js.map +0 -1
- package/dist/core/crypto.d.ts +0 -62
- package/dist/core/crypto.d.ts.map +0 -1
- package/dist/core/crypto.js +0 -291
- package/dist/core/crypto.js.map +0 -1
- package/dist/core/index.d.ts +0 -3
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -4
- package/dist/core/index.js.map +0 -1
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/types.js +0 -30
- package/dist/core/types.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/mcp/connector.d.ts +0 -43
- package/dist/mcp/connector.d.ts.map +0 -1
- package/dist/mcp/connector.js +0 -79
- package/dist/mcp/connector.js.map +0 -1
- package/dist/mcp/index.d.ts +0 -4
- package/dist/mcp/index.d.ts.map +0 -1
- package/dist/mcp/index.js +0 -4
- package/dist/mcp/index.js.map +0 -1
- package/dist/react/index.d.ts +0 -4
- package/dist/react/index.d.ts.map +0 -1
- package/dist/react/index.js +0 -3
- package/dist/react/index.js.map +0 -1
- package/dist/react/useAgentRunner.d.ts +0 -16
- package/dist/react/useAgentRunner.d.ts.map +0 -1
- package/dist/react/useAgentRunner.js +0 -204
- package/dist/react/useAgentRunner.js.map +0 -1
- package/dist/registry/agent-registry.d.ts +0 -52
- package/dist/registry/agent-registry.d.ts.map +0 -1
- package/dist/registry/agent-registry.js +0 -221
- package/dist/registry/agent-registry.js.map +0 -1
- package/dist/registry/index.d.ts +0 -7
- package/dist/registry/index.d.ts.map +0 -1
- package/dist/registry/index.js +0 -6
- package/dist/registry/index.js.map +0 -1
- package/dist/registry/ipfs-fetcher.d.ts +0 -39
- package/dist/registry/ipfs-fetcher.d.ts.map +0 -1
- package/dist/registry/ipfs-fetcher.js +0 -139
- package/dist/registry/ipfs-fetcher.js.map +0 -1
- package/dist/reputation/index.d.ts +0 -4
- package/dist/reputation/index.d.ts.map +0 -1
- package/dist/reputation/index.js +0 -4
- package/dist/reputation/index.js.map +0 -1
- package/dist/reputation/reputation.d.ts +0 -26
- package/dist/reputation/reputation.d.ts.map +0 -1
- package/dist/reputation/reputation.js +0 -113
- package/dist/reputation/reputation.js.map +0 -1
- package/dist/subscription/agent-x402.d.ts +0 -33
- package/dist/subscription/agent-x402.d.ts.map +0 -1
- package/dist/subscription/agent-x402.js +0 -144
- package/dist/subscription/agent-x402.js.map +0 -1
- package/dist/subscription/index.d.ts +0 -6
- package/dist/subscription/index.d.ts.map +0 -1
- package/dist/subscription/index.js +0 -5
- package/dist/subscription/index.js.map +0 -1
- package/dist/subscription/subscription.d.ts +0 -67
- package/dist/subscription/subscription.d.ts.map +0 -1
- package/dist/subscription/subscription.js +0 -346
- package/dist/subscription/subscription.js.map +0 -1
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
// ---------------------------------------------------------------------------
|
|
2
|
-
// @agentx/sdk — IPFS Fetcher
|
|
3
|
-
// ---------------------------------------------------------------------------
|
|
4
|
-
// Multi-gateway IPFS fetcher with in-memory cache, deduplication, and
|
|
5
|
-
// automatic fallback. Compatible with the EncryptedPayload wire format.
|
|
6
|
-
// ---------------------------------------------------------------------------
|
|
7
|
-
// ── Implementation ─────────────────────────────────────────────────────────
|
|
8
|
-
export class IPFSFetcher {
|
|
9
|
-
gateway;
|
|
10
|
-
fallbackGateways;
|
|
11
|
-
timeoutMs;
|
|
12
|
-
cache = new Map();
|
|
13
|
-
maxCache;
|
|
14
|
-
pending = new Map();
|
|
15
|
-
failed = new Set();
|
|
16
|
-
constructor(config = {}) {
|
|
17
|
-
this.gateway = config.gateway ?? 'ipfs.io';
|
|
18
|
-
this.fallbackGateways = config.fallbackGateways ?? [
|
|
19
|
-
'gateway.pinata.cloud',
|
|
20
|
-
'dweb.link',
|
|
21
|
-
'cf-ipfs.com',
|
|
22
|
-
];
|
|
23
|
-
this.timeoutMs = config.timeoutMs ?? 10_000;
|
|
24
|
-
this.maxCache = config.maxCache ?? 200;
|
|
25
|
-
}
|
|
26
|
-
// ── Public API ──────────────────────────────────────────────────────────
|
|
27
|
-
/** Fetch JSON from a single IPFS CID. */
|
|
28
|
-
async fetchJSON(cid) {
|
|
29
|
-
const cached = this.cache.get(cid);
|
|
30
|
-
if (cached)
|
|
31
|
-
return cached.data;
|
|
32
|
-
if (this.failed.has(cid))
|
|
33
|
-
throw new Error(`CID ${cid} previously failed`);
|
|
34
|
-
const pending = this.pending.get(cid);
|
|
35
|
-
if (pending)
|
|
36
|
-
return pending;
|
|
37
|
-
const promise = this._doFetch(cid);
|
|
38
|
-
this.pending.set(cid, promise);
|
|
39
|
-
try {
|
|
40
|
-
const data = await promise;
|
|
41
|
-
this._cacheSet(cid, data);
|
|
42
|
-
return data;
|
|
43
|
-
}
|
|
44
|
-
catch (e) {
|
|
45
|
-
this.failed.add(cid);
|
|
46
|
-
throw e;
|
|
47
|
-
}
|
|
48
|
-
finally {
|
|
49
|
-
this.pending.delete(cid);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
/** Fetch encrypted agent payload (validates algorithm). */
|
|
53
|
-
async fetchEncryptedPayload(cid) {
|
|
54
|
-
const raw = await this.fetchJSON(cid);
|
|
55
|
-
if (!raw.encrypted || raw.algorithm !== 'AES-256-GCM' || typeof raw.data !== 'string') {
|
|
56
|
-
throw new Error(`Invalid EncryptedPayload at CID ${cid}`);
|
|
57
|
-
}
|
|
58
|
-
return raw;
|
|
59
|
-
}
|
|
60
|
-
/** Batch fetch multiple CIDs with concurrency control. */
|
|
61
|
-
async fetchBatch(cids, concurrency = 5) {
|
|
62
|
-
const results = new Map();
|
|
63
|
-
const unique = [...new Set(cids)].filter(c => this.isValidCID(c));
|
|
64
|
-
for (let i = 0; i < unique.length; i += concurrency) {
|
|
65
|
-
const batch = unique.slice(i, i + concurrency);
|
|
66
|
-
const settled = await Promise.allSettled(batch.map(cid => this.fetchJSON(cid)));
|
|
67
|
-
settled.forEach((r, j) => {
|
|
68
|
-
if (r.status === 'fulfilled')
|
|
69
|
-
results.set(batch[j], r.value);
|
|
70
|
-
});
|
|
71
|
-
if (i + concurrency < unique.length) {
|
|
72
|
-
await new Promise(r => setTimeout(r, 200));
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
return results;
|
|
76
|
-
}
|
|
77
|
-
/** Check if a string looks like a valid IPFS CID. */
|
|
78
|
-
isValidCID(cid) {
|
|
79
|
-
return /^(Qm[1-9A-HJ-NP-Za-km-z]{44,}|b[a-z2-7]{58,}|[A-Za-z0-9+/]{46,})$/.test(cid);
|
|
80
|
-
}
|
|
81
|
-
/** Clear cache (optionally for a specific CID). */
|
|
82
|
-
clearCache(cid) {
|
|
83
|
-
if (cid) {
|
|
84
|
-
this.cache.delete(cid);
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
this.cache.clear();
|
|
88
|
-
}
|
|
89
|
-
this.failed.clear();
|
|
90
|
-
}
|
|
91
|
-
/** Number of cached entries. */
|
|
92
|
-
get cacheSize() {
|
|
93
|
-
return this.cache.size;
|
|
94
|
-
}
|
|
95
|
-
// ── Internal ─────────────────────────────────────────────────────────────
|
|
96
|
-
async _doFetch(cid) {
|
|
97
|
-
if (!this.isValidCID(cid))
|
|
98
|
-
throw new Error(`Invalid CID: ${cid}`);
|
|
99
|
-
// Try primary gateway
|
|
100
|
-
try {
|
|
101
|
-
return await this._fetchFrom(cid, this.gateway, this.timeoutMs);
|
|
102
|
-
}
|
|
103
|
-
catch {
|
|
104
|
-
// fall through to alternatives
|
|
105
|
-
}
|
|
106
|
-
// Try fallback gateways
|
|
107
|
-
for (const gw of this.fallbackGateways) {
|
|
108
|
-
try {
|
|
109
|
-
return await this._fetchFrom(cid, gw, this.timeoutMs);
|
|
110
|
-
}
|
|
111
|
-
catch {
|
|
112
|
-
// try next
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
throw new Error(`All IPFS gateways failed for CID ${cid}`);
|
|
116
|
-
}
|
|
117
|
-
async _fetchFrom(cid, gateway, timeoutMs) {
|
|
118
|
-
const url = `https://${gateway}/ipfs/${cid}`;
|
|
119
|
-
const res = await fetch(url, {
|
|
120
|
-
headers: { Accept: 'application/json' },
|
|
121
|
-
signal: AbortSignal.timeout(timeoutMs),
|
|
122
|
-
});
|
|
123
|
-
if (!res.ok)
|
|
124
|
-
throw new Error(`HTTP ${res.status}`);
|
|
125
|
-
return (await res.json());
|
|
126
|
-
}
|
|
127
|
-
_cacheSet(cid, data) {
|
|
128
|
-
this.cache.set(cid, { data, timestamp: Date.now() });
|
|
129
|
-
// Simple LRU-like eviction
|
|
130
|
-
if (this.cache.size > this.maxCache) {
|
|
131
|
-
const oldest = [...this.cache.entries()].sort((a, b) => a[1].timestamp - b[1].timestamp)[0];
|
|
132
|
-
if (oldest)
|
|
133
|
-
this.cache.delete(oldest[0]);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
/** Singleton-friendly default instance. */
|
|
138
|
-
export const defaultIPFSFetcher = new IPFSFetcher();
|
|
139
|
-
//# sourceMappingURL=ipfs-fetcher.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ipfs-fetcher.js","sourceRoot":"","sources":["../../src/registry/ipfs-fetcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reputation/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AACjD,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AACpD,eAAO,MAAM,kBAAkB,UAAU,CAAA"}
|
package/dist/reputation/index.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reputation/index.ts"],"names":[],"mappings":"AAAA,kCAAkC;AAClC,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAA;AAEjD,MAAM,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAA"}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { PublicClient, WalletClient, Address, Hash } from 'viem';
|
|
2
|
-
import type { AgentReputation, AgentReview } from '../core/types';
|
|
3
|
-
export interface ReputationConfig {
|
|
4
|
-
contractAddress: Address;
|
|
5
|
-
publicClient: PublicClient;
|
|
6
|
-
walletClient: WalletClient;
|
|
7
|
-
}
|
|
8
|
-
export declare class ReputationRegistry {
|
|
9
|
-
private address;
|
|
10
|
-
private publicClient;
|
|
11
|
-
private walletClient;
|
|
12
|
-
constructor(config: ReputationConfig);
|
|
13
|
-
private get account();
|
|
14
|
-
/** Submit a rating (1-5) with optional comment. */
|
|
15
|
-
rate(agentId: number, rating: number, comment?: string): Promise<Hash>;
|
|
16
|
-
/** Get average rating and total count. */
|
|
17
|
-
getRating(agentId: number): Promise<{
|
|
18
|
-
averageRating: number;
|
|
19
|
-
totalRatings: number;
|
|
20
|
-
}>;
|
|
21
|
-
/** Get all reviews for an agent. */
|
|
22
|
-
getReviews(agentId: number): Promise<AgentReview[]>;
|
|
23
|
-
/** Get full reputation summary. */
|
|
24
|
-
getReputation(agentId: number): Promise<AgentReputation>;
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=reputation.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reputation.d.ts","sourceRoot":"","sources":["../../src/reputation/reputation.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AACrE,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AA4CjE,MAAM,WAAW,gBAAgB;IAC/B,eAAe,EAAE,OAAO,CAAA;IACxB,YAAY,EAAE,YAAY,CAAA;IAC1B,YAAY,EAAE,YAAY,CAAA;CAC3B;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,YAAY,CAAc;gBAEtB,MAAM,EAAE,gBAAgB;IAMpC,OAAO,KAAK,OAAO,GAKlB;IAED,mDAAmD;IAC7C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,SAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAaxE,0CAA0C;IACpC,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;IAW1F,oCAAoC;IAC9B,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAgBzD,mCAAmC;IAC7B,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAO/D"}
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
// ---------------------------------------------------------------------------
|
|
2
|
-
// @agentx/sdk — Reputation
|
|
3
|
-
// ---------------------------------------------------------------------------
|
|
4
|
-
// Wraps ReputationRegistry contract for agent ratings and reviews.
|
|
5
|
-
// ---------------------------------------------------------------------------
|
|
6
|
-
const REPUTATION_ABI = {
|
|
7
|
-
rateAgent: {
|
|
8
|
-
inputs: [
|
|
9
|
-
{ name: 'agentId', type: 'uint256' },
|
|
10
|
-
{ name: 'rating', type: 'uint8' },
|
|
11
|
-
{ name: 'comment', type: 'string' },
|
|
12
|
-
],
|
|
13
|
-
name: 'rateAgent',
|
|
14
|
-
outputs: [],
|
|
15
|
-
stateMutability: 'nonpayable',
|
|
16
|
-
type: 'function',
|
|
17
|
-
},
|
|
18
|
-
getRating: {
|
|
19
|
-
inputs: [{ name: 'agentId', type: 'uint256' }],
|
|
20
|
-
name: 'getRating',
|
|
21
|
-
outputs: [
|
|
22
|
-
{ name: 'averageRating', type: 'uint256' },
|
|
23
|
-
{ name: 'totalRatings', type: 'uint256' },
|
|
24
|
-
],
|
|
25
|
-
stateMutability: 'view',
|
|
26
|
-
type: 'function',
|
|
27
|
-
},
|
|
28
|
-
getReviews: {
|
|
29
|
-
inputs: [{ name: 'agentId', type: 'uint256' }],
|
|
30
|
-
name: 'getReviews',
|
|
31
|
-
outputs: [
|
|
32
|
-
{
|
|
33
|
-
name: '',
|
|
34
|
-
type: 'tuple[]',
|
|
35
|
-
components: [
|
|
36
|
-
{ name: 'reviewer', type: 'address' },
|
|
37
|
-
{ name: 'rating', type: 'uint8' },
|
|
38
|
-
{ name: 'comment', type: 'string' },
|
|
39
|
-
{ name: 'timestamp', type: 'uint256' },
|
|
40
|
-
],
|
|
41
|
-
},
|
|
42
|
-
],
|
|
43
|
-
stateMutability: 'view',
|
|
44
|
-
type: 'function',
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
export class ReputationRegistry {
|
|
48
|
-
address;
|
|
49
|
-
publicClient;
|
|
50
|
-
walletClient;
|
|
51
|
-
constructor(config) {
|
|
52
|
-
this.address = config.contractAddress;
|
|
53
|
-
this.publicClient = config.publicClient;
|
|
54
|
-
this.walletClient = config.walletClient;
|
|
55
|
-
}
|
|
56
|
-
get account() {
|
|
57
|
-
return this.walletClient.getAddresses().then(a => {
|
|
58
|
-
if (!a[0])
|
|
59
|
-
throw new Error('Wallet not connected');
|
|
60
|
-
return a[0];
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
/** Submit a rating (1-5) with optional comment. */
|
|
64
|
-
async rate(agentId, rating, comment = '') {
|
|
65
|
-
if (rating < 1 || rating > 5)
|
|
66
|
-
throw new Error('Rating must be 1-5');
|
|
67
|
-
const acct = await this.account;
|
|
68
|
-
const { request } = await this.publicClient.simulateContract({
|
|
69
|
-
account: acct,
|
|
70
|
-
address: this.address,
|
|
71
|
-
abi: [REPUTATION_ABI.rateAgent],
|
|
72
|
-
functionName: 'rateAgent',
|
|
73
|
-
args: [BigInt(agentId), rating, comment],
|
|
74
|
-
});
|
|
75
|
-
return this.walletClient.writeContract(request);
|
|
76
|
-
}
|
|
77
|
-
/** Get average rating and total count. */
|
|
78
|
-
async getRating(agentId) {
|
|
79
|
-
const r = await this.publicClient.readContract({
|
|
80
|
-
address: this.address,
|
|
81
|
-
abi: [REPUTATION_ABI.getRating],
|
|
82
|
-
functionName: 'getRating',
|
|
83
|
-
args: [BigInt(agentId)],
|
|
84
|
-
});
|
|
85
|
-
const [avg, total] = r;
|
|
86
|
-
return { averageRating: Number(avg), totalRatings: Number(total) };
|
|
87
|
-
}
|
|
88
|
-
/** Get all reviews for an agent. */
|
|
89
|
-
async getReviews(agentId) {
|
|
90
|
-
const r = await this.publicClient.readContract({
|
|
91
|
-
address: this.address,
|
|
92
|
-
abi: [REPUTATION_ABI.getReviews],
|
|
93
|
-
functionName: 'getReviews',
|
|
94
|
-
args: [BigInt(agentId)],
|
|
95
|
-
});
|
|
96
|
-
return r
|
|
97
|
-
.map(x => ({
|
|
98
|
-
reviewer: x.reviewer,
|
|
99
|
-
rating: x.rating,
|
|
100
|
-
comment: x.comment,
|
|
101
|
-
timestamp: Number(x.timestamp),
|
|
102
|
-
}));
|
|
103
|
-
}
|
|
104
|
-
/** Get full reputation summary. */
|
|
105
|
-
async getReputation(agentId) {
|
|
106
|
-
const [rating, reviews] = await Promise.all([
|
|
107
|
-
this.getRating(agentId),
|
|
108
|
-
this.getReviews(agentId),
|
|
109
|
-
]);
|
|
110
|
-
return { agentId, ...rating, reviews };
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
//# sourceMappingURL=reputation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"reputation.js","sourceRoot":"","sources":["../../src/reputation/reputation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,33 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,144 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"agent-x402.js","sourceRoot":"","sources":["../../src/subscription/agent-x402.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,sDAAsD;AACtD,8EAA8E;AAC9E,2DAA2D;AAC3D,EAAE;AACF,kDAAkD;AAClD,kEAAkE;AAClE,uDAAuD;AACvD,EAAE;AACF,QAAQ;AACR,yCAAyC;AACzC,2CAA2C;AAC3C,4DAA4D;AAC5D,4DAA4D;AAC5D,mDAAmD;AACnD,kBAAkB;AAClB,8EAA8E;AAG9E,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAG5D,8EAA8E;AAE9E,MAAM,UAAU,GAAG;IACjB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAU;IACtD,IAAI,EAAE,SAAkB;IACxB,OAAO,EAAE;QACP,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE;QACnC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;QACpC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;QACpC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;QAClC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE;QAClC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;QAChC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE;QACrC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE;KAC9B;IACV,eAAe,EAAE,MAAe;IAChC,IAAI,EAAE,UAAmB;CAC1B,CAAA;AAED,MAAM,YAAY,GAAG;IACnB,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAU;IACtD,IAAI,EAAE,WAAoB;IAC1B,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAU;IAC/D,eAAe,EAAE,SAAkB;IACnC,IAAI,EAAE,UAAmB;CAC1B,CAAA;AAED,MAAM,eAAe,GAAG;IACtB,MAAM,EAAE;QACN,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE;QACvC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE;KAC5B;IACV,IAAI,EAAE,uBAAgC;IACtC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAU;IAC9C,eAAe,EAAE,MAAe;IAChC,IAAI,EAAE,UAAmB;CAC1B,CAAA;AAUD,8EAA8E;AAE9E,MAAM,OAAO,SAAS;IACA;IAApB,YAAoB,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IAE/C;;;;;;;;;OASG;IACH,KAAK,CAAC,mBAAmB,CACvB,OAAe,EACf,OAAgB,EAChB,IAA6B;QAE7B,MAAM,EAAE,YAAY,EAAE,0BAA0B,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QAEhE,MAAM,QAAQ,GAAG,CAAC,MAAM,YAAY,CAAC,YAAY,CAAC;YAChD,OAAO,EAAE,0BAA0B;YACnC,GAAG,EAAE,CAAC,eAAe,CAAC;YACtB,YAAY,EAAE,uBAAuB;YACrC,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;SACjC,CAAC,CAAY,CAAA;QAEd,IAAI,QAAQ;YAAE,OAAM,CAAC,uBAAuB;QAE5C,0CAA0C;QAC1C,MAAM,KAAK,GAA+C,EAAE,CAAA;QAE5D,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC7C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,CAAC,MAAM,YAAY,CAAC,YAAY,CAAC;wBAC5C,OAAO,EAAE,0BAA0B;wBACnC,GAAG,EAAE,CAAC,UAAU,CAAC;wBACjB,YAAY,EAAE,SAAS;wBACvB,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;qBACvB,CAAC,CAAyB,CAAA;oBAE3B,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;oBACnC,MAAM,UAAU,GAAG,IAAI,CAAC,CAAC,CAAY,CAAA;oBAErC,IAAI,UAAU,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;wBAC1C,KAAK,CAAC,IAAI,CAAC;4BACT,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;4BACvB,KAAK,EAAE,IAAI,CAAC,CAAC,CAAW;4BACxB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAW;4BACzB,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAW;4BAC3B,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;yBAC3B,CAAC,CAAA;oBACJ,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,iCAAiC;gBACnC,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,WAAW,CACzB,eAAe,CAAC,cAAc,EAC9B,qCAAqC,OAAO,6DAA6D,CAC1G,CACA;QAAC,GAA2D,CAAC,WAAW,GAAG;YAC1E,OAAO;YACP,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;SAC5C,CAAA;QACD,MAAM,GAAG,CAAA;IACX,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,gBAAgB,CACpB,MAAc,EACd,KAAa,EACb,QAAiB;QAEjB,MAAM,EAAE,YAAY,EAAE,YAAY,EAAE,0BAA0B,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QAC9E,MAAM,KAAK,GAAG,QAAQ,KAAK,4CAA4C,CAAA;QAEvE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,YAAY,CAAC,gBAAgB,CAAC;YACtD,OAAO,EAAE,0BAA0B;YACnC,GAAG,EAAE,CAAC,YAAY,CAAC;YACnB,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACtB,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,OAAkB;YACjD,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;SAC1B,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QACtD,MAAM,OAAO,GAAG,MAAM,YAAY,CAAC,yBAAyB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;QAEtE,wDAAwD;QACxD,wDAAwD;QACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QAC7C,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;QACzE,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAA;IACjC,CAAC;CACF"}
|
|
@@ -1,6 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,67 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|