@haneullabs/wallet-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (133) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/README.md +1 -0
  3. package/dist/cjs/auto-approvals/analyzer.d.ts +71 -0
  4. package/dist/cjs/auto-approvals/analyzer.js +70 -0
  5. package/dist/cjs/auto-approvals/analyzer.js.map +7 -0
  6. package/dist/cjs/auto-approvals/index.d.ts +6 -0
  7. package/dist/cjs/auto-approvals/index.js +33 -0
  8. package/dist/cjs/auto-approvals/index.js.map +7 -0
  9. package/dist/cjs/auto-approvals/intent.d.ts +5 -0
  10. package/dist/cjs/auto-approvals/intent.js +65 -0
  11. package/dist/cjs/auto-approvals/intent.js.map +7 -0
  12. package/dist/cjs/auto-approvals/manager.d.ts +31 -0
  13. package/dist/cjs/auto-approvals/manager.js +328 -0
  14. package/dist/cjs/auto-approvals/manager.js.map +7 -0
  15. package/dist/cjs/auto-approvals/schemas/index.d.ts +4 -0
  16. package/dist/cjs/auto-approvals/schemas/index.js +28 -0
  17. package/dist/cjs/auto-approvals/schemas/index.js.map +7 -0
  18. package/dist/cjs/auto-approvals/schemas/policy.d.ts +145 -0
  19. package/dist/cjs/auto-approvals/schemas/policy.js +79 -0
  20. package/dist/cjs/auto-approvals/schemas/policy.js.map +7 -0
  21. package/dist/cjs/auto-approvals/schemas/state.d.ts +115 -0
  22. package/dist/cjs/auto-approvals/schemas/state.js +49 -0
  23. package/dist/cjs/auto-approvals/schemas/state.js.map +7 -0
  24. package/dist/cjs/index.d.ts +2 -0
  25. package/dist/cjs/index.js +20 -0
  26. package/dist/cjs/index.js.map +7 -0
  27. package/dist/cjs/package.json +5 -0
  28. package/dist/cjs/transaction-analyzer/analyzer.d.ts +34 -0
  29. package/dist/cjs/transaction-analyzer/analyzer.js +94 -0
  30. package/dist/cjs/transaction-analyzer/analyzer.js.map +7 -0
  31. package/dist/cjs/transaction-analyzer/index.d.ts +9 -0
  32. package/dist/cjs/transaction-analyzer/index.js +28 -0
  33. package/dist/cjs/transaction-analyzer/index.js.map +7 -0
  34. package/dist/cjs/transaction-analyzer/rules/accessLevel.d.ts +29 -0
  35. package/dist/cjs/transaction-analyzer/rules/accessLevel.js +106 -0
  36. package/dist/cjs/transaction-analyzer/rules/accessLevel.js.map +7 -0
  37. package/dist/cjs/transaction-analyzer/rules/coin-flows.d.ts +313 -0
  38. package/dist/cjs/transaction-analyzer/rules/coin-flows.js +179 -0
  39. package/dist/cjs/transaction-analyzer/rules/coin-flows.js.map +7 -0
  40. package/dist/cjs/transaction-analyzer/rules/coin-value.d.ts +42 -0
  41. package/dist/cjs/transaction-analyzer/rules/coin-value.js +60 -0
  42. package/dist/cjs/transaction-analyzer/rules/coin-value.js.map +7 -0
  43. package/dist/cjs/transaction-analyzer/rules/coins.d.ts +337 -0
  44. package/dist/cjs/transaction-analyzer/rules/coins.js +78 -0
  45. package/dist/cjs/transaction-analyzer/rules/coins.js.map +7 -0
  46. package/dist/cjs/transaction-analyzer/rules/commands.d.ts +366 -0
  47. package/dist/cjs/transaction-analyzer/rules/commands.js +148 -0
  48. package/dist/cjs/transaction-analyzer/rules/commands.js.map +7 -0
  49. package/dist/cjs/transaction-analyzer/rules/core.d.ts +314 -0
  50. package/dist/cjs/transaction-analyzer/rules/core.js +73 -0
  51. package/dist/cjs/transaction-analyzer/rules/core.js.map +7 -0
  52. package/dist/cjs/transaction-analyzer/rules/functions.d.ts +292 -0
  53. package/dist/cjs/transaction-analyzer/rules/functions.js +58 -0
  54. package/dist/cjs/transaction-analyzer/rules/functions.js.map +7 -0
  55. package/dist/cjs/transaction-analyzer/rules/index.d.ts +2244 -0
  56. package/dist/cjs/transaction-analyzer/rules/index.js +52 -0
  57. package/dist/cjs/transaction-analyzer/rules/index.js.map +7 -0
  58. package/dist/cjs/transaction-analyzer/rules/inputs.d.ts +313 -0
  59. package/dist/cjs/transaction-analyzer/rules/inputs.js +49 -0
  60. package/dist/cjs/transaction-analyzer/rules/inputs.js.map +7 -0
  61. package/dist/cjs/transaction-analyzer/rules/objects.d.ts +359 -0
  62. package/dist/cjs/transaction-analyzer/rules/objects.js +124 -0
  63. package/dist/cjs/transaction-analyzer/rules/objects.js.map +7 -0
  64. package/dist/cjs/util.d.ts +5 -0
  65. package/dist/cjs/util.js +17 -0
  66. package/dist/cjs/util.js.map +7 -0
  67. package/dist/esm/auto-approvals/analyzer.d.ts +71 -0
  68. package/dist/esm/auto-approvals/analyzer.js +50 -0
  69. package/dist/esm/auto-approvals/analyzer.js.map +7 -0
  70. package/dist/esm/auto-approvals/index.d.ts +6 -0
  71. package/dist/esm/auto-approvals/index.js +12 -0
  72. package/dist/esm/auto-approvals/index.js.map +7 -0
  73. package/dist/esm/auto-approvals/intent.d.ts +5 -0
  74. package/dist/esm/auto-approvals/intent.js +45 -0
  75. package/dist/esm/auto-approvals/intent.js.map +7 -0
  76. package/dist/esm/auto-approvals/manager.d.ts +31 -0
  77. package/dist/esm/auto-approvals/manager.js +308 -0
  78. package/dist/esm/auto-approvals/manager.js.map +7 -0
  79. package/dist/esm/auto-approvals/schemas/index.d.ts +4 -0
  80. package/dist/esm/auto-approvals/schemas/index.js +8 -0
  81. package/dist/esm/auto-approvals/schemas/index.js.map +7 -0
  82. package/dist/esm/auto-approvals/schemas/policy.d.ts +145 -0
  83. package/dist/esm/auto-approvals/schemas/policy.js +49 -0
  84. package/dist/esm/auto-approvals/schemas/policy.js.map +7 -0
  85. package/dist/esm/auto-approvals/schemas/state.d.ts +115 -0
  86. package/dist/esm/auto-approvals/schemas/state.js +19 -0
  87. package/dist/esm/auto-approvals/schemas/state.js.map +7 -0
  88. package/dist/esm/index.d.ts +2 -0
  89. package/dist/esm/index.js +3 -0
  90. package/dist/esm/index.js.map +7 -0
  91. package/dist/esm/package.json +5 -0
  92. package/dist/esm/transaction-analyzer/analyzer.d.ts +34 -0
  93. package/dist/esm/transaction-analyzer/analyzer.js +74 -0
  94. package/dist/esm/transaction-analyzer/analyzer.js.map +7 -0
  95. package/dist/esm/transaction-analyzer/index.d.ts +9 -0
  96. package/dist/esm/transaction-analyzer/index.js +8 -0
  97. package/dist/esm/transaction-analyzer/index.js.map +7 -0
  98. package/dist/esm/transaction-analyzer/rules/accessLevel.d.ts +29 -0
  99. package/dist/esm/transaction-analyzer/rules/accessLevel.js +86 -0
  100. package/dist/esm/transaction-analyzer/rules/accessLevel.js.map +7 -0
  101. package/dist/esm/transaction-analyzer/rules/coin-flows.d.ts +313 -0
  102. package/dist/esm/transaction-analyzer/rules/coin-flows.js +159 -0
  103. package/dist/esm/transaction-analyzer/rules/coin-flows.js.map +7 -0
  104. package/dist/esm/transaction-analyzer/rules/coin-value.d.ts +42 -0
  105. package/dist/esm/transaction-analyzer/rules/coin-value.js +40 -0
  106. package/dist/esm/transaction-analyzer/rules/coin-value.js.map +7 -0
  107. package/dist/esm/transaction-analyzer/rules/coins.d.ts +337 -0
  108. package/dist/esm/transaction-analyzer/rules/coins.js +58 -0
  109. package/dist/esm/transaction-analyzer/rules/coins.js.map +7 -0
  110. package/dist/esm/transaction-analyzer/rules/commands.d.ts +366 -0
  111. package/dist/esm/transaction-analyzer/rules/commands.js +128 -0
  112. package/dist/esm/transaction-analyzer/rules/commands.js.map +7 -0
  113. package/dist/esm/transaction-analyzer/rules/core.d.ts +314 -0
  114. package/dist/esm/transaction-analyzer/rules/core.js +53 -0
  115. package/dist/esm/transaction-analyzer/rules/core.js.map +7 -0
  116. package/dist/esm/transaction-analyzer/rules/functions.d.ts +292 -0
  117. package/dist/esm/transaction-analyzer/rules/functions.js +38 -0
  118. package/dist/esm/transaction-analyzer/rules/functions.js.map +7 -0
  119. package/dist/esm/transaction-analyzer/rules/index.d.ts +2244 -0
  120. package/dist/esm/transaction-analyzer/rules/index.js +32 -0
  121. package/dist/esm/transaction-analyzer/rules/index.js.map +7 -0
  122. package/dist/esm/transaction-analyzer/rules/inputs.d.ts +313 -0
  123. package/dist/esm/transaction-analyzer/rules/inputs.js +29 -0
  124. package/dist/esm/transaction-analyzer/rules/inputs.js.map +7 -0
  125. package/dist/esm/transaction-analyzer/rules/objects.d.ts +359 -0
  126. package/dist/esm/transaction-analyzer/rules/objects.js +104 -0
  127. package/dist/esm/transaction-analyzer/rules/objects.js.map +7 -0
  128. package/dist/esm/util.d.ts +5 -0
  129. package/dist/esm/util.js +1 -0
  130. package/dist/esm/util.js.map +7 -0
  131. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  132. package/dist/tsconfig.tsbuildinfo +1 -0
  133. package/package.json +59 -0
@@ -0,0 +1,328 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __typeError = (msg) => {
7
+ throw TypeError(msg);
8
+ };
9
+ var __export = (target, all) => {
10
+ for (var name in all)
11
+ __defProp(target, name, { get: all[name], enumerable: true });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from))
16
+ if (!__hasOwnProp.call(to, key) && key !== except)
17
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
18
+ }
19
+ return to;
20
+ };
21
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
22
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
23
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
24
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
25
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
26
+ var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
27
+ var manager_exports = {};
28
+ __export(manager_exports, {
29
+ AutoApprovalManager: () => AutoApprovalManager
30
+ });
31
+ module.exports = __toCommonJS(manager_exports);
32
+ var import_valibot = require("valibot");
33
+ var import_state = require("./schemas/state.js");
34
+ var import_policy = require("./schemas/policy.js");
35
+ var import_utils = require("@haneullabs/haneul/utils");
36
+ var _state, _AutoApprovalManager_instances, matchesPolicy_fn, canAutoApprove_fn, revertCoinFlows_fn, removePendingDigest_fn;
37
+ class AutoApprovalManager {
38
+ constructor(options) {
39
+ __privateAdd(this, _AutoApprovalManager_instances);
40
+ __privateAdd(this, _state);
41
+ let state = null;
42
+ if (options.state) {
43
+ const parseResult = (0, import_valibot.safeParse)(import_state.AutoApprovalStateSchema, JSON.parse(options.state));
44
+ if (parseResult.success) {
45
+ const providedPolicy = (0, import_valibot.parse)(import_policy.AutoApprovalPolicySchema, JSON.parse(options.policy));
46
+ const currentPolicy = parseResult.output.policy;
47
+ if (JSON.stringify(currentPolicy) === JSON.stringify(providedPolicy)) {
48
+ state = parseResult.output;
49
+ }
50
+ }
51
+ }
52
+ __privateSet(this, _state, state ?? (0, import_valibot.parse)(import_state.AutoApprovalStateSchema, {
53
+ schemaVersion: "1.0.0",
54
+ policy: (0, import_valibot.parse)(import_policy.AutoApprovalPolicySchema, JSON.parse(options.policy)),
55
+ settings: null,
56
+ pendingDigests: []
57
+ }));
58
+ }
59
+ checkTransaction(analysis) {
60
+ const results = {
61
+ matchesPolicy: false,
62
+ canAutoApprove: false,
63
+ analysisIssues: [...analysis.issues ?? []],
64
+ policyIssues: [],
65
+ settingsIssues: []
66
+ };
67
+ if (results.analysisIssues.length > 0) {
68
+ return results;
69
+ }
70
+ const policyIssues = __privateMethod(this, _AutoApprovalManager_instances, matchesPolicy_fn).call(this, analysis);
71
+ if (policyIssues.length > 0) {
72
+ results.policyIssues = policyIssues;
73
+ return results;
74
+ } else {
75
+ results.matchesPolicy = true;
76
+ }
77
+ const settingsIssues = __privateMethod(this, _AutoApprovalManager_instances, canAutoApprove_fn).call(this, analysis);
78
+ if (settingsIssues.length > 0) {
79
+ results.settingsIssues = settingsIssues;
80
+ return results;
81
+ } else {
82
+ results.canAutoApprove = true;
83
+ }
84
+ return results;
85
+ }
86
+ // TODO: we should ensure that only 1 tx is pending at a time, and pending txs can't increase budgets
87
+ commitTransaction(analysis) {
88
+ if (!__privateGet(this, _state).settings) {
89
+ throw new Error("No auto-approval settings configured");
90
+ }
91
+ if (!analysis.result) {
92
+ throw new Error("Transaction analysis failed");
93
+ }
94
+ if (__privateGet(this, _state).settings.remainingTransactions !== null && __privateGet(this, _state).settings) {
95
+ __privateGet(this, _state).settings.remainingTransactions = Math.max(
96
+ 0,
97
+ __privateGet(this, _state).settings.remainingTransactions - 1
98
+ );
99
+ }
100
+ for (const outflow of analysis.result.coinFlows.outflows) {
101
+ if (__privateGet(this, _state).settings.coinBudgets[outflow.coinType] !== void 0) {
102
+ const currentBudget = BigInt(__privateGet(this, _state).settings?.coinBudgets[outflow.coinType] ?? "0");
103
+ const newBalance = currentBudget - outflow.amount;
104
+ __privateGet(this, _state).settings.coinBudgets[outflow.coinType] = newBalance.toString();
105
+ } else {
106
+ if (__privateGet(this, _state).settings.sharedBudget === null) {
107
+ throw new Error("No budget available for coin type " + outflow.coinType);
108
+ }
109
+ const coinValue = analysis.result.coinValues.coinTypes.find(
110
+ (ct) => ct.coinType === outflow.coinType
111
+ );
112
+ if (!coinValue) {
113
+ throw new Error("No value available for coin type " + outflow.coinType);
114
+ }
115
+ __privateGet(this, _state).settings.sharedBudget -= coinValue.convertedAmount;
116
+ }
117
+ }
118
+ __privateGet(this, _state).pendingDigests.push(analysis.result.digest);
119
+ }
120
+ revertTransaction(analysis) {
121
+ if (analysis.result?.digest) {
122
+ __privateMethod(this, _AutoApprovalManager_instances, removePendingDigest_fn).call(this, analysis.result?.digest);
123
+ }
124
+ if (__privateGet(this, _state).settings?.remainingTransactions !== null && __privateGet(this, _state).settings) {
125
+ __privateGet(this, _state).settings.remainingTransactions += 1;
126
+ }
127
+ __privateMethod(this, _AutoApprovalManager_instances, revertCoinFlows_fn).call(this, analysis);
128
+ }
129
+ applyTransactionEffects(analysis, result) {
130
+ __privateMethod(this, _AutoApprovalManager_instances, removePendingDigest_fn).call(this, result.digest);
131
+ if (!__privateGet(this, _state).settings) {
132
+ throw new Error("No auto-approval settings configured");
133
+ }
134
+ if (!analysis.result) {
135
+ throw new Error("Transaction analysis failed");
136
+ }
137
+ __privateMethod(this, _AutoApprovalManager_instances, revertCoinFlows_fn).call(this, analysis);
138
+ for (const change of result.balanceChanges) {
139
+ if (__privateGet(this, _state).settings.coinBudgets[change.coinType] !== void 0) {
140
+ const currentBudget = BigInt(__privateGet(this, _state).settings?.coinBudgets[change.coinType] ?? "0");
141
+ const newBalance = currentBudget + BigInt(change.amount);
142
+ if (__privateGet(this, _state).settings) {
143
+ __privateGet(this, _state).settings.coinBudgets[change.coinType] = newBalance.toString();
144
+ }
145
+ } else {
146
+ if (__privateGet(this, _state).settings.sharedBudget === null) {
147
+ throw new Error("No budget available for coin type " + change.coinType);
148
+ }
149
+ const coinValue = analysis.result.coinValues.coinTypes.find(
150
+ (ct) => ct.coinType === change.coinType
151
+ );
152
+ if (!coinValue) {
153
+ throw new Error("No value available for coin type " + change.coinType);
154
+ }
155
+ const convertedChange = Number(change.amount) / 10 ** coinValue.decimals * coinValue.price;
156
+ __privateGet(this, _state).settings.sharedBudget += convertedChange;
157
+ }
158
+ }
159
+ }
160
+ reset() {
161
+ __privateSet(this, _state, {
162
+ schemaVersion: "1.0.0",
163
+ policy: __privateGet(this, _state).policy,
164
+ settings: null,
165
+ pendingDigests: []
166
+ });
167
+ }
168
+ export() {
169
+ return JSON.stringify((0, import_valibot.parse)(import_state.AutoApprovalStateSchema, __privateGet(this, _state)));
170
+ }
171
+ getState() {
172
+ return (0, import_valibot.parse)(import_state.AutoApprovalStateSchema, __privateGet(this, _state));
173
+ }
174
+ getSettings() {
175
+ return __privateGet(this, _state).settings;
176
+ }
177
+ updateSettings(settings) {
178
+ const validatedSettings = (0, import_valibot.parse)(import_policy.AutoApprovalSettingsSchema, settings);
179
+ __privateGet(this, _state).settings = validatedSettings;
180
+ }
181
+ }
182
+ _state = new WeakMap();
183
+ _AutoApprovalManager_instances = new WeakSet();
184
+ matchesPolicy_fn = function(analysis) {
185
+ const issues = [];
186
+ if (analysis.issues) {
187
+ issues.push({ message: "Transaction analysis failed" });
188
+ return issues;
189
+ }
190
+ if (!analysis.result.operationType) {
191
+ issues.push({ message: "Operation type not found in Transaction" });
192
+ return issues;
193
+ }
194
+ const operation = __privateGet(this, _state).policy.operations.find(
195
+ (op) => op.id === analysis.result.operationType
196
+ );
197
+ if (!operation) {
198
+ issues.push({ message: "Operation not found in policy" });
199
+ return issues;
200
+ }
201
+ if (!operation.permissions.anyBalance) {
202
+ for (const flow of analysis.result.coinFlows.outflows) {
203
+ if (!operation.permissions.balances?.find((b) => b.coinType === flow.coinType)) {
204
+ issues.push({
205
+ message: `Operation does not have permission to use coin type ${flow.coinType}`
206
+ });
207
+ }
208
+ }
209
+ }
210
+ for (const obj of analysis.result.ownedObjects) {
211
+ if (isCoinType(obj.type)) {
212
+ continue;
213
+ }
214
+ const accessLevel = analysis.result.accessLevel[obj.id];
215
+ if (!accessLevel) {
216
+ issues.push({ message: `Access level could not be determined for object ${obj.id}` });
217
+ }
218
+ const ownedObjectsPermission = operation.permissions.ownedObjects?.find(
219
+ (p) => p.objectType === obj.type
220
+ );
221
+ if (!ownedObjectsPermission) {
222
+ issues.push({ message: `No permission found for object ${obj.id}` });
223
+ } else if (!compareAccessLevel(ownedObjectsPermission.accessLevel, accessLevel)) {
224
+ issues.push({
225
+ message: `Insufficient access level for object ${obj.id}: required ${ownedObjectsPermission.accessLevel}, got ${accessLevel}`
226
+ });
227
+ }
228
+ }
229
+ return issues;
230
+ function compareAccessLevel(required, actual) {
231
+ if (required === "read") {
232
+ return true;
233
+ }
234
+ if (required === "mutate") {
235
+ return actual === "mutate" || actual === "transfer";
236
+ }
237
+ return actual === "transfer";
238
+ }
239
+ };
240
+ canAutoApprove_fn = function(analysis) {
241
+ const issues = [];
242
+ if (!__privateGet(this, _state).settings) {
243
+ issues.push({ message: "No auto-approval settings configured" });
244
+ return issues;
245
+ }
246
+ if (analysis.issues) {
247
+ issues.push({ message: "Transaction analysis failed" });
248
+ return issues;
249
+ }
250
+ if (/* @__PURE__ */ new Date() > new Date(__privateGet(this, _state).settings.expiration)) {
251
+ issues.push({ message: "Auto-approval settings have expired" });
252
+ }
253
+ if (__privateGet(this, _state).settings.remainingTransactions !== null && __privateGet(this, _state).settings.remainingTransactions <= 0) {
254
+ issues.push({ message: "No remaining auto-approved transactions" });
255
+ }
256
+ if (!analysis.result.operationType || !__privateGet(this, _state).settings.approvedOperations.includes(analysis.result.operationType)) {
257
+ issues.push({ message: "Operation type not approved for auto-approval" });
258
+ }
259
+ for (const outflow of analysis.result.coinFlows.outflows) {
260
+ if (outflow.amount <= 0n) {
261
+ continue;
262
+ }
263
+ if (__privateGet(this, _state).settings.coinBudgets[outflow.coinType] !== void 0) {
264
+ const coinBudget = __privateGet(this, _state).settings.coinBudgets[outflow.coinType];
265
+ if (coinBudget) {
266
+ if (BigInt(coinBudget) < outflow.amount) {
267
+ issues.push({
268
+ message: `Insufficient budget for coin type ${outflow.coinType}`
269
+ });
270
+ }
271
+ }
272
+ } else {
273
+ const coinAmount = analysis.result.coinValues.coinTypes.find(
274
+ (ct) => ct.coinType === outflow.coinType
275
+ );
276
+ if (!coinAmount) {
277
+ issues.push({
278
+ message: `No budget configured for coin type ${outflow.coinType}`
279
+ });
280
+ } else if ((__privateGet(this, _state).settings.sharedBudget ?? 0) < coinAmount.convertedAmount) {
281
+ issues.push({
282
+ message: `Insufficient budget for coin type ${outflow.coinType}`
283
+ });
284
+ }
285
+ }
286
+ }
287
+ return issues;
288
+ };
289
+ revertCoinFlows_fn = function(analysis) {
290
+ if (!__privateGet(this, _state).settings) {
291
+ throw new Error("No auto-approval settings configured");
292
+ }
293
+ if (!analysis.result) {
294
+ throw new Error("Transaction analysis failed");
295
+ }
296
+ for (const outflow of analysis.result.coinFlows.outflows) {
297
+ if (__privateGet(this, _state).settings?.coinBudgets[outflow.coinType] !== void 0) {
298
+ const currentBudget = BigInt(__privateGet(this, _state).settings?.coinBudgets[outflow.coinType] ?? "0");
299
+ const newBalance = currentBudget + outflow.amount;
300
+ __privateGet(this, _state).settings.coinBudgets[outflow.coinType] = newBalance.toString();
301
+ } else {
302
+ if (__privateGet(this, _state).settings.sharedBudget === null) {
303
+ throw new Error("No budget available for coin type " + outflow.coinType);
304
+ }
305
+ const coinValue = analysis.result.coinValues.coinTypes.find(
306
+ (ct) => ct.coinType === outflow.coinType
307
+ );
308
+ if (!coinValue) {
309
+ throw new Error("No value available for coin type " + outflow.coinType);
310
+ }
311
+ __privateGet(this, _state).settings.sharedBudget += coinValue.convertedAmount;
312
+ }
313
+ }
314
+ };
315
+ removePendingDigest_fn = function(digest) {
316
+ const pendingIndex = __privateGet(this, _state).pendingDigests.indexOf(digest);
317
+ if (pendingIndex >= 0) {
318
+ __privateGet(this, _state).pendingDigests.splice(pendingIndex, 1);
319
+ } else {
320
+ throw new Error(`Transaction with digest ${digest} not found in pending digests`);
321
+ }
322
+ };
323
+ const parsedCoinType = (0, import_utils.parseStructTag)("0x2::coin::Coin");
324
+ function isCoinType(type) {
325
+ const parsedType = (0, import_utils.parseStructTag)(type);
326
+ return parsedType.address === parsedCoinType.address && parsedType.module === parsedCoinType.module && parsedType.name === parsedCoinType.name && parsedType.typeParams.length === 1;
327
+ }
328
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/auto-approvals/manager.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { Experimental_HaneulClientTypes } from '@haneullabs/haneul/experimental';\nimport { parse, safeParse } from 'valibot';\nimport type { AutoApprovalState } from './schemas/state.js';\nimport { AutoApprovalStateSchema } from './schemas/state.js';\nimport type { AutoApprovalSettings } from './schemas/policy.js';\nimport { AutoApprovalPolicySchema, AutoApprovalSettingsSchema } from './schemas/policy.js';\nimport { parseStructTag } from '@haneullabs/haneul/utils';\nimport type { AutoApprovalResult } from './analyzer.js';\n\nexport interface AutoApprovalManagerOptions {\n\tpolicy: string;\n\tstate: string | null;\n}\n\nexport interface AutoApprovalIssue {\n\tmessage: string;\n}\n\nexport interface AutoApprovalCheck {\n\tmatchesPolicy: boolean;\n\tcanAutoApprove: boolean;\n\tpolicyIssues: AutoApprovalIssue[];\n\tsettingsIssues: AutoApprovalIssue[];\n\tanalysisIssues: AutoApprovalIssue[];\n}\n\nexport class AutoApprovalManager {\n\t#state: AutoApprovalState;\n\n\tconstructor(options: AutoApprovalManagerOptions) {\n\t\tlet state: AutoApprovalState | null = null;\n\n\t\tif (options.state) {\n\t\t\tconst parseResult = safeParse(AutoApprovalStateSchema, JSON.parse(options.state));\n\t\t\t// TODO: how do we want to handle failures\n\t\t\tif (parseResult.success) {\n\t\t\t\tconst providedPolicy = parse(AutoApprovalPolicySchema, JSON.parse(options.policy));\n\t\t\t\tconst currentPolicy = parseResult.output.policy;\n\n\t\t\t\tif (JSON.stringify(currentPolicy) === JSON.stringify(providedPolicy)) {\n\t\t\t\t\tstate = parseResult.output;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.#state =\n\t\t\tstate ??\n\t\t\tparse(AutoApprovalStateSchema, {\n\t\t\t\tschemaVersion: '1.0.0',\n\t\t\t\tpolicy: parse(AutoApprovalPolicySchema, JSON.parse(options.policy)),\n\t\t\t\tsettings: null,\n\t\t\t\tpendingDigests: [],\n\t\t\t} satisfies AutoApprovalState);\n\t}\n\n\tcheckTransaction(analysis: AutoApprovalResult): AutoApprovalCheck {\n\t\tconst results: AutoApprovalCheck = {\n\t\t\tmatchesPolicy: false,\n\t\t\tcanAutoApprove: false,\n\t\t\tanalysisIssues: [...(analysis.issues ?? [])],\n\t\t\tpolicyIssues: [],\n\t\t\tsettingsIssues: [],\n\t\t};\n\n\t\tif (results.analysisIssues.length > 0) {\n\t\t\treturn results;\n\t\t}\n\n\t\tconst policyIssues = this.#matchesPolicy(analysis);\n\n\t\tif (policyIssues.length > 0) {\n\t\t\tresults.policyIssues = policyIssues;\n\t\t\treturn results;\n\t\t} else {\n\t\t\tresults.matchesPolicy = true;\n\t\t}\n\n\t\tconst settingsIssues = this.#canAutoApprove(analysis);\n\n\t\tif (settingsIssues.length > 0) {\n\t\t\tresults.settingsIssues = settingsIssues;\n\t\t\treturn results;\n\t\t} else {\n\t\t\tresults.canAutoApprove = true;\n\t\t}\n\n\t\treturn results;\n\t}\n\n\t#matchesPolicy(analysis: AutoApprovalResult): AutoApprovalIssue[] {\n\t\tconst issues: AutoApprovalIssue[] = [];\n\n\t\tif (analysis.issues) {\n\t\t\tissues.push({ message: 'Transaction analysis failed' });\n\t\t\treturn issues;\n\t\t}\n\n\t\tif (!analysis.result.operationType) {\n\t\t\tissues.push({ message: 'Operation type not found in Transaction' });\n\n\t\t\treturn issues;\n\t\t}\n\n\t\tconst operation = this.#state.policy.operations.find(\n\t\t\t(op) => op.id === analysis.result.operationType,\n\t\t);\n\n\t\tif (!operation) {\n\t\t\tissues.push({ message: 'Operation not found in policy' });\n\t\t\treturn issues;\n\t\t}\n\n\t\tif (!operation.permissions.anyBalance) {\n\t\t\tfor (const flow of analysis.result.coinFlows.outflows) {\n\t\t\t\tif (!operation.permissions.balances?.find((b) => b.coinType === flow.coinType)) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tmessage: `Operation does not have permission to use coin type ${flow.coinType}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfor (const obj of analysis.result.ownedObjects) {\n\t\t\tif (isCoinType(obj.type)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst accessLevel = analysis.result.accessLevel[obj.id];\n\n\t\t\tif (!accessLevel) {\n\t\t\t\tissues.push({ message: `Access level could not be determined for object ${obj.id}` });\n\t\t\t}\n\n\t\t\tconst ownedObjectsPermission = operation.permissions.ownedObjects?.find(\n\t\t\t\t(p) => p.objectType === obj.type,\n\t\t\t);\n\n\t\t\tif (!ownedObjectsPermission) {\n\t\t\t\tissues.push({ message: `No permission found for object ${obj.id}` });\n\t\t\t} else if (!compareAccessLevel(ownedObjectsPermission.accessLevel, accessLevel)) {\n\t\t\t\tissues.push({\n\t\t\t\t\tmessage: `Insufficient access level for object ${obj.id}: required ${ownedObjectsPermission.accessLevel}, got ${accessLevel}`,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn issues;\n\n\t\tfunction compareAccessLevel(\n\t\t\trequired: 'read' | 'mutate' | 'transfer',\n\t\t\tactual: 'read' | 'mutate' | 'transfer',\n\t\t): boolean {\n\t\t\tif (required === 'read') {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tif (required === 'mutate') {\n\t\t\t\treturn actual === 'mutate' || actual === 'transfer';\n\t\t\t}\n\t\t\treturn actual === 'transfer';\n\t\t}\n\t}\n\n\t#canAutoApprove(analysis: AutoApprovalResult): AutoApprovalIssue[] {\n\t\tconst issues: AutoApprovalIssue[] = [];\n\n\t\tif (!this.#state.settings) {\n\t\t\tissues.push({ message: 'No auto-approval settings configured' });\n\t\t\treturn issues;\n\t\t}\n\n\t\tif (analysis.issues) {\n\t\t\tissues.push({ message: 'Transaction analysis failed' });\n\t\t\treturn issues;\n\t\t}\n\n\t\tif (new Date() > new Date(this.#state.settings.expiration)) {\n\t\t\tissues.push({ message: 'Auto-approval settings have expired' });\n\t\t}\n\n\t\tif (\n\t\t\tthis.#state.settings.remainingTransactions !== null &&\n\t\t\tthis.#state.settings.remainingTransactions <= 0\n\t\t) {\n\t\t\tissues.push({ message: 'No remaining auto-approved transactions' });\n\t\t}\n\n\t\tif (\n\t\t\t!analysis.result.operationType ||\n\t\t\t!this.#state.settings.approvedOperations.includes(analysis.result.operationType)\n\t\t) {\n\t\t\tissues.push({ message: 'Operation type not approved for auto-approval' });\n\t\t}\n\n\t\tfor (const outflow of analysis.result.coinFlows.outflows) {\n\t\t\tif (outflow.amount <= 0n) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (this.#state.settings.coinBudgets[outflow.coinType] !== undefined) {\n\t\t\t\tconst coinBudget = this.#state.settings.coinBudgets[outflow.coinType];\n\n\t\t\t\tif (coinBudget) {\n\t\t\t\t\tif (BigInt(coinBudget) < outflow.amount) {\n\t\t\t\t\t\tissues.push({\n\t\t\t\t\t\t\tmessage: `Insufficient budget for coin type ${outflow.coinType}`,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst coinAmount = analysis.result.coinValues.coinTypes.find(\n\t\t\t\t\t(ct) => ct.coinType === outflow.coinType,\n\t\t\t\t);\n\n\t\t\t\tif (!coinAmount) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tmessage: `No budget configured for coin type ${outflow.coinType}`,\n\t\t\t\t\t});\n\t\t\t\t} else if ((this.#state.settings.sharedBudget ?? 0) < coinAmount.convertedAmount) {\n\t\t\t\t\tissues.push({\n\t\t\t\t\t\tmessage: `Insufficient budget for coin type ${outflow.coinType}`,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn issues;\n\t}\n\n\t// TODO: we should ensure that only 1 tx is pending at a time, and pending txs can't increase budgets\n\tcommitTransaction(analysis: AutoApprovalResult): void {\n\t\tif (!this.#state.settings) {\n\t\t\tthrow new Error('No auto-approval settings configured');\n\t\t}\n\n\t\tif (!analysis.result) {\n\t\t\tthrow new Error('Transaction analysis failed');\n\t\t}\n\n\t\tif (this.#state.settings.remainingTransactions !== null && this.#state.settings) {\n\t\t\tthis.#state.settings.remainingTransactions = Math.max(\n\t\t\t\t0,\n\t\t\t\tthis.#state.settings.remainingTransactions - 1,\n\t\t\t);\n\t\t}\n\n\t\tfor (const outflow of analysis.result.coinFlows.outflows) {\n\t\t\tif (this.#state.settings.coinBudgets[outflow.coinType] !== undefined) {\n\t\t\t\tconst currentBudget = BigInt(this.#state.settings?.coinBudgets[outflow.coinType] ?? '0');\n\t\t\t\tconst newBalance = currentBudget - outflow.amount;\n\t\t\t\tthis.#state.settings.coinBudgets[outflow.coinType] = newBalance.toString();\n\t\t\t} else {\n\t\t\t\tif (this.#state.settings.sharedBudget === null) {\n\t\t\t\t\tthrow new Error('No budget available for coin type ' + outflow.coinType);\n\t\t\t\t}\n\n\t\t\t\tconst coinValue = analysis.result.coinValues.coinTypes.find(\n\t\t\t\t\t(ct) => ct.coinType === outflow.coinType,\n\t\t\t\t);\n\n\t\t\t\tif (!coinValue) {\n\t\t\t\t\tthrow new Error('No value available for coin type ' + outflow.coinType);\n\t\t\t\t}\n\n\t\t\t\tthis.#state.settings.sharedBudget -= coinValue.convertedAmount;\n\t\t\t}\n\t\t}\n\n\t\tthis.#state.pendingDigests.push(analysis.result.digest);\n\t}\n\n\trevertTransaction(analysis: AutoApprovalResult): void {\n\t\tif (analysis.result?.digest) {\n\t\t\tthis.#removePendingDigest(analysis.result?.digest);\n\t\t}\n\n\t\tif (this.#state.settings?.remainingTransactions !== null && this.#state.settings) {\n\t\t\tthis.#state.settings.remainingTransactions += 1;\n\t\t}\n\n\t\tthis.#revertCoinFlows(analysis);\n\t}\n\n\t#revertCoinFlows(analysis: AutoApprovalResult): void {\n\t\tif (!this.#state.settings) {\n\t\t\tthrow new Error('No auto-approval settings configured');\n\t\t}\n\n\t\tif (!analysis.result) {\n\t\t\tthrow new Error('Transaction analysis failed');\n\t\t}\n\n\t\tfor (const outflow of analysis.result.coinFlows.outflows) {\n\t\t\tif (this.#state.settings?.coinBudgets[outflow.coinType] !== undefined) {\n\t\t\t\tconst currentBudget = BigInt(this.#state.settings?.coinBudgets[outflow.coinType] ?? '0');\n\t\t\t\tconst newBalance = currentBudget + outflow.amount;\n\t\t\t\tthis.#state.settings.coinBudgets[outflow.coinType] = newBalance.toString();\n\t\t\t} else {\n\t\t\t\tif (this.#state.settings.sharedBudget === null) {\n\t\t\t\t\tthrow new Error('No budget available for coin type ' + outflow.coinType);\n\t\t\t\t}\n\n\t\t\t\tconst coinValue = analysis.result.coinValues.coinTypes.find(\n\t\t\t\t\t(ct) => ct.coinType === outflow.coinType,\n\t\t\t\t);\n\n\t\t\t\tif (!coinValue) {\n\t\t\t\t\tthrow new Error('No value available for coin type ' + outflow.coinType);\n\t\t\t\t}\n\n\t\t\t\tthis.#state.settings.sharedBudget += coinValue.convertedAmount;\n\t\t\t}\n\t\t}\n\t}\n\n\t#removePendingDigest(digest: string): void {\n\t\tconst pendingIndex = this.#state.pendingDigests.indexOf(digest);\n\t\tif (pendingIndex >= 0) {\n\t\t\tthis.#state.pendingDigests.splice(pendingIndex, 1);\n\t\t} else {\n\t\t\tthrow new Error(`Transaction with digest ${digest} not found in pending digests`);\n\t\t}\n\t}\n\n\tapplyTransactionEffects(\n\t\tanalysis: AutoApprovalResult,\n\t\tresult: Experimental_HaneulClientTypes.TransactionResponse,\n\t): void {\n\t\tthis.#removePendingDigest(result.digest);\n\n\t\tif (!this.#state.settings) {\n\t\t\tthrow new Error('No auto-approval settings configured');\n\t\t}\n\n\t\tif (!analysis.result) {\n\t\t\tthrow new Error('Transaction analysis failed');\n\t\t}\n\n\t\t// Revert coin flows and use real balance changes instead\n\t\tthis.#revertCoinFlows(analysis);\n\n\t\tfor (const change of result.balanceChanges) {\n\t\t\tif (this.#state.settings.coinBudgets[change.coinType] !== undefined) {\n\t\t\t\tconst currentBudget = BigInt(this.#state.settings?.coinBudgets[change.coinType] ?? '0');\n\t\t\t\tconst newBalance = currentBudget + BigInt(change.amount);\n\t\t\t\tif (this.#state.settings) {\n\t\t\t\t\tthis.#state.settings.coinBudgets[change.coinType] = newBalance.toString();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.#state.settings.sharedBudget === null) {\n\t\t\t\t\tthrow new Error('No budget available for coin type ' + change.coinType);\n\t\t\t\t}\n\n\t\t\t\tconst coinValue = analysis.result.coinValues.coinTypes.find(\n\t\t\t\t\t(ct) => ct.coinType === change.coinType,\n\t\t\t\t);\n\n\t\t\t\tif (!coinValue) {\n\t\t\t\t\tthrow new Error('No value available for coin type ' + change.coinType);\n\t\t\t\t}\n\n\t\t\t\tconst convertedChange =\n\t\t\t\t\t(Number(change.amount) / 10 ** coinValue.decimals) * coinValue.price;\n\n\t\t\t\tthis.#state.settings.sharedBudget += convertedChange;\n\t\t\t}\n\t\t}\n\t}\n\n\treset() {\n\t\tthis.#state = {\n\t\t\tschemaVersion: '1.0.0',\n\t\t\tpolicy: this.#state.policy,\n\t\t\tsettings: null,\n\t\t\tpendingDigests: [],\n\t\t};\n\t}\n\n\texport(): string {\n\t\treturn JSON.stringify(parse(AutoApprovalStateSchema, this.#state));\n\t}\n\n\tgetState(): AutoApprovalState {\n\t\treturn parse(AutoApprovalStateSchema, this.#state);\n\t}\n\n\tgetSettings(): AutoApprovalSettings | null {\n\t\treturn this.#state.settings;\n\t}\n\n\tupdateSettings(settings: AutoApprovalSettings): void {\n\t\tconst validatedSettings = parse(AutoApprovalSettingsSchema, settings);\n\t\tthis.#state.settings = validatedSettings;\n\t}\n}\n\nconst parsedCoinType = parseStructTag('0x2::coin::Coin');\n\nfunction isCoinType(type: string): boolean {\n\tconst parsedType = parseStructTag(type);\n\treturn (\n\t\tparsedType.address === parsedCoinType.address &&\n\t\tparsedType.module === parsedCoinType.module &&\n\t\tparsedType.name === parsedCoinType.name &&\n\t\tparsedType.typeParams.length === 1\n\t);\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,4 @@
1
+ export { AutoApprovalPolicySchema, AutoApprovalSettingsSchema } from './policy.js';
2
+ export type { AutoApprovalPolicy, AutoApprovalSettings, AutoApprovalOperation, PolicyPermission, } from './policy.js';
3
+ export { AutoApprovalStateSchema } from './state.js';
4
+ export type { AutoApprovalState } from './state.js';
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var schemas_exports = {};
20
+ __export(schemas_exports, {
21
+ AutoApprovalPolicySchema: () => import_policy.AutoApprovalPolicySchema,
22
+ AutoApprovalSettingsSchema: () => import_policy.AutoApprovalSettingsSchema,
23
+ AutoApprovalStateSchema: () => import_state.AutoApprovalStateSchema
24
+ });
25
+ module.exports = __toCommonJS(schemas_exports);
26
+ var import_policy = require("./policy.js");
27
+ var import_state = require("./state.js");
28
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/auto-approvals/schemas/index.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\nexport { AutoApprovalPolicySchema, AutoApprovalSettingsSchema } from './policy.js';\nexport type {\n\tAutoApprovalPolicy,\n\tAutoApprovalSettings,\n\tAutoApprovalOperation,\n\tPolicyPermission,\n} from './policy.js';\n\nexport { AutoApprovalStateSchema } from './state.js';\nexport type { AutoApprovalState } from './state.js';\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEA,oBAAqE;AAQrE,mBAAwC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,145 @@
1
+ import * as v from 'valibot';
2
+ declare const ObjectTypePermissionSchema: v.ObjectSchema<{
3
+ readonly $kind: v.LiteralSchema<"ObjectType", undefined>;
4
+ readonly objectType: v.StringSchema<undefined>;
5
+ readonly accessLevel: v.UnionSchema<[v.LiteralSchema<"read", undefined>, v.LiteralSchema<"mutate", undefined>, v.LiteralSchema<"transfer", undefined>], undefined>;
6
+ readonly description: v.StringSchema<undefined>;
7
+ }, undefined>;
8
+ declare const CoinBalancePermissionSchema: v.ObjectSchema<{
9
+ readonly $kind: v.LiteralSchema<"CoinBalance", undefined>;
10
+ readonly coinType: v.StringSchema<undefined>;
11
+ readonly description: v.StringSchema<undefined>;
12
+ }, undefined>;
13
+ declare const AnyBalancesPermissionSchema: v.ObjectSchema<{
14
+ readonly $kind: v.LiteralSchema<"AnyBalance", undefined>;
15
+ readonly description: v.StringSchema<undefined>;
16
+ }, undefined>;
17
+ export type PolicyPermission = v.InferOutput<typeof CoinBalancePermissionSchema | typeof AnyBalancesPermissionSchema | typeof ObjectTypePermissionSchema>;
18
+ declare const AutoApprovalOperationSchema: v.ObjectSchema<{
19
+ readonly id: v.StringSchema<undefined>;
20
+ readonly description: v.StringSchema<undefined>;
21
+ readonly permissions: v.ObjectSchema<{
22
+ readonly ownedObjects: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
23
+ readonly $kind: v.LiteralSchema<"ObjectType", undefined>;
24
+ readonly objectType: v.StringSchema<undefined>;
25
+ readonly accessLevel: v.UnionSchema<[v.LiteralSchema<"read", undefined>, v.LiteralSchema<"mutate", undefined>, v.LiteralSchema<"transfer", undefined>], undefined>;
26
+ readonly description: v.StringSchema<undefined>;
27
+ }, undefined>, undefined>, undefined>;
28
+ readonly balances: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
29
+ readonly $kind: v.LiteralSchema<"CoinBalance", undefined>;
30
+ readonly coinType: v.StringSchema<undefined>;
31
+ readonly description: v.StringSchema<undefined>;
32
+ }, undefined>, undefined>, undefined>;
33
+ readonly anyBalance: v.OptionalSchema<v.ObjectSchema<{
34
+ readonly $kind: v.LiteralSchema<"AnyBalance", undefined>;
35
+ readonly description: v.StringSchema<undefined>;
36
+ }, undefined>, undefined>;
37
+ }, undefined>;
38
+ }, undefined>;
39
+ export declare const AutoApprovalSettingsSchema: v.LooseObjectSchema<{
40
+ readonly approvedOperations: v.ArraySchema<v.StringSchema<undefined>, undefined>;
41
+ readonly expiration: v.NumberSchema<undefined>;
42
+ readonly remainingTransactions: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
43
+ readonly sharedBudget: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
44
+ readonly coinBudgets: v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>;
45
+ }, undefined>;
46
+ export declare const AutoApprovalPolicySchema: v.ObjectSchema<{
47
+ readonly schemaVersion: v.LiteralSchema<"1.0.0", undefined>;
48
+ readonly operations: v.ArraySchema<v.ObjectSchema<{
49
+ readonly id: v.StringSchema<undefined>;
50
+ readonly description: v.StringSchema<undefined>;
51
+ readonly permissions: v.ObjectSchema<{
52
+ readonly ownedObjects: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
53
+ readonly $kind: v.LiteralSchema<"ObjectType", undefined>;
54
+ readonly objectType: v.StringSchema<undefined>;
55
+ readonly accessLevel: v.UnionSchema<[v.LiteralSchema<"read", undefined>, v.LiteralSchema<"mutate", undefined>, v.LiteralSchema<"transfer", undefined>], undefined>;
56
+ readonly description: v.StringSchema<undefined>;
57
+ }, undefined>, undefined>, undefined>;
58
+ readonly balances: v.OptionalSchema<v.ArraySchema<v.ObjectSchema<{
59
+ readonly $kind: v.LiteralSchema<"CoinBalance", undefined>;
60
+ readonly coinType: v.StringSchema<undefined>;
61
+ readonly description: v.StringSchema<undefined>;
62
+ }, undefined>, undefined>, undefined>;
63
+ readonly anyBalance: v.OptionalSchema<v.ObjectSchema<{
64
+ readonly $kind: v.LiteralSchema<"AnyBalance", undefined>;
65
+ readonly description: v.StringSchema<undefined>;
66
+ }, undefined>, undefined>;
67
+ }, undefined>;
68
+ }, undefined>, undefined>;
69
+ readonly suggestedSettings: v.OptionalSchema<Omit<v.LooseObjectSchema<{
70
+ readonly approvedOperations: v.ArraySchema<v.StringSchema<undefined>, undefined>;
71
+ readonly expiration: v.NumberSchema<undefined>;
72
+ readonly remainingTransactions: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
73
+ readonly sharedBudget: v.NullableSchema<v.NumberSchema<undefined>, undefined>;
74
+ readonly coinBudgets: v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>;
75
+ }, undefined>, "entries" | "~types" | "~run" | "~standard"> & {
76
+ readonly entries: {
77
+ readonly approvedOperations: v.OptionalSchema<v.ArraySchema<v.StringSchema<undefined>, undefined>, undefined>;
78
+ readonly expiration: v.OptionalSchema<v.NumberSchema<undefined>, undefined>;
79
+ readonly remainingTransactions: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
80
+ readonly sharedBudget: v.OptionalSchema<v.NullableSchema<v.NumberSchema<undefined>, undefined>, undefined>;
81
+ readonly coinBudgets: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.StringSchema<undefined>, undefined>, undefined>;
82
+ };
83
+ readonly "~standard": v.StandardProps<{
84
+ approvedOperations?: string[] | undefined;
85
+ expiration?: number | undefined;
86
+ remainingTransactions?: number | null | undefined;
87
+ sharedBudget?: number | null | undefined;
88
+ coinBudgets?: {
89
+ [x: string]: string;
90
+ } | undefined;
91
+ } & {
92
+ [key: string]: unknown;
93
+ }, {
94
+ approvedOperations?: string[] | undefined;
95
+ expiration?: number | undefined;
96
+ remainingTransactions?: number | null | undefined;
97
+ sharedBudget?: number | null | undefined;
98
+ coinBudgets?: {
99
+ [x: string]: string;
100
+ } | undefined;
101
+ } & {
102
+ [key: string]: unknown;
103
+ }>;
104
+ readonly "~run": (dataset: v.UnknownDataset, config: v.Config<v.BaseIssue<unknown>>) => v.OutputDataset<{
105
+ approvedOperations?: string[] | undefined;
106
+ expiration?: number | undefined;
107
+ remainingTransactions?: number | null | undefined;
108
+ sharedBudget?: number | null | undefined;
109
+ coinBudgets?: {
110
+ [x: string]: string;
111
+ } | undefined;
112
+ } & {
113
+ [key: string]: unknown;
114
+ }, v.StringIssue | v.ArrayIssue | v.NumberIssue | v.RecordIssue | v.LooseObjectIssue>;
115
+ readonly "~types"?: {
116
+ readonly input: {
117
+ approvedOperations?: string[] | undefined;
118
+ expiration?: number | undefined;
119
+ remainingTransactions?: number | null | undefined;
120
+ sharedBudget?: number | null | undefined;
121
+ coinBudgets?: {
122
+ [x: string]: string;
123
+ } | undefined;
124
+ } & {
125
+ [key: string]: unknown;
126
+ };
127
+ readonly output: {
128
+ approvedOperations?: string[] | undefined;
129
+ expiration?: number | undefined;
130
+ remainingTransactions?: number | null | undefined;
131
+ sharedBudget?: number | null | undefined;
132
+ coinBudgets?: {
133
+ [x: string]: string;
134
+ } | undefined;
135
+ } & {
136
+ [key: string]: unknown;
137
+ };
138
+ readonly issue: v.StringIssue | v.ArrayIssue | v.NumberIssue | v.RecordIssue | v.LooseObjectIssue;
139
+ } | undefined;
140
+ }, undefined>;
141
+ }, undefined>;
142
+ export type AutoApprovalSettings = v.InferOutput<typeof AutoApprovalSettingsSchema>;
143
+ export type AutoApprovalPolicy = v.InferOutput<typeof AutoApprovalPolicySchema>;
144
+ export type AutoApprovalOperation = v.InferOutput<typeof AutoApprovalOperationSchema>;
145
+ export {};
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+ var policy_exports = {};
30
+ __export(policy_exports, {
31
+ AutoApprovalPolicySchema: () => AutoApprovalPolicySchema,
32
+ AutoApprovalSettingsSchema: () => AutoApprovalSettingsSchema
33
+ });
34
+ module.exports = __toCommonJS(policy_exports);
35
+ var v = __toESM(require("valibot"));
36
+ const AccessLevelSchema = v.union([v.literal("read"), v.literal("mutate"), v.literal("transfer")]);
37
+ const BasePermissionSchema = v.object({
38
+ description: v.string()
39
+ });
40
+ const ObjectTypePermissionSchema = v.object({
41
+ ...BasePermissionSchema.entries,
42
+ $kind: v.literal("ObjectType"),
43
+ objectType: v.string(),
44
+ accessLevel: AccessLevelSchema
45
+ });
46
+ const CoinBalancePermissionSchema = v.object({
47
+ ...BasePermissionSchema.entries,
48
+ $kind: v.literal("CoinBalance"),
49
+ coinType: v.string()
50
+ });
51
+ const AnyBalancesPermissionSchema = v.object({
52
+ ...BasePermissionSchema.entries,
53
+ $kind: v.literal("AnyBalance")
54
+ });
55
+ const AutoApprovalOperationSchema = v.object({
56
+ id: v.string(),
57
+ description: v.string(),
58
+ permissions: v.object({
59
+ ownedObjects: v.optional(v.array(ObjectTypePermissionSchema)),
60
+ balances: v.optional(v.array(CoinBalancePermissionSchema)),
61
+ anyBalance: v.optional(AnyBalancesPermissionSchema)
62
+ })
63
+ });
64
+ const AutoApprovalSettingsSchema = v.looseObject({
65
+ approvedOperations: v.array(v.string()),
66
+ expiration: v.number(),
67
+ // TODO: figure out a better name
68
+ remainingTransactions: v.nullable(v.number()),
69
+ sharedBudget: v.nullable(v.number()),
70
+ // TODO: normalize coin types
71
+ coinBudgets: v.record(v.string(), v.string())
72
+ });
73
+ const AutoApprovalPolicySchema = v.object({
74
+ schemaVersion: v.literal("1.0.0"),
75
+ operations: v.array(AutoApprovalOperationSchema),
76
+ // TODO: do we want to split suggested settings into a different type (not everything makes sense as a suggestion)
77
+ suggestedSettings: v.optional(v.partial(AutoApprovalSettingsSchema))
78
+ });
79
+ //# sourceMappingURL=policy.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/auto-approvals/schemas/policy.ts"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport * as v from 'valibot';\n\nconst AccessLevelSchema = v.union([v.literal('read'), v.literal('mutate'), v.literal('transfer')]);\n\nconst BasePermissionSchema = v.object({\n\tdescription: v.string(),\n});\n\nconst ObjectTypePermissionSchema = v.object({\n\t...BasePermissionSchema.entries,\n\t$kind: v.literal('ObjectType'),\n\tobjectType: v.string(),\n\taccessLevel: AccessLevelSchema,\n});\n\nconst CoinBalancePermissionSchema = v.object({\n\t...BasePermissionSchema.entries,\n\t$kind: v.literal('CoinBalance'),\n\tcoinType: v.string(),\n});\n\nconst AnyBalancesPermissionSchema = v.object({\n\t...BasePermissionSchema.entries,\n\t$kind: v.literal('AnyBalance'),\n});\n\nexport type PolicyPermission = v.InferOutput<\n\t| typeof CoinBalancePermissionSchema\n\t| typeof AnyBalancesPermissionSchema\n\t| typeof ObjectTypePermissionSchema\n>;\n\nconst AutoApprovalOperationSchema = v.object({\n\tid: v.string(),\n\tdescription: v.string(),\n\tpermissions: v.object({\n\t\townedObjects: v.optional(v.array(ObjectTypePermissionSchema)),\n\t\tbalances: v.optional(v.array(CoinBalancePermissionSchema)),\n\t\tanyBalance: v.optional(AnyBalancesPermissionSchema),\n\t}),\n});\n\n// TODO: do we want to support custom settings\nexport const AutoApprovalSettingsSchema = v.looseObject({\n\tapprovedOperations: v.array(v.string()),\n\texpiration: v.number(),\n\t// TODO: figure out a better name\n\tremainingTransactions: v.nullable(v.number()),\n\tsharedBudget: v.nullable(v.number()),\n\t// TODO: normalize coin types\n\tcoinBudgets: v.record(v.string(), v.string()),\n});\n\nexport const AutoApprovalPolicySchema = v.object({\n\tschemaVersion: v.literal('1.0.0'),\n\toperations: v.array(AutoApprovalOperationSchema),\n\t// TODO: do we want to split suggested settings into a different type (not everything makes sense as a suggestion)\n\tsuggestedSettings: v.optional(v.partial(AutoApprovalSettingsSchema)),\n});\n\nexport type AutoApprovalSettings = v.InferOutput<typeof AutoApprovalSettingsSchema>;\nexport type AutoApprovalPolicy = v.InferOutput<typeof AutoApprovalPolicySchema>;\nexport type AutoApprovalOperation = v.InferOutput<typeof AutoApprovalOperationSchema>;\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,QAAmB;AAEnB,MAAM,oBAAoB,EAAE,MAAM,CAAC,EAAE,QAAQ,MAAM,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,QAAQ,UAAU,CAAC,CAAC;AAEjG,MAAM,uBAAuB,EAAE,OAAO;AAAA,EACrC,aAAa,EAAE,OAAO;AACvB,CAAC;AAED,MAAM,6BAA6B,EAAE,OAAO;AAAA,EAC3C,GAAG,qBAAqB;AAAA,EACxB,OAAO,EAAE,QAAQ,YAAY;AAAA,EAC7B,YAAY,EAAE,OAAO;AAAA,EACrB,aAAa;AACd,CAAC;AAED,MAAM,8BAA8B,EAAE,OAAO;AAAA,EAC5C,GAAG,qBAAqB;AAAA,EACxB,OAAO,EAAE,QAAQ,aAAa;AAAA,EAC9B,UAAU,EAAE,OAAO;AACpB,CAAC;AAED,MAAM,8BAA8B,EAAE,OAAO;AAAA,EAC5C,GAAG,qBAAqB;AAAA,EACxB,OAAO,EAAE,QAAQ,YAAY;AAC9B,CAAC;AAQD,MAAM,8BAA8B,EAAE,OAAO;AAAA,EAC5C,IAAI,EAAE,OAAO;AAAA,EACb,aAAa,EAAE,OAAO;AAAA,EACtB,aAAa,EAAE,OAAO;AAAA,IACrB,cAAc,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAAA,IAC5D,UAAU,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAAA,IACzD,YAAY,EAAE,SAAS,2BAA2B;AAAA,EACnD,CAAC;AACF,CAAC;AAGM,MAAM,6BAA6B,EAAE,YAAY;AAAA,EACvD,oBAAoB,EAAE,MAAM,EAAE,OAAO,CAAC;AAAA,EACtC,YAAY,EAAE,OAAO;AAAA;AAAA,EAErB,uBAAuB,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA,EAC5C,cAAc,EAAE,SAAS,EAAE,OAAO,CAAC;AAAA;AAAA,EAEnC,aAAa,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;AAC7C,CAAC;AAEM,MAAM,2BAA2B,EAAE,OAAO;AAAA,EAChD,eAAe,EAAE,QAAQ,OAAO;AAAA,EAChC,YAAY,EAAE,MAAM,2BAA2B;AAAA;AAAA,EAE/C,mBAAmB,EAAE,SAAS,EAAE,QAAQ,0BAA0B,CAAC;AACpE,CAAC;",
6
+ "names": []
7
+ }