@wowok/agent-mcp 2.7.8 → 3.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/config/runtime.d.ts +1 -1
- package/dist/config/runtime.js +1 -1
- package/dist/examples/rental-ziroom-machine-create.json +1 -2
- package/dist/examples/rental-ziroom-permission-create.json +1 -2
- package/dist/examples/rental-ziroom-service-create.json +1 -2
- package/dist/experience/experience-reuse.js +1 -1
- package/dist/experience/index.d.ts +2 -1
- package/dist/experience/index.js +1 -1
- package/dist/experience/persistence-config.d.ts +6 -0
- package/dist/experience/persistence-config.js +1 -0
- package/dist/experience/persistence.d.ts +21 -0
- package/dist/experience/persistence.js +1 -0
- package/dist/experience/realtime-feedback.js +1 -1
- package/dist/experience/user-profile.js +1 -1
- package/dist/extensions/business-modules.d.ts +1 -1
- package/dist/extensions/capability-manifest.d.ts +2 -83
- package/dist/extensions/capability-manifest.js +1 -1
- package/dist/extensions/constraint-registry.d.ts +6 -4
- package/dist/extensions/constraint-registry.js +1 -1
- package/dist/extensions/index.d.ts +4 -5
- package/dist/extensions/index.js +1 -1
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/extensions/metric-registry.d.ts +6 -4
- package/dist/extensions/metric-registry.js +1 -1
- package/dist/extensions/mode-evaluator.d.ts +2 -3
- package/dist/extensions/mode-evaluator.js +1 -1
- package/dist/extensions/registry.d.ts +3 -25
- package/dist/extensions/registry.js +1 -1
- package/dist/extensions/types.d.ts +1 -69
- package/dist/goal/GoalClassifier.d.ts +17 -0
- package/dist/goal/GoalClassifier.js +1 -0
- package/dist/goal/GoalEngine.d.ts +155 -0
- package/dist/goal/GoalEngine.js +1 -0
- package/dist/goal/GoalStore.d.ts +27 -0
- package/dist/goal/GoalStore.js +1 -0
- package/dist/goal/plan-approval.d.ts +5 -0
- package/dist/goal/plan-approval.js +1 -0
- package/dist/goal/types.d.ts +80 -0
- package/dist/goal/types.js +1 -0
- package/dist/harness/index.d.ts +2 -7
- package/dist/harness/index.js +1 -1
- package/dist/harness/plan.d.ts +1 -1
- package/dist/harness/types.d.ts +0 -35
- package/dist/index.js +1 -1
- package/dist/knowledge/account-marks.d.ts +36 -0
- package/dist/knowledge/account-marks.js +1 -0
- package/dist/knowledge/audit-rules.d.ts +3 -1
- package/dist/knowledge/audit-rules.js +1 -1
- package/dist/knowledge/examples-scanner-cli.js +1 -1
- package/dist/knowledge/examples-scanner.js +1 -1
- package/dist/knowledge/fund-layer.d.ts +13 -9
- package/dist/knowledge/fund-layer.js +1 -1
- package/dist/knowledge/goal-completion.d.ts +19 -0
- package/dist/knowledge/goal-completion.js +1 -0
- package/dist/knowledge/guard-bindings.d.ts +21 -0
- package/dist/knowledge/guard-bindings.js +1 -0
- package/dist/knowledge/guard-translation.js +1 -1
- package/dist/knowledge/index.d.ts +6 -3
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/mcp-schema-audit-cli.js +1 -1
- package/dist/knowledge/mcp-schema-audit.js +1 -1
- package/dist/knowledge/operation-dictionary.js +1 -1
- package/dist/knowledge/passport-confirm.js +1 -1
- package/dist/knowledge/passport-puzzle.js +1 -1
- package/dist/knowledge/passport-translation.js +1 -1
- package/dist/knowledge/proof-risk.js +1 -1
- package/dist/knowledge/reward-risk.d.ts +1 -1
- package/dist/knowledge/reward-risk.js +1 -1
- package/dist/knowledge/safety-rules.d.ts +2 -1
- package/dist/knowledge/safety-rules.js +1 -1
- package/dist/knowledge/scenario-topology.d.ts +43 -0
- package/dist/knowledge/scenario-topology.js +1 -0
- package/dist/knowledge/service-translation.js +1 -1
- package/dist/knowledge/supply-chain.js +1 -1
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/tools-reference.js +1 -1
- package/dist/knowledge/workflow-guidance.d.ts +36 -0
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/knowledge/workspace-lists.d.ts +57 -0
- package/dist/knowledge/workspace-lists.js +1 -0
- package/dist/loop-engineering/context-collect.d.ts +1 -1
- package/dist/monitor/EventRouter.d.ts +10 -0
- package/dist/monitor/EventRouter.js +1 -0
- package/dist/monitor/EventStore.d.ts +32 -12
- package/dist/monitor/EventStore.js +1 -1
- package/dist/monitor/MonitorLoop.d.ts +81 -0
- package/dist/monitor/MonitorLoop.js +1 -0
- package/dist/monitor/ProblemBridge.d.ts +32 -0
- package/dist/monitor/ProblemBridge.js +1 -0
- package/dist/monitor/ScopeResolver.d.ts +59 -0
- package/dist/monitor/ScopeResolver.js +1 -0
- package/dist/monitor/SubscriptionStore.d.ts +13 -0
- package/dist/monitor/SubscriptionStore.js +1 -0
- package/dist/monitor/SuggestionBridge.d.ts +38 -0
- package/dist/monitor/SuggestionBridge.js +1 -0
- package/dist/monitor/normalize.d.ts +8 -0
- package/dist/monitor/normalize.js +1 -0
- package/dist/monitor/types.d.ts +89 -0
- package/dist/monitor/types.js +1 -0
- package/dist/participation/arbitrator-interest.d.ts +20 -0
- package/dist/participation/arbitrator-interest.js +1 -0
- package/dist/participation/demander-interest.d.ts +23 -0
- package/dist/participation/demander-interest.js +1 -0
- package/dist/persona/address-format.d.ts +1 -1
- package/dist/persona/address-format.js +1 -1
- package/dist/persona/distill-goal.d.ts +20 -0
- package/dist/persona/distill-goal.js +1 -0
- package/dist/persona/index.d.ts +2 -0
- package/dist/persona/index.js +1 -1
- package/dist/persona/model.js +1 -1
- package/dist/playbooks/service-build/business-puzzle.js +1 -0
- package/dist/{project → playbooks/service-build}/context-assembly.d.ts +9 -4
- package/dist/playbooks/service-build/context-assembly.js +1 -0
- package/dist/{project → playbooks/service-build}/game-theory.d.ts +1 -1
- package/dist/playbooks/service-build/index.d.ts +14 -0
- package/dist/playbooks/service-build/index.js +1 -0
- package/dist/{project → playbooks/service-build}/intent-analyzer.d.ts +1 -1
- package/dist/playbooks/service-build/intent-analyzer.js +1 -0
- package/dist/playbooks/service-build/machine-nodes.js +1 -0
- package/dist/{project → playbooks/service-build}/machine-panorama.d.ts +5 -3
- package/dist/playbooks/service-build/machine-panorama.js +1 -0
- package/dist/{project → playbooks/service-build}/merchant-guide.d.ts +21 -1
- package/dist/playbooks/service-build/merchant-guide.js +1 -0
- package/dist/{project → playbooks/service-build}/mode-actions.d.ts +32 -8
- package/dist/playbooks/service-build/mode-actions.js +1 -0
- package/dist/playbooks/service-build/namespace.d.ts +2 -0
- package/dist/playbooks/service-build/namespace.js +1 -0
- package/dist/{project → playbooks/service-build}/object-panorama.d.ts +2 -3
- package/dist/playbooks/service-build/object-panorama.js +1 -0
- package/dist/{project → playbooks/service-build}/participation-radar.d.ts +4 -5
- package/dist/playbooks/service-build/participation-radar.js +1 -0
- package/dist/{project → playbooks/service-build}/pipeline-actions.d.ts +9 -9
- package/dist/playbooks/service-build/pipeline-actions.js +1 -0
- package/dist/playbooks/service-build/process.d.ts +6 -0
- package/dist/playbooks/service-build/process.js +1 -0
- package/dist/playbooks/service-build/relationship-profile.d.ts +2 -0
- package/dist/playbooks/service-build/relationship-profile.js +1 -0
- package/dist/playbooks/service-build/risk-aggregator.js +1 -0
- package/dist/{project → playbooks/service-build}/semantic-graph.d.ts +7 -3
- package/dist/playbooks/service-build/semantic-graph.js +1 -0
- package/dist/{project → playbooks/service-build}/service-panorama.d.ts +3 -19
- package/dist/playbooks/service-build/service-panorama.js +1 -0
- package/dist/relationship/derivation.d.ts +88 -0
- package/dist/relationship/derivation.js +1 -0
- package/dist/relationship/incentive.d.ts +38 -0
- package/dist/relationship/incentive.js +1 -0
- package/dist/relationship/index.d.ts +4 -0
- package/dist/relationship/index.js +1 -0
- package/dist/relationship/registry.d.ts +13 -0
- package/dist/relationship/registry.js +1 -0
- package/dist/relationship/types.d.ts +45 -0
- package/dist/relationship/types.js +1 -0
- package/dist/review/arb.d.ts +6 -0
- package/dist/review/arb.js +1 -0
- package/dist/review/demand.d.ts +3 -0
- package/dist/review/demand.js +1 -0
- package/dist/review/index.d.ts +3 -0
- package/dist/review/index.js +1 -0
- package/dist/review/machine.d.ts +3 -0
- package/dist/review/machine.js +1 -0
- package/dist/review/order.d.ts +9 -0
- package/dist/review/order.js +1 -0
- package/dist/review/progress.d.ts +3 -0
- package/dist/review/progress.js +1 -0
- package/dist/review/repository.d.ts +3 -0
- package/dist/review/repository.js +1 -0
- package/dist/review/service.d.ts +5 -0
- package/dist/review/service.js +1 -0
- package/dist/review/types.d.ts +156 -0
- package/dist/review/types.js +1 -0
- package/dist/rules.d.ts +2 -2
- package/dist/rules.js +1 -1
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/safety/index.d.ts +1 -1
- package/dist/safety/index.js +1 -1
- package/dist/safety/preview.d.ts +1 -0
- package/dist/safety/preview.js +1 -1
- package/dist/schema/call/allocation.d.ts +1 -1
- package/dist/schema/call/arbitration.d.ts +1 -1
- package/dist/schema/call/base.d.ts +1 -1
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/bridge.d.ts +29 -7
- package/dist/schema/call/bridge.js +1 -1
- package/dist/schema/call/contact.d.ts +1 -1
- package/dist/schema/call/contact.js +1 -1
- package/dist/schema/call/demand.d.ts +1 -1
- package/dist/schema/call/demand.js +1 -1
- package/dist/schema/call/guard.d.ts +3 -3
- package/dist/schema/call/handler.d.ts +0 -3
- package/dist/schema/call/handler.js +1 -1
- package/dist/schema/call/machine.d.ts +2 -2
- package/dist/schema/call/order.d.ts +1 -1
- package/dist/schema/call/payment.d.ts +1 -1
- package/dist/schema/call/permission.d.ts +1 -1
- package/dist/schema/call/personal.d.ts +1 -1
- package/dist/schema/call/progress.d.ts +1 -1
- package/dist/schema/call/proof.d.ts +2 -2
- package/dist/schema/call/repository.d.ts +1 -1
- package/dist/schema/call/repository.js +1 -1
- package/dist/schema/call/reward.d.ts +1 -1
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +1 -1
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/call/treasury.d.ts +1 -1
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/goal/index.d.ts +343 -0
- package/dist/schema/goal/index.js +1 -0
- package/dist/schema/goal/planning.d.ts +465 -0
- package/dist/schema/goal/planning.js +1 -0
- package/dist/schema/index.d.ts +1 -2
- package/dist/schema/index.js +1 -1
- package/dist/schema/industry-pack/index.d.ts +323 -1
- package/dist/schema/industry-pack/index.js +1 -1
- package/dist/schema/industry-pack/modes.d.ts +326 -0
- package/dist/schema/industry-pack/modes.js +1 -0
- package/dist/schema/intent-radar/index.d.ts +19 -19
- package/dist/schema/local/index.d.ts +11 -0
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/operations.d.ts +258 -19
- package/dist/schema/operations.js +1 -1
- package/dist/schema/permission/index.d.ts +1 -0
- package/dist/schema/permission/index.js +1 -1
- package/dist/schema/persona/index.d.ts +40 -0
- package/dist/schema/persona/index.js +1 -1
- package/dist/schema/query/bi.d.ts +912 -0
- package/dist/schema/query/bi.js +1 -0
- package/dist/schema/query/index.d.ts +663 -2
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema/utils/skills-recommendation.d.ts +0 -1
- package/dist/schema/utils/skills-recommendation.js +1 -1
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +32 -3
- package/dist/schemas/account_operation.schema.json +8 -4
- package/dist/schemas/bridge_operation.output.json +26 -3
- package/dist/schemas/bridge_operation.schema.json +85 -13
- package/dist/schemas/config_operation.output.json +1 -1
- package/dist/schemas/config_operation.schema.json +1 -1
- package/dist/schemas/goal_operation.schema.json +1092 -0
- package/dist/schemas/guard2file.schema.json +3 -3
- package/dist/schemas/index.json +12 -13
- package/dist/schemas/industry_pack_operation.output.json +1073 -0
- package/dist/schemas/industry_pack_operation.schema.json +236 -2
- package/dist/schemas/local_info_operation.output.json +2 -2
- package/dist/schemas/local_mark_operation.output.json +2 -2
- package/dist/schemas/machineNode2file.schema.json +3 -3
- package/dist/schemas/messenger_operation.output.json +2 -2
- package/dist/schemas/monitor_events.output.json +78 -3
- package/dist/schemas/monitor_events.schema.json +24 -1
- package/dist/schemas/monitor_subscription.output.json +1462 -0
- package/dist/schemas/monitor_subscription.schema.json +327 -0
- package/dist/schemas/onchain_events.output.json +5 -5
- package/dist/schemas/onchain_operations.output.json +2 -2
- package/dist/schemas/onchain_operations.schema.json +100 -100
- package/dist/schemas/onchain_operations_allocation.schema.json +7 -7
- package/dist/schemas/onchain_operations_arbitration.schema.json +6 -6
- package/dist/schemas/onchain_operations_contact.schema.json +6 -6
- package/dist/schemas/onchain_operations_demand.schema.json +6 -6
- package/dist/schemas/onchain_operations_gen_passport.schema.json +3 -3
- package/dist/schemas/onchain_operations_gen_proof.schema.json +3 -3
- package/dist/schemas/onchain_operations_guard.schema.json +3 -3
- package/dist/schemas/onchain_operations_machine.schema.json +5 -5
- package/dist/schemas/onchain_operations_order.schema.json +5 -5
- package/dist/schemas/onchain_operations_payment.schema.json +4 -4
- package/dist/schemas/onchain_operations_permission.schema.json +5 -5
- package/dist/schemas/onchain_operations_personal.schema.json +3 -3
- package/dist/schemas/onchain_operations_progress.schema.json +5 -5
- package/dist/schemas/onchain_operations_proof.schema.json +3 -3
- package/dist/schemas/onchain_operations_repository.schema.json +7 -7
- package/dist/schemas/onchain_operations_reward.schema.json +9 -9
- package/dist/schemas/onchain_operations_service.schema.json +11 -11
- package/dist/schemas/onchain_operations_treasury.schema.json +9 -9
- package/dist/schemas/onchain_table_data.output.json +399 -2
- package/dist/schemas/onchain_table_data.schema.json +22 -22
- package/dist/schemas/permission_operation.schema.json +6 -2
- package/dist/schemas/persona_operation.output.json +145 -0
- package/dist/schemas/persona_operation.schema.json +28 -2
- package/dist/schemas/query_toolkit.output.json +1514 -22
- package/dist/schemas/query_toolkit.schema.json +465 -11
- package/dist/schemas/workflow_operation.schema.json +4 -4
- package/dist/task/ProcessStore.d.ts +98 -0
- package/dist/task/ProcessStore.js +1 -0
- package/dist/task/playbook.d.ts +11 -0
- package/dist/task/playbook.js +1 -0
- package/dist/task/stage-gate.d.ts +22 -0
- package/dist/task/stage-gate.js +1 -0
- package/dist/{project → task}/substep-trace.d.ts +6 -45
- package/dist/task/types.d.ts +144 -0
- package/dist/task/types.js +1 -0
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/evaluation.js +1 -1
- package/dist/tools/handlers/goal.d.ts +4 -0
- package/dist/tools/handlers/goal.js +1 -0
- package/dist/tools/handlers/industry-pack.js +1 -1
- package/dist/tools/handlers/local.d.ts +4 -3
- package/dist/tools/handlers/local.js +1 -1
- package/dist/tools/handlers/monitor.d.ts +24 -0
- package/dist/tools/handlers/monitor.js +1 -1
- package/dist/tools/handlers/network.d.ts +1 -0
- package/dist/tools/handlers/network.js +1 -0
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/permission.js +1 -1
- package/dist/tools/handlers/persona.js +1 -1
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/watch.js +1 -1
- package/dist/tools/handlers/workflow.js +1 -1
- package/dist/tools/index.d.ts +2 -0
- package/dist/tools/index.js +1 -1
- package/dist/tools/rules-hook.d.ts +1 -0
- package/dist/tools/rules-hook.js +1 -1
- package/dist/tools/shared.js +1 -1
- package/dist/tools/wrap.js +1 -1
- package/package.json +5 -4
- package/dist/harness/checkpoint.d.ts +0 -8
- package/dist/harness/checkpoint.js +0 -1
- package/dist/knowledge/deployment-scanner.d.ts +0 -66
- package/dist/knowledge/deployment-scanner.js +0 -1
- package/dist/mode-market/index.d.ts +0 -3
- package/dist/mode-market/index.js +0 -1
- package/dist/mode-market/registry.d.ts +0 -53
- package/dist/mode-market/registry.js +0 -1
- package/dist/mode-market/review.d.ts +0 -27
- package/dist/mode-market/review.js +0 -1
- package/dist/mode-market/submission.d.ts +0 -25
- package/dist/mode-market/submission.js +0 -1
- package/dist/project/business-puzzle.js +0 -1
- package/dist/project/context-assembly.js +0 -1
- package/dist/project/deployment-bridge.d.ts +0 -5
- package/dist/project/deployment-bridge.js +0 -1
- package/dist/project/deployment-doc.d.ts +0 -190
- package/dist/project/deployment-doc.js +0 -1
- package/dist/project/edit-planner.d.ts +0 -123
- package/dist/project/edit-planner.js +0 -1
- package/dist/project/evaluation-fix.spec.d.ts +0 -1
- package/dist/project/evaluation-fix.spec.js +0 -1
- package/dist/project/evaluation.d.ts +0 -127
- package/dist/project/evaluation.js +0 -1
- package/dist/project/graph-builder.d.ts +0 -51
- package/dist/project/graph-builder.js +0 -1
- package/dist/project/graph.d.ts +0 -70
- package/dist/project/graph.js +0 -1
- package/dist/project/handlers.d.ts +0 -524
- package/dist/project/handlers.js +0 -1
- package/dist/project/index.d.ts +0 -91
- package/dist/project/index.js +0 -1
- package/dist/project/intent-analyzer.js +0 -1
- package/dist/project/machine-nodes.js +0 -1
- package/dist/project/machine-panorama.js +0 -1
- package/dist/project/merchant-guide.js +0 -1
- package/dist/project/mode-actions.js +0 -1
- package/dist/project/namespace.d.ts +0 -72
- package/dist/project/namespace.js +0 -1
- package/dist/project/object-panorama.js +0 -1
- package/dist/project/participation-radar.js +0 -1
- package/dist/project/pipeline-actions.js +0 -1
- package/dist/project/project-store.d.ts +0 -110
- package/dist/project/project-store.js +0 -1
- package/dist/project/query.d.ts +0 -43
- package/dist/project/query.js +0 -1
- package/dist/project/risk-aggregator.js +0 -1
- package/dist/project/semantic-assembler.d.ts +0 -93
- package/dist/project/semantic-assembler.js +0 -1
- package/dist/project/semantic-graph.js +0 -1
- package/dist/project/service-panorama.js +0 -1
- package/dist/project/stage-gate.d.ts +0 -52
- package/dist/project/stage-gate.js +0 -1
- package/dist/project/task-tracker.d.ts +0 -30
- package/dist/project/task-tracker.js +0 -1
- package/dist/schema/project/index.d.ts +0 -2021
- package/dist/schema/project/index.js +0 -1
- package/dist/schema/task-status.d.ts +0 -62
- package/dist/schema/task-status.js +0 -1
- package/dist/schemas/project_operation.output.json +0 -7877
- package/dist/schemas/project_operation.schema.json +0 -1139
- package/dist/schemas/query_task_status.output.json +0 -211
- package/dist/schemas/query_task_status.schema.json +0 -18
- package/dist/tools/handlers/project.d.ts +0 -2
- package/dist/tools/handlers/project.js +0 -1
- package/dist/tools/handlers/task-status.d.ts +0 -2
- package/dist/tools/handlers/task-status.js +0 -1
- /package/dist/{project → playbooks/service-build}/business-puzzle.d.ts +0 -0
- /package/dist/{project → playbooks/service-build}/game-theory.js +0 -0
- /package/dist/{project → playbooks/service-build}/machine-nodes.d.ts +0 -0
- /package/dist/{project → playbooks/service-build}/object-type.d.ts +0 -0
- /package/dist/{project → playbooks/service-build}/object-type.js +0 -0
- /package/dist/{project → playbooks/service-build}/reverse-mapping.d.ts +0 -0
- /package/dist/{project → playbooks/service-build}/reverse-mapping.js +0 -0
- /package/dist/{project → playbooks/service-build}/risk-aggregator.d.ts +0 -0
- /package/dist/{project → playbooks/service-build}/workflow-design-assessment.d.ts +0 -0
- /package/dist/{project → playbooks/service-build}/workflow-design-assessment.js +0 -0
- /package/dist/{project → task}/substep-trace.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
import{PASSPORT_ERROR_CODES,MAX_GUARD_COUNT_PASSPORT,MAX_SUBMISSION_SIZE_PASSPORT}from'./passport-ledger.js';export const SEMANTIC_TO_SCHEMA_RULES=[{'id':'P-PASS-01','pattern_name':'Create\x20Passport','semantic_intent':'Create\x20a\x20new\x20verification\x20carrier\x20object\x20bound\x20to\x20the\x20current\x20transaction','match_keywords':['create','new','passport','instantiate'],'schema_fields':['(SubmissionCall)'],'example_json':{'type':'submission','guard':[],'submission':[]},'reverse_explanation':'Passport\x20created\x20via\x20passport::new(clock,\x20ctx).\x20tx_hash\x20bound\x20to\x20tx_context::digest(ctx).\x20No\x20Guard\x20added\x20yet.'},{'id':'P-PASS-02','pattern_name':'Add\x20impack\x20Guard','semantic_intent':'Add\x20a\x20Guard\x20that\x20affects\x20the\x20final\x20verification\x20result\x20(impack=true)','match_keywords':['impack','affect','decisive','critical\x20guard'],'schema_fields':['guard[].object','guard[].impack=true'],'example_json':{'guard':[{'object':'kyc_guard','impack':!![]}],'submission':[{'guard':'kyc_guard','submission':[{'identifier':0x0,'value':'0x1234...','value_type':'address'}]}]},'reverse_explanation':'guard[].impack=true\x20marks\x20this\x20Guard\x20as\x20affecting\x20final\x20result.\x20At\x20least\x201\x20impack\x20Guard\x20required\x20(else\x20E_IMPACK_GUARD_NOT_FOUND).\x20Failure\x20aborts\x20overall\x20result\x20to\x20false.'},{'id':'P-PASS-03','pattern_name':'Add\x20non-impack\x20Guard','semantic_intent':'Add\x20a\x20Guard\x20that\x20only\x20records\x20per-Guard\x20result\x20(impack=false)','match_keywords':['non-impack','record','audit','log'],'schema_fields':['guard[].object','guard[].impack=false'],'example_json':{'guard':[{'object':'audit_log_guard','impack':![]}],'submission':[]},'reverse_explanation':'guard[].impack=false\x20marks\x20this\x20Guard\x20as\x20audit-only.\x20Its\x20result\x20is\x20recorded\x20but\x20does\x20NOT\x20affect\x20final\x20result.\x20Useful\x20for\x20logging\x20/\x20secondary\x20checks.'},{'id':'P-PASS-04','pattern_name':'Add\x20Guard\x20with\x20relies\x20dependency','semantic_intent':'Add\x20a\x20Guard\x20that\x20depends\x20on\x20other\x20Guards\x20(AND/OR\x20logic)','match_keywords':['relies','depend','dependency','and','or'],'schema_fields':['guard[].object','guard[].impack','(relies\x20read\x20from\x20Guard\x20object)'],'example_json':{'guard':[{'object':'guard_a','impack':!![]},{'object':'guard_b','impack':!![]}],'submission':[]},'reverse_explanation':'relies\x20is\x20read\x20from\x20guard::relies(guard)\x20—\x20NOT\x20set\x20in\x20Passport\x20JSON.\x20Must\x20add\x20relied\x20Guards\x20first\x20(E_RELIES_GUARD_NOT_ADDED).\x20relies_logic_and=true=AND,\x20false=OR.\x20No\x20transitive\x20dependencies\x20allowed.'},{'id':'P-PASS-05','pattern_name':'Verify\x20Passport\x20(one-time)','semantic_intent':'Trigger\x20one-time\x20verification\x20of\x20all\x20Guards;\x20result\x20is\x20immutable\x20after\x20this\x20call','match_keywords':['verify','validation','submit'],'schema_fields':['(verify\x20operation)'],'example_json':{'operation':'verify'},'reverse_explanation':'passport::verify(self,\x20ctx).\x20One-time\x20—\x20has_verified\x20set\x20to\x20true.\x20Computes\x20per-Guard\x20result\x20via\x20relies\x20logic,\x20then\x20impack\x20Guards\x20decide\x20final\x20result.\x20Aborts\x20E_HAS_VERIFIED\x20if\x20called\x20twice.'},{'id':'P-PASS-06','pattern_name':'Freeze\x20Passport\x20(permanent)','semantic_intent':'Permanently\x20freeze\x20the\x20Passport\x20as\x20immutable\x20(cannot\x20be\x20destroyed\x20after)','match_keywords':['freeze','freezen','permanent'],'schema_fields':['(freezen\x20operation)'],'example_json':{'operation':'freezen'},'reverse_explanation':'passport::freezen(self)\x20calls\x20transfer::freeze_object(self).\x20Passport\x20becomes\x20immutable\x20and\x20publicly\x20readable.\x20Cannot\x20be\x20destroyed\x20after\x20freezing.\x20SDK\x20exports\x20as\x20`freeze`\x20(correct\x20spelling).'},{'id':'P-PASS-07','pattern_name':'Query\x20result','semantic_intent':'Get\x20the\x20final\x20verification\x20result\x20(requires\x20has_verified=true\x20+\x20tx_hash\x20match)','match_keywords':['result','query','outcome'],'schema_fields':['(result\x20query)'],'example_json':{'operation':'result_query'},'reverse_explanation':'passport::result(self,\x20ctx)\x20:\x20bool.\x20Aborts\x20E_NOT_VERIFIED\x20(5)\x20if\x20not\x20yet\x20verified;\x20E_TX_NOT_MATCH\x20(8)\x20if\x20called\x20from\x20a\x20different\x20transaction.\x20Must\x20be\x20called\x20in\x20the\x20same\x20tx\x20as\x20verify().'},{'id':'P-PASS-08','pattern_name':'Query\x20specific\x20Guard\x20result\x20(result_for_guard)','semantic_intent':'Hard-verify\x20that\x20a\x20specific\x20impack\x20Guard\x20passed\x20(aborts\x20E_VERIFY_FAILED\x20if\x20not)','match_keywords':['result_for_guard','hard-verify','specific\x20guard'],'schema_fields':['(result_for_guard\x20query)'],'example_json':{'operation':'result_for_guard','guard':'kyc_guard'},'reverse_explanation':'passport::result_for_guard(self,\x20guard,\x20ctx).\x20Aborts\x20E_NOT_IMPACK_GUARD\x20(6)\x20if\x20guard\x20is\x20not\x20impack;\x20E_VERIFY_FAILED\x20(7)\x20if\x20overall\x20result=false.\x20Used\x20by\x20consumers\x20to\x20enforce\x20specific\x20Guard\x20checks.'},{'id':'P-PASS-09','pattern_name':'Query\x20impack\x20Guard\x20list\x20(result_for_permission)','semantic_intent':'Get\x20the\x20list\x20of\x20impack\x20Guard\x20addresses\x20(lazy-filled\x20on\x20first\x20call)','match_keywords':['result_for_permission','impack\x20list','impack\x20addresses'],'schema_fields':['(result_for_permission\x20query)'],'example_json':{'operation':'result_for_permission'},'reverse_explanation':'passport::result_for_permission(self,\x20ctx)\x20:\x20vector<address>.\x20Lazy-fills\x20self.impack\x20on\x20first\x20call.\x20Aborts\x20E_VERIFY_FAILED\x20(7)\x20if\x20overall\x20result=false.\x20Used\x20by\x20Permission/Allocation\x20to\x20get\x20authorized\x20Guard\x20list.'},{'id':'P-PASS-10','pattern_name':'Get\x20submission\x20value','semantic_intent':'Read\x20the\x20submitted\x20value\x20for\x20a\x20(guard,\x20identifier)\x20pair','match_keywords':['submission_get','read','fetch\x20submission'],'schema_fields':['(submission_get\x20query)'],'example_json':{'operation':'submission_get','guard':'voting_guard','identifier':0x0},'reverse_explanation':'passport::submission_get(self,\x20guard,\x20identifier)\x20:\x20vector<u8>.\x20Read-only\x20—\x20no\x20tx_hash\x20check.\x20Returns\x20the\x20BCS-encoded\x20value.\x20Aborts\x20E_SUBMISSION_NOT_FOUND\x20(10)\x20if\x20no\x20entry\x20exists.'},{'id':'P-PASS-11','pattern_name':'Destroy\x20Passport','semantic_intent':'Permanently\x20delete\x20the\x20Passport\x20to\x20release\x20storage\x20(must\x20be\x20before\x20freeze)','match_keywords':['destroy','delete','remove'],'schema_fields':['(destroy\x20operation)'],'example_json':{'operation':'destroy'},'reverse_explanation':'passport::destroy(self)\x20calls\x20object::delete(id).\x20Must\x20be\x20called\x20BEFORE\x20freeze\x20(frozen\x20objects\x20are\x20immutable,\x20cannot\x20be\x20destroyed).\x20Move\x20ownership\x20protects:\x20only\x20signer\x20holding\x20the\x20object\x20can\x20call.'},{'id':'P-PASS-12','pattern_name':'Clear\x20all\x20Guards\x20(pre-verify\x20only)','semantic_intent':'Remove\x20all\x20Guards\x20from\x20Passport\x20(only\x20allowed\x20before\x20verify)','match_keywords':['guard_clear','clear','reset'],'schema_fields':['(guard_clear\x20operation)'],'example_json':{'operation':'guard_clear'},'reverse_explanation':'passport::guard_clear(self,\x20ctx).\x20Aborts\x20E_HAS_VERIFIED\x20(4)\x20if\x20already\x20verified;\x20E_DIGEST_NOT_MATCH\x20(11)\x20if\x20tx_hash\x20mismatch.\x20Useful\x20for\x20resetting\x20configuration\x20before\x20verify.'}];export const SCHEMA_TO_SEMANTIC_RULES=[{'element_type':'field','type_name':'object','semantic_explanation':'Passport\x20object\x20reference\x20(address).\x20For\x20create,\x20no\x20object\x20yet;\x20for\x20operate,\x20the\x20existing\x20Passport\x20address.'},{'element_type':'field','type_name':'guard','semantic_explanation':'Array\x20of\x20{object,\x20impack}.\x20Each\x20entry\x20references\x20a\x20Guard\x20object\x20and\x20marks\x20whether\x20it\x20affects\x20final\x20result.\x20Count\x20≤\x20MAX_GUARD_COUNT_PASSPORT=20.'},{'element_type':'field','type_name':'guard[].object','semantic_explanation':'Guard\x20object\x20address.\x20Must\x20be\x20unique\x20within\x20the\x20Passport\x20(duplicate\x20addresses\x20overwrite\x20existing\x20config).\x20Resolved\x20via\x20LocalMark\x20before\x20on-chain\x20call.'},{'element_type':'field','type_name':'guard[].impack','semantic_explanation':'Boolean.\x20true=affects\x20final\x20result\x20(at\x20least\x201\x20required);\x20false=audit-only.\x20impack\x20Guards\x20failing\x20→\x20overall\x20result=false\x20immediately.'},{'element_type':'field','type_name':'submission','semantic_explanation':'Array\x20of\x20{guard,\x20submission[]}.\x20Each\x20submission\x20is\x20{identifier,\x20value,\x20value_type}.\x20identifier\x20is\x20u8\x20(0-255)\x20matching\x20Guard.table[].identifier.'},{'element_type':'field','type_name':'submission[].identifier','semantic_explanation':'u8\x20(0-255).\x20References\x20Guard.table[identifier].\x20Must\x20be\x20marked\x20b_submission=true\x20in\x20the\x20Guard.'},{'element_type':'field','type_name':'submission[].value','semantic_explanation':'Value\x20matching\x20submission[].value_type.\x20BCS-serialized\x20on-chain;\x20total\x20serialized\x20size\x20per\x20submission\x20≤\x20MAX_SUBMISSION_SIZE_PASSPORT=256\x20bytes.'},{'element_type':'field','type_name':'submission[].value_type','semantic_explanation':'Type\x20string:\x20\x27address\x27\x20|\x20\x27u64\x27\x20|\x20\x27bool\x27\x20|\x20\x27string\x27\x20|\x20\x27vector<u8>\x27\x20etc.\x20Must\x20match\x20Guard.table[identifier].value_type.'},{'element_type':'op','type_name':'create\x20(new)','semantic_explanation':'passport::new(clock,\x20ctx)\x20→\x20Passport.\x20Binds\x20tx_hash\x20=\x20tx_context::digest(ctx).\x20signer\x20=\x20tx_context::sender(ctx).\x20time\x20=\x20clock::timestamp_ms(clock).'},{'element_type':'op','type_name':'guard_add','semantic_explanation':'passport::guard_add(self,\x20guard,\x20identifiers,\x20values,\x20impack,\x20ctx).\x20Pre-verify\x20only.\x20Reads\x20guard::relies(guard)\x20for\x20dependency\x20info.\x20Aborts\x20E_RELIES_GUARD_NOT_ADDED\x20if\x20relies\x20missing.'},{'element_type':'op','type_name':'verify','semantic_explanation':'passport::verify(self,\x20ctx)\x20:\x20bool.\x20One-time.\x20Computes\x20per-Guard\x20result\x20via\x20relies,\x20then\x20impack\x20Guards\x20decide\x20final\x20result.\x20Sets\x20has_verified=true.'},{'element_type':'op','type_name':'freezen','semantic_explanation':'passport::freezen(self).\x20Permanent\x20freeze\x20(transfer::freeze_object).\x20Cannot\x20destroy\x20after.\x20Historical\x20typo:\x20Move\x20function\x20name\x20is\x20\x27freezen\x27\x20(not\x20\x27freeze\x27),\x20retained\x20for\x20compatibility.\x20SDK\x20exports\x20as\x20`freeze`.'},{'element_type':'op','type_name':'destroy','semantic_explanation':'passport::destroy(self).\x20Releases\x20storage\x20(object::delete).\x20Must\x20be\x20before\x20freeze.\x20Move\x20ownership\x20protects:\x20only\x20object\x20holder\x20can\x20call.'},{'element_type':'impack','type_name':'impack=true','semantic_explanation':'Guard\x20affects\x20final\x20result.\x20At\x20least\x201\x20required\x20(E_IMPACK_GUARD_NOT_FOUND).\x20Failure\x20→\x20overall\x20result=false,\x20immediate\x20return.'},{'element_type':'impack','type_name':'impack=false','semantic_explanation':'Guard\x20is\x20audit-only.\x20Per-Guard\x20result\x20is\x20recorded\x20but\x20does\x20NOT\x20affect\x20final\x20result.\x20Useful\x20for\x20logging\x20/\x20secondary\x20checks.'},{'element_type':'relies_logic','type_name':'AND\x20(relies_logic_and=true)','semantic_explanation':'All\x20relied\x20Guards\x20must\x20pass.\x20Short-circuits\x20on\x20first\x20false.\x20Initial\x20value\x20=\x20true;\x20result\x20=\x20true\x20AND\x20rely1.result\x20AND\x20rely2.result\x20...'},{'element_type':'relies_logic','type_name':'OR\x20(relies_logic_and=false)','semantic_explanation':'Any\x20relied\x20Guard\x20may\x20pass.\x20Short-circuits\x20on\x20first\x20true.\x20Initial\x20value\x20=\x20false;\x20result\x20=\x20false\x20OR\x20rely1.result\x20OR\x20rely2.result\x20...'},{'element_type':'lifecycle','type_name':'new\x20→\x20guard_add\x20→\x20verify\x20→\x20use\x20→\x20freeze/destroy','semantic_explanation':'5-stage\x20lifecycle.\x20verify\x20is\x20one-time.\x20freeze\x20and\x20destroy\x20are\x20mutually\x20exclusive\x20terminal\x20states.\x20All\x20write\x20ops\x20(guard_add/verify)\x20require\x20tx_hash\x20match.'}];export const PASSPORT_CONSTRAINT_RULES=[{'id':'T-PASS-01','category':'structural','rule':'Passport\x20is\x20created\x20via\x20the\x20SubmissionCall\x20mechanism,\x20not\x20the\x20standard\x20Call\x20pattern\x20(schema/call/base.ts\x20SubmissionCallSchema)','applies_to':['SubmissionCall','passport::new']},{'id':'T-PASS-02','category':'logic','rule':'Guards\x20with\x20guard[].impack=true\x20decide\x20the\x20final\x20result;\x20at\x20least\x201\x20impack\x20Guard\x20is\x20required\x20(E_IMPACK_GUARD_NOT_FOUND=9)','applies_to':['guard[].impack','verify\x20operation']},{'id':'T-PASS-03','category':'logic','rule':'Depended-on\x20Guards\x20must\x20be\x20added\x20first\x20(topological\x20order);\x20guard_add\x20checks\x20relies,\x20missing\x20relies\x20aborts\x20E_RELIES_GUARD_NOT_ADDED=2','applies_to':['guard_add\x20operation','guard::relies(guard)']},{'id':'T-PASS-04','category':'lifecycle','rule':'After\x20verify,\x20config\x20cannot\x20be\x20modified\x20(has_verified\x20is\x20one-time);\x20second\x20calls\x20to\x20guard_add/guard_clear/verify\x20abort\x20E_HAS_VERIFIED=4','applies_to':['verify\x20operation','has_verified\x20field']},{'id':'T-PASS-05','category':'lifecycle','rule':'tx_hash\x20binding\x20ensures\x20Passport\x20cannot\x20be\x20reused\x20across\x20transactions;\x20write\x20functions\x20and\x20result\x20queries\x20check\x20tx_hash\x20match','applies_to':['tx_hash\x20field','guard_add','verify','result']},{'id':'T-PASS-06','category':'structural','rule':'submission\x20data\x20must\x20match\x20Guard\x20identifier\x20type;\x20BCS\x20serialization\x20≤\x20MAX_SUBMISSION_SIZE_PASSPORT=256\x20bytes','applies_to':['submission[].value_type','submission[].identifier']},{'id':'T-PASS-07','category':'lifecycle','rule':'result\x20query\x20must\x20be\x20in\x20the\x20same\x20transaction\x20(tx_hash\x20matches\x20current\x20transaction);\x20otherwise\x20E_TX_NOT_MATCH=8','applies_to':['result\x20operation','result_for_guard','result_for_permission']},{'id':'T-PASS-08','category':'lifecycle','rule':'After\x20freeze,\x20Passport\x20is\x20permanently\x20retained\x20(cannot\x20be\x20destroyed);\x20freezen\x20calls\x20transfer::freeze_object','applies_to':['freezen\x20operation','destroy\x20operation']},{'id':'T-PASS-09','category':'lifecycle','rule':'destroy\x20must\x20happen\x20before\x20freeze\x20(destroyable\x20when\x20not\x20frozen);\x20after\x20freezing\x20the\x20object\x20becomes\x20immutable\x20and\x20cannot\x20be\x20received\x20by\x20value','applies_to':['destroy\x20operation','freezen\x20operation']},{'id':'T-PASS-10','category':'operational','rule':'explainPassport\x20must\x20translate\x20impack\x20and\x20result\x20status;\x20use\x20passport.object\x20(not\x20passport.id)\x20as\x20the\x20object\x20identifier','applies_to':['explainPassport\x20function','ObjectPassportSchema']},{'id':'T-PASS-11','category':'logic','rule':'relies\x20logic\x20(AND/OR)\x20must\x20be\x20reflected\x20in\x20explainPassport;\x20relies_logic_and=true=AND,\x20false=OR','applies_to':['explainPassport\x20function','guard::relies(guard)']},{'id':'T-PASS-12','category':'structural','rule':'Guard\x20count\x20≤\x20MAX_GUARD_COUNT_PASSPORT=20;\x20submission\x20serialized\x20size\x20≤\x20MAX_SUBMISSION_SIZE_PASSPORT=256\x20bytes','applies_to':['guard\x20array','submission\x20array']}];export const PASSPORT_TRANSLATION_VERSION='1.0.0';export function matchSemanticPattern(a){const b=a['toLowerCase']();return SEMANTIC_TO_SCHEMA_RULES['filter'](c=>c['match_keywords']['some'](d=>b['includes'](d['toLowerCase']())));}export function explainPassport(a){const b=[];b['push']('Passport\x20'+a['object']),b['push']('\x20\x20Signer:\x20'+a['signer']),b['push']('\x20\x20Time:\x20'+new Date(a['time'])['toISOString']()),b['push']('\x20\x20Verified:\x20'+a['has_verified']);a['has_verified']&&b['push']('\x20\x20Result:\x20'+(a['result']?'PASS\x20✅':'FAIL\x20❌'));b['push']('\x20\x20Guards:\x20'+a['info']['length']+'/'+MAX_GUARD_COUNT_PASSPORT);if(a['info']['length']>0x0){b['push']('\x20\x20Guard\x20details:');for(const c of a['info']){const d=c['impack']?'IMPACK':'non-impack',e=c['result']?'PASS':'FAIL';b['push']('\x20\x20\x20\x20-\x20Guard\x20'+c['guard']+':\x20'+e+'\x20('+d+')');}}return a['impack_guard']&&a['impack_guard']['length']>0x0&&b['push']('\x20\x20impack_guard\x20list\x20(lazy-filled):\x20'+a['impack_guard']['join'](',\x20')),a['tx_hash']&&b['push']('\x20\x20tx_hash:\x20'+a['tx_hash']),b['join']('\x0a');}export function passportJsonToSemantic(a){const b=[];if(a['type']==='submission'||a['guard']&&a['guard']['length']>0x0){b['push']('Operation:\x20CREATE\x20Passport\x20via\x20SubmissionCall');if(a['guard']&&a['guard']['length']>0x0){const c=a['guard']['filter'](e=>e['impack'])['length'],d=a['guard']['length']-c;b['push']('-\x20Guards:\x20'+a['guard']['length']+'/'+MAX_GUARD_COUNT_PASSPORT+'\x20('+c+'\x20impack,\x20'+d+'\x20non-impack)'),c===0x0&&b['push']('\x20\x20⚠️\x20No\x20impack\x20Guard\x20—\x20verify\x20will\x20abort\x20E_IMPACK_GUARD_NOT_FOUND\x20(9)'),a['guard']['forEach']((e,f)=>{const h=e['impack']?'IMPACK\x20(affects\x20result)':'non-impack\x20(audit-only)';b['push']('\x20\x20['+f+']\x20'+e['object']+'\x20—\x20'+h);});}if(a['submission']&&a['submission']['length']>0x0){b['push']('-\x20Submissions:\x20'+a['submission']['length']+'\x20guard(s)\x20with\x20submission\x20data');for(const e of a['submission']){const f=e['submission']['reduce']((h,i)=>h+estimateSubmissionSize(i['value_type']),0x0),g=f>MAX_SUBMISSION_SIZE_PASSPORT?'\x20⚠️\x20'+f+'\x20>\x20'+MAX_SUBMISSION_SIZE_PASSPORT+'\x20bytes\x20(E_SUBMISSION_SIZE_EXCEEDED)':'';b['push']('\x20\x20-\x20guard='+e['guard']+':\x20'+e['submission']['length']+'\x20item(s),\x20estimated\x20size='+f+'\x20bytes'+g);}}}else{if(a['operation']){b['push']('Operation:\x20'+a['operation']['toUpperCase']());switch(a['operation']){case'verify':b['push']('-\x20One-time\x20verification;\x20sets\x20has_verified=true,\x20computes\x20final\x20result'),b['push']('-\x20Aborts\x20E_HAS_VERIFIED\x20(4)\x20if\x20already\x20verified');break;case'freezen':b['push']('-\x20Permanent\x20freeze\x20(transfer::freeze_object)'),b['push']('-\x20Cannot\x20be\x20destroyed\x20after\x20freezing');break;case'destroy':b['push']('-\x20Permanent\x20deletion\x20(object::delete)'),b['push']('-\x20Must\x20be\x20called\x20BEFORE\x20freeze');break;case'guard_clear':b['push']('-\x20Removes\x20all\x20Guards\x20from\x20Passport'),b['push']('-\x20Only\x20allowed\x20before\x20verify\x20(E_HAS_VERIFIED\x20if\x20verified)');break;case'result_query':b['push']('-\x20Returns\x20final\x20verification\x20result\x20(bool)'),b['push']('-\x20Requires\x20has_verified=true\x20(E_NOT_VERIFIED)\x20and\x20tx_hash\x20match\x20(E_TX_NOT_MATCH)');break;case'result_for_guard':b['push']('-\x20Hard-verifies\x20Guard\x20'+a['guard_target']+'\x20is\x20impack\x20and\x20passed'),b['push']('-\x20Aborts\x20E_NOT_IMPACK_GUARD\x20(6)\x20if\x20not\x20impack;\x20E_VERIFY_FAILED\x20(7)\x20if\x20result=false');break;case'result_for_permission':b['push']('-\x20Returns\x20impack\x20Guard\x20address\x20list\x20(lazy-filled)'),b['push']('-\x20Aborts\x20E_VERIFY_FAILED\x20(7)\x20if\x20overall\x20result=false');break;case'submission_get':b['push']('-\x20Reads\x20submission\x20value\x20for\x20(guard='+a['guard_target']+',\x20identifier='+a['identifier']+')'),b['push']('-\x20Read-only,\x20no\x20tx_hash\x20check'),b['push']('-\x20Aborts\x20E_SUBMISSION_NOT_FOUND\x20(10)\x20if\x20no\x20entry');break;}}else b['push']('⚠️\x20Cannot\x20determine\x20operation:\x20provide\x20\x27type:\x20submission\x27\x20with\x20guard[],\x20or\x20\x27operation\x27\x20field');}return b['join']('\x0a');}export function semanticToPassportJson(a){switch(a['action']){case'create':{if(!a['guards']||a['guards']['length']===0x0)throw new Error('Create\x20action\x20requires\x20at\x20least\x201\x20Guard\x20in\x20intent.guards');if(a['guards']['length']>MAX_GUARD_COUNT_PASSPORT)throw new Error('Guard\x20count\x20'+a['guards']['length']+'\x20exceeds\x20MAX_GUARD_COUNT_PASSPORT='+MAX_GUARD_COUNT_PASSPORT);const b=a['guards']['some'](c=>c['impack']);if(!b)throw new Error('At\x20least\x201\x20Guard\x20must\x20have\x20impack=true\x20(else\x20verify\x20aborts\x20E_IMPACK_GUARD_NOT_FOUND=9)');return{'type':'submission','guard':a['guards']['map'](c=>({'object':c['object'],'impack':c['impack']})),'submission':a['guards']['filter'](c=>c['submission']&&c['submission']['length']>0x0)['map'](c=>({'guard':c['object'],'submission':c['submission']}))};}case'verify':return{'operation':'verify'};case'freeze':return{'operation':'freezen'};case'destroy':return{'operation':'destroy'};case'guard_clear':return{'operation':'guard_clear'};case'query_result':return{'operation':'result_query'};case'query_guard_result':if(!a['targetGuard'])throw new Error('query_guard_result\x20requires\x20intent.targetGuard');return{'operation':'result_for_guard','guard_target':a['targetGuard']};case'query_impack_list':return{'operation':'result_for_permission'};case'get_submission':if(!a['targetGuard'])throw new Error('get_submission\x20requires\x20intent.targetGuard');if(a['targetIdentifier']===undefined)throw new Error('get_submission\x20requires\x20intent.targetIdentifier');return{'operation':'submission_get','guard_target':a['targetGuard'],'identifier':a['targetIdentifier']};}}export function explainField(a){return SCHEMA_TO_SEMANTIC_RULES['find'](b=>b['element_type']==='field'&&b['type_name']===a);}export function explainOp(a){return SCHEMA_TO_SEMANTIC_RULES['find'](b=>b['element_type']==='op'&&b['type_name']===a);}export function explainImpack(a){return SCHEMA_TO_SEMANTIC_RULES['find'](b=>b['element_type']==='impack'&&b['type_name']==='impack='+a);}export function explainReliesLogic(a){const b=a?'AND\x20(relies_logic_and=true)':'OR\x20(relies_logic_and=false)';return SCHEMA_TO_SEMANTIC_RULES['find'](c=>c['element_type']==='relies_logic'&&c['type_name']===b);}export function getConstraintsByCategory(a){return PASSPORT_CONSTRAINT_RULES['filter'](b=>b['category']===a);}export function explainError(a){const b={[PASSPORT_ERROR_CODES['E_GUARD_COUNT_EXCEEDED']]:'Guard\x20count\x20exceeds\x20MAX_GUARD_COUNT_PASSPORT\x20(20)\x20—\x20remove\x20non-essential\x20Guards\x20or\x20merge\x20similar\x20ones',[PASSPORT_ERROR_CODES['E_RELIES_GUARD_NOT_ADDED']]:'Relied\x20Guard\x20not\x20yet\x20added\x20—\x20add\x20relied\x20Guards\x20in\x20topological\x20order\x20before\x20adding\x20the\x20dependent\x20Guard',[PASSPORT_ERROR_CODES['E_SUBMISSION_SIZE_EXCEEDED']]:'Submission\x20serialized\x20size\x20exceeds\x20MAX_SUBMISSION_SIZE_PASSPORT\x20(256\x20bytes)\x20—\x20use\x20Repository\x20reference\x20for\x20large\x20data',[PASSPORT_ERROR_CODES['E_HAS_VERIFIED']]:'Passport\x20already\x20verified\x20—\x20verify\x20is\x20one-time;\x20create\x20a\x20new\x20Passport\x20to\x20re-verify',[PASSPORT_ERROR_CODES['E_NOT_VERIFIED']]:'result()\x20called\x20before\x20verify()\x20—\x20call\x20verify()\x20first\x20in\x20the\x20same\x20transaction',[PASSPORT_ERROR_CODES['E_NOT_IMPACK_GUARD']]:'result_for_guard\x20called\x20on\x20non-impack\x20Guard\x20—\x20only\x20impack\x20Guards\x20can\x20be\x20hard-verified',[PASSPORT_ERROR_CODES['E_VERIFY_FAILED']]:'result_for_guard\x20/\x20result_for_permission\x20called\x20when\x20overall\x20result=false\x20—\x20fix\x20Guard\x20configuration\x20or\x20submission\x20data',[PASSPORT_ERROR_CODES['E_TX_NOT_MATCH']]:'result()\x20called\x20from\x20a\x20different\x20transaction\x20—\x20Passport\x20is\x20tx_hash-bound,\x20must\x20query\x20in\x20the\x20same\x20tx\x20as\x20verify()',[PASSPORT_ERROR_CODES['E_IMPACK_GUARD_NOT_FOUND']]:'verify()\x20found\x20no\x20impack\x20Guard\x20—\x20at\x20least\x201\x20Guard\x20must\x20have\x20impack=true',[PASSPORT_ERROR_CODES['E_SUBMISSION_NOT_FOUND']]:'submission_get\x20found\x20no\x20entry\x20for\x20(guard,\x20identifier)\x20—\x20check\x20Guard.table[identifier].b_submission=true',[PASSPORT_ERROR_CODES['E_DIGEST_NOT_MATCH']]:'guard_add\x20/\x20verify\x20/\x20guard_clear\x20called\x20from\x20a\x20different\x20transaction\x20—\x20Passport\x20is\x20tx_hash-bound'};return b[a]??'Unknown\x20Passport\x20error\x20code:\x20'+a;}function estimateSubmissionSize(a){switch(a){case'bool':return 0x1;case'u8':return 0x1;case'u64':return 0x8;case'address':return 0x20;case'string':return 0x20;case'vector<u8>':return 0x20;default:return 0x40;}}
|
|
1
|
+
import{PASSPORT_ERROR_CODES,MAX_GUARD_COUNT_PASSPORT,MAX_SUBMISSION_SIZE_PASSPORT}from'./passport-ledger.js';export const SEMANTIC_TO_SCHEMA_RULES=[{'id':'P-PASS-01','pattern_name':'Create\x20Passport','semantic_intent':'Create\x20a\x20new\x20verification\x20carrier\x20object\x20bound\x20to\x20the\x20current\x20transaction','match_keywords':['create','new','passport','instantiate'],'schema_fields':['(SubmissionCall)'],'example_json':{'type':'submission','guard':[],'submission':[]},'reverse_explanation':'Passport\x20created\x20via\x20passport::new_v2(clock,\x20object_linker_tx,\x20ctx).\x20tx_hash\x20bound\x20to\x20tx_context::digest(ctx).\x20Registers\x20the\x20creator\x20(tx\x20sender)\x20into\x20ObjectLinkerTx\x20so\x20the\x20passport\x20can\x20be\x20queried\x20by\x20the\x20creator\x20address.\x20No\x20Guard\x20added\x20yet.'},{'id':'P-PASS-02','pattern_name':'Add\x20impack\x20Guard','semantic_intent':'Add\x20a\x20Guard\x20that\x20affects\x20the\x20final\x20verification\x20result\x20(impack=true)','match_keywords':['impack','affect','decisive','critical\x20guard'],'schema_fields':['guard[].object','guard[].impack=true'],'example_json':{'guard':[{'object':'kyc_guard','impack':!![]}],'submission':[{'guard':'kyc_guard','submission':[{'identifier':0x0,'value':'0x1234...','value_type':'address'}]}]},'reverse_explanation':'guard[].impack=true\x20marks\x20this\x20Guard\x20as\x20affecting\x20final\x20result.\x20At\x20least\x201\x20impack\x20Guard\x20required\x20(else\x20E_IMPACK_GUARD_NOT_FOUND).\x20Failure\x20aborts\x20overall\x20result\x20to\x20false.'},{'id':'P-PASS-03','pattern_name':'Add\x20non-impack\x20Guard','semantic_intent':'Add\x20a\x20Guard\x20that\x20only\x20records\x20per-Guard\x20result\x20(impack=false)','match_keywords':['non-impack','record','audit','log'],'schema_fields':['guard[].object','guard[].impack=false'],'example_json':{'guard':[{'object':'audit_log_guard','impack':![]}],'submission':[]},'reverse_explanation':'guard[].impack=false\x20marks\x20this\x20Guard\x20as\x20audit-only.\x20Its\x20result\x20is\x20recorded\x20but\x20does\x20NOT\x20affect\x20final\x20result.\x20Useful\x20for\x20logging\x20/\x20secondary\x20checks.'},{'id':'P-PASS-04','pattern_name':'Add\x20Guard\x20with\x20relies\x20dependency','semantic_intent':'Add\x20a\x20Guard\x20that\x20depends\x20on\x20other\x20Guards\x20(AND/OR\x20logic)','match_keywords':['relies','depend','dependency','and','or'],'schema_fields':['guard[].object','guard[].impack','(relies\x20read\x20from\x20Guard\x20object)'],'example_json':{'guard':[{'object':'guard_a','impack':!![]},{'object':'guard_b','impack':!![]}],'submission':[]},'reverse_explanation':'relies\x20is\x20read\x20from\x20guard::relies(guard)\x20—\x20NOT\x20set\x20in\x20Passport\x20JSON.\x20Must\x20add\x20relied\x20Guards\x20first\x20(E_RELIES_GUARD_NOT_ADDED).\x20relies_logic_and=true=AND,\x20false=OR.\x20No\x20transitive\x20dependencies\x20allowed.'},{'id':'P-PASS-05','pattern_name':'Verify\x20Passport\x20(one-time)','semantic_intent':'Trigger\x20one-time\x20verification\x20of\x20all\x20Guards;\x20result\x20is\x20immutable\x20after\x20this\x20call','match_keywords':['verify','validation','submit'],'schema_fields':['(verify\x20operation)'],'example_json':{'operation':'verify'},'reverse_explanation':'passport::verify(self,\x20ctx).\x20One-time\x20—\x20has_verified\x20set\x20to\x20true.\x20Computes\x20per-Guard\x20result\x20via\x20relies\x20logic,\x20then\x20impack\x20Guards\x20decide\x20final\x20result.\x20Aborts\x20E_HAS_VERIFIED\x20if\x20called\x20twice.'},{'id':'P-PASS-06','pattern_name':'Freeze\x20Passport\x20(permanent)','semantic_intent':'Permanently\x20freeze\x20the\x20Passport\x20as\x20immutable\x20(cannot\x20be\x20destroyed\x20after)','match_keywords':['freeze','freezen','permanent'],'schema_fields':['(freezen\x20operation)'],'example_json':{'operation':'freezen'},'reverse_explanation':'passport::freezen(self)\x20calls\x20transfer::freeze_object(self).\x20Passport\x20becomes\x20immutable\x20and\x20publicly\x20readable.\x20Cannot\x20be\x20destroyed\x20after\x20freezing.\x20SDK\x20exports\x20as\x20`freeze`\x20(correct\x20spelling).'},{'id':'P-PASS-07','pattern_name':'Query\x20result','semantic_intent':'Get\x20the\x20final\x20verification\x20result\x20(requires\x20has_verified=true\x20+\x20tx_hash\x20match)','match_keywords':['result','query','outcome'],'schema_fields':['(result\x20query)'],'example_json':{'operation':'result_query'},'reverse_explanation':'passport::result(self,\x20ctx)\x20:\x20bool.\x20Aborts\x20E_NOT_VERIFIED\x20(5)\x20if\x20not\x20yet\x20verified;\x20E_TX_NOT_MATCH\x20(8)\x20if\x20called\x20from\x20a\x20different\x20transaction.\x20Must\x20be\x20called\x20in\x20the\x20same\x20tx\x20as\x20verify().'},{'id':'P-PASS-08','pattern_name':'Query\x20specific\x20Guard\x20result\x20(result_for_guard)','semantic_intent':'Hard-verify\x20that\x20a\x20specific\x20impack\x20Guard\x20passed\x20(aborts\x20E_VERIFY_FAILED\x20if\x20not)','match_keywords':['result_for_guard','hard-verify','specific\x20guard'],'schema_fields':['(result_for_guard\x20query)'],'example_json':{'operation':'result_for_guard','guard':'kyc_guard'},'reverse_explanation':'passport::result_for_guard(self,\x20guard,\x20ctx).\x20Aborts\x20E_NOT_IMPACK_GUARD\x20(6)\x20if\x20guard\x20is\x20not\x20impack;\x20E_VERIFY_FAILED\x20(7)\x20if\x20overall\x20result=false.\x20Used\x20by\x20consumers\x20to\x20enforce\x20specific\x20Guard\x20checks.'},{'id':'P-PASS-09','pattern_name':'Query\x20impack\x20Guard\x20list\x20(result_for_permission)','semantic_intent':'Get\x20the\x20list\x20of\x20impack\x20Guard\x20addresses\x20(lazy-filled\x20on\x20first\x20call)','match_keywords':['result_for_permission','impack\x20list','impack\x20addresses'],'schema_fields':['(result_for_permission\x20query)'],'example_json':{'operation':'result_for_permission'},'reverse_explanation':'passport::result_for_permission(self,\x20ctx)\x20:\x20vector<address>.\x20Lazy-fills\x20self.impack\x20on\x20first\x20call.\x20Aborts\x20E_VERIFY_FAILED\x20(7)\x20if\x20overall\x20result=false.\x20Used\x20by\x20Permission/Allocation\x20to\x20get\x20authorized\x20Guard\x20list.'},{'id':'P-PASS-10','pattern_name':'Get\x20submission\x20value','semantic_intent':'Read\x20the\x20submitted\x20value\x20for\x20a\x20(guard,\x20identifier)\x20pair','match_keywords':['submission_get','read','fetch\x20submission'],'schema_fields':['(submission_get\x20query)'],'example_json':{'operation':'submission_get','guard':'voting_guard','identifier':0x0},'reverse_explanation':'passport::submission_get(self,\x20guard,\x20identifier)\x20:\x20vector<u8>.\x20Read-only\x20—\x20no\x20tx_hash\x20check.\x20Returns\x20the\x20BCS-encoded\x20value.\x20Aborts\x20E_SUBMISSION_NOT_FOUND\x20(10)\x20if\x20no\x20entry\x20exists.'},{'id':'P-PASS-11','pattern_name':'Destroy\x20Passport','semantic_intent':'Permanently\x20delete\x20the\x20Passport\x20to\x20release\x20storage\x20(must\x20be\x20before\x20freeze)','match_keywords':['destroy','delete','remove'],'schema_fields':['(destroy\x20operation)'],'example_json':{'operation':'destroy'},'reverse_explanation':'passport::destroy(self)\x20calls\x20object::delete(id).\x20Must\x20be\x20called\x20BEFORE\x20freeze\x20(frozen\x20objects\x20are\x20immutable,\x20cannot\x20be\x20destroyed).\x20Move\x20ownership\x20protects:\x20only\x20signer\x20holding\x20the\x20object\x20can\x20call.'},{'id':'P-PASS-12','pattern_name':'Clear\x20all\x20Guards\x20(pre-verify\x20only)','semantic_intent':'Remove\x20all\x20Guards\x20from\x20Passport\x20(only\x20allowed\x20before\x20verify)','match_keywords':['guard_clear','clear','reset'],'schema_fields':['(guard_clear\x20operation)'],'example_json':{'operation':'guard_clear'},'reverse_explanation':'passport::guard_clear(self,\x20ctx).\x20Aborts\x20E_HAS_VERIFIED\x20(4)\x20if\x20already\x20verified;\x20E_DIGEST_NOT_MATCH\x20(11)\x20if\x20tx_hash\x20mismatch.\x20Useful\x20for\x20resetting\x20configuration\x20before\x20verify.'}];export const SCHEMA_TO_SEMANTIC_RULES=[{'element_type':'field','type_name':'object','semantic_explanation':'Passport\x20object\x20reference\x20(address).\x20For\x20create,\x20no\x20object\x20yet;\x20for\x20operate,\x20the\x20existing\x20Passport\x20address.'},{'element_type':'field','type_name':'guard','semantic_explanation':'Array\x20of\x20{object,\x20impack}.\x20Each\x20entry\x20references\x20a\x20Guard\x20object\x20and\x20marks\x20whether\x20it\x20affects\x20final\x20result.\x20Count\x20≤\x20MAX_GUARD_COUNT_PASSPORT=20.'},{'element_type':'field','type_name':'guard[].object','semantic_explanation':'Guard\x20object\x20address.\x20Must\x20be\x20unique\x20within\x20the\x20Passport\x20(duplicate\x20addresses\x20overwrite\x20existing\x20config).\x20Resolved\x20via\x20LocalMark\x20before\x20on-chain\x20call.'},{'element_type':'field','type_name':'guard[].impack','semantic_explanation':'Boolean.\x20true=affects\x20final\x20result\x20(at\x20least\x201\x20required);\x20false=audit-only.\x20impack\x20Guards\x20failing\x20→\x20overall\x20result=false\x20immediately.'},{'element_type':'field','type_name':'submission','semantic_explanation':'Array\x20of\x20{guard,\x20submission[]}.\x20Each\x20submission\x20is\x20{identifier,\x20value,\x20value_type}.\x20identifier\x20is\x20u8\x20(0-255)\x20matching\x20Guard.table[].identifier.'},{'element_type':'field','type_name':'submission[].identifier','semantic_explanation':'u8\x20(0-255).\x20References\x20Guard.table[identifier].\x20Must\x20be\x20marked\x20b_submission=true\x20in\x20the\x20Guard.'},{'element_type':'field','type_name':'submission[].value','semantic_explanation':'Value\x20matching\x20submission[].value_type.\x20BCS-serialized\x20on-chain;\x20total\x20serialized\x20size\x20per\x20submission\x20≤\x20MAX_SUBMISSION_SIZE_PASSPORT=256\x20bytes.'},{'element_type':'field','type_name':'submission[].value_type','semantic_explanation':'Type\x20string:\x20\x27address\x27\x20|\x20\x27u64\x27\x20|\x20\x27bool\x27\x20|\x20\x27string\x27\x20|\x20\x27vector<u8>\x27\x20etc.\x20Must\x20match\x20Guard.table[identifier].value_type.'},{'element_type':'op','type_name':'create\x20(new)','semantic_explanation':'passport::new_v2(clock,\x20object_linker_tx,\x20ctx)\x20→\x20Passport.\x20Binds\x20tx_hash\x20=\x20tx_context::digest(ctx).\x20signer\x20=\x20tx_context::sender(ctx).\x20time\x20=\x20clock::timestamp_ms(clock).\x20Registers\x20creator\x20(tx\x20sender)\x20into\x20ObjectLinkerTx\x20for\x20creator\x20reverse\x20lookup.'},{'element_type':'op','type_name':'guard_add','semantic_explanation':'passport::guard_add(self,\x20guard,\x20identifiers,\x20values,\x20impack,\x20ctx).\x20Pre-verify\x20only.\x20Reads\x20guard::relies(guard)\x20for\x20dependency\x20info.\x20Aborts\x20E_RELIES_GUARD_NOT_ADDED\x20if\x20relies\x20missing.'},{'element_type':'op','type_name':'verify','semantic_explanation':'passport::verify(self,\x20ctx)\x20:\x20bool.\x20One-time.\x20Computes\x20per-Guard\x20result\x20via\x20relies,\x20then\x20impack\x20Guards\x20decide\x20final\x20result.\x20Sets\x20has_verified=true.'},{'element_type':'op','type_name':'freezen','semantic_explanation':'passport::freezen(self).\x20Permanent\x20freeze\x20(transfer::freeze_object).\x20Cannot\x20destroy\x20after.\x20Historical\x20typo:\x20Move\x20function\x20name\x20is\x20\x27freezen\x27\x20(not\x20\x27freeze\x27),\x20retained\x20for\x20compatibility.\x20SDK\x20exports\x20as\x20`freeze`.'},{'element_type':'op','type_name':'destroy','semantic_explanation':'passport::destroy(self).\x20Releases\x20storage\x20(object::delete).\x20Must\x20be\x20before\x20freeze.\x20Move\x20ownership\x20protects:\x20only\x20object\x20holder\x20can\x20call.'},{'element_type':'impack','type_name':'impack=true','semantic_explanation':'Guard\x20affects\x20final\x20result.\x20At\x20least\x201\x20required\x20(E_IMPACK_GUARD_NOT_FOUND).\x20Failure\x20→\x20overall\x20result=false,\x20immediate\x20return.'},{'element_type':'impack','type_name':'impack=false','semantic_explanation':'Guard\x20is\x20audit-only.\x20Per-Guard\x20result\x20is\x20recorded\x20but\x20does\x20NOT\x20affect\x20final\x20result.\x20Useful\x20for\x20logging\x20/\x20secondary\x20checks.'},{'element_type':'relies_logic','type_name':'AND\x20(relies_logic_and=true)','semantic_explanation':'All\x20relied\x20Guards\x20must\x20pass.\x20Short-circuits\x20on\x20first\x20false.\x20Initial\x20value\x20=\x20true;\x20result\x20=\x20true\x20AND\x20rely1.result\x20AND\x20rely2.result\x20...'},{'element_type':'relies_logic','type_name':'OR\x20(relies_logic_and=false)','semantic_explanation':'Any\x20relied\x20Guard\x20may\x20pass.\x20Short-circuits\x20on\x20first\x20true.\x20Initial\x20value\x20=\x20false;\x20result\x20=\x20false\x20OR\x20rely1.result\x20OR\x20rely2.result\x20...'},{'element_type':'lifecycle','type_name':'new\x20→\x20guard_add\x20→\x20verify\x20→\x20use\x20→\x20freeze/destroy','semantic_explanation':'5-stage\x20lifecycle.\x20verify\x20is\x20one-time.\x20freeze\x20and\x20destroy\x20are\x20mutually\x20exclusive\x20terminal\x20states.\x20All\x20write\x20ops\x20(guard_add/verify)\x20require\x20tx_hash\x20match.'}];export const PASSPORT_CONSTRAINT_RULES=[{'id':'T-PASS-01','category':'structural','rule':'Passport\x20is\x20created\x20via\x20the\x20SubmissionCall\x20mechanism,\x20not\x20the\x20standard\x20Call\x20pattern\x20(schema/call/base.ts\x20SubmissionCallSchema)','applies_to':['SubmissionCall','passport::new_v2']},{'id':'T-PASS-02','category':'logic','rule':'Guards\x20with\x20guard[].impack=true\x20decide\x20the\x20final\x20result;\x20at\x20least\x201\x20impack\x20Guard\x20is\x20required\x20(E_IMPACK_GUARD_NOT_FOUND=9)','applies_to':['guard[].impack','verify\x20operation']},{'id':'T-PASS-03','category':'logic','rule':'Depended-on\x20Guards\x20must\x20be\x20added\x20first\x20(topological\x20order);\x20guard_add\x20checks\x20relies,\x20missing\x20relies\x20aborts\x20E_RELIES_GUARD_NOT_ADDED=2','applies_to':['guard_add\x20operation','guard::relies(guard)']},{'id':'T-PASS-04','category':'lifecycle','rule':'After\x20verify,\x20config\x20cannot\x20be\x20modified\x20(has_verified\x20is\x20one-time);\x20second\x20calls\x20to\x20guard_add/guard_clear/verify\x20abort\x20E_HAS_VERIFIED=4','applies_to':['verify\x20operation','has_verified\x20field']},{'id':'T-PASS-05','category':'lifecycle','rule':'tx_hash\x20binding\x20ensures\x20Passport\x20cannot\x20be\x20reused\x20across\x20transactions;\x20write\x20functions\x20and\x20result\x20queries\x20check\x20tx_hash\x20match','applies_to':['tx_hash\x20field','guard_add','verify','result']},{'id':'T-PASS-06','category':'structural','rule':'submission\x20data\x20must\x20match\x20Guard\x20identifier\x20type;\x20BCS\x20serialization\x20≤\x20MAX_SUBMISSION_SIZE_PASSPORT=256\x20bytes','applies_to':['submission[].value_type','submission[].identifier']},{'id':'T-PASS-07','category':'lifecycle','rule':'result\x20query\x20must\x20be\x20in\x20the\x20same\x20transaction\x20(tx_hash\x20matches\x20current\x20transaction);\x20otherwise\x20E_TX_NOT_MATCH=8','applies_to':['result\x20operation','result_for_guard','result_for_permission']},{'id':'T-PASS-08','category':'lifecycle','rule':'After\x20freeze,\x20Passport\x20is\x20permanently\x20retained\x20(cannot\x20be\x20destroyed);\x20freezen\x20calls\x20transfer::freeze_object','applies_to':['freezen\x20operation','destroy\x20operation']},{'id':'T-PASS-09','category':'lifecycle','rule':'destroy\x20must\x20happen\x20before\x20freeze\x20(destroyable\x20when\x20not\x20frozen);\x20after\x20freezing\x20the\x20object\x20becomes\x20immutable\x20and\x20cannot\x20be\x20received\x20by\x20value','applies_to':['destroy\x20operation','freezen\x20operation']},{'id':'T-PASS-10','category':'operational','rule':'explainPassport\x20must\x20translate\x20impack\x20and\x20result\x20status;\x20use\x20passport.object\x20(not\x20passport.id)\x20as\x20the\x20object\x20identifier','applies_to':['explainPassport\x20function','ObjectPassportSchema']},{'id':'T-PASS-11','category':'logic','rule':'relies\x20logic\x20(AND/OR)\x20must\x20be\x20reflected\x20in\x20explainPassport;\x20relies_logic_and=true=AND,\x20false=OR','applies_to':['explainPassport\x20function','guard::relies(guard)']},{'id':'T-PASS-12','category':'structural','rule':'Guard\x20count\x20≤\x20MAX_GUARD_COUNT_PASSPORT=20;\x20submission\x20serialized\x20size\x20≤\x20MAX_SUBMISSION_SIZE_PASSPORT=256\x20bytes','applies_to':['guard\x20array','submission\x20array']}];export const PASSPORT_TRANSLATION_VERSION='1.0.0';export function matchSemanticPattern(a){const b=a['toLowerCase']();return SEMANTIC_TO_SCHEMA_RULES['filter'](c=>c['match_keywords']['some'](d=>b['includes'](d['toLowerCase']())));}export function explainPassport(a){const b=[];b['push']('Passport\x20'+a['object']),b['push']('\x20\x20Signer:\x20'+a['signer']),b['push']('\x20\x20Time:\x20'+new Date(a['time'])['toISOString']()),b['push']('\x20\x20Verified:\x20'+a['has_verified']);a['has_verified']&&b['push']('\x20\x20Result:\x20'+(a['result']?'PASS\x20✅':'FAIL\x20❌'));b['push']('\x20\x20Guards:\x20'+a['info']['length']+'/'+MAX_GUARD_COUNT_PASSPORT);if(a['info']['length']>0x0){b['push']('\x20\x20Guard\x20details:');for(const c of a['info']){const d=c['impack']?'IMPACK':'non-impack',e=c['result']?'PASS':'FAIL';b['push']('\x20\x20\x20\x20-\x20Guard\x20'+c['guard']+':\x20'+e+'\x20('+d+')');}}return a['impack_guard']&&a['impack_guard']['length']>0x0&&b['push']('\x20\x20impack_guard\x20list\x20(lazy-filled):\x20'+a['impack_guard']['join'](',\x20')),a['tx_hash']&&b['push']('\x20\x20tx_hash:\x20'+a['tx_hash']),b['join']('\x0a');}export function passportJsonToSemantic(a){const b=[];if(a['type']==='submission'||a['guard']&&a['guard']['length']>0x0){b['push']('Operation:\x20CREATE\x20Passport\x20via\x20SubmissionCall');if(a['guard']&&a['guard']['length']>0x0){const c=a['guard']['filter'](e=>e['impack'])['length'],d=a['guard']['length']-c;b['push']('-\x20Guards:\x20'+a['guard']['length']+'/'+MAX_GUARD_COUNT_PASSPORT+'\x20('+c+'\x20impack,\x20'+d+'\x20non-impack)'),c===0x0&&b['push']('\x20\x20⚠️\x20No\x20impack\x20Guard\x20—\x20verify\x20will\x20abort\x20E_IMPACK_GUARD_NOT_FOUND\x20(9)'),a['guard']['forEach']((e,f)=>{const h=e['impack']?'IMPACK\x20(affects\x20result)':'non-impack\x20(audit-only)';b['push']('\x20\x20['+f+']\x20'+e['object']+'\x20—\x20'+h);});}if(a['submission']&&a['submission']['length']>0x0){b['push']('-\x20Submissions:\x20'+a['submission']['length']+'\x20guard(s)\x20with\x20submission\x20data');for(const e of a['submission']){const f=e['submission']['reduce']((h,i)=>h+estimateSubmissionSize(i['value_type']),0x0),g=f>MAX_SUBMISSION_SIZE_PASSPORT?'\x20⚠️\x20'+f+'\x20>\x20'+MAX_SUBMISSION_SIZE_PASSPORT+'\x20bytes\x20(E_SUBMISSION_SIZE_EXCEEDED)':'';b['push']('\x20\x20-\x20guard='+e['guard']+':\x20'+e['submission']['length']+'\x20item(s),\x20estimated\x20size='+f+'\x20bytes'+g);}}}else{if(a['operation']){b['push']('Operation:\x20'+a['operation']['toUpperCase']());switch(a['operation']){case'verify':b['push']('-\x20One-time\x20verification;\x20sets\x20has_verified=true,\x20computes\x20final\x20result'),b['push']('-\x20Aborts\x20E_HAS_VERIFIED\x20(4)\x20if\x20already\x20verified');break;case'freezen':b['push']('-\x20Permanent\x20freeze\x20(transfer::freeze_object)'),b['push']('-\x20Cannot\x20be\x20destroyed\x20after\x20freezing');break;case'destroy':b['push']('-\x20Permanent\x20deletion\x20(object::delete)'),b['push']('-\x20Must\x20be\x20called\x20BEFORE\x20freeze');break;case'guard_clear':b['push']('-\x20Removes\x20all\x20Guards\x20from\x20Passport'),b['push']('-\x20Only\x20allowed\x20before\x20verify\x20(E_HAS_VERIFIED\x20if\x20verified)');break;case'result_query':b['push']('-\x20Returns\x20final\x20verification\x20result\x20(bool)'),b['push']('-\x20Requires\x20has_verified=true\x20(E_NOT_VERIFIED)\x20and\x20tx_hash\x20match\x20(E_TX_NOT_MATCH)');break;case'result_for_guard':b['push']('-\x20Hard-verifies\x20Guard\x20'+a['guard_target']+'\x20is\x20impack\x20and\x20passed'),b['push']('-\x20Aborts\x20E_NOT_IMPACK_GUARD\x20(6)\x20if\x20not\x20impack;\x20E_VERIFY_FAILED\x20(7)\x20if\x20result=false');break;case'result_for_permission':b['push']('-\x20Returns\x20impack\x20Guard\x20address\x20list\x20(lazy-filled)'),b['push']('-\x20Aborts\x20E_VERIFY_FAILED\x20(7)\x20if\x20overall\x20result=false');break;case'submission_get':b['push']('-\x20Reads\x20submission\x20value\x20for\x20(guard='+a['guard_target']+',\x20identifier='+a['identifier']+')'),b['push']('-\x20Read-only,\x20no\x20tx_hash\x20check'),b['push']('-\x20Aborts\x20E_SUBMISSION_NOT_FOUND\x20(10)\x20if\x20no\x20entry');break;}}else b['push']('⚠️\x20Cannot\x20determine\x20operation:\x20provide\x20\x27type:\x20submission\x27\x20with\x20guard[],\x20or\x20\x27operation\x27\x20field');}return b['join']('\x0a');}export function semanticToPassportJson(a){switch(a['action']){case'create':{if(!a['guards']||a['guards']['length']===0x0)throw new Error('Create\x20action\x20requires\x20at\x20least\x201\x20Guard\x20in\x20intent.guards');if(a['guards']['length']>MAX_GUARD_COUNT_PASSPORT)throw new Error('Guard\x20count\x20'+a['guards']['length']+'\x20exceeds\x20MAX_GUARD_COUNT_PASSPORT='+MAX_GUARD_COUNT_PASSPORT);const b=a['guards']['some'](c=>c['impack']);if(!b)throw new Error('At\x20least\x201\x20Guard\x20must\x20have\x20impack=true\x20(else\x20verify\x20aborts\x20E_IMPACK_GUARD_NOT_FOUND=9)');return{'type':'submission','guard':a['guards']['map'](c=>({'object':c['object'],'impack':c['impack']})),'submission':a['guards']['filter'](c=>c['submission']&&c['submission']['length']>0x0)['map'](c=>({'guard':c['object'],'submission':c['submission']}))};}case'verify':return{'operation':'verify'};case'freeze':return{'operation':'freezen'};case'destroy':return{'operation':'destroy'};case'guard_clear':return{'operation':'guard_clear'};case'query_result':return{'operation':'result_query'};case'query_guard_result':if(!a['targetGuard'])throw new Error('query_guard_result\x20requires\x20intent.targetGuard');return{'operation':'result_for_guard','guard_target':a['targetGuard']};case'query_impack_list':return{'operation':'result_for_permission'};case'get_submission':if(!a['targetGuard'])throw new Error('get_submission\x20requires\x20intent.targetGuard');if(a['targetIdentifier']===undefined)throw new Error('get_submission\x20requires\x20intent.targetIdentifier');return{'operation':'submission_get','guard_target':a['targetGuard'],'identifier':a['targetIdentifier']};}}export function explainField(a){return SCHEMA_TO_SEMANTIC_RULES['find'](b=>b['element_type']==='field'&&b['type_name']===a);}export function explainOp(a){return SCHEMA_TO_SEMANTIC_RULES['find'](b=>b['element_type']==='op'&&b['type_name']===a);}export function explainImpack(a){return SCHEMA_TO_SEMANTIC_RULES['find'](b=>b['element_type']==='impack'&&b['type_name']==='impack='+a);}export function explainReliesLogic(a){const b=a?'AND\x20(relies_logic_and=true)':'OR\x20(relies_logic_and=false)';return SCHEMA_TO_SEMANTIC_RULES['find'](c=>c['element_type']==='relies_logic'&&c['type_name']===b);}export function getConstraintsByCategory(a){return PASSPORT_CONSTRAINT_RULES['filter'](b=>b['category']===a);}export function explainError(a){const b={[PASSPORT_ERROR_CODES['E_GUARD_COUNT_EXCEEDED']]:'Guard\x20count\x20exceeds\x20MAX_GUARD_COUNT_PASSPORT\x20(20)\x20—\x20remove\x20non-essential\x20Guards\x20or\x20merge\x20similar\x20ones',[PASSPORT_ERROR_CODES['E_RELIES_GUARD_NOT_ADDED']]:'Relied\x20Guard\x20not\x20yet\x20added\x20—\x20add\x20relied\x20Guards\x20in\x20topological\x20order\x20before\x20adding\x20the\x20dependent\x20Guard',[PASSPORT_ERROR_CODES['E_SUBMISSION_SIZE_EXCEEDED']]:'Submission\x20serialized\x20size\x20exceeds\x20MAX_SUBMISSION_SIZE_PASSPORT\x20(256\x20bytes)\x20—\x20use\x20Repository\x20reference\x20for\x20large\x20data',[PASSPORT_ERROR_CODES['E_HAS_VERIFIED']]:'Passport\x20already\x20verified\x20—\x20verify\x20is\x20one-time;\x20create\x20a\x20new\x20Passport\x20to\x20re-verify',[PASSPORT_ERROR_CODES['E_NOT_VERIFIED']]:'result()\x20called\x20before\x20verify()\x20—\x20call\x20verify()\x20first\x20in\x20the\x20same\x20transaction',[PASSPORT_ERROR_CODES['E_NOT_IMPACK_GUARD']]:'result_for_guard\x20called\x20on\x20non-impack\x20Guard\x20—\x20only\x20impack\x20Guards\x20can\x20be\x20hard-verified',[PASSPORT_ERROR_CODES['E_VERIFY_FAILED']]:'result_for_guard\x20/\x20result_for_permission\x20called\x20when\x20overall\x20result=false\x20—\x20fix\x20Guard\x20configuration\x20or\x20submission\x20data',[PASSPORT_ERROR_CODES['E_TX_NOT_MATCH']]:'result()\x20called\x20from\x20a\x20different\x20transaction\x20—\x20Passport\x20is\x20tx_hash-bound,\x20must\x20query\x20in\x20the\x20same\x20tx\x20as\x20verify()',[PASSPORT_ERROR_CODES['E_IMPACK_GUARD_NOT_FOUND']]:'verify()\x20found\x20no\x20impack\x20Guard\x20—\x20at\x20least\x201\x20Guard\x20must\x20have\x20impack=true',[PASSPORT_ERROR_CODES['E_SUBMISSION_NOT_FOUND']]:'submission_get\x20found\x20no\x20entry\x20for\x20(guard,\x20identifier)\x20—\x20check\x20Guard.table[identifier].b_submission=true',[PASSPORT_ERROR_CODES['E_DIGEST_NOT_MATCH']]:'guard_add\x20/\x20verify\x20/\x20guard_clear\x20called\x20from\x20a\x20different\x20transaction\x20—\x20Passport\x20is\x20tx_hash-bound'};return b[a]??'Unknown\x20Passport\x20error\x20code:\x20'+a;}function estimateSubmissionSize(a){switch(a){case'bool':return 0x1;case'u8':return 0x1;case'u64':return 0x8;case'address':return 0x20;case'string':return 0x20;case'vector<u8>':return 0x20;default:return 0x40;}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MAX_PROOF_SIZE,MAX_SERVER_PUBKEY_SIZE,MAX_SERVER_SIGNATURE_SIZE,WOWOK_WTS_PROOF_TYPE}from'@wowok/wowok';const R_PR_1_01={'rule':{'id':'R-PROOF-01','level':'HIGH','category':'structural','title':'proof\x20content\x20exceeds\x20MAX_PROOF_SIZE\x20('+MAX_PROOF_SIZE+'\x20bytes)','description':'The\x20\x27proof\x27\x20string\x20field\x20is\x20bounded\x20by\x20MAX_PROOF_SIZE='+MAX_PROOF_SIZE+'\x20bytes\x20(Move\x20source:\x20proof.move:27).\x20'+'Exceeding\x20this\x20limit\x20aborts\x20with\x20E_MAX_PROOF_SIZE\x20(1).\x20The\x20proof\x20content\x20typically\x20holds\x20a\x20merkle\x20tree\x20root\x20'+'or\x20similar\x20compact\x20cryptographic\x20digest\x20—\x20large\x20data\x20should\x20be\x20stored\x20in\x20a\x20Repository\x20and\x20referenced\x20by\x20address,\x20'+'not\x20inlined\x20into\x20the\x20Proof\x20object.','affected_stakeholders':['creator'],'scenario':'Caller\x20submits\x20a\x20proof\x20string\x20longer\x20than\x2010240\x20bytes','mitigation':'Keep\x20proof\x20content\x20compact\x20(merkle\x20root,\x20hash\x20digest).\x20For\x20larger\x20payloads,\x20store\x20data\x20in\x20a\x20Repository\x20'+'object\x20and\x20set\x20about_address\x20to\x20the\x20Repository\x20address,\x20or\x20use\x20item_count\x20to\x20indicate\x20the\x20off-chain\x20data\x20size.','related_move_error':'E_MAX_PROOF_SIZE\x20(1)','auto_fixable':![]},'check':a=>{if(!a['proof'])return null;if(a['proof']['length']<=MAX_PROOF_SIZE)return null;return{...R_PR_1_01['rule'],'evidence':'proof.length='+a['proof']['length']+',\x20limit='+MAX_PROOF_SIZE};}},R_PR_1_02={'rule':{'id':'R-PROOF-02','level':'MEDIUM','category':'structural','title':'server_pubkey\x20exceeds\x20MAX_SERVER_PUBKEY_SIZE\x20('+MAX_SERVER_PUBKEY_SIZE+'\x20bytes)','description':'The\x20\x27server_pubkey\x27\x20field\x20is\x20bounded\x20by\x20MAX_SERVER_PUBKEY_SIZE='+MAX_SERVER_PUBKEY_SIZE+'\x20bytes\x20(Move\x20source:\x20proof.move:28).\x20'+'Exceeding\x20this\x20limit\x20aborts\x20with\x20E_MAX_SERVER_PUBKEY_SIZE\x20(2).\x20Typical\x20public\x20keys\x20(Ed25519=32\x20bytes,\x20RSA-2048=256\x20bytes,\x20'+'BLS12-381\x20G1=48\x20bytes,\x20G2=96\x20bytes)\x20fit\x20comfortably\x20within\x20this\x20limit.','affected_stakeholders':['creator'],'scenario':'Caller\x20submits\x20an\x20oversized\x20server\x20public\x20key\x20(e.g.\x20certificate\x20chain\x20instead\x20of\x20raw\x20key)','mitigation':'Submit\x20only\x20the\x20raw\x20public\x20key\x20bytes\x20(hex-encoded),\x20not\x20a\x20full\x20certificate\x20or\x20JWK\x20structure.','related_move_error':'E_MAX_SERVER_PUBKEY_SIZE\x20(2)','auto_fixable':![]},'check':a=>{if(!a['server_pubkey'])return null;if(a['server_pubkey']['length']<=MAX_SERVER_PUBKEY_SIZE)return null;return{...R_PR_1_02['rule'],'evidence':'server_pubkey.length='+a['server_pubkey']['length']+',\x20limit='+MAX_SERVER_PUBKEY_SIZE};}},R_PR_1_03={'rule':{'id':'R-PROOF-03','level':'MEDIUM','category':'structural','title':'server_signature\x20exceeds\x20MAX_SERVER_SIGNATURE_SIZE\x20('+MAX_SERVER_SIGNATURE_SIZE+'\x20bytes)','description':'The\x20\x27server_signature\x27\x20field\x20is\x20bounded\x20by\x20MAX_SERVER_SIGNATURE_SIZE='+MAX_SERVER_SIGNATURE_SIZE+'\x20bytes\x20'+'(Move\x20source:\x20proof.move:29).\x20Exceeding\x20this\x20limit\x20aborts\x20with\x20E_MAX_SERVER_SIGNATURE_SIZE\x20(3).\x20'+'Most\x20signature\x20schemes\x20produce\x20signatures\x20well\x20under\x20this\x20limit\x20(Ed25519=64\x20bytes,\x20ECDSA=64-72\x20bytes,\x20'+'BLS12-381=96\x20bytes,\x20RSA-2048=256\x20bytes).','affected_stakeholders':['creator'],'scenario':'Caller\x20submits\x20an\x20oversized\x20signature\x20(e.g.\x20bundled\x20with\x20metadata)','mitigation':'Submit\x20only\x20the\x20raw\x20signature\x20bytes\x20(hex-encoded),\x20not\x20bundled\x20metadata\x20or\x20certificate\x20chains.','related_move_error':'E_MAX_SERVER_SIGNATURE_SIZE\x20(3)','auto_fixable':![]},'check':a=>{if(!a['server_signature'])return null;if(a['server_signature']['length']<=MAX_SERVER_SIGNATURE_SIZE)return null;return{...R_PR_1_03['rule'],'evidence':'server_signature.length='+a['server_signature']['length']+',\x20limit='+MAX_SERVER_SIGNATURE_SIZE};}},R_PR_2_01={'rule':{'id':'R-PROOF-04','level':'MEDIUM','category':'semantic','title':'proof_type\x20in\x20reserved\x20range\x20without\x20authority\x20(1-100\x20reserved\x20for\x20Wowok)','description':'proof_type='+WOWOK_WTS_PROOF_TYPE+'\x20is\x20WOWOK_WTS_PROOF_TYPE\x20(Will-To-Sign).\x20Values\x202-100\x20are\x20reserved\x20for\x20'+'future\x20Wowok-defined\x20proof\x20types.\x20User-defined\x20proof\x20types\x20must\x20use\x20values\x20>\x20100.\x20While\x20the\x20Move\x20contract\x20'+'does\x20not\x20currently\x20enforce\x20this\x20range\x20at\x20the\x20type\x20level\x20(it\x20accepts\x20any\x20u64),\x20using\x20a\x20reserved\x20value\x20without\x20'+'authority\x20creates\x20semantic\x20confusion:\x20consumers\x20may\x20misinterpret\x20the\x20proof\x27s\x20verification\x20rules.','affected_stakeholders':['creator','consumer','verifier'],'scenario':'User\x20creates\x20a\x20custom\x20proof\x20with\x20proof_type=5\x20(a\x20reserved\x20value)','mitigation':'Use\x20proof_type\x20>\x20100\x20for\x20user-defined\x20proof\x20types.\x20Use\x20proof_type=1\x20only\x20for\x20WTS\x20proofs\x20signed\x20by\x20an\x20'+'off-chain\x20server\x20(with\x20server_pubkey\x20+\x20server_signature).\x20Document\x20the\x20verification\x20rule\x20for\x20custom\x20types.','auto_fixable':![]},'check':a=>{if(a['proof_type']===undefined||a['proof_type']===null)return null;const b=typeof a['proof_type']==='string'?BigInt(a['proof_type']):BigInt(a['proof_type']);if(b===BigInt(WOWOK_WTS_PROOF_TYPE)||b>0x64n)return null;return{...R_PR_2_01['rule'],'evidence':'proof_type='+a['proof_type']+'\x20(reserved\x20range\x202-100)'};}},R_PR_2_02={'rule':{'id':'R-PROOF-05','level':'LOW','category':'semantic','title':'about_address\x20not\x20provided\x20—\x20consumers\x20cannot\x20locate\x20the\x20referenced\x20entity','description':'about_address\x20is\x20the\x20on-chain\x20address\x20of\x20the\x20entity\x20being\x20proved\x20(e.g.\x20a\x20user,\x20an\x20order,\x20a\x20Repository).\x20'+'When\x20null/undefined,\x20the\x20Proof\x20has\x20no\x20on-chain\x20binding\x20—\x20it\x20is\x20a\x20free-standing\x20cryptographic\x20statement.\x20'+'Consumers\x20(Repository,\x20Service,\x20etc.)\x20that\x20reference\x20this\x20Proof\x20cannot\x20automatically\x20resolve\x20which\x20entity\x20'+'it\x20applies\x20to.\x20This\x20is\x20acceptable\x20for\x20generic\x20proofs\x20but\x20problematic\x20for\x20entity-bound\x20attestations.','affected_stakeholders':['creator','consumer'],'scenario':'Caller\x20creates\x20a\x20Proof\x20without\x20about_address,\x20then\x20a\x20Repository\x20tries\x20to\x20bind\x20it\x20to\x20a\x20data\x20entry','mitigation':'Set\x20about_address\x20when\x20the\x20Proof\x20attests\x20to\x20a\x20specific\x20on-chain\x20entity.\x20Leave\x20it\x20null\x20only\x20for\x20'+'free-standing\x20cryptographic\x20statements\x20(e.g.\x20a\x20server\x27s\x20timestamp\x20attestation).','auto_fixable':!![]},'check':a=>{if(a['about_address'])return null;return{...R_PR_2_02['rule'],'evidence':'about_address=null/undefined'};}},R_PR_3_01={'rule':{'id':'R-PROOF-06','level':'LOW','category':'lifecycle','title':'description\x20missing\x20—\x20Proof\x20hard\x20to\x20identify\x20in\x20queries\x20and\x20audit\x20logs','description':'description\x20is\x20a\x20REQUIRED\x20field\x20(PF-D-2=A).\x20The\x20Move\x20contract\x20stores\x20it\x20as\x20a\x20String\x20field\x20and\x20SDK\x20'+'passes\x20it\x20to\x20create_wowok_proof.\x20An\x20empty\x20description\x20(\x22\x22)\x20is\x20technically\x20valid\x20but\x20makes\x20the\x20Proof\x20'+'hard\x20to\x20identify\x20in\x20query\x20results\x20and\x20audit\x20logs.\x20Non-empty\x20descriptions\x20are\x20strongly\x20recommended.','affected_stakeholders':['creator','verifier'],'scenario':'Caller\x20passes\x20description=\x22\x22\x20to\x20save\x20typing','mitigation':'Provide\x20a\x20one-line\x20description\x20like\x20\x22KYC\x20attestation\x20for\x20user\x200xabc\x22\x20or\x20\x22merkle\x20root\x20for\x20batch\x20#42\x22.','auto_fixable':![]},'check':a=>{if(a['description']===undefined)return null;if(a['description']['length']>0x0)return null;return{...R_PR_3_01['rule'],'evidence':'description=\x22\x22\x20(empty)'};}},R_PR_3_02={'rule':{'id':'R-PROOF-07','level':'HIGH','category':'lifecycle','title':'Proof\x20is\x20immutable\x20—\x20cannot\x20modify\x20after\x20creation\x20(freeze_object)','description':'Proof\x20is\x20created\x20via\x20transfer::freeze_object(obj)\x20in\x20Move\x20(proof.move:65).\x20Once\x20frozen,\x20the\x20object\x20'+'cannot\x20be\x20modified,\x20transferred,\x20or\x20deleted.\x20All\x20fields\x20(proof,\x20server_pubkey,\x20server_signature,\x20'+'about,\x20proof_type,\x20signer,\x20time,\x20description,\x20item_count)\x20are\x20permanently\x20fixed\x20at\x20the\x20value\x20set\x20'+'during\x20create_wowok_proof().\x20To\x20\x27update\x27\x20a\x20Proof,\x20create\x20a\x20new\x20one\x20and\x20update\x20references.','affected_stakeholders':['creator','consumer'],'scenario':'Caller\x20wants\x20to\x20update\x20server_signature\x20after\x20key\x20rotation\x20—\x20cannot,\x20must\x20create\x20new\x20Proof','mitigation':'Verify\x20all\x20fields\x20before\x20calling\x20create_wowok_proof.\x20For\x20scenarios\x20requiring\x20key\x20rotation,\x20'+'create\x20a\x20new\x20Proof\x20and\x20update\x20the\x20referencing\x20object\x20(Repository\x20data,\x20Service\x20config,\x20etc.)\x20to\x20'+'point\x20to\x20the\x20new\x20Proof\x20address.','auto_fixable':![]},'check':a=>null},R_PR_4_01={'rule':{'id':'R-PROOF-08','level':'INFO','category':'knowledge','title':'Knowledge\x20layer\x20&\x20constant\x20sync\x20—\x20RESOLVED','description':'All\x204\x20Proof\x20constants\x20(WOWOK_WTS_PROOF_TYPE,\x20MAX_PROOF_SIZE,\x20MAX_SERVER_PUBKEY_SIZE,\x20'+'MAX_SERVER_SIGNATURE_SIZE)\x20are\x20now\x20synced\x20to\x20onchain-constants.ts\x20(P-PROOF-P2-5).\x20The\x20MCP\x20Knowledge\x20'+'layer\x20now\x20includes\x20proof-risk.ts,\x20proof-confirm.ts,\x20proof-translation.ts\x20(P-PROOF-P2-6).\x20'+'This\x20risk\x20rule\x20is\x20retained\x20for\x20historical\x20audit\x20and\x20to\x20detect\x20future\x20regressions.','affected_stakeholders':['system'],'scenario':'Future\x20regression:\x20someone\x20removes\x20a\x20Proof\x20constant\x20from\x20onchain-constants.ts','mitigation':'Run\x20the\x20onchain-constants\x20sync\x20test\x20to\x20detect\x20drift.','auto_fixable':![]},'check':a=>{if(a['constants_synced'])return null;return{...R_PR_4_01['rule'],'evidence':'constants_synced=false'};}};export const PROOF_RISK_RULES=[R_PR_1_01,R_PR_1_02,R_PR_1_03,R_PR_2_01,R_PR_2_02,R_PR_3_01,R_PR_3_02,R_PR_4_01];export function checkProofRisks(a){const b=[];for(const c of PROOF_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return!b['find'](e=>e['id']==='R-PROOF-07')&&b['push'](R_PR_3_02['rule']),b;}export function getProofRiskById(a){return PROOF_RISK_RULES['find'](b=>b['rule']['id']===a)?.['rule'];}
|
|
1
|
+
import{MAX_PROOF_SIZE,MAX_SERVER_PUBKEY_SIZE,MAX_SERVER_SIGNATURE_SIZE,WOWOK_WTS_PROOF_TYPE}from'@wowok/wowok';const R_PR_1_01={'rule':{'id':'R-PROOF-01','level':'HIGH','category':'structural','title':'proof\x20content\x20exceeds\x20MAX_PROOF_SIZE\x20('+MAX_PROOF_SIZE+'\x20bytes)','description':'The\x20\x27proof\x27\x20string\x20field\x20is\x20bounded\x20by\x20MAX_PROOF_SIZE='+MAX_PROOF_SIZE+'\x20bytes\x20(Move\x20source:\x20proof.move:27).\x20'+'Exceeding\x20this\x20limit\x20aborts\x20with\x20E_MAX_PROOF_SIZE\x20(1).\x20The\x20proof\x20content\x20typically\x20holds\x20a\x20merkle\x20tree\x20root\x20'+'or\x20similar\x20compact\x20cryptographic\x20digest\x20—\x20large\x20data\x20should\x20be\x20stored\x20in\x20a\x20Repository\x20and\x20referenced\x20by\x20address,\x20'+'not\x20inlined\x20into\x20the\x20Proof\x20object.','affected_stakeholders':['creator'],'scenario':'Caller\x20submits\x20a\x20proof\x20string\x20longer\x20than\x2010240\x20bytes','mitigation':'Keep\x20proof\x20content\x20compact\x20(merkle\x20root,\x20hash\x20digest).\x20For\x20larger\x20payloads,\x20store\x20data\x20in\x20a\x20Repository\x20'+'object\x20and\x20set\x20about_address\x20to\x20the\x20Repository\x20address,\x20or\x20use\x20item_count\x20to\x20indicate\x20the\x20off-chain\x20data\x20size.','related_move_error':'E_MAX_PROOF_SIZE\x20(1)','auto_fixable':![]},'check':a=>{if(!a['proof'])return null;if(a['proof']['length']<=MAX_PROOF_SIZE)return null;return{...R_PR_1_01['rule'],'evidence':'proof.length='+a['proof']['length']+',\x20limit='+MAX_PROOF_SIZE};}},R_PR_1_02={'rule':{'id':'R-PROOF-02','level':'MEDIUM','category':'structural','title':'server_pubkey\x20exceeds\x20MAX_SERVER_PUBKEY_SIZE\x20('+MAX_SERVER_PUBKEY_SIZE+'\x20bytes)','description':'The\x20\x27server_pubkey\x27\x20field\x20is\x20bounded\x20by\x20MAX_SERVER_PUBKEY_SIZE='+MAX_SERVER_PUBKEY_SIZE+'\x20bytes\x20(Move\x20source:\x20proof.move:28).\x20'+'Exceeding\x20this\x20limit\x20aborts\x20with\x20E_MAX_SERVER_PUBKEY_SIZE\x20(2).\x20Typical\x20public\x20keys\x20(Ed25519=32\x20bytes,\x20RSA-2048=256\x20bytes,\x20'+'BLS12-381\x20G1=48\x20bytes,\x20G2=96\x20bytes)\x20fit\x20comfortably\x20within\x20this\x20limit.','affected_stakeholders':['creator'],'scenario':'Caller\x20submits\x20an\x20oversized\x20server\x20public\x20key\x20(e.g.\x20certificate\x20chain\x20instead\x20of\x20raw\x20key)','mitigation':'Submit\x20only\x20the\x20raw\x20public\x20key\x20bytes\x20(hex-encoded),\x20not\x20a\x20full\x20certificate\x20or\x20JWK\x20structure.','related_move_error':'E_MAX_SERVER_PUBKEY_SIZE\x20(2)','auto_fixable':![]},'check':a=>{if(!a['server_pubkey'])return null;if(a['server_pubkey']['length']<=MAX_SERVER_PUBKEY_SIZE)return null;return{...R_PR_1_02['rule'],'evidence':'server_pubkey.length='+a['server_pubkey']['length']+',\x20limit='+MAX_SERVER_PUBKEY_SIZE};}},R_PR_1_03={'rule':{'id':'R-PROOF-03','level':'MEDIUM','category':'structural','title':'server_signature\x20exceeds\x20MAX_SERVER_SIGNATURE_SIZE\x20('+MAX_SERVER_SIGNATURE_SIZE+'\x20bytes)','description':'The\x20\x27server_signature\x27\x20field\x20is\x20bounded\x20by\x20MAX_SERVER_SIGNATURE_SIZE='+MAX_SERVER_SIGNATURE_SIZE+'\x20bytes\x20'+'(Move\x20source:\x20proof.move:29).\x20Exceeding\x20this\x20limit\x20aborts\x20with\x20E_MAX_SERVER_SIGNATURE_SIZE\x20(3).\x20'+'Most\x20signature\x20schemes\x20produce\x20signatures\x20well\x20under\x20this\x20limit\x20(Ed25519=64\x20bytes,\x20ECDSA=64-72\x20bytes,\x20'+'BLS12-381=96\x20bytes,\x20RSA-2048=256\x20bytes).','affected_stakeholders':['creator'],'scenario':'Caller\x20submits\x20an\x20oversized\x20signature\x20(e.g.\x20bundled\x20with\x20metadata)','mitigation':'Submit\x20only\x20the\x20raw\x20signature\x20bytes\x20(hex-encoded),\x20not\x20bundled\x20metadata\x20or\x20certificate\x20chains.','related_move_error':'E_MAX_SERVER_SIGNATURE_SIZE\x20(3)','auto_fixable':![]},'check':a=>{if(!a['server_signature'])return null;if(a['server_signature']['length']<=MAX_SERVER_SIGNATURE_SIZE)return null;return{...R_PR_1_03['rule'],'evidence':'server_signature.length='+a['server_signature']['length']+',\x20limit='+MAX_SERVER_SIGNATURE_SIZE};}},R_PR_2_01={'rule':{'id':'R-PROOF-04','level':'MEDIUM','category':'semantic','title':'proof_type\x20in\x20reserved\x20range\x20without\x20authority\x20(1-100\x20reserved\x20for\x20Wowok)','description':'proof_type='+WOWOK_WTS_PROOF_TYPE+'\x20is\x20WOWOK_WTS_PROOF_TYPE\x20(Will-To-Sign).\x20Values\x202-100\x20are\x20reserved\x20for\x20'+'future\x20Wowok-defined\x20proof\x20types.\x20User-defined\x20proof\x20types\x20must\x20use\x20values\x20>\x20100.\x20While\x20the\x20Move\x20contract\x20'+'does\x20not\x20currently\x20enforce\x20this\x20range\x20at\x20the\x20type\x20level\x20(it\x20accepts\x20any\x20u64),\x20using\x20a\x20reserved\x20value\x20without\x20'+'authority\x20creates\x20semantic\x20confusion:\x20consumers\x20may\x20misinterpret\x20the\x20proof\x27s\x20verification\x20rules.','affected_stakeholders':['creator','consumer','verifier'],'scenario':'User\x20creates\x20a\x20custom\x20proof\x20with\x20proof_type=5\x20(a\x20reserved\x20value)','mitigation':'Use\x20proof_type\x20>\x20100\x20for\x20user-defined\x20proof\x20types.\x20Use\x20proof_type=1\x20only\x20for\x20WTS\x20proofs\x20signed\x20by\x20an\x20'+'off-chain\x20server\x20(with\x20server_pubkey\x20+\x20server_signature).\x20Document\x20the\x20verification\x20rule\x20for\x20custom\x20types.','auto_fixable':![]},'check':a=>{if(a['proof_type']===undefined||a['proof_type']===null)return null;const b=typeof a['proof_type']==='string'?BigInt(a['proof_type']):BigInt(a['proof_type']);if(b===BigInt(WOWOK_WTS_PROOF_TYPE)||b>0x64n)return null;return{...R_PR_2_01['rule'],'evidence':'proof_type='+a['proof_type']+'\x20(reserved\x20range\x202-100)'};}},R_PR_2_02={'rule':{'id':'R-PROOF-05','level':'LOW','category':'semantic','title':'about_address\x20not\x20provided\x20—\x20consumers\x20cannot\x20locate\x20the\x20referenced\x20entity','description':'about_address\x20is\x20the\x20on-chain\x20address\x20of\x20the\x20entity\x20being\x20proved\x20(e.g.\x20a\x20user,\x20an\x20order,\x20a\x20Repository).\x20'+'When\x20null/undefined,\x20the\x20Proof\x20has\x20no\x20on-chain\x20binding\x20—\x20it\x20is\x20a\x20free-standing\x20cryptographic\x20statement.\x20'+'Consumers\x20(Repository,\x20Service,\x20etc.)\x20that\x20reference\x20this\x20Proof\x20cannot\x20automatically\x20resolve\x20which\x20entity\x20'+'it\x20applies\x20to.\x20This\x20is\x20acceptable\x20for\x20generic\x20proofs\x20but\x20problematic\x20for\x20entity-bound\x20attestations.','affected_stakeholders':['creator','consumer'],'scenario':'Caller\x20creates\x20a\x20Proof\x20without\x20about_address,\x20then\x20a\x20Repository\x20tries\x20to\x20bind\x20it\x20to\x20a\x20data\x20entry','mitigation':'Set\x20about_address\x20when\x20the\x20Proof\x20attests\x20to\x20a\x20specific\x20on-chain\x20entity.\x20Leave\x20it\x20null\x20only\x20for\x20'+'free-standing\x20cryptographic\x20statements\x20(e.g.\x20a\x20server\x27s\x20timestamp\x20attestation).','auto_fixable':!![]},'check':a=>{if(a['about_address'])return null;return{...R_PR_2_02['rule'],'evidence':'about_address=null/undefined'};}},R_PR_3_01={'rule':{'id':'R-PROOF-06','level':'LOW','category':'lifecycle','title':'description\x20missing\x20—\x20Proof\x20hard\x20to\x20identify\x20in\x20queries\x20and\x20audit\x20logs','description':'description\x20is\x20a\x20REQUIRED\x20field\x20(PF-D-2=A).\x20The\x20Move\x20contract\x20stores\x20it\x20as\x20a\x20String\x20field\x20and\x20SDK\x20'+'passes\x20it\x20to\x20create_wowok_proof_v2.\x20An\x20empty\x20description\x20(\x22\x22)\x20is\x20technically\x20valid\x20but\x20makes\x20the\x20Proof\x20'+'hard\x20to\x20identify\x20in\x20query\x20results\x20and\x20audit\x20logs.\x20Non-empty\x20descriptions\x20are\x20strongly\x20recommended.','affected_stakeholders':['creator','verifier'],'scenario':'Caller\x20passes\x20description=\x22\x22\x20to\x20save\x20typing','mitigation':'Provide\x20a\x20one-line\x20description\x20like\x20\x22KYC\x20attestation\x20for\x20user\x200xabc\x22\x20or\x20\x22merkle\x20root\x20for\x20batch\x20#42\x22.','auto_fixable':![]},'check':a=>{if(a['description']===undefined)return null;if(a['description']['length']>0x0)return null;return{...R_PR_3_01['rule'],'evidence':'description=\x22\x22\x20(empty)'};}},R_PR_3_02={'rule':{'id':'R-PROOF-07','level':'HIGH','category':'lifecycle','title':'Proof\x20is\x20immutable\x20—\x20cannot\x20modify\x20after\x20creation\x20(freeze_object)','description':'Proof\x20is\x20created\x20via\x20transfer::freeze_object(obj)\x20in\x20Move\x20(proof.move:65).\x20Once\x20frozen,\x20the\x20object\x20'+'cannot\x20be\x20modified,\x20transferred,\x20or\x20deleted.\x20All\x20fields\x20(proof,\x20server_pubkey,\x20server_signature,\x20'+'about,\x20proof_type,\x20signer,\x20time,\x20description,\x20item_count)\x20are\x20permanently\x20fixed\x20at\x20the\x20value\x20set\x20'+'during\x20create_wowok_proof_v2().\x20To\x20\x27update\x27\x20a\x20Proof,\x20create\x20a\x20new\x20one\x20and\x20update\x20references.','affected_stakeholders':['creator','consumer'],'scenario':'Caller\x20wants\x20to\x20update\x20server_signature\x20after\x20key\x20rotation\x20—\x20cannot,\x20must\x20create\x20new\x20Proof','mitigation':'Verify\x20all\x20fields\x20before\x20calling\x20create_wowok_proof_v2.\x20For\x20scenarios\x20requiring\x20key\x20rotation,\x20'+'create\x20a\x20new\x20Proof\x20and\x20update\x20the\x20referencing\x20object\x20(Repository\x20data,\x20Service\x20config,\x20etc.)\x20to\x20'+'point\x20to\x20the\x20new\x20Proof\x20address.','auto_fixable':![]},'check':a=>null},R_PR_4_01={'rule':{'id':'R-PROOF-08','level':'INFO','category':'knowledge','title':'Knowledge\x20layer\x20&\x20constant\x20sync\x20—\x20RESOLVED','description':'All\x204\x20Proof\x20constants\x20(WOWOK_WTS_PROOF_TYPE,\x20MAX_PROOF_SIZE,\x20MAX_SERVER_PUBKEY_SIZE,\x20'+'MAX_SERVER_SIGNATURE_SIZE)\x20are\x20now\x20synced\x20to\x20onchain-constants.ts\x20(P-PROOF-P2-5).\x20The\x20MCP\x20Knowledge\x20'+'layer\x20now\x20includes\x20proof-risk.ts,\x20proof-confirm.ts,\x20proof-translation.ts\x20(P-PROOF-P2-6).\x20'+'This\x20risk\x20rule\x20is\x20retained\x20for\x20historical\x20audit\x20and\x20to\x20detect\x20future\x20regressions.','affected_stakeholders':['system'],'scenario':'Future\x20regression:\x20someone\x20removes\x20a\x20Proof\x20constant\x20from\x20onchain-constants.ts','mitigation':'Run\x20the\x20onchain-constants\x20sync\x20test\x20to\x20detect\x20drift.','auto_fixable':![]},'check':a=>{if(a['constants_synced'])return null;return{...R_PR_4_01['rule'],'evidence':'constants_synced=false'};}};export const PROOF_RISK_RULES=[R_PR_1_01,R_PR_1_02,R_PR_1_03,R_PR_2_01,R_PR_2_02,R_PR_3_01,R_PR_3_02,R_PR_4_01];export function checkProofRisks(a){const b=[];for(const c of PROOF_RISK_RULES){const d=c['check'](a);if(d)b['push'](d);}return!b['find'](e=>e['id']==='R-PROOF-07')&&b['push'](R_PR_3_02['rule']),b;}export function getProofRiskById(a){return PROOF_RISK_RULES['find'](b=>b['rule']['id']===a)?.['rule'];}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type RewardScene, type RewardAmountType } from "./reward-ledger.js";
|
|
2
2
|
export type RewardRiskLevel = "CRITICAL" | "HIGH" | "MEDIUM" | "LOW";
|
|
3
|
-
export type RewardRiskCategory = "structural" | "semantic" | "permission" | "lifecycle" | "cross_object" | "business_semantic";
|
|
3
|
+
export type RewardRiskCategory = "structural" | "semantic" | "permission" | "lifecycle" | "cross_object" | "business_semantic" | "fund_recovery";
|
|
4
4
|
export interface RewardRisk {
|
|
5
5
|
id: string;
|
|
6
6
|
level: RewardRiskLevel;
|
|
@@ -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_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':![]};}},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_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];export const REWARD_RISK_VERSION='1.0.0';export function getAllRewardRiskRules(){return[...ALL_RULES];}export function getRewardRiskRulesCount(){return ALL_RULES['length'];}export function getRewardRiskRulesByCategory(a){return ALL_RULES['filter'](b=>b['category']===a);}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')};}export const REWARD_STAKEHOLDERS=['owner','claimer','service_provider','system'];export function getRewardRiskRulesByStakeholder(a){return ALL_RULES['filter'](b=>{if(a==='owner')return['structural','permission','lifecycle','business_semantic']['includes'](b['category']);if(a==='claimer')return b['id']['startsWith']('R-R-4-0')||b['id']==='R-R-5-01'||b['id']==='R-R-1-02'||b['id']==='R-R-6-01';if(a==='service_provider')return b['id']==='R-R-4-02'||b['id']==='R-R-3-01'||b['id']==='R-R-3-02'||b['id']==='R-R-6-01';if(a==='system')return b['category']==='cross_object';return![];});}
|
|
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_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_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.0.0';export function getAllRewardRiskRules(){return[...ALL_RULES];}export function getRewardRiskRulesCount(){return ALL_RULES['length'];}export function getRewardRiskRulesByCategory(a){return ALL_RULES['filter'](b=>b['category']===a);}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')};}export const REWARD_STAKEHOLDERS=['owner','claimer','service_provider','system'];export function getRewardRiskRulesByStakeholder(a){return ALL_RULES['filter'](b=>{if(a==='owner')return['structural','permission','lifecycle','business_semantic']['includes'](b['category']);if(a==='claimer')return b['id']['startsWith']('R-R-4-0')||b['id']==='R-R-5-01'||b['id']==='R-R-1-02'||b['id']==='R-R-6-01';if(a==='service_provider')return b['id']==='R-R-4-02'||b['id']==='R-R-3-01'||b['id']==='R-R-3-02'||b['id']==='R-R-6-01';if(a==='system')return b['category']==='cross_object';return![];});}
|
|
@@ -30,8 +30,9 @@ export declare const DEFAULT_VALUE_WARNINGS: {
|
|
|
30
30
|
};
|
|
31
31
|
export declare const DEFAULT_AMOUNT_THRESHOLD: bigint;
|
|
32
32
|
export declare function getAmountThreshold(): bigint;
|
|
33
|
-
export declare function formatAmount(value: string | bigint
|
|
33
|
+
export declare function formatAmount(value: string | bigint): string;
|
|
34
34
|
export declare function collectDefaultWarnings(env: any, data: any): string[];
|
|
35
|
+
export declare const BRIDGE_FUND_OPERATION_TYPES: readonly string[];
|
|
35
36
|
export declare const CONFIRMATION_RULES: ConfirmationRule[];
|
|
36
37
|
export declare function resolveOverrideId(rule_id: string, operation_type: string): string | undefined;
|
|
37
38
|
export declare function extractAmount(data: any): string | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export const DEFAULT_VALUE_WARNINGS={'defaultAccount':'Using\x20default\x20account\x20(env.account=\x22\x22)','mainnet':'Operating\x20on\x20mainnet\x20—\x20irreversible','replaceExistName':'replaceExistName=true\x20will\x20unbind\x20the\x20existing\x20name\x20(breaking\x20refs)','defaultToken':'Using\x20default\x20token\x200x2::wow::WOW'};export const DEFAULT_AMOUNT_THRESHOLD=BigInt(0x174876e800);export function getAmountThreshold(){const a=process['env']['WOWOK_AMOUNT_THRESHOLD'];if(!a)return DEFAULT_AMOUNT_THRESHOLD;try{return BigInt(a);}catch{return DEFAULT_AMOUNT_THRESHOLD;}}const WOW_PRECISION=0x3b9aca00n;export function formatAmount(a,b=WOW_PRECISION){const c=typeof a==='string'?BigInt(a):a,d=c/b,e=c%b;if(e===0x0n)return''+d['toString']();const f=e['toString']()['padStart'](Number(b['toString']()['length'])-0x1,'0');return d['toString']()+'.'+f;}export function collectDefaultWarnings(a,b){const c=[],d=a?.['account'];(d===undefined||d==='')&&c['push'](DEFAULT_VALUE_WARNINGS['defaultAccount']);const e=a?.['network'];e&&/mainnet/i['test'](String(e))&&c['push'](DEFAULT_VALUE_WARNINGS['mainnet']);const f=b?.['namedNew']??b?.['object'];return f&&typeof f==='object'&&f['replaceExistName']===!![]&&c['push'](DEFAULT_VALUE_WARNINGS['replaceExistName']),c;}export const CONFIRMATION_RULES=[{'id':'irreversible_fund_or_verdict','when':(a,b,c)=>{if(a==='payment')return!![];if(a==='arbitration'&&b?.['arbitration']!==undefined)return!![];if(a==='treasury'){if(b?.['withdraw']||b?.['owner_receive'])return!![];if(b?.['external_withdraw']||b?.['external_deposit'])return!![];return![];}return![];},'level':'irreversible','preview':(a,b,c)=>({'level':'irreversible','operation':a,'irreversible':!![],'network':c?.['network'],'account':c?.['account']??'','warnings':collectDefaultWarnings(c,b),'amount':a==='payment'&&b?.['amount']?{'value':String(b['amount']['amount']??b['amount']['balance']??''),'token':b?.['token_type']??'0x2::wow::WOW','human_readable':formatAmount(String(b['amount']['amount']??b['amount']['balance']??'0')),'recipient':b?.['to']??b?.['recipient']}:undefined}),'bypass_on_explicit_intent':[]},{'id':'publish_immutable','when':(a,b,c)=>{if(a==='service'&&(b?.['publish']===!![]||b?.['bPublished']===!![]))return!![];if(a==='machine'&&b?.['publish']===!![])return!![];return![];},'level':'publish','preview':(a,b,c)=>({'level':'publish','operation':a,'object':b?.['object']??b?.['namedNew']?.['name'],'network':c?.['network'],'account':c?.['account']??'','immutable_after':a==='service'?['machine','order_allocators']:['nodes','pairs','forwards'],'warnings':collectDefaultWarnings(c,b)}),'bypass_on_explicit_intent':['force\x20publish','publish\x20now']},{'id':'amount_sensitive','when':(a,b,c)=>{const d=extractAmount(b);if(d===null)return![];if(a==='reward'||a==='treasury')return!![];if(a==='service'&&b?.['compensation_fund_add'])return!![];return![];},'level':'amount','preview':(a,b,c)=>{const d=extractAmount(b);return{'level':'amount','operation':a,'object':b?.['object']??b?.['namedNew']?.['name'],'network':c?.['network'],'account':c?.['account']??'','amount':d?{'value':d,'token':b?.['token_type']??'0x2::wow::WOW','human_readable':formatAmount(d)}:undefined,'warnings':collectDefaultWarnings(c,b)};},'bypass_on_explicit_intent':[]},{'id':'default_values','when':(a,b,c)=>{return collectDefaultWarnings(c,b)['length']>0x0;},'level':'standard','preview':(a,b,c)=>({'level':'standard','operation':a,'object':b?.['object']??b?.['namedNew']?.['name'],'network':c?.['network'],'account':c?.['account']??'','warnings':collectDefaultWarnings(c,b)}),'bypass_on_explicit_intent':['use\x20default\x20account','default\x20account\x20is\x20fine','use\x20the\x20default\x20account','default\x20account\x20works\x20fine']},{'id':'guard_create_immutable','when':(a,b,c)=>{if(a==='guard')return!![];return![];},'level':'irreversible','preview':(a,b,c)=>{const d=b?.['table']??[],e=b?.['root'],f=b?.['rely'],g=typeof e==='object'&&e!==null&&'type'in e?e['type']:typeof e==='object'&&e!==null&&'type'in e&&e['type']==='file'?'file':'unknown',h=['table','root'];if(f)h['push']('rely');return{'level':'irreversible','operation':a,'object':b?.['namedNew']?.['name'],'network':c?.['network'],'account':c?.['account']??'','immutable_after':h,'irreversible':!![],'warnings':[...collectDefaultWarnings(c,b),'Guard\x20is\x20CREATE-only\x20and\x20immutable\x20—\x20cannot\x20be\x20edited\x20or\x20deleted\x20after\x20creation','Table\x20entries:\x20'+d['length']+'\x20(max\x20256)','Root\x20node\x20type:\x20'+g+'\x20(must\x20return\x20Bool)',...f?['Rely\x20dependencies:\x20'+(f['guards']?.['length']??0x0)+'\x20(max\x204,\x20AND/OR\x20logic)']:[],'To\x20modify\x20later:\x20export\x20via\x20guard2file\x20→\x20edit\x20→\x20CREATE\x20new\x20→\x20rebind']};},'bypass_on_explicit_intent':[]},{'id':'guard_gen_passport_test','when':(a,b,c)=>{if(a==='gen_passport')return!![];return![];},'level':'standard','preview':(a,b,c)=>({'level':'standard','operation':a,'object':b?.['guard'],'network':c?.['network'],'account':c?.['account']??'','warnings':[...collectDefaultWarnings(c,b),'gen_passport\x20will\x20consume\x20gas\x20for\x20static\x20testing']}),'bypass_on_explicit_intent':['test\x20guard','testing\x20guard','gen\x20passport','generate\x20passport']},{'id':'progress_advance','when':(a,b,c)=>{if(a!=='progress')return![];return b?.['operate']?.['op']==='next';},'level':'standard','preview':(a,b,c)=>({'level':'standard','operation':a,'object':b?.['object'],'network':c?.['network'],'account':c?.['account']??'','warnings':[...collectDefaultWarnings(c,b),'Advancing\x20the\x20progress\x20node\x20may\x20release\x20funds\x20per\x20the\x20machine\x20allocation']}),'bypass_on_explicit_intent':[]}];export function resolveOverrideId(a,b){if(a==='publish_immutable'){if(b==='service')return'service.publish';if(b==='machine')return'machine.publish';return undefined;}if(a==='progress_advance')return'node.advance';return undefined;}export function extractAmount(a){if(!a)return null;const b=[a?.['amount']?.['amount'],a?.['amount']?.['balance'],a?.['balance'],a?.['amount'],a?.['compensation_fund_add'],a?.['deposit']?.['coin']?.['balance'],typeof a?.['deposit']?.['coin']?.['coin']==='string'?undefined:a?.['deposit']?.['coin']?.['coin']?.['balance']];for(const d of b){if(d!==undefined&&d!==null&&d!=='')return String(d);}return null;}export const OBJECT_REUSE_RULES=[{'rule_id':'REUSE-001','object_type':'permission','recommendation':'strongly_recommended','reason':'Centralized\x20permission\x20control\x20across\x20all\x20services','ask_user':'Do\x20you\x20have\x20an\x20existing\x20Permission\x20to\x20reuse?\x20Provide\x20the\x20name\x20or\x20ID.'},{'rule_id':'REUSE-002','object_type':'machine','recommendation':'recommended','reason':'Save\x20design\x20time\x20for\x20similar\x20processes','ask_user':'Do\x20you\x20have\x20an\x20existing\x20Machine\x20whose\x20workflow\x20fits?\x20Provide\x20the\x20name\x20or\x20ID.'},{'rule_id':'REUSE-003','object_type':'guard','recommendation':'recommended','reason':'Avoid\x20redundant\x20validation\x20rules','ask_user':'Do\x20you\x20have\x20an\x20existing\x20Guard\x20with\x20matching\x20validation\x20logic?\x20Provide\x20the\x20name\x20or\x20ID.'},{'rule_id':'REUSE-004','object_type':'contact','recommendation':'recommended','reason':'Single\x20point\x20of\x20customer-service\x20management','ask_user':'Do\x20you\x20have\x20an\x20existing\x20Contact\x20for\x20customer\x20service?\x20Provide\x20the\x20name\x20or\x20ID.'},{'rule_id':'REUSE-005','object_type':'arbitration','recommendation':'always_reuse','reason':'Customers\x20choose\x20from\x20established\x20arbiters;\x20creating\x20a\x20new\x20Arbitration\x20is\x20an\x20operator-level\x20decision','ask_user':'Which\x20existing\x20Arbitration\x20service\x20should\x20disputes\x20route\x20to?\x20Provide\x20the\x20name\x20or\x20ID.'}];export const CREATE_VS_MODIFY_PATTERN={'reuse_form':'string','create_form':'object','resolution_api':'GetObjectExisted','note':'String\x20reference\x20=\x20REUSE\x20(name\x20resolution\x20failure\x20is\x20a\x20hard\x20error);\x20object\x20shape\x20=\x20CREATE\x20(always).'};export const IMMUTABILITY_RULES=[{'rule_id':'IMMUT-001','object_type':'machine','trigger':'publish','immutable_fields':['nodes','pairs','forwards'],'message':'Machine\x20topology\x20is\x20immutable\x20after\x20publish\x20—\x20verify\x20all\x20nodes/forwards\x20via\x20machineNode2file\x20BEFORE\x20publishing'},{'rule_id':'IMMUT-002','object_type':'service','trigger':'publish','immutable_fields':['machine','order_allocators','arbitrations'],'mutable_after':['sales'],'message':'Service.machine,\x20order_allocators\x20and\x20arbitrations\x20are\x20frozen\x20after\x20publish;\x20sales\x20remains\x20fully\x20modifiable\x20(L3)\x20without\x20pause'},{'rule_id':'IMMUT-003','object_type':'guard','trigger':'create','immutable_fields':['table','root','rely'],'message':'Guard\x20is\x20CREATE-only\x20and\x20immutable\x20—\x20cannot\x20be\x20edited\x20or\x20deleted\x20after\x20creation.\x20To\x20change:\x20export\x20via\x20guard2file\x20→\x20edit\x20→\x20CREATE\x20new\x20→\x20rebind'}];export const OPERATION_TYPE_CLASSIFICATION={'LOCAL_ONLY':['account_operation','local_mark_operation','local_info_operation','project_operation','config_operation'],'ONCHAIN':['onchain_operations','wip_file','bridge_operation','messenger_operation'],'QUERY':['query_toolkit','onchain_table_data','onchain_events','guard2file','machineNode2file','schema_query','wowok_buildin_info','trust_score'],'ENCRYPTED':['messenger_operation']};export const OPERATION_CLASS_META={'LOCAL_ONLY':{'gas':![],'confirmation_required':![],'note':'Local\x20state\x20only\x20—\x20no\x20gas,\x20no\x20confirmation\x20needed'},'ONCHAIN':{'gas':!![],'confirmation_required':!![],'note':'On-chain\x20write\x20—\x20gas\x20consumed,\x20explicit\x20user\x20confirmation\x20REQUIRED\x20before\x20execution'},'QUERY':{'gas':![],'confirmation_required':![],'note':'Read-only\x20—\x20no\x20gas,\x20no\x20confirmation\x20needed'},'ENCRYPTED':{'gas':![],'confirmation_required':![],'note':'Local\x20encryption\x20—\x20no\x20gas,\x20no\x20confirmation\x20needed'}};export function classifyTool(a){if(OPERATION_TYPE_CLASSIFICATION['ENCRYPTED']['includes'](a))return'ENCRYPTED';for(const b of['LOCAL_ONLY','ONCHAIN','QUERY']){if(OPERATION_TYPE_CLASSIFICATION[b]['includes'](a))return b;}return undefined;}export const NAMING_CONVENTIONS={'scheme':'<projectPrefix>_<type>_<purpose>_<version>','parts':{'project_prefix':{'example':'shopFunny_','purpose':'Prevents\x20cross-project\x20collisions'},'type_prefix':{'example':'machine_\x20/\x20guard_\x20/\x20service_','purpose':'Clarifies\x20object\x20type'},'purpose_suffix':{'example':'serviceWithdraw','purpose':'Describes\x20function'},'version_suffix':{'example':'_v2','purpose':'Enables\x20iteration\x20without\x20replaceExistName'}},'entry_id':{'pattern':'^<object_type>:<name>$','example':'service:myshop_service'},'replace_exist_name':{'default':![],'false_effect':'Throws\x20error\x20if\x20name\x20is\x20in\x20use\x20—\x20safe\x20default','true_effect':'Existing\x20object/account\x20with\x20the\x20same\x20name\x20is\x20suspended/unbound\x20to\x20free\x20the\x20name','account_default_forbidden':'replaceExistName:true\x20on\x20the\x20default\x20account\x20(name=\x27\x27)\x20is\x20FORBIDDEN\x20—\x20use\x20suspend()\x20explicitly','recommendation':'DISCOURAGED\x20—\x20prefer\x20versioned\x20names\x20(_v1,\x20_v2)\x20for\x20production'},'recommendations':['Always\x20provide\x20tags\x20on\x20object\x20creation\x20for\x20filtering\x20and\x20management','Use\x20names\x20as\x20primary\x20identifiers;\x20use\x20short\x20address\x20form\x20(0x1234...def)\x20only\x20for\x20display','All\x20cross-object\x20references\x20(Guard\x20tables,\x20Service\x20bindings,\x20Machine\x20forwards)\x20use\x20NAMES\x20—\x20resolved\x20per-network\x20at\x20build\x20time']};export function checkObjectReuseRules(a){const b=[];for(const c of a){if(!c['is_new'])continue;const d=OBJECT_REUSE_RULES['find'](e=>e['object_type']===c['object_type']);if(!d)continue;(d['recommendation']==='always_reuse'||d['recommendation']==='strongly_recommended')&&b['push']({'rule_id':d['rule_id'],'severity':d['recommendation']==='always_reuse'?'warn':'info','message':'Creating\x20NEW\x20'+c['object_type']+(c['name']?'\x20\x22'+c['name']+'\x22':'')+'\x20—\x20reuse\x20is\x20'+d['recommendation']+':\x20'+d['reason']+'.\x20'+d['ask_user']});}return b;}export function checkImmutabilityRules(a){const b=[];for(const c of a){const d=IMMUTABILITY_RULES['find'](e=>e['object_type']===c['object_type']&&e['trigger']===c['trigger']);if(!d)continue;b['push']({'rule_id':d['rule_id'],'severity':'warn','message':''+c['object_type']+(c['name']?'\x20\x22'+c['name']+'\x22':'')+'\x20'+c['trigger']+':\x20'+d['message']+'.\x20Immutable:\x20['+d['immutable_fields']['join'](',\x20')+']'+(d['mutable_after']?'.\x20Still\x20mutable:\x20['+d['mutable_after']['join'](',\x20')+']':'')});}return b;}export const SAFETY_RULES_VERSION=0x2;
|
|
1
|
+
import{formatMist,GasTokenType,MAINNET_BRIDGE_CONFIG,formatUnits}from'@wowok/wowok';export const DEFAULT_VALUE_WARNINGS={'defaultAccount':'Using\x20default\x20account\x20(env.account=\x22\x22)','mainnet':'Operating\x20on\x20mainnet\x20—\x20irreversible','replaceExistName':'replaceExistName=true\x20will\x20unbind\x20the\x20existing\x20name\x20(breaking\x20refs)','defaultToken':'Using\x20default\x20token\x200x2::wow::WOW'};export const DEFAULT_AMOUNT_THRESHOLD=BigInt(0x174876e800);export function getAmountThreshold(){const a=process['env']['WOWOK_AMOUNT_THRESHOLD'];if(!a)return DEFAULT_AMOUNT_THRESHOLD;try{return BigInt(a);}catch{return DEFAULT_AMOUNT_THRESHOLD;}}export function formatAmount(a){return formatMist(a);}function bestEffortTokenType(a){return a?.['object']?.['type_parameter']??a?.['type_parameter'];}function describeAmount(a,b){if(!b||b===GasTokenType)return formatMist(a);return a+'\x20raw\x20smallest\x20units\x20of\x20'+b;}export function collectDefaultWarnings(a,b){const c=[],d=a?.['account'];(d===undefined||d==='')&&c['push'](DEFAULT_VALUE_WARNINGS['defaultAccount']);const e=a?.['network'];e&&/mainnet/i['test'](String(e))&&c['push'](DEFAULT_VALUE_WARNINGS['mainnet']);const f=b?.['namedNew']??b?.['object'];return f&&typeof f==='object'&&f['replaceExistName']===!![]&&c['push'](DEFAULT_VALUE_WARNINGS['replaceExistName']),c;}export const BRIDGE_FUND_OPERATION_TYPES=['cross_chain_wow_to_evm','cross_chain_evm_to_wow','claim_wow_to_evm','resume_transfer','withdraw'];function describeBridgeAmount(a,b,c){if(b==='WOW'||!b&&c==='wow_to_evm')return formatMist(a);const d=MAINNET_BRIDGE_CONFIG?.['tokens']?.['find'](f=>f['symbol']?.['toUpperCase']()===b?.['toUpperCase']()),e=d?c==='wow_to_evm'?d['wowDecimals']:d['evmDecimals']:undefined;if(e===undefined)return a+'\x20raw\x20smallest\x20units\x20of\x20'+(b??'the\x20bridge\x20token');try{return formatUnits(BigInt(a),e)+'\x20'+b;}catch{return a+'\x20raw\x20smallest\x20units\x20of\x20'+b;}}export const CONFIRMATION_RULES=[{'id':'bridge_fund_movement','when':(a,b,c)=>BRIDGE_FUND_OPERATION_TYPES['includes'](a),'level':'irreversible','preview':(a,b,c)=>{const d=typeof b?.['amount']==='string'?b['amount']:undefined,e=typeof b?.['token']==='string'?b['token']:undefined,f=b?.['withdrawTo']??b?.['recipientWowAddress']??b?.['to']??(a==='claim_wow_to_evm'||a==='resume_transfer'?b?.['transferId']:undefined),g=a==='cross_chain_wow_to_evm'?'wow_to_evm':'evm_side';return{'level':'irreversible','operation':a,'irreversible':!![],'network':c?.['network']??'mainnet','account':c?.['account']??'','amount':d!==undefined?{'value':d,'token':e??(g==='wow_to_evm'?GasTokenType:'ETH'),'human_readable':describeBridgeAmount(d,e,g),'recipient':f}:undefined,'warnings':[...collectDefaultWarnings(c,b),a==='withdraw'?'EVM\x20withdrawal\x20from\x20activeEvmAccount\x20—\x20funds\x20move\x20to\x20an\x20external\x20EVM\x20address;\x20irreversible.':'Cross-chain\x20bridge\x20transfer\x20—\x20funds\x20leave\x20the\x20source\x20chain;\x20recovery\x20(if\x20any)\x20requires\x20the\x20opposite-side\x20claim\x20or\x20resume_transfer,\x20never\x20a\x20rollback.']};},'bypass_on_explicit_intent':[]},{'id':'irreversible_fund_or_verdict','when':(a,b,c)=>{if(a==='payment')return!![];if(a==='arbitration'&&b?.['arbitration']!==undefined)return!![];if(b?.['receive']!==undefined||b?.['owner_receive']!==undefined||b?.['received_coins']!==undefined||b?.['compensation_fund_receive']!==undefined)return!![];if(b?.['alloc_by_guard']!==undefined)return!![];if(a==='reward'&&b?.['claim']!==undefined)return!![];if(a==='service'&&b?.['compensation_fund_withdraw']!==undefined)return!![];if(a==='order'&&b?.['arb_claim_compensation']!==undefined)return!![];if(a==='arbitration'&&(b?.['arb_withdraw']!==undefined||b?.['fees_transfer']!==undefined))return!![];if(a==='treasury'){if(b?.['withdraw'])return!![];return![];}return![];},'level':'irreversible','preview':(a,b,c)=>{let d;if(a==='payment'&&Array['isArray'](b?.['revenue'])&&b['revenue']['length']>0x0){const f=b['revenue']['find'](g=>typeof g?.['amount']?.['balance']==='string'||typeof g?.['amount']?.['balance']==='number');if(f){const g=String(f['amount']['balance']);d={'value':g,'human_readable':describeAmount(g,bestEffortTokenType(b))};}else d={'value':'','human_readable':'entire\x20Coin\x20object(s)\x20(amount\x20resolved\x20by\x20the\x20fund\x20layer)'};}const e=[];return a==='reward'&&b?.['claim']!==undefined&&e['push']('Reward\x20claim\x20—\x20Guard-verified\x20payout\x20splits\x20the\x20pool\x20balance\x20and\x20transfers\x20coins\x20to\x20the\x20claimer;\x20the\x20exact\x20amount\x20is\x20determined\x20by\x20the\x20Reward\x27s\x20guard\x20config.'),a==='service'&&b?.['compensation_fund_withdraw']!==undefined&&e['push']('Compensation\x20fund\x20withdraw\x20—\x20withdraws\x20the\x20ENTIRE\x20compensation_fund\x20into\x20a\x20new\x20Payment\x20owned\x20by\x20\x27'+(b['compensation_fund_withdraw']?.['receipt']??'(recipient)')+'\x27.'),a==='order'&&b?.['arb_claim_compensation']!==undefined&&e['push']('Order\x20compensation\x20claim\x20—\x20splits\x20the\x20Service\x27s\x20compensation_fund\x20and\x20transfers\x20the\x20awarded\x20coins\x20to\x20the\x20caller;\x20irreversible.'),a==='arbitration'&&b?.['arb_withdraw']!==undefined&&e['push']('Arb\x20fee\x20withdraw\x20—\x20sweeps\x20the\x20Arb\x27s\x20fee\x20balance\x20into\x20the\x20Arbitration\x20object\x27s\x20balance.'),a==='arbitration'&&b?.['fees_transfer']!==undefined&&e['push']('Arbitration\x20fees\x20transfer\x20—\x20withdraws\x20the\x20ENTIRE\x20Arbitration\x20balance\x20into\x20a\x20new\x20Payment\x20for\x20the\x20target\x20Allocation/Treasury;\x20irreversible.'),{'level':'irreversible','operation':a,'irreversible':!![],'network':c?.['network'],'account':c?.['account']??'','warnings':[...collectDefaultWarnings(c,b),...e],'amount':a==='payment'&&d?{...d,'token':bestEffortTokenType(b)??GasTokenType,'recipient':b?.['revenue']?.[0x0]?.['recipient']}:undefined};},'bypass_on_explicit_intent':[]},{'id':'publish_immutable','when':(a,b,c)=>{if(a==='service'&&(b?.['publish']===!![]||b?.['bPublished']===!![]))return!![];if(a==='machine'&&b?.['publish']===!![])return!![];return![];},'level':'publish','preview':(a,b,c)=>({'level':'publish','operation':a,'object':b?.['object']??b?.['namedNew']?.['name'],'network':c?.['network'],'account':c?.['account']??'','immutable_after':a==='service'?['machine','order_allocators']:['nodes','pairs','forwards'],'warnings':collectDefaultWarnings(c,b)}),'bypass_on_explicit_intent':['force\x20publish','publish\x20now']},{'id':'amount_sensitive','when':(a,b,c)=>{if(extractAmount(b)!==null)return!![];if(a==='service'&&b?.['order_new'])return!![];if(a==='treasury'&&b?.['deposit']?.['coin']?.['coin'])return!![];if(a==='reward'&&b?.['coin_add']?.['coin'])return!![];if(a==='allocation'&&b?.['coin']?.['coin'])return!![];return![];},'level':'amount','preview':(a,b,c)=>{const d=extractAmount(b),e=bestEffortTokenType(b);return{'level':'amount','operation':a,'object':b?.['object']??b?.['namedNew']?.['name'],'network':c?.['network'],'account':c?.['account']??'','amount':d?{'value':d,'token':e??GasTokenType,'human_readable':describeAmount(d,e)}:{'value':'','token':e??GasTokenType,'human_readable':'entire\x20Coin\x20object\x20(amount\x20resolved\x20on-chain)'},'warnings':collectDefaultWarnings(c,b)};},'bypass_on_explicit_intent':[]},{'id':'default_values','when':(a,b,c)=>{return collectDefaultWarnings(c,b)['length']>0x0;},'level':'standard','preview':(a,b,c)=>({'level':'standard','operation':a,'object':b?.['object']??b?.['namedNew']?.['name'],'network':c?.['network'],'account':c?.['account']??'','warnings':collectDefaultWarnings(c,b)}),'bypass_on_explicit_intent':['use\x20default\x20account','default\x20account\x20is\x20fine','use\x20the\x20default\x20account','default\x20account\x20works\x20fine']},{'id':'guard_create_immutable','when':(a,b,c)=>{if(a==='guard')return!![];return![];},'level':'irreversible','preview':(a,b,c)=>{const d=b?.['table']??[],e=b?.['root'],f=b?.['rely'],g=typeof e==='object'&&e!==null&&'type'in e?e['type']:typeof e==='object'&&e!==null&&'type'in e&&e['type']==='file'?'file':'unknown',h=['table','root'];if(f)h['push']('rely');return{'level':'irreversible','operation':a,'object':b?.['namedNew']?.['name'],'network':c?.['network'],'account':c?.['account']??'','immutable_after':h,'irreversible':!![],'warnings':[...collectDefaultWarnings(c,b),'Guard\x20is\x20CREATE-only\x20and\x20immutable\x20—\x20cannot\x20be\x20edited\x20or\x20deleted\x20after\x20creation','Table\x20entries:\x20'+d['length']+'\x20(max\x20256)','Root\x20node\x20type:\x20'+g+'\x20(must\x20return\x20Bool)',...f?['Rely\x20dependencies:\x20'+(f['guards']?.['length']??0x0)+'\x20(max\x204,\x20AND/OR\x20logic)']:[],'To\x20modify\x20later:\x20export\x20via\x20guard2file\x20→\x20edit\x20→\x20CREATE\x20new\x20→\x20rebind']};},'bypass_on_explicit_intent':[]},{'id':'guard_gen_passport_test','when':(a,b,c)=>{if(a==='gen_passport')return!![];return![];},'level':'standard','preview':(a,b,c)=>({'level':'standard','operation':a,'object':b?.['guard'],'network':c?.['network'],'account':c?.['account']??'','warnings':[...collectDefaultWarnings(c,b),'gen_passport\x20will\x20consume\x20gas\x20for\x20static\x20testing']}),'bypass_on_explicit_intent':['test\x20guard','testing\x20guard','gen\x20passport','generate\x20passport']},{'id':'progress_advance','when':(a,b,c)=>{if(a!=='progress')return![];return b?.['operate']?.['op']==='next'||b?.['owner_receive']!==undefined;},'level':'standard','preview':(a,b,c)=>({'level':'standard','operation':a,'object':b?.['object'],'network':c?.['network'],'account':c?.['account']??'','warnings':[...collectDefaultWarnings(c,b),'Advancing\x20the\x20progress\x20node\x20may\x20release\x20funds\x20per\x20the\x20machine\x20allocation']}),'bypass_on_explicit_intent':[]}];export function resolveOverrideId(a,b){if(a==='publish_immutable'){if(b==='service')return'service.publish';if(b==='machine')return'machine.publish';return undefined;}if(a==='progress_advance')return'node.advance';return undefined;}export function extractAmount(a){if(!a)return null;const b=e=>{if(typeof e==='number')return String(e);if(typeof e==='string'&&e!=='')return e;return null;},d=[a?.['balance'],a?.['amount'],a?.['compensation_fund_add']?.['balance'],a?.['coin_add']?.['balance'],a?.['coin']?.['balance'],a?.['order_new']?.['buy']?.['total_pay']?.['balance'],a?.['dispute']?.['fee']?.['balance'],a?.['fee'],a?.['arbitration']?.['indemnity'],a?.['revenue']?.[0x0]?.['amount']?.['balance'],a?.['deposit']?.['coin']?.['balance'],a?.['withdraw']?.['amount']?.['fixed']];for(const e of d){const f=b(e);if(f!==null)return f;}if(Array['isArray'](a?.['guard_add']))for(const h of a['guard_add']){if(h?.['amount']?.['type']==='Fixed'){const i=b(h['amount']['value']);if(i!==null)return i;}}for(const j of[a?.['allocators'],a?.['order_allocators']]){if(!j||typeof j!=='object')continue;const k=b(j['threshold']);if(k!==null)return k;for(const l of Array['isArray'](j['allocators'])?j['allocators']:[]){if(Array['isArray'](l?.['sharing']))for(const n of l['sharing']){if(n?.['mode']==='Amount'){const o=b(n['sharing']);if(o!==null)return o;}}const m=b(l?.['max']);if(m!==null)return m;}}return null;}export const OBJECT_REUSE_RULES=[{'rule_id':'REUSE-001','object_type':'permission','recommendation':'strongly_recommended','reason':'Centralized\x20permission\x20control\x20across\x20all\x20services','ask_user':'Do\x20you\x20have\x20an\x20existing\x20Permission\x20to\x20reuse?\x20Provide\x20the\x20name\x20or\x20ID.'},{'rule_id':'REUSE-002','object_type':'machine','recommendation':'recommended','reason':'Save\x20design\x20time\x20for\x20similar\x20processes','ask_user':'Do\x20you\x20have\x20an\x20existing\x20Machine\x20whose\x20workflow\x20fits?\x20Provide\x20the\x20name\x20or\x20ID.'},{'rule_id':'REUSE-003','object_type':'guard','recommendation':'recommended','reason':'Avoid\x20redundant\x20validation\x20rules','ask_user':'Do\x20you\x20have\x20an\x20existing\x20Guard\x20with\x20matching\x20validation\x20logic?\x20Provide\x20the\x20name\x20or\x20ID.'},{'rule_id':'REUSE-004','object_type':'contact','recommendation':'recommended','reason':'Single\x20point\x20of\x20customer-service\x20management','ask_user':'Do\x20you\x20have\x20an\x20existing\x20Contact\x20for\x20customer\x20service?\x20Provide\x20the\x20name\x20or\x20ID.'},{'rule_id':'REUSE-005','object_type':'arbitration','recommendation':'always_reuse','reason':'Customers\x20choose\x20from\x20established\x20arbiters;\x20creating\x20a\x20new\x20Arbitration\x20is\x20an\x20operator-level\x20decision','ask_user':'Which\x20existing\x20Arbitration\x20service\x20should\x20disputes\x20route\x20to?\x20Provide\x20the\x20name\x20or\x20ID.'}];export const CREATE_VS_MODIFY_PATTERN={'reuse_form':'string','create_form':'object','resolution_api':'GetObjectExisted','note':'String\x20reference\x20=\x20REUSE\x20(name\x20resolution\x20failure\x20is\x20a\x20hard\x20error);\x20object\x20shape\x20=\x20CREATE\x20(always).'};export const IMMUTABILITY_RULES=[{'rule_id':'IMMUT-001','object_type':'machine','trigger':'publish','immutable_fields':['nodes','pairs','forwards'],'message':'Machine\x20topology\x20is\x20immutable\x20after\x20publish\x20—\x20verify\x20all\x20nodes/forwards\x20via\x20machineNode2file\x20BEFORE\x20publishing'},{'rule_id':'IMMUT-002','object_type':'service','trigger':'publish','immutable_fields':['machine','order_allocators','arbitrations'],'mutable_after':['sales'],'message':'Service.machine,\x20order_allocators\x20and\x20arbitrations\x20are\x20frozen\x20after\x20publish;\x20sales\x20remains\x20fully\x20modifiable\x20(L3)\x20without\x20pause'},{'rule_id':'IMMUT-003','object_type':'guard','trigger':'create','immutable_fields':['table','root','rely'],'message':'Guard\x20is\x20CREATE-only\x20and\x20immutable\x20—\x20cannot\x20be\x20edited\x20or\x20deleted\x20after\x20creation.\x20To\x20change:\x20export\x20via\x20guard2file\x20→\x20edit\x20→\x20CREATE\x20new\x20→\x20rebind'}];export const OPERATION_TYPE_CLASSIFICATION={'LOCAL_ONLY':['account_operation','local_mark_operation','local_info_operation','config_operation'],'ONCHAIN':['onchain_operations','wip_file','bridge_operation','messenger_operation'],'QUERY':['query_toolkit','onchain_table_data','onchain_events','guard2file','machineNode2file','schema_query','wowok_buildin_info','trust_score'],'ENCRYPTED':['messenger_operation']};export const OPERATION_CLASS_META={'LOCAL_ONLY':{'gas':![],'confirmation_required':![],'note':'Local\x20state\x20only\x20—\x20no\x20gas,\x20no\x20confirmation\x20needed'},'ONCHAIN':{'gas':!![],'confirmation_required':!![],'note':'On-chain\x20write\x20—\x20gas\x20consumed,\x20explicit\x20user\x20confirmation\x20REQUIRED\x20before\x20execution'},'QUERY':{'gas':![],'confirmation_required':![],'note':'Read-only\x20—\x20no\x20gas,\x20no\x20confirmation\x20needed'},'ENCRYPTED':{'gas':![],'confirmation_required':![],'note':'Local\x20encryption\x20—\x20no\x20gas,\x20no\x20confirmation\x20needed'}};export function classifyTool(a){if(OPERATION_TYPE_CLASSIFICATION['ENCRYPTED']['includes'](a))return'ENCRYPTED';for(const b of['LOCAL_ONLY','ONCHAIN','QUERY']){if(OPERATION_TYPE_CLASSIFICATION[b]['includes'](a))return b;}return undefined;}export const NAMING_CONVENTIONS={'scheme':'<projectPrefix>_<type>_<purpose>_<version>','parts':{'project_prefix':{'example':'shopFunny_','purpose':'Prevents\x20cross-project\x20collisions'},'type_prefix':{'example':'machine_\x20/\x20guard_\x20/\x20service_','purpose':'Clarifies\x20object\x20type'},'purpose_suffix':{'example':'serviceWithdraw','purpose':'Describes\x20function'},'version_suffix':{'example':'_v2','purpose':'Enables\x20iteration\x20without\x20replaceExistName'}},'entry_id':{'pattern':'^<object_type>:<name>$','example':'service:myshop_service'},'replace_exist_name':{'default':![],'false_effect':'Throws\x20error\x20if\x20name\x20is\x20in\x20use\x20—\x20safe\x20default','true_effect':'Existing\x20object/account\x20with\x20the\x20same\x20name\x20is\x20suspended/unbound\x20to\x20free\x20the\x20name','account_default_forbidden':'replaceExistName:true\x20on\x20the\x20default\x20account\x20(name=\x27\x27)\x20is\x20FORBIDDEN\x20—\x20use\x20suspend()\x20explicitly','recommendation':'DISCOURAGED\x20—\x20prefer\x20versioned\x20names\x20(_v1,\x20_v2)\x20for\x20production'},'recommendations':['Always\x20provide\x20tags\x20on\x20object\x20creation\x20for\x20filtering\x20and\x20management','Use\x20names\x20as\x20primary\x20identifiers;\x20use\x20short\x20address\x20form\x20(0x1234...def)\x20only\x20for\x20display','All\x20cross-object\x20references\x20(Guard\x20tables,\x20Service\x20bindings,\x20Machine\x20forwards)\x20use\x20NAMES\x20—\x20resolved\x20per-network\x20at\x20build\x20time']};export function checkObjectReuseRules(a){const b=[];for(const c of a){if(!c['is_new'])continue;const d=OBJECT_REUSE_RULES['find'](e=>e['object_type']===c['object_type']);if(!d)continue;(d['recommendation']==='always_reuse'||d['recommendation']==='strongly_recommended')&&b['push']({'rule_id':d['rule_id'],'severity':d['recommendation']==='always_reuse'?'warn':'info','message':'Creating\x20NEW\x20'+c['object_type']+(c['name']?'\x20\x22'+c['name']+'\x22':'')+'\x20—\x20reuse\x20is\x20'+d['recommendation']+':\x20'+d['reason']+'.\x20'+d['ask_user']});}return b;}export function checkImmutabilityRules(a){const b=[];for(const c of a){const d=IMMUTABILITY_RULES['find'](e=>e['object_type']===c['object_type']&&e['trigger']===c['trigger']);if(!d)continue;b['push']({'rule_id':d['rule_id'],'severity':'warn','message':''+c['object_type']+(c['name']?'\x20\x22'+c['name']+'\x22':'')+'\x20'+c['trigger']+':\x20'+d['message']+'.\x20Immutable:\x20['+d['immutable_fields']['join'](',\x20')+']'+(d['mutable_after']?'.\x20Still\x20mutable:\x20['+d['mutable_after']['join'](',\x20')+']':'')});}return b;}export const SAFETY_RULES_VERSION=0x2;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
export interface BridgeParticipant {
|
|
2
|
+
object: string;
|
|
3
|
+
role: string;
|
|
4
|
+
}
|
|
5
|
+
export interface BridgeField {
|
|
6
|
+
object: string;
|
|
7
|
+
field: string;
|
|
8
|
+
meaning: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ScenarioBridge {
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
participants: BridgeParticipant[];
|
|
14
|
+
bridge_fields: BridgeField[];
|
|
15
|
+
move_anchor: string;
|
|
16
|
+
scenario: {
|
|
17
|
+
from: string;
|
|
18
|
+
to: string;
|
|
19
|
+
merged: string;
|
|
20
|
+
};
|
|
21
|
+
capability_gained: string;
|
|
22
|
+
value_flow?: string;
|
|
23
|
+
prerequisites: string[];
|
|
24
|
+
examples: string[];
|
|
25
|
+
}
|
|
26
|
+
export interface ScenarioChain {
|
|
27
|
+
id: string;
|
|
28
|
+
name: string;
|
|
29
|
+
steps: Array<{
|
|
30
|
+
bridge: string;
|
|
31
|
+
note?: string;
|
|
32
|
+
}>;
|
|
33
|
+
application_capability: string;
|
|
34
|
+
objects_touched: string[];
|
|
35
|
+
}
|
|
36
|
+
export declare const SCENARIO_BRIDGE_REGISTRY: ScenarioBridge[];
|
|
37
|
+
export declare const SCENARIO_CHAINS: ScenarioChain[];
|
|
38
|
+
export declare const SCENARIO_TOPOLOGY_VERSION = "1.0.0";
|
|
39
|
+
export declare function getBridgeById(id: string): ScenarioBridge | undefined;
|
|
40
|
+
export declare function getBridgesByObject(objectType: string): ScenarioBridge[];
|
|
41
|
+
export declare function getChainById(id: string): ScenarioChain | undefined;
|
|
42
|
+
export declare function summarizeBridge(b: ScenarioBridge): string;
|
|
43
|
+
export declare function detectBridgesForObjects(objectTypes: string[]): ScenarioBridge[];
|