@pushchain/core 6.0.27-alpha.3 → 6.0.27-alpha.5

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/AGW.md +35 -6
  2. package/CHANGELOG.md +13 -0
  3. package/MARKETPLACE.md +206 -0
  4. package/package.json +2 -1
  5. package/src/lib/agentic/codec/rules.js +74 -69
  6. package/src/lib/agentic/codec/universal.js +15 -3
  7. package/src/lib/agentic/constants.d.ts +36 -1
  8. package/src/lib/agentic/constants.js +14 -1
  9. package/src/lib/agentic/contracts/reader.d.ts +21 -0
  10. package/src/lib/agentic/contracts/reader.js +3 -0
  11. package/src/lib/agentic/error-messages.d.ts +3 -0
  12. package/src/lib/agentic/error-messages.js +127 -0
  13. package/src/lib/agentic/errors.d.ts +12 -3
  14. package/src/lib/agentic/errors.js +76 -0
  15. package/src/lib/agentic/management/common.js +6 -0
  16. package/src/lib/agentic/management/destination.d.ts +5 -0
  17. package/src/lib/agentic/management/destination.js +32 -0
  18. package/src/lib/agentic/management/prepare.js +80 -55
  19. package/src/lib/agentic/management/svm-public.js +13 -4
  20. package/src/lib/agentic/presets/index.js +8 -9
  21. package/src/lib/agentic/presets/routes.d.ts +1 -1
  22. package/src/lib/agentic/presets/routes.js +6 -7
  23. package/src/lib/agentic/presets/types.d.ts +1 -6
  24. package/src/lib/agentic/public-rule.js +18 -2
  25. package/src/lib/constants/index.d.ts +35 -0
  26. package/src/lib/index.d.ts +4 -0
  27. package/src/lib/index.js +6 -2
  28. package/src/lib/job/job.d.ts +35 -0
  29. package/src/lib/job/job.js +382 -0
  30. package/src/lib/job/types.d.ts +94 -0
  31. package/src/lib/job/types.js +3 -0
  32. package/src/lib/job/watch.d.ts +3 -0
  33. package/src/lib/job/watch.js +169 -0
  34. package/src/lib/job-spec/codec.d.ts +18 -0
  35. package/src/lib/job-spec/codec.js +348 -0
  36. package/src/lib/job-spec/constants.d.ts +32 -0
  37. package/src/lib/job-spec/constants.js +36 -0
  38. package/src/lib/job-spec/helpers.d.ts +19 -0
  39. package/src/lib/job-spec/helpers.js +138 -0
  40. package/src/lib/job-spec/index.d.ts +14 -0
  41. package/src/lib/job-spec/index.js +17 -0
  42. package/src/lib/job-spec/preview.d.ts +8 -0
  43. package/src/lib/job-spec/preview.js +298 -0
  44. package/src/lib/job-spec/read.d.ts +20 -0
  45. package/src/lib/job-spec/read.js +224 -0
  46. package/src/lib/job-spec/schema.d.ts +290 -0
  47. package/src/lib/job-spec/schema.js +70 -0
  48. package/src/lib/job-spec/types.d.ts +139 -0
  49. package/src/lib/job-spec/types.js +3 -0
  50. package/src/lib/market/contracts/AgenticCommerce.d.ts +1026 -0
  51. package/src/lib/market/contracts/AgenticCommerce.js +1317 -0
  52. package/src/lib/market/contracts/RulesBindingHook.d.ts +235 -0
  53. package/src/lib/market/contracts/RulesBindingHook.js +314 -0
  54. package/src/lib/market/contracts/UniversalMarketplace.d.ts +1770 -0
  55. package/src/lib/market/contracts/UniversalMarketplace.js +2295 -0
  56. package/src/lib/market/contracts/UniversalMarketplaceErrors.d.ts +309 -0
  57. package/src/lib/market/contracts/UniversalMarketplaceErrors.js +416 -0
  58. package/src/lib/market/contracts/UniversalMarketplaceRules.d.ts +241 -0
  59. package/src/lib/market/contracts/UniversalMarketplaceRules.js +323 -0
  60. package/src/lib/market/data.d.ts +8 -0
  61. package/src/lib/market/data.js +60 -0
  62. package/src/lib/market/deployment.d.ts +14 -0
  63. package/src/lib/market/deployment.js +23 -0
  64. package/src/lib/market/deposit.d.ts +24 -0
  65. package/src/lib/market/deposit.js +271 -0
  66. package/src/lib/market/errors.d.ts +13 -0
  67. package/src/lib/market/errors.js +81 -0
  68. package/src/lib/market/history.d.ts +6 -0
  69. package/src/lib/market/history.js +83 -0
  70. package/src/lib/market/index.d.ts +4 -0
  71. package/src/lib/market/index.js +12 -0
  72. package/src/lib/market/kernel-wire.d.ts +15 -0
  73. package/src/lib/market/kernel-wire.js +41 -0
  74. package/src/lib/market/market.d.ts +55 -0
  75. package/src/lib/market/market.js +635 -0
  76. package/src/lib/market/rules.d.ts +106 -0
  77. package/src/lib/market/rules.js +293 -0
  78. package/src/lib/market/runtime.d.ts +35 -0
  79. package/src/lib/market/runtime.js +130 -0
  80. package/src/lib/market/types.d.ts +180 -0
  81. package/src/lib/market/types.js +3 -0
  82. package/src/lib/orchestrator/internals/errors.d.ts +9 -2
  83. package/src/lib/orchestrator/internals/errors.js +9 -2
  84. package/src/lib/orchestrator/internals/push-chain-tx.js +17 -3
  85. package/src/lib/push-chain/push-chain.d.ts +44 -1
  86. package/src/lib/push-chain/push-chain.js +23 -3
  87. package/src/lib/read-state/read-params.d.ts +9 -0
  88. package/src/lib/read-state/read-params.js +5 -1
  89. package/src/lib/utils.d.ts +15 -0
  90. package/src/lib/utils.js +4 -0
@@ -0,0 +1,635 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MarketNamespaceImpl = void 0;
4
+ const viem_1 = require("viem");
5
+ const UniversalMarketplace_1 = require("./contracts/UniversalMarketplace");
6
+ const AgenticCommerce_1 = require("./contracts/AgenticCommerce");
7
+ const UniversalMarketplaceRules_1 = require("./contracts/UniversalMarketplaceRules");
8
+ const deployments_1 = require("../agentic/deployments");
9
+ const ids_1 = require("../agentic/codec/ids");
10
+ const session_1 = require("../agentic/codec/session");
11
+ const universal_terms_1 = require("../agentic/codec/universal-terms");
12
+ const label_1 = require("../agentic/management/label");
13
+ const codec_1 = require("../job-spec/codec");
14
+ const helpers_1 = require("../job-spec/helpers");
15
+ const rules_1 = require("./rules");
16
+ const kernel_wire_1 = require("./kernel-wire");
17
+ const data_1 = require("./data");
18
+ const deposit_1 = require("./deposit");
19
+ const runtime_1 = require("./runtime");
20
+ const errors_1 = require("./errors");
21
+ const ownerIntentFields = [
22
+ ['owner', 'address'],
23
+ ['wallet', 'address'],
24
+ ['executor', 'address'],
25
+ ['index', 'uint96'],
26
+ ['sessionHash', 'bytes32'],
27
+ ['mode', 'bytes32'],
28
+ ['execCalldataHash', 'bytes32'],
29
+ ['nonceKey', 'uint192'],
30
+ ['nonceSeq', 'uint64'],
31
+ ['grantNonce', 'uint64'],
32
+ ['deadline', 'uint48'],
33
+ ['signerChainId', 'uint256'],
34
+ ].map(([name, type]) => ({ name, type }));
35
+ function id(n) {
36
+ if (typeof n !== 'bigint' || n < BigInt(1))
37
+ throw new errors_1.MarketError('INVALID_CARD_ID', 'Card IDs are positive bigint values.');
38
+ }
39
+ class MarketNamespaceImpl {
40
+ rt;
41
+ constructor(rt) {
42
+ this.rt = rt;
43
+ }
44
+ deposits = new Set();
45
+ depositCheckpoints = new Map();
46
+ async viewAt(cardId, s) {
47
+ id(cardId);
48
+ const d = (0, runtime_1.deployment)(this.rt);
49
+ const v = await s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'getAgentCard', [
50
+ cardId,
51
+ ]);
52
+ if ((0, viem_1.getAddress)(v.card.provider) === viem_1.zeroAddress)
53
+ throw new errors_1.MarketError('CARD_NOT_FOUND', 'This agent card does not exist.');
54
+ return v;
55
+ }
56
+ async summaryAt(cardId, s, view) {
57
+ const v = view ?? (await this.viewAt(cardId, s));
58
+ const d = (0, runtime_1.deployment)(this.rt);
59
+ const { chainNamespace, ...card } = v.card;
60
+ return {
61
+ ...card,
62
+ cardId,
63
+ chain: chainNamespace,
64
+ version: v.version,
65
+ verified: v.verified,
66
+ disabled: v.disabled,
67
+ rating: await s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'getAgentRating', [
68
+ v.card.provider,
69
+ ]),
70
+ };
71
+ }
72
+ async cardAt(cardId, s) {
73
+ const v = await this.viewAt(cardId, s);
74
+ return {
75
+ ...(await this.summaryAt(cardId, s, v)),
76
+ rules: (0, rules_1.decodeAgentCardRules)(v.rules),
77
+ jobSpecTemplate: (0, codec_1.decodeJobSpec)(v.jobSpecTemplate, {
78
+ format: 'template',
79
+ }),
80
+ rulesBytes: v.rules,
81
+ jobSpecTemplateBytes: v.jobSpecTemplate,
82
+ };
83
+ }
84
+ async card(cardId) {
85
+ return this.cardAt(cardId, await (0, runtime_1.snapshot)(this.rt));
86
+ }
87
+ async cards(options = {}) {
88
+ const s = await (0, runtime_1.snapshot)(this.rt);
89
+ const d = (0, runtime_1.deployment)(this.rt);
90
+ const count = options.provider
91
+ ? await s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'agentCardOf', [
92
+ (0, viem_1.getAddress)(options.provider),
93
+ ])
94
+ : await s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'agentCardCount');
95
+ const cards = [];
96
+ // Bounded requests. An indexer can replace the walk without changing the public result.
97
+ for (let start = options.provider ? count : BigInt(1); start > BigInt(0) && start <= count;) {
98
+ const batch = options.provider
99
+ ? [start]
100
+ : Array.from({
101
+ length: Number(count - start + BigInt(1) > BigInt(8)
102
+ ? BigInt(8)
103
+ : count - start + BigInt(1)),
104
+ }, (_, i) => start + BigInt(i));
105
+ const rows = await Promise.all(batch.map((n) => this.summaryAt(n, s)));
106
+ for (const card of rows)
107
+ if ((!options.chain || card.chain === options.chain) &&
108
+ (options.active === undefined || card.active === options.active)) {
109
+ cards.push(card);
110
+ }
111
+ if (options.provider)
112
+ break;
113
+ start += BigInt(batch.length);
114
+ }
115
+ return { cards };
116
+ }
117
+ async job(jobId) {
118
+ const s = await (0, runtime_1.snapshot)(this.rt);
119
+ const d = (0, runtime_1.deployment)(this.rt);
120
+ const [cardId, cardVersion, wallet, rulesId] = await Promise.all([
121
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'cardOfJob', [jobId]),
122
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'cardVersionOfJob', [jobId]),
123
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'agwOfJob', [jobId]),
124
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'rulesOfJob', [jobId]),
125
+ ]);
126
+ return { cardId, cardVersion, wallet, rulesId };
127
+ }
128
+ async activeJob(wallet) {
129
+ const d = (0, runtime_1.deployment)(this.rt);
130
+ return {
131
+ jobId: await (await (0, runtime_1.snapshot)(this.rt)).read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'activeJobOf', [(0, viem_1.getAddress)(wallet)]),
132
+ };
133
+ }
134
+ async preview(cardId, options) {
135
+ options = { ...options, params: options.params && [...options.params] };
136
+ const rt = this.rt;
137
+ const d = (0, runtime_1.deployment)(rt);
138
+ const s = await (0, runtime_1.snapshot)(rt);
139
+ const card = await this.cardAt(cardId, s);
140
+ const gen = (0, deployments_1.currentGeneration)(rt.agw.network);
141
+ const now = s.timestamp;
142
+ if (card.disabled || !card.active)
143
+ throw new errors_1.MarketError('AGENT_CARD_INACTIVE', 'This agent card is inactive or disabled.');
144
+ if (card.jobSpecTemplate.allowedMutability !== 'NONE')
145
+ (0, errors_1.unavailable)('Mutable marketplace criteria');
146
+ const [factory, kernel, paused, evaluator, hook, rulesHelper, kernelPaused,] = await Promise.all([
147
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'AGW_FACTORY'),
148
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'KERNEL'),
149
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'paused'),
150
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'evaluator'),
151
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'hook'),
152
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'RULES'),
153
+ s.read(d.kernel, AgenticCommerce_1.JOB_KERNEL_ABI, 'paused'),
154
+ ]);
155
+ if ((0, viem_1.getAddress)(factory) !== (0, viem_1.getAddress)(gen.addresses.factory) ||
156
+ (0, viem_1.getAddress)(kernel) !== (0, viem_1.getAddress)(d.kernel) ||
157
+ (0, viem_1.getAddress)(hook) !== (0, viem_1.getAddress)(d.hook) ||
158
+ (0, viem_1.getAddress)(rulesHelper) !== (0, viem_1.getAddress)(d.rules) ||
159
+ (0, viem_1.getAddress)(evaluator) !== (0, viem_1.getAddress)(d.evaluator))
160
+ throw new errors_1.MarketError('CAPABILITY_UNAVAILABLE', 'The marketplace deployment wiring has changed.');
161
+ if (paused || kernelPaused)
162
+ throw new errors_1.MarketError('PAUSED', 'The marketplace or kernel is paused.');
163
+ if ((0, viem_1.getAddress)(card.provider) === (0, viem_1.getAddress)(evaluator))
164
+ throw new errors_1.MarketError('PROVIDER_IS_EVALUATOR', 'The provider cannot be the evaluator.');
165
+ const job = {
166
+ principal: options.principal,
167
+ expiredAt: options.expiredAt,
168
+ executeBy: options.executeBy,
169
+ params: options.params ?? [],
170
+ };
171
+ if (typeof job.principal !== 'bigint' ||
172
+ job.principal < card.principalMin ||
173
+ job.principal > card.principalMax)
174
+ throw new errors_1.MarketError('PRINCIPAL_OUT_OF_RANGE', 'The principal is outside this card’s range.');
175
+ if (!Number.isSafeInteger(job.expiredAt) ||
176
+ job.expiredAt < now + card.minDuration ||
177
+ job.expiredAt > now + card.maxDuration ||
178
+ job.expiredAt >= 2 ** 48)
179
+ throw new errors_1.MarketError('EXPIRY_OUT_OF_RANGE', 'Choose an expiry inside the card’s duration window.');
180
+ if (!Number.isSafeInteger(job.executeBy) ||
181
+ job.executeBy < now + card.minExecuteWindow ||
182
+ job.executeBy + card.settleWindow > job.expiredAt)
183
+ throw new errors_1.MarketError('EXECUTE_BY_OUT_OF_RANGE', 'Choose an execution deadline that leaves the settlement window.');
184
+ const owner = (0, viem_1.getAddress)(rt.agw.signerPushAccount());
185
+ if (owner === (0, viem_1.getAddress)(card.provider))
186
+ throw new errors_1.MarketError('CLIENT_IS_PROVIDER', 'The wallet owner and provider must be different.');
187
+ if (options.walletIndex !== undefined &&
188
+ (!Number.isSafeInteger(options.walletIndex) || options.walletIndex < 0))
189
+ throw new errors_1.MarketError('INVALID_WALLET_INDEX', 'The wallet index must be a nonnegative safe integer.');
190
+ const index = options.walletIndex === undefined
191
+ ? await s.read(factory, gen.contracts.abis.factory, 'walletCount', [owner])
192
+ : BigInt(options.walletIndex);
193
+ const [wallet, deployed] = await s.read(factory, gen.contracts.abis.factory, 'predictWallet', [owner, index]);
194
+ if (deployed &&
195
+ (0, viem_1.getAddress)(await s.read(factory, gen.contracts.abis.factory, 'ownerOf', [
196
+ wallet,
197
+ ])) !== owner)
198
+ throw new errors_1.MarketError('NOT_OWNER', 'The connected account does not own this wallet.');
199
+ if ((await s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'activeJobOf', [wallet])) !==
200
+ BigInt(0))
201
+ throw new errors_1.MarketError('WALLET_HAS_ACTIVE_JOB', 'This wallet already has an active marketplace job.');
202
+ const accounts = {};
203
+ const chains = new Set([
204
+ card.chain,
205
+ ...card.jobSpecTemplate.reads
206
+ .filter((r, i) => r.fills?.some((f) => f.source === 'WALLET') ||
207
+ card.jobSpecTemplate.checks.some((c) => c.read === i && c.target === 'agentic:wallet'))
208
+ .map((r) => `${r.chainNamespace}:${r.chainId}`),
209
+ ]);
210
+ for (const chain of chains) {
211
+ const [independent, onchain] = await Promise.all([
212
+ rt.agw.resolveCEA(wallet, chain),
213
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'computeCEA', [
214
+ wallet,
215
+ (0, viem_1.keccak256)((0, viem_1.stringToHex)(chain)),
216
+ ]),
217
+ ]);
218
+ if ((0, viem_1.getAddress)(independent.cea) !== (0, viem_1.getAddress)(onchain))
219
+ throw new errors_1.MarketError('CEA_MISMATCH', 'The independently derived destination wallet differs from the marketplace.', { chain, wallet, expectedCEA: onchain, derivedCEA: independent.cea });
220
+ accounts[chain] = (0, viem_1.getAddress)(onchain);
221
+ }
222
+ const rules = (0, rules_1.decodeCardRulesWire)(card.rulesBytes);
223
+ const terms = (0, rules_1.fillCardRules)(rules, job.principal, accounts[card.chain], job.expiredAt);
224
+ const session = (0, session_1.buildSession)({
225
+ validator: gen.addresses.sessionValidator,
226
+ agent: card.provider,
227
+ rulesPolicy: gen.addresses.rulesPolicy,
228
+ actions: [
229
+ {
230
+ target: gen.addresses.gateway,
231
+ selector: '0x77b86bec',
232
+ initData: (0, session_1.encodeEnvelope)(card.chain, (0, universal_terms_1.encodeUniversalTerms)(terms)),
233
+ },
234
+ ],
235
+ });
236
+ const rawChain = rt.agw.signerOrigin().chain;
237
+ if (!/^eip155:[1-9]\d*$/.test(rawChain))
238
+ (0, errors_1.unavailable)('Non-EVM OwnerIntent signing');
239
+ const deadline = options.deadline ?? Math.min(now + 3600, job.expiredAt);
240
+ if (!Number.isSafeInteger(deadline) ||
241
+ deadline <= now ||
242
+ deadline >= 2 ** 48)
243
+ throw new errors_1.MarketError('INVALID_DEADLINE', 'The intent deadline must be a future uint48 timestamp.');
244
+ const request = {
245
+ cardId,
246
+ owner,
247
+ index,
248
+ job,
249
+ deadline,
250
+ signerChainId: BigInt(rawChain.split(':')[1]),
251
+ };
252
+ const [intent, [mode, calldata]] = await Promise.all([
253
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'previewIntent', [
254
+ request,
255
+ session,
256
+ ]),
257
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'buildCreateJobCalldata', [
258
+ cardId,
259
+ owner,
260
+ index,
261
+ job,
262
+ ]),
263
+ ]);
264
+ const spec = (0, helpers_1.resolveJobSpec)(card.jobSpecTemplate, {
265
+ principal: job.principal,
266
+ params: job.params,
267
+ accounts,
268
+ origin: (0, helpers_1.specOrigin)(d.marketplace, cardId, card.version, job.principal),
269
+ executeBy: job.executeBy,
270
+ settleWindow: card.settleWindow,
271
+ });
272
+ if ((0, viem_1.getAddress)(intent.owner) !== owner ||
273
+ intent.index !== index ||
274
+ intent.deadline !== deadline ||
275
+ intent.signerChainId !== request.signerChainId)
276
+ throw new errors_1.MarketError('INTENT_MISMATCH', 'The preview intent names a different owner, wallet index, chain or deadline.');
277
+ const bytes = (0, codec_1.encodeJobSpec)(spec);
278
+ const packedTarget = (0, viem_1.getAddress)(('0x' + calldata.slice(2, 42)));
279
+ const kernelCall = (0, kernel_wire_1.decodeCreateJob)(('0x' + calldata.slice(106)));
280
+ if (packedTarget !== (0, viem_1.getAddress)(d.kernel) ||
281
+ BigInt('0x' + calldata.slice(42, 106)) !== BigInt(0) ||
282
+ kernelCall.description !== bytes ||
283
+ (0, viem_1.getAddress)(kernelCall.provider) !== (0, viem_1.getAddress)(card.provider) ||
284
+ (0, viem_1.getAddress)(kernelCall.evaluator) !== (0, viem_1.getAddress)(evaluator) ||
285
+ (0, viem_1.getAddress)(kernelCall.hook) !== (0, viem_1.getAddress)(hook) ||
286
+ kernelCall.expiredAt !== BigInt(job.expiredAt) ||
287
+ intent.execCalldataHash !== (0, viem_1.keccak256)(calldata) ||
288
+ intent.sessionHash !== (0, viem_1.keccak256)((0, session_1.encodeSession)(session)) ||
289
+ intent.mode !== mode ||
290
+ (0, viem_1.getAddress)(intent.wallet) !== (0, viem_1.getAddress)(wallet) ||
291
+ (0, viem_1.getAddress)(intent.executor) !== (0, viem_1.getAddress)(d.marketplace))
292
+ throw new errors_1.MarketError('INTENT_MISMATCH', 'The marketplace preview disagrees with the independently built job or permissions.');
293
+ await s.read(d.rules, UniversalMarketplaceRules_1.MARKET_RULES_ABI, 'checkRulesMatchCard', [
294
+ card.rulesBytes,
295
+ session,
296
+ {
297
+ agent: card.provider,
298
+ chainHash: (0, viem_1.keccak256)((0, viem_1.stringToHex)(card.chain)),
299
+ principal: job.principal,
300
+ expiredAt: job.expiredAt,
301
+ expectedCEA: accounts[card.chain],
302
+ },
303
+ ]);
304
+ const label = options.label ?? 'Agent job';
305
+ (0, label_1.assertLabel)(label);
306
+ const description = (0, helpers_1.describeJobSpec)(spec);
307
+ return {
308
+ cardId,
309
+ cardVersion: card.version,
310
+ wallet: (0, viem_1.getAddress)(wallet),
311
+ walletDeployed: deployed,
312
+ session,
313
+ intent,
314
+ calldata,
315
+ jobSpec: { spec, bytes },
316
+ job,
317
+ label,
318
+ deposit: {
319
+ principal: {
320
+ prc20: terms.assets[rules.principalAsset].token,
321
+ amount: job.principal,
322
+ },
323
+ providerFee: { token: card.paymentToken, amount: card.providerFee },
324
+ pc: card.rules.maxGasPerCall,
325
+ },
326
+ preview: {
327
+ mayDo: terms.allowedCalls.map((c) => `${card.chain}: ${c.target} ${c.selector}; ${c.pins.length} argument conditions; max value ${c.maxValue}.`),
328
+ mayMove: terms.assets.map((a) => `${a.token}: up to ${a.maxPerCall} per outbound, ${a.maxTotal} total; gas budget ${terms.maxGasPerCall} PC wei.`),
329
+ judgedBy: [...description.checks, description.logic],
330
+ until: new Date(job.expiredAt * 1000).toISOString(),
331
+ },
332
+ };
333
+ }
334
+ async openJob(plan, options = {}) {
335
+ plan = (0, data_1.copyData)(plan);
336
+ options = { ...options };
337
+ if (options.relay)
338
+ (0, errors_1.unavailable)('Marketplace relaying');
339
+ if (options.resume)
340
+ return this.openedResult(plan, options.resume, true);
341
+ if (this.rt.agw.isReadOnly)
342
+ throw new errors_1.MarketError('READ_ONLY', 'Connect a signing wallet to open a job.');
343
+ if (this.rt.canSignTypedData?.() === false)
344
+ (0, errors_1.unavailable)('EIP-712 signing with this wallet');
345
+ if (!this.rt.agw.reader.call)
346
+ (0, errors_1.unavailable)('Signed marketplace transaction simulation with this reader');
347
+ const ownerCode = await this.rt.agw.reader.getCode({
348
+ address: this.rt.agw.signerPushAccount(),
349
+ });
350
+ if (!this.rt.agw.signerIsPushNative() && (!ownerCode || ownerCode === '0x'))
351
+ throw new errors_1.MarketError('OWNER_NOT_DEPLOYED', 'Deploy the connected signer’s UEA on Push before signing a marketplace intent.');
352
+ const fresh = await this.preview(plan.cardId, {
353
+ ...plan.job,
354
+ walletIndex: Number(plan.intent.index),
355
+ deadline: plan.intent.deadline,
356
+ label: plan.label,
357
+ });
358
+ if ((0, data_1.fingerprint)(fresh) !== (0, data_1.fingerprint)(plan))
359
+ throw new errors_1.MarketError('STALE_PLAN', 'The plan changed. Preview and review it again before signing.');
360
+ const d = (0, runtime_1.deployment)(this.rt);
361
+ const gen = (0, deployments_1.currentGeneration)(this.rt.agw.network);
362
+ (0, runtime_1.progress)(this.rt, options.progressHook, 'MARKET-TX-101', 'Plan verified', {
363
+ cardId: plan.cardId,
364
+ wallet: plan.wallet,
365
+ });
366
+ const domain = {
367
+ name: 'AGWFactory',
368
+ version: '1',
369
+ chainId: Number(plan.intent.signerChainId),
370
+ verifyingContract: gen.addresses.factory,
371
+ salt: (0, viem_1.toHex)(BigInt(this.rt.agw.pushChainNamespace.split(':')[1]), {
372
+ size: 32,
373
+ }),
374
+ };
375
+ const separator = await (await (0, runtime_1.snapshot)(this.rt)).read(gen.addresses.factory, gen.contracts.abis.factory, 'domainSeparator', [plan.intent.signerChainId]);
376
+ if (separator.toLowerCase() !== (0, viem_1.domainSeparator)({ domain }).toLowerCase())
377
+ throw new errors_1.MarketError('INTENT_MISMATCH', 'The factory EIP-712 domain differs from the signing domain.');
378
+ let sig;
379
+ try {
380
+ sig = (await this.rt.signTypedData({
381
+ domain,
382
+ types: { OwnerIntent: ownerIntentFields },
383
+ primaryType: 'OwnerIntent',
384
+ message: { ...plan.intent },
385
+ }));
386
+ }
387
+ catch (error) {
388
+ throw (0, errors_1.stackError)(error);
389
+ }
390
+ (0, runtime_1.progress)(this.rt, options.progressHook, 'MARKET-TX-102', 'Owner intent signed');
391
+ const call = {
392
+ target: d.marketplace,
393
+ value: BigInt(0),
394
+ data: (0, viem_1.encodeFunctionData)({
395
+ abi: UniversalMarketplace_1.MARKETPLACE_ABI,
396
+ functionName: 'openJob',
397
+ args: [
398
+ {
399
+ cardId: plan.cardId,
400
+ cardVersion: plan.cardVersion,
401
+ job: plan.job,
402
+ session: plan.session,
403
+ intent: plan.intent,
404
+ sig,
405
+ label: plan.label,
406
+ },
407
+ ],
408
+ }),
409
+ };
410
+ try {
411
+ // Runs the actual factory, owner verifier (UEA / ERC-1271 / EOA), grant and kernel create.
412
+ // This catches unsupported 7702 delegates without spending gas or bypassing owner verification.
413
+ await this.rt.agw.reader.call({
414
+ to: call.target,
415
+ data: call.data,
416
+ account: this.rt.agw.signerPushAccount(),
417
+ });
418
+ }
419
+ catch (cause) {
420
+ throw new errors_1.MarketError('OPEN_JOB_SIMULATION_FAILED', 'The signed marketplace request failed simulation. No transaction was submitted.', { contractError: (0, errors_1.stackError)(cause) }, cause);
421
+ }
422
+ const tx = await (0, runtime_1.write)(this.rt, call, options.progressHook, 'MARKET', true);
423
+ return this.openedResult(plan, tx);
424
+ }
425
+ async openedResult(plan, tx, recover = false) {
426
+ try {
427
+ return await this.verifyOpening(plan, tx, recover);
428
+ }
429
+ catch (cause) {
430
+ if (cause instanceof errors_1.MarketError && cause.details?.['txHash'])
431
+ throw cause;
432
+ throw new errors_1.MarketError('OPEN_JOB_RECOVERY_REQUIRED', 'The opening was submitted but could not be fully verified. Track this transaction and resume with the original plan before opening again.', { txHash: tx.hash }, cause);
433
+ }
434
+ }
435
+ async verifyOpening(plan, tx, recover) {
436
+ const d = (0, runtime_1.deployment)(this.rt);
437
+ const gen = (0, deployments_1.currentGeneration)(this.rt.agw.network);
438
+ const e = await (0, runtime_1.eventArgs)(this.rt, tx, d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'JobOpened');
439
+ const [agent] = (0, viem_1.decodeAbiParameters)([{ type: 'address' }], plan.session.sessionValidatorInitData);
440
+ const expectedRules = (0, ids_1.rulesId)({
441
+ validator: gen.addresses.sessionValidator,
442
+ agent,
443
+ grantNonce: plan.intent.grantNonce,
444
+ });
445
+ if (e['cardId'] !== plan.cardId ||
446
+ e['cardVersion'] !== plan.cardVersion ||
447
+ (0, viem_1.getAddress)(e['agw']) !== plan.wallet ||
448
+ e['principal'] !== plan.job.principal ||
449
+ (0, viem_1.getAddress)(e['owner']) !== (0, viem_1.getAddress)(plan.intent.owner) ||
450
+ e['rulesId'] !== expectedRules ||
451
+ (0, viem_1.getAddress)(plan.session.sessionValidator) !==
452
+ (0, viem_1.getAddress)(gen.addresses.sessionValidator) ||
453
+ plan.intent.sessionHash !== (0, viem_1.keccak256)((0, session_1.encodeSession)(plan.session)) ||
454
+ plan.intent.execCalldataHash !== (0, viem_1.keccak256)(plan.calldata))
455
+ throw new errors_1.MarketError('RECEIPT_MISMATCH', 'The opened job does not match the signed plan.', { txHash: tx.hash });
456
+ const jobId = e['jobId'];
457
+ const s = await (0, runtime_1.snapshot)(this.rt);
458
+ const [cardId, version, wallet, rules, job, owner] = await Promise.all([
459
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'cardOfJob', [jobId]),
460
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'cardVersionOfJob', [jobId]),
461
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'agwOfJob', [jobId]),
462
+ s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'rulesOfJob', [jobId]),
463
+ s.read(d.kernel, kernel_wire_1.KERNEL_READ_ABI, 'getJob', [jobId]),
464
+ s.read(gen.addresses.factory, gen.contracts.abis.factory, 'ownerOf', [plan.wallet]),
465
+ ]);
466
+ const creation = (0, kernel_wire_1.decodeCreateJob)(('0x' + plan.calldata.slice(106)));
467
+ if (cardId !== plan.cardId ||
468
+ version !== plan.cardVersion ||
469
+ (0, viem_1.getAddress)(wallet) !== (0, viem_1.getAddress)(plan.wallet) ||
470
+ rules !== expectedRules ||
471
+ (0, viem_1.getAddress)(owner) !== (0, viem_1.getAddress)(plan.intent.owner) ||
472
+ (0, viem_1.getAddress)(job.client) !== (0, viem_1.getAddress)(plan.wallet) ||
473
+ (0, viem_1.getAddress)(job.provider) !== (0, viem_1.getAddress)(agent) ||
474
+ (0, viem_1.getAddress)(job.evaluator) !== (0, viem_1.getAddress)(creation.evaluator) ||
475
+ (0, viem_1.getAddress)(job.hook) !== (0, viem_1.getAddress)(creation.hook) ||
476
+ job.expiredAt !== plan.job.expiredAt ||
477
+ job.description !== plan.jobSpec.bytes)
478
+ throw new errors_1.MarketError('RECEIPT_MISMATCH', 'The kernel, wallet and marketplace mappings do not match the opening.', { txHash: tx.hash, jobId });
479
+ if (recover) {
480
+ if (!this.rt.agw.reader.getTransaction)
481
+ throw new errors_1.MarketError('HISTORY_UNAVAILABLE', 'This reader cannot load the submitted opening input.', { txHash: tx.hash });
482
+ const transaction = await this.rt.agw.reader.getTransaction({
483
+ hash: tx.hash,
484
+ });
485
+ const matched = (0, data_1.embeddedCalls)(transaction.input, UniversalMarketplace_1.MARKETPLACE_ABI, 'openJob').some(([value]) => {
486
+ const p = value;
487
+ return (p.cardId === plan.cardId &&
488
+ p.cardVersion === plan.cardVersion &&
489
+ (0, data_1.fingerprint)(p.job) === (0, data_1.fingerprint)(plan.job) &&
490
+ (0, data_1.fingerprint)(p.intent) === (0, data_1.fingerprint)(plan.intent) &&
491
+ (0, session_1.encodeSession)(p.session) === (0, session_1.encodeSession)(plan.session));
492
+ });
493
+ if (!matched)
494
+ throw new errors_1.MarketError('RECEIPT_MISMATCH', 'The submitted input does not contain this reviewed opening.', { txHash: tx.hash, jobId });
495
+ }
496
+ return {
497
+ jobId,
498
+ wallet: (0, viem_1.getAddress)(e['agw']),
499
+ rulesId: e['rulesId'],
500
+ tx,
501
+ };
502
+ }
503
+ async deposit(jobId, options = {}) {
504
+ options = { ...options, resume: options.resume && [...options.resume] };
505
+ if (this.deposits.has(jobId))
506
+ throw new errors_1.MarketError('DEPOSIT_IN_PROGRESS', 'A deposit for this job is already running on this client.');
507
+ this.deposits.add(jobId);
508
+ try {
509
+ return await (0, deposit_1.depositJob)(this.rt, jobId, options, (id, s) => this.cardAt(id, s), this.depositCheckpoints);
510
+ }
511
+ finally {
512
+ this.deposits.delete(jobId);
513
+ }
514
+ }
515
+ agent = {
516
+ card: async () => {
517
+ const d = (0, runtime_1.deployment)(this.rt);
518
+ const s = await (0, runtime_1.snapshot)(this.rt);
519
+ const n = await s.read(d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, 'agentCardOf', [
520
+ this.rt.agw.signerPushAccount(),
521
+ ]);
522
+ return n ? this.cardAt(n, s) : undefined;
523
+ },
524
+ register: async (card, options) => this.cardWrite(undefined, card, options),
525
+ update: async (cardId, card, options) => this.cardWrite(cardId, card, options),
526
+ setActive: async (cardId, active, options = {}) => {
527
+ const card = await this.summaryAt(cardId, await (0, runtime_1.snapshot)(this.rt));
528
+ this.assertProvider(card);
529
+ const d = (0, runtime_1.deployment)(this.rt);
530
+ return (0, runtime_1.write)(this.rt, {
531
+ target: d.marketplace,
532
+ value: BigInt(0),
533
+ data: (0, viem_1.encodeFunctionData)({
534
+ abi: UniversalMarketplace_1.MARKETPLACE_ABI,
535
+ functionName: 'setAgentCardActive',
536
+ args: [cardId, active],
537
+ }),
538
+ }, options.progressHook, 'MARKET', true);
539
+ },
540
+ };
541
+ assertProvider(card) {
542
+ if ((0, viem_1.getAddress)(card.provider) !== (0, viem_1.getAddress)(this.rt.agw.signerPushAccount()))
543
+ throw new errors_1.MarketError('NOT_CARD_PROVIDER', 'Connect the provider that registered this card.');
544
+ }
545
+ async cardWrite(cardId, card, options) {
546
+ const d = (0, runtime_1.deployment)(this.rt);
547
+ card = { ...card };
548
+ options = { ...options };
549
+ const rules = (0, rules_1.encodeAgentCardRules)(options.rules, {
550
+ chain: card.chain,
551
+ network: this.rt.agw.network,
552
+ });
553
+ const template = (0, codec_1.encodeJobSpec)(options.jobSpecTemplate);
554
+ const mutability = options.jobSpecTemplate.allowedMutability;
555
+ const s = await (0, runtime_1.snapshot)(this.rt);
556
+ if (!card.jobType ||
557
+ !/^eip155:[1-9]\d*$/.test(card.chain) ||
558
+ !card.metadataURI ||
559
+ !/^0x[\da-f]{64}$/i.test(card.metadataHash) ||
560
+ /^0x0{64}$/i.test(card.metadataHash))
561
+ throw new errors_1.MarketError('INVALID_AGENT_CARD', 'Supply a job type, EVM execution chain, metadata URI and nonzero metadata hash.');
562
+ for (const v of [card.providerFee, card.principalMin, card.principalMax])
563
+ if (typeof v !== 'bigint' ||
564
+ v < BigInt(0) ||
565
+ v >= BigInt(1) << BigInt(256))
566
+ throw new errors_1.MarketError('INVALID_AGENT_CARD', 'Card amounts must fit uint256.');
567
+ if (card.principalMax === BigInt(0) ||
568
+ card.principalMin > card.principalMax ||
569
+ [
570
+ card.minDuration,
571
+ card.maxDuration,
572
+ card.minExecuteWindow,
573
+ card.settleWindow,
574
+ ].some((n) => !Number.isInteger(n) || n < 0 || n > 0xffffffff) ||
575
+ card.minDuration < 3600 ||
576
+ card.minDuration > card.maxDuration ||
577
+ card.settleWindow < 1 ||
578
+ card.minExecuteWindow + card.settleWindow > card.maxDuration)
579
+ throw new errors_1.MarketError('INVALID_AGENT_CARD', 'The principal or duration ranges are invalid.');
580
+ if (cardId !== undefined) {
581
+ const current = await this.summaryAt(cardId, s);
582
+ this.assertProvider(current);
583
+ if (current.chain !== card.chain)
584
+ throw new errors_1.MarketError('CARD_IDENTITY_IMMUTABLE', 'An existing card cannot change its execution chain.');
585
+ }
586
+ if (mutability !== 'NONE')
587
+ (0, errors_1.unavailable)('Mutable marketplace criteria');
588
+ const token = await s.read(d.kernel, AgenticCommerce_1.JOB_KERNEL_ABI, 'paymentToken');
589
+ if ((0, viem_1.getAddress)(card.paymentToken) !== (0, viem_1.getAddress)(token))
590
+ throw new errors_1.MarketError('TOKEN_MISMATCH', 'This deployment accepts only the kernel payment token.');
591
+ const { chain, ...input } = card;
592
+ const jobType = /^0x[\da-f]{64}$/i.test(card.jobType)
593
+ ? card.jobType
594
+ : (0, viem_1.keccak256)((0, viem_1.stringToHex)(card.jobType));
595
+ const c = {
596
+ ...input,
597
+ jobType,
598
+ chainNamespace: chain,
599
+ provider: this.rt.agw.signerPushAccount(),
600
+ active: true,
601
+ };
602
+ const data = cardId === undefined
603
+ ? (0, viem_1.encodeFunctionData)({
604
+ abi: UniversalMarketplace_1.MARKETPLACE_ABI,
605
+ functionName: 'registerAgentCard',
606
+ args: [c, rules, template],
607
+ })
608
+ : (0, viem_1.encodeFunctionData)({
609
+ abi: UniversalMarketplace_1.MARKETPLACE_ABI,
610
+ functionName: 'updateAgentCard',
611
+ args: [cardId, c, rules, template],
612
+ });
613
+ if (this.rt.agw.reader.call) {
614
+ try {
615
+ await this.rt.agw.reader.call({
616
+ to: d.marketplace,
617
+ data,
618
+ account: this.rt.agw.signerPushAccount(),
619
+ });
620
+ }
621
+ catch (cause) {
622
+ throw new errors_1.MarketError('CARD_SIMULATION_FAILED', 'The card write failed contract simulation. No transaction was submitted.', { contractError: (0, errors_1.stackError)(cause) }, cause);
623
+ }
624
+ }
625
+ const tx = await (0, runtime_1.write)(this.rt, { target: d.marketplace, value: BigInt(0), data }, options.progressHook, 'MARKET', true);
626
+ const e = await (0, runtime_1.eventArgs)(this.rt, tx, d.marketplace, UniversalMarketplace_1.MARKETPLACE_ABI, cardId === undefined ? 'AgentCardRegistered' : 'AgentCardUpdated');
627
+ return {
628
+ cardId: e['cardId'],
629
+ version: cardId === undefined ? BigInt(1) : e['version'],
630
+ tx,
631
+ };
632
+ }
633
+ }
634
+ exports.MarketNamespaceImpl = MarketNamespaceImpl;
635
+ //# sourceMappingURL=market.js.map