@wowok/agent-mcp 3.1.3 → 3.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (384) hide show
  1. package/dist/config/config-audit.spec.d.ts +1 -0
  2. package/dist/config/config-audit.spec.js +1 -0
  3. package/dist/config/exposure.d.ts +108 -0
  4. package/dist/config/exposure.js +1 -0
  5. package/dist/config/index.d.ts +2 -0
  6. package/dist/config/index.js +1 -1
  7. package/dist/config/judgment.d.ts +1228 -0
  8. package/dist/config/judgment.js +1 -0
  9. package/dist/config/judgment.spec.d.ts +1 -0
  10. package/dist/config/judgment.spec.js +1 -0
  11. package/dist/config/rule-engine.d.ts +299 -0
  12. package/dist/config/rule-engine.js +1 -0
  13. package/dist/config/rule-engine.spec.d.ts +1 -0
  14. package/dist/config/rule-engine.spec.js +1 -0
  15. package/dist/config/severity.d.ts +7 -0
  16. package/dist/config/severity.js +1 -0
  17. package/dist/customer/order-monitor.d.ts +3 -1
  18. package/dist/customer/order-monitor.js +1 -1
  19. package/dist/evaluation/acceptance.d.ts +1 -0
  20. package/dist/evaluation/acceptance.js +1 -1
  21. package/dist/evaluation/arbitration-game.js +1 -1
  22. package/dist/evaluation/builtins/demand-match.js +1 -1
  23. package/dist/evaluation/builtins/graph-service.js +1 -1
  24. package/dist/evaluation/builtins/graph-service.spec.js +1 -1
  25. package/dist/evaluation/engine.js +1 -1
  26. package/dist/evaluation/game-strategy.d.ts +2 -2
  27. package/dist/evaluation/game-strategy.js +1 -1
  28. package/dist/evaluation/match-operation.d.ts +2 -2
  29. package/dist/evaluation/match-operation.js +1 -1
  30. package/dist/evaluation/standards.d.ts +3 -25
  31. package/dist/evaluation/standards.js +1 -1
  32. package/dist/evaluation/types.d.ts +2 -1
  33. package/dist/experience/realtime-feedback.js +1 -1
  34. package/dist/extensions/business-modules.js +1 -1
  35. package/dist/extensions/custom-registry-file.js +1 -1
  36. package/dist/extensions/industry-audit.spec.d.ts +1 -0
  37. package/dist/extensions/industry-audit.spec.js +1 -0
  38. package/dist/extensions/industry-layers.d.ts +8 -0
  39. package/dist/extensions/industry-layers.js +1 -1
  40. package/dist/extensions/industry-pack.d.ts +2 -0
  41. package/dist/extensions/industry-pack.js +1 -1
  42. package/dist/extensions/mode-evaluator.js +1 -1
  43. package/dist/extensions/modes.js +1 -1
  44. package/dist/graph/onchain/analyze.d.ts +3 -1
  45. package/dist/graph/onchain/analyze.js +1 -1
  46. package/dist/graph/onchain/analyze.spec.js +1 -1
  47. package/dist/graph/onchain/edge-schema.d.ts +1 -0
  48. package/dist/graph/onchain/edge-schema.js +1 -1
  49. package/dist/graph/onchain/expand.js +1 -1
  50. package/dist/graph/onchain/exploration.d.ts +28 -0
  51. package/dist/graph/onchain/exploration.js +1 -0
  52. package/dist/graph/onchain/exploration.spec.d.ts +1 -0
  53. package/dist/graph/onchain/exploration.spec.js +1 -0
  54. package/dist/graph/onchain/exposure.d.ts +18 -0
  55. package/dist/graph/onchain/exposure.js +1 -0
  56. package/dist/graph/onchain/exposure.spec.d.ts +1 -0
  57. package/dist/graph/onchain/exposure.spec.js +1 -0
  58. package/dist/graph/onchain/graph-policy.spec.d.ts +1 -0
  59. package/dist/graph/onchain/graph-policy.spec.js +1 -0
  60. package/dist/graph/onchain/index.d.ts +6 -0
  61. package/dist/graph/onchain/index.js +1 -1
  62. package/dist/graph/onchain/interest.js +1 -1
  63. package/dist/graph/onchain/interest.spec.js +1 -1
  64. package/dist/graph/onchain/names.js +1 -1
  65. package/dist/graph/onchain/names.spec.js +1 -1
  66. package/dist/graph/onchain/policy.d.ts +8 -0
  67. package/dist/graph/onchain/policy.js +1 -0
  68. package/dist/graph/onchain/proposal-graph.js +1 -1
  69. package/dist/graph/onchain/proposal-graph.spec.js +1 -1
  70. package/dist/graph/onchain/synthesis.d.ts +20 -0
  71. package/dist/graph/onchain/synthesis.js +1 -0
  72. package/dist/graph/onchain/synthesis.spec.d.ts +1 -0
  73. package/dist/graph/onchain/synthesis.spec.js +1 -0
  74. package/dist/graph/onchain/types.d.ts +11 -1
  75. package/dist/keeper/keeper.spec.js +1 -1
  76. package/dist/knowledge/alloc-audit-policy.spec.d.ts +1 -0
  77. package/dist/knowledge/alloc-audit-policy.spec.js +1 -0
  78. package/dist/knowledge/allocation-ledger.js +1 -1
  79. package/dist/knowledge/allocation-puzzle.d.ts +1 -1
  80. package/dist/knowledge/allocation-puzzle.js +1 -1
  81. package/dist/knowledge/allocation-risk.d.ts +4 -1
  82. package/dist/knowledge/allocation-risk.js +1 -1
  83. package/dist/knowledge/allocation-templates.js +1 -1
  84. package/dist/knowledge/arb-risk.d.ts +6 -5
  85. package/dist/knowledge/arb-risk.js +1 -1
  86. package/dist/knowledge/arbitration-ledger.d.ts +4 -4
  87. package/dist/knowledge/arbitration-ledger.js +1 -1
  88. package/dist/knowledge/arbitration-puzzle.d.ts +1 -1
  89. package/dist/knowledge/arbitration-puzzle.js +1 -1
  90. package/dist/knowledge/arbitration-risk.d.ts +4 -1
  91. package/dist/knowledge/arbitration-risk.js +1 -1
  92. package/dist/knowledge/arbitration-templates.js +1 -1
  93. package/dist/knowledge/baselines/judgment-baselines.json +289 -0
  94. package/dist/knowledge/baselines/risk-baselines.spec.js +1 -1
  95. package/dist/knowledge/baselines/rules/alloc_audit.json +290 -0
  96. package/dist/knowledge/baselines/rules/allocation.json +492 -0
  97. package/dist/knowledge/baselines/rules/arb.json +155 -0
  98. package/dist/knowledge/baselines/rules/arbitration.json +366 -0
  99. package/dist/knowledge/baselines/rules/bridge.json +197 -0
  100. package/dist/knowledge/baselines/rules/contact.json +152 -0
  101. package/dist/knowledge/baselines/rules/demand.json +158 -0
  102. package/dist/knowledge/baselines/rules/graph.json +453 -0
  103. package/dist/knowledge/baselines/rules/guard.json +981 -0
  104. package/dist/knowledge/baselines/rules/machine.json +706 -0
  105. package/dist/knowledge/baselines/rules/order.json +549 -0
  106. package/dist/knowledge/baselines/rules/payment.json +205 -0
  107. package/dist/knowledge/baselines/rules/permission.json +330 -0
  108. package/dist/knowledge/baselines/rules/personal.json +139 -0
  109. package/dist/knowledge/baselines/rules/progress.json +346 -0
  110. package/dist/knowledge/baselines/rules/proof.json +158 -0
  111. package/dist/knowledge/baselines/rules/registrar.json +159 -0
  112. package/dist/knowledge/baselines/rules/repository.json +244 -0
  113. package/dist/knowledge/baselines/rules/resource.json +117 -0
  114. package/dist/knowledge/baselines/rules/reward.json +471 -0
  115. package/dist/knowledge/baselines/rules/service.json +595 -0
  116. package/dist/knowledge/baselines/rules/treasury.json +440 -0
  117. package/dist/knowledge/baselines/rules/util.json +101 -0
  118. package/dist/knowledge/bridge-risk.d.ts +6 -5
  119. package/dist/knowledge/bridge-risk.js +1 -1
  120. package/dist/knowledge/builtin-templates.d.ts +26 -0
  121. package/dist/knowledge/builtin-templates.js +1 -0
  122. package/dist/knowledge/contact-risk.d.ts +6 -5
  123. package/dist/knowledge/contact-risk.js +1 -1
  124. package/dist/knowledge/demand-risk.d.ts +6 -5
  125. package/dist/knowledge/demand-risk.js +1 -1
  126. package/dist/knowledge/event-semantics.js +1 -1
  127. package/dist/knowledge/facts-sync.spec.d.ts +1 -0
  128. package/dist/knowledge/facts-sync.spec.js +1 -0
  129. package/dist/knowledge/getting-started.js +1 -1
  130. package/dist/knowledge/guard-design-patterns.js +1 -1
  131. package/dist/knowledge/guard-field-cognition.d.ts +1 -1
  132. package/dist/knowledge/guard-field-cognition.js +1 -1
  133. package/dist/knowledge/guard-ledger.js +1 -1
  134. package/dist/knowledge/guard-risk.d.ts +4 -1
  135. package/dist/knowledge/guard-risk.js +1 -1
  136. package/dist/knowledge/guard-templates.js +1 -1
  137. package/dist/knowledge/guard-translation.js +1 -1
  138. package/dist/knowledge/index.d.ts +10 -2
  139. package/dist/knowledge/index.js +1 -1
  140. package/dist/knowledge/industry-registry.js +1 -1
  141. package/dist/knowledge/industry-strategy.js +1 -1
  142. package/dist/knowledge/jsonrpc-enum.js +1 -1
  143. package/dist/knowledge/machine-ledger.js +1 -1
  144. package/dist/knowledge/machine-risk.d.ts +4 -1
  145. package/dist/knowledge/machine-risk.js +1 -1
  146. package/dist/knowledge/machine-templates.js +1 -1
  147. package/dist/knowledge/machine-translation.js +1 -1
  148. package/dist/knowledge/migration-preflight.js +1 -1
  149. package/dist/knowledge/operation-dictionary.js +1 -1
  150. package/dist/knowledge/order-ledger.js +1 -1
  151. package/dist/knowledge/order-puzzle.d.ts +3 -3
  152. package/dist/knowledge/order-puzzle.js +1 -1
  153. package/dist/knowledge/order-risk.d.ts +6 -3
  154. package/dist/knowledge/order-risk.js +1 -1
  155. package/dist/knowledge/order-templates.js +1 -1
  156. package/dist/knowledge/passport-ledger.js +1 -1
  157. package/dist/knowledge/passport-templates.js +1 -1
  158. package/dist/knowledge/payment-risk.d.ts +8 -6
  159. package/dist/knowledge/payment-risk.js +1 -1
  160. package/dist/knowledge/payment-tracker.js +1 -1
  161. package/dist/knowledge/permission-ledger.js +1 -1
  162. package/dist/knowledge/permission-puzzle.d.ts +12 -12
  163. package/dist/knowledge/permission-puzzle.js +1 -1
  164. package/dist/knowledge/permission-risk.d.ts +4 -7
  165. package/dist/knowledge/permission-risk.js +1 -1
  166. package/dist/knowledge/permission-templates.js +1 -1
  167. package/dist/knowledge/personal-risk.d.ts +6 -5
  168. package/dist/knowledge/personal-risk.js +1 -1
  169. package/dist/knowledge/progress-ledger.js +1 -1
  170. package/dist/knowledge/progress-puzzle.d.ts +2 -2
  171. package/dist/knowledge/progress-puzzle.js +1 -1
  172. package/dist/knowledge/progress-risk.d.ts +4 -1
  173. package/dist/knowledge/progress-risk.js +1 -1
  174. package/dist/knowledge/progress-templates.js +1 -1
  175. package/dist/knowledge/proof-risk.d.ts +6 -5
  176. package/dist/knowledge/proof-risk.js +1 -1
  177. package/dist/knowledge/puzzle-projections.js +1 -1
  178. package/dist/knowledge/recipient-constraint.d.ts +20 -1
  179. package/dist/knowledge/recipient-constraint.js +1 -1
  180. package/dist/knowledge/registrar-risk.d.ts +6 -5
  181. package/dist/knowledge/registrar-risk.js +1 -1
  182. package/dist/knowledge/repository-risk.d.ts +7 -6
  183. package/dist/knowledge/repository-risk.js +1 -1
  184. package/dist/knowledge/resource-risk.d.ts +6 -5
  185. package/dist/knowledge/resource-risk.js +1 -1
  186. package/dist/knowledge/reward-ledger.d.ts +1 -1
  187. package/dist/knowledge/reward-ledger.js +1 -1
  188. package/dist/knowledge/reward-puzzle.d.ts +2 -2
  189. package/dist/knowledge/reward-puzzle.js +1 -1
  190. package/dist/knowledge/reward-risk.d.ts +4 -1
  191. package/dist/knowledge/reward-risk.js +1 -1
  192. package/dist/knowledge/rule-node-analyzers.spec.js +1 -1
  193. package/dist/knowledge/rule-outcome.js +1 -1
  194. package/dist/knowledge/scenario-modes.d.ts +2 -2
  195. package/dist/knowledge/scenario-modes.js +1 -1
  196. package/dist/knowledge/scenario-topology.js +1 -1
  197. package/dist/knowledge/service-allocator-audit-node.js +1 -1
  198. package/dist/knowledge/service-ledger.js +1 -1
  199. package/dist/knowledge/service-puzzle.d.ts +2 -2
  200. package/dist/knowledge/service-puzzle.js +1 -1
  201. package/dist/knowledge/service-risk-node.js +1 -1
  202. package/dist/knowledge/service-risk.d.ts +4 -1
  203. package/dist/knowledge/service-risk.js +1 -1
  204. package/dist/knowledge/service-templates.js +1 -1
  205. package/dist/knowledge/strategy-manuals.d.ts +1 -1
  206. package/dist/knowledge/strategy-manuals.js +1 -1
  207. package/dist/knowledge/template-loader.d.ts +84 -0
  208. package/dist/knowledge/template-loader.js +1 -0
  209. package/dist/knowledge/template-loader.spec.d.ts +1 -0
  210. package/dist/knowledge/template-loader.spec.js +1 -0
  211. package/dist/knowledge/template-registry.js +1 -1
  212. package/dist/knowledge/template-scanner.d.ts +17 -0
  213. package/dist/knowledge/template-scanner.js +1 -0
  214. package/dist/knowledge/template-scanner.spec.d.ts +1 -0
  215. package/dist/knowledge/template-scanner.spec.js +1 -0
  216. package/dist/knowledge/tools-reference.js +1 -1
  217. package/dist/knowledge/treasury-ledger.d.ts +1 -1
  218. package/dist/knowledge/treasury-ledger.js +1 -1
  219. package/dist/knowledge/treasury-puzzle.d.ts +3 -3
  220. package/dist/knowledge/treasury-puzzle.js +1 -1
  221. package/dist/knowledge/treasury-risk.d.ts +4 -1
  222. package/dist/knowledge/treasury-risk.js +1 -1
  223. package/dist/knowledge/treasury-templates.js +1 -1
  224. package/dist/knowledge/util-risk.d.ts +6 -5
  225. package/dist/knowledge/util-risk.js +1 -1
  226. package/dist/knowledge/workflow-guidance.d.ts +4 -0
  227. package/dist/knowledge/workflow-guidance.js +1 -1
  228. package/dist/knowledge/workspace-lists.js +1 -1
  229. package/dist/monitor/MonitorLoop.js +1 -1
  230. package/dist/participation/arbitrator-interest.js +1 -1
  231. package/dist/participation/radar-core.js +1 -1
  232. package/dist/persona/analyzer.js +1 -1
  233. package/dist/persona/index.js +1 -1
  234. package/dist/persona/model.js +1 -1
  235. package/dist/persona/persona-audit.spec.d.ts +1 -0
  236. package/dist/persona/persona-audit.spec.js +1 -0
  237. package/dist/persona/types.d.ts +2 -0
  238. package/dist/playbooks/service-build/business-puzzle.js +1 -1
  239. package/dist/playbooks/service-build/facet-money.d.ts +11 -0
  240. package/dist/playbooks/service-build/facet-money.js +1 -1
  241. package/dist/playbooks/service-build/machine-panorama.d.ts +17 -0
  242. package/dist/playbooks/service-build/machine-panorama.js +1 -1
  243. package/dist/playbooks/service-build/merchant-guide.d.ts +2 -2
  244. package/dist/playbooks/service-build/migration-planner.d.ts +43 -0
  245. package/dist/playbooks/service-build/migration-planner.js +1 -0
  246. package/dist/playbooks/service-build/object-panorama.d.ts +42 -1
  247. package/dist/playbooks/service-build/object-panorama.js +1 -1
  248. package/dist/playbooks/service-build/participation-radar.js +1 -1
  249. package/dist/playbooks/service-build/pipeline-actions.d.ts +1 -1
  250. package/dist/playbooks/service-build/reverse-mapping.d.ts +1 -0
  251. package/dist/playbooks/service-build/reverse-mapping.js +1 -1
  252. package/dist/playbooks/service-build/risk-aggregator.d.ts +2 -1
  253. package/dist/playbooks/service-build/risk-aggregator.js +1 -1
  254. package/dist/playbooks/service-build/semantic-graph.js +1 -1
  255. package/dist/playbooks/service-build/service-panorama.d.ts +53 -1
  256. package/dist/playbooks/service-build/service-panorama.js +1 -1
  257. package/dist/playbooks/service-build/topology-evaluation.spec.js +1 -1
  258. package/dist/playbooks/service-build/topology-query.js +1 -1
  259. package/dist/playbooks/service-build/workflow-design-assessment.d.ts +2 -2
  260. package/dist/playbooks/service-build/workflow-design-assessment.js +1 -1
  261. package/dist/relationship/registry.js +1 -1
  262. package/dist/review/machine.js +1 -1
  263. package/dist/review/order.js +1 -1
  264. package/dist/review/service.js +1 -1
  265. package/dist/review/types.d.ts +7 -0
  266. package/dist/safety/confirm-gate.js +1 -1
  267. package/dist/schema/benchmark-migration/index.d.ts +207 -0
  268. package/dist/schema/benchmark-migration/index.js +1 -0
  269. package/dist/schema/call/allocation.d.ts +1 -1
  270. package/dist/schema/call/allocation.js +1 -1
  271. package/dist/schema/call/arbitration.d.ts +1 -1
  272. package/dist/schema/call/arbitration.js +1 -1
  273. package/dist/schema/call/base.d.ts +5 -5
  274. package/dist/schema/call/base.js +1 -1
  275. package/dist/schema/call/contact.d.ts +1 -1
  276. package/dist/schema/call/demand.d.ts +1 -1
  277. package/dist/schema/call/guard.d.ts +3 -3
  278. package/dist/schema/call/machine.d.ts +5 -5
  279. package/dist/schema/call/order.d.ts +3 -3
  280. package/dist/schema/call/payment.js +1 -1
  281. package/dist/schema/call/permission-handler.d.ts +1 -1
  282. package/dist/schema/call/permission-handler.js +1 -1
  283. package/dist/schema/call/permission.d.ts +16 -16
  284. package/dist/schema/call/permission.js +1 -1
  285. package/dist/schema/call/personal.d.ts +8 -8
  286. package/dist/schema/call/personal.js +1 -1
  287. package/dist/schema/call/progress.d.ts +3 -3
  288. package/dist/schema/call/repository.d.ts +11 -11
  289. package/dist/schema/call/repository.js +1 -1
  290. package/dist/schema/call/reward.d.ts +1 -1
  291. package/dist/schema/call/semantic.js +1 -1
  292. package/dist/schema/call/service.d.ts +7 -7
  293. package/dist/schema/call/service.js +1 -1
  294. package/dist/schema/call/treasury.d.ts +1 -1
  295. package/dist/schema/common/index.d.ts +6 -6
  296. package/dist/schema/common/index.js +1 -1
  297. package/dist/schema/config/index.d.ts +50 -1
  298. package/dist/schema/config/index.js +1 -1
  299. package/dist/schema/evaluation/index.d.ts +27 -11
  300. package/dist/schema/evaluation/index.js +1 -1
  301. package/dist/schema/goal/index.d.ts +5 -5
  302. package/dist/schema/goal/planning.d.ts +15 -15
  303. package/dist/schema/goal/planning.js +1 -1
  304. package/dist/schema/index.d.ts +1 -0
  305. package/dist/schema/index.js +1 -1
  306. package/dist/schema/interaction/index.d.ts +1 -1
  307. package/dist/schema/local/index.js +1 -1
  308. package/dist/schema/messenger/index.d.ts +26 -26
  309. package/dist/schema/operations.d.ts +33 -33
  310. package/dist/schema/operations.js +1 -1
  311. package/dist/schema/persona/index.d.ts +4708 -0
  312. package/dist/schema/persona/index.js +1 -1
  313. package/dist/schema/query/bi.d.ts +232 -25
  314. package/dist/schema/query/bi.js +1 -1
  315. package/dist/schema/query/index.d.ts +35 -35
  316. package/dist/schema/query/index.js +1 -1
  317. package/dist/schema/schema-version.js +1 -1
  318. package/dist/schema/workflow/index.d.ts +1 -1
  319. package/dist/schema/workspace/index.d.ts +53 -0
  320. package/dist/schema/workspace/index.js +1 -1
  321. package/dist/schema-query-impl/index.d.ts +9 -0
  322. package/dist/schema-query-impl/index.js +1 -1
  323. package/dist/schemas/benchmark_migration_operation.output.json +793 -0
  324. package/dist/schemas/benchmark_migration_operation.schema.json +83 -0
  325. package/dist/schemas/bridge_operation.schema.json +5 -5
  326. package/dist/schemas/config_operation.output.json +252 -0
  327. package/dist/schemas/config_operation.schema.json +21 -1
  328. package/dist/schemas/evaluation_operation.output.json +22 -10
  329. package/dist/schemas/goal_operation.schema.json +8 -8
  330. package/dist/schemas/guard2file.schema.json +1 -1
  331. package/dist/schemas/index.json +7 -1
  332. package/dist/schemas/machineNode2file.schema.json +1 -1
  333. package/dist/schemas/messenger_operation.schema.json +24 -12
  334. package/dist/schemas/onchain_events.output.json +1 -1
  335. package/dist/schemas/onchain_operations.output.json +4 -2
  336. package/dist/schemas/onchain_operations.schema.json +189 -139
  337. package/dist/schemas/onchain_operations_allocation.schema.json +13 -11
  338. package/dist/schemas/onchain_operations_arbitration.schema.json +10 -8
  339. package/dist/schemas/onchain_operations_contact.schema.json +7 -5
  340. package/dist/schemas/onchain_operations_demand.schema.json +7 -5
  341. package/dist/schemas/onchain_operations_gen_passport.schema.json +5 -3
  342. package/dist/schemas/onchain_operations_gen_proof.schema.json +1 -1
  343. package/dist/schemas/onchain_operations_guard.schema.json +5 -3
  344. package/dist/schemas/onchain_operations_machine.schema.json +22 -18
  345. package/dist/schemas/onchain_operations_order.schema.json +11 -7
  346. package/dist/schemas/onchain_operations_payment.schema.json +3 -3
  347. package/dist/schemas/onchain_operations_permission.schema.json +19 -11
  348. package/dist/schemas/onchain_operations_personal.schema.json +16 -10
  349. package/dist/schemas/onchain_operations_progress.schema.json +11 -7
  350. package/dist/schemas/onchain_operations_proof.schema.json +5 -3
  351. package/dist/schemas/onchain_operations_repository.schema.json +12 -8
  352. package/dist/schemas/onchain_operations_reward.schema.json +11 -9
  353. package/dist/schemas/onchain_operations_service.schema.json +28 -22
  354. package/dist/schemas/onchain_operations_treasury.schema.json +11 -9
  355. package/dist/schemas/onchain_table_data.output.json +27 -17
  356. package/dist/schemas/persona_operation.output.json +15875 -1
  357. package/dist/schemas/persona_operation.schema.json +3056 -478
  358. package/dist/schemas/query_toolkit.output.json +343 -63
  359. package/dist/schemas/query_toolkit.schema.json +1 -1
  360. package/dist/schemas/workflow_operation.schema.json +4 -2
  361. package/dist/schemas/workspace_operation.output.json +181 -1
  362. package/dist/schemas/workspace_operation.schema.json +61 -2
  363. package/dist/strategy/scorecard.js +1 -1
  364. package/dist/tools/handlers/benchmark-migration.d.ts +2 -0
  365. package/dist/tools/handlers/benchmark-migration.js +1 -0
  366. package/dist/tools/handlers/config.js +1 -1
  367. package/dist/tools/handlers/industry-pack.js +1 -1
  368. package/dist/tools/handlers/onchain.js +1 -1
  369. package/dist/tools/handlers/query.js +1 -1
  370. package/dist/tools/handlers/schema-query.js +1 -1
  371. package/dist/tools/handlers/workspace.js +1 -1
  372. package/dist/tools/index.js +1 -1
  373. package/dist/tools/move-fn-index.gen.d.ts +3 -0
  374. package/dist/tools/move-fn-index.gen.js +1 -0
  375. package/dist/tools/registry/business.js +1 -1
  376. package/dist/tools/registry/config.js +1 -1
  377. package/dist/tools/registry/evaluation.js +1 -1
  378. package/dist/tools/registry/onchain.js +1 -1
  379. package/dist/tools/sanitize-output.d.ts +3 -0
  380. package/dist/tools/sanitize-output.js +1 -0
  381. package/dist/tools/sanitize-output.spec.d.ts +1 -0
  382. package/dist/tools/sanitize-output.spec.js +1 -0
  383. package/package.json +9 -4
  384. package/dist/knowledge/baselines/evaluation-baselines.json +0 -79
@@ -1 +1 @@
1
- import{MAX_TAGS_COUNT}from'@wowok/wowok';const R_R_01={'rule':{'id':'R-RESOURCE-01','level':'LOW','category':'permission','title':'Resource\x20has\x20no\x20Permission\x20—\x20relies\x20entirely\x20on\x20caller-side\x20gating','description':'Resource\x20does\x20not\x20associate\x20with\x20a\x20Permission\x20object.\x20All\x20functions\x20are\x20'+'public(package)\x20(new/destroy/transfer/tag_set/tag_unset)\x20or\x20public\x20'+'(add_object_tags/remove_object_tags/remove_object)\x20—\x20there\x20is\x20no\x20on-chain\x20permission\x20'+'check.\x20Access\x20control\x20is\x20delegated\x20to\x20the\x20calling\x20module\x20(Personal,\x20Entity).\x20A\x20'+'caller\x20that\x20forgets\x20to\x20enforce\x20its\x20own\x20permission\x20check\x20would\x20let\x20any\x20address\x20mutate\x20'+'tags.','affected_stakeholders':['owner','caller'],'scenario':'Personal/Entity\x20forgets\x20to\x20gate\x20add_object_tags\x20behind\x20its\x20own\x20permission\x20check','mitigation':'Callers\x20(Personal,\x20Entity)\x20MUST\x20enforce\x20their\x20own\x20permission\x20checks\x20before\x20invoking\x20'+'Resource\x20functions.\x20Audit\x20the\x20call\x20sites\x20in\x20Personal/Entity\x20to\x20confirm\x20gating.','auto_fixable':![]},'check':a=>{if(!a['expects_resource_permission'])return null;return{...R_R_01['rule'],'evidence':'expects_resource_permission=true\x20(Resource\x20has\x20none)'};}},R_R_02={'rule':{'id':'R-RESOURCE-02','level':'MEDIUM','category':'semantic','title':'Tag\x20mutations\x20emit\x20no\x20events\x20—\x20external\x20indexers\x20must\x20poll','description':'add_object_tags\x20/\x20remove_object_tags\x20/\x20remove_object\x20do\x20not\x20emit\x20events\x20'+'(resource.move:89-145).\x20External\x20indexers\x20cannot\x20rely\x20on\x20an\x20event\x20stream\x20to\x20track\x20'+'tag\x20changes;\x20they\x20must\x20poll\x20the\x20ParentTable\x20field.\x20This\x20complicates\x20real-time\x20'+'notification\x20and\x20consistency.','affected_stakeholders':['owner','caller'],'scenario':'Indexer\x20expects\x20a\x20TagAddedEvent\x20but\x20none\x20is\x20emitted;\x20UI\x20fails\x20to\x20refresh','mitigation':'External\x20indexers\x20should\x20poll\x20Resource.table\x20on\x20a\x20cadence.\x20Do\x20not\x20build\x20critical\x20UX\x20'+'on\x20tag\x20event\x20streams\x20until\x20events\x20are\x20added\x20in\x20a\x20future\x20version.','auto_fixable':![]},'check':a=>{if(!a['expects_tag_events'])return null;return{...R_R_02['rule'],'evidence':'expects_tag_events=true\x20(no\x20events\x20emitted)'};}},R_R_03={'rule':{'id':'R-RESOURCE-03','level':'LOW','category':'structural','title':'MAX_TAGS_COUNT='+MAX_TAGS_COUNT+'\x20permissive\x20—\x20storage\x20cost','description':'A\x20single\x20object\x27s\x20AddressTag.tags\x20vector\x20may\x20hold\x20up\x20to\x20MAX_TAGS_COUNT='+MAX_TAGS_COUNT+'\x20'+'entries\x20(resource.move:9).\x20The\x20limit\x20aborts\x20with\x20E_TAGS_COUNT_EXCEEDED\x20(1)\x20only\x20at\x20the\x20'+'boundary.\x20100\x20tags\x20per\x20object\x20is\x20generous;\x20loading\x20all\x20tags\x20on\x20every\x20read\x20increases\x20'+'gas\x20and\x20storage\x20cost.','affected_stakeholders':['owner'],'scenario':'Caller\x20adds\x20100\x20tags\x20to\x20a\x20single\x20object','mitigation':'Business\x20layer\x20should\x20self-limit\x20tag\x20count\x20well\x20below\x20100.\x20For\x20heavy\x20tagging,\x20'+'shard\x20across\x20multiple\x20Resource\x20objects\x20or\x20store\x20bulk\x20tags\x20off-chain.','related_move_error':'E_TAGS_COUNT_EXCEEDED\x20(1)','auto_fixable':![]},'check':a=>{if(a['tags_count']===undefined)return null;if(a['tags_count']<MAX_TAGS_COUNT)return null;return{...R_R_03['rule'],'evidence':'tags_count='+a['tags_count']+',\x20limit='+MAX_TAGS_COUNT};}},R_R_04={'rule':{'id':'R-RESOURCE-04','level':'LOW','category':'lifecycle','title':'destroy\x20is\x20irreversible\x20—\x20no\x20recovery\x20mechanism','description':'Resource.destroy(resource)\x20(resource.move:38)\x20deletes\x20the\x20object\x20and\x20its\x20ParentTable\x20'+'in\x20place.\x20There\x20is\x20no\x20archive,\x20no\x20event,\x20and\x20no\x20rollback.\x20Once\x20destroyed,\x20the\x20object\x20'+'ID\x20is\x20permanently\x20invalid\x20and\x20all\x20tags\x20are\x20lost.','affected_stakeholders':['owner'],'scenario':'Caller\x20destroys\x20a\x20Resource\x20that\x20is\x20still\x20referenced\x20by\x20Personal/Entity','mitigation':'Confirm\x20no\x20live\x20references\x20exist\x20before\x20calling\x20destroy.\x20SDK\x20should\x20refuse\x20to\x20destroy\x20'+'a\x20Resource\x20whose\x20owner\x20address\x20is\x20still\x20referenced\x20by\x20Personal.mark\x20or\x20Entity.resource.','auto_fixable':![]},'check':a=>{if(!a['is_destroy'])return null;return{...R_R_04['rule'],'evidence':'is_destroy=true\x20(irreversible)'};}},R_R_05={'rule':{'id':'R-RESOURCE-05','level':'MEDIUM','category':'semantic','title':'tag_set\x20returns\x20bool\x20—\x20SDK\x20may\x20ignore\x20the\x20\x27already\x20exists\x27\x20signal','description':'tag_set(resource,\x20object,\x20name)\x20returns\x20bool:\x20true\x20if\x20a\x20new\x20tag\x20was\x20added,\x20false\x20if\x20'+'the\x20tag\x20already\x20existed\x20(resource.move:47-58).\x20If\x20the\x20SDK\x20ignores\x20the\x20return\x20value,\x20'+'callers\x20cannot\x20distinguish\x20\x27newly\x20added\x27\x20from\x20\x27duplicate\x20silently\x20skipped\x27.\x20This\x20'+'masks\x20intent\x20and\x20complicates\x20idempotency\x20reasoning.','affected_stakeholders':['caller'],'scenario':'SDK\x20treats\x20tag_set\x20as\x20void;\x20caller\x20assumes\x20tag\x20was\x20added\x20when\x20it\x20was\x20a\x20duplicate','mitigation':'SDK\x20should\x20expose\x20tag_set\x27s\x20bool\x20return\x20value\x20to\x20the\x20caller.\x20UI\x20should\x20show\x20\x27tag\x20'+'already\x20existed\x27\x20when\x20false\x20is\x20returned.','auto_fixable':!![]},'check':a=>{if(!a['tag_set_return_ignored'])return null;return{...R_R_05['rule'],'evidence':'tag_set_return_ignored=true\x20(duplicate\x20not\x20surfaced)'};}},R_R_06={'rule':{'id':'R-RESOURCE-06','level':'LOW','category':'semantic','title':'Commented-out\x20switch\x20function\x20(resource.move:71-86)\x20—\x20feature\x20may\x20be\x20intended','description':'resource.move:71-86\x20contains\x20a\x20switch\x20function\x20that\x20is\x20fully\x20commented\x20out.\x20The\x20'+'intended\x20behavior\x20is\x20unclear\x20—\x20it\x20may\x20be\x20a\x20planned\x20feature\x20(e.g.\x20bulk\x20tag\x20operations)\x20'+'that\x20was\x20disabled.\x20Referencing\x20it\x20as\x20if\x20it\x20were\x20live\x20would\x20silently\x20fail.','affected_stakeholders':['system'],'scenario':'Developer\x20reads\x20the\x20commented\x20switch\x20and\x20assumes\x20it\x20is\x20callable','mitigation':'Confirm\x20with\x20the\x20package\x20maintainers\x20whether\x20the\x20switch\x20should\x20be\x20enabled\x20or\x20removed.\x20'+'Do\x20not\x20reference\x20it\x20in\x20SDK\x20or\x20MCP\x20code.','auto_fixable':![]},'check':a=>{if(!a['references_dead_switch'])return null;return{...R_R_06['rule'],'evidence':'references_dead_switch=true\x20(commented\x20out\x20in\x20Move)'};}};export const RESOURCE_RISK_RULES=[R_R_01,R_R_02,R_R_03,R_R_04,R_R_05,R_R_06];export const RESOURCE_RISK_VERSION='1.0.0';export function checkResourceRisks(a){const b=[];for(const c of RESOURCE_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return b;}
1
+ import{MAX_TAGS_COUNT}from'@wowok/wowok';import{getJudgmentDoc,factoryRulePack}from'../config/judgment.js';import{evaluateRuleBook,interpolate}from'../config/rule-engine.js';export function resourceRiskFacts(a){return{'expects_resource_permission':a['expects_resource_permission'],'expects_tag_events':a['expects_tag_events'],'tags_count':a['tags_count'],'tags_count_over_limit':a['tags_count']!==undefined&&a['tags_count']>=MAX_TAGS_COUNT,'is_destroy':a['is_destroy'],'tag_set_return_ignored':a['tag_set_return_ignored'],'references_dead_switch':a['references_dead_switch'],'max_tags_count':MAX_TAGS_COUNT};}const RELATED_MOVE_ERRORS={'R-RESOURCE-03':'E_TAGS_COUNT_EXCEEDED\x20(1)'},AUTO_FIXABLE=new Set(['R-RESOURCE-05']);function resourceRuleBook(){const a=getJudgmentDoc()['rules']['domains']['resource'];if(!a)throw new Error('factory\x20rule\x20pack\x20\x27resource\x27\x20missing\x20—\x20broken\x20installation');return a['rules'];}function findingToResourceRisk(a){const b=RELATED_MOVE_ERRORS[a['rule_id']];return{'id':a['rule_id'],'level':a['level'],'category':a['dimension']??'semantic','title':a['title'],'description':a['description'],'affected_stakeholders':a['stakeholders']??[],'scenario':a['scenario']??'','mitigation':a['mitigation']??'',...b===undefined?{}:{'related_move_error':b},'auto_fixable':AUTO_FIXABLE['has'](a['rule_id']),...a['evidence']===undefined?{}:{'evidence':a['evidence']}};}export const RESOURCE_RISK_VERSION='1.0.0';export const RESOURCE_RISK_RULES=((()=>{const a=factoryRulePack('resource');if(!a)return[];const b=resourceRiskFacts({});return a['rules']['map'](d=>{const e=d['cases'][0x0],f=RELATED_MOVE_ERRORS[d['rule_id']];return{'id':d['rule_id'],'level':e['level'],'category':d['dimension']??'semantic','title':interpolate(e['title'],b),'description':interpolate(e['description'],b),'affected_stakeholders':e['stakeholders']??[],'scenario':e['scenario']===undefined?'':interpolate(e['scenario'],b),'mitigation':e['mitigation']===undefined?'':interpolate(e['mitigation'],b),...f===undefined?{}:{'related_move_error':f},'auto_fixable':AUTO_FIXABLE['has'](d['rule_id']),...d['trigger']===undefined?{}:{'trigger':d['trigger']}};});})());export function checkResourceRisks(a){const {findings:b}=evaluateRuleBook(resourceRuleBook(),resourceRiskFacts(a));return b['map'](findingToResourceRisk);}
@@ -10,7 +10,7 @@ export interface RewardBuiltinPermissionEntry {
10
10
  }
11
11
  export type RewardRecipientType = "GuardIdentifier" | "Entity" | "Signer";
12
12
  export type RewardAmountType = "GuardU64Identifier" | "Fixed";
13
- export type RewardGuardConstructor = "guard_u8_u8" | "guard_u8_u64" | "guard_entity_u8" | "guard_entity_u64" | "guard_signer_u8" | "guard_signer_u64";
13
+ export type RewardGuardConstructor = "dynamic_recipient_dynamic_amount" | "dynamic_recipient_fixed_amount" | "entity_recipient_dynamic_amount" | "entity_recipient_fixed_amount" | "caller_recipient_dynamic_amount" | "caller_recipient_fixed_amount";
14
14
  export interface RewardGuardConstructorSpec {
15
15
  constructor: RewardGuardConstructor;
16
16
  recipient_type: RewardRecipientType;
@@ -1 +1 @@
1
- import{MAX_GUARD_COUNT_REWARD,MAX_RECORD_COUNT_REWARD}from'./onchain-constants.js';export{MAX_GUARD_COUNT_REWARD,MAX_RECORD_COUNT_REWARD};export const REWARD_NEW={'index':0x96,'name':'REWARD_NEW','description':'Create\x20new\x20Reward<T>\x20(asserted\x20by\x20reward::new\x20/\x20new_with_passport)','governed_operations':['reward::new','reward::new_with_passport'],'sdk_exposed':!![]};export const REWARD_DESCRIPTION={'index':0x97,'name':'REWARD_DESCRIPTION','description':'Update\x20description\x20(asserted\x20by\x20reward::description_set\x20/\x20_with_passport)','governed_operations':['reward::description_set','reward::description_set_with_passport'],'sdk_exposed':!![]};export const REWARD_GUARD={'index':0x98,'name':'REWARD_GUARD','description':'Add\x20/\x20remove\x20expired\x20guards\x20(≤\x20MAX_GUARD_COUNT_REWARD=200)','governed_operations':['reward::guard_add','reward::guard_add_with_passport','reward::guard_remove_expired','reward::guard_remove_expired_with_passport'],'sdk_exposed':!![]};export const REWARD_COIN_ADD={'index':0x99,'name':'REWARD_COIN_ADD','description':'Deposit\x20Coin<T>\x20directly\x20into\x20Reward\x20balance\x20(joins\x20Balance<T>)','governed_operations':['reward::coin_add','reward::coin_add_with_passport'],'sdk_exposed':!![]};export const REWARD_RECEIVE={'index':0x9a,'name':'REWARD_RECEIVE','description':'Receive\x20CoinWrapper<T>\x20via\x20Payment.unwrap_with_check\x20(joins\x20Balance<T>)','governed_operations':['reward::receive','reward::receive_with_passport'],'sdk_exposed':!![]};export const REWARD_GUARD_EXPIRATION_TIME_ADD={'index':0x9b,'name':'REWARD_GUARD_EXPIRATION_TIME_ADD','description':'Set\x20/\x20cancel\x20guard_not_added_expiration_time\x20(time-lock\x20on\x20new\x20guard\x20additions)','governed_operations':['reward::guard_expiration_time_add','reward::guard_expiration_time_add_with_passport'],'sdk_exposed':!![]};export const REWARD_OWNER_RECEIVE={'index':0x9c,'name':'REWARD_OWNER_RECEIVE','description':'Owner\x20receives\x20Receiving<K>\x20/\x20CoinWrapper<K>\x20at\x20terminal\x20state\x20(unwrap\x20→\x20owner)','governed_operations':['reward::owner_receive','reward::owner_receive_with_passport','reward::owner_receive_object','reward::owner_receive_object_with_passport'],'sdk_exposed':!![]};export const REWARD_UM={'index':0x9d,'name':'REWARD_UM','description':'Bind\x20/\x20unbind\x20Contact\x20(UM)\x20for\x20off-chain\x20coordination','governed_operations':['reward::um_set','reward::um_set_with_passport','reward::um_none','reward::um_none_with_passport'],'sdk_exposed':!![]};export const REWARD_PERMISSIONS=[REWARD_NEW,REWARD_DESCRIPTION,REWARD_GUARD,REWARD_COIN_ADD,REWARD_RECEIVE,REWARD_GUARD_EXPIRATION_TIME_ADD,REWARD_OWNER_RECEIVE,REWARD_UM];export const REWARD_FIELDS=[{'name':'id','move_type':'UID','mutability':'immutable','set_at_creation':!![],'constraint':'Object\x20UID;\x20assigned\x20in\x20new_imp\x20via\x20object::new(ctx).\x20Never\x20changes.'},{'name':'description','move_type':'String','mutability':'admin_mutable','set_at_creation':!![],'permission_index':0x97,'constraint':'Must\x20satisfy\x20common::DESCRIPTION.\x20Updated\x20via\x20description_set\x20(151).'},{'name':'guards','move_type':'vector<RewardGuard>','mutability':'admin_mutable','set_at_creation':!![],'permission_index':0x98,'constraint':'vector::length\x20<\x20MAX_GUARD_COUNT\x20(200);\x20E_GUARD_COUNT_EXCEEDED\x20on\x20overflow.','related_errors':['E_GUARD_COUNT_EXCEEDED']},{'name':'balance','move_type':'Balance<T>','mutability':'runtime','set_at_creation':!![],'constraint':'Zero\x20at\x20creation\x20(balance::zero());\x20grows\x20via\x20coin_add/receive;\x20shrinks\x20via\x20claim\x20(split)\x20and\x20never\x20via\x20direct\x20withdraw.','related_errors':['E_INSUFFICIENT_BALANCE']},{'name':'guard_not_added_expiration_time','move_type':'Option<u64>','mutability':'admin_mutable','set_at_creation':!![],'permission_index':0x9b,'constraint':'Option<timestamp_ms>.\x20When\x20Some(t):\x20guard_add\x20requires\x20clock\x20>\x20t\x20(E_GUARD_LOCKED_TIME).\x20When\x20None\x20or\x20t\x20<\x20now:\x20guards\x20can\x20be\x20added.','related_errors':['E_GUARD_LOCKED_TIME','E_GUARD_LOCKED_TIME_NOT_INCREASING','E_GUARD_LOCKED_TIME_INVALID']},{'name':'record','move_type':'ParentTable<address,\x20RecipientRecord>','mutability':'runtime','set_at_creation':!![],'constraint':'Per-recipient\x20claim\x20history.\x20Each\x20RecipientRecord.amount\x20vector\x20has\x20length\x20<\x20MAX_RECORD_COUNT\x20(5200);\x20E_RECORD_COUNT_EXCEEDED\x20on\x20overflow.','related_errors':['E_RECORD_COUNT_EXCEEDED']},{'name':'um','move_type':'Option<address>','mutability':'admin_mutable','set_at_creation':!![],'permission_index':0x9d,'constraint':'Option<Contact\x20address>.\x20um_set\x20creates\x20object-linker\x20core\x20binding;\x20um_none\x20disaffiliates.'},{'name':'permission','move_type':'address','mutability':'admin_mutable','set_at_creation':!![],'constraint':'Permission\x20object\x20address.\x20Updated\x20via\x20permission_set\x20(asserts\x20old.owner\x20==\x20sender).\x20Creates\x20object_linker::affiliation_change_core.'}];export const REWARD_GUARD_CONSTRUCTORS=[{'constructor':'guard_u8_u8','recipient_type':'GuardIdentifier','amount_type':'GuardU64Identifier','params':{'recipient_param':'u8','amount_param':'u8','expiration_time':'Option<u64>','store_from_id':'Option<u8>'},'construction_checks':['is_identifier_address(guard,\x20recipient)\x20—\x20E_RECIPIENT_IDENTIFIER_NOT_ADDRESS\x20(4)','get_submission_value_type(guard,\x20amount)\x20must\x20be\x20Some(TYPE_U64)\x20—\x20E_AMOUNT_NOT_U64\x20(5)','if\x20store_from_id\x20is\x20Some:\x20is_identifier_address_compatible\x20—\x20E_STORE_FROM_ID_NOT_COMPATIBLE\x20(12)'],'typical_use':'Dynamic\x20recipient\x20+\x20dynamic\x20amount\x20—\x20both\x20extracted\x20from\x20Passport\x20at\x20claim\x20time\x20(e.g.\x20referral\x20rewards\x20where\x20referrer\x20and\x20amount\x20vary\x20per\x20claim).'},{'constructor':'guard_u8_u64','recipient_type':'GuardIdentifier','amount_type':'Fixed','params':{'recipient_param':'u8','amount_param':'u64','expiration_time':'Option<u64>','store_from_id':'Option<u8>'},'construction_checks':['is_identifier_address(guard,\x20recipient)\x20—\x20E_RECIPIENT_IDENTIFIER_NOT_ADDRESS\x20(4)','if\x20store_from_id\x20is\x20Some:\x20is_identifier_address_compatible\x20—\x20E_STORE_FROM_ID_NOT_COMPATIBLE\x20(12)'],'typical_use':'Dynamic\x20recipient\x20+\x20fixed\x20amount\x20—\x20e.g.\x20first-order\x20reward\x20where\x20any\x20new\x20customer\x20claims\x20a\x20fixed\x201\x20WOW.'},{'constructor':'guard_entity_u8','recipient_type':'Entity','amount_type':'GuardU64Identifier','params':{'recipient_param':'address','amount_param':'u8','expiration_time':'Option<u64>','store_from_id':'Option<u8>'},'construction_checks':['get_submission_value_type(guard,\x20amount)\x20must\x20be\x20Some(TYPE_U64)\x20—\x20E_AMOUNT_NOT_U64\x20(5)','if\x20store_from_id\x20is\x20Some:\x20is_identifier_address_compatible\x20—\x20E_STORE_FROM_ID_NOT_COMPATIBLE\x20(12)'],'typical_use':'Fixed\x20recipient\x20+\x20dynamic\x20amount\x20—\x20e.g.\x20tiered\x20loyalty\x20reward\x20where\x20amount\x20depends\x20on\x20Passport\x20submission\x20(tier\x20level).'},{'constructor':'guard_entity_u64','recipient_type':'Entity','amount_type':'Fixed','params':{'recipient_param':'address','amount_param':'u64','expiration_time':'Option<u64>','store_from_id':'Option<u8>'},'construction_checks':['if\x20store_from_id\x20is\x20Some:\x20is_identifier_address_compatible\x20—\x20E_STORE_FROM_ID_NOT_COMPATIBLE\x20(12)'],'typical_use':'Fully\x20fixed\x20recipient\x20+\x20amount\x20—\x20simplest\x20configuration\x20(e.g.\x20specific\x20partner\x20bounty).'},{'constructor':'guard_signer_u8','recipient_type':'Signer','amount_type':'GuardU64Identifier','params':{'amount_param':'u8','expiration_time':'Option<u64>','store_from_id':'Option<u8>'},'construction_checks':['get_submission_value_type(guard,\x20amount)\x20must\x20be\x20Some(TYPE_U64)\x20—\x20E_AMOUNT_NOT_U64\x20(5)','if\x20store_from_id\x20is\x20Some:\x20is_identifier_address_compatible\x20—\x20E_STORE_FROM_ID_NOT_COMPATIBLE\x20(12)'],'typical_use':'Caller\x20is\x20recipient\x20+\x20dynamic\x20amount\x20—\x20e.g.\x20self-service\x20claim\x20where\x20amount\x20depends\x20on\x20Passport\x20submission\x20(e.g.\x20cashback\x20rate).'},{'constructor':'guard_signer_u64','recipient_type':'Signer','amount_type':'Fixed','params':{'amount_param':'u64','expiration_time':'Option<u64>','store_from_id':'Option<u8>'},'construction_checks':['if\x20store_from_id\x20is\x20Some:\x20is_identifier_address_compatible\x20—\x20E_STORE_FROM_ID_NOT_COMPATIBLE\x20(12)'],'typical_use':'Caller\x20is\x20recipient\x20+\x20fixed\x20amount\x20—\x20e.g.\x20flash\x20sale\x20where\x20any\x20eligible\x20caller\x20claims\x20a\x20fixed\x20reward.'}];export const REWARD_ERROR_CODES=[{'code':0x1,'name':'E_GUARD_LOCKED_TIME_NOT_INCREASING','description':'guard_expiration_time_add:\x20new\x20time\x20<\x20current\x20clock\x20(must\x20be\x20≥\x20now)','trigger_operation':'guard_expiration_time_add'},{'code':0x2,'name':'E_GUARD_EXPIRED','description':'guard_add\x20on\x20guard\x20with\x20expiration_time\x20<\x20now,\x20OR\x20claim\x20on\x20guard\x20with\x20expiration_time\x20<\x20now','trigger_operation':'guard_add\x20/\x20claim'},{'code':0x3,'name':'E_GUARD_COUNT_EXCEEDED','description':'guard_add\x20would\x20exceed\x20MAX_GUARD_COUNT=200\x20(only\x20on\x20NEW\x20guard,\x20not\x20on\x20update\x20of\x20existing)','trigger_operation':'guard_add'},{'code':0x4,'name':'E_RECIPIENT_IDENTIFIER_NOT_ADDRESS','description':'RewardGuard\x20constructor:\x20recipient\x20identifier\x20type\x20is\x20not\x20address\x20(GuardIdentifier\x20variant\x20only)','trigger_operation':'reward_guard\x20(constructor)'},{'code':0x5,'name':'E_AMOUNT_NOT_U64','description':'RewardGuard\x20constructor:\x20amount\x20identifier\x20type\x20is\x20not\x20u64\x20(GuardU64Identifier\x20variant\x20only)','trigger_operation':'reward_guard\x20(constructor)'},{'code':0x6,'name':'E_INSUFFICIENT_BALANCE','description':'claim:\x20balance\x20<\x20amount\x20(cannot\x20split\x20more\x20than\x20held)','trigger_operation':'claim'},{'code':0x7,'name':'E_GUARD_NOT_FOUND','description':'claim:\x20no\x20guard\x20in\x20self.guards\x20matches\x20the\x20supplied\x20guard\x20address','trigger_operation':'claim'},{'code':0x8,'name':'E_RECORD_COUNT_EXCEEDED','description':'claim:\x20recipient\x20already\x20has\x20MAX_RECORD_COUNT=5200\x20entries\x20(E_RECORD_COUNT_EXCEEDED)','trigger_operation':'claim'},{'code':0xa,'name':'E_GUARD_LOCKED_TIME','description':'guard_add\x20while\x20guard_not_added_expiration_time\x20is\x20Some\x20and\x20clock\x20≤\x20expiration_time','trigger_operation':'guard_add'},{'code':0xb,'name':'E_GUARD_LOCKED_TIME_INVALID','description':'guard_expiration_time_add:\x20new\x20Some(t)\x20where\x20t\x20≤\x20now\x20(must\x20be\x20future)','trigger_operation':'guard_expiration_time_add'},{'code':0xc,'name':'E_STORE_FROM_ID_NOT_COMPATIBLE','description':'RewardGuard\x20constructor:\x20store_from_id\x20identifier\x20type\x20is\x20not\x20number\x20or\x20address','trigger_operation':'reward_guard\x20(constructor)'}];export const REWARD_SCENES=[{'id':'reward_first_order','name':'First-order\x20reward','industry':['universal','ecommerce','service','freelance'],'scenario':'New\x20customers\x20receive\x20a\x20fixed\x20reward\x20after\x20their\x20first\x20order.\x20Guard\x20verifies\x20order\x20ownership\x20+\x20first-time\x20status;\x20'+'Recipient=Signer\x20(caller\x20is\x20the\x20new\x20customer);\x20Amount=Fixed\x20(e.g.\x201\x20WOW).','phases':['creation','guard_addition','funds_replenish','claim'],'coin_type_note':'T\x20=\x20project\x20reward\x20coin\x20(e.g.\x200x2::wow::WOW\x20or\x20a\x20custom\x20token)','typical_guard_count':0x1,'recipient_types_used':['Signer'],'amount_types_used':['Fixed'],'uses_expiration_time':!![],'uses_store_from_id':![],'builtin_indexes_consumed':[REWARD_NEW,REWARD_GUARD,REWARD_COIN_ADD],'common_patterns':['guard_signer_u64\x20—\x20caller\x20claims\x20a\x20fixed\x20amount\x20(e.g.\x201\x20WOW)','Guard\x20verifies:\x20order_address.holder\x20==\x20signer\x20AND\x20order\x20is\x20the\x20first\x20order\x20(Repository\x20query)','expiration_time\x20bounds\x20the\x20campaign\x20window\x20(e.g.\x2030\x20days)','coin_add\x20deposits\x20the\x20campaign\x20budget\x20upfront\x20(e.g.\x20100\x20WOW\x20for\x20100\x20claims)'],'recommended_templates':['first_order']},{'id':'reward_referral','name':'Referral\x20viral\x20reward','industry':['universal','ecommerce','service','content'],'scenario':'Both\x20referrer\x20and\x20referee\x20receive\x20a\x20reward\x20when\x20the\x20referee\x20completes\x20a\x20first\x20order.\x20Two\x20guards:\x20one\x20for\x20referrer\x20(Entity),\x20one\x20for\x20referee\x20(Signer).','phases':['creation','guard_addition','funds_replenish','claim'],'coin_type_note':'T\x20=\x20project\x20reward\x20coin','typical_guard_count':0x2,'recipient_types_used':['Entity','Signer'],'amount_types_used':['Fixed'],'uses_expiration_time':!![],'uses_store_from_id':!![],'builtin_indexes_consumed':[REWARD_NEW,REWARD_GUARD,REWARD_COIN_ADD],'common_patterns':['guard_entity_u64\x20for\x20referrer\x20(recipient\x20=\x20referrer\x20address,\x20fixed\x20amount)','guard_signer_u64\x20for\x20referee\x20(caller\x20is\x20recipient,\x20fixed\x20amount)','Guard\x20verifies:\x20referrer\x20marked\x20in\x20Repository\x20AND\x20referee\x27s\x20order\x20completed','store_from_id\x20may\x20record\x20the\x20order\x20address\x20for\x20audit\x20trail'],'recommended_templates':['referral']},{'id':'reward_loyalty','name':'Loyalty\x20tiered\x20reward','industry':['universal','ecommerce','subscription','content'],'scenario':'Customers\x20unlock\x20higher\x20rewards\x20after\x20reaching\x20cumulative\x20spending\x20tiers.\x20Recipient=Signer;\x20Amount=GuardU64Identifier\x20(tier-dependent\x20amount\x20extracted\x20from\x20Passport).','phases':['creation','guard_addition','funds_replenish','claim'],'coin_type_note':'T\x20=\x20project\x20reward\x20coin','typical_guard_count':0x1,'recipient_types_used':['Signer'],'amount_types_used':['GuardU64Identifier'],'uses_expiration_time':![],'uses_store_from_id':![],'builtin_indexes_consumed':[REWARD_NEW,REWARD_GUARD,REWARD_COIN_ADD],'common_patterns':['guard_signer_u8\x20—\x20amount\x20is\x20dynamic,\x20extracted\x20from\x20Passport\x20submission\x20(tier\x20level\x20→\x20reward\x20amount)','Guard\x20verifies:\x20cumulative\x20spend\x20≥\x20tier\x20threshold\x20(Repository\x20query)','No\x20expiration_time\x20—\x20loyalty\x20is\x20perpetual\x20(until\x20deactivated\x20via\x20guard_remove_expired)','Guard\x20submission\x20value\x20type\x20MUST\x20be\x20u64\x20(E_AMOUNT_NOT_U64\x20otherwise)'],'recommended_templates':['loyalty']},{'id':'reward_flash_sale','name':'Limited-time\x20flash\x20sale\x20reward','industry':['universal','ecommerce','retail'],'scenario':'Time-bounded\x20reward\x20for\x20the\x20first\x20N\x20callers.\x20Recipient=Signer;\x20Amount=Fixed.\x20Guard\x20verifies\x20time\x20window\x20+\x20claim\x20count.','phases':['creation','guard_addition','funds_replenish','claim','guard_lock_mgmt'],'coin_type_note':'T\x20=\x20project\x20reward\x20coin','typical_guard_count':0x1,'recipient_types_used':['Signer'],'amount_types_used':['Fixed'],'uses_expiration_time':!![],'uses_store_from_id':![],'builtin_indexes_consumed':[REWARD_NEW,REWARD_GUARD,REWARD_COIN_ADD,REWARD_GUARD_EXPIRATION_TIME_ADD],'common_patterns':['guard_signer_u64\x20—\x20fixed\x20amount\x20per\x20claim\x20(e.g.\x202\x20WOW)','expiration_time\x20bounds\x20the\x20flash\x20sale\x20window\x20(e.g.\x2048\x20hours)','guard_expiration_time_add\x20(155)\x20may\x20lock\x20further\x20guard\x20additions\x20during\x20the\x20sale','Budget\x20=\x20max_claims\x20×\x20amount;\x20coin_add\x20deposits\x20this\x20upfront'],'recommended_templates':['flash_sale']},{'id':'reward_bulk_discount','name':'Bulk\x20discount\x20/\x20cashback\x20reward','industry':['universal','ecommerce','wholesale','service'],'scenario':'Customer\x20receives\x20cashback\x20proportional\x20to\x20order\x20size.\x20Recipient=Signer\x20or\x20Entity\x20(order\x20holder);\x20Amount=GuardU64Identifier\x20(cashback\x20rate\x20from\x20Passport).','phases':['creation','guard_addition','funds_replenish','claim'],'coin_type_note':'T\x20=\x20payment\x20coin\x20type\x20(must\x20match\x20order\x20payment\x20for\x20clean\x20cashback)','typical_guard_count':0x1,'recipient_types_used':['Signer','Entity'],'amount_types_used':['GuardU64Identifier'],'uses_expiration_time':![],'uses_store_from_id':!![],'builtin_indexes_consumed':[REWARD_NEW,REWARD_GUARD,REWARD_COIN_ADD,REWARD_RECEIVE],'common_patterns':['guard_signer_u8\x20—\x20caller\x20claims\x20dynamic\x20amount\x20(cashback\x20=\x20order_amount\x20×\x20rate)','store_from_id\x20records\x20the\x20order\x20address\x20for\x20cross-reference\x20(audit\x20trail)','receive\x20(154)\x20may\x20be\x20used\x20to\x20accept\x20CoinWrapper<T>\x20refunds\x20that\x20replenish\x20the\x20balance','Guard\x20verifies:\x20order.completed\x20AND\x20order.service\x20==\x20this\x20Service'],'recommended_templates':['cashback']},{'id':'reward_milestone','name':'Service\x20milestone\x20reward','industry':['universal','ecommerce','content','subscription'],'scenario':'When\x20a\x20Service\x20reaches\x20a\x20milestone\x20(e.g.\x20100\x20orders),\x20early\x20supporters\x20receive\x20extra\x20rewards.\x20Recipient=Entity\x20(early\x20customer);\x20Amount=Fixed.','phases':['creation','guard_addition','funds_replenish','claim','guard_lock_mgmt'],'coin_type_note':'T\x20=\x20project\x20reward\x20coin','typical_guard_count':0x32,'recipient_types_used':['Entity'],'amount_types_used':['Fixed'],'uses_expiration_time':!![],'uses_store_from_id':![],'builtin_indexes_consumed':[REWARD_NEW,REWARD_GUARD,REWARD_COIN_ADD,REWARD_GUARD_EXPIRATION_TIME_ADD],'common_patterns':['guard_entity_u64\x20for\x20each\x20early\x20customer\x20(recipient\x20=\x20customer\x20address,\x20fixed\x20amount)','Multiple\x20guards\x20(up\x20to\x2050\x20for\x2050\x20early\x20supporters)\x20—\x20well\x20within\x20MAX_GUARD_COUNT=200','Guard\x20verifies:\x20Service\x20order_count\x20>=\x20milestone\x20AND\x20claimer\x20is\x20in\x20early-customer\x20list','guard_expiration_time_add\x20(155)\x20may\x20lock\x20the\x20guard\x20list\x20after\x20milestone\x20setup'],'recommended_templates':['milestone']}];export const REWARD_LEDGER_VERSION='1.0.0';export function getScenesByPhase(a){return REWARD_SCENES['filter'](b=>b['phases']['includes'](a));}export function findSceneById(a){return REWARD_SCENES['find'](b=>b['id']===a);}export function getScenesByIndustry(a){return REWARD_SCENES['filter'](b=>b['industry']['includes'](a)||b['industry']['includes']('universal'));}export function getBuiltinPermissionByIndex(a){return REWARD_PERMISSIONS['find'](b=>b['index']===a);}export function isRewardBuiltinPermission(a){return getBuiltinPermissionByIndex(a)!==undefined;}export function getAllBuiltinPermissions(){return[...REWARD_PERMISSIONS];}export function getRewardScenesCount(){return REWARD_SCENES['length'];}export function getGuardConstructorSpec(a){return REWARD_GUARD_CONSTRUCTORS['find'](b=>b['constructor']===a);}export function resolveGuardConstructor(a,b){const c={'GuardIdentifier|GuardU64Identifier':'guard_u8_u8','GuardIdentifier|Fixed':'guard_u8_u64','Entity|GuardU64Identifier':'guard_entity_u8','Entity|Fixed':'guard_entity_u64','Signer|GuardU64Identifier':'guard_signer_u8','Signer|Fixed':'guard_signer_u64'};return c[a+'|'+b];}export function getRewardErrorByCode(a){return REWARD_ERROR_CODES['find'](b=>b['code']===a);}export function getRewardErrorByName(a){return REWARD_ERROR_CODES['find'](b=>b['name']===a);}export function validateGuardCount(a){if(a>=MAX_GUARD_COUNT_REWARD)return{'ok':![],'violation':'Guard\x20count\x20'+a+'\x20would\x20exceed\x20MAX_GUARD_COUNT_REWARD\x20'+MAX_GUARD_COUNT_REWARD};return{'ok':!![]};}export function validateRecordCount(a){if(a>=MAX_RECORD_COUNT_REWARD)return{'ok':![],'violation':'Record\x20count\x20'+a+'\x20would\x20exceed\x20MAX_RECORD_COUNT_REWARD\x20'+MAX_RECORD_COUNT_REWARD+'\x20—\x20recipient\x20can\x20no\x20longer\x20claim'};return{'ok':!![]};}export function inferSceneFromIntent(a){const b=a['toLowerCase'](),c=[['flash\x20sale','reward_flash_sale'],['flash_sale','reward_flash_sale'],['limited-time','reward_flash_sale'],['limited\x20time','reward_flash_sale'],['referral','reward_referral'],['viral','reward_referral'],['refer\x20a\x20friend','reward_referral'],['invite','reward_referral'],['loyalty','reward_loyalty'],['tiered','reward_loyalty'],['tier','reward_loyalty'],['repeat','reward_loyalty'],['cashback','reward_bulk_discount'],['bulk\x20discount','reward_bulk_discount'],['bulk_discount','reward_bulk_discount'],['wholesale','reward_bulk_discount'],['milestone','reward_milestone'],['early\x20supporter','reward_milestone'],['early\x20customer','reward_milestone'],['first\x20order','reward_first_order'],['first_order','reward_first_order'],['new\x20customer','reward_first_order'],['first-time','reward_first_order']];for(const [d,e]of c){if(b['includes'](d)){const f=findSceneById(e);if(f)return f;}}return undefined;}export const REWARD_CROSS_OBJECT_REFS=[{'object':'Permission','phase':'universal','relationship':'Reward.permission\x20(address;\x20borrowed\x20for\x20all\x20150-157\x20assertions)'},{'object':'Permission','phase':'permission_update','relationship':'permission_set:\x20asserts\x20old.owner\x20==\x20sender;\x20creates\x20object_linker::affiliation_change_core'},{'object':'Guard','phase':'guard_addition','relationship':'RewardGuard.guard\x20=\x20guard.id_address\x20(each\x20guard\x20registered\x20via\x20object-linker\x20core\x20binding)'},{'object':'Guard','phase':'claim','relationship':'claim:\x20iterates\x20self.guards\x20looking\x20for\x20guard.id_address\x20match;\x20E_GUARD_NOT_FOUND\x20if\x20no\x20match'},{'object':'Guard','phase':'claim','relationship':'claim:\x20passport::result_for_guard(passport,\x20guard_id)\x20verifies\x20submission\x20data'},{'object':'Passport','phase':'claim','relationship':'claim:\x20passport::submission_get\x20extracts\x20recipient\x20(address)\x20and/or\x20amount\x20(u64)\x20per\x20RewardGuard\x20variant'},{'object':'Passport','phase':'claim','relationship':'claim:\x20if\x20store_from_id\x20is\x20Some,\x20extracts\x20store-from\x20address\x20from\x20Passport\x20submission'},{'object':'Payment','phase':'funds_replenish','relationship':'receive\x20(154):\x20Payment.unwrap_with_check\x20extracts\x20Coin<T>\x20from\x20CoinWrapper<T>\x20and\x20joins\x20balance'},{'object':'Payment','phase':'owner_receive','relationship':'owner_receive\x20(156):\x20Payment.unwrap_with_check\x20forwards\x20CoinWrapper<K>\x20to\x20Permission\x20owner'},{'object':'Repository','phase':'claim','relationship':'Guard\x20may\x20query\x20Repository\x20(e.g.\x20order\x20history\x20for\x20first-order\x20/\x20loyalty\x20verification)'},{'object':'Service','phase':'claim','relationship':'Guard\x20may\x20verify\x20order.service\x20==\x20this\x20Service\x20(cashback\x20/\x20first-order\x20scenarios)'},{'object':'Demand','phase':'guard_addition','relationship':'Guard\x20may\x20be\x20shared\x20with\x20Demand\x20(recommendation\x20filtering);\x20same\x20Guard\x20object\x20address\x20space'},{'object':'Allocation','phase':'owner_receive','relationship':'Terminal\x20Allocation\x20alloc\x20may\x20route\x20funds\x20back\x20to\x20Reward\x20(replenishment\x20loop)'},{'object':'Contact','phase':'um_mgmt','relationship':'um_set\x20(157):\x20binds\x20Contact\x20(UM)\x20for\x20off-chain\x20coordination;\x20creates\x20object-linker\x20core\x20binding'},{'object':'Coin','phase':'universal','relationship':'Reward<phantom\x20T>:\x20T\x20is\x20the\x20coin\x20type;\x20balance:\x20Balance<T>;\x20coin_add\x20expects\x20Coin<T>'}];
1
+ import{MAX_GUARD_COUNT_REWARD,MAX_RECORD_COUNT_REWARD}from'./onchain-constants.js';export{MAX_GUARD_COUNT_REWARD,MAX_RECORD_COUNT_REWARD};export const REWARD_NEW={'index':0x96,'name':'REWARD_NEW','description':'Create\x20new\x20Reward<T>','governed_operations':['create\x20a\x20new\x20Reward\x20pool'],'sdk_exposed':!![]};export const REWARD_DESCRIPTION={'index':0x97,'name':'REWARD_DESCRIPTION','description':'Update\x20description','governed_operations':['update\x20the\x20Reward\x20description'],'sdk_exposed':!![]};export const REWARD_GUARD={'index':0x98,'name':'REWARD_GUARD','description':'Add\x20/\x20remove\x20expired\x20guards\x20(≤\x20MAX_GUARD_COUNT_REWARD=200)','governed_operations':['add\x20a\x20claim\x20guard\x20to\x20the\x20Reward','remove\x20expired\x20claim\x20guards'],'sdk_exposed':!![]};export const REWARD_COIN_ADD={'index':0x99,'name':'REWARD_COIN_ADD','description':'Deposit\x20Coin<T>\x20directly\x20into\x20Reward\x20balance\x20(joins\x20Balance<T>)','governed_operations':['deposit\x20Coin<T>\x20into\x20the\x20Reward\x20balance'],'sdk_exposed':!![]};export const REWARD_RECEIVE={'index':0x9a,'name':'REWARD_RECEIVE','description':'Receive\x20CoinWrapper<T>\x20into\x20the\x20balance\x20(unwrapped\x20with\x20balance\x20check)','governed_operations':['receive\x20a\x20CoinWrapper<T>\x20payment\x20into\x20the\x20balance'],'sdk_exposed':!![]};export const REWARD_GUARD_EXPIRATION_TIME_ADD={'index':0x9b,'name':'REWARD_GUARD_EXPIRATION_TIME_ADD','description':'Set\x20/\x20cancel\x20guard_not_added_expiration_time\x20(time-lock\x20on\x20new\x20guard\x20additions)','governed_operations':['set\x20or\x20cancel\x20the\x20time-lock\x20on\x20adding\x20new\x20guards'],'sdk_exposed':!![]};export const REWARD_OWNER_RECEIVE={'index':0x9c,'name':'REWARD_OWNER_RECEIVE','description':'Owner\x20receives\x20Receiving<K>\x20/\x20CoinWrapper<K>\x20at\x20terminal\x20state\x20(unwrap\x20→\x20owner)','governed_operations':['owner\x20receipt\x20of\x20payments\x20at\x20terminal\x20state\x20(unwrapped\x20to\x20the\x20owner)','owner\x20receipt\x20of\x20whole\x20objects\x20at\x20terminal\x20state'],'sdk_exposed':!![]};export const REWARD_UM={'index':0x9d,'name':'REWARD_UM','description':'Bind\x20/\x20unbind\x20Contact\x20(UM)\x20for\x20off-chain\x20coordination','governed_operations':['bind\x20a\x20Contact\x20as\x20the\x20UM\x20coordinator','unbind\x20the\x20UM\x20Contact'],'sdk_exposed':!![]};export const REWARD_PERMISSIONS=[REWARD_NEW,REWARD_DESCRIPTION,REWARD_GUARD,REWARD_COIN_ADD,REWARD_RECEIVE,REWARD_GUARD_EXPIRATION_TIME_ADD,REWARD_OWNER_RECEIVE,REWARD_UM];export const REWARD_FIELDS=[{'name':'id','move_type':'UID','mutability':'immutable','set_at_creation':!![],'constraint':'Object\x20UID;\x20assigned\x20at\x20creation.\x20Never\x20changes.'},{'name':'description','move_type':'String','mutability':'admin_mutable','set_at_creation':!![],'permission_index':0x97,'constraint':'Must\x20satisfy\x20common::DESCRIPTION.\x20Updated\x20via\x20permission\x20151.'},{'name':'guards','move_type':'vector<RewardGuard>','mutability':'admin_mutable','set_at_creation':!![],'permission_index':0x98,'constraint':'vector::length\x20<\x20MAX_GUARD_COUNT\x20(200);\x20E_GUARD_COUNT_EXCEEDED\x20on\x20overflow.','related_errors':['E_GUARD_COUNT_EXCEEDED']},{'name':'balance','move_type':'Balance<T>','mutability':'runtime','set_at_creation':!![],'constraint':'Zero\x20at\x20creation\x20(balance::zero());\x20grows\x20via\x20coin_add/receive;\x20shrinks\x20via\x20claim\x20(split)\x20and\x20never\x20via\x20direct\x20withdraw.','related_errors':['E_INSUFFICIENT_BALANCE']},{'name':'guard_not_added_expiration_time','move_type':'Option<u64>','mutability':'admin_mutable','set_at_creation':!![],'permission_index':0x9b,'constraint':'Option<timestamp_ms>.\x20When\x20Some(t):\x20guard_add\x20requires\x20clock\x20>\x20t\x20(E_GUARD_LOCKED_TIME).\x20When\x20None\x20or\x20t\x20<\x20now:\x20guards\x20can\x20be\x20added.','related_errors':['E_GUARD_LOCKED_TIME','E_GUARD_LOCKED_TIME_NOT_INCREASING','E_GUARD_LOCKED_TIME_INVALID']},{'name':'record','move_type':'ParentTable<address,\x20RecipientRecord>','mutability':'runtime','set_at_creation':!![],'constraint':'Per-recipient\x20claim\x20history.\x20Each\x20RecipientRecord.amount\x20vector\x20has\x20length\x20<\x20MAX_RECORD_COUNT\x20(5200);\x20E_RECORD_COUNT_EXCEEDED\x20on\x20overflow.','related_errors':['E_RECORD_COUNT_EXCEEDED']},{'name':'um','move_type':'Option<address>','mutability':'admin_mutable','set_at_creation':!![],'permission_index':0x9d,'constraint':'Option<Contact\x20address>.\x20Binding\x20creates\x20an\x20object-linker\x20core\x20binding;\x20unbinding\x20disaffiliates.'},{'name':'permission','move_type':'address','mutability':'admin_mutable','set_at_creation':!![],'constraint':'Permission\x20object\x20address.\x20Updated\x20owner-only\x20(asserts\x20old.owner\x20==\x20sender);\x20the\x20change\x20is\x20registered\x20as\x20an\x20object-linker\x20affiliation\x20change.'}];export const REWARD_GUARD_CONSTRUCTORS=[{'constructor':'dynamic_recipient_dynamic_amount','recipient_type':'GuardIdentifier','amount_type':'GuardU64Identifier','params':{'recipient_param':'u8','amount_param':'u8','expiration_time':'Option<u64>','store_from_id':'Option<u8>'},'construction_checks':['recipient\x20identifier\x20must\x20resolve\x20to\x20an\x20address\x20in\x20the\x20Passport\x20table\x20—\x20E_RECIPIENT_IDENTIFIER_NOT_ADDRESS\x20(4)','amount\x20identifier\x20must\x20resolve\x20to\x20a\x20u64\x20Passport\x20value\x20—\x20E_AMOUNT_NOT_U64\x20(5)','if\x20store_from_id\x20is\x20Some:\x20its\x20identifier\x20must\x20be\x20number/address\x20compatible\x20—\x20E_STORE_FROM_ID_NOT_COMPATIBLE\x20(12)'],'typical_use':'Dynamic\x20recipient\x20+\x20dynamic\x20amount\x20—\x20both\x20extracted\x20from\x20Passport\x20at\x20claim\x20time\x20(e.g.\x20referral\x20rewards\x20where\x20referrer\x20and\x20amount\x20vary\x20per\x20claim).'},{'constructor':'dynamic_recipient_fixed_amount','recipient_type':'GuardIdentifier','amount_type':'Fixed','params':{'recipient_param':'u8','amount_param':'u64','expiration_time':'Option<u64>','store_from_id':'Option<u8>'},'construction_checks':['recipient\x20identifier\x20must\x20resolve\x20to\x20an\x20address\x20in\x20the\x20Passport\x20table\x20—\x20E_RECIPIENT_IDENTIFIER_NOT_ADDRESS\x20(4)','if\x20store_from_id\x20is\x20Some:\x20its\x20identifier\x20must\x20be\x20number/address\x20compatible\x20—\x20E_STORE_FROM_ID_NOT_COMPATIBLE\x20(12)'],'typical_use':'Dynamic\x20recipient\x20+\x20fixed\x20amount\x20—\x20e.g.\x20first-order\x20reward\x20where\x20any\x20new\x20customer\x20claims\x20a\x20fixed\x201\x20WOW.'},{'constructor':'entity_recipient_dynamic_amount','recipient_type':'Entity','amount_type':'GuardU64Identifier','params':{'recipient_param':'address','amount_param':'u8','expiration_time':'Option<u64>','store_from_id':'Option<u8>'},'construction_checks':['amount\x20identifier\x20must\x20resolve\x20to\x20a\x20u64\x20Passport\x20value\x20—\x20E_AMOUNT_NOT_U64\x20(5)','if\x20store_from_id\x20is\x20Some:\x20its\x20identifier\x20must\x20be\x20number/address\x20compatible\x20—\x20E_STORE_FROM_ID_NOT_COMPATIBLE\x20(12)'],'typical_use':'Fixed\x20recipient\x20+\x20dynamic\x20amount\x20—\x20e.g.\x20tiered\x20loyalty\x20reward\x20where\x20amount\x20depends\x20on\x20Passport\x20submission\x20(tier\x20level).'},{'constructor':'entity_recipient_fixed_amount','recipient_type':'Entity','amount_type':'Fixed','params':{'recipient_param':'address','amount_param':'u64','expiration_time':'Option<u64>','store_from_id':'Option<u8>'},'construction_checks':['if\x20store_from_id\x20is\x20Some:\x20its\x20identifier\x20must\x20be\x20number/address\x20compatible\x20—\x20E_STORE_FROM_ID_NOT_COMPATIBLE\x20(12)'],'typical_use':'Fully\x20fixed\x20recipient\x20+\x20amount\x20—\x20simplest\x20configuration\x20(e.g.\x20specific\x20partner\x20bounty).'},{'constructor':'caller_recipient_dynamic_amount','recipient_type':'Signer','amount_type':'GuardU64Identifier','params':{'amount_param':'u8','expiration_time':'Option<u64>','store_from_id':'Option<u8>'},'construction_checks':['amount\x20identifier\x20must\x20resolve\x20to\x20a\x20u64\x20Passport\x20value\x20—\x20E_AMOUNT_NOT_U64\x20(5)','if\x20store_from_id\x20is\x20Some:\x20its\x20identifier\x20must\x20be\x20number/address\x20compatible\x20—\x20E_STORE_FROM_ID_NOT_COMPATIBLE\x20(12)'],'typical_use':'Caller\x20is\x20recipient\x20+\x20dynamic\x20amount\x20—\x20e.g.\x20self-service\x20claim\x20where\x20amount\x20depends\x20on\x20Passport\x20submission\x20(e.g.\x20cashback\x20rate).'},{'constructor':'caller_recipient_fixed_amount','recipient_type':'Signer','amount_type':'Fixed','params':{'amount_param':'u64','expiration_time':'Option<u64>','store_from_id':'Option<u8>'},'construction_checks':['if\x20store_from_id\x20is\x20Some:\x20its\x20identifier\x20must\x20be\x20number/address\x20compatible\x20—\x20E_STORE_FROM_ID_NOT_COMPATIBLE\x20(12)'],'typical_use':'Caller\x20is\x20recipient\x20+\x20fixed\x20amount\x20—\x20e.g.\x20flash\x20sale\x20where\x20any\x20eligible\x20caller\x20claims\x20a\x20fixed\x20reward.'}];export const REWARD_ERROR_CODES=[{'code':0x1,'name':'E_GUARD_LOCKED_TIME_NOT_INCREASING','description':'guard-lock\x20time\x20update:\x20new\x20time\x20<\x20current\x20clock\x20(must\x20be\x20≥\x20now)','trigger_operation':'guard-lock\x20time\x20update\x20(155)'},{'code':0x2,'name':'E_GUARD_EXPIRED','description':'guard_add\x20on\x20guard\x20with\x20expiration_time\x20<\x20now,\x20OR\x20claim\x20on\x20guard\x20with\x20expiration_time\x20<\x20now','trigger_operation':'guard_add\x20/\x20claim'},{'code':0x3,'name':'E_GUARD_COUNT_EXCEEDED','description':'guard_add\x20would\x20exceed\x20MAX_GUARD_COUNT=200\x20(only\x20on\x20NEW\x20guard,\x20not\x20on\x20update\x20of\x20existing)','trigger_operation':'guard_add'},{'code':0x4,'name':'E_RECIPIENT_IDENTIFIER_NOT_ADDRESS','description':'RewardGuard\x20constructor:\x20recipient\x20identifier\x20type\x20is\x20not\x20address\x20(GuardIdentifier\x20variant\x20only)','trigger_operation':'claim-guard\x20construction'},{'code':0x5,'name':'E_AMOUNT_NOT_U64','description':'RewardGuard\x20constructor:\x20amount\x20identifier\x20type\x20is\x20not\x20u64\x20(GuardU64Identifier\x20variant\x20only)','trigger_operation':'claim-guard\x20construction'},{'code':0x6,'name':'E_INSUFFICIENT_BALANCE','description':'claim:\x20balance\x20<\x20amount\x20(cannot\x20split\x20more\x20than\x20held)','trigger_operation':'claim'},{'code':0x7,'name':'E_GUARD_NOT_FOUND','description':'claim:\x20no\x20guard\x20in\x20self.guards\x20matches\x20the\x20supplied\x20guard\x20address','trigger_operation':'claim'},{'code':0x8,'name':'E_RECORD_COUNT_EXCEEDED','description':'claim:\x20recipient\x20already\x20has\x20MAX_RECORD_COUNT=5200\x20entries\x20(E_RECORD_COUNT_EXCEEDED)','trigger_operation':'claim'},{'code':0xa,'name':'E_GUARD_LOCKED_TIME','description':'guard_add\x20while\x20guard_not_added_expiration_time\x20is\x20Some\x20and\x20clock\x20≤\x20expiration_time','trigger_operation':'guard_add'},{'code':0xb,'name':'E_GUARD_LOCKED_TIME_INVALID','description':'guard-lock\x20time\x20update:\x20new\x20Some(t)\x20where\x20t\x20≤\x20now\x20(must\x20be\x20future)','trigger_operation':'guard-lock\x20time\x20update\x20(155)'},{'code':0xc,'name':'E_STORE_FROM_ID_NOT_COMPATIBLE','description':'RewardGuard\x20constructor:\x20store_from_id\x20identifier\x20type\x20is\x20not\x20number\x20or\x20address','trigger_operation':'claim-guard\x20construction'}];export const REWARD_SCENES=[{'id':'reward_first_order','name':'First-order\x20reward','industry':['universal','ecommerce','service','freelance'],'scenario':'New\x20customers\x20receive\x20a\x20fixed\x20reward\x20after\x20their\x20first\x20order.\x20Guard\x20verifies\x20order\x20ownership\x20+\x20first-time\x20status;\x20'+'Recipient=Signer\x20(caller\x20is\x20the\x20new\x20customer);\x20Amount=Fixed\x20(e.g.\x201\x20WOW).','phases':['creation','guard_addition','funds_replenish','claim'],'coin_type_note':'T\x20=\x20project\x20reward\x20coin\x20(e.g.\x200x2::wow::WOW\x20or\x20a\x20custom\x20token)','typical_guard_count':0x1,'recipient_types_used':['Signer'],'amount_types_used':['Fixed'],'uses_expiration_time':!![],'uses_store_from_id':![],'builtin_indexes_consumed':[REWARD_NEW,REWARD_GUARD,REWARD_COIN_ADD],'common_patterns':['Signer\x20recipient\x20+\x20Fixed\x20amount\x20—\x20caller\x20claims\x20a\x20fixed\x20amount\x20(e.g.\x201\x20WOW)','Guard\x20verifies:\x20order_address.holder\x20==\x20signer\x20AND\x20order\x20is\x20the\x20first\x20order\x20(Repository\x20query)','expiration_time\x20bounds\x20the\x20campaign\x20window\x20(e.g.\x2030\x20days)','coin_add\x20deposits\x20the\x20campaign\x20budget\x20upfront\x20(e.g.\x20100\x20WOW\x20for\x20100\x20claims)'],'recommended_templates':['first_order']},{'id':'reward_referral','name':'Referral\x20viral\x20reward','industry':['universal','ecommerce','service','content'],'scenario':'Both\x20referrer\x20and\x20referee\x20receive\x20a\x20reward\x20when\x20the\x20referee\x20completes\x20a\x20first\x20order.\x20Two\x20guards:\x20one\x20for\x20referrer\x20(Entity),\x20one\x20for\x20referee\x20(Signer).','phases':['creation','guard_addition','funds_replenish','claim'],'coin_type_note':'T\x20=\x20project\x20reward\x20coin','typical_guard_count':0x2,'recipient_types_used':['Entity','Signer'],'amount_types_used':['Fixed'],'uses_expiration_time':!![],'uses_store_from_id':!![],'builtin_indexes_consumed':[REWARD_NEW,REWARD_GUARD,REWARD_COIN_ADD],'common_patterns':['Entity\x20recipient\x20+\x20Fixed\x20amount\x20for\x20the\x20referrer\x20(recipient\x20=\x20referrer\x20address)','Signer\x20recipient\x20+\x20Fixed\x20amount\x20for\x20the\x20referee\x20(caller\x20is\x20recipient)','Guard\x20verifies:\x20referrer\x20marked\x20in\x20Repository\x20AND\x20referee\x27s\x20order\x20completed','store_from_id\x20may\x20record\x20the\x20order\x20address\x20for\x20audit\x20trail'],'recommended_templates':['referral']},{'id':'reward_loyalty','name':'Loyalty\x20tiered\x20reward','industry':['universal','ecommerce','subscription','content'],'scenario':'Customers\x20unlock\x20higher\x20rewards\x20after\x20reaching\x20cumulative\x20spending\x20tiers.\x20Recipient=Signer;\x20Amount=GuardU64Identifier\x20(tier-dependent\x20amount\x20extracted\x20from\x20Passport).','phases':['creation','guard_addition','funds_replenish','claim'],'coin_type_note':'T\x20=\x20project\x20reward\x20coin','typical_guard_count':0x1,'recipient_types_used':['Signer'],'amount_types_used':['GuardU64Identifier'],'uses_expiration_time':![],'uses_store_from_id':![],'builtin_indexes_consumed':[REWARD_NEW,REWARD_GUARD,REWARD_COIN_ADD],'common_patterns':['Signer\x20recipient\x20+\x20identifier\x20amount\x20—\x20amount\x20is\x20dynamic,\x20extracted\x20from\x20Passport\x20submission\x20(tier\x20level\x20→\x20reward\x20amount)','Guard\x20verifies:\x20cumulative\x20spend\x20≥\x20tier\x20threshold\x20(Repository\x20query)','No\x20expiration_time\x20—\x20loyalty\x20is\x20perpetual\x20(until\x20deactivated\x20via\x20guard_remove_expired)','Guard\x20submission\x20value\x20type\x20MUST\x20be\x20u64\x20(E_AMOUNT_NOT_U64\x20otherwise)'],'recommended_templates':['loyalty']},{'id':'reward_flash_sale','name':'Limited-time\x20flash\x20sale\x20reward','industry':['universal','ecommerce','retail'],'scenario':'Time-bounded\x20reward\x20for\x20the\x20first\x20N\x20callers.\x20Recipient=Signer;\x20Amount=Fixed.\x20Guard\x20verifies\x20time\x20window\x20+\x20claim\x20count.','phases':['creation','guard_addition','funds_replenish','claim','guard_lock_mgmt'],'coin_type_note':'T\x20=\x20project\x20reward\x20coin','typical_guard_count':0x1,'recipient_types_used':['Signer'],'amount_types_used':['Fixed'],'uses_expiration_time':!![],'uses_store_from_id':![],'builtin_indexes_consumed':[REWARD_NEW,REWARD_GUARD,REWARD_COIN_ADD,REWARD_GUARD_EXPIRATION_TIME_ADD],'common_patterns':['Signer\x20recipient\x20+\x20Fixed\x20amount\x20—\x20fixed\x20amount\x20per\x20claim\x20(e.g.\x202\x20WOW)','expiration_time\x20bounds\x20the\x20flash\x20sale\x20window\x20(e.g.\x2048\x20hours)','the\x20guard-addition\x20time-lock\x20(155)\x20may\x20lock\x20further\x20guard\x20additions\x20during\x20the\x20sale','Budget\x20=\x20max_claims\x20×\x20amount;\x20coin_add\x20deposits\x20this\x20upfront'],'recommended_templates':['flash_sale']},{'id':'reward_bulk_discount','name':'Bulk\x20discount\x20/\x20cashback\x20reward','industry':['universal','ecommerce','wholesale','service'],'scenario':'Customer\x20receives\x20cashback\x20proportional\x20to\x20order\x20size.\x20Recipient=Signer\x20or\x20Entity\x20(order\x20holder);\x20Amount=GuardU64Identifier\x20(cashback\x20rate\x20from\x20Passport).','phases':['creation','guard_addition','funds_replenish','claim'],'coin_type_note':'T\x20=\x20payment\x20coin\x20type\x20(must\x20match\x20order\x20payment\x20for\x20clean\x20cashback)','typical_guard_count':0x1,'recipient_types_used':['Signer','Entity'],'amount_types_used':['GuardU64Identifier'],'uses_expiration_time':![],'uses_store_from_id':!![],'builtin_indexes_consumed':[REWARD_NEW,REWARD_GUARD,REWARD_COIN_ADD,REWARD_RECEIVE],'common_patterns':['Signer\x20recipient\x20+\x20identifier\x20amount\x20—\x20caller\x20claims\x20dynamic\x20amount\x20(cashback\x20=\x20order_amount\x20×\x20rate)','store_from_id\x20records\x20the\x20order\x20address\x20for\x20cross-reference\x20(audit\x20trail)','receive\x20(154)\x20may\x20be\x20used\x20to\x20accept\x20CoinWrapper<T>\x20refunds\x20that\x20replenish\x20the\x20balance','Guard\x20verifies:\x20order.completed\x20AND\x20order.service\x20==\x20this\x20Service'],'recommended_templates':['cashback']},{'id':'reward_milestone','name':'Service\x20milestone\x20reward','industry':['universal','ecommerce','content','subscription'],'scenario':'When\x20a\x20Service\x20reaches\x20a\x20milestone\x20(e.g.\x20100\x20orders),\x20early\x20supporters\x20receive\x20extra\x20rewards.\x20Recipient=Entity\x20(early\x20customer);\x20Amount=Fixed.','phases':['creation','guard_addition','funds_replenish','claim','guard_lock_mgmt'],'coin_type_note':'T\x20=\x20project\x20reward\x20coin','typical_guard_count':0x32,'recipient_types_used':['Entity'],'amount_types_used':['Fixed'],'uses_expiration_time':!![],'uses_store_from_id':![],'builtin_indexes_consumed':[REWARD_NEW,REWARD_GUARD,REWARD_COIN_ADD,REWARD_GUARD_EXPIRATION_TIME_ADD],'common_patterns':['Entity\x20recipient\x20+\x20Fixed\x20amount\x20for\x20each\x20early\x20customer\x20(recipient\x20=\x20customer\x20address)','Multiple\x20guards\x20(up\x20to\x2050\x20for\x2050\x20early\x20supporters)\x20—\x20well\x20within\x20MAX_GUARD_COUNT=200','Guard\x20verifies:\x20Service\x20order_count\x20>=\x20milestone\x20AND\x20claimer\x20is\x20in\x20early-customer\x20list','the\x20guard-addition\x20time-lock\x20(155)\x20may\x20lock\x20the\x20guard\x20list\x20after\x20milestone\x20setup'],'recommended_templates':['milestone']}];export const REWARD_LEDGER_VERSION='1.0.0';export function getScenesByPhase(a){return REWARD_SCENES['filter'](b=>b['phases']['includes'](a));}export function findSceneById(a){return REWARD_SCENES['find'](b=>b['id']===a);}export function getScenesByIndustry(a){return REWARD_SCENES['filter'](b=>b['industry']['includes'](a)||b['industry']['includes']('universal'));}export function getBuiltinPermissionByIndex(a){return REWARD_PERMISSIONS['find'](b=>b['index']===a);}export function isRewardBuiltinPermission(a){return getBuiltinPermissionByIndex(a)!==undefined;}export function getAllBuiltinPermissions(){return[...REWARD_PERMISSIONS];}export function getRewardScenesCount(){return REWARD_SCENES['length'];}export function getGuardConstructorSpec(a){return REWARD_GUARD_CONSTRUCTORS['find'](b=>b['constructor']===a);}export function resolveGuardConstructor(a,b){const c={'GuardIdentifier|GuardU64Identifier':'dynamic_recipient_dynamic_amount','GuardIdentifier|Fixed':'dynamic_recipient_fixed_amount','Entity|GuardU64Identifier':'entity_recipient_dynamic_amount','Entity|Fixed':'entity_recipient_fixed_amount','Signer|GuardU64Identifier':'caller_recipient_dynamic_amount','Signer|Fixed':'caller_recipient_fixed_amount'};return c[a+'|'+b];}export function getRewardErrorByCode(a){return REWARD_ERROR_CODES['find'](b=>b['code']===a);}export function getRewardErrorByName(a){return REWARD_ERROR_CODES['find'](b=>b['name']===a);}export function validateGuardCount(a){if(a>=MAX_GUARD_COUNT_REWARD)return{'ok':![],'violation':'Guard\x20count\x20'+a+'\x20would\x20exceed\x20MAX_GUARD_COUNT_REWARD\x20'+MAX_GUARD_COUNT_REWARD};return{'ok':!![]};}export function validateRecordCount(a){if(a>=MAX_RECORD_COUNT_REWARD)return{'ok':![],'violation':'Record\x20count\x20'+a+'\x20would\x20exceed\x20MAX_RECORD_COUNT_REWARD\x20'+MAX_RECORD_COUNT_REWARD+'\x20—\x20recipient\x20can\x20no\x20longer\x20claim'};return{'ok':!![]};}export function inferSceneFromIntent(a){const b=a['toLowerCase'](),c=[['flash\x20sale','reward_flash_sale'],['flash_sale','reward_flash_sale'],['limited-time','reward_flash_sale'],['limited\x20time','reward_flash_sale'],['referral','reward_referral'],['viral','reward_referral'],['refer\x20a\x20friend','reward_referral'],['invite','reward_referral'],['loyalty','reward_loyalty'],['tiered','reward_loyalty'],['tier','reward_loyalty'],['repeat','reward_loyalty'],['cashback','reward_bulk_discount'],['bulk\x20discount','reward_bulk_discount'],['bulk_discount','reward_bulk_discount'],['wholesale','reward_bulk_discount'],['milestone','reward_milestone'],['early\x20supporter','reward_milestone'],['early\x20customer','reward_milestone'],['first\x20order','reward_first_order'],['first_order','reward_first_order'],['new\x20customer','reward_first_order'],['first-time','reward_first_order']];for(const [d,e]of c){if(b['includes'](d)){const f=findSceneById(e);if(f)return f;}}return undefined;}export const REWARD_CROSS_OBJECT_REFS=[{'object':'Permission','phase':'universal','relationship':'Reward.permission\x20(address;\x20borrowed\x20for\x20all\x20150-157\x20assertions)'},{'object':'Permission','phase':'permission_update','relationship':'permission\x20update:\x20owner-only\x20(asserts\x20old.owner\x20==\x20sender);\x20registered\x20as\x20an\x20object-linker\x20affiliation\x20change'},{'object':'Guard','phase':'guard_addition','relationship':'RewardGuard.guard\x20=\x20guard.id_address\x20(each\x20guard\x20registered\x20via\x20object-linker\x20core\x20binding)'},{'object':'Guard','phase':'claim','relationship':'claim:\x20iterates\x20self.guards\x20looking\x20for\x20guard.id_address\x20match;\x20E_GUARD_NOT_FOUND\x20if\x20no\x20match'},{'object':'Guard','phase':'claim','relationship':'claim:\x20the\x20guard\x20verification\x20result\x20validates\x20the\x20Passport\x20submission\x20data'},{'object':'Passport','phase':'claim','relationship':'claim:\x20the\x20claimant\x27s\x20Passport\x20submission\x20supplies\x20the\x20recipient\x20(address)\x20and/or\x20amount\x20(u64)\x20per\x20RewardGuard\x20variant'},{'object':'Passport','phase':'claim','relationship':'claim:\x20if\x20store_from_id\x20is\x20Some,\x20extracts\x20store-from\x20address\x20from\x20Passport\x20submission'},{'object':'Payment','phase':'funds_replenish','relationship':'receive\x20(154):\x20unwraps\x20Coin<T>\x20from\x20CoinWrapper<T>\x20(with\x20check)\x20and\x20joins\x20the\x20balance'},{'object':'Payment','phase':'owner_receive','relationship':'owner\x20receipt\x20(156):\x20unwraps\x20CoinWrapper<K>\x20and\x20forwards\x20it\x20to\x20the\x20Permission\x20owner'},{'object':'Repository','phase':'claim','relationship':'Guard\x20may\x20query\x20Repository\x20(e.g.\x20order\x20history\x20for\x20first-order\x20/\x20loyalty\x20verification)'},{'object':'Service','phase':'claim','relationship':'Guard\x20may\x20verify\x20order.service\x20==\x20this\x20Service\x20(cashback\x20/\x20first-order\x20scenarios)'},{'object':'Demand','phase':'guard_addition','relationship':'Guard\x20may\x20be\x20shared\x20with\x20Demand\x20(recommendation\x20filtering);\x20same\x20Guard\x20object\x20address\x20space'},{'object':'Allocation','phase':'owner_receive','relationship':'Terminal\x20Allocation\x20alloc\x20may\x20route\x20funds\x20back\x20to\x20Reward\x20(replenishment\x20loop)'},{'object':'Contact','phase':'um_mgmt','relationship':'UM\x20binding\x20(157):\x20binds\x20Contact\x20(UM)\x20for\x20off-chain\x20coordination;\x20creates\x20object-linker\x20core\x20binding'},{'object':'Coin','phase':'universal','relationship':'Reward<phantom\x20T>:\x20T\x20is\x20the\x20coin\x20type;\x20balance:\x20Balance<T>;\x20coin_add\x20expects\x20Coin<T>'}];
@@ -1,7 +1,7 @@
1
1
  import { MAX_GUARD_COUNT_REWARD, MAX_RECORD_COUNT_REWARD } from "./onchain-constants.js";
2
2
  import { resolveGuardConstructor, getGuardConstructorSpec, type RewardBuiltinPermissionEntry, type RewardGuardConstructor, type RewardRecipientType, type RewardAmountType } from "./reward-ledger.js";
3
3
  export interface RewardIntentPuzzle {
4
- action: "create" | "claim" | "guard_add" | "guard_remove_expired" | "guard_expiration_time_add" | "coin_add" | "receive" | "owner_receive" | "um_set" | "um_none" | "description_set" | "permission_set" | "query";
4
+ action: "create" | "claim" | "guard_add" | "guard_remove_expired" | "add guard expiration time" | "coin_add" | "receive" | "owner_receive" | "set um" | "clear um" | "set description" | "set permission" | "query";
5
5
  target_reward?: string;
6
6
  rule_sentence: string;
7
7
  failure_conditions: string[];
@@ -81,7 +81,7 @@ export declare function initPuzzleFromIntent(intent: Partial<RewardIntentPuzzle>
81
81
  export declare function checkPuzzleCompleteness(puzzle: RewardPuzzle): RewardPuzzleCompleteness;
82
82
  export interface RewardConstraintViolation {
83
83
  constraint_id: string;
84
- severity: "CRITICAL" | "HIGH" | "MEDIUM" | "LOW";
84
+ severity: "critical" | "high" | "medium" | "low";
85
85
  message: string;
86
86
  current_value?: string | number;
87
87
  limit?: string | number;
@@ -1 +1 @@
1
- import{MAX_GUARD_COUNT_REWARD,MAX_RECORD_COUNT_REWARD}from'./onchain-constants.js';import{resolveGuardConstructor,getGuardConstructorSpec}from'./reward-ledger.js';export const REWARD_FIELD_MUTABILITY=[{'field':'id','mutability':'immutable','set_at_creation':!![]},{'field':'description','mutability':'admin_mutable','permission_index':0x97,'set_at_creation':!![]},{'field':'guards','mutability':'admin_mutable','permission_index':0x98,'set_at_creation':!![]},{'field':'balance','mutability':'runtime','set_at_creation':!![]},{'field':'guard_not_added_expiration_time','mutability':'admin_mutable','permission_index':0x9b,'set_at_creation':!![]},{'field':'record','mutability':'runtime','set_at_creation':!![]},{'field':'um','mutability':'admin_mutable','permission_index':0x9d,'set_at_creation':!![]},{'field':'permission','mutability':'admin_mutable','set_at_creation':!![]}];export function initPuzzleFromIntent(a){const b={};return(a['action']||a['rule_sentence'])&&(b['intent']={'action':a['action']??'create','target_reward':a['target_reward'],'rule_sentence':a['rule_sentence']??'','failure_conditions':a['failure_conditions']??[]}),b['constraints']={'F_R_01_guard_count_le_200':!![],'F_R_02_record_count_le_5200':!![],'F_R_03_balance_sufficient_for_claim':!![],'F_R_04_guard_not_locked':!![],'F_R_05_guard_not_expired':!![],'F_R_06_recipient_amount_valid_pairing':![],'F_R_07_coin_type_matches_reward_t':![],'F_R_08_passport_required_for_claim':![],'F_R_09_progress_node_matches_intent':!![]},b;}export function checkPuzzleCompleteness(a){const b=[],d=[];if(!a['intent'])b['push']('A'),d['push']({'dimension':'A','reason':'Intent\x20not\x20specified\x20(action\x20+\x20rule_sentence)'});else!a['intent']['rule_sentence']&&(b['push']('A'),d['push']({'dimension':'A','reason':'rule_sentence\x20is\x20empty'}));const e=a['intent']?.['action'],f=e==='query',g=e==='claim';if(!f){if(e==='create'){if(!a['config'])b['push']('B'),d['push']({'dimension':'B','reason':'Reward\x20config\x20not\x20specified\x20(coin_type\x20+\x20description\x20+\x20permission)'});else{if(!a['config']['coin_type'])b['push']('B'),d['push']({'dimension':'B','reason':'coin_type\x20missing\x20(Reward<T>\x20phantom\x20T)'});else!a['config']['permission']&&!a['config']['permission_is_new']&&(b['push']('B'),d['push']({'dimension':'B','reason':'permission\x20address\x20missing\x20(or\x20set\x20permission_is_new=true)'}));}}}if(e==='guard_add'){if(!a['guard'])b['push']('C'),d['push']({'dimension':'C','reason':'Guard\x20config\x20not\x20specified\x20(guard\x20+\x20recipient\x20+\x20amount)'});else{if(!a['guard']['guard'])b['push']('C'),d['push']({'dimension':'C','reason':'guard\x20address\x20missing'});else{const h=resolveGuardConstructor(a['guard']['recipient_type'],a['guard']['amount_type']);!h&&(b['push']('C'),d['push']({'dimension':'C','reason':'Invalid\x20Recipient\x20×\x20Amount\x20pairing:\x20'+a['guard']['recipient_type']+'\x20×\x20'+a['guard']['amount_type']}));}}}if(e==='coin_add'||e==='receive'||e==='claim'||e==='owner_receive'){if(!a['funds'])b['push']('D'),d['push']({'dimension':'D','reason':'Funds\x20data\x20not\x20specified'});else{if(e==='coin_add'&&!a['funds']['coin_add_amount'])b['push']('D'),d['push']({'dimension':'D','reason':'coin_add_amount\x20missing'});else{if(e==='receive'&&!a['funds']['receive_payment'])b['push']('D'),d['push']({'dimension':'D','reason':'receive_payment\x20missing\x20(payment\x20address\x20+\x20token_type)'});else e==='owner_receive'&&!a['funds']['owner_receive_envelope']&&(b['push']('D'),d['push']({'dimension':'D','reason':'owner_receive_envelope\x20missing\x20(Receiving<K>\x20address)'}));}}}if(!a['permission'])b['push']('E'),d['push']({'dimension':'E','reason':'Permission\x20config\x20not\x20specified'});else g&&!a['permission']['requires_passport']&&(b['push']('E'),d['push']({'dimension':'E','reason':'claim\x20requires\x20Passport\x20(requires_passport\x20must\x20be\x20true)'}));return!a['constraints']&&(b['push']('F'),d['push']({'dimension':'F','reason':'Constraints\x20not\x20checked'})),{'dimensions':['A','B','C','D','E','F'],'missing':b,'missing_details':d,'complete':b['length']===0x0,'next_step':b['length']===0x0?'Puzzle\x20complete\x20—\x20ready\x20for\x20confirmation\x20text\x20generation':'Next:\x20complete\x20dimension\x20'+b[0x0]+'\x20—\x20'+d[0x0]['reason']};}export function validateConstraints(a){const b=[];a['intent']?.['action']==='claim'&&a['funds']&&a['constraints']&&(!a['constraints']['F_R_03_balance_sufficient_for_claim']&&b['push']({'constraint_id':'F-R-03','severity':'HIGH','message':'Balance\x20insufficient\x20for\x20claim\x20—\x20E_INSUFFICIENT_BALANCE\x20will\x20abort','current_value':a['funds']['current_balance'],'limit':a['funds']['claim_amount_estimate']}));a['intent']?.['action']==='guard_add'&&a['constraints']&&!a['constraints']['F_R_04_guard_not_locked']&&b['push']({'constraint_id':'F-R-04','severity':'HIGH','message':'guard_not_added_expiration_time\x20is\x20in\x20the\x20future\x20—\x20E_GUARD_LOCKED_TIME\x20will\x20abort\x20guard_add'});(a['intent']?.['action']==='guard_add'||a['intent']?.['action']==='claim')&&a['constraints']&&!a['constraints']['F_R_05_guard_not_expired']&&b['push']({'constraint_id':'F-R-05','severity':'HIGH','message':'guard.expiration_time\x20<\x20now\x20—\x20E_GUARD_EXPIRED\x20will\x20abort'});if(a['guard']){const d=resolveGuardConstructor(a['guard']['recipient_type'],a['guard']['amount_type']);!d&&b['push']({'constraint_id':'F-R-06','severity':'HIGH','message':'Invalid\x20Recipient\x20×\x20Amount\x20pairing:\x20'+a['guard']['recipient_type']+'\x20×\x20'+a['guard']['amount_type']+'\x20—\x20no\x20matching\x20Move\x20constructor','current_value':a['guard']['recipient_type']+'\x20×\x20'+a['guard']['amount_type'],'limit':'one\x20of\x206\x20valid\x20pairings\x20(see\x20REWARD_GUARD_CONSTRUCTORS)'});}return a['intent']?.['action']==='coin_add'&&a['config']&&a['funds']&&a['constraints']&&(!a['constraints']['F_R_07_coin_type_matches_reward_t']&&b['push']({'constraint_id':'F-R-07','severity':'CRITICAL','message':'coin_add\x20coin\x20type\x20does\x20not\x20match\x20Reward<T>\x20('+a['config']['coin_type']+')','current_value':a['funds']['receive_payment']?.['token_type']??'(unknown)','limit':a['config']['coin_type']})),a['intent']?.['action']==='claim'&&a['permission']&&!a['permission']['requires_passport']&&b['push']({'constraint_id':'F-R-08','severity':'CRITICAL','message':'claim\x20requires\x20Passport\x20—\x20SDK\x20W_ERROR\x20if\x20missing'}),a['guard']&&a['intent']&&a['constraints']&&(!a['constraints']['F_R_09_progress_node_matches_intent']&&b['push']({'constraint_id':'F-R-09','severity':'HIGH','message':'Guard\x27s\x20expected\x20progress.current\x20value\x20does\x20not\x20match\x20business\x20intent\x20—\x20'+'praise\x20reward\x20(praise/wonder)\x20must\x20check\x20\x27wonder\x27\x20node,\x20not\x20\x27completed\x27.\x20'+'Guard\x20is\x20immutable\x20after\x20creation;\x20mismatch\x20requires\x20full\x20rebuild.'})),b;}export function generateConfirmationText(a){const b=[];b['push']('═══\x20Reward\x20Confirmation\x20═══'),b['push']('');if(a['intent']){b['push']('Action:\x20'+a['intent']['action']);if(a['intent']['target_reward'])b['push']('Target\x20Reward:\x20'+a['intent']['target_reward']);b['push']('Rule:\x20'+a['intent']['rule_sentence']);if(a['intent']['failure_conditions']['length']>0x0){b['push']('Failure\x20conditions:');for(const d of a['intent']['failure_conditions'])b['push']('\x20\x20-\x20'+d);}b['push']('');}a['config']&&(b['push']('─\x20Reward\x20Config\x20──────────────'),b['push']('Coin\x20type\x20T:\x20'+a['config']['coin_type']),b['push']('Description:\x20'+a['config']['description']),b['push']('Permission:\x20'+a['config']['permission']+'\x20(new:\x20'+(a['config']['permission_is_new']?'YES':'NO')+')'),b['push'](''));a['guard']&&(b['push']('─\x20Guard\x20Config\x20──────────────'),b['push']('Guard:\x20'+a['guard']['guard']),b['push']('Recipient:\x20'+a['guard']['recipient_type']+(a['guard']['recipient_param']!==undefined?'\x20('+a['guard']['recipient_param']+')':'')),b['push']('Amount:\x20'+a['guard']['amount_type']+'\x20('+a['guard']['amount_param']+')'),b['push']('Constructor:\x20'+a['guard']['constructor']),a['guard']['expiration_time']!=null&&b['push']('expiration_time:\x20'+a['guard']['expiration_time']),a['guard']['store_from_id']!=null&&b['push']('store_from_id:\x20'+a['guard']['store_from_id']),b['push'](''));if(a['funds']){b['push']('─\x20Funds\x20──────────────'),b['push']('Current\x20balance:\x20'+a['funds']['current_balance']);if(a['funds']['coin_add_amount'])b['push']('coin_add\x20amount:\x20'+a['funds']['coin_add_amount']);a['funds']['receive_payment']&&b['push']('receive\x20payment:\x20'+a['funds']['receive_payment']['payment']+'\x20(token:\x20'+a['funds']['receive_payment']['token_type']+')');if(a['funds']['claim_amount_estimate'])b['push']('Estimated\x20claim\x20amount:\x20'+a['funds']['claim_amount_estimate']);if(a['funds']['owner_receive_envelope'])b['push']('owner_receive\x20envelope:\x20'+a['funds']['owner_receive_envelope']);b['push']('');}if(a['permission']){b['push']('─\x20Permission\x20──────────────');if(a['permission']['builtin_indexes_used']['length']>0x0){b['push']('Builtin\x20indexes\x20used:');for(const e of a['permission']['builtin_indexes_used']){b['push']('\x20\x20['+e['index']+']\x20'+e['name']+':\x20'+e['description']);}}b['push']('Permission-free:\x20'+(a['permission']['is_permission_free']?'YES\x20(claim)':'NO')),b['push']('Requires\x20Passport:\x20'+(a['permission']['requires_passport']?'YES':'NO')),a['permission']['signer']&&b['push']('Signer:\x20'+a['permission']['signer']+'\x20(is_owner:\x20'+(a['permission']['signer_is_owner']?'YES':'NO')+')'),b['push']('');}const c=validateConstraints(a);if(c['length']>0x0){b['push']('─\x20Constraint\x20Violations\x20──────────────');for(const f of c)b['push']('\x20\x20['+f['severity']+']\x20'+f['constraint_id']+':\x20'+f['message']);b['push']('');}return b['join']('\x0a');}export function resolveBuiltinPermission(a){return void a,undefined;}export function requiresGuardConfig(a){return a['intent']?.['action']==='guard_add';}export function requiresPassport(a){return a['intent']?.['action']==='claim';}export function getRelevantDimensions(a){const b=['A','E','F'];if(a==='create')b['push']('B');if(a==='guard_add')b['push']('C');return(a==='coin_add'||a==='receive'||a==='claim'||a==='owner_receive')&&b['push']('D'),b;}export function getFieldMutability(a){return REWARD_FIELD_MUTABILITY['find'](b=>b['field']===a);}export function isAdminMutableField(a){return getFieldMutability(a)?.['mutability']==='admin_mutable';}export function getFieldPermissionIndex(a){return getFieldMutability(a)?.['permission_index'];}export{MAX_GUARD_COUNT_REWARD,MAX_RECORD_COUNT_REWARD,resolveGuardConstructor,getGuardConstructorSpec};
1
+ import{MAX_GUARD_COUNT_REWARD,MAX_RECORD_COUNT_REWARD}from'./onchain-constants.js';import{resolveGuardConstructor,getGuardConstructorSpec}from'./reward-ledger.js';export const REWARD_FIELD_MUTABILITY=[{'field':'id','mutability':'immutable','set_at_creation':!![]},{'field':'description','mutability':'admin_mutable','permission_index':0x97,'set_at_creation':!![]},{'field':'guards','mutability':'admin_mutable','permission_index':0x98,'set_at_creation':!![]},{'field':'balance','mutability':'runtime','set_at_creation':!![]},{'field':'guard_not_added_expiration_time','mutability':'admin_mutable','permission_index':0x9b,'set_at_creation':!![]},{'field':'record','mutability':'runtime','set_at_creation':!![]},{'field':'um','mutability':'admin_mutable','permission_index':0x9d,'set_at_creation':!![]},{'field':'permission','mutability':'admin_mutable','set_at_creation':!![]}];export function initPuzzleFromIntent(a){const b={};return(a['action']||a['rule_sentence'])&&(b['intent']={'action':a['action']??'create','target_reward':a['target_reward'],'rule_sentence':a['rule_sentence']??'','failure_conditions':a['failure_conditions']??[]}),b['constraints']={'F_R_01_guard_count_le_200':!![],'F_R_02_record_count_le_5200':!![],'F_R_03_balance_sufficient_for_claim':!![],'F_R_04_guard_not_locked':!![],'F_R_05_guard_not_expired':!![],'F_R_06_recipient_amount_valid_pairing':![],'F_R_07_coin_type_matches_reward_t':![],'F_R_08_passport_required_for_claim':![],'F_R_09_progress_node_matches_intent':!![]},b;}export function checkPuzzleCompleteness(a){const b=[],d=[];if(!a['intent'])b['push']('A'),d['push']({'dimension':'A','reason':'Intent\x20not\x20specified\x20(action\x20+\x20rule_sentence)'});else!a['intent']['rule_sentence']&&(b['push']('A'),d['push']({'dimension':'A','reason':'rule_sentence\x20is\x20empty'}));const e=a['intent']?.['action'],f=e==='query',g=e==='claim';if(!f){if(e==='create'){if(!a['config'])b['push']('B'),d['push']({'dimension':'B','reason':'Reward\x20config\x20not\x20specified\x20(coin_type\x20+\x20description\x20+\x20permission)'});else{if(!a['config']['coin_type'])b['push']('B'),d['push']({'dimension':'B','reason':'coin_type\x20missing\x20(Reward<T>\x20phantom\x20T)'});else!a['config']['permission']&&!a['config']['permission_is_new']&&(b['push']('B'),d['push']({'dimension':'B','reason':'permission\x20address\x20missing\x20(or\x20set\x20permission_is_new=true)'}));}}}if(e==='guard_add'){if(!a['guard'])b['push']('C'),d['push']({'dimension':'C','reason':'Guard\x20config\x20not\x20specified\x20(guard\x20+\x20recipient\x20+\x20amount)'});else{if(!a['guard']['guard'])b['push']('C'),d['push']({'dimension':'C','reason':'guard\x20address\x20missing'});else{const h=resolveGuardConstructor(a['guard']['recipient_type'],a['guard']['amount_type']);!h&&(b['push']('C'),d['push']({'dimension':'C','reason':'Invalid\x20Recipient\x20×\x20Amount\x20pairing:\x20'+a['guard']['recipient_type']+'\x20×\x20'+a['guard']['amount_type']}));}}}if(e==='coin_add'||e==='receive'||e==='claim'||e==='owner_receive'){if(!a['funds'])b['push']('D'),d['push']({'dimension':'D','reason':'Funds\x20data\x20not\x20specified'});else{if(e==='coin_add'&&!a['funds']['coin_add_amount'])b['push']('D'),d['push']({'dimension':'D','reason':'coin_add_amount\x20missing'});else{if(e==='receive'&&!a['funds']['receive_payment'])b['push']('D'),d['push']({'dimension':'D','reason':'receive_payment\x20missing\x20(payment\x20address\x20+\x20token_type)'});else e==='owner_receive'&&!a['funds']['owner_receive_envelope']&&(b['push']('D'),d['push']({'dimension':'D','reason':'owner_receive_envelope\x20missing\x20(Receiving<K>\x20address)'}));}}}if(!a['permission'])b['push']('E'),d['push']({'dimension':'E','reason':'Permission\x20config\x20not\x20specified'});else g&&!a['permission']['requires_passport']&&(b['push']('E'),d['push']({'dimension':'E','reason':'claim\x20requires\x20Passport\x20(requires_passport\x20must\x20be\x20true)'}));return!a['constraints']&&(b['push']('F'),d['push']({'dimension':'F','reason':'Constraints\x20not\x20checked'})),{'dimensions':['A','B','C','D','E','F'],'missing':b,'missing_details':d,'complete':b['length']===0x0,'next_step':b['length']===0x0?'Puzzle\x20complete\x20—\x20ready\x20for\x20confirmation\x20text\x20generation':'Next:\x20complete\x20dimension\x20'+b[0x0]+'\x20—\x20'+d[0x0]['reason']};}export function validateConstraints(a){const b=[];a['intent']?.['action']==='claim'&&a['funds']&&a['constraints']&&(!a['constraints']['F_R_03_balance_sufficient_for_claim']&&b['push']({'constraint_id':'F-R-03','severity':'high','message':'Balance\x20insufficient\x20for\x20claim\x20—\x20E_INSUFFICIENT_BALANCE\x20will\x20abort','current_value':a['funds']['current_balance'],'limit':a['funds']['claim_amount_estimate']}));a['intent']?.['action']==='guard_add'&&a['constraints']&&!a['constraints']['F_R_04_guard_not_locked']&&b['push']({'constraint_id':'F-R-04','severity':'high','message':'guard_not_added_expiration_time\x20is\x20in\x20the\x20future\x20—\x20E_GUARD_LOCKED_TIME\x20will\x20abort\x20guard_add'});(a['intent']?.['action']==='guard_add'||a['intent']?.['action']==='claim')&&a['constraints']&&!a['constraints']['F_R_05_guard_not_expired']&&b['push']({'constraint_id':'F-R-05','severity':'high','message':'guard.expiration_time\x20<\x20now\x20—\x20E_GUARD_EXPIRED\x20will\x20abort'});if(a['guard']){const d=resolveGuardConstructor(a['guard']['recipient_type'],a['guard']['amount_type']);!d&&b['push']({'constraint_id':'F-R-06','severity':'high','message':'Invalid\x20Recipient\x20×\x20Amount\x20pairing:\x20'+a['guard']['recipient_type']+'\x20×\x20'+a['guard']['amount_type']+'\x20—\x20no\x20matching\x20Move\x20constructor','current_value':a['guard']['recipient_type']+'\x20×\x20'+a['guard']['amount_type'],'limit':'one\x20of\x206\x20valid\x20pairings\x20(see\x20REWARD_GUARD_CONSTRUCTORS)'});}return a['intent']?.['action']==='coin_add'&&a['config']&&a['funds']&&a['constraints']&&(!a['constraints']['F_R_07_coin_type_matches_reward_t']&&b['push']({'constraint_id':'F-R-07','severity':'critical','message':'coin_add\x20coin\x20type\x20does\x20not\x20match\x20Reward<T>\x20('+a['config']['coin_type']+')','current_value':a['funds']['receive_payment']?.['token_type']??'(unknown)','limit':a['config']['coin_type']})),a['intent']?.['action']==='claim'&&a['permission']&&!a['permission']['requires_passport']&&b['push']({'constraint_id':'F-R-08','severity':'critical','message':'claim\x20requires\x20Passport\x20—\x20SDK\x20W_ERROR\x20if\x20missing'}),a['guard']&&a['intent']&&a['constraints']&&(!a['constraints']['F_R_09_progress_node_matches_intent']&&b['push']({'constraint_id':'F-R-09','severity':'high','message':'Guard\x27s\x20expected\x20progress.current\x20value\x20does\x20not\x20match\x20business\x20intent\x20—\x20'+'praise\x20reward\x20(praise/wonder)\x20must\x20check\x20\x27wonder\x27\x20node,\x20not\x20\x27completed\x27.\x20'+'Guard\x20is\x20immutable\x20after\x20creation;\x20mismatch\x20requires\x20full\x20rebuild.'})),b;}export function generateConfirmationText(a){const b=[];b['push']('═══\x20Reward\x20Confirmation\x20═══'),b['push']('');if(a['intent']){b['push']('Action:\x20'+a['intent']['action']);if(a['intent']['target_reward'])b['push']('Target\x20Reward:\x20'+a['intent']['target_reward']);b['push']('Rule:\x20'+a['intent']['rule_sentence']);if(a['intent']['failure_conditions']['length']>0x0){b['push']('Failure\x20conditions:');for(const d of a['intent']['failure_conditions'])b['push']('\x20\x20-\x20'+d);}b['push']('');}a['config']&&(b['push']('─\x20Reward\x20Config\x20──────────────'),b['push']('Coin\x20type\x20T:\x20'+a['config']['coin_type']),b['push']('Description:\x20'+a['config']['description']),b['push']('Permission:\x20'+a['config']['permission']+'\x20(new:\x20'+(a['config']['permission_is_new']?'YES':'NO')+')'),b['push'](''));a['guard']&&(b['push']('─\x20Guard\x20Config\x20──────────────'),b['push']('Guard:\x20'+a['guard']['guard']),b['push']('Recipient:\x20'+a['guard']['recipient_type']+(a['guard']['recipient_param']!==undefined?'\x20('+a['guard']['recipient_param']+')':'')),b['push']('Amount:\x20'+a['guard']['amount_type']+'\x20('+a['guard']['amount_param']+')'),b['push']('Constructor:\x20'+a['guard']['constructor']),a['guard']['expiration_time']!=null&&b['push']('expiration_time:\x20'+a['guard']['expiration_time']),a['guard']['store_from_id']!=null&&b['push']('store_from_id:\x20'+a['guard']['store_from_id']),b['push'](''));if(a['funds']){b['push']('─\x20Funds\x20──────────────'),b['push']('Current\x20balance:\x20'+a['funds']['current_balance']);if(a['funds']['coin_add_amount'])b['push']('coin_add\x20amount:\x20'+a['funds']['coin_add_amount']);a['funds']['receive_payment']&&b['push']('receive\x20payment:\x20'+a['funds']['receive_payment']['payment']+'\x20(token:\x20'+a['funds']['receive_payment']['token_type']+')');if(a['funds']['claim_amount_estimate'])b['push']('Estimated\x20claim\x20amount:\x20'+a['funds']['claim_amount_estimate']);if(a['funds']['owner_receive_envelope'])b['push']('owner_receive\x20envelope:\x20'+a['funds']['owner_receive_envelope']);b['push']('');}if(a['permission']){b['push']('─\x20Permission\x20──────────────');if(a['permission']['builtin_indexes_used']['length']>0x0){b['push']('Builtin\x20indexes\x20used:');for(const e of a['permission']['builtin_indexes_used']){b['push']('\x20\x20['+e['index']+']\x20'+e['name']+':\x20'+e['description']);}}b['push']('Permission-free:\x20'+(a['permission']['is_permission_free']?'YES\x20(claim)':'NO')),b['push']('Requires\x20Passport:\x20'+(a['permission']['requires_passport']?'YES':'NO')),a['permission']['signer']&&b['push']('Signer:\x20'+a['permission']['signer']+'\x20(is_owner:\x20'+(a['permission']['signer_is_owner']?'YES':'NO')+')'),b['push']('');}const c=validateConstraints(a);if(c['length']>0x0){b['push']('─\x20Constraint\x20Violations\x20──────────────');for(const f of c)b['push']('\x20\x20['+f['severity']+']\x20'+f['constraint_id']+':\x20'+f['message']);b['push']('');}return b['join']('\x0a');}export function resolveBuiltinPermission(a){return void a,undefined;}export function requiresGuardConfig(a){return a['intent']?.['action']==='guard_add';}export function requiresPassport(a){return a['intent']?.['action']==='claim';}export function getRelevantDimensions(a){const b=['A','E','F'];if(a==='create')b['push']('B');if(a==='guard_add')b['push']('C');return(a==='coin_add'||a==='receive'||a==='claim'||a==='owner_receive')&&b['push']('D'),b;}export function getFieldMutability(a){return REWARD_FIELD_MUTABILITY['find'](b=>b['field']===a);}export function isAdminMutableField(a){return getFieldMutability(a)?.['mutability']==='admin_mutable';}export function getFieldPermissionIndex(a){return getFieldMutability(a)?.['permission_index'];}export{MAX_GUARD_COUNT_REWARD,MAX_RECORD_COUNT_REWARD,resolveGuardConstructor,getGuardConstructorSpec};
@@ -1,5 +1,6 @@
1
+ import { type Facts, type FindingExposure } from "../config/rule-engine.js";
1
2
  import { type RewardScene, type RewardAmountType } from "./reward-ledger.js";
2
- export type RewardRiskLevel = "CRITICAL" | "HIGH" | "MEDIUM" | "LOW";
3
+ export type RewardRiskLevel = "critical" | "high" | "medium" | "low";
3
4
  export type RewardRiskCategory = "structural" | "semantic" | "permission" | "lifecycle" | "cross_object" | "business_semantic" | "fund_recovery";
4
5
  export interface RewardRisk {
5
6
  id: string;
@@ -13,6 +14,7 @@ export interface RewardRisk {
13
14
  evidence?: string;
14
15
  related_move_error?: string;
15
16
  auto_fixable: boolean;
17
+ exposure?: FindingExposure;
16
18
  }
17
19
  export type RewardStakeholder = "owner" | "claimer" | "service_provider" | "system";
18
20
  export interface RewardRiskRule {
@@ -69,6 +71,7 @@ export interface RewardRiskCheckContext {
69
71
  guard_expected_progress_state?: string;
70
72
  machine_has_wonder_node?: boolean;
71
73
  }
74
+ export declare function rewardRiskFacts(ctx: RewardRiskCheckContext): Facts;
72
75
  export declare const REWARD_RISK_VERSION = "1.1.0";
73
76
  export declare function getAllRewardRiskRules(): RewardRiskRule[];
74
77
  export interface RewardRiskAssessment {
@@ -1 +1 @@
1
- import{MAX_GUARD_COUNT_REWARD,MAX_RECORD_COUNT_REWARD}from'./onchain-constants.js';import{resolveGuardConstructor}from'./reward-ledger.js';const R_R_1_01={'id':'R-R-1-01','category':'structural','trigger':'guard_add\x20would\x20exceed\x20MAX_GUARD_COUNT_REWARD\x20(200)','check':a=>{if(!a['guard_add']||a['guard_add']['length']===0x0)return null;const b=a['current_guard_count']??0x0,c=a['guard_add']['length'];if(b+c>MAX_GUARD_COUNT_REWARD)return{'id':'R-R-1-01','level':'HIGH','category':'structural','title':'guard_add\x20would\x20exceed\x20MAX_GUARD_COUNT_REWARD','description':'Reward\x20has\x20'+b+'\x20guards,\x20adding\x20'+c+'\x20would\x20total\x20'+(b+c)+',\x20'+('exceeds\x20MAX_GUARD_COUNT_REWARD\x20'+MAX_GUARD_COUNT_REWARD+'.\x20Move\x20aborts\x20with\x20E_GUARD_COUNT_EXCEEDED\x20(3).'),'affected_stakeholders':['owner','service_provider'],'scenario':'Adding\x20too\x20many\x20guards\x20to\x20a\x20single\x20Reward\x20(e.g.\x20milestone\x20reward\x20with\x20>\x20200\x20recipients)','mitigation':'Split\x20into\x20multiple\x20Reward\x20objects,\x20or\x20use\x20GuardIdentifier\x20recipient\x20to\x20handle\x20multiple\x20recipients\x20with\x20a\x20single\x20guard.','evidence':'current='+b+',\x20add='+c,'related_move_error':'E_GUARD_COUNT_EXCEEDED\x20(3)','auto_fixable':![]};return null;}},R_R_1_02={'id':'R-R-1-02','category':'structural','trigger':'claim\x20would\x20push\x20recipient\x20record\x20count\x20to\x20MAX_RECORD_COUNT_REWARD\x20(5200)','check':a=>{if(!a['claim'])return null;const b=a['current_record_count_for_recipient']??0x0;if(b>=MAX_RECORD_COUNT_REWARD)return{'id':'R-R-1-02','level':'HIGH','category':'structural','title':'claim\x20blocked\x20—\x20recipient\x20record\x20count\x20at\x20limit','description':'Recipient\x20already\x20has\x20'+b+'\x20records,\x20at\x20MAX_RECORD_COUNT_REWARD\x20'+MAX_RECORD_COUNT_REWARD+'.\x20'+'Next\x20claim\x20will\x20abort\x20with\x20E_RECORD_COUNT_EXCEEDED\x20(8).\x20The\x20recipient\x20can\x20no\x20longer\x20claim\x20from\x20this\x20Reward.','affected_stakeholders':['claimer'],'scenario':'High-frequency\x20claimer\x20hits\x20the\x205200-record\x20ceiling\x20(e.g.\x20cashback\x20on\x20every\x20micro-order)','mitigation':'Owner\x20can\x20create\x20a\x20new\x20Reward\x20for\x20the\x20same\x20recipient,\x20OR\x20redesign\x20the\x20Guard\x20to\x20batch\x20claims\x20(larger\x20amount\x20per\x20claim).','evidence':'recipient_records='+b,'related_move_error':'E_RECORD_COUNT_EXCEEDED\x20(8)','auto_fixable':![]};return null;}},R_R_1_03={'id':'R-R-1-03','category':'structural','trigger':'guard_add\x20batch\x20size\x20>\x20MAX_GUARD_COUNT_REWARD\x20(200)\x20—\x20schema-level\x20overflow','check':a=>{if(!a['guard_add'])return null;if(a['guard_add']['length']>MAX_GUARD_COUNT_REWARD)return{'id':'R-R-1-03','level':'CRITICAL','category':'structural','title':'guard_add\x20batch\x20exceeds\x20absolute\x20limit','description':'Single\x20guard_add\x20call\x20tries\x20to\x20add\x20'+a['guard_add']['length']+'\x20guards\x20in\x20one\x20transaction,\x20'+('exceeds\x20MAX_GUARD_COUNT_REWARD\x20'+MAX_GUARD_COUNT_REWARD+'.\x20SDK\x20rejects\x20this\x20in\x20operate().'),'affected_stakeholders':['owner'],'scenario':'Bulk\x20guard\x20addition\x20without\x20splitting\x20transactions','mitigation':'Split\x20into\x20multiple\x20transactions,\x20each\x20≤\x20'+MAX_GUARD_COUNT_REWARD+'\x20new\x20guards.','evidence':'batch_size='+a['guard_add']['length'],'auto_fixable':!![]};return null;}},R_R_2_01={'id':'R-R-2-01','category':'semantic','trigger':'guard_add\x20with\x20GuardIdentifier\x20recipient\x20where\x20identifier\x20type\x20is\x20not\x20address','check':a=>{if(!a['guard_add'])return null;for(let b=0x0;b<a['guard_add']['length'];b++){const c=a['guard_add'][b];if('GuardIdentifier'in c['recipient']){const d=c['recipient']['GuardIdentifier'];if(a['passport_identifier_is_address']&&a['passport_identifier_is_address'][d]===![])return{'id':'R-R-2-01','level':'HIGH','category':'semantic','title':'guard_add['+b+']:\x20recipient\x20GuardIdentifier\x20'+d+'\x20is\x20not\x20address-typed','description':'RewardGuard\x20constructor\x20calls\x20is_identifier_address(guard,\x20'+d+').\x20If\x20the\x20identifier\x20type\x20is\x20not\x20address,\x20'+'Move\x20aborts\x20with\x20E_RECIPIENT_IDENTIFIER_NOT_ADDRESS\x20(4).','affected_stakeholders':['owner'],'scenario':'Misconfigured\x20Guard\x20—\x20recipient\x20identifier\x20is\x20u64/bool\x20instead\x20of\x20address','mitigation':'Use\x20a\x20Guard\x20with\x20an\x20address-typed\x20identifier\x20for\x20recipient,\x20OR\x20switch\x20to\x20Entity/Signer\x20recipient.','evidence':'guard_add['+b+'].recipient.GuardIdentifier='+d+',\x20is_address=false','related_move_error':'E_RECIPIENT_IDENTIFIER_NOT_ADDRESS\x20(4)','auto_fixable':![]};}}return null;}},R_R_2_02={'id':'R-R-2-02','category':'semantic','trigger':'guard_add\x20with\x20GuardU64Identifier\x20amount\x20where\x20identifier\x20type\x20is\x20not\x20u64','check':a=>{if(!a['guard_add'])return null;for(let b=0x0;b<a['guard_add']['length'];b++){const c=a['guard_add'][b],d=String(c['amount']['type'])['toUpperCase']();if(d==='GUARDU64IDENTIFIER'||d==='GUARD_U64_IDENTIFIER'){if(typeof c['amount']['value']!=='number')continue;const e=c['amount']['value'];if(a['passport_submission_value_types']&&a['passport_submission_value_types'][e]!=='u64')return{'id':'R-R-2-02','level':'HIGH','category':'semantic','title':'guard_add['+b+']:\x20amount\x20GuardU64Identifier\x20'+e+'\x20is\x20not\x20u64-typed','description':'RewardGuard\x20constructor\x20calls\x20get_submission_value_type(guard,\x20'+e+');\x20if\x20None\x20or\x20≠\x20TYPE_U64,\x20'+'Move\x20aborts\x20with\x20E_AMOUNT_NOT_U64\x20(5).','affected_stakeholders':['owner'],'scenario':'Misconfigured\x20Guard\x20—\x20amount\x20identifier\x20is\x20not\x20u64-typed','mitigation':'Use\x20a\x20Guard\x20with\x20a\x20u64-typed\x20identifier\x20for\x20amount,\x20OR\x20switch\x20to\x20Fixed\x20amount.','evidence':'guard_add['+b+'].amount.value='+e+',\x20value_type='+(a['passport_submission_value_types'][e]??'unknown'),'related_move_error':'E_AMOUNT_NOT_U64\x20(5)','auto_fixable':![]};}}return null;}},R_R_2_03={'id':'R-R-2-03','category':'semantic','trigger':'guard_add\x20with\x20store_from_id\x20set\x20but\x20identifier\x20is\x20not\x20number/address\x20compatible','check':a=>{if(!a['guard_add'])return null;for(let b=0x0;b<a['guard_add']['length'];b++){const c=a['guard_add'][b];if(c['store_from_id']==null)continue;if(a['guard_store_from_id_compatible']&&a['guard_store_from_id_compatible'][c['guard']]===![])return{'id':'R-R-2-03','level':'MEDIUM','category':'semantic','title':'guard_add['+b+']:\x20store_from_id\x20incompatible\x20with\x20guard','description':'RewardGuard\x20constructor\x20with\x20store_from_id=Some\x20calls\x20is_identifier_address_compatible(guard,\x20store_from_id).\x20'+'If\x20the\x20identifier\x20type\x20is\x20not\x20number\x20or\x20address,\x20Move\x20aborts\x20with\x20E_STORE_FROM_ID_NOT_COMPATIBLE\x20(12).','affected_stakeholders':['owner'],'scenario':'Misconfigured\x20Guard\x20—\x20store_from_id\x20points\x20to\x20a\x20non-address/non-number\x20identifier','mitigation':'Use\x20a\x20compatible\x20identifier,\x20OR\x20drop\x20store_from_id\x20(set\x20to\x20null)\x20if\x20cross-reference\x20is\x20not\x20needed.','evidence':'guard='+c['guard']+',\x20store_from_id='+c['store_from_id'],'related_move_error':'E_STORE_FROM_ID_NOT_COMPATIBLE\x20(12)','auto_fixable':!![]};}return null;}},R_R_2_04={'id':'R-R-2-04','category':'semantic','trigger':'guard_add\x20with\x20invalid\x20Recipient\x20×\x20Amount\x20pairing\x20(no\x20matching\x20constructor)','check':a=>{if(!a['guard_add'])return null;const b={'GuardIdentifier':'GuardIdentifier','Entity':'Entity','Signer':'Signer'};for(let c=0x0;c<a['guard_add']['length'];c++){const d=a['guard_add'][c],e=Object['keys'](d['recipient'])[0x0],f=b[e],h=String(d['amount']['type'])['toUpperCase'](),j=h==='FIXED'?'Fixed':'GuardU64Identifier',k=resolveGuardConstructor(f,j);if(!k)return{'id':'R-R-2-04','level':'HIGH','category':'semantic','title':'guard_add['+c+']:\x20invalid\x20Recipient\x20×\x20Amount\x20pairing','description':'recipient='+f+',\x20amount='+j+'\x20—\x20no\x20matching\x20Move\x20constructor.\x20'+'SDK\x20reward_guard()\x20will\x20W_ERROR\x20with\x20\x22Invalid\x20recipient\x20or\x20amount\x20type\x20combination\x22.','affected_stakeholders':['owner'],'scenario':'Schema\x20validation\x20bypassed\x20or\x20stale\x20client','mitigation':'Use\x20one\x20of\x20the\x206\x20valid\x20pairings:\x20guard_u8_u8,\x20guard_u8_u64,\x20guard_entity_u8,\x20guard_entity_u64,\x20guard_signer_u8,\x20guard_signer_u64.','evidence':'recipient='+f+',\x20amount='+j,'auto_fixable':![]};}return null;}},R_R_2_05={'id':'R-R-2-05','category':'semantic','trigger':'guard_add\x20with\x20a\x20GuardIdentifier\x20recipient\x20slot\x20—\x20the\x20payout\x20address\x20is\x20only\x20as\x20safe\x20as\x20the\x20Guard\x20predicate;\x20owner\x20security\x20due\x20diligence','check':a=>{const b=a['guard_add'];if(!b)return null;const c=[];for(const d of b){d['recipient']&&typeof d['recipient']==='object'&&'GuardIdentifier'in d['recipient']&&c['push'](d['guard']);}if(c['length']===0x0)return null;return{'id':'R-R-2-05','level':'MEDIUM','category':'semantic','title':'Claim\x20payout\x20address\x20comes\x20from\x20a\x20submission\x20slot\x20—\x20verify\x20the\x20Guard\x20predicate\x20constrains\x20it','description':'For\x20guard_add\x20entry\x20'+c['join'](',\x20')+',\x20the\x20claim\x20recipient\x20is\x20Recipient::GuardIdentifier:\x20claim()\x20reads\x20the\x20payout\x20'+'address\x20from\x20the\x20claim-time\x20passport\x20submission,\x20and\x20claim()\x20itself\x20needs\x20no\x20Permission.\x20Whether\x20that\x20address\x20is\x20legitimate\x20is\x20'+'decided\x20entirely\x20inside\x20the\x20Guard\x20predicate\x20—\x20a\x20guard\x20whose\x20predicate\x20passes\x20without\x20constraining\x20the\x20recipient\x20slot\x20lets\x20any\x20'+'passing\x20party\x20fill\x20the\x20slot\x20with\x20their\x20own\x20address\x20and\x20claim\x20the\x20pool.\x20This\x20is\x20legal\x20by\x20design\x20(the\x20slot\x20CAN\x20be\x20constrained\x20by\x20'+'the\x20predicate),\x20so\x20the\x20safety\x20duty\x20is\x20the\x20configurer\x27s,\x20not\x20the\x20runtime\x27s.','affected_stakeholders':['owner','service_provider'],'scenario':'Owner\x20mounts\x20a\x20claim\x20Guard\x20whose\x20root\x20does\x20not\x20bind\x20the\x20submitted\x20recipient\x20(e.g.,\x20no\x20Signer/entity\x20constraint)','mitigation':'1)\x20Review\x20the\x20full\x20Guard\x20definition\x20and\x20confirm\x20the\x20predicate\x20constrains\x20the\x20recipient\x20identifier\x20(e.g.,\x20compare\x20it\x20to\x20Signer\x20'+'or\x20to\x20an\x20intended\x20entity\x20address).\x202)\x20If\x20the\x20payout\x20should\x20be\x20a\x20fixed\x20party,\x20use\x20an\x20Entity\x20recipient;\x20if\x20it\x20should\x20be\x20the\x20caller,\x20'+'use\x20Signer\x20—\x20neither\x20depends\x20on\x20a\x20submitted\x20slot.\x203)\x20Regress\x20on\x20testnet:\x20a\x20claim\x20to\x20an\x20address\x20the\x20predicate\x20does\x20not\x20authorize\x20'+'must\x20be\x20rejected\x20by\x20the\x20guard.','evidence':'guard_add\x20with\x20GuardIdentifier\x20recipient:\x20['+c['join'](',\x20')+']','auto_fixable':![]};}},R_R_3_01={'id':'R-R-3-01','category':'permission','trigger':'claim\x20attempted\x20without\x20permission\x20context\x20—\x20claim\x20is\x20passport-driven','check':a=>{if(!a['claim'])return null;return{'id':'R-R-3-01','level':'MEDIUM','category':'permission','title':'claim\x20is\x20permission-free\x20—\x20anyone\x20with\x20a\x20valid\x20Passport\x20can\x20claim','description':'reward::claim()\x20does\x20NOT\x20assert\x20any\x20permission\x20index.\x20Eligibility\x20is\x20determined\x20entirely\x20by\x20the\x20'+'Guard\x20verification\x20(passport::result_for_guard).\x20If\x20the\x20Guard\x20is\x20too\x20permissive,\x20funds\x20can\x20be\x20drained\x20by\x20anyone.','affected_stakeholders':['owner','service_provider'],'scenario':'Loose\x20Guard\x20allows\x20unauthorized\x20claims\x20(e.g.\x20time-only\x20Guard\x20without\x20service\x20binding)','mitigation':'1)\x20Use\x20Guards\x20that\x20bind\x20to\x20specific\x20Service/Order\x20context.\x202)\x20Set\x20expiration_time.\x203)\x20Monitor\x20balance\x20and\x20refill\x20only\x20what\x27s\x20needed.','evidence':'claim='+a['claim'],'auto_fixable':![]};}},R_R_3_02={'id':'R-R-3-02','category':'permission','trigger':'owner_receive\x20(156)\x20—\x20broad\x20blast\x20radius,\x20owner\x20can\x20drain\x20balance','check':a=>{if(a['owner_receive']==null)return null;return{'id':'R-R-3-02','level':'HIGH','category':'permission','title':'owner_receive\x20drains\x20balance\x20to\x20Permission\x20owner','description':'reward::owner_receive\x20(156\x20permission)\x20unwraps\x20Receiving<K>\x20/\x20CoinWrapper<K>\x20and\x20forwards\x20to\x20Permission\x20owner.\x20'+'If\x20156\x20is\x20granted\x20too\x20broadly,\x20any\x20156-holder\x20can\x20sweep\x20receivables.\x20(Note:\x20owner_receive\x20does\x20NOT\x20directly\x20drain\x20balance\x20—\x20'+'only\x20Receiving<K>\x20envelopes\x20sent\x20to\x20the\x20Reward\x27s\x20id.)','affected_stakeholders':['owner','service_provider'],'scenario':'Compromised\x20156-holder\x20sweeps\x20receivables\x20before\x20owner','mitigation':'1)\x20Grant\x20156\x20only\x20to\x20the\x20Permission\x20owner\x20address.\x202)\x20Reconcile\x20Receiving<K>\x20inflows\x20vs\x20owner_receive\x20events.','evidence':'owner_receive\x20set','auto_fixable':![]};}},R_R_3_03={'id':'R-R-3-03','category':'permission','trigger':'guard_expiration_time_add\x20(155)\x20—\x20can\x20permanently\x20lock\x20guard\x20additions','check':a=>{if(a['guard_expiration_time']===undefined)return null;if(a['guard_expiration_time']!==null&&a['current_clock_ms']!==undefined){const b=a['guard_expiration_time']-a['current_clock_ms'],c=0x16d*0x18*0x3c*0x3c*0x3e8;if(b>c)return{'id':'R-R-3-03','level':'MEDIUM','category':'permission','title':'guard_expiration_time_add\x20locks\x20guard\x20additions\x20for\x20>\x201\x20year','description':'Setting\x20guard_not_added_expiration_time\x20to\x20'+a['guard_expiration_time']+'\x20'+'(>\x201\x20year\x20from\x20now)\x20effectively\x20freezes\x20the\x20guard\x20list.\x20While\x20this\x20is\x20sometimes\x20intentional\x20'+'(milestone\x20rewards),\x20it\x20cannot\x20be\x20undone\x20without\x20setting\x20a\x20new\x20time\x20(which\x20itself\x20requires\x20155\x20permission).','affected_stakeholders':['owner'],'scenario':'Operator\x20sets\x20excessively\x20long\x20lock\x20period\x20by\x20mistake','mitigation':'Confirm\x20intent.\x20If\x20wrong,\x20call\x20guard_expiration_time_add\x20again\x20with\x20a\x20shorter\x20time\x20(must\x20be\x20≥\x20current\x20clock\x20per\x20E_GUARD_LOCKED_TIME_NOT_INCREASING).','evidence':'lock_until='+a['guard_expiration_time']+',\x20clock='+a['current_clock_ms'],'auto_fixable':![]};}return null;}},R_R_4_01={'id':'R-R-4-01','category':'lifecycle','trigger':'claim\x20on\x20guard\x20with\x20expiration_time\x20<\x20now\x20(E_GUARD_EXPIRED)','check':a=>{if(!a['claim'])return null;return null;}},R_R_4_02={'id':'R-R-4-02','category':'lifecycle','trigger':'claim:\x20balance\x20<\x20amount\x20(E_INSUFFICIENT_BALANCE)','check':a=>{if(!a['claim'])return null;if(a['current_balance']!==undefined&&a['current_guard_count']!==undefined){const b=BigInt(a['current_balance']);if(b===0x0n)return{'id':'R-R-4-02','level':'HIGH','category':'lifecycle','title':'claim\x20on\x20Reward\x20with\x20zero\x20balance','description':'Reward\x20balance\x20is\x200.\x20Any\x20claim\x20will\x20abort\x20with\x20E_INSUFFICIENT_BALANCE\x20(6).\x20'+'Owner\x20must\x20coin_add\x20(153)\x20or\x20receive\x20(154)\x20to\x20replenish.','affected_stakeholders':['claimer','owner'],'scenario':'Marketing\x20campaign\x20budget\x20exhausted\x20but\x20guards\x20remain\x20active','mitigation':'1)\x20Owner:\x20coin_add\x20to\x20replenish.\x202)\x20Owner:\x20guard_remove_expired\x20+\x20guard_expiration_time_add\x20to\x20deactivate.\x203)\x20Claimer:\x20wait\x20for\x20replenishment.','evidence':'balance=0','related_move_error':'E_INSUFFICIENT_BALANCE\x20(6)','auto_fixable':![]};}return null;}},R_R_4_03={'id':'R-R-4-03','category':'lifecycle','trigger':'guard_add\x20while\x20guard_not_added_expiration_time\x20is\x20Some\x20and\x20clock\x20≤\x20expiration\x20(E_GUARD_LOCKED_TIME)','check':a=>{if(!a['guard_add']||a['guard_add']['length']===0x0)return null;if(a['current_guard_not_added_expiration_time']==null)return null;if(a['current_clock_ms']===undefined)return null;if(a['current_clock_ms']<=a['current_guard_not_added_expiration_time'])return{'id':'R-R-4-03','level':'HIGH','category':'lifecycle','title':'guard_add\x20blocked\x20by\x20time-lock\x20(guard_not_added_expiration_time)','description':'guard_not_added_expiration_time\x20is\x20Some('+a['current_guard_not_added_expiration_time']+');\x20'+('clock\x20is\x20'+a['current_clock_ms']+'.\x20Move\x20asserts\x20clock\x20>\x20expiration_time\x20')+'(E_GUARD_LOCKED_TIME\x20=\x2010).','affected_stakeholders':['owner'],'scenario':'Trying\x20to\x20add\x20guards\x20during\x20a\x20flash\x20sale\x20lock\x20period','mitigation':'1)\x20Wait\x20until\x20clock\x20>\x20expiration_time.\x202)\x20Call\x20guard_expiration_time_add\x20(155)\x20to\x20extend\x20the\x20lock\x20(cannot\x20shorten\x20below\x20current\x20clock).','evidence':'lock_until='+a['current_guard_not_added_expiration_time']+',\x20clock='+a['current_clock_ms'],'related_move_error':'E_GUARD_LOCKED_TIME\x20(10)','auto_fixable':![]};return null;}},R_R_4_04={'id':'R-R-4-04','category':'lifecycle','trigger':'guard_expiration_time_add\x20regression\x20(new\x20time\x20<\x20current\x20clock)','check':a=>{if(a['guard_expiration_time']===undefined)return null;if(a['guard_expiration_time']===null)return null;if(a['current_clock_ms']===undefined)return null;if(a['guard_expiration_time']<=a['current_clock_ms'])return{'id':'R-R-4-04','level':'HIGH','category':'lifecycle','title':'guard_expiration_time_add:\x20new\x20time\x20must\x20be\x20in\x20the\x20future','description':'New\x20guard_not_added_expiration_time\x20=\x20'+a['guard_expiration_time']+'\x20≤\x20clock\x20'+a['current_clock_ms']+'.\x20'+'Move\x20aborts\x20with\x20E_GUARD_LOCKED_TIME_INVALID\x20(11).','affected_stakeholders':['owner'],'scenario':'Operator\x20sets\x20lock\x20time\x20in\x20the\x20past\x20by\x20mistake','mitigation':'Set\x20guard_expiration_time\x20to\x20a\x20value\x20>\x20'+a['current_clock_ms']+'\x20(current\x20clock).','evidence':'new_time='+a['guard_expiration_time']+',\x20clock='+a['current_clock_ms'],'related_move_error':'E_GUARD_LOCKED_TIME_INVALID\x20(11)','auto_fixable':!![]};return null;}},R_R_5_01={'id':'R-R-5-01','category':'cross_object','trigger':'claim:\x20guard\x20not\x20found\x20in\x20self.guards\x20(E_GUARD_NOT_FOUND)','check':a=>{if(!a['claim'])return null;if(!a['target_guard_addresses'])return null;if(!a['target_guard_addresses']['includes'](a['claim']))return{'id':'R-R-5-01','level':'HIGH','category':'cross_object','title':'claim:\x20supplied\x20guard\x20not\x20in\x20Reward.guards','description':'Guard\x20'+a['claim']+'\x20is\x20not\x20in\x20the\x20Reward\x27s\x20guard\x20list.\x20Move\x20iterates\x20self.guards\x20and\x20'+'aborts\x20with\x20E_GUARD_NOT_FOUND\x20(7)\x20if\x20no\x20match.','affected_stakeholders':['claimer'],'scenario':'Claimer\x20uses\x20the\x20wrong\x20Guard\x20object\x20(typo\x20or\x20wrong\x20Service)','mitigation':'1)\x20Verify\x20the\x20Guard\x20address\x20via\x20query\x20ObjectReward.\x202)\x20Ensure\x20the\x20Guard\x20was\x20added\x20via\x20guard_add\x20(152).','evidence':'claim_guard='+a['claim']+',\x20known_guards='+a['target_guard_addresses']['join'](','),'related_move_error':'E_GUARD_NOT_FOUND\x20(7)','auto_fixable':![]};return null;}},R_R_5_02={'id':'R-R-5-02','category':'cross_object','trigger':'coin_add:\x20coin\x20type\x20T\x20mismatch\x20with\x20Reward<T>','check':a=>{if(!a['coin_add']||!a['reward_type'])return null;if(a['coin_add']['coin_type']!==a['reward_type'])return{'id':'R-R-5-02','level':'CRITICAL','category':'cross_object','title':'coin_add:\x20coin\x20type\x20T\x20mismatch','description':'Reward\x20is\x20Reward<'+a['reward_type']+'>\x20but\x20coin_add\x20passes\x20Coin<'+a['coin_add']['coin_type']+'>.\x20'+'Move\x20type-system\x20mismatch;\x20SDK\x20W_ERROR\x20in\x20operate().','affected_stakeholders':['owner'],'scenario':'Operator\x20tries\x20to\x20deposit\x20wrong\x20coin\x20type\x20(e.g.\x20USDC\x20into\x20a\x20WOW\x20Reward)','mitigation':'Use\x20Coin<'+a['reward_type']+'>\x20for\x20coin_add.','evidence':'reward_type='+a['reward_type']+',\x20coin_type='+a['coin_add']['coin_type'],'auto_fixable':![]};return null;}},R_R_5_03={'id':'R-R-5-03','category':'cross_object','trigger':'receive:\x20Payment<T>\x20type\x20mismatch\x20with\x20Reward<T>','check':a=>{if(!a['receive']||!a['reward_type'])return null;if(a['receive']['token_type']!==a['reward_type'])return{'id':'R-R-5-03','level':'CRITICAL','category':'cross_object','title':'receive:\x20Payment\x20token_type\x20mismatch','description':'Reward\x20is\x20Reward<'+a['reward_type']+'>\x20but\x20receive\x27s\x20Payment<CoinWrapper<'+a['receive']['token_type']+'>>.\x20'+'SDK\x20W_ERROR\x20in\x20operate().','affected_stakeholders':['owner'],'scenario':'Operator\x20tries\x20to\x20receive\x20wrong-token\x20Payment','mitigation':'Use\x20Payment<'+a['reward_type']+'>\x20for\x20receive.','evidence':'reward_type='+a['reward_type']+',\x20payment_token='+a['receive']['token_type'],'auto_fixable':![]};return null;}},R_R_6_01={'id':'R-R-6-01','category':'business_semantic','trigger':'intent\x20mentions\x20praise/positive-review\x20but\x20Guard\x20checks\x20non-wonder\x20progress\x20node','check':a=>{if(!a['user_intent_phrases']||a['user_intent_phrases']['length']===0x0)return null;if(!a['guard_expected_progress_state'])return null;const b=a['user_intent_phrases']['join']('\x20')['toLowerCase'](),c=['praise','wonder','thumbs_up','positive\x20review','satisfaction\x20reward','praise\x20reward'],d=c['some'](f=>b['includes'](f['toLowerCase']()));if(!d)return null;if(a['machine_has_wonder_node']===![])return null;const e=a['guard_expected_progress_state'];if(e!=='wonder')return{'id':'R-R-6-01','level':'HIGH','category':'business_semantic','title':'Guard\x20checks\x20progress==\x22'+e+'\x22\x20but\x20intent\x20indicates\x20praise\x20reward\x20(wonder\x20node)','description':'User\x20intent\x20mentions\x20praise/positive-review/wonder,\x20which\x20maps\x20to\x20the\x20\x27wonder\x27\x20progress\x20node\x20'+'(customer\x20gives\x20positive\x20review\x20AFTER\x20service\x20completion).\x20But\x20the\x20Guard\x27s\x20table\x20bakes\x20'+('expected\x20state=\x22'+e+'\x22,\x20allowing\x20reward\x20claim\x20at\x20the\x20wrong\x20lifecycle\x20stage.\x20')+'This\x20violates\x20the\x20business\x20semantics:\x20\x22praise\x20reward\x22\x20should\x20only\x20be\x20claimable\x20AFTER\x20the\x20'+'customer\x20advances\x20to\x20the\x20\x27wonder\x27\x20node,\x20not\x20before.\x20'+'Guard\x20is\x20immutable\x20—\x20fixing\x20this\x20requires\x20creating\x20a\x20new\x20Guard\x20+\x20Reward\x20pair.','affected_stakeholders':['owner','service_provider','claimer'],'scenario':'Designer\x20builds\x20Guard\x20checking\x20\x27completed\x27\x20instead\x20of\x20\x27wonder\x27\x20for\x20a\x20praise\x20reward','mitigation':'Set\x20the\x20Guard\x20table\x27s\x20expected\x20progress\x20state\x20to\x20\x27wonder\x27\x20(the\x20positive-review\x20node).\x20'+'The\x20correct\x20pattern:\x20ordered\x20→\x20in_service\x20→\x20completed\x20→\x20wonder\x20(praise)\x20triggers\x20reward\x20claim.\x20'+'Reference:\x20reward-templates.ts\x20wonder_praise\x20template.','evidence':'intent=\x22'+b+'\x22,\x20expected_state=\x22'+e+'\x22,\x20expected_wonder=true','auto_fixable':![]};return null;}},R_R_6_02={'id':'R-R-6-02','category':'business_semantic','trigger':'Guard\x20checks\x20wonder\x20node\x20but\x20intent\x20does\x20not\x20mention\x20praise','check':a=>{if(!a['user_intent_phrases']||a['user_intent_phrases']['length']===0x0)return null;if(!a['guard_expected_progress_state'])return null;if(a['guard_expected_progress_state']!=='wonder')return null;const b=a['user_intent_phrases']['join']('\x20')['toLowerCase'](),c=['praise','wonder','thumbs_up','positive\x20review','satisfaction\x20reward','praise\x20reward'],d=c['some'](e=>b['includes'](e['toLowerCase']()));if(d)return null;return{'id':'R-R-6-02','level':'MEDIUM','category':'business_semantic','title':'Guard\x20checks\x20wonder\x20node\x20but\x20intent\x20does\x20not\x20mention\x20praise','description':'Guard\x27s\x20expected\x20progress\x20state\x20is\x20\x22wonder\x22\x20(positive-review\x20node),\x20but\x20the\x20user\x20intent\x20'+'does\x20not\x20mention\x20any\x20praise/positive-review\x20keyword.\x20This\x20may\x20be\x20a\x20copy-paste\x20from\x20a\x20wonder_praise\x20'+'template\x20without\x20adjusting\x20the\x20Guard\x20for\x20the\x20actual\x20business\x20semantics.\x20If\x20this\x20is\x20a\x20'+'general\x20feedback\x20reward\x20(wonder_feedback),\x20this\x20is\x20fine.\x20Otherwise,\x20verify\x20the\x20node\x20choice.','affected_stakeholders':['owner'],'scenario':'Designer\x20copies\x20wonder_praise\x20template\x20but\x20actually\x20wants\x20a\x20completion-based\x20reward','mitigation':'Verify:\x20if\x20intent\x20is\x20praise\x20reward,\x20add\x20\x27praise/positive\x20review\x27\x20to\x20description.\x20'+'If\x20intent\x20is\x20completion-based\x20reward,\x20change\x20Guard\x20to\x20check\x20\x27completed\x27\x20node.','evidence':'expected_state=\x22wonder\x22,\x20intent=\x22'+b+'\x22\x20(no\x20praise\x20keyword)','auto_fixable':![]};}},R_R_7_01={'id':'R-R-7-01','category':'fund_recovery','trigger':'coin_add/receive\x20(deposit)\x20or\x20guard_add\x20without\x20an\x20owner\x20fund-recovery\x20escape\x20guard','check':a=>{const b=!!(a['coin_add']||a['receive']),c=a['guard_add']??[];if(!b&&c['length']===0x0)return null;const d=c['some'](e=>{const f=!!e['recipient']&&typeof e['recipient']==='object'&&'Signer'in e['recipient'],h=String(e['amount']?.['type'])==='GuardU64Identifier';return f&&h;});if(d)return null;return{'id':'R-R-7-01','level':b?'MEDIUM':'LOW','category':'fund_recovery','title':'No\x20owner\x20fund-recovery\x20escape\x20guard\x20on\x20this\x20Reward','description':'claim()\x20is\x20the\x20ONLY\x20exit\x20from\x20the\x20Reward\x27s\x20balance\x20field\x20(reward.move),\x20and\x20none\x20of\x20the\x20guards\x20being\x20'+'configured\x20is\x20an\x20owner\x20escape\x20hatch\x20—\x20any\x20unclaimed\x20remainder\x20stays\x20locked\x20forever.\x20Note:\x20owner_receive\x20'+'(op\x20156)\x20does\x20NOT\x20help\x20here:\x20it\x20only\x20extracts\x20objects\x20the\x20Reward\x20RECEIVED\x20via\x20transfer\x20'+'(Receiving<CoinWrapper<K>>\x20or\x20NFT-like\x20objects)\x20to\x20the\x20Permission\x20owner\x20and\x20never\x20touches\x20balance;\x20'+'receive\x20(op\x20154)\x20is\x20what\x20joins\x20payments\x20into\x20balance.\x20This\x20is\x20a\x20configuration\x20gap,\x20not\x20a\x20contract\x20defect.','affected_stakeholders':['owner'],'scenario':'A\x20marketing\x20Reward\x20is\x20fully\x20consumed\x20by\x20guards,\x20the\x20campaign\x20ends\x20with\x20a\x20residual\x20balance,\x20and\x20the\x20'+'merchant\x20has\x20no\x20guard\x20that\x20lets\x20them\x20reclaim\x20it.','mitigation':'Add\x20an\x20escape\x20guard\x20alongside\x20the\x20other\x20guards:\x20'+'(1)\x20Guard:\x20logic_and(logic_equal(query(1002\x20permission.owner\x20[permission_address]),\x20Signer),\x20'+'logic_greater_equal(Clock,\x20<unlock_time>))\x20—\x20verifies\x20the\x20tx\x20sender\x20is\x20the\x20live\x20Permission\x20owner,\x20with\x20'+'the\x20Clock\x20comparison\x20acting\x20as\x20the\x20lock\x20period\x20(e.g.\x2030\x20days);\x20'+'(2)\x20RewardGuard\x20entry:\x20recipient=Signer,\x20amount=GuardU64Identifier(u8\x20submission\x20mark),\x20'+'expiration_time=unlock_time\x20+\x20claim\x20window\x20(or\x20None)\x20—\x20remember\x20the\x20contract\x20asserts\x20'+'clock\x20<=\x20expiration_time,\x20i.e.\x20expiration\x20is\x20the\x20last\x20claimable\x20moment,\x20not\x20the\x20unlock\x20moment;\x20'+'(3)\x20after\x20unlock\x20the\x20owner\x20claims\x20by\x20submitting\x20the\x20full\x20remaining\x20balance\x20to\x20recover\x20100%.','evidence':'deposit='+b+',\x20guard_add='+c['length']+',\x20'+'escape=false\x20(no\x20entry\x20with\x20Signer\x20recipient\x20+\x20GuardU64Identifier\x20amount)','auto_fixable':![]};}},ALL_RULES=[R_R_1_01,R_R_1_02,R_R_1_03,R_R_2_01,R_R_2_02,R_R_2_03,R_R_2_04,R_R_2_05,R_R_3_01,R_R_3_02,R_R_3_03,R_R_4_01,R_R_4_02,R_R_4_03,R_R_4_04,R_R_5_01,R_R_5_02,R_R_5_03,R_R_6_01,R_R_6_02,R_R_7_01];export const REWARD_RISK_VERSION='1.1.0';export function getAllRewardRiskRules(){return[...ALL_RULES];}export function assessRewardRisks(a){const b=[];for(const f of ALL_RULES){const g=f['check'](a);if(g)b['push'](g);}const c=b['length']===0x0?'LOW':b['some'](h=>h['level']==='CRITICAL')?'CRITICAL':b['some'](h=>h['level']==='HIGH')?'HIGH':b['some'](h=>h['level']==='MEDIUM')?'MEDIUM':'LOW',d={};for(const h of b){d[h['category']]=(d[h['category']]??0x0)+0x1;}const e={};for(const i of b){for(const j of i['affected_stakeholders']){if(!e[j])e[j]=[];e[j]['push'](i['id']+':\x20'+i['mitigation']);}}return{'summary':'Assessed\x20'+b['length']+'\x20risk(s)\x20across\x20'+Object['keys'](d)['length']+'\x20categories','risks':b,'overall_risk':c,'risks_by_category':d,'stakeholder_advice':e,'needs_human_review':b['some'](k=>k['level']==='CRITICAL'||k['level']==='HIGH')};}
1
+ import{getJudgmentDoc,factoryRulePack}from'../config/judgment.js';import{evaluateRuleBook}from'../config/rule-engine.js';import{MAX_GUARD_COUNT_REWARD,MAX_RECORD_COUNT_REWARD}from'./onchain-constants.js';import{resolveGuardConstructor}from'./reward-ledger.js';const AUTO_FIXABLE=new Set(['R-R-1-03','R-R-2-03','R-R-4-04']),RELATED_MOVE_ERROR={'R-R-1-01':'E_GUARD_COUNT_EXCEEDED\x20(3)','R-R-1-02':'E_RECORD_COUNT_EXCEEDED\x20(8)','R-R-2-01':'E_RECIPIENT_IDENTIFIER_NOT_ADDRESS\x20(4)','R-R-2-02':'E_AMOUNT_NOT_U64\x20(5)','R-R-2-03':'E_STORE_FROM_ID_NOT_COMPATIBLE\x20(12)','R-R-4-02':'E_INSUFFICIENT_BALANCE\x20(6)','R-R-4-03':'E_GUARD_LOCKED_TIME\x20(10)','R-R-4-04':'E_GUARD_LOCKED_TIME_INVALID\x20(11)','R-R-5-01':'E_GUARD_NOT_FOUND\x20(7)'},PRAISE_KEYWORDS=['praise','wonder','thumbs_up','positive\x20review','satisfaction\x20reward','praise\x20reward'],ONE_YEAR_MS=0x16d*0x18*0x3c*0x3c*0x3e8;export function rewardRiskFacts(a){const b=a['guard_add']??[],c=a['current_guard_count']??0x0,d=b['length']>0x0?c+b['length']:undefined;let e,f,h,j,k,l,m,n,o,p,q;const r=[],s={'GuardIdentifier':'GuardIdentifier','Entity':'Entity','Signer':'Signer'};for(let C=0x0;C<b['length'];C++){const D=b[C];if(!D||typeof D!=='object')continue;const E=D['recipient'],F=!!E&&typeof E==='object'&&!Array['isArray'](E);F&&'GuardIdentifier'in E&&r['push'](D['guard']);e===undefined&&F&&'GuardIdentifier'in E&&a['passport_identifier_is_address']&&a['passport_identifier_is_address'][E['GuardIdentifier']]===![]&&(e=C,f=E['GuardIdentifier']);const G=D['amount'],H=String(G?.['type'])['toUpperCase']();h===undefined&&(H==='GUARDU64IDENTIFIER'||H==='GUARD_U64_IDENTIFIER')&&typeof G?.['value']==='number'&&a['passport_submission_value_types']&&a['passport_submission_value_types'][G['value']]!=='u64'&&(h=C,j=G['value'],k=a['passport_submission_value_types'][G['value']]??'unknown');l===undefined&&D['store_from_id']!=null&&a['guard_store_from_id_compatible']&&a['guard_store_from_id_compatible'][D['guard']]===![]&&(l=C,m=D['guard'],n=D['store_from_id']);if(o===undefined&&F&&D['amount']!=null&&typeof D['amount']==='object'){const I=Object['keys'](E)[0x0],J=s[I],K=H==='FIXED'?'Fixed':'GuardU64Identifier';!resolveGuardConstructor(J,K)&&(o=C,p=String(J),q=String(K));}}let t=![];if(a['current_balance']!==undefined&&a['current_guard_count']!==undefined)try{t=BigInt(a['current_balance'])===0x0n;}catch{t=![];}const u=a['current_guard_not_added_expiration_time'],v=a['current_clock_ms'],w=a['target_guard_addresses']!=null?a['target_guard_addresses']['join'](','):'',x=(a['user_intent_phrases']??[])['join']('\x20')['toLowerCase'](),y=PRAISE_KEYWORDS['some'](L=>x['includes'](L['toLowerCase']())),z=a['guard_expected_progress_state'],A=!!(a['coin_add']||a['receive']),B=b['some'](L=>{const M=L;if(!M||typeof M!=='object')return![];const N=M['recipient'],O=!!N&&typeof N==='object'&&'Signer'in N,P=String(M['amount']?.['type'])==='GuardU64Identifier';return O&&P;});return{'claim':a['claim'],'guard_add_count':b['length'],'guard_current':c,'guard_total':d,'guard_count_would_exceed':b['length']>0x0&&c+b['length']>MAX_GUARD_COUNT_REWARD,'guard_batch_over_limit':b['length']>MAX_GUARD_COUNT_REWARD,'max_guard_count':MAX_GUARD_COUNT_REWARD,'record_count':a['current_record_count_for_recipient']??0x0,'record_count_at_limit':(a['current_record_count_for_recipient']??0x0)>=MAX_RECORD_COUNT_REWARD,'max_record_count':MAX_RECORD_COUNT_REWARD,...e===undefined?{}:{'first_non_address_identifier_index':e,'first_non_address_identifier_id':f},...h===undefined?{}:{'first_non_u64_amount_index':h,'first_non_u64_amount_id':j,'first_non_u64_amount_value_type':k},...l===undefined?{}:{'first_incompatible_store_from_id_index':l,'first_incompatible_store_from_id_guard':m,'first_incompatible_store_from_id_value':n},...o===undefined?{}:{'first_invalid_pairing_index':o,'first_invalid_pairing_recipient':p,'first_invalid_pairing_amount':q},'guard_identifier_recipients_display':r['join'](',\x20'),'owner_receive_set':a['owner_receive']!=null,...a['guard_expiration_time']===undefined?{}:{'new_lock_time':a['guard_expiration_time']},...v===undefined?{}:{'current_clock':v},'guard_lock_exceeds_year':a['guard_expiration_time']!=null&&v!==undefined&&a['guard_expiration_time']-v>ONE_YEAR_MS,'balance_is_zero':t,...u==null?{}:{'lock_until':u},'guard_add_blocked_by_lock':b['length']>0x0&&u!=null&&v!==undefined&&v<=u,'lock_time_in_past':a['guard_expiration_time']!=null&&v!==undefined&&a['guard_expiration_time']<=v,'known_guards_display':w,'claim_guard_not_in_targets':!!a['claim']&&a['target_guard_addresses']!=null&&!a['target_guard_addresses']['includes'](a['claim']),'reward_type':a['reward_type'],'coin_type':a['coin_add']?.['coin_type'],'coin_type_mismatch':!!a['coin_add']&&!!a['reward_type']&&a['coin_add']['coin_type']!==a['reward_type'],'payment_token_type':a['receive']?.['token_type'],'payment_token_mismatch':!!a['receive']&&!!a['reward_type']&&a['receive']['token_type']!==a['reward_type'],...a['user_intent_phrases']?.['length']?{'intent_display':x}:{},'expected_progress_state':z,'praise_intent_wrong_node':(a['user_intent_phrases']?.['length']??0x0)>0x0&&!!z&&y&&a['machine_has_wonder_node']!==![]&&z!=='wonder','wonder_node_without_praise_intent':(a['user_intent_phrases']?.['length']??0x0)>0x0&&z==='wonder'&&!y,'has_deposit':A,'recovery_gap_present':(A||b['length']>0x0)&&!B,'always_true':!![]};}function rewardRuleBook(){const a=getJudgmentDoc()['rules']['domains']['reward'];if(!a)throw new Error('factory\x20rule\x20pack\x20\x27reward\x27\x20missing\x20—\x20broken\x20installation');return a['rules'];}function findingToRewardRisk(a){const b=RELATED_MOVE_ERROR[a['rule_id']];return{'id':a['rule_id'],'level':a['level'],'category':a['dimension']??'semantic','title':a['title'],'description':a['description'],'affected_stakeholders':a['stakeholders']??[],'scenario':a['scenario']??'','mitigation':a['mitigation']??'','evidence':a['evidence'],...b===undefined?{}:{'related_move_error':b},'auto_fixable':AUTO_FIXABLE['has'](a['rule_id']),...a['exposure']!=null?{'exposure':a['exposure']}:{}};}export const REWARD_RISK_VERSION='1.1.0';export function getAllRewardRiskRules(){const a=factoryRulePack('reward');if(!a)return[];return a['rules']['map'](b=>({'id':b['rule_id'],'category':b['dimension']??'semantic','trigger':b['trigger']??'','check':c=>{const d=rewardRuleBook()['find'](f=>f['rule_id']===b['rule_id']);if(!d)return null;const {findings:e}=evaluateRuleBook([d],rewardRiskFacts(c));return e['length']>0x0?findingToRewardRisk(e[0x0]):null;}}));}export function assessRewardRisks(a){const {findings:b}=evaluateRuleBook(rewardRuleBook(),rewardRiskFacts(a)),c=b['map'](findingToRewardRisk),d=c['length']===0x0?'low':c['some'](g=>g['level']==='critical')?'critical':c['some'](g=>g['level']==='high')?'high':c['some'](g=>g['level']==='medium')?'medium':'low',e={};for(const g of c){e[g['category']]=(e[g['category']]??0x0)+0x1;}const f={};for(const h of c){for(const i of h['affected_stakeholders']){if(!f[i])f[i]=[];f[i]['push'](h['id']+':\x20'+h['mitigation']);}}return{'summary':'Assessed\x20'+c['length']+'\x20risk(s)\x20across\x20'+Object['keys'](e)['length']+'\x20categories','risks':c,'overall_risk':d,'risks_by_category':e,'stakeholder_advice':f,'needs_human_review':c['some'](j=>j['level']==='critical'||j['level']==='high')};}
@@ -1 +1 @@
1
- import{describe,expect,it}from'vitest';import{readFileSync}from'node:fs';import{fileURLToPath}from'node:url';import{dirname,join}from'node:path';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'../graph/onchain/dataplane.js';import{expandTopology}from'../graph/onchain/expand.js';import{buildProposalGraph,buildViewport,runNodeAnalyzers}from'../graph/onchain/index.js';import{RISK_CASES}from'./baselines/risk-cases.js';import{RULE_NODE_ANALYZERS}from'./rule-node-analyzers.js';import{recipientAuditRisks}from'./rule-outcome.js';const REGISTRY_PACKS=new Set(['service','machine','guard','permission','allocation','treasury','arbitration','arb','reward','progress','order','contact','repository','demand','payment','proof','resource','personal','util','registrar','bridge']),CASES=RISK_CASES['filter'](a=>REGISTRY_PACKS['has'](a['pack'])),here=dirname(fileURLToPath(import.meta.url)),SNAPSHOT=JSON['parse'](readFileSync(join(here,'baselines','risk-baselines.json'),'utf-8'));function keysOf(a){return a['map'](b=>b['id']+':'+b['level']['toUpperCase']())['sort']();}async function migratedKeys(a,b){const d={[a['objectType']]:{'puzzle':b,'completeness':{},'missing_dimensions':[]}},e=await buildProposalGraph(d,{'network':ENTRYPOINT['Testnet']}),f=buildViewport(e,e['seed'],'neutral'),h=runNodeAnalyzers(f,RULE_NODE_ANALYZERS);return h['filter'](i=>i['ruleId']!=null)['map'](i=>i['ruleId']+':'+i['severity']['toUpperCase']())['sort']();}describe('rule-pack\x20node\x20analyzers\x20—\x20batch\x20A+B+C\x20parity\x20(T23/T24/T25)',()=>{it['each'](CASES['map'](a=>[a['pack'],a]))('TR-23.1/TR-24.1/TR-25.1\x20%s:\x20empty\x20round\x20reproduces\x20the\x20Task\x202\x20baseline',async(a,b)=>{const d=SNAPSHOT[a];expect(d)['toBeDefined'](),expect(await migratedKeys(b,b['empty']))['toEqual'](keysOf(d['empty']));}),it['each'](CASES['map'](a=>[a['pack'],a]))('TR-23.1/TR-24.1/TR-25.1\x20%s:\x20trigger\x20round\x20reproduces\x20the\x20Task\x202\x20baseline',async(a,b)=>{const d=SNAPSHOT[a];expect(d)['toBeDefined']();const e=await migratedKeys(b,b['trigger']);if(a==='allocation'){const f=e['filter'](h=>h['startsWith']('R-A-'));expect(f)['toEqual'](keysOf(d['trigger']));const g=e['filter'](h=>h['startsWith']('RC-FIND-'));expect(g['length'])['toBeGreaterThan'](0x0),expect(g)['toEqual'](recipientAuditRisks(b['trigger'])['map'](h=>{const i=h??{};return String(i['id'])+':'+String(i['level'])['toUpperCase']();})['sort']());return;}expect(e)['toEqual'](keysOf(d['trigger']));});}),describe('rule-pack\x20node\x20analyzers\x20—\x20on-chain\x20fixtures\x20(T23/T24/T25)',()=>{it('TR-23.2\x20SR1\x20state\x20rules\x20fire\x20on\x20a\x20fetched\x20on-chain\x20Service\x20through\x20the\x20unified\x20list',async()=>{const a='0x'+'14'+'cd'['repeat'](0x1f),b=new FakeDataPlane({'objects':new Map([[a['toLowerCase'](),{'object':a,'type':'Service','data':{'bPublished':!![],'bPaused':!![],'compensation_fund':'9','arbitrations':[]}}]]),'keyedFields':new Map(),'tables':new Map()}),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':a,'edges':{'tableEdges':['machine.node']}}),d=buildViewport(c,a['toLowerCase'](),'neutral'),e=runNodeAnalyzers(d,RULE_NODE_ANALYZERS),f=e['filter'](h=>h['id']['startsWith']('SR1:'));expect(f)['toHaveLength'](0x2),expect(f['every'](h=>h['detail']['includes']('R-S-4-05')||h['detail']['includes']('R-S-5-05')))['toBe'](!![]),expect(f['every'](h=>h['ruleId']===undefined))['toBe'](!![]),expect(f['every'](h=>h['source']===undefined))['toBe'](!![]),expect(e['filter'](h=>h['id']['startsWith']('MK1:')||h['id']['startsWith']('GD1:')||h['id']['startsWith']('PM1:')||h['id']['startsWith']('AL1:')||h['id']['startsWith']('TR1:')||h['id']['startsWith']('AR1:')||h['id']['startsWith']('AR3:')||h['id']['startsWith']('RW1:')||h['id']['startsWith']('PR1:')||h['id']['startsWith']('OR1:')||h['id']['startsWith']('CT1:')||h['id']['startsWith']('RP1:')||h['id']['startsWith']('DM1:')||h['id']['startsWith']('PY1:')||h['id']['startsWith']('PF1:')||h['id']['startsWith']('RS1:')||h['id']['startsWith']('PS1:')||h['id']['startsWith']('UT1:')||h['id']['startsWith']('RG1:')||h['id']['startsWith']('BR1:')))['toEqual']([]);}),it['each']([['Machine','15',{'pairs':[]}],['Guard','19',{'description':'chain\x20guard'}],['Permission','10',{'description':'chain\x20permission'}],['Allocation','18',{'description':'chain\x20allocation'}],['Treasury','1c',{'description':'chain\x20treasury'}],['Arb','11',{'description':'chain\x20arb'}],['Reward','12',{'description':'chain\x20reward'}],['Progress','13',{'description':'chain\x20progress'}],['Order','14',{'description':'chain\x20order'}],['Contact','1d',{'description':'chain\x20contact'}],['Repository','1e',{'description':'chain\x20repository'}],['Demand','1f',{'description':'chain\x20demand'}],['Payment','16',{'description':'chain\x20payment'}],['Resource','17',{'description':'chain\x20resource'}],['Proof','1a',{'description':'chain\x20proof'}],['EntityRegistrar','1b',{'description':'chain\x20registrar'}]])('TR-23.2\x20on-chain\x20%s:\x20packs\x20without\x20an\x20on-chain\x20projection\x20run\x20zero\x20rules\x20(honest\x20zero)',async(a,b,c)=>{const d='0x'+b+'ef'['repeat'](0x1f),e={'object':d,'type':a,'data':c},f=new FakeDataPlane({'objects':new Map([[d['toLowerCase'](),e]]),'keyedFields':new Map(),'tables':new Map()}),h=await expandTopology(f,{'network':ENTRYPOINT['Mainnet'],'seed':d,'edges':{'tableEdges':['machine.node']}});expect(h['nodes']['get'](d['toLowerCase']())?.['state'])['toBe']('fetched');const i=buildViewport(h,d['toLowerCase'](),'neutral');expect(runNodeAnalyzers(i,RULE_NODE_ANALYZERS))['toEqual']([]);});}),describe('rule-pack\x20node\x20analyzers\x20—\x20external\x20fact\x20nodes\x20(TR-25.1)',()=>{const a=CASES['find'](d=>d['pack']==='bridge'),b=CASES['find'](d=>d['pack']==='payment');it('TR-25.1\x20bridge\x20synthesizes\x20a\x20Bridge-typed\x20EXTERNAL\x20fact\x20node;\x20findings\x20stamp\x20source\x20external',async()=>{const c=await buildProposalGraph({'bridge':{'puzzle':a['trigger'],'completeness':{},'missing_dimensions':[]}},{'network':ENTRYPOINT['Testnet']}),d=c['nodes']['get']('proposal::bridge');expect(d?.['kind'])['toBe']('object'),expect(d?.['objectType'])['toBe']('Bridge'),expect(d?.['proposal']?.['provenance'])['toBe']('external');const e=buildViewport(c,'proposal::bridge','neutral'),f=runNodeAnalyzers(e,RULE_NODE_ANALYZERS)['filter'](h=>h['id']['startsWith']('BR1:'));expect(f['length'])['toBeGreaterThan'](0x0),expect(f['every'](h=>h['source']==='external'))['toBe'](!![]);}),it('TR-25.1\x20default\x20proposal\x20nodes\x20stay\x20intent\x20nodes\x20stamped\x20source\x20proposal',async()=>{const c=await buildProposalGraph({'payment':{'puzzle':b['trigger'],'completeness':{},'missing_dimensions':[]}},{'network':ENTRYPOINT['Testnet']}),d=c['nodes']['get']('proposal::payment');expect(d?.['objectType'])['toBe']('Payment'),expect(d?.['proposal']?.['provenance'])['toBeUndefined']();const e=buildViewport(c,'proposal::payment','neutral'),f=runNodeAnalyzers(e,RULE_NODE_ANALYZERS)['filter'](h=>h['id']['startsWith']('PY1:'));expect(f['length'])['toBeGreaterThan'](0x0),expect(f['every'](h=>h['source']==='proposal'))['toBe'](!![]);});});
1
+ import{describe,expect,it}from'vitest';import{readFileSync}from'node:fs';import{fileURLToPath}from'node:url';import{dirname,join}from'node:path';import{ENTRYPOINT}from'@wowok/wowok';import{FakeDataPlane}from'../graph/onchain/dataplane.js';import{expandTopology}from'../graph/onchain/expand.js';import{buildProposalGraph,buildViewport,runNodeAnalyzers}from'../graph/onchain/index.js';import{RISK_CASES}from'./baselines/risk-cases.js';import{RULE_NODE_ANALYZERS}from'./rule-node-analyzers.js';import{recipientAuditRisks}from'./rule-outcome.js';const REGISTRY_PACKS=new Set(['service','machine','guard','permission','allocation','treasury','arbitration','arb','reward','progress','order','contact','repository','demand','payment','proof','resource','personal','util','registrar','bridge']),CASES=RISK_CASES['filter'](a=>REGISTRY_PACKS['has'](a['pack'])),here=dirname(fileURLToPath(import.meta.url)),SNAPSHOT=JSON['parse'](readFileSync(join(here,'baselines','risk-baselines.json'),'utf-8'));function keysOf(a){return a['map'](b=>b['id']+':'+b['level']['toUpperCase']())['sort']();}async function migratedKeys(a,b){const d={[a['objectType']]:{'puzzle':b,'completeness':{},'missing_dimensions':[]}},e=await buildProposalGraph(d,{'network':ENTRYPOINT['Testnet']}),f=buildViewport(e,e['seed'],'neutral'),h=runNodeAnalyzers(f,RULE_NODE_ANALYZERS);return h['filter'](i=>i['ruleId']!=null)['map'](i=>i['ruleId']+':'+i['severity']['toUpperCase']())['sort']();}describe('rule-pack\x20node\x20analyzers\x20—\x20batch\x20A+B+C\x20parity\x20(T23/T24/T25)',()=>{it['each'](CASES['map'](a=>[a['pack'],a]))('TR-23.1/TR-24.1/TR-25.1\x20%s:\x20empty\x20round\x20reproduces\x20the\x20Task\x202\x20baseline',async(a,b)=>{const d=SNAPSHOT[a];expect(d)['toBeDefined'](),expect(await migratedKeys(b,b['empty']))['toEqual'](keysOf(d['empty']));}),it['each'](CASES['map'](a=>[a['pack'],a]))('TR-23.1/TR-24.1/TR-25.1\x20%s:\x20trigger\x20round\x20reproduces\x20the\x20Task\x202\x20baseline',async(a,b)=>{const d=SNAPSHOT[a];expect(d)['toBeDefined']();const e=await migratedKeys(b,b['trigger']);if(a==='allocation'){const f=e['filter'](h=>h['startsWith']('R-A-'));expect(f)['toEqual'](keysOf(d['trigger']));const g=e['filter'](h=>h['startsWith']('RC-FIND-'));expect(g['length'])['toBeGreaterThan'](0x0),expect(g)['toEqual'](recipientAuditRisks(b['trigger'])['map'](h=>{const i=h??{};return String(i['id'])+':'+String(i['level'])['toUpperCase']();})['sort']());return;}expect(e)['toEqual'](keysOf(d['trigger']));});}),describe('rule-pack\x20exposure\x20attribution\x20passthrough\x20(Phase\x202)',()=>{const a=CASES['find'](d=>d['pack']==='treasury')['run'];function b(c,d=a){const e=d(c),f=Array['isArray'](e)?e:e?.['risks']??e?.['detected_risks'];return f??[];}it('R-T-3-03:\x20delegated\x20withdraw-guard\x20management\x20carries\x20the\x20gated\x20viable\x20gain\x20path',()=>{const c=b({'current_permission_indexes_granted':[0x100]})['find'](d=>d['id']==='R-T-3-03');expect(c)['toBeDefined'](),expect(c['exposure'])['toBeDefined'](),expect(c['exposure']['lossParties'][0x0]['role'])['toBe']('merchant'),expect(c['exposure']['gainPaths'][0x0]['viability'])['toBe']('viable'),expect(c['exposure']['verdict'])['toBe']('confirmed');}),it('R-T-5-02:\x20missing\x20receive\x20permission\x20is\x20a\x20shortfall\x20defect\x20(no\x20gainer,\x20never\x20downgraded)',()=>{const c=b({'current_permission_indexes_granted':[0xfa],'shared_with_allocator':!![]})['find'](d=>d['id']==='R-T-5-02');expect(c)['toBeDefined'](),expect(c['exposure'])['toBeDefined'](),expect(c['exposure']['lossParties'][0x0]['role'])['toBe']('merchant'),expect(c['exposure']['gainPaths'])['toEqual']([]),expect(c['exposure']['verdict'])['toBe']('confirmed');}),it('notice-class\x20rules\x20stay\x20unattributed\x20(R-T-1-01\x20description\x20over\x20limit)',()=>{const c=b({'description':'x'['repeat'](0xfa1)})['find'](d=>d['id']==='R-T-1-01');expect(c)['toBeDefined'](),expect(c['exposure'])['toBeUndefined']();}),it('R-A-1-01:\x20empty\x20allocators\x20is\x20a\x20shortfall\x20defect\x20(buyer+merchant\x20loss,\x20no\x20gainer)',()=>{const c=CASES['find'](g=>g['pack']==='allocation')['run'],d=c({'allocators_config':{'allocators':[]}}),e=Array['isArray'](d)?d:d?.['risks']??d?.['detected_risks'],f=(e??[])['find'](g=>g['id']==='R-A-1-01');expect(f)['toBeDefined'](),expect(f['exposure'])['toBeDefined'](),expect(f['exposure']['lossParties']['map'](g=>g['role'])['sort']())['toEqual'](['buyer','merchant']),expect(f['exposure']['gainPaths'])['toEqual']([]),expect(f['exposure']['verdict'])['toBe']('confirmed');}),it('R-S-2-01:\x20unpinned\x20WIP\x20content\x20—\x20buyer\x20loses,\x20merchant\x20substitution\x20rides\x20the\x20viable\x20payment\x20flow',()=>{const c=CASES['find'](e=>e['pack']==='service')['run'],d=b({'sales':{'op':'add','sales':[{'name':'sku','wip':'https://example.com/a.wip','wip_hash':''}]}},c)['find'](e=>e['id']==='R-S-2-01');expect(d)['toBeDefined'](),expect(d['exposure'])['toBeDefined'](),expect(d['exposure']['lossParties'][0x0]['role'])['toBe']('buyer'),expect(d['exposure']['gainPaths'][0x0]['role'])['toBe']('merchant'),expect(d['exposure']['gainPaths'][0x0]['viability'])['toBe']('viable'),expect(d['exposure']['verdict'])['toBe']('confirmed');}),it('R-S-5-05:\x20funded\x20without\x20arbitration\x20is\x20a\x20shortfall\x20defect\x20(buyer\x20loss,\x20no\x20gainer)',()=>{const c=CASES['find'](e=>e['pack']==='service')['run'],d=b({'current_compensation_fund_balance':'100','current_arbitrations_count':0x0},c)['find'](e=>e['id']==='R-S-5-05');expect(d)['toBeDefined'](),expect(d['exposure'])['toBeDefined'](),expect(d['exposure']['lossParties'][0x0]['role'])['toBe']('buyer'),expect(d['exposure']['gainPaths'])['toEqual']([]),expect(d['exposure']['verdict'])['toBe']('confirmed');}),it('R-R-2-05:\x20unconstrained\x20GuardIdentifier\x20recipient\x20slot\x20—\x20conditional\x20pool-drain\x20path',()=>{const c=CASES['find'](e=>e['pack']==='reward')['run'],d=b({'guard_add':[{'guard':'0xg1','recipient':{'GuardIdentifier':0x7},'amount':{'type':'Fixed','value':'100'}}]},c)['find'](e=>e['id']==='R-R-2-05');expect(d)['toBeDefined'](),expect(d['exposure'])['toBeDefined'](),expect(d['exposure']['lossParties'][0x0]['role'])['toBe']('merchant'),expect(d['exposure']['gainPaths'][0x0]['role'])['toBe']('neutral'),expect(d['exposure']['gainPaths'][0x0]['viability'])['toBe']('conditional'),expect(d['exposure']['verdict'])['toBe']('confirmed');}),it('R-R-7-01:\x20no\x20owner\x20escape\x20guard\x20is\x20a\x20shortfall\x20defect\x20(merchant\x20budget\x20locked,\x20no\x20gainer)',()=>{const c=CASES['find'](e=>e['pack']==='reward')['run'],d=b({'coin_add':{'amount':'100','coin_type':'0x2::sui::SUI'}},c)['find'](e=>e['id']==='R-R-7-01');expect(d)['toBeDefined'](),expect(d['exposure'])['toBeDefined'](),expect(d['exposure']['lossParties'][0x0]['role'])['toBe']('merchant'),expect(d['exposure']['gainPaths'])['toEqual']([]),expect(d['exposure']['verdict'])['toBe']('confirmed');}),it('R-M1-02:\x20no\x20terminal\x20node\x20is\x20a\x20topology\x20freeze\x20(buyer+merchant\x20loss,\x20no\x20gainer)',()=>{const c=CASES['find'](e=>e['pack']==='machine')['run'],d=b({'pairs':[],'nodes':[]},c)['find'](e=>e['rule_id']==='R-M1-02');expect(d)['toBeDefined'](),expect(d['exposure'])['toBeDefined'](),expect(d['exposure']['lossParties']['map'](e=>e['role'])['sort']())['toEqual'](['buyer','merchant']),expect(d['exposure']['gainPaths'])['toEqual']([]),expect(d['exposure']['verdict'])['toBe']('confirmed');}),it('R-X1-07:\x20overstuffed\x20usage_guard\x20is\x20a\x20dispute-access\x20shortfall\x20(buyer\x20loss,\x20no\x20gainer)',()=>{const c=CASES['find'](e=>e['pack']==='guard')['run'],d=b({'table':[],'root':{'type':'logic_and','nodes':[{'type':'logic_and','nodes':[{'type':'identifier','value':0x0},{'type':'identifier','value':0x0}]},{'type':'logic_and','nodes':[{'type':'identifier','value':0x0},{'type':'identifier','value':0x0}]},{'type':'identifier','value':0x0}]},'scene':{'id':'arbitration_usage_guard','host_object':'Arbitration','binding_field':'usage_guard'}},c)['find'](e=>e['id']==='R-X1-07');expect(d)['toBeDefined'](),expect(d['exposure'])['toBeDefined'](),expect(d['exposure']['lossParties'][0x0]['role'])['toBe']('buyer'),expect(d['exposure']['gainPaths'])['toEqual']([]),expect(d['exposure']['verdict'])['toBe']('confirmed');}),it('R-O-3-03:\x20arb_claim_compensation\x20is\x20a\x20recourse-exhaustion\x20shortfall\x20(buyer\x20loss,\x20no\x20gainer)',()=>{const c=CASES['find'](e=>e['pack']==='order')['run'],d=b({'operation':'arb_claim_compensation'},c)['find'](e=>e['id']==='R-O-3-03');expect(d)['toBeDefined'](),expect(d['exposure'])['toBeDefined'](),expect(d['exposure']['lossParties']['map'](e=>e['role']))['toEqual'](['buyer']),expect(d['exposure']['gainPaths'])['toEqual']([]),expect(d['exposure']['verdict'])['toBe']('confirmed');}),it('R-PAYMENT-01:\x20unchecked\x20unwrap\x20is\x20an\x20unblockable\x20mismatched-release\x20path\x20(neutral\x20viable\x20gainer)',()=>{const c=CASES['find'](e=>e['pack']==='payment')['run'],d=b({'uses_unsafe_unwrap':!![]},c)['find'](e=>e['id']==='R-PAYMENT-01');expect(d)['toBeDefined'](),expect(d['exposure'])['toBeDefined'](),expect(d['exposure']['lossParties']['map'](e=>e['role'])['sort']())['toEqual'](['buyer','merchant']),expect(d['exposure']['gainPaths'][0x0]['role'])['toBe']('neutral'),expect(d['exposure']['gainPaths'][0x0]['viability'])['toBe']('viable'),expect(d['exposure']['verdict'])['toBe']('confirmed');}),it('R-AB-3-01:\x20dominant\x20vote\x20weight\x20is\x20a\x20capture-conditional\x20payout-steering\x20path',()=>{const c=CASES['find'](e=>e['pack']==='arbitration')['run'],d=b({'voting_guard':{'op':'add','guards':[{'guard':'0xg1','vote_weight':{'FixedValue':0x3c}},{'guard':'0xg2','vote_weight':{'FixedValue':0x28}}]}},c)['find'](e=>e['id']==='R-AB-3-01');expect(d)['toBeDefined'](),expect(d['exposure'])['toBeDefined'](),expect(d['exposure']['lossParties'][0x0]['role'])['toBe']('buyer'),expect(d['exposure']['gainPaths'][0x0]['role'])['toBe']('neutral'),expect(d['exposure']['gainPaths'][0x0]['viability'])['toBe']('conditional'),expect(d['exposure']['verdict'])['toBe']('confirmed');});}),describe('rule-pack\x20node\x20analyzers\x20—\x20on-chain\x20fixtures\x20(T23/T24/T25)',()=>{it('TR-23.2\x20SR1\x20state\x20rules\x20fire\x20on\x20a\x20fetched\x20on-chain\x20Service\x20through\x20the\x20unified\x20list',async()=>{const a='0x'+'14'+'cd'['repeat'](0x1f),b=new FakeDataPlane({'objects':new Map([[a['toLowerCase'](),{'object':a,'type':'Service','data':{'bPublished':!![],'bPaused':!![],'compensation_fund':'9','arbitrations':[]}}]]),'keyedFields':new Map(),'tables':new Map()}),c=await expandTopology(b,{'network':ENTRYPOINT['Mainnet'],'seed':a,'edges':{'tableEdges':['machine.node']}}),d=buildViewport(c,a['toLowerCase'](),'neutral'),e=runNodeAnalyzers(d,RULE_NODE_ANALYZERS),f=e['filter'](h=>h['id']['startsWith']('SR1:'));expect(f)['toHaveLength'](0x2),expect(f['every'](h=>h['detail']['includes']('R-S-4-05')||h['detail']['includes']('R-S-5-05')))['toBe'](!![]),expect(f['every'](h=>h['ruleId']===undefined))['toBe'](!![]),expect(f['every'](h=>h['source']===undefined))['toBe'](!![]),expect(e['filter'](h=>h['id']['startsWith']('MK1:')||h['id']['startsWith']('GD1:')||h['id']['startsWith']('PM1:')||h['id']['startsWith']('AL1:')||h['id']['startsWith']('TR1:')||h['id']['startsWith']('AR1:')||h['id']['startsWith']('AR3:')||h['id']['startsWith']('RW1:')||h['id']['startsWith']('PR1:')||h['id']['startsWith']('OR1:')||h['id']['startsWith']('CT1:')||h['id']['startsWith']('RP1:')||h['id']['startsWith']('DM1:')||h['id']['startsWith']('PY1:')||h['id']['startsWith']('PF1:')||h['id']['startsWith']('RS1:')||h['id']['startsWith']('PS1:')||h['id']['startsWith']('UT1:')||h['id']['startsWith']('RG1:')||h['id']['startsWith']('BR1:')))['toEqual']([]);}),it['each']([['Machine','15',{'pairs':[]}],['Guard','19',{'description':'chain\x20guard'}],['Permission','10',{'description':'chain\x20permission'}],['Allocation','18',{'description':'chain\x20allocation'}],['Treasury','1c',{'description':'chain\x20treasury'}],['Arb','11',{'description':'chain\x20arb'}],['Reward','12',{'description':'chain\x20reward'}],['Progress','13',{'description':'chain\x20progress'}],['Order','14',{'description':'chain\x20order'}],['Contact','1d',{'description':'chain\x20contact'}],['Repository','1e',{'description':'chain\x20repository'}],['Demand','1f',{'description':'chain\x20demand'}],['Payment','16',{'description':'chain\x20payment'}],['Resource','17',{'description':'chain\x20resource'}],['Proof','1a',{'description':'chain\x20proof'}],['EntityRegistrar','1b',{'description':'chain\x20registrar'}]])('TR-23.2\x20on-chain\x20%s:\x20packs\x20without\x20an\x20on-chain\x20projection\x20run\x20zero\x20rules\x20(honest\x20zero)',async(a,b,c)=>{const d='0x'+b+'ef'['repeat'](0x1f),e={'object':d,'type':a,'data':c},f=new FakeDataPlane({'objects':new Map([[d['toLowerCase'](),e]]),'keyedFields':new Map(),'tables':new Map()}),h=await expandTopology(f,{'network':ENTRYPOINT['Mainnet'],'seed':d,'edges':{'tableEdges':['machine.node']}});expect(h['nodes']['get'](d['toLowerCase']())?.['state'])['toBe']('fetched');const i=buildViewport(h,d['toLowerCase'](),'neutral');expect(runNodeAnalyzers(i,RULE_NODE_ANALYZERS))['toEqual']([]);});}),describe('rule-pack\x20node\x20analyzers\x20—\x20external\x20fact\x20nodes\x20(TR-25.1)',()=>{const a=CASES['find'](d=>d['pack']==='bridge'),b=CASES['find'](d=>d['pack']==='payment');it('TR-25.1\x20bridge\x20synthesizes\x20a\x20Bridge-typed\x20EXTERNAL\x20fact\x20node;\x20findings\x20stamp\x20source\x20external',async()=>{const c=await buildProposalGraph({'bridge':{'puzzle':a['trigger'],'completeness':{},'missing_dimensions':[]}},{'network':ENTRYPOINT['Testnet']}),d=c['nodes']['get']('proposal::bridge');expect(d?.['kind'])['toBe']('object'),expect(d?.['objectType'])['toBe']('Bridge'),expect(d?.['proposal']?.['provenance'])['toBe']('external');const e=buildViewport(c,'proposal::bridge','neutral'),f=runNodeAnalyzers(e,RULE_NODE_ANALYZERS)['filter'](h=>h['id']['startsWith']('BR1:'));expect(f['length'])['toBeGreaterThan'](0x0),expect(f['every'](h=>h['source']==='external'))['toBe'](!![]);}),it('TR-25.1\x20default\x20proposal\x20nodes\x20stay\x20intent\x20nodes\x20stamped\x20source\x20proposal',async()=>{const c=await buildProposalGraph({'payment':{'puzzle':b['trigger'],'completeness':{},'missing_dimensions':[]}},{'network':ENTRYPOINT['Testnet']}),d=c['nodes']['get']('proposal::payment');expect(d?.['objectType'])['toBe']('Payment'),expect(d?.['proposal']?.['provenance'])['toBeUndefined']();const e=buildViewport(c,'proposal::payment','neutral'),f=runNodeAnalyzers(e,RULE_NODE_ANALYZERS)['filter'](h=>h['id']['startsWith']('PY1:'));expect(f['length'])['toBeGreaterThan'](0x0),expect(f['every'](h=>h['source']==='proposal'))['toBe'](!![]);});});
@@ -1 +1 @@
1
- import{analyzeRecipientConstraints}from'./recipient-constraint.js';function severityOf(a){const b=String(a??'')['toUpperCase']();if(b==='CRITICAL')return'critical';if(b==='HIGH')return'high';if(b==='MEDIUM')return'medium';if(b==='LOW')return'low';return'info';}const STAKEHOLDER_ROLE={'owner':'merchant','provider':'merchant','admin':'merchant','customer':'buyer','user':'buyer','buyer':'buyer','arbitrator':'arbitrator','entity':'system','system':'system'};function stakeholderRoles(a){if(!Array['isArray'](a))return['neutral','merchant'];const b=[...new Set(a['map'](c=>STAKEHOLDER_ROLE[String(c?.['toLowerCase']?.()??c)])['filter'](Boolean))];return b['length']>0x0?b:['neutral','merchant'];}export function riskToOutcome(a,b,c=![]){const d=a??{},e=d['id']??d['risk_rule_id']??d['rule_id'],f=d['title']??d['message']??d['description']??d['trigger']??d['name'],g=d['mitigation']??d['fix_suggestion']??d['suggestion']??d['recommendation'],h=d['evidence']!=null?String(d['evidence']):'',i=[d['detail'],d['description'],d['explanation']]['map'](l=>typeof l==='string'?l:'')['find'](l=>l['length']>0x0)??'',j=[i,h?'Evidence:\x20'+h:'']['filter'](l=>l['length']>0x0)['join']('\x20—\x20'),k=e!=null?String(e):'?';return{'severity':severityOf(d['level']??d['severity']),'title':(typeof f==='string'&&f?f:'Risk\x20rule\x20'+k)+'\x20('+k+')','detail':j||'Risk\x20rule\x20'+k+'\x20triggered.','suggestion':typeof g==='string'?g:'','roles':stakeholderRoles(d['affected_stakeholders']),'confidence':b,'ruleId':k,...h?{'evidence':h}:{},...c?{'nativeRisk':a}:{}};}export function safeRunPack(a,b){try{const c=a(b??{});if(Array['isArray'](c))return c;if(c&&typeof c==='object'){const d=c['risks'];if(Array['isArray'](d))return d;const e=c['detected_risks'];if(Array['isArray'](e))return e;}return[];}catch{return[];}}export function puzzlePayloadOf(a){if(!a['proposal'])return undefined;const b=a['raw'],c=b?.['data']??b;return c!=null&&typeof c==='object'?c:undefined;}export function recipientAuditRisks(a){try{const b=a??{},c=b['allocators_config'],d=c?.['allocators'];if(!Array['isArray'](d)||d['length']===0x0)return[];const e=analyzeRecipientConstraints({'trigger_source':b['trigger_source']??'service_order_allocators',...typeof b['host_service']==='string'?{'host_service':b['host_service']}:{},...typeof b['allocation']==='string'?{'allocation':b['allocation']}:{},'allocators':d['map'](f=>({'guard':f['guard'],'sharing':f['sharing']??[]})),'guards':b['guards']??{}});return e['findings']['map'](g=>({'id':g['code'],'level':g['resolution_required']&&g['severity']==='MEDIUM'?'HIGH':g['severity'],'title':g['title'],'description':g['explanation'],'mitigation':g['mitigation'],'evidence':g['evidence_paths']['join'](',')}));}catch{return[];}}
1
+ import{analyzeRecipientConstraints}from'./recipient-constraint.js';function severityOf(a){const b=String(a??'')['toUpperCase']();if(b==='CRITICAL')return'critical';if(b==='HIGH')return'high';if(b==='MEDIUM')return'medium';if(b==='LOW')return'low';return'info';}const STAKEHOLDER_ROLE={'owner':'merchant','provider':'merchant','admin':'merchant','customer':'buyer','user':'buyer','buyer':'buyer','arbitrator':'arbitrator','entity':'system','system':'system'};function stakeholderRoles(a){if(!Array['isArray'](a))return['neutral','merchant'];const b=[...new Set(a['map'](c=>STAKEHOLDER_ROLE[String(c?.['toLowerCase']?.()??c)])['filter'](Boolean))];return b['length']>0x0?b:['neutral','merchant'];}export function riskToOutcome(a,b,c=![]){const d=a??{},e=d['id']??d['risk_rule_id']??d['rule_id'],f=d['title']??d['message']??d['description']??d['trigger']??d['name'],g=d['mitigation']??d['fix_suggestion']??d['suggestion']??d['recommendation'],h=d['evidence']!=null?String(d['evidence']):'',i=[d['detail'],d['description'],d['explanation']]['map'](l=>typeof l==='string'?l:'')['find'](l=>l['length']>0x0)??'',j=[i,h?'Evidence:\x20'+h:'']['filter'](l=>l['length']>0x0)['join']('\x20—\x20'),k=e!=null?String(e):'?';return{'severity':severityOf(d['level']??d['severity']),'title':(typeof f==='string'&&f?f:'Risk\x20rule\x20'+k)+'\x20('+k+')','detail':j||'Risk\x20rule\x20'+k+'\x20triggered.','suggestion':typeof g==='string'?g:'','roles':stakeholderRoles(d['affected_stakeholders']),'confidence':b,'ruleId':k,...h?{'evidence':h}:{},...d['exposure']!=null?{'exposure':d['exposure']}:{},...c?{'nativeRisk':a}:{}};}export function safeRunPack(a,b){try{const c=a(b??{});if(Array['isArray'](c))return c;if(c&&typeof c==='object'){const d=c['risks'];if(Array['isArray'](d))return d;const e=c['detected_risks'];if(Array['isArray'](e))return e;}return[];}catch{return[];}}export function puzzlePayloadOf(a){if(!a['proposal'])return undefined;const b=a['raw'],c=b?.['data']??b;return c!=null&&typeof c==='object'?c:undefined;}export function recipientAuditRisks(a){try{const b=a??{},c=b['allocators_config'],d=c?.['allocators'];if(!Array['isArray'](d)||d['length']===0x0)return[];const e=analyzeRecipientConstraints({'trigger_source':b['trigger_source']??'service_order_allocators',...typeof b['host_service']==='string'?{'host_service':b['host_service']}:{},...typeof b['allocation']==='string'?{'allocation':b['allocation']}:{},'allocators':d['map'](f=>({'guard':f['guard'],'sharing':f['sharing']??[]})),'guards':b['guards']??{}});return e['findings']['map'](g=>({'id':g['code'],'level':g['resolution_required']&&g['severity']==='medium'?'high':g['severity'],'title':g['title'],'description':g['explanation'],'mitigation':g['mitigation'],'evidence':g['evidence_paths']['join'](',')}));}catch{return[];}}
@@ -1,4 +1,4 @@
1
- export type IndustryModeName = "freelance" | "rental" | "education" | "travel" | "subscription" | "general";
1
+ export type IndustryModeName = "freelance" | "rental" | "education" | "travel" | "subscription" | "retail" | "general";
2
2
  export interface ScenarioTraits {
3
3
  has_logistics: boolean;
4
4
  communication_heavy: boolean;
@@ -50,4 +50,4 @@ export declare function getScenarioMode(name: IndustryModeName): ScenarioMode |
50
50
  export declare function listScenarioModes(): ScenarioMode[];
51
51
  export declare function getShippedModes(): ScenarioMode[];
52
52
  export declare function getModeCompositions(name: IndustryModeName): ModeComposition[];
53
- export declare const SCENARIO_MODES_VERSION = 3;
53
+ export declare const SCENARIO_MODES_VERSION = 4;