@pushchain/core 6.0.26 → 6.0.27-alpha.1

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 (171) hide show
  1. package/AGW.md +226 -0
  2. package/CHANGELOG.md +18 -0
  3. package/README.md +2 -0
  4. package/package.json +7 -1
  5. package/src/lib/agentic/agentic.d.ts +23 -0
  6. package/src/lib/agentic/agentic.js +51 -0
  7. package/src/lib/agentic/agentic.types.d.ts +414 -0
  8. package/src/lib/agentic/agentic.types.js +3 -0
  9. package/src/lib/agentic/capabilities.d.ts +37 -0
  10. package/src/lib/agentic/capabilities.js +64 -0
  11. package/src/lib/agentic/chain.d.ts +3 -0
  12. package/src/lib/agentic/chain.js +15 -0
  13. package/src/lib/agentic/codec/abi-layout.d.ts +20 -0
  14. package/src/lib/agentic/codec/abi-layout.js +168 -0
  15. package/src/lib/agentic/codec/defaults.d.ts +51 -0
  16. package/src/lib/agentic/codec/defaults.js +53 -0
  17. package/src/lib/agentic/codec/ids.d.ts +35 -0
  18. package/src/lib/agentic/codec/ids.js +74 -0
  19. package/src/lib/agentic/codec/native.d.ts +73 -0
  20. package/src/lib/agentic/codec/native.js +341 -0
  21. package/src/lib/agentic/codec/pins.d.ts +20 -0
  22. package/src/lib/agentic/codec/pins.js +29 -0
  23. package/src/lib/agentic/codec/rules.d.ts +45 -0
  24. package/src/lib/agentic/codec/rules.js +110 -0
  25. package/src/lib/agentic/codec/selectors.d.ts +19 -0
  26. package/src/lib/agentic/codec/selectors.js +60 -0
  27. package/src/lib/agentic/codec/session.d.ts +54 -0
  28. package/src/lib/agentic/codec/session.js +65 -0
  29. package/src/lib/agentic/codec/svm-accounts.d.ts +35 -0
  30. package/src/lib/agentic/codec/svm-accounts.js +68 -0
  31. package/src/lib/agentic/codec/svm-idl.d.ts +11 -0
  32. package/src/lib/agentic/codec/svm-idl.js +226 -0
  33. package/src/lib/agentic/codec/svm-terms.d.ts +157 -0
  34. package/src/lib/agentic/codec/svm-terms.js +246 -0
  35. package/src/lib/agentic/codec/universal-terms.d.ts +82 -0
  36. package/src/lib/agentic/codec/universal-terms.js +43 -0
  37. package/src/lib/agentic/codec/universal.d.ts +14 -0
  38. package/src/lib/agentic/codec/universal.js +173 -0
  39. package/src/lib/agentic/constants.d.ts +12 -0
  40. package/src/lib/agentic/constants.js +16 -0
  41. package/src/lib/agentic/context.d.ts +29 -0
  42. package/src/lib/agentic/context.js +56 -0
  43. package/src/lib/agentic/contracts/abi/v6/agent-validator.d.ts +105 -0
  44. package/src/lib/agentic/contracts/abi/v6/agent-validator.js +149 -0
  45. package/src/lib/agentic/contracts/abi/v6/agw-factory.d.ts +1146 -0
  46. package/src/lib/agentic/contracts/abi/v6/agw-factory.js +1499 -0
  47. package/src/lib/agentic/contracts/abi/v6/agw.d.ts +1306 -0
  48. package/src/lib/agentic/contracts/abi/v6/agw.js +1713 -0
  49. package/src/lib/agentic/contracts/abi/v6/index.d.ts +6 -0
  50. package/src/lib/agentic/contracts/abi/v6/index.js +17 -0
  51. package/src/lib/agentic/contracts/abi/v6/smart-session.d.ts +1493 -0
  52. package/src/lib/agentic/contracts/abi/v6/smart-session.js +1965 -0
  53. package/src/lib/agentic/contracts/abi/v6/universal-rules-policy.d.ts +1661 -0
  54. package/src/lib/agentic/contracts/abi/v6/universal-rules-policy.js +2187 -0
  55. package/src/lib/agentic/contracts/donut-v6.d.ts +11 -0
  56. package/src/lib/agentic/contracts/donut-v6.js +15 -0
  57. package/src/lib/agentic/contracts/prc20-metadata.d.ts +26 -0
  58. package/src/lib/agentic/contracts/prc20-metadata.js +87 -0
  59. package/src/lib/agentic/contracts/reader.d.ts +35 -0
  60. package/src/lib/agentic/contracts/reader.js +16 -0
  61. package/src/lib/agentic/contracts/v6.d.ts +5739 -0
  62. package/src/lib/agentic/contracts/v6.js +343 -0
  63. package/src/lib/agentic/deployments.d.ts +61 -0
  64. package/src/lib/agentic/deployments.js +203 -0
  65. package/src/lib/agentic/errors.d.ts +65 -0
  66. package/src/lib/agentic/errors.js +84 -0
  67. package/src/lib/agentic/execution/guards.d.ts +9 -0
  68. package/src/lib/agentic/execution/guards.js +30 -0
  69. package/src/lib/agentic/execution/outbound.d.ts +55 -0
  70. package/src/lib/agentic/execution/outbound.js +187 -0
  71. package/src/lib/agentic/execution/send.d.ts +9 -0
  72. package/src/lib/agentic/execution/send.js +268 -0
  73. package/src/lib/agentic/execution/svm-instruction.d.ts +24 -0
  74. package/src/lib/agentic/execution/svm-instruction.js +40 -0
  75. package/src/lib/agentic/execution/svm-outbound.d.ts +18 -0
  76. package/src/lib/agentic/execution/svm-outbound.js +86 -0
  77. package/src/lib/agentic/execution/svm-payload.d.ts +18 -0
  78. package/src/lib/agentic/execution/svm-payload.js +136 -0
  79. package/src/lib/agentic/execution/svm-public.d.ts +5 -0
  80. package/src/lib/agentic/execution/svm-public.js +176 -0
  81. package/src/lib/agentic/execution/svm-quote.d.ts +11 -0
  82. package/src/lib/agentic/execution/svm-quote.js +24 -0
  83. package/src/lib/agentic/execution/svm-send.d.ts +44 -0
  84. package/src/lib/agentic/execution/svm-send.js +87 -0
  85. package/src/lib/agentic/index.d.ts +5 -0
  86. package/src/lib/agentic/index.js +10 -0
  87. package/src/lib/agentic/management/common.d.ts +29 -0
  88. package/src/lib/agentic/management/common.js +116 -0
  89. package/src/lib/agentic/management/create.d.ts +4 -0
  90. package/src/lib/agentic/management/create.js +138 -0
  91. package/src/lib/agentic/management/duplicates.d.ts +4 -0
  92. package/src/lib/agentic/management/duplicates.js +20 -0
  93. package/src/lib/agentic/management/label.d.ts +3 -0
  94. package/src/lib/agentic/management/label.js +17 -0
  95. package/src/lib/agentic/management/prepare.d.ts +7 -0
  96. package/src/lib/agentic/management/prepare.js +95 -0
  97. package/src/lib/agentic/management/rules-write.d.ts +42 -0
  98. package/src/lib/agentic/management/rules-write.js +279 -0
  99. package/src/lib/agentic/management/svm-context.d.ts +25 -0
  100. package/src/lib/agentic/management/svm-context.js +55 -0
  101. package/src/lib/agentic/management/svm-metadata.d.ts +10 -0
  102. package/src/lib/agentic/management/svm-metadata.js +56 -0
  103. package/src/lib/agentic/management/svm-public.d.ts +6 -0
  104. package/src/lib/agentic/management/svm-public.js +125 -0
  105. package/src/lib/agentic/management/svm.d.ts +27 -0
  106. package/src/lib/agentic/management/svm.js +150 -0
  107. package/src/lib/agentic/presets/catalog.d.ts +26 -0
  108. package/src/lib/agentic/presets/catalog.js +307 -0
  109. package/src/lib/agentic/presets/index.d.ts +5 -0
  110. package/src/lib/agentic/presets/index.js +265 -0
  111. package/src/lib/agentic/presets/types.d.ts +48 -0
  112. package/src/lib/agentic/presets/types.js +3 -0
  113. package/src/lib/agentic/public-rule.d.ts +9 -0
  114. package/src/lib/agentic/public-rule.js +326 -0
  115. package/src/lib/agentic/reads/checkpoints.d.ts +17 -0
  116. package/src/lib/agentic/reads/checkpoints.js +109 -0
  117. package/src/lib/agentic/reads/rules.d.ts +42 -0
  118. package/src/lib/agentic/reads/rules.js +302 -0
  119. package/src/lib/agentic/reads/snapshot.d.ts +28 -0
  120. package/src/lib/agentic/reads/snapshot.js +85 -0
  121. package/src/lib/agentic/reads/svm.d.ts +17 -0
  122. package/src/lib/agentic/reads/svm.js +52 -0
  123. package/src/lib/agentic/reads/wallets.d.ts +25 -0
  124. package/src/lib/agentic/reads/wallets.js +122 -0
  125. package/src/lib/agentic/response.d.ts +41 -0
  126. package/src/lib/agentic/response.js +358 -0
  127. package/src/lib/agentic/revert.d.ts +7 -0
  128. package/src/lib/agentic/revert.js +102 -0
  129. package/src/lib/agentic/runtime.d.ts +58 -0
  130. package/src/lib/agentic/runtime.js +104 -0
  131. package/src/lib/agentic/utils.d.ts +57 -0
  132. package/src/lib/agentic/utils.js +165 -0
  133. package/src/lib/agentic/wallet.d.ts +32 -0
  134. package/src/lib/agentic/wallet.js +130 -0
  135. package/src/lib/constants/enums.d.ts +6 -3
  136. package/src/lib/constants/enums.js +6 -3
  137. package/src/lib/constants/index.d.ts +61 -4
  138. package/src/lib/constants/index.js +17 -3
  139. package/src/lib/constants/read-state.d.ts +9 -0
  140. package/src/lib/constants/read-state.js +13 -1
  141. package/src/lib/index.d.ts +8 -2
  142. package/src/lib/index.js +9 -1
  143. package/src/lib/orchestrator/internals/errors.d.ts +7 -0
  144. package/src/lib/orchestrator/internals/errors.js +13 -1
  145. package/src/lib/orchestrator/internals/execute-standard.d.ts +3 -1
  146. package/src/lib/orchestrator/internals/execute-standard.js +3 -3
  147. package/src/lib/orchestrator/internals/outbound-sync.js +52 -7
  148. package/src/lib/orchestrator/internals/push-chain-tx.d.ts +1 -1
  149. package/src/lib/orchestrator/internals/push-chain-tx.js +13 -1
  150. package/src/lib/orchestrator/orchestrator.d.ts +3 -0
  151. package/src/lib/orchestrator/orchestrator.js +13 -1
  152. package/src/lib/orchestrator/orchestrator.types.d.ts +8 -0
  153. package/src/lib/orchestrator/route-detector.js +3 -2
  154. package/src/lib/orchestrator/svm-idl/resolve.d.ts +2 -0
  155. package/src/lib/orchestrator/svm-idl/resolve.js +11 -1
  156. package/src/lib/progress-hook/progress-hook.js +63 -0
  157. package/src/lib/progress-hook/progress-hook.types.d.ts +10 -1
  158. package/src/lib/progress-hook/progress-hook.types.js +10 -0
  159. package/src/lib/push-chain/push-chain.d.ts +57 -15
  160. package/src/lib/push-chain/push-chain.js +66 -7
  161. package/src/lib/read-state/destination.js +6 -1
  162. package/src/lib/read-state/read-params.d.ts +3 -3
  163. package/src/lib/read-state/read-params.js +3 -2
  164. package/src/lib/read-state/read-state.types.d.ts +3 -1
  165. package/src/lib/read-state/read-tracker.js +2 -2
  166. package/src/lib/read-state/spec-builder.js +1 -1
  167. package/src/lib/universal/prc20-address.d.ts +15 -0
  168. package/src/lib/universal/prc20-address.js +135 -0
  169. package/src/lib/utils.d.ts +6 -13
  170. package/src/lib/utils.js +5 -128
  171. package/src/lib/vm-client/evm-client.js +34 -20
@@ -0,0 +1,246 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SVM_TERMS_PARAM = exports.FORBIDDEN_SVM_PROGRAMS = exports.UINT64_MAX = exports.SVM_LIMITS = exports.SvmDataPinMode = void 0;
4
+ exports.svmInvalid = svmInvalid;
5
+ exports.exactHex = exactHex;
6
+ exports.isForbiddenSvmProgram = isForbiddenSvmProgram;
7
+ exports.validateSvmTerms = validateSvmTerms;
8
+ exports.encodeSvmTerms = encodeSvmTerms;
9
+ exports.decodeSvmTerms = decodeSvmTerms;
10
+ /** Internal v6 SVM wire representation; not a proposed public Rule API. */
11
+ const viem_1 = require("viem");
12
+ const errors_1 = require("../errors");
13
+ const defaults_1 = require("./defaults");
14
+ var SvmDataPinMode;
15
+ (function (SvmDataPinMode) {
16
+ SvmDataPinMode[SvmDataPinMode["EQ"] = 0] = "EQ";
17
+ SvmDataPinMode[SvmDataPinMode["GTE_LE"] = 1] = "GTE_LE";
18
+ SvmDataPinMode[SvmDataPinMode["LTE_LE"] = 2] = "LTE_LE";
19
+ SvmDataPinMode[SvmDataPinMode["RATIO_GTE_LE"] = 3] = "RATIO_GTE_LE";
20
+ })(SvmDataPinMode || (exports.SvmDataPinMode = SvmDataPinMode = {}));
21
+ exports.SVM_LIMITS = {
22
+ assets: 8,
23
+ programs: 32,
24
+ pins: 16,
25
+ dataPins: 8,
26
+ ceaAccounts: 16,
27
+ accounts: 64,
28
+ ixData: 1024,
29
+ };
30
+ exports.UINT64_MAX = BigInt(2) ** BigInt(64) - BigInt(1);
31
+ exports.FORBIDDEN_SVM_PROGRAMS = [
32
+ `0x${'00'.repeat(32)}`,
33
+ '0x06ddf6e1d765a193d9cbe146ceeb79ac1cb485ed5f5b37913a8cf5857eff00a9',
34
+ '0x06ddf6e1ee758fde18425dbce46ccddab61afc4d83b90d27febdf928d8a18bfc',
35
+ '0x06a1d8179137542a983437bdfe2a7ab2557f535c8a78722b68a49dc000000000',
36
+ '0x02a8f6914e88a1b0e210153ef763ae2b00c2b93d16c124d2c0537a1004800000',
37
+ '0x0277a6af97339b7ac88d1892c90446f50002309266f62e53c118244982000000',
38
+ ];
39
+ exports.SVM_TERMS_PARAM = {
40
+ type: 'tuple',
41
+ components: [
42
+ { name: 'validUntil', type: 'uint48' },
43
+ { name: 'expectedCEA', type: 'bytes32' },
44
+ { name: 'gatewayProgram', type: 'bytes32' },
45
+ {
46
+ name: 'assets',
47
+ type: 'tuple[]',
48
+ components: [
49
+ { name: 'token', type: 'address' },
50
+ { name: 'maxPerCall', type: 'uint256' },
51
+ { name: 'maxTotal', type: 'uint256' },
52
+ ],
53
+ },
54
+ { name: 'maxGasPerCall', type: 'uint256' },
55
+ { name: 'ceaAccounts', type: 'bytes32[]' },
56
+ {
57
+ name: 'programs',
58
+ type: 'tuple[]',
59
+ components: [
60
+ { name: 'program', type: 'bytes32' },
61
+ { name: 'discriminator', type: 'bytes8' },
62
+ { name: 'discriminatorLen', type: 'uint8' },
63
+ { name: 'dataless', type: 'bool' },
64
+ { name: 'maxAccounts', type: 'uint8' },
65
+ ],
66
+ },
67
+ {
68
+ name: 'pins',
69
+ type: 'tuple[]',
70
+ components: [
71
+ { name: 'ruleIndex', type: 'uint8' },
72
+ { name: 'accountIndex', type: 'uint8' },
73
+ { name: 'expected', type: 'bytes32' },
74
+ ],
75
+ },
76
+ {
77
+ name: 'dataPins',
78
+ type: 'tuple[]',
79
+ components: [
80
+ { name: 'ruleIndex', type: 'uint8' },
81
+ { name: 'fromEnd', type: 'bool' },
82
+ { name: 'offset', type: 'uint16' },
83
+ { name: 'offsetB', type: 'uint16' },
84
+ { name: 'len', type: 'uint8' },
85
+ { name: 'mode', type: 'uint8' },
86
+ { name: 'expected', type: 'bytes32' },
87
+ { name: 'num', type: 'uint64' },
88
+ { name: 'den', type: 'uint64' },
89
+ ],
90
+ },
91
+ ],
92
+ };
93
+ function svmInvalid(message) {
94
+ return new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.INVALID_RULE, message);
95
+ }
96
+ function exactHex(value, bytes, field) {
97
+ if (typeof value !== 'string' ||
98
+ !new RegExp(`^0x[0-9a-fA-F]{${bytes * 2}}$`).test(value))
99
+ throw svmInvalid(`${field} must contain exactly ${bytes} bytes`);
100
+ }
101
+ function integer(value, max, field) {
102
+ if (!Number.isInteger(value) || value < 0 || value > max)
103
+ throw svmInvalid(`${field} is out of range`);
104
+ }
105
+ function uint(value, max, field) {
106
+ if (typeof value !== 'bigint' || value < BigInt(0) || value > max)
107
+ throw svmInvalid(`${field} is out of range`);
108
+ }
109
+ function isForbiddenSvmProgram(program, terms) {
110
+ return [
111
+ ...exports.FORBIDDEN_SVM_PROGRAMS,
112
+ terms.gatewayProgram,
113
+ terms.expectedCEA,
114
+ ].some((x) => x.toLowerCase() === program.toLowerCase());
115
+ }
116
+ function offsetValid(fromEnd, offset, len) {
117
+ return fromEnd
118
+ ? offset >= len && offset <= exports.SVM_LIMITS.ixData
119
+ : offset + len <= exports.SVM_LIMITS.ixData;
120
+ }
121
+ /** Grant-time structural rules. Chain/token/mint correctness requires resolved on-chain inputs. */
122
+ function validateSvmTerms(t, nowSeconds) {
123
+ integer(t.validUntil, 2 ** 48 - 1, 'validUntil');
124
+ if (t.validUntil <= nowSeconds)
125
+ throw svmInvalid('validUntil must be in the future');
126
+ exactHex(t.expectedCEA, 32, 'expectedCEA');
127
+ exactHex(t.gatewayProgram, 32, 'gatewayProgram');
128
+ if (BigInt(t.expectedCEA) === BigInt(0) ||
129
+ BigInt(t.gatewayProgram) === BigInt(0))
130
+ throw svmInvalid('CEA/gateway cannot be zero');
131
+ uint(t.maxGasPerCall, defaults_1.UINT256_MAX, 'maxGasPerCall');
132
+ if (!t.assets.length || t.assets.length > exports.SVM_LIMITS.assets)
133
+ throw svmInvalid('assets must contain 1..8 entries');
134
+ const tokens = new Set();
135
+ for (const a of t.assets) {
136
+ if (!(0, viem_1.isAddress)(a.token, { strict: false }) || BigInt(a.token) === BigInt(0))
137
+ throw svmInvalid('asset token must be a non-zero PRC20');
138
+ if (tokens.has(a.token.toLowerCase()))
139
+ throw svmInvalid('duplicate asset');
140
+ tokens.add(a.token.toLowerCase());
141
+ uint(a.maxPerCall, defaults_1.UINT256_MAX, 'maxPerCall');
142
+ uint(a.maxTotal, defaults_1.UINT256_MAX, 'maxTotal');
143
+ }
144
+ if (!t.programs.length || t.programs.length > exports.SVM_LIMITS.programs)
145
+ throw svmInvalid('programs must contain 1..32 entries');
146
+ t.programs.forEach((r, i) => {
147
+ exactHex(r.program, 32, 'program');
148
+ exactHex(r.discriminator, 8, 'discriminator');
149
+ if (typeof r.dataless !== 'boolean')
150
+ throw svmInvalid('dataless must be boolean');
151
+ integer(r.discriminatorLen, 8, 'discriminatorLen');
152
+ if (r.maxAccounts !== 255) {
153
+ integer(r.maxAccounts, exports.SVM_LIMITS.accounts, 'maxAccounts');
154
+ if (r.maxAccounts === 0)
155
+ throw svmInvalid('maxAccounts must be 1..64 or 255');
156
+ }
157
+ if (r.dataless !== (r.discriminatorLen === 0))
158
+ throw svmInvalid('dataless and discriminator length disagree');
159
+ if (isForbiddenSvmProgram(r.program, t))
160
+ throw svmInvalid('forbidden program');
161
+ for (const earlier of t.programs.slice(0, i)) {
162
+ if (earlier.program.toLowerCase() !== r.program.toLowerCase())
163
+ continue;
164
+ const overlap = earlier.dataless || r.dataless
165
+ ? earlier.dataless && r.dataless
166
+ : earlier.discriminator
167
+ .slice(0, 2 + 2 * Math.min(earlier.discriminatorLen, r.discriminatorLen))
168
+ .toLowerCase() ===
169
+ r.discriminator
170
+ .slice(0, 2 + 2 * Math.min(earlier.discriminatorLen, r.discriminatorLen))
171
+ .toLowerCase();
172
+ if (overlap)
173
+ throw svmInvalid('ambiguous instruction discriminator prefixes');
174
+ }
175
+ });
176
+ if (t.pins.length > exports.SVM_LIMITS.pins)
177
+ throw svmInvalid('too many account pins');
178
+ const positions = new Set(), covered = new Set();
179
+ for (const p of t.pins) {
180
+ integer(p.ruleIndex, t.programs.length - 1, 'pin ruleIndex');
181
+ integer(p.accountIndex, exports.SVM_LIMITS.accounts - 1, 'accountIndex');
182
+ exactHex(p.expected, 32, 'pin expected');
183
+ const count = t.programs[p.ruleIndex].maxAccounts;
184
+ if (count !== 255 && p.accountIndex >= count)
185
+ throw svmInvalid('pin outside fixed account count');
186
+ const key = `${p.ruleIndex}:${p.accountIndex}`;
187
+ if (positions.has(key))
188
+ throw svmInvalid('duplicate account pin');
189
+ positions.add(key);
190
+ covered.add(p.ruleIndex);
191
+ }
192
+ if (covered.size !== t.programs.length)
193
+ throw svmInvalid('every program rule needs an account pin');
194
+ if (t.dataPins.length > exports.SVM_LIMITS.dataPins)
195
+ throw svmInvalid('too many data pins');
196
+ for (const p of t.dataPins) {
197
+ integer(p.ruleIndex, t.programs.length - 1, 'data pin ruleIndex');
198
+ integer(p.mode, 3, 'data pin mode');
199
+ integer(p.len, p.mode === SvmDataPinMode.EQ ? 32 : 8, 'data pin len');
200
+ integer(p.offset, 65535, 'offset');
201
+ integer(p.offsetB, 65535, 'offsetB');
202
+ exactHex(p.expected, 32, 'data pin expected');
203
+ uint(p.num, exports.UINT64_MAX, 'num');
204
+ uint(p.den, exports.UINT64_MAX, 'den');
205
+ if (typeof p.fromEnd !== 'boolean' ||
206
+ !p.len ||
207
+ t.programs[p.ruleIndex].dataless ||
208
+ !offsetValid(p.fromEnd, p.offset, p.len))
209
+ throw svmInvalid('invalid data pin shape');
210
+ if (p.mode === SvmDataPinMode.EQ &&
211
+ !/^0*$/.test(p.expected.slice(2 + p.len * 2)))
212
+ throw svmInvalid('EQ expected must be left-aligned');
213
+ if ((p.mode === SvmDataPinMode.GTE_LE || p.mode === SvmDataPinMode.LTE_LE) &&
214
+ BigInt(p.expected) >= BigInt(1) << BigInt(p.len * 8))
215
+ throw svmInvalid('integer expected exceeds field width');
216
+ if (p.mode === SvmDataPinMode.RATIO_GTE_LE &&
217
+ (!p.num || !p.den || !offsetValid(p.fromEnd, p.offsetB, p.len)))
218
+ throw svmInvalid('invalid ratio pin');
219
+ }
220
+ if (t.ceaAccounts.length > exports.SVM_LIMITS.ceaAccounts)
221
+ throw svmInvalid('too many CEA accounts');
222
+ const accounts = new Set();
223
+ for (const key of t.ceaAccounts) {
224
+ exactHex(key, 32, 'CEA account');
225
+ if (BigInt(key) === BigInt(0) ||
226
+ accounts.has(key.toLowerCase()) ||
227
+ t.programs.some((p) => p.program.toLowerCase() === key.toLowerCase()))
228
+ throw svmInvalid('invalid CEA account list');
229
+ accounts.add(key.toLowerCase());
230
+ }
231
+ if (!accounts.has(t.expectedCEA.toLowerCase()))
232
+ throw svmInvalid('CEA account list must include expectedCEA');
233
+ }
234
+ function encodeSvmTerms(terms, nowSeconds) {
235
+ validateSvmTerms(terms, nowSeconds);
236
+ return (0, viem_1.encodeAbiParameters)([exports.SVM_TERMS_PARAM], [terms]);
237
+ }
238
+ function decodeSvmTerms(body) {
239
+ try {
240
+ return (0, viem_1.decodeAbiParameters)([exports.SVM_TERMS_PARAM], body)[0];
241
+ }
242
+ catch (cause) {
243
+ throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.RULE_READ_FAILED, 'malformed SVM terms', { cause });
244
+ }
245
+ }
246
+ //# sourceMappingURL=svm-terms.js.map
@@ -0,0 +1,82 @@
1
+ import { type ArgPinWire } from './pins';
2
+ import { type Address, type Hex } from 'viem';
3
+ export interface AssetCapWire {
4
+ token: Address;
5
+ maxPerCall: bigint;
6
+ maxTotal: bigint;
7
+ }
8
+ export interface AllowedCallWire {
9
+ pins: readonly ArgPinWire[];
10
+ target: Address;
11
+ selector: Hex;
12
+ beneficiaryOffset: number;
13
+ hasBeneficiary: boolean;
14
+ maxValue: bigint;
15
+ }
16
+ export interface UniversalTermsWire {
17
+ validUntil: number;
18
+ expectedCEA: Address;
19
+ assets: readonly AssetCapWire[];
20
+ maxGasPerCall: bigint;
21
+ allowedCalls: readonly AllowedCallWire[];
22
+ }
23
+ export declare const UNIVERSAL_TERMS_PARAM: {
24
+ readonly type: "tuple";
25
+ readonly components: readonly [{
26
+ readonly name: "validUntil";
27
+ readonly type: "uint48";
28
+ }, {
29
+ readonly name: "expectedCEA";
30
+ readonly type: "address";
31
+ }, {
32
+ readonly name: "assets";
33
+ readonly type: "tuple[]";
34
+ readonly components: readonly [{
35
+ readonly name: "token";
36
+ readonly type: "address";
37
+ }, {
38
+ readonly name: "maxPerCall";
39
+ readonly type: "uint256";
40
+ }, {
41
+ readonly name: "maxTotal";
42
+ readonly type: "uint256";
43
+ }];
44
+ }, {
45
+ readonly name: "maxGasPerCall";
46
+ readonly type: "uint256";
47
+ }, {
48
+ readonly name: "allowedCalls";
49
+ readonly type: "tuple[]";
50
+ readonly components: readonly [{
51
+ readonly name: "target";
52
+ readonly type: "address";
53
+ }, {
54
+ readonly name: "selector";
55
+ readonly type: "bytes4";
56
+ }, {
57
+ readonly name: "beneficiaryOffset";
58
+ readonly type: "uint16";
59
+ }, {
60
+ readonly name: "hasBeneficiary";
61
+ readonly type: "bool";
62
+ }, {
63
+ readonly name: "maxValue";
64
+ readonly type: "uint256";
65
+ }, {
66
+ readonly name: "pins";
67
+ readonly type: "tuple[]";
68
+ readonly components: readonly [{
69
+ readonly name: "offset";
70
+ readonly type: "uint16";
71
+ }, {
72
+ readonly name: "op";
73
+ readonly type: "uint8";
74
+ }, {
75
+ readonly name: "value";
76
+ readonly type: "bytes32";
77
+ }];
78
+ }];
79
+ }];
80
+ };
81
+ export declare function encodeUniversalTerms(terms: UniversalTermsWire): Hex;
82
+ export declare function decodeUniversalTerms(body: Hex): UniversalTermsWire;
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UNIVERSAL_TERMS_PARAM = void 0;
4
+ exports.encodeUniversalTerms = encodeUniversalTerms;
5
+ exports.decodeUniversalTerms = decodeUniversalTerms;
6
+ const pins_1 = require("./pins");
7
+ const viem_1 = require("viem");
8
+ exports.UNIVERSAL_TERMS_PARAM = {
9
+ type: 'tuple',
10
+ components: [
11
+ { name: 'validUntil', type: 'uint48' },
12
+ { name: 'expectedCEA', type: 'address' },
13
+ {
14
+ name: 'assets',
15
+ type: 'tuple[]',
16
+ components: [
17
+ { name: 'token', type: 'address' },
18
+ { name: 'maxPerCall', type: 'uint256' },
19
+ { name: 'maxTotal', type: 'uint256' },
20
+ ],
21
+ },
22
+ { name: 'maxGasPerCall', type: 'uint256' },
23
+ {
24
+ name: 'allowedCalls',
25
+ type: 'tuple[]',
26
+ components: [
27
+ { name: 'target', type: 'address' },
28
+ { name: 'selector', type: 'bytes4' },
29
+ { name: 'beneficiaryOffset', type: 'uint16' },
30
+ { name: 'hasBeneficiary', type: 'bool' },
31
+ { name: 'maxValue', type: 'uint256' },
32
+ { name: 'pins', type: 'tuple[]', components: pins_1.ARG_PIN_COMPONENTS },
33
+ ],
34
+ },
35
+ ],
36
+ };
37
+ function encodeUniversalTerms(terms) {
38
+ return (0, viem_1.encodeAbiParameters)([exports.UNIVERSAL_TERMS_PARAM], [terms]);
39
+ }
40
+ function decodeUniversalTerms(body) {
41
+ return (0, viem_1.decodeAbiParameters)([exports.UNIVERSAL_TERMS_PARAM], body)[0];
42
+ }
43
+ //# sourceMappingURL=universal-terms.js.map
@@ -0,0 +1,14 @@
1
+ import { type Address } from 'viem';
2
+ import type { UniversalRule } from '../agentic.types';
3
+ import type { RuleEncodeContext, PreparedRule } from './rules';
4
+ import { type AssetCapWire, type UniversalTermsWire } from './universal-terms';
5
+ export declare const MAX_ASSETS = 8;
6
+ export declare const MAX_ALLOWED_CALLS = 32;
7
+ export interface ResolvedUniversalRule {
8
+ expectedCEA: Address;
9
+ assets: readonly AssetCapWire[];
10
+ }
11
+ export declare function validateUniversalRuleShape(rule: UniversalRule, nowSeconds: number): void;
12
+ export declare function encodeUniversalRule(rule: UniversalRule, ctx: RuleEncodeContext): PreparedRule;
13
+ /** Source token addresses must be resolved from each PRC20 before calling this. */
14
+ export declare function universalTermsToRule(terms: UniversalTermsWire, agent: Address, chainNamespace: UniversalRule['chainNamespace'], tokens: readonly Address[]): UniversalRule;
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MAX_ALLOWED_CALLS = exports.MAX_ASSETS = void 0;
4
+ exports.validateUniversalRuleShape = validateUniversalRuleShape;
5
+ exports.encodeUniversalRule = encodeUniversalRule;
6
+ exports.universalTermsToRule = universalTermsToRule;
7
+ const pins_1 = require("./pins");
8
+ const viem_1 = require("viem");
9
+ const capabilities_1 = require("../capabilities");
10
+ const errors_1 = require("../errors");
11
+ const abi_layout_1 = require("./abi-layout");
12
+ const selectors_1 = require("./selectors");
13
+ const defaults_1 = require("./defaults");
14
+ const session_1 = require("./session");
15
+ const v6_1 = require("../contracts/v6");
16
+ const universal_terms_1 = require("./universal-terms");
17
+ exports.MAX_ASSETS = 8;
18
+ exports.MAX_ALLOWED_CALLS = 32;
19
+ const CAIP2 = /^(eip155:[0-9]+|solana:[1-9A-HJ-NP-Za-km-z]{32,44})$/;
20
+ const UINT48_MAX = 2 ** 48 - 1;
21
+ function cap(value, what) {
22
+ if (typeof value !== 'bigint' || value < BigInt(0) || value > defaults_1.UINT256_MAX)
23
+ throw invalid(`${what} must be a uint256 bigint`);
24
+ }
25
+ function validateUniversalRuleShape(rule, nowSeconds) {
26
+ if (typeof rule.chainNamespace !== 'string' ||
27
+ !CAIP2.test(rule.chainNamespace))
28
+ throw invalid('chainNamespace must be a CAIP-2 eip155/solana chain');
29
+ if (!Number.isSafeInteger(rule.validUntil) ||
30
+ rule.validUntil <= nowSeconds ||
31
+ rule.validUntil > UINT48_MAX)
32
+ throw invalid('validUntil must be a future uint48 unix timestamp');
33
+ if (!Array.isArray(rule.assets) || rule.assets.length > exports.MAX_ASSETS)
34
+ throw invalid(`assets must be an array of at most ${exports.MAX_ASSETS} caps`);
35
+ cap(rule.maxGasPerCall, 'maxGasPerCall');
36
+ if (rule.maxGasPerCall === BigInt(0))
37
+ throw invalid('maxGasPerCall must be positive');
38
+ if (!Array.isArray(rule.allowedCalls) ||
39
+ rule.allowedCalls.length < 1 ||
40
+ rule.allowedCalls.length > exports.MAX_ALLOWED_CALLS)
41
+ throw invalid(`allowedCalls must contain 1..${exports.MAX_ALLOWED_CALLS} entries`);
42
+ const seen = new Map();
43
+ let pinCount = 0;
44
+ rule.allowedCalls.forEach((call, i) => {
45
+ if (!(0, viem_1.isAddress)(call.target, { strict: false }))
46
+ throw invalid(`allowedCalls[${i}].target is not an EVM address`);
47
+ const parsed = (0, selectors_1.parseSelector)(call.selector);
48
+ if (parsed.valueOnly)
49
+ throw invalid(`allowedCalls[${i}] cannot be value-only`);
50
+ if (call.beneficiary !== undefined && call.beneficiaryOffset !== undefined)
51
+ throw invalid('beneficiary and beneficiaryOffset are mutually exclusive');
52
+ if (call.beneficiary !== undefined) {
53
+ (0, abi_layout_1.argumentOffset)(parsed.inputs, call.beneficiary, `allowedCalls[${i}].beneficiary`);
54
+ if (parsed.inputs?.[call.beneficiary]?.type !== 'address')
55
+ throw invalid(`allowedCalls[${i}].beneficiary must be an address argument`);
56
+ }
57
+ if (call.beneficiaryOffset !== undefined)
58
+ (0, abi_layout_1.rawOffset)(call.beneficiaryOffset, `allowedCalls[${i}].beneficiary`);
59
+ cap(call.maxValue ?? defaults_1.AGENTIC_DEFAULTS.universal.allowedCallMaxValue.value, `allowedCalls[${i}].maxValue`);
60
+ try {
61
+ (0, pins_1.validatePins)(call.pins ?? []);
62
+ }
63
+ catch (error) {
64
+ throw invalid(error.message);
65
+ }
66
+ pinCount += call.pins?.length ?? 0;
67
+ if (pinCount > 32)
68
+ throw invalid('at most 32 pins across all allowed calls');
69
+ const key = `${call.target.toLowerCase()}:${parsed.selector}`;
70
+ const restricted = !!call.pins?.length ||
71
+ call.beneficiary !== undefined ||
72
+ call.beneficiaryOffset !== undefined;
73
+ if (seen.has(key) && (!restricted || !seen.get(key)))
74
+ throw invalid('an unpinned alternative would bypass restrictions for this target/selector');
75
+ seen.set(key, restricted);
76
+ });
77
+ const tokens = new Set();
78
+ rule.assets.forEach((a, i) => {
79
+ const address = typeof a.token === 'string' ? a.token : a.token?.address;
80
+ if (typeof address !== 'string')
81
+ throw invalid(`assets[${i}].token is missing an address`);
82
+ const key = address.toLowerCase();
83
+ if (tokens.has(key))
84
+ throw invalid(`assets[${i}] duplicates an earlier token`);
85
+ tokens.add(key);
86
+ cap(a.maxPerCall, `assets[${i}].maxPerCall`);
87
+ cap((0, defaults_1.withDefault)(a.maxTotal, defaults_1.AGENTIC_DEFAULTS.universal.assetMaxTotal), `assets[${i}].maxTotal`);
88
+ });
89
+ }
90
+ function encodeUniversalRule(rule, ctx) {
91
+ if (rule.chainNamespace.startsWith('solana:'))
92
+ (0, capabilities_1.requireCapability)(ctx.capabilities, capabilities_1.AgenticCapability.UNIVERSAL_SVM_RULES);
93
+ validateUniversalRuleShape(rule, ctx.nowSeconds);
94
+ (0, capabilities_1.requireCapability)(ctx.capabilities, rule.chainNamespace.startsWith('solana:')
95
+ ? capabilities_1.AgenticCapability.UNIVERSAL_SVM_RULES
96
+ : capabilities_1.AgenticCapability.UNIVERSAL_EVM_RULES);
97
+ const resolved = ctx.universal?.get(rule);
98
+ if (!resolved || !ctx.gateway)
99
+ throw invalid('universal encoding requires resolved wallet CEA, PRC20 assets and gateway context');
100
+ if (resolved.assets.length < 1 ||
101
+ resolved.assets.length > exports.MAX_ASSETS ||
102
+ new Set(resolved.assets.map((a) => a.token.toLowerCase())).size !==
103
+ resolved.assets.length)
104
+ throw invalid('resolved assets must be 1..8 distinct PRC20s');
105
+ if (!(0, viem_1.isAddress)(resolved.expectedCEA) ||
106
+ /^0x0{40}$/i.test(resolved.expectedCEA))
107
+ throw invalid('expectedCEA must be a non-zero wallet destination account');
108
+ const terms = {
109
+ validUntil: rule.validUntil,
110
+ expectedCEA: (0, viem_1.getAddress)(resolved.expectedCEA),
111
+ assets: resolved.assets,
112
+ maxGasPerCall: rule.maxGasPerCall,
113
+ allowedCalls: rule.allowedCalls.map((call) => ({
114
+ pins: call.pins ?? [],
115
+ target: (0, viem_1.getAddress)(call.target),
116
+ selector: (0, selectors_1.parseSelector)(call.selector).selector,
117
+ hasBeneficiary: call.beneficiary !== undefined || call.beneficiaryOffset !== undefined,
118
+ beneficiaryOffset: call.beneficiaryOffset ??
119
+ (call.beneficiary === undefined
120
+ ? 0
121
+ : (0, abi_layout_1.argumentOffset)((0, selectors_1.parseSelector)(call.selector).inputs, call.beneficiary, 'beneficiary')),
122
+ maxValue: (0, defaults_1.withDefault)(call.maxValue, defaults_1.AGENTIC_DEFAULTS.universal.allowedCallMaxValue),
123
+ })),
124
+ };
125
+ const agent = (0, viem_1.getAddress)(rule.agent);
126
+ return {
127
+ rule,
128
+ agent,
129
+ chainNamespace: rule.chainNamespace,
130
+ universalTerms: terms,
131
+ session: (0, session_1.buildSession)({
132
+ validator: ctx.validator,
133
+ agent,
134
+ rulesPolicy: ctx.rulesPolicy,
135
+ actions: [
136
+ {
137
+ target: ctx.gateway,
138
+ selector: v6_1.SEND_OUTBOUND_SELECTOR,
139
+ initData: (0, session_1.encodeEnvelope)(rule.chainNamespace, (0, universal_terms_1.encodeUniversalTerms)(terms)),
140
+ },
141
+ ],
142
+ }),
143
+ };
144
+ }
145
+ /** Source token addresses must be resolved from each PRC20 before calling this. */
146
+ function universalTermsToRule(terms, agent, chainNamespace, tokens) {
147
+ if (tokens.length !== terms.assets.length)
148
+ throw invalid('origin-token list does not match stored asset order');
149
+ return {
150
+ agent,
151
+ chainNamespace,
152
+ validUntil: Number(terms.validUntil),
153
+ maxGasPerCall: terms.maxGasPerCall,
154
+ assets: terms.assets.map((a, i) => ({
155
+ token: tokens[i],
156
+ maxPerCall: a.maxPerCall,
157
+ maxTotal: a.maxTotal,
158
+ })),
159
+ allowedCalls: terms.allowedCalls.map((c) => ({
160
+ pins: [...c.pins],
161
+ target: c.target,
162
+ selector: c.selector,
163
+ maxValue: c.maxValue,
164
+ ...(c.hasBeneficiary
165
+ ? { beneficiaryOffset: Number(c.beneficiaryOffset) }
166
+ : {}),
167
+ })),
168
+ };
169
+ }
170
+ function invalid(message) {
171
+ return new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.INVALID_RULE, message);
172
+ }
173
+ //# sourceMappingURL=universal.js.map
@@ -0,0 +1,12 @@
1
+ /** Public section-7 discovery constants; deployment wiring stays internal. */
2
+ export declare const AGENTIC: Readonly<{
3
+ WALLET: "agentic:wallet";
4
+ PRESETS: Readonly<{
5
+ CATEGORY: Readonly<{
6
+ DEXES: "DEXES";
7
+ LENDING: "LENDING";
8
+ STAKING: "STAKING";
9
+ PREDICTION: "PREDICTION";
10
+ }>;
11
+ }>;
12
+ }>;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AGENTIC = void 0;
4
+ /** Public section-7 discovery constants; deployment wiring stays internal. */
5
+ exports.AGENTIC = Object.freeze({
6
+ WALLET: 'agentic:wallet',
7
+ PRESETS: Object.freeze({
8
+ CATEGORY: Object.freeze({
9
+ DEXES: 'DEXES',
10
+ LENDING: 'LENDING',
11
+ STAKING: 'STAKING',
12
+ PREDICTION: 'PREDICTION',
13
+ }),
14
+ }),
15
+ });
16
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1,29 @@
1
+ import { type Address } from 'viem';
2
+ import { CHAIN } from '../constants/enums';
3
+ import { type AgenticGeneration } from './deployments';
4
+ import type { AgenticRuntime } from './runtime';
5
+ import type { AgenticDoor } from './agentic.types';
6
+ /**
7
+ * Identity of an agentic client. Three values stay separate:
8
+ * - signerOrigin: the key that signs (universal.origin)
9
+ * - signerPushAccount: its Push identity — EOA or UEA for its origin chain;
10
+ * pays Push gas and is the identity ownership checks use
11
+ * - wallet: the AGW, the execution account (universal.account)
12
+ */
13
+ export interface AgenticExecutionContext {
14
+ wallet: Address;
15
+ door: AgenticDoor;
16
+ signerPushAccount: Address;
17
+ signerOrigin: {
18
+ chain: CHAIN;
19
+ address: string;
20
+ };
21
+ generation: AgenticGeneration;
22
+ }
23
+ /**
24
+ * Initialization-time resolution for `initialize(signer, { agenticWallet })`.
25
+ * Owner → owner door. Otherwise at least one ENABLED rule must name the
26
+ * signer's Push identity (expired-but-enabled still qualifies; expiry is an
27
+ * on-chain send check). Nothing here is cached for later sends.
28
+ */
29
+ export declare function resolveAgenticContext(runtime: AgenticRuntime, walletInput: string): Promise<AgenticExecutionContext>;
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveAgenticContext = resolveAgenticContext;
4
+ const viem_1 = require("viem");
5
+ const capabilities_1 = require("./capabilities");
6
+ const deployments_1 = require("./deployments");
7
+ const errors_1 = require("./errors");
8
+ const rules_1 = require("./reads/rules");
9
+ const snapshot_1 = require("./reads/snapshot");
10
+ /**
11
+ * Initialization-time resolution for `initialize(signer, { agenticWallet })`.
12
+ * Owner → owner door. Otherwise at least one ENABLED rule must name the
13
+ * signer's Push identity (expired-but-enabled still qualifies; expiry is an
14
+ * on-chain send check). Nothing here is cached for later sends.
15
+ */
16
+ async function resolveAgenticContext(runtime, walletInput) {
17
+ let wallet;
18
+ try {
19
+ wallet = (0, viem_1.getAddress)(walletInput);
20
+ }
21
+ catch (cause) {
22
+ throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.NOT_AGENTIC_WALLET, `"${walletInput}" is not an address`, {
23
+ cause,
24
+ });
25
+ }
26
+ const generation = await (0, deployments_1.resolveWalletGeneration)(runtime.reader, runtime.network, wallet);
27
+ const signerPushAccount = runtime.signerPushAccount();
28
+ const snap = await snapshot_1.Snapshot.at(runtime.reader);
29
+ const owner = (0, viem_1.getAddress)(await snap.read(wallet, generation.contracts.abis.wallet, 'owner'));
30
+ let door;
31
+ if (owner === signerPushAccount) {
32
+ (0, capabilities_1.requireCapability)(generation.capabilities, capabilities_1.AgenticCapability.OWNER_EXECUTE);
33
+ door = 'owner';
34
+ }
35
+ else {
36
+ (0, capabilities_1.requireCapability)(generation.capabilities, capabilities_1.AgenticCapability.AGENT_EXECUTE);
37
+ const active = await (0, rules_1.readActiveRules)(snap, generation, wallet);
38
+ if (!active.some((r) => r.agent === signerPushAccount)) {
39
+ throw new errors_1.AgenticError(errors_1.AGENTIC_ERROR_CODE.NOT_OWNER_OR_AGENT, `${signerPushAccount} is neither the owner of ${wallet} nor the agent of an enabled rule`, {
40
+ hint: runtime.signerIsPushNative()
41
+ ? 'Grant a rule to this Push address, or initialize with the owner signer.'
42
+ : 'An external key acts through its UEA for the chain it was initialized on; grant the rule to that UEA (PushChain.utils.account.deriveExecutorAccount).',
43
+ details: { wallet, signerPushAccount, owner },
44
+ });
45
+ }
46
+ door = 'agent';
47
+ }
48
+ return {
49
+ wallet,
50
+ door,
51
+ signerPushAccount,
52
+ signerOrigin: runtime.signerOrigin(),
53
+ generation,
54
+ };
55
+ }
56
+ //# sourceMappingURL=context.js.map