@pushchain/core 6.0.27-alpha.2 → 6.0.27-alpha.4

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 (99) hide show
  1. package/AGW.md +83 -7
  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/prc20-metadata.d.ts +1 -1
  10. package/src/lib/agentic/contracts/prc20-metadata.js +11 -5
  11. package/src/lib/agentic/contracts/reader.d.ts +21 -0
  12. package/src/lib/agentic/contracts/reader.js +3 -0
  13. package/src/lib/agentic/error-messages.d.ts +3 -0
  14. package/src/lib/agentic/error-messages.js +125 -0
  15. package/src/lib/agentic/errors.d.ts +12 -3
  16. package/src/lib/agentic/errors.js +76 -0
  17. package/src/lib/agentic/management/common.js +6 -0
  18. package/src/lib/agentic/management/destination.d.ts +5 -0
  19. package/src/lib/agentic/management/destination.js +32 -0
  20. package/src/lib/agentic/management/prepare.js +80 -55
  21. package/src/lib/agentic/management/svm-public.js +13 -4
  22. package/src/lib/agentic/presets/catalog.d.ts +2 -0
  23. package/src/lib/agentic/presets/catalog.js +9 -0
  24. package/src/lib/agentic/presets/default-policy.d.ts +9 -0
  25. package/src/lib/agentic/presets/default-policy.js +85 -0
  26. package/src/lib/agentic/presets/default-tokens.d.ts +4 -0
  27. package/src/lib/agentic/presets/default-tokens.js +39 -0
  28. package/src/lib/agentic/presets/index.js +47 -22
  29. package/src/lib/agentic/presets/routes.d.ts +9 -0
  30. package/src/lib/agentic/presets/routes.js +50 -0
  31. package/src/lib/agentic/presets/types.d.ts +24 -8
  32. package/src/lib/agentic/public-rule.js +13 -2
  33. package/src/lib/constants/index.d.ts +35 -0
  34. package/src/lib/index.d.ts +4 -0
  35. package/src/lib/index.js +6 -2
  36. package/src/lib/job/job.d.ts +35 -0
  37. package/src/lib/job/job.js +382 -0
  38. package/src/lib/job/types.d.ts +94 -0
  39. package/src/lib/job/types.js +3 -0
  40. package/src/lib/job/watch.d.ts +3 -0
  41. package/src/lib/job/watch.js +169 -0
  42. package/src/lib/job-spec/codec.d.ts +18 -0
  43. package/src/lib/job-spec/codec.js +348 -0
  44. package/src/lib/job-spec/constants.d.ts +32 -0
  45. package/src/lib/job-spec/constants.js +36 -0
  46. package/src/lib/job-spec/helpers.d.ts +19 -0
  47. package/src/lib/job-spec/helpers.js +138 -0
  48. package/src/lib/job-spec/index.d.ts +14 -0
  49. package/src/lib/job-spec/index.js +17 -0
  50. package/src/lib/job-spec/preview.d.ts +8 -0
  51. package/src/lib/job-spec/preview.js +298 -0
  52. package/src/lib/job-spec/read.d.ts +20 -0
  53. package/src/lib/job-spec/read.js +224 -0
  54. package/src/lib/job-spec/schema.d.ts +290 -0
  55. package/src/lib/job-spec/schema.js +70 -0
  56. package/src/lib/job-spec/types.d.ts +139 -0
  57. package/src/lib/job-spec/types.js +3 -0
  58. package/src/lib/market/contracts/AgenticCommerce.d.ts +1026 -0
  59. package/src/lib/market/contracts/AgenticCommerce.js +1317 -0
  60. package/src/lib/market/contracts/RulesBindingHook.d.ts +235 -0
  61. package/src/lib/market/contracts/RulesBindingHook.js +314 -0
  62. package/src/lib/market/contracts/UniversalMarketplace.d.ts +1770 -0
  63. package/src/lib/market/contracts/UniversalMarketplace.js +2295 -0
  64. package/src/lib/market/contracts/UniversalMarketplaceErrors.d.ts +309 -0
  65. package/src/lib/market/contracts/UniversalMarketplaceErrors.js +416 -0
  66. package/src/lib/market/contracts/UniversalMarketplaceRules.d.ts +241 -0
  67. package/src/lib/market/contracts/UniversalMarketplaceRules.js +323 -0
  68. package/src/lib/market/data.d.ts +8 -0
  69. package/src/lib/market/data.js +60 -0
  70. package/src/lib/market/deployment.d.ts +14 -0
  71. package/src/lib/market/deployment.js +23 -0
  72. package/src/lib/market/deposit.d.ts +24 -0
  73. package/src/lib/market/deposit.js +271 -0
  74. package/src/lib/market/errors.d.ts +13 -0
  75. package/src/lib/market/errors.js +81 -0
  76. package/src/lib/market/history.d.ts +6 -0
  77. package/src/lib/market/history.js +83 -0
  78. package/src/lib/market/index.d.ts +4 -0
  79. package/src/lib/market/index.js +12 -0
  80. package/src/lib/market/kernel-wire.d.ts +15 -0
  81. package/src/lib/market/kernel-wire.js +41 -0
  82. package/src/lib/market/market.d.ts +55 -0
  83. package/src/lib/market/market.js +635 -0
  84. package/src/lib/market/rules.d.ts +106 -0
  85. package/src/lib/market/rules.js +293 -0
  86. package/src/lib/market/runtime.d.ts +35 -0
  87. package/src/lib/market/runtime.js +130 -0
  88. package/src/lib/market/types.d.ts +180 -0
  89. package/src/lib/market/types.js +3 -0
  90. package/src/lib/orchestrator/internals/errors.d.ts +9 -2
  91. package/src/lib/orchestrator/internals/errors.js +9 -2
  92. package/src/lib/orchestrator/internals/push-chain-tx.js +17 -3
  93. package/src/lib/push-chain/push-chain.d.ts +44 -1
  94. package/src/lib/push-chain/push-chain.js +23 -3
  95. package/src/lib/read-state/read-params.d.ts +9 -0
  96. package/src/lib/read-state/read-params.js +5 -1
  97. package/src/lib/universal/prc20-address.js +18 -4
  98. package/src/lib/utils.d.ts +15 -0
  99. package/src/lib/utils.js +4 -0
@@ -12,72 +12,97 @@ const universal_1 = require("../codec/universal");
12
12
  const deployments_1 = require("../deployments");
13
13
  const capabilities_1 = require("../capabilities");
14
14
  const errors_1 = require("../errors");
15
+ const destination_1 = require("./destination");
15
16
  const prc20_metadata_1 = require("../contracts/prc20-metadata");
16
17
  /** Resolve wallet-dependent wire inputs without signing or mutating authority. */
17
18
  async function prepareWalletRules(runtime, gen, owner, wallet, inputs, snap) {
18
- const rules = await Promise.all(inputs.map((rule) => (0, public_rule_1.isPublicRule)(rule) ? (0, public_rule_1.normalizePublicRule)(rule, wallet, runtime) : rule));
19
+ const rules = await Promise.all(inputs.map(async (rule, ruleIndex) => {
20
+ try {
21
+ return (0, public_rule_1.isPublicRule)(rule)
22
+ ? await (0, public_rule_1.normalizePublicRule)(rule, wallet, runtime)
23
+ : rule;
24
+ }
25
+ catch (error) {
26
+ throw (0, errors_1.ruleErrorContext)(error, ruleIndex, rule?.chainNamespace);
27
+ }
28
+ }));
19
29
  if (rules.length)
20
30
  await (0, deployments_1.verifyPolicyVersion)(runtime.reader, gen);
21
31
  const svm = new Map();
22
32
  const universal = new Map();
23
- for (const rule of rules) {
24
- if (rule && (0, rules_1.isSolanaRule)(rule)) {
25
- (0, capabilities_1.requireCapability)(gen.capabilities, capabilities_1.AgenticCapability.UNIVERSAL_SVM_RULES);
26
- svm.set(rule, await (0, svm_public_1.preparePublicSvmRule)(runtime, snap, wallet, rule));
27
- continue;
28
- }
29
- if (!(0, rules_1.isUniversalRule)(rule))
30
- continue;
31
- if (rule.chainNamespace.startsWith('solana:'))
32
- (0, capabilities_1.requireCapability)(gen.capabilities, capabilities_1.AgenticCapability.UNIVERSAL_SVM_RULES);
33
- (0, universal_1.validateUniversalRuleShape)(rule, runtime.nowSeconds());
34
- (0, capabilities_1.requireCapability)(gen.capabilities, rule.chainNamespace.startsWith('solana:')
35
- ? capabilities_1.AgenticCapability.UNIVERSAL_SVM_RULES
36
- : capabilities_1.AgenticCapability.UNIVERSAL_EVM_RULES);
37
- const chain = rule.chainNamespace;
38
- if (chain_1.CHAIN_INFO[chain]?.vm !== enums_1.VM.EVM)
39
- throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.INVALID_RULE, `unsupported EVM rule chain ${chain}`);
40
- const { cea } = await runtime.resolveCEA(wallet, chain);
41
- const assets = rule.assets.length
42
- ? rule.assets.map((a) => ({
43
- token: typeof a.token === 'string' && (0, viem_1.getAddress)(a.token) === viem_1.zeroAddress
44
- ? undefined
45
- : a.token,
46
- maxPerCall: a.maxPerCall,
47
- maxTotal: (0, defaults_1.withDefault)(a.maxTotal, defaults_1.AGENTIC_DEFAULTS.universal.assetMaxTotal),
48
- }))
49
- : [{ token: undefined, maxPerCall: BigInt(0), maxTotal: BigInt(0) }];
50
- const resolved = [];
51
- for (const asset of assets) {
52
- const token = asset.token === undefined
53
- ? await (0, prc20_metadata_1.readGasPrc20)(snap, chain)
54
- : runtime.resolvePrc20(asset.token, chain);
55
- if (token === viem_1.zeroAddress)
56
- throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.INVALID_RULE, `no gas PRC20 registered for ${chain}`);
57
- const namespace = await snap.read(token, prc20_metadata_1.PRC20_SOURCE_ABI, 'SOURCE_CHAIN_NAMESPACE');
58
- if (namespace !== chain)
59
- throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.ASSET_CHAIN_MISMATCH, `PRC20 ${token} belongs to ${namespace}, not ${chain}`);
60
- if (asset.token !== undefined) {
61
- const expected = typeof asset.token === 'string'
62
- ? (0, viem_1.getAddress)(asset.token)
63
- : (0, viem_1.getAddress)(asset.token.address);
64
- if (expected === viem_1.zeroAddress) {
65
- if ((await (0, prc20_metadata_1.readGasPrc20)(snap, chain)) !== (0, viem_1.getAddress)(token))
66
- throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.INVALID_RULE, 'resolved token is not the registered native gas token');
67
- }
33
+ for (const [ruleIndex, rule] of rules.entries()) {
34
+ try {
35
+ if (rule && (0, rules_1.isSolanaRule)(rule)) {
36
+ (0, capabilities_1.requireCapability)(gen.capabilities, capabilities_1.AgenticCapability.UNIVERSAL_SVM_RULES);
37
+ svm.set(rule, await (0, svm_public_1.preparePublicSvmRule)(runtime, snap, wallet, rule));
38
+ continue;
39
+ }
40
+ if (!(0, rules_1.isUniversalRule)(rule))
41
+ continue;
42
+ if (rule.chainNamespace.startsWith('solana:'))
43
+ (0, capabilities_1.requireCapability)(gen.capabilities, capabilities_1.AgenticCapability.UNIVERSAL_SVM_RULES);
44
+ (0, universal_1.validateUniversalRuleShape)(rule, runtime.nowSeconds());
45
+ (0, capabilities_1.requireCapability)(gen.capabilities, rule.chainNamespace.startsWith('solana:')
46
+ ? capabilities_1.AgenticCapability.UNIVERSAL_SVM_RULES
47
+ : capabilities_1.AgenticCapability.UNIVERSAL_EVM_RULES);
48
+ const chain = rule.chainNamespace;
49
+ if (chain_1.CHAIN_INFO[chain]?.vm !== enums_1.VM.EVM)
50
+ throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.INVALID_RULE, `unsupported EVM rule chain ${chain}`);
51
+ const cea = await (0, destination_1.resolveRuleDestination)(runtime, wallet, chain);
52
+ const assets = rule.assets.length
53
+ ? rule.assets.map((a) => ({
54
+ token: typeof a.token === 'string' && (0, viem_1.getAddress)(a.token) === viem_1.zeroAddress
55
+ ? undefined
56
+ : a.token,
57
+ maxPerCall: a.maxPerCall,
58
+ maxTotal: (0, defaults_1.withDefault)(a.maxTotal, defaults_1.AGENTIC_DEFAULTS.universal.assetMaxTotal),
59
+ }))
60
+ : [{ token: undefined, maxPerCall: BigInt(0), maxTotal: BigInt(0) }];
61
+ const resolved = [];
62
+ for (const [assetIndex, asset] of assets.entries()) {
63
+ let token;
64
+ if (asset.token === undefined)
65
+ token = await (0, prc20_metadata_1.readGasPrc20)(snap, chain);
68
66
  else {
69
- const source = await (0, prc20_metadata_1.readOriginToken)(snap, token, chain);
70
- if (source !== expected)
71
- throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.INVALID_RULE, `PRC20 ${token} represents ${source}, not requested token ${expected}`);
67
+ try {
68
+ token = runtime.resolvePrc20(asset.token, chain);
69
+ }
70
+ catch (cause) {
71
+ throw (0, errors_1.tokenRouteUnavailable)(cause, typeof asset.token === 'string'
72
+ ? asset.token
73
+ : asset.token.address, chain, assetIndex);
74
+ }
75
+ }
76
+ if (token === viem_1.zeroAddress)
77
+ throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.INVALID_RULE, `no gas PRC20 registered for ${chain}`);
78
+ const namespace = await snap.read(token, prc20_metadata_1.PRC20_SOURCE_ABI, 'SOURCE_CHAIN_NAMESPACE');
79
+ if (namespace !== chain)
80
+ throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.ASSET_CHAIN_MISMATCH, `PRC20 ${token} belongs to ${namespace}, not ${chain}`);
81
+ if (asset.token !== undefined) {
82
+ const expected = typeof asset.token === 'string'
83
+ ? (0, viem_1.getAddress)(asset.token)
84
+ : (0, viem_1.getAddress)(asset.token.address);
85
+ if (expected === viem_1.zeroAddress) {
86
+ if ((await (0, prc20_metadata_1.readGasPrc20)(snap, chain)) !== (0, viem_1.getAddress)(token))
87
+ throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.INVALID_RULE, 'resolved token is not the registered native gas token');
88
+ }
89
+ else {
90
+ const source = await (0, prc20_metadata_1.readOriginToken)(snap, token, chain);
91
+ if (source !== expected)
92
+ throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.INVALID_RULE, `PRC20 ${token} represents ${source}, not requested token ${expected}`);
93
+ }
72
94
  }
95
+ resolved.push({
96
+ token: (0, viem_1.getAddress)(token),
97
+ maxPerCall: asset.maxPerCall,
98
+ maxTotal: asset.maxTotal,
99
+ });
73
100
  }
74
- resolved.push({
75
- token: (0, viem_1.getAddress)(token),
76
- maxPerCall: asset.maxPerCall,
77
- maxTotal: asset.maxTotal,
78
- });
101
+ universal.set(rule, { expectedCEA: (0, viem_1.getAddress)(cea), assets: resolved });
102
+ }
103
+ catch (error) {
104
+ throw (0, errors_1.ruleErrorContext)(error, ruleIndex, rule?.chainNamespace);
79
105
  }
80
- universal.set(rule, { expectedCEA: (0, viem_1.getAddress)(cea), assets: resolved });
81
106
  }
82
107
  return (0, rules_1.prepareRules)(rules, {
83
108
  owner,
@@ -36,6 +36,7 @@ const svm_accounts_1 = require("../codec/svm-accounts");
36
36
  const svm_idl_1 = require("../codec/svm-idl");
37
37
  const svm_terms_1 = require("../codec/svm-terms");
38
38
  const svm_terms_2 = require("../codec/svm-terms");
39
+ const errors_1 = require("../errors");
39
40
  function svmMetadata(runtime) {
40
41
  return (runtime.svmMetadata ??
41
42
  (0, svm_metadata_1.createSvmMetadataProvider)({
@@ -62,7 +63,7 @@ async function preparePublicSvmRule(runtime, snap, wallet, rule) {
62
63
  const caps = [];
63
64
  const tokenAccounts = new Map(), mints = new Set();
64
65
  const sources = [];
65
- for (const asset of requested) {
66
+ for (const [assetIndex, asset] of requested.entries()) {
66
67
  const source = typeof asset.token === 'string' ? asset.token : asset.token?.address;
67
68
  if (typeof source !== 'string')
68
69
  throw (0, svm_terms_1.svmInvalid)('asset token requires an address');
@@ -77,9 +78,17 @@ async function preparePublicSvmRule(runtime, snap, wallet, rule) {
77
78
  const sourceToken = typeof asset.token === 'string' && key
78
79
  ? new web3_js_1.PublicKey((0, viem_1.hexToBytes)(key)).toBase58()
79
80
  : asset.token;
80
- const token = native
81
- ? await (0, prc20_metadata_1.readGasPrc20)(snap, chain)
82
- : runtime.resolvePrc20(sourceToken, chain);
81
+ let token;
82
+ if (native)
83
+ token = await (0, prc20_metadata_1.readGasPrc20)(snap, chain);
84
+ else {
85
+ try {
86
+ token = runtime.resolvePrc20(sourceToken, chain);
87
+ }
88
+ catch (cause) {
89
+ throw (0, errors_1.tokenRouteUnavailable)(cause, source, chain, assetIndex);
90
+ }
91
+ }
83
92
  if (caps.some((c) => c.token === (0, viem_1.getAddress)(token)))
84
93
  throw (0, svm_terms_1.svmInvalid)('duplicate SVM asset');
85
94
  caps.push({
@@ -25,6 +25,8 @@ export interface PresetCallDefinition extends RuleCall {
25
25
  /** Internal catalog: reviewed addresses and explicit calls only; never fetched at runtime. */
26
26
  export interface PresetChainDefinition {
27
27
  chainNamespace: ForeignChainNamespace;
28
+ /** Used with the bundled permission policy only when assets is omitted. */
29
+ defaultTokens?: readonly Address[];
28
30
  allowedCalls: readonly PresetCallDefinition[];
29
31
  /** Static single-hop routers; incomplete pairs return zero-input-cap review calls. */
30
32
  swapRouters?: readonly {
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PRESET_CATALOG = void 0;
4
4
  const viem_1 = require("viem");
5
5
  const aave_reserves_1 = require("./aave-reserves");
6
+ const default_tokens_1 = require("./default-tokens");
6
7
  /** Mainnet and testnet templates from the October 15 Notion export and protocol sources.
7
8
  * Read-only deployment/code evidence and exclusions: plan/agw/research/preset-catalog-2026-10-15/.
8
9
  * Mainnet entries are templates only; no mainnet deployment or execution guarantee.
@@ -153,6 +154,7 @@ exports.PRESET_CATALOG = [
153
154
  ],
154
155
  ].map(([chain, router, app]) => ({
155
156
  chainNamespace: chain,
157
+ defaultTokens: default_tokens_1.DEX_DEFAULT_TOKENS[chain],
156
158
  allowedCalls: [],
157
159
  swapRouters: [{ address: address(router), app }],
158
160
  approvals: [{ spender: address(router), app }],
@@ -169,6 +171,7 @@ exports.PRESET_CATALOG = [
169
171
  ['eip155:56', '0x6807dc923806fE8Fd134338EABCA509979a7e0cB'],
170
172
  ].map(([chainNamespace, pool]) => ({
171
173
  chainNamespace,
174
+ defaultTokens: default_tokens_1.LENDING_DEFAULT_TOKENS[chainNamespace],
172
175
  allowedCalls: [
173
176
  ...aave(address(pool), chainNamespace),
174
177
  ...mainnetMarkets(chainNamespace).allowedCalls,
@@ -184,6 +187,7 @@ exports.PRESET_CATALOG = [
184
187
  })),
185
188
  {
186
189
  chainNamespace: 'eip155:11155111',
190
+ defaultTokens: default_tokens_1.LENDING_DEFAULT_TOKENS['eip155:11155111'],
187
191
  allowedCalls: aave(sepoliaPool, 'eip155:11155111'),
188
192
  approvals: [
189
193
  {
@@ -195,6 +199,7 @@ exports.PRESET_CATALOG = [
195
199
  },
196
200
  {
197
201
  chainNamespace: 'eip155:421614',
202
+ defaultTokens: default_tokens_1.LENDING_DEFAULT_TOKENS['eip155:421614'],
198
203
  allowedCalls: aave(arbitrumPool, 'eip155:421614'),
199
204
  approvals: [
200
205
  {
@@ -206,6 +211,7 @@ exports.PRESET_CATALOG = [
206
211
  },
207
212
  {
208
213
  chainNamespace: 'eip155:84532',
214
+ defaultTokens: default_tokens_1.LENDING_DEFAULT_TOKENS['eip155:84532'],
209
215
  allowedCalls: [
210
216
  ...aave(basePool, 'eip155:84532'),
211
217
  ...market(moonUSDBC, 'Moonwell mUSDbC', address('0x4616975f7E6045FD9737e95bC527e9e14c727BD2')),
@@ -238,6 +244,7 @@ exports.PRESET_CATALOG = [
238
244
  },
239
245
  {
240
246
  chainNamespace: 'eip155:97',
247
+ defaultTokens: default_tokens_1.LENDING_DEFAULT_TOKENS['eip155:97'],
241
248
  allowedCalls: [
242
249
  ...market(venusUSDT, 'Venus vUSDT', address('0xA11c8D9DC9b66E209Ef60F0C8D969D3CD988782c')),
243
250
  ...market(venusUSDC, 'Venus vUSDC', address('0x16227D60f7a0e586C66B005219dfc887D13C9531')),
@@ -270,6 +277,7 @@ exports.PRESET_CATALOG = [
270
277
  chains: [
271
278
  {
272
279
  chainNamespace: 'eip155:1',
280
+ defaultTokens: default_tokens_1.STAKING_DEFAULT_TOKENS['eip155:1'],
273
281
  allowedCalls: [
274
282
  {
275
283
  target: stETH,
@@ -333,6 +341,7 @@ exports.PRESET_CATALOG = [
333
341
  },
334
342
  {
335
343
  chainNamespace: 'eip155:11155111',
344
+ defaultTokens: default_tokens_1.STAKING_DEFAULT_TOKENS['eip155:11155111'],
336
345
  allowedCalls: [
337
346
  {
338
347
  target: eigen,
@@ -0,0 +1,9 @@
1
+ import type { Address } from 'viem';
2
+ import type { RuleAsset } from '../agentic.types';
3
+ /** Preset-only permission policy. Ordinary rule authoring retains zero defaults.
4
+ * Amounts are token quantities, not USD valuations or destination lifetime caps.
5
+ * Metadata verified read-only on October 18; evidence is retained under plan/agw/.
6
+ */
7
+ export declare const PRESET_VALIDITY_SECONDS: number;
8
+ export declare const PRESET_GAS_BUDGETS: Readonly<Record<string, bigint>>;
9
+ export declare function defaultPresetAsset(chain: string, token: Address): RuleAsset;
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PRESET_GAS_BUDGETS = exports.PRESET_VALIDITY_SECONDS = void 0;
4
+ exports.defaultPresetAsset = defaultPresetAsset;
5
+ const viem_1 = require("viem");
6
+ const errors_1 = require("../errors");
7
+ /** Preset-only permission policy. Ordinary rule authoring retains zero defaults.
8
+ * Amounts are token quantities, not USD valuations or destination lifetime caps.
9
+ * Metadata verified read-only on October 18; evidence is retained under plan/agw/.
10
+ */
11
+ exports.PRESET_VALIDITY_SECONDS = 7 * 24 * 60 * 60;
12
+ // Explicit profiles keep future chains from inheriting an unreviewed budget.
13
+ // 20 PC is a ceiling, not the amount charged: execution obtains a fresh quote.
14
+ // This budget has testnet protocol-flow coverage; mainnet remains template-only.
15
+ exports.PRESET_GAS_BUDGETS = Object.fromEntries([
16
+ 'eip155:1',
17
+ 'eip155:8453',
18
+ 'eip155:42161',
19
+ 'eip155:56',
20
+ 'eip155:11155111',
21
+ 'eip155:84532',
22
+ 'eip155:421614',
23
+ 'eip155:97',
24
+ ].map((chain) => [chain, (0, viem_1.parseUnits)('20', 18)]));
25
+ const stable6 = { decimals: 6, perCall: '10', total: '100' };
26
+ const stable18 = { ...stable6, decimals: 18 };
27
+ const eth = { decimals: 18, perCall: '0.001', total: '0.01' };
28
+ const bnb = { decimals: 18, perCall: '0.01', total: '0.1' };
29
+ const link = { decimals: 18, perCall: '1', total: '10' };
30
+ // Match by chain AND address. Never infer decimals or limits from a symbol,
31
+ // caller metadata, or the position of a token in an arbitrary selection.
32
+ const TOKEN_BUDGETS = {
33
+ 'eip155:1': [
34
+ ['0x0000000000000000000000000000000000000000', eth],
35
+ ['0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', eth],
36
+ ['0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48', stable6],
37
+ ['0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', eth],
38
+ ['0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0', eth],
39
+ ],
40
+ 'eip155:8453': [
41
+ ['0x4200000000000000000000000000000000000006', eth],
42
+ ['0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913', stable6],
43
+ ],
44
+ 'eip155:42161': [
45
+ ['0x82aF49447D8a07e3bd95BD0d56f35241523fBab1', eth],
46
+ ['0xaf88d065e77c8cC2239327C5EDb3A432268e5831', stable6],
47
+ ],
48
+ 'eip155:56': [
49
+ ['0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c', bnb],
50
+ ['0x55d398326f99059fF775485246999027B3197955', stable18],
51
+ ],
52
+ 'eip155:11155111': [
53
+ ['0xfff9976782d46cc05630d1f6ebab18b2324d6b14', eth],
54
+ ['0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238', stable6],
55
+ ['0xf8Fb3713D459D7C1018BD0A49D19b4C44290EBE5', link],
56
+ ['0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9', eth],
57
+ ],
58
+ 'eip155:84532': [
59
+ ['0x4200000000000000000000000000000000000006', eth],
60
+ ['0x036CbD53842c5426634e7929541eC2318f3dCF7e', stable6],
61
+ ['0x810D46F9a9027E28F9B01F75E2bdde839dA61115', link],
62
+ ['0x4616975f7E6045FD9737e95bC527e9e14c727BD2', stable6],
63
+ ['0x663A6F02d547dFd639BF689FED298712f2FB69Fb', eth],
64
+ ],
65
+ 'eip155:421614': [
66
+ ['0x980B62Da83eFf3D4576C647993b0c1D7faf17c73', eth],
67
+ ['0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d', stable6],
68
+ ],
69
+ 'eip155:97': [
70
+ ['0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd', bnb],
71
+ ['0xA11c8D9DC9b66E209Ef60F0C8D969D3CD988782c', stable6],
72
+ ['0x16227D60f7a0e586C66B005219dfc887D13C9531', stable6],
73
+ ],
74
+ };
75
+ function defaultPresetAsset(chain, token) {
76
+ const budget = TOKEN_BUDGETS[chain]?.find(([address]) => (0, viem_1.getAddress)(address) === (0, viem_1.getAddress)(token))?.[1];
77
+ if (!budget)
78
+ throw (0, errors_1.capabilityUnavailable)('presetPolicy', `No reviewed default spending policy for ${chain}:${token}`);
79
+ return {
80
+ token,
81
+ maxPerCall: (0, viem_1.parseUnits)(budget.perCall, budget.decimals),
82
+ maxTotal: (0, viem_1.parseUnits)(budget.total, budget.decimals),
83
+ };
84
+ }
85
+ //# sourceMappingURL=default-policy.js.map
@@ -0,0 +1,4 @@
1
+ import { type Address } from 'viem';
2
+ export declare const DEX_DEFAULT_TOKENS: Readonly<Record<string, readonly Address[]>>;
3
+ export declare const LENDING_DEFAULT_TOKENS: Readonly<Record<string, readonly Address[]>>;
4
+ export declare const STAKING_DEFAULT_TOKENS: Readonly<Record<string, readonly Address[]>>;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.STAKING_DEFAULT_TOKENS = exports.LENDING_DEFAULT_TOKENS = exports.DEX_DEFAULT_TOKENS = void 0;
4
+ const viem_1 = require("viem");
5
+ /** Curated subsets of the reviewed catalog. Addresses are destination tokens,
6
+ * not a promise that a Push PRC20 route or protocol liquidity is available.
7
+ * Keep these sets within the policy's 32-call/32-pin limits after expansion.
8
+ * Testnet DEX pairs and lending/staking assets match the live preset fixtures.
9
+ * Mainnet addresses share the catalog's October 15 read-only source baseline.
10
+ * Spending caps are intentionally separate from token selection.
11
+ */
12
+ const addresses = (...values) => values.map((value) => (0, viem_1.getAddress)(value.toLowerCase()));
13
+ exports.DEX_DEFAULT_TOKENS = {
14
+ 'eip155:1': addresses('0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48'),
15
+ 'eip155:8453': addresses('0x4200000000000000000000000000000000000006', '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'),
16
+ 'eip155:42161': addresses('0x82aF49447D8a07e3bd95BD0d56f35241523fBab1', '0xaf88d065e77c8cC2239327C5EDb3A432268e5831'),
17
+ 'eip155:56': addresses('0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c', '0x55d398326f99059fF775485246999027B3197955'),
18
+ 'eip155:11155111': addresses('0xfff9976782d46cc05630d1f6ebab18b2324d6b14', '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238'),
19
+ 'eip155:84532': addresses('0x4200000000000000000000000000000000000006', '0x036CbD53842c5426634e7929541eC2318f3dCF7e'),
20
+ 'eip155:421614': addresses('0x980B62Da83eFf3D4576C647993b0c1D7faf17c73', '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d'),
21
+ 'eip155:97': addresses('0xae13d989daC2f0dEbFf460aC112a837C89BAa7cd', '0xA11c8D9DC9b66E209Ef60F0C8D969D3CD988782c'),
22
+ };
23
+ exports.LENDING_DEFAULT_TOKENS = {
24
+ 'eip155:1': exports.DEX_DEFAULT_TOKENS['eip155:1'],
25
+ // One shared reserve/market token keeps Aave + Moonwell/Venus within 32 pins.
26
+ 'eip155:8453': addresses('0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913'),
27
+ 'eip155:42161': exports.DEX_DEFAULT_TOKENS['eip155:42161'],
28
+ 'eip155:56': addresses('0x55d398326f99059fF775485246999027B3197955'),
29
+ // Protocol testnet reserves differ from Circle USDC and DEX wrapped ETH.
30
+ 'eip155:11155111': addresses('0xf8Fb3713D459D7C1018BD0A49D19b4C44290EBE5'),
31
+ 'eip155:84532': addresses('0x810D46F9a9027E28F9B01F75E2bdde839dA61115', '0x4616975f7E6045FD9737e95bC527e9e14c727BD2', '0x663A6F02d547dFd639BF689FED298712f2FB69Fb'),
32
+ 'eip155:421614': addresses('0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d'),
33
+ 'eip155:97': addresses('0xA11c8D9DC9b66E209Ef60F0C8D969D3CD988782c', '0x16227D60f7a0e586C66B005219dfc887D13C9531'),
34
+ };
35
+ exports.STAKING_DEFAULT_TOKENS = {
36
+ 'eip155:1': addresses(viem_1.zeroAddress, '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84', '0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0'),
37
+ 'eip155:11155111': addresses('0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9'),
38
+ };
39
+ //# sourceMappingURL=default-tokens.js.map
@@ -7,6 +7,9 @@ const errors_1 = require("../errors");
7
7
  const selectors_1 = require("../codec/selectors");
8
8
  const catalog_1 = require("./catalog");
9
9
  const operation_limits_1 = require("./operation-limits");
10
+ const enums_1 = require("../../constants/enums");
11
+ const routes_1 = require("./routes");
12
+ const default_policy_1 = require("./default-policy");
10
13
  const MAX_UINT256 = (BigInt(1) << BigInt(256)) - BigInt(1);
11
14
  const invalid = (message) => new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.INVALID_RULE, message);
12
15
  function cap(value, name) {
@@ -51,6 +54,7 @@ function buildPresetApi(catalog) {
51
54
  ...p,
52
55
  chains: p.chains.map((c) => ({
53
56
  ...c,
57
+ ...(c.defaultTokens ? { defaultTokens: [...c.defaultTokens] } : {}),
54
58
  allowedCalls: c.allowedCalls.map((call) => ({
55
59
  ...copyCall(call),
56
60
  ...(call.budget
@@ -93,15 +97,22 @@ function buildPresetApi(catalog) {
93
97
  throw invalid(`unknown preset ${String(preset)}`);
94
98
  if (!options || typeof options !== 'object' || Array.isArray(options))
95
99
  throw invalid('preset options must be an object');
100
+ const now = Math.floor(Date.now() / 1000);
101
+ const network = options.network ?? enums_1.PUSH_NETWORK.TESTNET_DONUT;
102
+ if (!Object.values(enums_1.PUSH_NETWORK).includes(network))
103
+ throw invalid('unknown preset Push network');
104
+ if ('funding' in options)
105
+ throw invalid('The preset funding option is no longer supported. Remove it; preset assets and limits are always preserved.');
96
106
  if (options.agent !== undefined &&
97
107
  (!(0, viem_1.isAddress)(options.agent, { strict: false }) ||
98
108
  (0, viem_1.getAddress)(options.agent) === viem_1.zeroAddress))
99
109
  throw invalid('preset agent must be a nonzero Push address');
100
110
  if (options.validUntil !== undefined &&
101
111
  (!Number.isSafeInteger(options.validUntil) ||
102
- options.validUntil <= Math.floor(Date.now() / 1000) ||
112
+ options.validUntil <= now ||
103
113
  options.validUntil >= 2 ** 48))
104
114
  throw invalid('preset validUntil must be a future uint48 timestamp');
115
+ const validUntil = options.validUntil ?? now + default_policy_1.PRESET_VALIDITY_SECONDS;
105
116
  if (options.maxGasPerCall !== undefined)
106
117
  cap(options.maxGasPerCall, 'maxGasPerCall');
107
118
  if (options.assets !== undefined && !Array.isArray(options.assets))
@@ -114,6 +125,12 @@ function buildPresetApi(catalog) {
114
125
  if (!chains.length && options.assets?.length)
115
126
  throw (0, errors_1.capabilityUnavailable)('presetCatalog', `preset ${preset} has no approved app entries`);
116
127
  const assets = new Map();
128
+ // An explicit array (including []) replaces the defaults for all selected
129
+ // chains. Never add permissions on chains the caller left unconfigured.
130
+ if (options.assets === undefined)
131
+ for (const chain of chains)
132
+ if (chain.defaultTokens)
133
+ assets.set(chain.chainNamespace, chain.defaultTokens.map((token) => (0, default_policy_1.defaultPresetAsset)(chain.chainNamespace, token)));
117
134
  for (const asset of options.assets ?? []) {
118
135
  if (!asset || typeof asset !== 'object')
119
136
  throw invalid('preset asset must be an object');
@@ -143,6 +160,11 @@ function buildPresetApi(catalog) {
143
160
  }
144
161
  const readiness = [];
145
162
  const rules = chains.map((chain) => {
163
+ const maxGasPerCall = options.maxGasPerCall ??
164
+ chain.maxGasPerCall ??
165
+ (chain.defaultTokens
166
+ ? default_policy_1.PRESET_GAS_BUDGETS[chain.chainNamespace]
167
+ : undefined);
146
168
  const selectedAssets = assets.get(chain.chainNamespace) ?? [];
147
169
  const limits = (0, operation_limits_1.applyOperationLimits)(chain.allowedCalls.map((c) => ({
148
170
  ...copyCall(c),
@@ -258,8 +280,9 @@ function buildPresetApi(catalog) {
258
280
  }
259
281
  if (!calls.length || calls.length > 32)
260
282
  throw (0, errors_1.capabilityUnavailable)('presetCalls', 'preset must contain 1..32 allowed calls including approvals');
261
- if (calls.reduce((n, c) => n + (c.pins?.length ?? 0), 0) > 32)
262
- throw (0, errors_1.capabilityUnavailable)('presetPins', 'preset expansion exceeds 32 pins; reduce the token list or split rules across wallets');
283
+ const conditionCount = calls.reduce((n, c) => n + (c.pins?.length ?? 0), 0);
284
+ if (conditionCount > 32)
285
+ throw (0, errors_1.ruleConstraintLimit)(conditionCount, calls.length, chain.chainNamespace);
263
286
  const pairs = new Map();
264
287
  for (const call of calls) {
265
288
  if (!/^[A-Za-z_$][\w$]*\(.*\)$/.test(call.selector))
@@ -282,13 +305,7 @@ function buildPresetApi(catalog) {
282
305
  code: 'AGENT_REQUIRED',
283
306
  message: 'Choose the agent Push address.',
284
307
  });
285
- if (!options.validUntil)
286
- issues.push({
287
- code: 'EXPIRY_REQUIRED',
288
- message: 'Choose an expiry.',
289
- });
290
- if ((options.maxGasPerCall ?? chain.maxGasPerCall ?? BigInt(0)) ===
291
- BigInt(0))
308
+ if ((maxGasPerCall ?? BigInt(0)) === BigInt(0))
292
309
  issues.push({
293
310
  code: 'GAS_BUDGET_REQUIRED',
294
311
  message: 'Set a positive PC gas budget per outbound.',
@@ -308,14 +325,26 @@ function buildPresetApi(catalog) {
308
325
  code: 'NO_ENABLED_OPERATION',
309
326
  message: 'No asset operation has a positive per-call limit.',
310
327
  });
328
+ const configurationReady = issues.length === 0;
329
+ const routes = (0, routes_1.presetRoutes)(chain.chainNamespace, selectedAssets, network);
330
+ issues.push(...routes.issues);
331
+ const bridgeAssets = selectedAssets;
311
332
  readiness.push({
312
333
  chainNamespace: chain.chainNamespace,
313
334
  ready: issues.length === 0,
335
+ configurationReady,
336
+ selectedAssets: selectedAssets.map((a) => ({
337
+ ...a,
338
+ token: typeof a.token === 'string' ? a.token : { ...a.token },
339
+ })),
340
+ bridgeAssets: routes.bridgeAssets,
314
341
  issues,
315
342
  disabledCalls: limits.disabledCalls,
316
343
  excludedCalls: limits.excludedCalls,
317
- knownTokens: limits.knownTokens,
318
- zeroBridgeLimits: selectedAssets
344
+ knownTokens: [
345
+ ...new Set([...limits.knownTokens, ...(chain.defaultTokens ?? [])]),
346
+ ],
347
+ zeroBridgeLimits: bridgeAssets
319
348
  .filter((a) => a.maxPerCall === BigInt(0) || a.maxTotal === BigInt(0))
320
349
  .map(operation_limits_1.assetAddress),
321
350
  });
@@ -325,16 +354,12 @@ function buildPresetApi(catalog) {
325
354
  ...(options.agent !== undefined
326
355
  ? { agent: (0, viem_1.getAddress)(options.agent) }
327
356
  : {}),
328
- ...(options.validUntil !== undefined
329
- ? { validUntil: options.validUntil }
330
- : {}),
331
- ...(options.assets !== undefined
332
- ? { assets: assets.get(chain.chainNamespace) ?? [] }
357
+ validUntil,
358
+ ...(options.assets !== undefined || chain.defaultTokens
359
+ ? { assets: bridgeAssets }
333
360
  : {}),
334
- ...((options.maxGasPerCall ?? chain.maxGasPerCall) !== undefined
335
- ? {
336
- maxGasPerCall: cap(options.maxGasPerCall ?? chain.maxGasPerCall, 'maxGasPerCall'),
337
- }
361
+ ...(maxGasPerCall !== undefined
362
+ ? { maxGasPerCall: cap(maxGasPerCall, 'maxGasPerCall') }
338
363
  : {}),
339
364
  };
340
365
  });
@@ -347,7 +372,7 @@ function buildPresetApi(catalog) {
347
372
  };
348
373
  },
349
374
  };
350
- // The overload narrows templates only when both required fields were supplied and validated.
375
+ // Expiry is generated; the overload narrows templates when the agent is supplied.
351
376
  return Object.freeze(api);
352
377
  }
353
378
  exports.agenticPresets = buildPresetApi(catalog_1.PRESET_CATALOG);
@@ -0,0 +1,9 @@
1
+ import { PUSH_NETWORK } from '../../constants/enums';
2
+ import type { RuleAsset } from '../agentic.types';
3
+ import type { PresetChainReadiness, PresetConfigurationIssue } from './types';
4
+ /** Offline registry checks only. Grant preparation still verifies source metadata
5
+ * and wiring against chain state before any signature or transaction. */
6
+ export declare function presetRoutes(chain: string, assets: RuleAsset[], network: PUSH_NETWORK): {
7
+ bridgeAssets: PresetChainReadiness['bridgeAssets'];
8
+ issues: PresetConfigurationIssue[];
9
+ };
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.presetRoutes = presetRoutes;
4
+ const viem_1 = require("viem");
5
+ const enums_1 = require("../../constants/enums");
6
+ const helpers_1 = require("../../orchestrator/internals/helpers");
7
+ const prc20_address_1 = require("../../universal/prc20-address");
8
+ const deployments_1 = require("../deployments");
9
+ const operation_limits_1 = require("./operation-limits");
10
+ /** Offline registry checks only. Grant preparation still verifies source metadata
11
+ * and wiring against chain state before any signature or transaction. */
12
+ function presetRoutes(chain, assets, network) {
13
+ const issues = [];
14
+ network =
15
+ network === enums_1.PUSH_NETWORK.TESTNET ? enums_1.PUSH_NETWORK.TESTNET_DONUT : network;
16
+ if (!(0, deployments_1.generationsFor)(network).some((g) => g.advertised))
17
+ issues.push({
18
+ code: 'AGW_NETWORK_UNAVAILABLE',
19
+ message: `No verified AGW deployment is registered for ${network}.`,
20
+ });
21
+ const supported = helpers_1.SUPPORTED_GATEWAY_CHAINS.includes(chain);
22
+ if (!supported)
23
+ issues.push({
24
+ code: 'DESTINATION_UNAVAILABLE',
25
+ message: `The SDK has no supported gateway route to ${chain}; this is a catalog template.`,
26
+ });
27
+ const bridgeAssets = assets.map((asset) => {
28
+ const token = (0, operation_limits_1.assetAddress)(asset);
29
+ try {
30
+ if (!supported)
31
+ throw new Error(`No supported gateway route to ${chain}`);
32
+ const prc20 = (0, prc20_address_1.getPRC20Address)({ chain, address: token }, { network });
33
+ return {
34
+ token,
35
+ prc20: (0, viem_1.getAddress)(prc20.address),
36
+ status: 'registered',
37
+ };
38
+ }
39
+ catch {
40
+ issues.push({
41
+ code: 'BRIDGE_ASSET_UNAVAILABLE',
42
+ token,
43
+ message: `No SDK PRC20 mapping for ${chain}:${token} on ${network}. Choose a supported asset. This exact token needs a verified Push PRC20 route before it can be used.`,
44
+ });
45
+ return { token, status: 'unavailable' };
46
+ }
47
+ });
48
+ return { bridgeAssets, issues };
49
+ }
50
+ //# sourceMappingURL=routes.js.map