@wowok/agent-mcp 3.3.1 → 3.3.3
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/dist/chain-semantics/field-capability.js +1 -1
- package/dist/chain-semantics/freeze-map.js +1 -1
- package/dist/chain-semantics/fund-flow.js +1 -1
- package/dist/chain-semantics/guard-verbs.js +1 -1
- package/dist/chain-semantics/object-graph.js +1 -1
- package/dist/composition/audit.d.ts +5 -0
- package/dist/composition/audit.js +1 -1
- package/dist/composition/blueprint-view.d.ts +0 -1
- package/dist/composition/blueprint-view.js +1 -1
- package/dist/composition/compile.d.ts +5 -3
- package/dist/composition/compile.js +1 -1
- package/dist/composition/inflight.d.ts +32 -4
- package/dist/composition/inflight.js +1 -1
- package/dist/config/judgment.d.ts +111 -1
- package/dist/config/judgment.js +1 -1
- package/dist/customer/industry-risks.js +1 -1
- package/dist/customer/user-preferences.js +1 -1
- package/dist/evaluation/arbitration-game.d.ts +4 -0
- package/dist/evaluation/arbitration-game.js +1 -1
- package/dist/evaluation/builtins/graph-service.js +1 -1
- package/dist/evaluation/builtins/graph-service.spec.js +1 -1
- package/dist/evaluation/game-strategy.d.ts +6 -0
- package/dist/evaluation/game-strategy.js +1 -1
- package/dist/evaluation/node-game.d.ts +4 -0
- package/dist/evaluation/node-game.js +1 -1
- package/dist/evaluation/value-risk.d.ts +8 -0
- package/dist/evaluation/value-risk.js +1 -0
- package/dist/experience/realtime-feedback.js +1 -1
- package/dist/extensions/business-modules.d.ts +7 -2
- package/dist/extensions/business-modules.js +1 -1
- package/dist/extensions/industry-audit.spec.js +1 -1
- package/dist/extensions/industry-pack.d.ts +3 -2
- package/dist/extensions/industry-pack.js +1 -1
- package/dist/extensions/modes.js +1 -1
- package/dist/graph/onchain/analyze.js +1 -1
- package/dist/graph/onchain/analyze.spec.js +1 -1
- package/dist/graph/onchain/expand.js +1 -1
- package/dist/graph/onchain/exposure.js +1 -1
- package/dist/graph/onchain/facet-projection.js +1 -1
- package/dist/graph/onchain/facet-projection.spec.js +1 -1
- package/dist/graph/onchain/facts.d.ts +20 -0
- package/dist/graph/onchain/facts.js +1 -1
- package/dist/graph/onchain/facts.spec.js +1 -1
- package/dist/graph/onchain/object-held-receipts.d.ts +20 -0
- package/dist/graph/onchain/object-held-receipts.js +1 -0
- package/dist/graph/onchain/object-held-receipts.spec.d.ts +1 -0
- package/dist/graph/onchain/object-held-receipts.spec.js +1 -0
- package/dist/graph/onchain/project-relationship.js +1 -1
- package/dist/graph/onchain/sdk-batch.d.ts +1 -0
- package/dist/graph/onchain/sdk-batch.js +1 -1
- package/dist/harness/index.d.ts +1 -0
- package/dist/harness/recover.d.ts +2 -1
- package/dist/harness/recover.js +1 -1
- package/dist/knowledge/acquisition-flywheel.js +1 -1
- package/dist/knowledge/allocation-ledger.d.ts +3 -1
- package/dist/knowledge/allocation-ledger.js +1 -1
- package/dist/knowledge/allocation-puzzle.d.ts +1 -0
- package/dist/knowledge/allocation-puzzle.js +1 -1
- package/dist/knowledge/allocation-risk.d.ts +1 -1
- package/dist/knowledge/allocation-risk.js +1 -1
- package/dist/knowledge/arb-fund-facts.d.ts +12 -0
- package/dist/knowledge/arb-fund-facts.js +1 -1
- package/dist/knowledge/audit-rules.d.ts +4 -3
- package/dist/knowledge/audit-rules.js +1 -1
- package/dist/knowledge/baselines/judgment-baselines.json +502 -81
- package/dist/knowledge/baselines/rules/allocation.json +0 -14
- package/dist/knowledge/baselines/rules/graph.json +4 -4
- package/dist/knowledge/baselines/rules/plan.json +81 -5
- package/dist/knowledge/baselines/rules/reward.json +1 -1
- package/dist/knowledge/builtin-templates.d.ts +9 -1
- package/dist/knowledge/builtin-templates.js +1 -1
- package/dist/knowledge/discount-threshold.js +1 -1
- package/dist/knowledge/event-semantics.js +1 -1
- package/dist/knowledge/game-scenarios.d.ts +21 -0
- package/dist/knowledge/game-scenarios.js +1 -0
- package/dist/knowledge/getting-started.js +1 -1
- package/dist/knowledge/guard-bindings.js +1 -1
- package/dist/knowledge/guard-design-patterns.d.ts +1 -1
- package/dist/knowledge/guard-design-patterns.js +1 -1
- package/dist/knowledge/guard-field-cognition.js +1 -1
- package/dist/knowledge/guard-leg-map.d.ts +5 -0
- package/dist/knowledge/guard-leg-map.js +1 -0
- package/dist/knowledge/guard-lint.js +1 -1
- package/dist/knowledge/guard-puzzle.js +1 -1
- package/dist/knowledge/guard-render.js +1 -1
- package/dist/knowledge/guard-risk.js +1 -1
- package/dist/knowledge/guard-submission-brief.d.ts +5 -0
- package/dist/knowledge/guard-submission-brief.js +1 -1
- package/dist/knowledge/guard-submission-prompt.d.ts +2 -1
- package/dist/knowledge/guard-submission-prompt.js +1 -1
- package/dist/knowledge/guard-templates.d.ts +1 -1
- package/dist/knowledge/guard-templates.js +1 -1
- package/dist/knowledge/guard-translation.js +1 -1
- package/dist/knowledge/index.js +1 -1
- package/dist/knowledge/industry-generalizer.js +1 -1
- package/dist/knowledge/industry-registry.js +1 -1
- package/dist/knowledge/industry-strategy.js +1 -1
- package/dist/knowledge/jsonrpc-enum.js +1 -1
- package/dist/knowledge/onchain-constants.d.ts +4 -2
- package/dist/knowledge/onchain-constants.js +1 -1
- package/dist/knowledge/order-ledger.d.ts +1 -1
- package/dist/knowledge/order-ledger.js +1 -1
- package/dist/knowledge/order-puzzle.d.ts +3 -0
- package/dist/knowledge/order-risk.d.ts +1 -1
- package/dist/knowledge/passport-ledger.d.ts +12 -0
- package/dist/knowledge/passport-ledger.js +1 -1
- package/dist/knowledge/payment-tracker.js +1 -1
- package/dist/knowledge/protocol-facts.d.ts +1 -0
- package/dist/knowledge/protocol-facts.js +1 -1
- package/dist/knowledge/repository-write-semantics.d.ts +1 -1
- package/dist/knowledge/repository-write-semantics.js +1 -1
- package/dist/knowledge/reward-ledger.js +1 -1
- package/dist/knowledge/reward-puzzle.d.ts +1 -1
- package/dist/knowledge/reward-risk.d.ts +1 -1
- package/dist/knowledge/scenario-modes.d.ts +2 -2
- package/dist/knowledge/scenario-modes.js +1 -1
- package/dist/knowledge/scenario-topology.js +1 -1
- package/dist/knowledge/service-ledger.d.ts +14 -0
- package/dist/knowledge/service-ledger.js +1 -1
- package/dist/knowledge/strategy-manuals.js +1 -1
- package/dist/knowledge/template-index.d.ts +19 -0
- package/dist/knowledge/template-index.js +1 -0
- package/dist/knowledge/template-loader.d.ts +36 -0
- package/dist/knowledge/template-loader.js +1 -1
- package/dist/knowledge/template-registry.js +1 -1
- package/dist/knowledge/template-scanner.d.ts +11 -0
- package/dist/knowledge/template-scanner.js +1 -1
- package/dist/knowledge/tool-constraints.js +1 -1
- package/dist/knowledge/workflow-guidance.d.ts +2 -0
- package/dist/knowledge/workflow-guidance.js +1 -1
- package/dist/monitor/MonitorLoop.js +1 -1
- package/dist/participation/allocation-advice.d.ts +8 -1
- package/dist/participation/allocation-advice.js +1 -1
- package/dist/participation/game-context.d.ts +25 -0
- package/dist/participation/game-context.js +1 -0
- package/dist/participation/node-action-advisor.d.ts +64 -0
- package/dist/participation/node-action-advisor.js +1 -0
- package/dist/participation/radar-core.d.ts +1 -0
- package/dist/participation/radar-core.js +1 -1
- package/dist/persona/defaults.js +1 -1
- package/dist/persona/topology-focus.js +1 -1
- package/dist/playbooks/service-build/business-puzzle.js +1 -1
- package/dist/playbooks/service-build/game-theory.d.ts +4 -1
- package/dist/playbooks/service-build/game-theory.js +1 -1
- package/dist/playbooks/service-build/machine-panorama.js +1 -1
- package/dist/playbooks/service-build/merchant-guide.d.ts +26 -1
- package/dist/playbooks/service-build/merchant-guide.js +1 -1
- package/dist/playbooks/service-build/migration-planner.d.ts +2 -2
- package/dist/playbooks/service-build/migration-planner.js +1 -1
- package/dist/playbooks/service-build/object-panorama.d.ts +13 -1
- package/dist/playbooks/service-build/object-panorama.js +1 -1
- package/dist/playbooks/service-build/participation-radar.js +1 -1
- package/dist/playbooks/service-build/pipeline-actions.d.ts +4 -1
- package/dist/playbooks/service-build/pipeline-actions.js +1 -1
- package/dist/playbooks/service-build/relationship-profile.js +1 -1
- package/dist/playbooks/service-build/service-panorama.d.ts +12 -0
- package/dist/playbooks/service-build/service-panorama.js +1 -1
- package/dist/playbooks/service-build/service-quote.js +1 -1
- package/dist/playbooks/service-build/service-quote.spec.js +1 -1
- package/dist/relationship/derivation.d.ts +1 -1
- package/dist/review/index.js +1 -1
- package/dist/review/repository.js +1 -1
- package/dist/role/intent.d.ts +23 -0
- package/dist/role/intent.js +1 -0
- package/dist/safety/confirm-gate.js +1 -1
- package/dist/schema/benchmark-migration/index.d.ts +39 -0
- package/dist/schema/benchmark-migration/index.js +1 -1
- package/dist/schema/call/allocation.d.ts +49 -3
- package/dist/schema/call/allocation.js +1 -1
- package/dist/schema/call/arbitration.js +1 -1
- package/dist/schema/call/base.d.ts +52 -0
- package/dist/schema/call/base.js +1 -1
- package/dist/schema/call/bridge.d.ts +3 -0
- package/dist/schema/call/contact.js +1 -1
- package/dist/schema/call/error-codes.d.ts +1 -1
- package/dist/schema/call/error-codes.js +1 -1
- package/dist/schema/call/guard.js +1 -1
- package/dist/schema/call/handler.js +1 -1
- package/dist/schema/call/machine.d.ts +10 -0
- package/dist/schema/call/machine.js +1 -1
- package/dist/schema/call/order.d.ts +2 -0
- package/dist/schema/call/order.js +1 -1
- package/dist/schema/call/progress.d.ts +6 -3
- package/dist/schema/call/progress.js +1 -1
- package/dist/schema/call/repository.d.ts +4 -0
- package/dist/schema/call/repository.js +1 -1
- package/dist/schema/call/reward.d.ts +2 -2
- package/dist/schema/call/reward.js +1 -1
- package/dist/schema/call/semantic.d.ts +6 -0
- package/dist/schema/call/semantic.js +1 -1
- package/dist/schema/call/service.d.ts +42 -4
- package/dist/schema/call/service.js +1 -1
- package/dist/schema/common/index.js +1 -1
- package/dist/schema/goal/index.d.ts +54 -0
- package/dist/schema/goal/planning.d.ts +86 -0
- package/dist/schema/goal/planning.js +1 -1
- package/dist/schema/keeper/index.d.ts +2 -0
- package/dist/schema/local/index.d.ts +72 -0
- package/dist/schema/local/index.js +1 -1
- package/dist/schema/messenger/index.d.ts +2 -0
- package/dist/schema/operations.d.ts +46 -5
- package/dist/schema/operations.js +1 -1
- package/dist/schema/persona/index.d.ts +484 -0
- package/dist/schema/query/bi.d.ts +4 -0
- package/dist/schema/query/bi.js +1 -1
- package/dist/schema/query/index.d.ts +84 -60
- package/dist/schema/query/index.js +1 -1
- package/dist/schema/schema-version.d.ts +1 -1
- package/dist/schema/schema-version.js +1 -1
- package/dist/schema-query-impl/index.js +1 -1
- package/dist/schemas/account_operation.output.json +41 -10
- package/dist/schemas/account_operation.schema.json +1 -1
- package/dist/schemas/benchmark_migration_operation.output.json +8 -5
- package/dist/schemas/benchmark_migration_operation.schema.json +91 -3
- package/dist/schemas/bridge_operation.output.json +13 -7
- package/dist/schemas/goal_operation.schema.json +94 -0
- package/dist/schemas/index.json +1 -1
- package/dist/schemas/keeper_operation.output.json +12 -7
- package/dist/schemas/local_cache_operation.output.json +34 -7
- package/dist/schemas/local_cache_operation.schema.json +16 -1
- package/dist/schemas/local_history_operation.output.json +13 -7
- package/dist/schemas/local_info_operation.output.json +13 -7
- package/dist/schemas/local_info_operation.schema.json +5 -1
- package/dist/schemas/local_mark_operation.output.json +13 -7
- package/dist/schemas/messenger_operation.output.json +12 -7
- package/dist/schemas/monitor_events.output.json +12 -7
- package/dist/schemas/monitor_subscription.output.json +12 -7
- package/dist/schemas/onchain_events.output.json +67 -18
- package/dist/schemas/onchain_events.schema.json +4 -0
- package/dist/schemas/onchain_operations.output.json +81 -24
- package/dist/schemas/onchain_operations.schema.json +531 -126
- package/dist/schemas/onchain_operations_allocation.schema.json +294 -6
- package/dist/schemas/onchain_operations_arbitration.schema.json +3 -3
- package/dist/schemas/onchain_operations_contact.schema.json +2 -2
- package/dist/schemas/onchain_operations_demand.schema.json +3 -3
- package/dist/schemas/onchain_operations_gen_passport.schema.json +1 -1
- package/dist/schemas/onchain_operations_guard.schema.json +99 -63
- package/dist/schemas/onchain_operations_machine.schema.json +10 -1
- package/dist/schemas/onchain_operations_order.schema.json +8 -4
- package/dist/schemas/onchain_operations_progress.schema.json +8 -4
- package/dist/schemas/onchain_operations_proof.schema.json +1 -1
- package/dist/schemas/onchain_operations_repository.schema.json +6 -2
- package/dist/schemas/onchain_operations_reward.schema.json +8 -8
- package/dist/schemas/onchain_operations_service.schema.json +81 -21
- package/dist/schemas/onchain_operations_treasury.schema.json +7 -7
- package/dist/schemas/onchain_table_data.output.json +16 -7
- package/dist/schemas/persona_operation.output.json +1387 -0
- package/dist/schemas/persona_operation.schema.json +219 -0
- package/dist/schemas/query_toolkit.output.json +115 -64
- package/dist/schemas/query_toolkit.schema.json +8 -0
- package/dist/schemas/workflow_operation.schema.json +1 -1
- package/dist/tools/handlers/benchmark-migration.js +1 -1
- package/dist/tools/handlers/bridge.js +1 -1
- package/dist/tools/handlers/config.js +1 -1
- package/dist/tools/handlers/dispatch-expectations.js +1 -1
- package/dist/tools/handlers/file-export.js +1 -1
- package/dist/tools/handlers/industry-pack.d.ts +1 -0
- package/dist/tools/handlers/industry-pack.js +1 -1
- package/dist/tools/handlers/local.js +1 -1
- package/dist/tools/handlers/messenger.js +1 -1
- package/dist/tools/handlers/onchain-name-registration.d.ts +11 -0
- package/dist/tools/handlers/onchain-name-registration.js +1 -1
- package/dist/tools/handlers/onchain.d.ts +28 -0
- package/dist/tools/handlers/onchain.js +1 -1
- package/dist/tools/handlers/query.js +1 -1
- package/dist/tools/handlers/review-chain.d.ts +1 -1
- package/dist/tools/handlers/review-chain.js +1 -1
- package/dist/tools/handlers/schema-query.js +1 -1
- package/dist/tools/handlers/workflow.js +1 -1
- package/dist/tools/move-fn-index.gen.js +1 -1
- package/dist/tools/registry/agent.js +1 -1
- package/dist/tools/registry/local.js +1 -1
- package/dist/tools/registry/onchain.js +1 -1
- package/dist/tools/registry/query.js +1 -1
- package/dist/tools/wip-deploy-assist.js +1 -1
- package/dist/tools/wrap.js +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MAX_ALLOCATOR_COUNT,ALLOCATION_MAX_SHARING_COUNT,RATE_TOTAL_FULL}from'./allocation-ledger.js';export function initPuzzleFromIntent(a){const b={};return(a['action']||a['distribution_goal']||a['trigger_condition'])&&(b['intent']={'action':a['action']??'create','host_context':a['host_context']??'service_order_allocators','trigger_condition':a['trigger_condition']??'','distribution_goal':a['distribution_goal']??'','failure_conditions':a['failure_conditions']??[]}),b['constraints']={'F_A_01_allocator_count_le_100':!![],'F_A_02_sharing_count_le_100':!![],'F_A_03_sharing_mode_valid':!![],'F_A_04_at_most_1_surplus_per_allocator':!![],'F_A_05_pure_rate_sum_eq_10000':!![],'F_A_06_rate_plus_surplus_sum_le_10000':!![],'F_A_07_amount_sum_ge_threshold':!![],'F_A_08_amount_sum_le_max':!![],'F_A_09_balance_ge_threshold_at_alloc':!![],'F_A_10_payment_info_present':!![],'F_A_11_allocators_not_empty':!![],'F_A_12_order_at_most_1_allocation':!![],'F_A_13_guard_identifier_is_address':!![],'F_A_14_guard_addresses_unique':!![],'F_A_15_order_allocators_immutable_after_publish':!![],'F_A_16_rate_gross_sum_le_10000':!![],'F_A_17_no_mixed_rate_bases':!![]},b;}export function checkPuzzleCompleteness(a){const b=[],c=[];if(!a['intent'])b['push']('A'),c['push']({'dimension':'A','reason':'Intent\x20not\x20specified\x20(action\x20+\x20distribution_goal)'});else{if(!a['intent']['distribution_goal'])b['push']('A'),c['push']({'dimension':'A','reason':'distribution_goal\x20is\x20empty'});else!a['intent']['host_context']&&(b['push']('A'),c['push']({'dimension':'A','reason':'host_context\x20(trigger\x20source)\x20must\x20be\x20specified'}));}if(!a['binding'])b['push']('B'),c['push']({'dimension':'B','reason':'Binding\x20not\x20specified\x20(coin_type\x20+\x20guard_objects)'});else{if(!a['binding']['coin_type'])b['push']('B'),c['push']({'dimension':'B','reason':'coin_type\x20is\x20missing'});else a['binding']['guard_objects']['length']===0x0&&(b['push']('B'),c['push']({'dimension':'B','reason':'guard_objects\x20list\x20is\x20empty\x20—\x20at\x20least\x201\x20Guard\x20required'}));}if(!a['data_source']&&a['intent']?.['action']==='create')b['push']('C'),c['push']({'dimension':'C','reason':'Data\x20source\x20not\x20specified\x20(allocators_config\x20+\x20payment_info)'});else a['data_source']&&a['data_source']['allocators_config']['allocators']['length']===0x0&&(b['push']('C'),c['push']({'dimension':'C','reason':'allocators_config.allocators\x20is\x20empty'}));return!a['operations']&&(b['push']('D'),c['push']({'dimension':'D','reason':'Operations\x20not\x20enumerated'})),!a['logic']&&(b['push']('E'),c['push']({'dimension':'E','reason':'Logic\x20flow\x20(7-step\x20alloc)\x20not\x20defined'})),!a['constraints']&&(b['push']('F'),c['push']({'dimension':'F','reason':'Constraints\x20not\x20checked'})),{'dimensions':['A','B','C','D','E','F'],'missing':b,'missing_details':c,'complete':b['length']===0x0,'next_step':b['length']===0x0?'Puzzle\x20complete\x20—\x20ready\x20for\x20confirmation\x20text\x20generation':'Next:\x20complete\x20dimension\x20'+b[0x0]+'\x20—\x20'+c[0x0]['reason']};}export function validateConstraints(a){const b=[];if(!a['data_source'])return b;const c=a['data_source']['allocators_config'];c['allocators']['length']>MAX_ALLOCATOR_COUNT&&b['push']({'constraint_id':'F-A-01','severity':'critical','message':'Allocator\x20count\x20'+c['allocators']['length']+'\x20exceeds\x20MAX_ALLOCATOR_COUNT\x20'+MAX_ALLOCATOR_COUNT,'current_value':c['allocators']['length'],'limit':MAX_ALLOCATOR_COUNT,'related_move_error':'EALLOCATOR_COUNT_EXCEEDED\x20(2)'});c['allocators']['length']===0x0&&b['push']({'constraint_id':'F-A-11','severity':'critical','message':'allocators.allocators\x20is\x20empty\x20—\x20at\x20least\x201\x20Allocator\x20required','related_move_error':'EALLOCATORS_EMPTY\x20(8)\x20/\x20ENO_ALLOCATOR\x20(3)'});const d=c['allocators']['map'](f=>f['guard']),e=new Set(d);e['size']!==d['length']&&b['push']({'constraint_id':'F-A-14','severity':'medium','message':'Duplicate\x20Guard\x20addresses\x20in\x20allocators\x20('+d['length']+'\x20entries,\x20'+e['size']+'\x20unique)\x20—\x20alloc_by_guard\x20address\x20match\x20only\x20hits\x20the\x20first,\x20subsequent\x20duplicate\x20Allocators\x20are\x20never\x20reachable'});for(const f of c['allocators']){f['sharing']['length']>ALLOCATION_MAX_SHARING_COUNT&&b['push']({'constraint_id':'F-A-02','severity':'critical','message':'Allocator\x20'+f['guard']+'\x20has\x20'+f['sharing']['length']+'\x20sharing\x20entries,\x20exceeds\x20MAX_SHARING_COUNT\x20'+ALLOCATION_MAX_SHARING_COUNT,'current_value':f['sharing']['length'],'limit':ALLOCATION_MAX_SHARING_COUNT,'related_move_error':'ESHARING_COUNT_EXCEEDED\x20(10)'});for(const r of f['sharing']){!['Amount','Rate','Surplus','RateGross']['includes'](r['mode'])&&b['push']({'constraint_id':'F-A-03','severity':'critical','message':'Invalid\x20sharing\x20mode:\x20'+r['mode'],'related_move_error':'ESHARING_MODE_INVALID\x20(11)'});}const g=f['sharing']['filter'](t=>t['mode']==='Surplus')['length'];g>0x1&&b['push']({'constraint_id':'F-A-04','severity':'high','message':'Allocator\x20'+f['guard']+'\x20has\x20'+g+'\x20Surplus\x20sharing\x20—\x20at\x20most\x201\x20allowed','current_value':g,'limit':0x1,'related_move_error':'EMULTIPLE_SURPLUS\x20(5)'});const h=f['sharing']['filter'](t=>t['mode']==='Amount')['reduce']((t,u)=>t+Number(u['sharing']),0x0),i=f['sharing']['some'](t=>t['mode']==='RateGross'),j=f['sharing']['some'](t=>t['mode']==='Rate'),k=i&&h===0x0&&j,l=f['sharing']['filter'](t=>t['mode']==='Rate'||k&&t['mode']==='RateGross')['reduce']((t,u)=>t+Number(u['sharing']),0x0),n=g>0x0;!(j&&i&&h>0x0)&&(!n&&l>0x0&&l!==RATE_TOTAL_FULL&&b['push']({'constraint_id':'F-A-05','severity':'high','message':'Pure\x20Rate\x20mode\x20(no\x20Surplus)\x20sum\x20'+l+'\x20!=\x20'+RATE_TOTAL_FULL,'current_value':l,'limit':RATE_TOTAL_FULL,'related_move_error':'ERATE_NOT_10000\x20(4)'}),n&&l>RATE_TOTAL_FULL&&b['push']({'constraint_id':'F-A-06','severity':'high','message':'Rate\x20+\x20Surplus\x20mode\x20sum\x20'+l+'\x20>\x20'+RATE_TOTAL_FULL,'current_value':l,'limit':RATE_TOTAL_FULL,'related_move_error':'ERATE_EXCEEDS_10000\x20(6)'}));const o=Number(c['threshold']);h>0x0&&h<o&&b['push']({'constraint_id':'F-A-07','severity':'high','message':'Amount\x20sum\x20'+h+'\x20<\x20threshold\x20'+o,'current_value':h,'limit':o,'related_move_error':'EAMOUNT_BELOW_THRESHOLD\x20(12)'});f['max']!=null&&h>Number(f['max'])&&b['push']({'constraint_id':'F-A-08','severity':'medium','message':'Amount\x20sum\x20'+h+'\x20>\x20max\x20'+Number(f['max']),'current_value':h,'limit':Number(f['max']),'related_move_error':'EAMOUNT_EXCEEDS_MAX\x20(13)'});const p=f['sharing']['filter'](t=>t['mode']==='RateGross')['reduce']((t,u)=>t+Number(u['sharing']),0x0);if(i&&!j){if(p>RATE_TOTAL_FULL)b['push']({'constraint_id':'F-A-16','severity':'high','message':'RateGross\x20sum\x20'+p+'\x20>\x20'+RATE_TOTAL_FULL,'current_value':p,'limit':RATE_TOTAL_FULL,'related_move_error':'ERATE_EXCEEDS_10000\x20(6)'});else{if(f['max']!=null){const t=Number(f['max']);h*RATE_TOTAL_FULL+p*t>t*RATE_TOTAL_FULL&&b['push']({'constraint_id':'F-A-16','severity':'high','message':'RateGross\x20plan\x20overdraws\x20max:\x20fix\x20'+h+'×10000\x20+\x20rateSum\x20'+p+'×'+t+'\x20>\x20'+t+'×10000','related_move_error':'ERATE_EXCEEDS_10000\x20(6)'});}else h>0x0&&p>=RATE_TOTAL_FULL&&b['push']({'constraint_id':'F-A-16','severity':'high','message':'RateGross\x20sum\x20'+p+'\x20with\x20fixed\x20total\x20'+h+'\x20and\x20no\x20max\x20must\x20be\x20<\x20'+RATE_TOTAL_FULL,'current_value':p,'limit':RATE_TOTAL_FULL,'related_move_error':'ERATE_EXCEEDS_10000\x20(6)'});}}j&&i&&h>0x0&&b['push']({'constraint_id':'F-A-17','severity':'high','message':'Allocator\x20'+f['guard']+'\x20mixes\x20NET\x20Rate\x20and\x20RateGross\x20with\x20a\x20fixed\x20Amount\x20total\x20('+h+')\x20—\x20abort\x20EMIXED_RATE_BASES','related_move_error':'EMIXED_RATE_BASES\x20(17)'});const q=f['sharing']['find'](u=>typeof u['who']==='object'&&'GuardIdentifier'in u['who']);if(q){}}return b;}export function generateConfirmationText(a){const b=[];b['push']('═══\x20Allocation\x20Confirmation\x20═══'),b['push']('');if(a['intent']){b['push']('Action:\x20'+a['intent']['action']),b['push']('Host\x20context:\x20'+a['intent']['host_context']),b['push']('Trigger:\x20'+a['intent']['trigger_condition']),b['push']('Distribution\x20goal:\x20'+a['intent']['distribution_goal']);if(a['intent']['failure_conditions']['length']>0x0){b['push']('Failure\x20conditions:');for(const d of a['intent']['failure_conditions'])b['push']('\x20\x20-\x20'+d);}b['push']('');}if(a['binding']){b['push']('─\x20Binding\x20──────────────'),b['push']('Coin\x20type:\x20'+a['binding']['coin_type']);if(a['binding']['host_service'])b['push']('Host\x20Service:\x20'+a['binding']['host_service']);if(a['binding']['host_arbitration'])b['push']('Host\x20Arbitration:\x20'+a['binding']['host_arbitration']);if(a['binding']['bound_order'])b['push']('Bound\x20Order:\x20'+a['binding']['bound_order']);if(a['binding']['trigger_node'])b['push']('Trigger\x20node:\x20'+a['binding']['trigger_node']);b['push']('Guard\x20objects\x20('+a['binding']['guard_objects']['length']+'):\x20'+a['binding']['guard_objects']['join'](',\x20')),b['push']('Payment\x20info\x20source:\x20'+a['binding']['payment_info_source']),b['push']('');}if(a['data_source']){const e=a['data_source']['allocators_config'];b['push']('─\x20Data\x20Source\x20──────────────'),b['push']('Description:\x20'+e['description']),b['push']('Threshold:\x20'+e['threshold']),b['push']('Allocators:\x20'+e['allocators']['length']),e['allocators']['forEach']((f,g)=>{b['push']('\x20\x20['+g+']\x20guard='+f['guard']+',\x20sharing='+f['sharing']['length']+'\x20items,\x20fix='+(f['fix']??'0')+',\x20max='+(f['max']??'null')),f['sharing']['forEach']((h,k)=>{b['push']('\x20\x20\x20\x20\x20\x20('+k+')\x20who='+JSON['stringify'](h['who'])+',\x20sharing='+h['sharing']+',\x20mode='+h['mode']);});}),b['push']('Payment\x20info\x20for_object:\x20'+a['data_source']['payment_info']['for_object']+(a['data_source']['payment_info']['for_object']?'\x20(ENFORCED\x20at\x20alloc:\x20GuardIdentifier\x20submissions\x20must\x20equal\x20this\x20address,\x20abort\x2015\x20on\x20mismatch)':'\x20(no\x20anchor:\x20nothing\x20enforced\x20on-chain,\x20recipient\x20routing\x20is\x20the\x20creator\x27s\x20business)')),b['push']('Coin\x20source:\x20'+a['data_source']['coin_source']),b['push']('');}if(a['logic']){b['push']('─\x20Logic\x20──────────────'),b['push']('Guard\x20matching:\x20'+a['logic']['guard_matching_strategy']),b['push']('alloc()\x20flow\x20('+a['logic']['alloc_flow']['length']+'\x20steps):');for(const f of a['logic']['alloc_flow']){b['push']('\x20\x20'+f['step']+'.\x20'+f['action']+':\x20'+f['description']);}b['push']('');}const c=validateConstraints(a);if(c['length']>0x0){b['push']('─\x20Constraint\x20Violations\x20──────────────');for(const g of c){b['push']('\x20\x20['+g['severity']+']\x20'+g['constraint_id']+':\x20'+g['message']);}b['push']('');}return b['join']('\x0a');}export function buildDefaultAllocFlow(){return[{'step':0x1,'action':'pre_check','description':'assert\x20balance\x20>=\x20threshold,\x20payment_info.is_some(),\x20allocators\x20not\x20empty'},{'step':0x2,'action':'guard_lookup','description':'iterate\x20allocators[],\x20locate\x20alloc.guard\x20==\x20alloc_by_guard\x20address;\x20on\x20hit\x20run\x20the\x20Passport\x20guard-result\x20hard\x20verification\x20(failure\x20aborts\x20E_VERIFY_FAILED)'},{'step':0x3,'action':'rate_base_calc','description':'NET\x20Rate:\x20total_rates\x20=\x20max\x20-\x20fix\x20(if\x20max)\x20else\x20balance\x20-\x20fix;\x20RateGross:\x20total_rates\x20=\x20max\x20(if\x20max)\x20else\x20balance\x20(fix\x20NOT\x20removed)'},{'step':0x4,'action':'sharing_distribution','description':'iterate\x20sharing[],\x20split\x20by\x20mode\x20(Amount/Rate/RateGross/Surplus\x20placeholder)'},{'step':0x5,'action':'surplus_distribution','description':'sweep\x20the\x20remainder\x20to\x20surplus_recipient\x20(if\x20any)\x20—\x20uncapped:\x20the\x20whole\x20remaining\x20pool;\x20max-capped:\x20topped\x20up\x20to\x20the\x20cap'},{'step':0x6,'action':'recipient_resolution','description':'resolve\x20address\x20from\x20GuardIdentifier(passport)\x20/\x20Entity(static)\x20/\x20Signer(tx\x20sender);\x20GuardIdentifier\x20submissions\x20are\x20additionally\x20checked\x20against\x20payment_info.for_object\x20when\x20it\x20is\x20Some\x20(mismatch\x20aborts\x20ERECIPIENT_NOT_FOR_OBJECT\x2015;\x20None\x20=\x20no\x20anchor,\x20nothing\x20enforced)'},{'step':0x7,'action':'payment_creation','description':'create\x20Payment\x20object,\x20push\x20to\x20self.payment\x20vector'}];}export function buildDefaultRecipientRules(){return[{'recipient_type':'GuardIdentifier','resolution_source':'passport_table','safety_level':'safe'},{'recipient_type':'Entity','resolution_source':'static_address','safety_level':'safe'},{'recipient_type':'Signer','resolution_source':'tx_sender','safety_level':'dangerous'}];}export function buildDefaultLogicPuzzle(){return{'alloc_flow':buildDefaultAllocFlow(),'guard_matching_strategy':'caller_specified_guard','recipient_resolution_rules':buildDefaultRecipientRules()};}export const ALLOCATION_PUZZLE_VERSION='1.0.0';
|
|
1
|
+
import{MAX_ALLOCATOR_COUNT,ALLOCATION_MAX_SHARING_COUNT,RATE_TOTAL_FULL}from'./allocation-ledger.js';export function initPuzzleFromIntent(a){const b={};return(a['action']||a['distribution_goal']||a['trigger_condition'])&&(b['intent']={'action':a['action']??'create','host_context':a['host_context']??'service_order_allocators','trigger_condition':a['trigger_condition']??'','distribution_goal':a['distribution_goal']??'','failure_conditions':a['failure_conditions']??[]}),b['constraints']={'F_A_01_allocator_count_le_100':!![],'F_A_02_sharing_count_le_100':!![],'F_A_03_sharing_mode_valid':!![],'F_A_04_at_most_1_surplus_per_allocator':!![],'F_A_05_pure_rate_sum_eq_10000':!![],'F_A_06_rate_plus_surplus_sum_le_10000':!![],'F_A_07_amount_sum_ge_threshold':!![],'F_A_08_amount_sum_le_max':!![],'F_A_09_balance_ge_threshold_at_alloc':!![],'F_A_10_payment_info_present':!![],'F_A_11_allocators_not_empty':!![],'F_A_12_order_at_most_1_allocation':!![],'F_A_13_guard_identifier_is_address':!![],'F_A_14_guard_addresses_unique':!![],'F_A_15_order_allocators_immutable_after_publish':!![],'F_A_16_rate_gross_sum_le_10000':!![],'F_A_17_no_mixed_rate_bases':!![],'F_A_18_formula_coefficient_le_10000':!![]},b;}export function checkPuzzleCompleteness(a){const b=[],c=[];if(!a['intent'])b['push']('A'),c['push']({'dimension':'A','reason':'Intent\x20not\x20specified\x20(action\x20+\x20distribution_goal)'});else{if(!a['intent']['distribution_goal'])b['push']('A'),c['push']({'dimension':'A','reason':'distribution_goal\x20is\x20empty'});else!a['intent']['host_context']&&(b['push']('A'),c['push']({'dimension':'A','reason':'host_context\x20(trigger\x20source)\x20must\x20be\x20specified'}));}if(!a['binding'])b['push']('B'),c['push']({'dimension':'B','reason':'Binding\x20not\x20specified\x20(coin_type\x20+\x20guard_objects)'});else{if(!a['binding']['coin_type'])b['push']('B'),c['push']({'dimension':'B','reason':'coin_type\x20is\x20missing'});else a['binding']['guard_objects']['length']===0x0&&(b['push']('B'),c['push']({'dimension':'B','reason':'guard_objects\x20list\x20is\x20empty\x20—\x20at\x20least\x201\x20Guard\x20required'}));}if(!a['data_source']&&a['intent']?.['action']==='create')b['push']('C'),c['push']({'dimension':'C','reason':'Data\x20source\x20not\x20specified\x20(allocators_config\x20+\x20payment_info)'});else a['data_source']&&a['data_source']['allocators_config']['allocators']['length']===0x0&&(b['push']('C'),c['push']({'dimension':'C','reason':'allocators_config.allocators\x20is\x20empty'}));return!a['operations']&&(b['push']('D'),c['push']({'dimension':'D','reason':'Operations\x20not\x20enumerated'})),!a['logic']&&(b['push']('E'),c['push']({'dimension':'E','reason':'Logic\x20flow\x20(7-step\x20alloc)\x20not\x20defined'})),!a['constraints']&&(b['push']('F'),c['push']({'dimension':'F','reason':'Constraints\x20not\x20checked'})),{'dimensions':['A','B','C','D','E','F'],'missing':b,'missing_details':c,'complete':b['length']===0x0,'next_step':b['length']===0x0?'Puzzle\x20complete\x20—\x20ready\x20for\x20confirmation\x20text\x20generation':'Next:\x20complete\x20dimension\x20'+b[0x0]+'\x20—\x20'+c[0x0]['reason']};}export function validateConstraints(a){const b=[];if(!a['data_source'])return b;const c=a['data_source']['allocators_config'];c['allocators']['length']>MAX_ALLOCATOR_COUNT&&b['push']({'constraint_id':'F-A-01','severity':'critical','message':'Allocator\x20count\x20'+c['allocators']['length']+'\x20exceeds\x20MAX_ALLOCATOR_COUNT\x20'+MAX_ALLOCATOR_COUNT,'current_value':c['allocators']['length'],'limit':MAX_ALLOCATOR_COUNT,'related_move_error':'EALLOCATOR_COUNT_EXCEEDED\x20(2)'});c['allocators']['length']===0x0&&b['push']({'constraint_id':'F-A-11','severity':'critical','message':'allocators.allocators\x20is\x20empty\x20—\x20at\x20least\x201\x20Allocator\x20required','related_move_error':'EALLOCATORS_EMPTY\x20(8)\x20/\x20ENO_ALLOCATOR\x20(3)'});const d=c['allocators']['map'](f=>f['guard']),e=new Set(d);e['size']!==d['length']&&b['push']({'constraint_id':'F-A-14','severity':'medium','message':'Duplicate\x20Guard\x20addresses\x20in\x20allocators\x20('+d['length']+'\x20entries,\x20'+e['size']+'\x20unique)\x20—\x20alloc_by_guard\x20address\x20match\x20only\x20hits\x20the\x20first,\x20subsequent\x20duplicate\x20Allocators\x20are\x20never\x20reachable'});for(const f of c['allocators']){f['sharing']['length']>ALLOCATION_MAX_SHARING_COUNT&&b['push']({'constraint_id':'F-A-02','severity':'critical','message':'Allocator\x20'+f['guard']+'\x20has\x20'+f['sharing']['length']+'\x20sharing\x20entries,\x20exceeds\x20MAX_SHARING_COUNT\x20'+ALLOCATION_MAX_SHARING_COUNT,'current_value':f['sharing']['length'],'limit':ALLOCATION_MAX_SHARING_COUNT,'related_move_error':'ESHARING_COUNT_EXCEEDED\x20(10)'});for(const t of f['sharing']){!['Amount','Rate','Surplus','RateGross','Formula']['includes'](t['mode'])&&b['push']({'constraint_id':'F-A-03','severity':'critical','message':'Invalid\x20sharing\x20mode:\x20'+t['mode'],'related_move_error':'ESHARING_MODE_INVALID\x20(11)'});}const g=f['sharing']['filter'](u=>u['mode']==='Surplus')['length'];g>0x1&&b['push']({'constraint_id':'F-A-04','severity':'high','message':'Allocator\x20'+f['guard']+'\x20has\x20'+g+'\x20Surplus\x20sharing\x20—\x20at\x20most\x201\x20allowed','current_value':g,'limit':0x1,'related_move_error':'EMULTIPLE_SURPLUS\x20(5)'});const h=f['sharing']['filter'](u=>u['mode']==='Amount')['reduce']((u,v)=>u+Number(v['sharing']),0x0),i=f['sharing']['some'](u=>u['mode']==='RateGross'),j=f['sharing']['some'](u=>u['mode']==='Rate'),k=f['sharing']['some'](u=>u['mode']==='Formula'),l=i&&h===0x0&&j,n=f['sharing']['filter'](u=>u['mode']==='Rate'||l&&u['mode']==='RateGross')['reduce']((u,v)=>u+Number(v['sharing']),0x0),o=g>0x0;!(j&&i&&h>0x0)&&(!o&&n>0x0&&n!==RATE_TOTAL_FULL&&b['push']({'constraint_id':'F-A-05','severity':'high','message':'Pure\x20Rate\x20mode\x20(no\x20Surplus)\x20sum\x20'+n+'\x20!=\x20'+RATE_TOTAL_FULL,'current_value':n,'limit':RATE_TOTAL_FULL,'related_move_error':'ERATE_NOT_10000\x20(4)'}),o&&n>RATE_TOTAL_FULL&&b['push']({'constraint_id':'F-A-06','severity':'high','message':'Rate\x20+\x20Surplus\x20mode\x20sum\x20'+n+'\x20>\x20'+RATE_TOTAL_FULL,'current_value':n,'limit':RATE_TOTAL_FULL,'related_move_error':'ERATE_EXCEEDS_10000\x20(6)'}));const p=Number(c['threshold']);!k&&h>0x0&&h<p&&b['push']({'constraint_id':'F-A-07','severity':'high','message':'Amount\x20sum\x20'+h+'\x20<\x20threshold\x20'+p,'current_value':h,'limit':p,'related_move_error':'EAMOUNT_BELOW_THRESHOLD\x20(12)'});f['max']!=null&&h>Number(f['max'])&&b['push']({'constraint_id':'F-A-08','severity':'medium','message':'Amount\x20sum\x20'+h+'\x20>\x20max\x20'+Number(f['max']),'current_value':h,'limit':Number(f['max']),'related_move_error':'EAMOUNT_EXCEEDS_MAX\x20(13)'});const q=f['sharing']['filter'](u=>u['mode']==='RateGross')['reduce']((u,v)=>u+Number(v['sharing']),0x0);if(i&&!j){if(q>RATE_TOTAL_FULL)b['push']({'constraint_id':'F-A-16','severity':'high','message':'RateGross\x20sum\x20'+q+'\x20>\x20'+RATE_TOTAL_FULL,'current_value':q,'limit':RATE_TOTAL_FULL,'related_move_error':'ERATE_EXCEEDS_10000\x20(6)'});else{if(f['max']!=null){const u=Number(f['max']);h*RATE_TOTAL_FULL+q*u>u*RATE_TOTAL_FULL&&b['push']({'constraint_id':'F-A-16','severity':'high','message':'RateGross\x20plan\x20overdraws\x20max:\x20fix\x20'+h+'×10000\x20+\x20rateSum\x20'+q+'×'+u+'\x20>\x20'+u+'×10000','related_move_error':'ERATE_EXCEEDS_10000\x20(6)'});}else h>0x0&&q>=RATE_TOTAL_FULL&&b['push']({'constraint_id':'F-A-16','severity':'high','message':'RateGross\x20sum\x20'+q+'\x20with\x20fixed\x20total\x20'+h+'\x20and\x20no\x20max\x20must\x20be\x20<\x20'+RATE_TOTAL_FULL,'current_value':q,'limit':RATE_TOTAL_FULL,'related_move_error':'ERATE_EXCEEDS_10000\x20(6)'});}}j&&i&&h>0x0&&b['push']({'constraint_id':'F-A-17','severity':'high','message':'Allocator\x20'+f['guard']+'\x20mixes\x20NET\x20Rate\x20and\x20RateGross\x20with\x20a\x20fixed\x20Amount\x20total\x20('+h+')\x20—\x20abort\x20EMIXED_RATE_BASES','related_move_error':'EMIXED_RATE_BASES\x20(17)'});for(const v of f['sharing']['filter'](w=>w['mode']==='Formula')){const w=Number(v['sharing']);Number['isFinite'](w)&&w>RATE_TOTAL_FULL&&b['push']({'constraint_id':'F-A-18','severity':'high','message':'Allocator\x20'+f['guard']+'\x20Formula\x20coefficient\x20'+w+'\x20>\x20'+RATE_TOTAL_FULL+'\x20(basis-point\x20ceiling,\x20ERATE_EXCEEDS_10000)','current_value':w,'limit':RATE_TOTAL_FULL,'related_move_error':'ERATE_EXCEEDS_10000\x20(6)'});}const r=f['sharing']['find'](x=>typeof x['who']==='object'&&'GuardIdentifier'in x['who']);if(r){}}return b;}export function generateConfirmationText(a){const b=[];b['push']('═══\x20Allocation\x20Confirmation\x20═══'),b['push']('');if(a['intent']){b['push']('Action:\x20'+a['intent']['action']),b['push']('Host\x20context:\x20'+a['intent']['host_context']),b['push']('Trigger:\x20'+a['intent']['trigger_condition']),b['push']('Distribution\x20goal:\x20'+a['intent']['distribution_goal']);if(a['intent']['failure_conditions']['length']>0x0){b['push']('Failure\x20conditions:');for(const d of a['intent']['failure_conditions'])b['push']('\x20\x20-\x20'+d);}b['push']('');}if(a['binding']){b['push']('─\x20Binding\x20──────────────'),b['push']('Coin\x20type:\x20'+a['binding']['coin_type']);if(a['binding']['host_service'])b['push']('Host\x20Service:\x20'+a['binding']['host_service']);if(a['binding']['host_arbitration'])b['push']('Host\x20Arbitration:\x20'+a['binding']['host_arbitration']);if(a['binding']['bound_order'])b['push']('Bound\x20Order:\x20'+a['binding']['bound_order']);if(a['binding']['trigger_node'])b['push']('Trigger\x20node:\x20'+a['binding']['trigger_node']);b['push']('Guard\x20objects\x20('+a['binding']['guard_objects']['length']+'):\x20'+a['binding']['guard_objects']['join'](',\x20')),b['push']('Payment\x20info\x20source:\x20'+a['binding']['payment_info_source']),b['push']('');}if(a['data_source']){const e=a['data_source']['allocators_config'];b['push']('─\x20Data\x20Source\x20──────────────'),b['push']('Description:\x20'+e['description']),b['push']('Threshold:\x20'+e['threshold']),b['push']('Allocators:\x20'+e['allocators']['length']),e['allocators']['forEach']((f,g)=>{b['push']('\x20\x20['+g+']\x20guard='+f['guard']+',\x20sharing='+f['sharing']['length']+'\x20items,\x20fix='+(f['fix']??'0')+',\x20max='+(f['max']??'null')),f['sharing']['forEach']((h,k)=>{b['push']('\x20\x20\x20\x20\x20\x20('+k+')\x20who='+JSON['stringify'](h['who'])+',\x20sharing='+h['sharing']+',\x20mode='+h['mode']);});}),b['push']('Payment\x20info\x20for_object:\x20'+a['data_source']['payment_info']['for_object']+(a['data_source']['payment_info']['for_object']?'\x20(ENFORCED\x20at\x20alloc:\x20GuardIdentifier\x20submissions\x20must\x20equal\x20this\x20address,\x20abort\x2015\x20on\x20mismatch)':'\x20(no\x20anchor:\x20nothing\x20enforced\x20on-chain,\x20recipient\x20routing\x20is\x20the\x20creator\x27s\x20business)')),b['push']('Coin\x20source:\x20'+a['data_source']['coin_source']),b['push']('');}if(a['logic']){b['push']('─\x20Logic\x20──────────────'),b['push']('Guard\x20matching:\x20'+a['logic']['guard_matching_strategy']),b['push']('alloc()\x20flow\x20('+a['logic']['alloc_flow']['length']+'\x20steps):');for(const f of a['logic']['alloc_flow']){b['push']('\x20\x20'+f['step']+'.\x20'+f['action']+':\x20'+f['description']);}b['push']('');}const c=validateConstraints(a);if(c['length']>0x0){b['push']('─\x20Constraint\x20Violations\x20──────────────');for(const g of c){b['push']('\x20\x20['+g['severity']+']\x20'+g['constraint_id']+':\x20'+g['message']);}b['push']('');}return b['join']('\x0a');}export function buildDefaultAllocFlow(){return[{'step':0x1,'action':'pre_check','description':'assert\x20balance\x20>=\x20threshold,\x20payment_info.is_some(),\x20allocators\x20not\x20empty'},{'step':0x2,'action':'guard_lookup','description':'iterate\x20allocators[],\x20locate\x20alloc.guard\x20==\x20alloc_by_guard\x20address;\x20on\x20hit\x20run\x20the\x20Passport\x20guard-result\x20hard\x20verification\x20(failure\x20aborts\x20E_VERIFY_FAILED)'},{'step':0x3,'action':'rate_base_calc','description':'NET\x20Rate:\x20total_rates\x20=\x20max\x20-\x20fix\x20(if\x20max)\x20else\x20balance\x20-\x20fix;\x20RateGross:\x20total_rates\x20=\x20max\x20(if\x20max)\x20else\x20balance\x20(fix\x20NOT\x20removed)'},{'step':0x4,'action':'sharing_distribution','description':'iterate\x20sharing[],\x20split\x20by\x20mode\x20(Amount/Rate/RateGross/Surplus\x20placeholder)'},{'step':0x5,'action':'surplus_distribution','description':'sweep\x20the\x20remainder\x20to\x20surplus_recipient\x20(if\x20any)\x20—\x20uncapped:\x20the\x20whole\x20remaining\x20pool;\x20max-capped:\x20topped\x20up\x20to\x20the\x20cap'},{'step':0x6,'action':'recipient_resolution','description':'resolve\x20address\x20from\x20GuardIdentifier(passport)\x20/\x20Entity(static)\x20/\x20Signer(tx\x20sender);\x20when\x20payment_info.for_object\x20is\x20Some,\x20a\x20GuardIdentifier\x20submission\x20must\x20equal\x20it\x20(mismatch\x20aborts\x20ERECIPIENT_NOT_FOR_OBJECT\x2015).\x20A\x20MATCH\x20is\x20the\x20deliberate\x20order-anchored\x20refund\x20shape:\x20the\x20share\x20is\x20paid\x20to\x20the\x20bound\x20Order\x20object\x20and\x20the\x20Order\x27s\x20owner-claim\x20entry\x20extracts\x20it\x20to\x20order.owner.\x20None\x20=\x20no\x20anchor,\x20nothing\x20enforced'},{'step':0x7,'action':'payment_creation','description':'create\x20Payment\x20object,\x20push\x20to\x20self.payment\x20vector'}];}export function buildDefaultRecipientRules(){return[{'recipient_type':'GuardIdentifier','resolution_source':'passport_table','safety_level':'safe'},{'recipient_type':'Entity','resolution_source':'static_address','safety_level':'safe'},{'recipient_type':'Signer','resolution_source':'tx_sender','safety_level':'dangerous'}];}export function buildDefaultLogicPuzzle(){return{'alloc_flow':buildDefaultAllocFlow(),'guard_matching_strategy':'caller_specified_guard','recipient_resolution_rules':buildDefaultRecipientRules()};}export const ALLOCATION_PUZZLE_VERSION='1.0.0';
|
|
@@ -40,7 +40,7 @@ export interface AllocationRiskCheckContext {
|
|
|
40
40
|
Signer: "signer";
|
|
41
41
|
};
|
|
42
42
|
sharing: string | number;
|
|
43
|
-
mode: "Amount" | "Rate" | "Surplus" | "RateGross";
|
|
43
|
+
mode: "Amount" | "Rate" | "Surplus" | "RateGross" | "Formula";
|
|
44
44
|
}[];
|
|
45
45
|
fix?: string | number;
|
|
46
46
|
max?: string | number | null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MAX_ALLOCATOR_COUNT,RATE_TOTAL_FULL,ALLOCATION_ERROR_CODES}from'./allocation-ledger.js';import{isUnboundSignerTheft}from'./recipient-constraint.js';import{checkEntityRecipientsSync}from'./entity-recipient-guard.js';import{getJudgmentDoc,factoryRulePack}from'../config/judgment.js';import{evaluateRuleBook,evaluateCondition}from'../config/rule-engine.js';const AUTO_FIXABLE=new Set(['R-A-1-02#0','R-A-1-02#1','R-A-1-02#2','R-A-1-02#3','R-A-1-02#4','R-A-1-03#0','R-A-1-03#2','R-A-2-03#0','R-A-5-03#0']),RELATED_MOVE_ERROR={'R-A-1-01#0':'EALLOCATORS_EMPTY\x20(8)\x20/\x20ENO_ALLOCATOR\x20(3)','R-A-1-01#1':'ENO_ALLOCATOR\x20(3)','R-A-1-02#0':'ERATE_NOT_10000\x20(4)','R-A-1-02#1':'ERATE_EXCEEDS_10000\x20(6)','R-A-1-02#2':'ERATE_EXCEEDS_10000\x20(6)','R-A-1-02#3':'ERATE_EXCEEDS_10000\x20(6)','R-A-1-02#4':'ERATE_EXCEEDS_10000\x20(6)','R-A-1-02#5':'EMIXED_RATE_BASES\x20(17)','R-A-1-03#0':'EMULTIPLE_SURPLUS\x20(5)','R-A-1-04#0':'NO\x20chain\x20rejection\x20—\x20allocation\x20pays\x20Rate\x20legs\x20then\x20the\x20Surplus\x20remainder\x20verbatim,\x20and\x20order_allocators\x20freezes\x20at\x20Service\x20publish\x20(E_ALREADY_PUBLISHED\x20=\x206),\x20so\x20the\x20misrouted\x20share\x20is\x20permanent','R-A-1-03#1':'EAMOUNT_BELOW_THRESHOLD\x20(12)','R-A-1-03#2':'EAMOUNT_EXCEEDS_MAX\x20(13)','R-A-2-02#0':'ERECIPIENT_IDENTIFIER_NOT_ADDRESS\x20(1)','R-A-2-04#0':'ERECIPIENT_NOT_FOR_OBJECT\x20(15)','R-A-2-04#1':'NO\x20chain\x20rejection\x20when\x20the\x20anchor\x20is\x20None\x20—\x20allocation.move:444-448\x20gates\x20the\x20ERECIPIENT_NOT_FOR_OBJECT\x20(15)\x20assertion\x20on\x20option::is_some,\x20and\x20the\x20comment\x20at\x20allocation.move:434-443\x20hands\x20the\x20due-diligence\x20obligation\x20to\x20this\x20tooling\x20layer;\x20order/arbitration\x20flows\x20always\x20anchor\x20(service.move:394,\x20arbitration.move:342),\x20so\x20None\x20is\x20reachable\x20only\x20via\x20standalone/custom\x20PaymentInfo','R-A-5-01#0':'E_ALLOCATION_ALREADY_SPECIFIED','R-A-5-02#0':'ENO_PAYMENT_INFO\x20(9)','R-RECIPIENT-03#0':'NO\x20chain\x20rejection\x20for\x20an\x20Entity\x20recipient\x20of\x20any\x20address\x20—\x20the\x20SDK\x20substitutes\x20the\x20default\x20local\x20account\x20before\x20the\x20address\x20reaches\x20Move,\x20and\x20allocation.move:250-255\x20swallows\x20Recipient::Entity\x20in\x20a\x20(_)\x20catch-all\x20at\x20declaration\x20while\x20allocation.move:451-453\x20/\x20:514\x20forwards\x20the\x20raw\x20address\x20straight\x20to\x20the\x20payout\x20constructor\x20(retracted\x202026-10-06:\x20there\x20is\x20no\x20ERECIPIENT_ZERO_ENTITY\x20constant;\x20grep\x20returns\x200\x20.move\x20hits)'},RELATED_GUARD_RISK={'R-A-2-01#0':'R-C3-06','R-A-3-04#0':'R-C3-06\x20(Signer\x20binding)\x20/\x20time-lock\x20patterns','R-A-4-01#0':'R-X1-05','R-A-4-03#0':'reentrancy\x20low'};export function allocationRiskFacts(b){const c=b['allocators_config'],d=!!c,e=d?c['allocators']:[];let f,g;if(d&&e['length']>0x0)for(let a4=0x0;a4<e['length'];a4++){if(e[a4]['sharing']['length']===0x0){f=a4,g=e[a4]['guard'];break;}}let h,j,k,l=![],n=![];if(d)for(let a5=0x0;a5<e['length'];a5++){const a6=e[a5],a7=a6['sharing']['some'](af=>af['mode']==='RateGross'),a8=a6['sharing']['filter'](af=>af['mode']==='Amount')['reduce']((af,ag)=>af+Number(ag['sharing']),0x0);if(a7&&a8>0x0)continue;const a9=a7&&a8===0x0&&a6['sharing']['some'](af=>af['mode']==='Rate'),aa=a6['sharing']['filter'](af=>af['mode']==='Rate'||a9&&af['mode']==='RateGross');if(aa['length']===0x0)continue;const ab=aa['map'](af=>Number(af['sharing']));if(ab['some'](af=>!Number['isFinite'](af)))continue;const ad=ab['reduce']((af,ag)=>af+ag,0x0),ae=a6['sharing']['some'](af=>af['mode']==='Surplus');if(!ae&&ad!==RATE_TOTAL_FULL){h=a5,j=a6['guard'],k=ad,l=!![];break;}if(ae&&ad>RATE_TOTAL_FULL){h=a5,j=a6['guard'],k=ad,n=!![];break;}}let o,p,q,r,t,u,v=![],w,x;if(d)for(let af=0x0;af<e['length'];af++){const ag=e[af],ah=ag['sharing']['some'](am=>am['mode']==='Rate'),ai=ag['sharing']['filter'](am=>am['mode']==='RateGross');if(ai['length']===0x0)continue;const aj=ag['sharing']['filter'](am=>am['mode']==='Amount')['reduce']((am,an)=>am+Number(an['sharing']),0x0);if(ah){if(aj>0x0){v=!![],w=af,x=ag['guard'];break;}continue;}const ak=ai['map'](am=>Number(am['sharing']));if(ak['some'](am=>!Number['isFinite'](am))||!Number['isFinite'](aj))continue;const al=ak['reduce']((am,an)=>am+an,0x0);if(al>RATE_TOTAL_FULL){o='sum_exceeds_10000',p=af,q=ag['guard'],r=al,t=aj;break;}if(ag['max']!=null){const am=Number(ag['max']);if(Number['isFinite'](am)&&aj*RATE_TOTAL_FULL+al*am>am*RATE_TOTAL_FULL){o='cap_fit',p=af,q=ag['guard'],r=al,t=aj,u=am;break;}}else{if(aj>0x0&&al>=RATE_TOTAL_FULL){o='fixed_full',p=af,q=ag['guard'],r=al,t=aj;break;}}}let y,z,A,B,C,D,E;if(d){const an=Number(c['threshold']);for(let ao=0x0;ao<e['length'];ao++){const ap=e[ao],aq=ap['sharing']['filter'](at=>at['mode']==='Surplus')['length'];if(aq>0x1){y='multiple_surplus',z=ao,A=ap['guard'],B=aq;break;}const ar=ap['sharing']['filter'](at=>at['mode']==='Amount')['reduce']((at,au)=>at+Number(au['sharing']),0x0),as=ap['sharing']['some'](at=>at['mode']==='Rate'||at['mode']==='Surplus');if(!as&&ar>0x0&&ar<an){y='below_threshold',z=ao,A=ap['guard'],C=ar,D=an;break;}if(ap['max']!=null&&ar>Number(ap['max'])){y='exceeds_max',z=ao,A=ap['guard'],C=ar,E=Number(ap['max']);break;}}}let F=![],G,H,I;if(d)for(let at=0x0;at<e['length'];at++){const au=e[at],av=au['sharing']['some'](ax=>'Signer'in ax['who']),aw=b['guard_signer_bindings']?.[au['guard']]===!![];if(isUnboundSignerTheft({'recipient_is_signer':av,'caller_identity_constrained':aw})){F=!![],G=at,H=au['guard'],I=aw;break;}}let J,K,L;if(d&&b['passport_identifier_types'])for(let ax=0x0;ax<e['length'];ax++){const ay=e[ax],az=ay['sharing']['find'](aC=>'GuardIdentifier'in aC['who']);if(!az)continue;const aA=az['who']['GuardIdentifier'],aB=b['passport_identifier_types'][aA];if(aB!==undefined&&aB!=='address'){J=aA,K=aB,L=ax;break;}}let M=![],N,O,P,Q;if(d){const aC=e['map'](aE=>aE['guard']),aD=new Set(aC);if(aD['size']!==aC['length']){const aE=aC['filter']((aF,aG)=>aC['indexOf'](aF)!==aG);M=!![],N=aC['length'],O=aD['size'],P=aE['join'](',\x20'),Q=aE['join'](',');}}const R=b['payment_info_for_object']!==undefined,S=d&&e['some'](aF=>aF['sharing']['some'](aG=>'GuardIdentifier'in aG['who'])),T=!!b['payment_info_for_object'];let U=![],V,W;if(d&&b['referenced_treasuries_permissions']&&b['host_service_permission'])for(const aF of e){for(const aG of aF['sharing']){if(!(aG['who']!==null&&typeof aG['who']==='object'&&'Entity'in aG['who']))continue;const aH=aG['who']['Entity'],aI=b['referenced_treasuries_permissions'][aH];if(aI&&aI!==b['host_service_permission']){U=!![],V=aH,W=aI;break;}}if(U)break;}let X;if(b['trigger_source']==='standalone'&&d){const aJ=[];for(const aK of e){const aL=b['guard_signer_bindings']?.[aK['guard']]===!![],aM=b['guard_has_time_lock']?.[aK['guard']]===!![];if(!aL&&!aM)aJ['push'](aK['guard']);}X=aJ;}let Y;if(d)for(let aN=0x0;aN<e['length'];aN++){const aO=e[aN],aP=aO['sharing']['length']>0x0&&aO['sharing']['every'](aQ=>aQ['mode']==='Amount');if(aP){Y=aN;break;}}let Z,a0,a1;if(d){const aQ=aS=>{if(aS!==null&&typeof aS==='object'){if('Entity'in aS)return'entity:'+String(aS['Entity'])['trim']()['toLowerCase']();if('GuardIdentifier'in aS)return'guard_identifier:'+Number(aS['GuardIdentifier']);if('Signer'in aS)return'signer';}return undefined;},aR=aS=>{if(aS!==null&&typeof aS==='object'){if('Entity'in aS)return'Entity('+aS['Entity']+')';if('GuardIdentifier'in aS)return'GuardIdentifier('+aS['GuardIdentifier']+')';if('Signer'in aS)return'Signer';}return String(aS);};for(let aS=0x0;aS<e['length'];aS++){const aT=e[aS],aU=new Set(aT['sharing']['filter'](aW=>aW['mode']==='Rate'||aW['mode']==='RateGross')['map'](aW=>aQ(aW['who']))['filter'](aW=>aW!==undefined));if(aU['size']===0x0)continue;const aV=aT['sharing']['find'](aW=>{if(aW['mode']!=='Surplus')return![];const aX=aQ(aW['who']);return aX!==undefined&&aU['has'](aX);});if(aV){Z=aS,a0=aT['guard'],a1=aR(aV['who']);break;}}}const a2=d?checkEntityRecipientsSync(c,{'builderAddress':b['builder_address']}):[],a3=a2['map'](aW=>'Allocator['+aW['allocator_index']+'].sharing['+aW['sharing_index']+']\x20('+aW['reason']+')');return{'allocators_config_present':d,'allocators_count':d?e['length']:undefined,'allocators_empty':d&&e['length']===0x0,'empty_sharing_allocator_index':f,'empty_sharing_allocator_guard':g,'rate_rule_index':h,'rate_rule_guard':j,'rate_rule_sum':k,'rate_rule_pure':l,'rate_rule_exceed':n,'rate_total_full':RATE_TOTAL_FULL,'rate_gross_branch':o,'rate_gross_index':p,'rate_gross_guard':q,'rate_gross_sum':r,'rate_gross_fix':t,'rate_gross_max':u,'mixed_rate_bases_present':v,'mixed_rate_bases_index':w,'mixed_rate_bases_guard':x,'amount_rule_branch':y,'amount_rule_index':z,'amount_rule_guard':A,'amount_rule_surplus_count':B,'amount_rule_amount_sum':C,'amount_rule_threshold':D,'amount_rule_max':E,'surplus_dup_rate_index':Z,'surplus_dup_rate_guard':a0,'surplus_dup_rate_recipient':a1,'signer_theft_detected':F,'signer_theft_index':G,'signer_theft_guard':H,'signer_theft_guard_bound':I,'guard_id_bad_identifier':J,'guard_id_bad_type':K,'guard_id_bad_index':L,'entity_recipient_bad_count':a2['length'],'entity_recipient_bad_count_display':String(a2['length']),'entity_recipient_bad_rows_csv_sp':a3['length']>0x0?a3['join'](',\x20'):undefined,'entity_recipient_bad_rows_csv':a3['length']>0x0?a3['join'](','):undefined,'duplicate_guards_present':M,'allocators_total':N,'allocators_unique':O,'duplicate_guards_csv_sp':P,'duplicate_guards_csv':Q,'for_object_anchor_known':R,'guard_identifier_recipient_present':S,'for_object_anchor_set':T,'for_object_anchor':R&&T?b['payment_info_for_object']??undefined:undefined,'host_service_published':b['host_service_published'],'treasury_perm_mismatch':U,'treasury_perm_entity':V,'treasury_perm_treasury':W,'host_service_permission':b['host_service_permission'],'allocation_create_op':b['operation_type']==='create','allocation_standalone':b['trigger_source']==='standalone','trigger_source_display':b['trigger_source']??'unknown','standalone_weak_guards_count':X?.['length'],'standalone_weak_guards_csv_sp':X?.['join'](',\x20'),'standalone_weak_guards_csv':X?.['join'](','),'has_fallback_allocator':b['has_fallback_allocator'],'guard_conditions_mutually_exclusive':b['guard_conditions_mutually_exclusive'],'has_fallback_allocator_display':String(b['has_fallback_allocator']??![]),'mutually_exclusive_display':String(b['guard_conditions_mutually_exclusive']??![]),'pure_amount_index':Y,'order_already_has_allocation':b['order_already_has_allocation'],'bound_order_display':b['bound_order']??'unknown','bound_order_paren_display':b['bound_order']??'(unknown)','has_payment_info':b['has_payment_info'],'operation_type':b['operation_type'],'max_allocator_count':MAX_ALLOCATOR_COUNT};}function allocationRuleBook(){const a=getJudgmentDoc()['rules']['domains']['allocation'];if(!a)throw new Error('factory\x20rule\x20pack\x20\x27allocation\x27\x20missing\x20—\x20broken\x20installation');return a['rules'];}function firedCaseKey(a,b,c){const d=a['find'](e=>e['rule_id']===c);if(d)for(let e=0x0;e<d['cases']['length'];e++){if(evaluateCondition(d['cases'][e]['when'],b))return c+'#'+e;}return c+'#0';}function findingToAllocationRisk(a,b){const c=RELATED_MOVE_ERROR[b],d=RELATED_GUARD_RISK[b];return{'id':a['rule_id'],'level':a['level'],'category':a['dimension']??'structural','title':a['title'],'description':a['description'],'affected_stakeholders':a['stakeholders']??[],'scenario':a['scenario']??'','mitigation':a['mitigation']??'','evidence':a['evidence'],...c!==undefined?{'related_move_error':c}:{},...d!==undefined?{'related_guard_risk':d}:{},'auto_fixable':AUTO_FIXABLE['has'](b),...a['exposure']!=null?{'exposure':a['exposure']}:{}};}export const ALLOCATION_RISK_VERSION='1.2.0';export function getAllRiskRules(){const a=factoryRulePack('allocation');if(!a)return[];return a['rules']['map'](b=>({'id':b['rule_id'],'category':b['dimension']??'structural','trigger':b['trigger']??'','check':c=>{const d=allocationRiskFacts(c),{findings:e}=evaluateRuleBook([b],d);return e['length']>0x0?findingToAllocationRisk(e[0x0],firedCaseKey([b],d,b['rule_id'])):null;}}));}export function assessAllocationRisks(a){const b=allocationRuleBook(),c=allocationRiskFacts(a),{findings:d}=evaluateRuleBook(b,c),e=d['map'](j=>findingToAllocationRisk(j,firedCaseKey(b,c,j['rule_id']))),f=e['length']===0x0?'low':e['some'](j=>j['level']==='critical')?'critical':e['some'](j=>j['level']==='high')?'high':e['some'](j=>j['level']==='medium')?'medium':'low',g={},h={};for(const j of e){g[j['category']]=(g[j['category']]??0x0)+0x1,h[j['level']]=(h[j['level']]??0x0)+0x1;}const i={};for(const k of e){for(const l of k['affected_stakeholders']){if(!i[l])i[l]=[];i[l]['push'](k['id']+':\x20'+k['mitigation']);}}return{'summary':'Assessed\x20'+e['length']+'\x20risk(s)\x20across\x20'+Object['keys'](g)['length']+'\x20categories','risks':e,'overall_risk':f,'risks_by_category':g,'risks_by_level':h,'stakeholder_advice':i,'needs_human_review':e['some'](m=>m['level']==='critical'||m['level']==='high'),'blocks_publish':e['some'](m=>m['level']==='critical')};}export{ALLOCATION_ERROR_CODES};
|
|
1
|
+
import{MAX_ALLOCATOR_COUNT,RATE_TOTAL_FULL,ALLOCATION_ERROR_CODES}from'./allocation-ledger.js';import{isUnboundSignerTheft}from'./recipient-constraint.js';import{checkEntityRecipientsSync}from'./entity-recipient-guard.js';import{getJudgmentDoc,factoryRulePack}from'../config/judgment.js';import{evaluateRuleBook,evaluateCondition}from'../config/rule-engine.js';const AUTO_FIXABLE=new Set(['R-A-1-02#0','R-A-1-02#1','R-A-1-02#2','R-A-1-02#3','R-A-1-02#4','R-A-1-03#0','R-A-1-03#2','R-A-2-03#0','R-A-5-03#0']),RELATED_MOVE_ERROR={'R-A-1-01#0':'EALLOCATORS_EMPTY\x20(8)\x20/\x20ENO_ALLOCATOR\x20(3)','R-A-1-01#1':'ENO_ALLOCATOR\x20(3)','R-A-1-02#0':'ERATE_NOT_10000\x20(4)','R-A-1-02#1':'ERATE_EXCEEDS_10000\x20(6)','R-A-1-02#2':'ERATE_EXCEEDS_10000\x20(6)','R-A-1-02#3':'ERATE_EXCEEDS_10000\x20(6)','R-A-1-02#4':'ERATE_EXCEEDS_10000\x20(6)','R-A-1-02#5':'EMIXED_RATE_BASES\x20(17)','R-A-1-03#0':'EMULTIPLE_SURPLUS\x20(5)','R-A-1-04#0':'NO\x20chain\x20rejection\x20—\x20allocation\x20pays\x20Rate\x20legs\x20then\x20the\x20Surplus\x20remainder\x20verbatim,\x20and\x20order_allocators\x20freezes\x20at\x20Service\x20publish\x20(E_ALREADY_PUBLISHED\x20=\x206),\x20so\x20the\x20misrouted\x20share\x20is\x20permanent','R-A-1-03#1':'EAMOUNT_BELOW_THRESHOLD\x20(12)','R-A-1-03#2':'EAMOUNT_EXCEEDS_MAX\x20(13)','R-A-2-02#0':'ERECIPIENT_IDENTIFIER_NOT_ADDRESS\x20(1)','R-A-2-04#0':'ERECIPIENT_NOT_FOR_OBJECT\x20(15)','R-A-2-04#1':'NO\x20chain\x20rejection\x20when\x20the\x20anchor\x20is\x20None\x20—\x20allocation.move:444-448\x20gates\x20the\x20ERECIPIENT_NOT_FOR_OBJECT\x20(15)\x20assertion\x20on\x20option::is_some,\x20and\x20the\x20comment\x20at\x20allocation.move:434-443\x20hands\x20the\x20due-diligence\x20obligation\x20to\x20this\x20tooling\x20layer;\x20order/arbitration\x20flows\x20always\x20anchor\x20(service.move:394,\x20arbitration.move:342),\x20so\x20None\x20is\x20reachable\x20only\x20via\x20standalone/custom\x20PaymentInfo','R-A-2-04#2':'a\x20submission\x20that\x20MATCHES\x20the\x20anchor\x20pays\x20the\x20anchor\x20object\x20by\x20design\x20(order\x20/\x20arbitration\x20refunds):\x20the\x20CoinWrapper\x20is\x20transferred\x20to\x20the\x20bound\x20object\x20and\x20the\x20Order\x27s\x20owner-claim\x20entry\x20extracts\x20it\x20to\x20order.owner\x20at\x20extraction\x20time\x20(an\x20ownership\x20change\x20is\x20followed;\x20any\x20keeper\x20may\x20drive\x20step\x202).\x20A\x20MISMATCHED\x20submission\x20aborts\x20ERECIPIENT_NOT_FOR_OBJECT\x20(15)\x20—\x20that\x20is\x20the\x20cross-order\x20redirect\x20guard,\x20not\x20a\x20ban\x20on\x20the\x20shape','R-A-5-01#0':'E_ALLOCATION_ALREADY_SPECIFIED','R-A-5-02#0':'ENO_PAYMENT_INFO\x20(9)','R-RECIPIENT-03#0':'NO\x20chain\x20rejection\x20for\x20an\x20Entity\x20recipient\x20of\x20any\x20address\x20—\x20the\x20SDK\x20substitutes\x20the\x20default\x20local\x20account\x20before\x20the\x20address\x20reaches\x20Move,\x20and\x20allocation.move:250-255\x20swallows\x20Recipient::Entity\x20in\x20a\x20(_)\x20catch-all\x20at\x20declaration\x20while\x20allocation.move:451-453\x20/\x20:514\x20forwards\x20the\x20raw\x20address\x20straight\x20to\x20the\x20payout\x20constructor\x20(retracted\x202026-10-06:\x20there\x20is\x20no\x20ERECIPIENT_ZERO_ENTITY\x20constant;\x20grep\x20returns\x200\x20.move\x20hits)'},RELATED_GUARD_RISK={'R-A-2-01#0':'R-C3-06','R-A-3-04#0':'R-C3-06\x20(Signer\x20binding)\x20/\x20time-lock\x20patterns','R-A-4-01#0':'R-X1-05','R-A-4-03#0':'reentrancy\x20low'};export function allocationRiskFacts(b){const c=b['allocators_config'],d=!!c,e=d?c['allocators']:[];let f,g;if(d&&e['length']>0x0)for(let a4=0x0;a4<e['length'];a4++){if(e[a4]['sharing']['length']===0x0){f=a4,g=e[a4]['guard'];break;}}let h,j,k,l=![],n=![];if(d)for(let a5=0x0;a5<e['length'];a5++){const a6=e[a5],a7=a6['sharing']['some'](af=>af['mode']==='RateGross'),a8=a6['sharing']['filter'](af=>af['mode']==='Amount')['reduce']((af,ag)=>af+Number(ag['sharing']),0x0);if(a7&&a8>0x0)continue;const a9=a7&&a8===0x0&&a6['sharing']['some'](af=>af['mode']==='Rate'),aa=a6['sharing']['filter'](af=>af['mode']==='Rate'||a9&&af['mode']==='RateGross');if(aa['length']===0x0)continue;const ab=aa['map'](af=>Number(af['sharing']));if(ab['some'](af=>!Number['isFinite'](af)))continue;const ad=ab['reduce']((af,ag)=>af+ag,0x0),ae=a6['sharing']['some'](af=>af['mode']==='Surplus');if(!ae&&ad!==RATE_TOTAL_FULL){h=a5,j=a6['guard'],k=ad,l=!![];break;}if(ae&&ad>RATE_TOTAL_FULL){h=a5,j=a6['guard'],k=ad,n=!![];break;}}let o,p,q,r,t,u,v=![],w,x;if(d)for(let af=0x0;af<e['length'];af++){const ag=e[af],ah=ag['sharing']['some'](am=>am['mode']==='Rate'),ai=ag['sharing']['filter'](am=>am['mode']==='RateGross');if(ai['length']===0x0)continue;const aj=ag['sharing']['filter'](am=>am['mode']==='Amount')['reduce']((am,an)=>am+Number(an['sharing']),0x0);if(ah){if(aj>0x0){v=!![],w=af,x=ag['guard'];break;}continue;}const ak=ai['map'](am=>Number(am['sharing']));if(ak['some'](am=>!Number['isFinite'](am))||!Number['isFinite'](aj))continue;const al=ak['reduce']((am,an)=>am+an,0x0);if(al>RATE_TOTAL_FULL){o='sum_exceeds_10000',p=af,q=ag['guard'],r=al,t=aj;break;}if(ag['max']!=null){const am=Number(ag['max']);if(Number['isFinite'](am)&&aj*RATE_TOTAL_FULL+al*am>am*RATE_TOTAL_FULL){o='cap_fit',p=af,q=ag['guard'],r=al,t=aj,u=am;break;}}else{if(aj>0x0&&al>=RATE_TOTAL_FULL){o='fixed_full',p=af,q=ag['guard'],r=al,t=aj;break;}}}let y,z,A,B,C,D,E;if(d){const an=Number(c['threshold']);for(let ao=0x0;ao<e['length'];ao++){const ap=e[ao],aq=ap['sharing']['filter'](at=>at['mode']==='Surplus')['length'];if(aq>0x1){y='multiple_surplus',z=ao,A=ap['guard'],B=aq;break;}const ar=ap['sharing']['filter'](at=>at['mode']==='Amount')['reduce']((at,au)=>at+Number(au['sharing']),0x0),as=ap['sharing']['some'](at=>at['mode']==='Rate'||at['mode']==='Surplus'||at['mode']==='Formula');if(!as&&ar>0x0&&ar<an){y='below_threshold',z=ao,A=ap['guard'],C=ar,D=an;break;}if(ap['max']!=null&&ar>Number(ap['max'])){y='exceeds_max',z=ao,A=ap['guard'],C=ar,E=Number(ap['max']);break;}}}let F=![],G,H,I;if(d)for(let at=0x0;at<e['length'];at++){const au=e[at],av=au['sharing']['some'](ax=>'Signer'in ax['who']),aw=b['guard_signer_bindings']?.[au['guard']]===!![];if(isUnboundSignerTheft({'recipient_is_signer':av,'caller_identity_constrained':aw})){F=!![],G=at,H=au['guard'],I=aw;break;}}let J,K,L;if(d&&b['passport_identifier_types'])for(let ax=0x0;ax<e['length'];ax++){const ay=e[ax],az=ay['sharing']['find'](aC=>'GuardIdentifier'in aC['who']);if(!az)continue;const aA=az['who']['GuardIdentifier'],aB=b['passport_identifier_types'][aA];if(aB!==undefined&&aB!=='address'){J=aA,K=aB,L=ax;break;}}let M=![],N,O,P,Q;if(d){const aC=e['map'](aE=>aE['guard']),aD=new Set(aC);if(aD['size']!==aC['length']){const aE=aC['filter']((aF,aG)=>aC['indexOf'](aF)!==aG);M=!![],N=aC['length'],O=aD['size'],P=aE['join'](',\x20'),Q=aE['join'](',');}}const R=b['payment_info_for_object']!==undefined,S=d&&e['some'](aF=>aF['sharing']['some'](aG=>'GuardIdentifier'in aG['who'])),T=!!b['payment_info_for_object'];let U=![],V,W;if(d&&b['referenced_treasuries_permissions']&&b['host_service_permission'])for(const aF of e){for(const aG of aF['sharing']){if(!(aG['who']!==null&&typeof aG['who']==='object'&&'Entity'in aG['who']))continue;const aH=aG['who']['Entity'],aI=b['referenced_treasuries_permissions'][aH];if(aI&&aI!==b['host_service_permission']){U=!![],V=aH,W=aI;break;}}if(U)break;}let X;if(b['trigger_source']==='standalone'&&d){const aJ=[];for(const aK of e){const aL=b['guard_signer_bindings']?.[aK['guard']]===!![],aM=b['guard_has_time_lock']?.[aK['guard']]===!![];if(!aL&&!aM)aJ['push'](aK['guard']);}X=aJ;}let Y;if(d)for(let aN=0x0;aN<e['length'];aN++){const aO=e[aN],aP=aO['sharing']['length']>0x0&&aO['sharing']['every'](aQ=>aQ['mode']==='Amount');if(aP){Y=aN;break;}}let Z,a0,a1;if(d){const aQ=aS=>{if(aS!==null&&typeof aS==='object'){if('Entity'in aS)return'entity:'+String(aS['Entity'])['trim']()['toLowerCase']();if('GuardIdentifier'in aS)return'guard_identifier:'+Number(aS['GuardIdentifier']);if('Signer'in aS)return'signer';}return undefined;},aR=aS=>{if(aS!==null&&typeof aS==='object'){if('Entity'in aS)return'Entity('+aS['Entity']+')';if('GuardIdentifier'in aS)return'GuardIdentifier('+aS['GuardIdentifier']+')';if('Signer'in aS)return'Signer';}return String(aS);};for(let aS=0x0;aS<e['length'];aS++){const aT=e[aS],aU=new Set(aT['sharing']['filter'](aW=>aW['mode']==='Rate'||aW['mode']==='RateGross')['map'](aW=>aQ(aW['who']))['filter'](aW=>aW!==undefined));if(aU['size']===0x0)continue;const aV=aT['sharing']['find'](aW=>{if(aW['mode']!=='Surplus')return![];const aX=aQ(aW['who']);return aX!==undefined&&aU['has'](aX);});if(aV){Z=aS,a0=aT['guard'],a1=aR(aV['who']);break;}}}const a2=d?checkEntityRecipientsSync(c,{'builderAddress':b['builder_address']}):[],a3=a2['map'](aW=>'Allocator['+aW['allocator_index']+'].sharing['+aW['sharing_index']+']\x20('+aW['reason']+')');return{'allocators_config_present':d,'allocators_count':d?e['length']:undefined,'allocators_empty':d&&e['length']===0x0,'empty_sharing_allocator_index':f,'empty_sharing_allocator_guard':g,'rate_rule_index':h,'rate_rule_guard':j,'rate_rule_sum':k,'rate_rule_pure':l,'rate_rule_exceed':n,'rate_total_full':RATE_TOTAL_FULL,'rate_gross_branch':o,'rate_gross_index':p,'rate_gross_guard':q,'rate_gross_sum':r,'rate_gross_fix':t,'rate_gross_max':u,'mixed_rate_bases_present':v,'mixed_rate_bases_index':w,'mixed_rate_bases_guard':x,'amount_rule_branch':y,'amount_rule_index':z,'amount_rule_guard':A,'amount_rule_surplus_count':B,'amount_rule_amount_sum':C,'amount_rule_threshold':D,'amount_rule_max':E,'surplus_dup_rate_index':Z,'surplus_dup_rate_guard':a0,'surplus_dup_rate_recipient':a1,'signer_theft_detected':F,'signer_theft_index':G,'signer_theft_guard':H,'signer_theft_guard_bound':I,'guard_id_bad_identifier':J,'guard_id_bad_type':K,'guard_id_bad_index':L,'entity_recipient_bad_count':a2['length'],'entity_recipient_bad_count_display':String(a2['length']),'entity_recipient_bad_rows_csv_sp':a3['length']>0x0?a3['join'](',\x20'):undefined,'entity_recipient_bad_rows_csv':a3['length']>0x0?a3['join'](','):undefined,'duplicate_guards_present':M,'allocators_total':N,'allocators_unique':O,'duplicate_guards_csv_sp':P,'duplicate_guards_csv':Q,'for_object_anchor_known':R,'guard_identifier_recipient_present':S,'for_object_anchor_set':T,'for_object_anchor':R&&T?b['payment_info_for_object']??undefined:undefined,'host_service_published':b['host_service_published'],'treasury_perm_mismatch':U,'treasury_perm_entity':V,'treasury_perm_treasury':W,'host_service_permission':b['host_service_permission'],'allocation_create_op':b['operation_type']==='create','allocation_standalone':b['trigger_source']==='standalone','trigger_source_display':b['trigger_source']??'unknown','standalone_weak_guards_count':X?.['length'],'standalone_weak_guards_csv_sp':X?.['join'](',\x20'),'standalone_weak_guards_csv':X?.['join'](','),'has_fallback_allocator':b['has_fallback_allocator'],'guard_conditions_mutually_exclusive':b['guard_conditions_mutually_exclusive'],'has_fallback_allocator_display':String(b['has_fallback_allocator']??![]),'mutually_exclusive_display':String(b['guard_conditions_mutually_exclusive']??![]),'pure_amount_index':Y,'order_already_has_allocation':b['order_already_has_allocation'],'bound_order_display':b['bound_order']??'unknown','bound_order_paren_display':b['bound_order']??'(unknown)','has_payment_info':b['has_payment_info'],'operation_type':b['operation_type'],'max_allocator_count':MAX_ALLOCATOR_COUNT};}function allocationRuleBook(){const a=getJudgmentDoc()['rules']['domains']['allocation'];if(!a)throw new Error('factory\x20rule\x20pack\x20\x27allocation\x27\x20missing\x20—\x20broken\x20installation');return a['rules'];}function firedCaseKey(a,b,c){const d=a['find'](e=>e['rule_id']===c);if(d)for(let e=0x0;e<d['cases']['length'];e++){if(evaluateCondition(d['cases'][e]['when'],b))return c+'#'+e;}return c+'#0';}function findingToAllocationRisk(a,b){const c=RELATED_MOVE_ERROR[b],d=RELATED_GUARD_RISK[b];return{'id':a['rule_id'],'level':a['level'],'category':a['dimension']??'structural','title':a['title'],'description':a['description'],'affected_stakeholders':a['stakeholders']??[],'scenario':a['scenario']??'','mitigation':a['mitigation']??'','evidence':a['evidence'],...c!==undefined?{'related_move_error':c}:{},...d!==undefined?{'related_guard_risk':d}:{},'auto_fixable':AUTO_FIXABLE['has'](b),...a['exposure']!=null?{'exposure':a['exposure']}:{}};}export const ALLOCATION_RISK_VERSION='1.2.0';export function getAllRiskRules(){const a=factoryRulePack('allocation');if(!a)return[];return a['rules']['map'](b=>({'id':b['rule_id'],'category':b['dimension']??'structural','trigger':b['trigger']??'','check':c=>{const d=allocationRiskFacts(c),{findings:e}=evaluateRuleBook([b],d);return e['length']>0x0?findingToAllocationRisk(e[0x0],firedCaseKey([b],d,b['rule_id'])):null;}}));}export function assessAllocationRisks(a){const b=allocationRuleBook(),c=allocationRiskFacts(a),{findings:d}=evaluateRuleBook(b,c),e=d['map'](j=>findingToAllocationRisk(j,firedCaseKey(b,c,j['rule_id']))),f=e['length']===0x0?'low':e['some'](j=>j['level']==='critical')?'critical':e['some'](j=>j['level']==='high')?'high':e['some'](j=>j['level']==='medium')?'medium':'low',g={},h={};for(const j of e){g[j['category']]=(g[j['category']]??0x0)+0x1,h[j['level']]=(h[j['level']]??0x0)+0x1;}const i={};for(const k of e){for(const l of k['affected_stakeholders']){if(!i[l])i[l]=[];i[l]['push'](k['id']+':\x20'+k['mitigation']);}}return{'summary':'Assessed\x20'+e['length']+'\x20risk(s)\x20across\x20'+Object['keys'](g)['length']+'\x20categories','risks':e,'overall_risk':f,'risks_by_category':g,'risks_by_level':h,'stakeholder_advice':i,'needs_human_review':e['some'](m=>m['level']==='critical'||m['level']==='high'),'blocks_publish':e['some'](m=>m['level']==='critical')};}export{ALLOCATION_ERROR_CODES};
|
|
@@ -21,8 +21,20 @@ export interface OrderFundFacts {
|
|
|
21
21
|
time: string | number;
|
|
22
22
|
remark?: string;
|
|
23
23
|
}[];
|
|
24
|
+
escrow_payouts_after_case: {
|
|
25
|
+
payment: string;
|
|
26
|
+
amount: string;
|
|
27
|
+
time: string | number;
|
|
28
|
+
}[];
|
|
24
29
|
order_time?: string | number;
|
|
25
30
|
case_time?: string | number;
|
|
31
|
+
object_versions: {
|
|
32
|
+
arb_case?: string;
|
|
33
|
+
order?: string;
|
|
34
|
+
allocation?: string;
|
|
35
|
+
progress?: string;
|
|
36
|
+
};
|
|
37
|
+
read_consistency: string;
|
|
26
38
|
}
|
|
27
39
|
export interface BuiltOrderFundFacts {
|
|
28
40
|
structured: OrderFundFacts;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{batchQueryObjectsByIds}from'../graph/onchain/sdk-batch.js';const PAYMENT_HISTORY_CAP=0x5;function asBigIntOrUndefined(a){try{if(typeof a==='bigint')return a;if(typeof a==='number'&&Number['isFinite'](a))return BigInt(Math['trunc'](a));if(typeof a==='string'&&a['trim']()!=='')return BigInt(a);}catch{}return undefined;}function pickData(a){return a?.['data']??a;}function pickAddr(a){return a?.['object']??a?.['data']?.['object']??a?.['id'];}export async function buildOrderFundFacts(b){const c=b['noCache']??!![];let d,e,f,g,h;if(b['arbRef']){const
|
|
1
|
+
import{batchQueryObjectsByIds}from'../graph/onchain/sdk-batch.js';const PAYMENT_HISTORY_CAP=0x5;function asBigIntOrUndefined(a){try{if(typeof a==='bigint')return a;if(typeof a==='number'&&Number['isFinite'](a))return BigInt(Math['trunc'](a));if(typeof a==='string'&&a['trim']()!=='')return BigInt(a);}catch{}return undefined;}function asMsOrUndefined(a){if(typeof a==='number'&&Number['isFinite'](a))return a;if(typeof a==='string'&&/^\d+$/['test'](a['trim']()))return Number(a['trim']());return undefined;}function pickData(a){return a?.['data']??a;}function pickAddr(a){return a?.['object']??a?.['data']?.['object']??a?.['id'];}function rawVersion(a){const b=a?.['version']??a?.['data']?.['version'];return b===undefined||b===null||String(b)===''?undefined:String(b);}const READ_CONSISTENCY='live\x20read\x20(cache\x20bypassed);\x20a\x20read\x20issued\x20in\x20the\x20same\x20second\x20as\x20a\x20committing\x20transaction\x20can\x20trail\x20the\x20committed\x20effect\x20by\x20one\x20checkpoint\x20—\x20if\x20any\x20field\x20contradicts\x20a\x20transaction\x20just\x20submitted,\x20re-query\x20once\x20(compare\x20object_versions\x20across\x20the\x20two\x20reads)\x20before\x20concluding';export async function buildOrderFundFacts(b){const c=b['noCache']??!![];let d,e,f,g,h,i;if(b['arbRef']){const I=await batchQueryObjectsByIds([b['arbRef']],b['network'],c),J=I['find'](L=>pickData(L)?.['type']==='Arb'||pickData(L)?.['order']),K=pickData(J);i=rawVersion(J),K?.['order']&&typeof K['order']==='string'&&(d=K['order'],e=pickAddr(J),f=typeof K['status']==='number'?K['status']:undefined,g=K['indemnity']?.['amount']??null,h=K['time']);}if(!d&&b['orderRef'])d=b['orderRef'];if(!d)return undefined;const j=await batchQueryObjectsByIds([d],b['network'],c),k=pickData(j[0x0]);if(!k||k['amount']===undefined)return undefined;const l=rawVersion(j[0x0]),m=[];if(typeof k['allocation']==='string'&&k['allocation'])m['push'](k['allocation']);if(typeof k['progress']==='string'&&k['progress'])m['push'](k['progress']);const n=m['length']>0x0?await batchQueryObjectsByIds(m,b['network'],c):[],q=new Map();for(const L of n){const M=pickAddr(L);if(M)q['set'](M['toLowerCase'](),L);}const r=k['allocation']?q['get'](String(k['allocation'])['toLowerCase']()):undefined,s=pickData(r),u=k['progress']?q['get'](String(k['progress'])['toLowerCase']()):undefined,v=pickData(u),x=rawVersion(r),y=rawVersion(u),z=[],A=Array['isArray'](s?.['payment'])?s['payment']['slice'](-PAYMENT_HISTORY_CAP):[];if(A['length']>0x0){const N=await batchQueryObjectsByIds(A,b['network'],c),O=new Map();for(const P of N){const Q=pickAddr(P);if(Q)O['set'](Q['toLowerCase'](),P);}for(const R of A){const S=pickData(O['get'](String(R)['toLowerCase']()));if(!S)continue;z['push']({'payment':R,'amount':String(S['amount']??'0'),'time':S['time']??'',...S['info']?.['remark']?{'remark':String(S['info']['remark'])}:{}});}}const B=asBigIntOrUndefined(k['amount'])??0x0n,C=s?asBigIntOrUndefined(s['balance']):undefined,D=C!==undefined?B-C:undefined,E=asMsOrUndefined(h),F=[];if(E!==undefined)for(const T of z){const U=asMsOrUndefined(T['time']);U!==undefined&&U>E&&F['push']({'payment':T['payment'],'amount':T['amount'],'time':T['time']});}const G={...e?{'arb_case':e}:{},...f!==undefined?{'arb_status':f}:{},...g!==undefined?{'arb_indemnity':g}:{},'order':d,'order_amount':String(k['amount']),'claimed_by':typeof k['claimed_by']==='string'?k['claimed_by']:null,'progress_node':typeof v?.['current']==='string'&&v['current']!==''?v['current']:null,'allocation':typeof k['allocation']==='string'&&k['allocation']?k['allocation']:null,'allocation_balance':C!==undefined?String(C):null,'escrow_deficit':D!==undefined?String(D):null,'withdraw_history':z,'escrow_payouts_after_case':F,'object_versions':{...i?{'arb_case':i}:{},...l?{'order':l}:{},...x?{'allocation':x}:{},...y?{'progress':y}:{}},'read_consistency':READ_CONSISTENCY,...k['time']!==undefined?{'order_time':k['time']}:{},...h!==undefined?{'case_time':h}:{}},H=['ORDER\x20FUND\x20FACTS\x20(raw\x20units,\x20live\x20read):'];H['push']('-\x20freshness:\x20'+READ_CONSISTENCY),H['push']('-\x20order\x20'+d+':\x20amount='+G['order_amount']);G['allocation']?H['push']('-\x20escrow\x20allocation\x20'+G['allocation']+':\x20balance='+G['allocation_balance']+'\x20(deficit\x20vs\x20amount:\x20'+G['escrow_deficit']+')'):H['push']('-\x20escrow\x20allocation:\x20none\x20(zero-amount\x20order\x20carries\x20no\x20escrow)');H['push']('-\x20compensation\x20claimed_by:\x20'+(G['claimed_by']??'null\x20(unclaimed)')),H['push']('-\x20workflow\x20node:\x20'+(G['progress_node']??'(none)'));if(z['length']>0x0){H['push']('-\x20escrow\x20payouts\x20so\x20far\x20('+z['length']+(A['length']===PAYMENT_HISTORY_CAP?'+':'')+'):');for(const V of z){H['push']('\x20\x20*\x20'+V['amount']+'\x20at\x20'+V['time']+(V['remark']?'\x20—\x20'+V['remark']:'')+'\x20['+V['payment']+']');}}return D!==undefined&&D>0x0n&&H['push']('NET\x20GUIDANCE:\x20the\x20escrow\x20has\x20already\x20paid\x20out\x20'+D+'\x20raw\x20units\x20more\x20than\x20it\x20holds\x20—\x20'+'if\x20the\x20buyer\x20was\x20refunded\x20through\x20the\x20escrow\x20track\x20before\x20filing,\x20net\x20the\x20indemnity\x20against\x20the\x20refunded\x20principal;\x20'+'compensate\x20the\x20delta,\x20not\x20the\x20full\x20loss.'),G['claimed_by']&&H['push']('NOTE:\x20claimed_by\x20is\x20set\x20—\x20the\x20order\x20has\x20already\x20marked\x20a\x20compensation\x20claim;\x20a\x20further\x20ruling\x20pays\x20on\x20top\x20of\x20any\x20escrow\x20payout.'),F['length']>0x0&&H['push']('ESCROW\x20MOVED\x20DURING\x20THE\x20CASE:\x20'+F['length']+'\x20payout(s)\x20landed\x20after\x20the\x20case\x20was\x20filed\x20'+('(first:\x20'+F[0x0]['amount']+'\x20raw\x20at\x20'+F[0x0]['time']+').\x20')+'Reconcile\x20each\x20with\x20the\x20ruling\x20direction\x20—\x20a\x20sweep\x20that\x20contradicts\x20the\x20award\x20(e.g.\x20a\x20merchant\x20recover\x20on\x20a\x20'+'buyer-favorable\x20ruling)\x20belongs\x20in\x20the\x20ruling\x20text\x20and\x20the\x20parties\x27\x20statements,\x20never\x20in\x20a\x20silent\x20pass.'),H['push']('DUAL-TRACK\x20REMINDER:\x20the\x20escrow\x20track\x20(refund\x20/\x20recover\x20allocators)\x20and\x20this\x20arbitration\x20are\x20INDEPENDENT\x20'+'commercial\x20routes\x20—\x20the\x20protocol\x20deliberately\x20does\x20not\x20couple\x20them,\x20and\x20neither\x20blocks\x20the\x20other.\x20Both\x20are\x20'+'observable\x20here:\x20re-read\x20these\x20facts\x20before\x20you\x20finalize\x20the\x20ruling\x20and\x20again\x20before\x20the\x20indemnity\x20is\x20claimed;\x20'+'an\x20escrow\x20movement\x20that\x20lands\x20after\x20the\x20award\x20is\x20visible\x20in\x20the\x20payout\x20history\x20above.'),{'structured':G,'text':H['join']('\x0a')};}
|
|
@@ -36,12 +36,13 @@ export declare const ANTI_PATTERN_NODE_REGEX: RegExp;
|
|
|
36
36
|
export declare const REMEDY_FAMILY_NODE_REGEX: RegExp;
|
|
37
37
|
export declare function isRemedyLoopEdge(fromNode: string, toNode: string): boolean;
|
|
38
38
|
export type LoopTier = "renewal" | "remedy" | "charge";
|
|
39
|
-
export
|
|
39
|
+
export type ReentryKind = "none" | "review-loop" | "paid-cycle";
|
|
40
|
+
export declare function classifyLoopCycle(cycleNodes: string[], declared?: ReentryKind): LoopTier;
|
|
40
41
|
export interface MachineNodeAudit {
|
|
41
42
|
critical: string[];
|
|
42
43
|
warnings: string[];
|
|
43
44
|
}
|
|
44
|
-
export declare function auditMachineNodes(nodes: unknown[]): MachineNodeAudit;
|
|
45
|
+
export declare function auditMachineNodes(nodes: unknown[], declaredReentry?: ReentryKind): MachineNodeAudit;
|
|
45
46
|
export declare function computeTerminalReachability(nodes: unknown[]): {
|
|
46
47
|
terminals: string[];
|
|
47
48
|
unreachable: string[];
|
|
@@ -69,4 +70,4 @@ export declare function hasBlockingErrors(findings: AuditFinding[]): boolean;
|
|
|
69
70
|
export declare function getErrors(findings: AuditFinding[]): AuditFinding[];
|
|
70
71
|
export declare function getWarnings(findings: AuditFinding[]): AuditFinding[];
|
|
71
72
|
export declare function summarizeFindings(findings: AuditFinding[]): string;
|
|
72
|
-
export declare const AUDIT_RULES_VERSION =
|
|
73
|
+
export declare const AUDIT_RULES_VERSION = 11;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{MAX_INDEMNITY_MULTIPLE}from'./onchain-constants.js';import{lintForwardAmbiguity,findLoopCycles}from'./machine-topology.js';import{isRenewalLoopEdge}from'../participation/radar-core.js';function numericAmount(a){if(typeof a==='number')return Number['isFinite'](a)?a:undefined;if(typeof a==='string'){const b=a['trim']();if(/^\d+$/['test'](b))return Number(b);}return undefined;}export{numericAmount};export function salesItemsOf(a){if(Array['isArray'](a?.['sales']))return a['sales'];if(Array['isArray'](a?.['sales']?.['sales']))return a['sales']['sales'];return[];}export function allocatorCountOf(a){const b=a?.['order_allocators'];if(Array['isArray'](b))return b['length'];if(Array['isArray'](b?.['allocators']))return b['allocators']['length'];return 0x0;}export function arbitrationRefsOf(b){const c=b?.['arbitrations'];if(Array['isArray'](c))return c['filter'](e=>typeof e==='string');if(Array['isArray'](c?.['objects']))return c['objects']['filter'](e=>typeof e==='string');return[];}export function compensationFundOf(a){if(a?.['compensation_fund_add']?.['balance']!=null)return a['compensation_fund_add']['balance'];if(a?.['compensation_fund']!=null)return a['compensation_fund'];return undefined;}export function serviceNameOf(a){if(typeof a?.['object']==='string')return a['object'];if(typeof a?.['object']?.['name']==='string'&&a['object']['name'])return a['object']['name'];if(typeof a?.['namedNew']?.['name']==='string'&&a['namedNew']['name'])return a['namedNew']['name'];return undefined;}export function typeParameterOf(a){if(typeof a?.['type_parameter']==='string'&&a['type_parameter'])return a['type_parameter'];if(typeof a?.['object']?.['type_parameter']==='string'&&a['object']['type_parameter'])return a['object']['type_parameter'];if(typeof a?.['namedNew']?.['type_parameter']==='string'&&a['namedNew']['type_parameter'])return a['namedNew']['type_parameter'];return undefined;}export const DISPUTE_FAMILY_NODE_REGEX=/(^|_)(disputed?|arbitration|arb)(_|$)/i;export const FUND_TERMINAL_NODE_REGEX=/^(refund|refunded|deposit_refunded|deposit_deducted|cancel|cancelled)$/i;export const ANTI_PATTERN_NODE_REGEX=new RegExp(DISPUTE_FAMILY_NODE_REGEX['source']+'|'+FUND_TERMINAL_NODE_REGEX['source'],'i');export const REMEDY_FAMILY_NODE_REGEX=/(revis|review|rework|refund|cancel|return|claim)/i;export function isRemedyLoopEdge(a,b){return REMEDY_FAMILY_NODE_REGEX['test'](a)||REMEDY_FAMILY_NODE_REGEX['test'](b);}export function classifyLoopCycle(a){for(let b=0x0;b<a['length'];b++){if(isRenewalLoopEdge(a[b],a[(b+0x1)%a['length']]))return'renewal';}if(a['some'](c=>REMEDY_FAMILY_NODE_REGEX['test'](c)))return'remedy';return'charge';}export function auditMachineNodes(a){const b=[],c=[];if(!Array['isArray'](a)||a['length']===0x0)return c['push']('pre_publish:\x20machine\x20node\x20set\x20unavailable\x20—\x20topology\x20not\x20verifiable;\x20'+'verify\x20via\x20machineNode2file\x20BEFORE\x20publish\x20(immutable\x20after\x20publish,\x20IMMUT-001)'),{'critical':b,'warnings':c};const d=a;for(const q of d){const r=typeof q?.['name']==='string'?q['name']:'';if(!r)continue;if(DISPUTE_FAMILY_NODE_REGEX['test'](r))b['push']('R-M1-11:\x20machine\x20node\x20\x22'+r+'\x22\x20models\x20dispute\x20flow\x20—\x20'+'disputes\x20must\x20route\x20via\x20the\x20separate\x20Arbitration\x20object\x20(off-Machine);\x20'+'rename\x20the\x20node\x20to\x20the\x20business\x20state\x20that\x20triggers\x20it');else FUND_TERMINAL_NODE_REGEX['test'](r)&&c['push']('R-M1-11:\x20machine\x20node\x20\x22'+r+'\x22\x20uses\x20a\x20bare\x20fund-terminal\x20name\x20—\x20reaching\x20'+'it\x20moves\x20no\x20funds\x20by\x20itself.\x20This\x20is\x20legitimate\x20ONLY\x20when\x20a\x20refund\x20allocator\x20'+'rail\x27s\x20guard\x20anchors\x20to\x20this\x20node\x20(per-node\x20refund\x20tracks);\x20otherwise\x20rename\x20it\x20'+'to\x20the\x20business\x20state\x20(e.g.\x20cancel_requested\x20/\x20closed_cancel)\x20and\x20route\x20the\x20'+'refund\x20via\x20an\x20Allocator\x20triggered\x20by\x20that\x20state.\x20The\x20template\x20scanner\x20verifies\x20'+'the\x20anchoring\x20when\x20a\x20template\x20is\x20present.');}const e=new Set();for(const s of d){const t=typeof s?.['name']==='string'?s['name']:'';if(!t)continue;e['has'](t)&&b['push']('MC-C-04:\x20duplicate\x20machine\x20node\x20name\x20\x22'+t+'\x22\x20—\x20on-chain\x20will\x20reject\x20the\x20publish\x20transaction'),e['add'](t);}const g=d['some'](u=>Array['isArray'](u?.['pairs'])&&u['pairs']['some'](v=>v?.['prev_node']===''));!g&&b['push']('Machine\x20has\x20no\x20entry\x20pair\x20(prev_node=\x22\x22)\x20—\x20Progress\x20can\x20never\x20advance\x20'+'from\x20the\x20initial\x20state;\x20orders\x20are\x20permanently\x20stuck');const h=new Map();for(const u of d){const v=typeof u?.['name']==='string'?u['name']:'';if(!v)continue;if(!h['has'](v))h['set'](v,[]);for(const w of u?.['pairs']??[]){const x=w?.['prev_node'];if(typeof x==='string'&&x!==''){const y=h['get'](x);if(y)y['push'](v);else h['set'](x,[v]);}}}const i=findLoopCycles(h)['map'](z=>({'c':z,'tier':classifyLoopCycle(z['cycle'])})),j=i['filter'](z=>z['tier']==='renewal'),k=i['filter'](z=>z['tier']==='remedy'),l=i['filter'](z=>z['tier']==='charge');l['length']>0x0&&b['push']('pre_publish:\x20machine\x20contains\x20charge-bearing\x20loop\x20cycle(s)\x20'+l['map'](z=>'['+z['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20'+'on-chain\x20a\x20revisit\x20is\x20NOT\x20verified\x20to\x20re-fund\x20the\x20Allocation,\x20and\x20this\x20static\x20pass\x20sees\x20only\x20the\x20forward\x27s\x20guard\x20reference\x20'+'(never\x20the\x20guard\x20table),\x20so\x20a\x20per-revisit-fee\x20cycle\x20(retake\x20/\x20session-card\x20shape)\x20is\x20UNPROVABLE\x20here\x20even\x20though\x20the\x20'+'allocation.balance\x20Guard\x20query\x20(1051,\x20witness\x20OrderAllocation\x20109)\x20makes\x20the\x20fee\x20enforceable\x20at\x20the\x20guard\x20layer\x20'+'(zero-value\x20re-delivery\x20cycles,\x20test/11\x20R2-F3\x20/\x20crs\x20P2-3).\x20Remedy:\x20bind\x20the\x20fund-gate\x20Guard\x20on\x20the\x20loop\x20forward\x20'+'(constant\x20=\x20order\x20address,\x20convert_witness\x20OrderAllocation,\x20allocation.balance\x20>=\x20revisit\x20fee)\x20AND\x20publish\x20through\x20a\x20template\x20'+'carrying\x20that\x20convention,\x20or\x20replace\x20the\x20loop\x20with\x20per-period\x20NEW\x20Orders\x20(REUSE\x20pattern\x20—\x20a\x20fresh\x20order\x20per\x20period\x20instead\x20of\x20an\x20in-order\x20loop\x20that\x20replays\x20its\x20forwards\x20every\x20lap).\x20'+'A\x20funded\x20renewal\x20loop\x20(post-period\x20node\x20back\x20into\x20a\x20charging\x20node,\x20advanced\x20via\x20the\x20one-PTB\x20order_renew\x20call)\x20'+'is\x20the\x20only\x20sanctioned\x20charge-bearing\x20cycle\x20shape.');j['length']>0x0&&c['push']('pre_publish:\x20machine\x20contains\x20renewal\x20loop\x20cycle(s)\x20'+j['map'](z=>'['+z['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20on-chain\x20a\x20revisit\x20'+'is\x20NOT\x20verified\x20to\x20re-fund\x20the\x20Allocation.\x20Every\x20renewal/loop\x20forward\x20MUST\x20carry\x20the\x20new-period\x20'+'payment\x20into\x20the\x20order\x20escrow\x20atomically\x20(use\x20the\x20order\x20call\x27s\x20order_renew\x20field:\x20create\x20the\x20period\x20payment,\x20receive\x20it\x20into\x20the\x20'+'allocation,\x20and\x20advance\x20the\x20progress\x20—\x20all\x20in\x20one\x20transaction),\x20or\x20the\x20loop\x20allows\x20zero-value\x20'+'re-delivery\x20cycles\x20(test/11\x20R2-F3).\x20'+'Recommended:\x20bind\x20a\x20fund-gate\x20Guard\x20on\x20the\x20loop\x20forward\x20(constant\x20=\x20order\x20address,\x20convert_witness\x20OrderAllocation(109),\x20'+'allocation.balance\x20query\x201051\x20>=\x20period\x20price)\x20—\x20the\x20query\x20is\x20live\x20on-chain,\x20so\x20a\x20guarded\x20renewal\x20loop\x20is\x20now\x20the\x20'+'expressible\x20alternative\x20to\x20per-period\x20NEW\x20Orders\x20for\x20long\x20subscriptions.');k['length']>0x0&&c['push']('pre_publish:\x20machine\x20contains\x20remedy\x20loop\x20cycle(s)\x20'+k['map'](z=>'['+z['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20'+'a\x20same-order\x20revisit\x20(revision/review/rework/refund/cancel\x20family)\x20implies\x20NO\x20new\x20charge,\x20so\x20no\x20fund\x20gate\x20is\x20needed\x20on\x20it\x20'+'(the\x20allocation.balance\x20query\x20exists\x20but\x20is\x20irrelevant\x20here).\x20Visible\x20by\x20design\x20(crs\x20P2-3):\x20if\x20the\x20business\x20EVER\x20intends\x20'+'a\x20revisit\x20to\x20cost\x20money,\x20that\x20fee\x20IS\x20enforceable\x20via\x20the\x20balance\x20query\x20(1051)\x20—\x20but\x20that\x20reshapes\x20the\x20cycle\x20into\x20the\x20'+'charge\x20tier\x20above;\x20keep\x20remedy\x20revisits\x20free\x20or\x20restructure\x20as\x20per-period\x20NEW\x20Orders.');for(const z of d){const A=typeof z?.['name']==='string'?z['name']:'?';for(const B of z?.['pairs']??[]){for(const C of B?.['forwards']??[]){const D=C?.['namedOperator']!==undefined&&C?.['namedOperator']!==null,E=C?.['permissionIndex']!==undefined&&C?.['permissionIndex']!==null,F=C?.['guard']!==undefined&&C?.['guard']!==null;!D&&!E&&!F&&c['push']('pre_publish:\x20node\x20\x22'+A+'\x22\x20forward\x20\x22'+String(C?.['name']??'?')+'\x22\x20has\x20no\x20executor\x20binding\x20(namedOperator\x20/\x20permissionIndex\x20/\x20guard)\x20—\x20no\x20one\x20can\x20advance\x20it');}}}const m=lintForwardAmbiguity(a,'pre_publish');b['push'](...m['critical']),c['push'](...m['warnings']);const o=computeTerminalReachability(a);return o['unreachable']['length']>0x0&&c['push']('pre_publish:\x20unreachable\x20machine\x20node(s)\x20'+o['unreachable']['map'](G=>'\x22'+G+'\x22')['join'](',\x20')+'\x20—\x20'+'no\x20path\x20from\x20the\x20entry\x20pair\x20reaches\x20them;\x20dead\x20topology\x20is\x20frozen\x20at\x20publish\x20(IMMUT-001).\x20'+'Wire\x20them\x20into\x20the\x20flow\x20or\x20remove\x20them\x20before\x20publish'),{'critical':b,'warnings':c};}export function computeTerminalReachability(a){const b=[],c=[];if(!Array['isArray'](a)||a['length']===0x0)return{'terminals':b,'unreachable':c};const d=a,e=new Map(),f=[],g=[];for(const j of d){const k=typeof j?.['name']==='string'?j['name']:'';if(!k)continue;f['push'](k);if(!e['has'](k))e['set'](k,[]);let l=![];for(const m of j?.['pairs']??[]){const o=m?.['prev_node'];if(o==='')l=!![];else{if(typeof o==='string'&&o!==''){const q=e['get'](o);if(q)q['push'](k);else e['set'](o,[k]);}}}if(l)g['push'](k);}if(f['length']===0x0||g['length']===0x0)return{'terminals':b,'unreachable':c};const h=new Set(),i=[...g];while(i['length']>0x0){const r=i['pop']();if(h['has'](r))continue;h['add'](r);for(const s of e['get'](r)??[])i['push'](s);}for(const t of f){if(!h['has'](t))c['push'](t);else{if((e['get'](t)??[])['length']===0x0)b['push'](t);}}return{'terminals':b,'unreachable':c};}export const REVIEW_FAMILY_NODE_REGEX=/(^|_)(review|reviews|reviewed|reviewing|evaluated|evaluate|feedback|rating|rated)(_|$)/i;export function lintReviewLockedTerminals(a,b){const c=[],d=[];if(!Array['isArray'](a)||a['length']===0x0)return{'critical':c,'warnings':d};const e=a,h=u=>Array['isArray'](u?.['pairs'])?u['pairs']:Array['isArray'](u?.['value'])?u['value']:[],i=[],j=[],k=[];for(const u of e){const v=typeof u?.['name']==='string'?u['name']:'';if(!v)continue;j['push'](v);let w=![];for(const x of h(u)){const y=x,z=y?.['prev_node'];if(z==='')w=!![];const A=Array['isArray'](y?.['forwards'])?y['forwards']:[],B=[];for(const C of A){const D=C,E=D?.['guard'],F=typeof E==='string'&&E['trim']()!==''?E:E&&typeof E==='object'?E['guard']??E['$ref']:undefined;if(typeof F==='string'&&F['trim']()!=='')B['push'](F);}typeof z==='string'&&z!==''&&i['push']({'from':z,'to':v,'guardRefs':B});}if(w)k['push'](v);}if(j['length']===0x0||k['length']===0x0)return{'critical':c,'warnings':d};const l=computeTerminalReachability(a);if(l['terminals']['length']===0x0)return{'critical':c,'warnings':d};const m=G=>{if(G['guardRefs']['length']===0x0)return![];for(const H of G['guardRefs']){const I=b['get'](H['toLowerCase']());if(!I||I['length']===0x0)return![];const J=I['every'](K=>REVIEW_FAMILY_NODE_REGEX['test'](K));if(!J||I['includes'](G['from']))return![];}return!![];},o=G=>REVIEW_FAMILY_NODE_REGEX['test'](G),q=G=>{const H=new Map();for(const K of i){if(m(K))continue;if(G&&(o(K['from'])||o(K['to'])))continue;const L=H['get'](K['from']);if(L)L['push'](K['to']);else H['set'](K['from'],[K['to']]);}const I=new Set(),J=[...k];while(J['length']>0x0){const M=J['pop']();if(I['has'](M))continue;I['add'](M);for(const N of H['get'](M)??[])J['push'](N);}return I;},r=q(![]),s=q(!![]);for(const G of l['terminals']){if(!r['has'](G))c['push']('REVIEW-LOCK-01:\x20terminal\x20\x22'+G+'\x22\x20is\x20enterable\x20ONLY\x20through\x20forward(s)\x20whose\x20guard\x20pins\x20a\x20'+'review/feedback\x20node\x20the\x20edge\x20itself\x20does\x20not\x20depart\x20from\x20—\x20the\x20rail\x20can\x20never\x20fire\x20(the\x20guard\x20asserts\x20a\x20'+'progress\x20state\x20this\x20transition\x20cannot\x20produce),\x20so\x20a\x20buyer\x20who\x20never\x20reviews\x20strands\x20every\x20order\x27s\x20'+'escrow\x20permanently.\x20Machine\x20topology\x20is\x20immutable\x20after\x20publish\x20(IMMUT-001).\x20Fix\x20BEFORE\x20publish:\x20'+'re-pin\x20the\x20settlement\x20guard\x20to\x20the\x20node\x20the\x20forward\x20actually\x20departs\x20from,\x20and\x20add\x20a\x20time-lock\x20keeper\x20'+'auto-confirm\x20rail\x20(the\x20template\x20deliver_confirm_timeout\x20convention)\x20so\x20settlement\x20never\x20depends\x20on\x20the\x20'+'buyer\x20choosing\x20to\x20review');else!s['has'](G)&&d['push']('REVIEW-LOCK-01:\x20terminal\x20\x22'+G+'\x22\x20is\x20reachable\x20only\x20THROUGH\x20a\x20review/feedback\x20node\x20—\x20a\x20buyer\x20who\x20'+'silently\x20skips\x20reviewing\x20can\x20never\x20let\x20their\x20order\x20reach\x20it.\x20The\x20sanctioned\x20shape\x20keeps\x20the\x20review\x20'+'stop\x20OPTIONAL\x20with\x20an\x20exit\x20edge\x20back\x20to\x20the\x20settlement\x20rail,\x20and\x20a\x20keeper\x20time-lock\x20rail\x20that\x20opens\x20'+'settlement\x20independently\x20(retail\x20deliver_confirm_timeout\x20convention).\x20Verify\x20one\x20of\x20the\x20two\x20exists;\x20'+'if\x20the\x20review\x20node\x20is\x20meant\x20to\x20be\x20keeper-advanceable,\x20this\x20is\x20satisfied\x20and\x20may\x20be\x20ignored');}return{'critical':c,'warnings':d};}export function arbitrationVotingLockDetail(a){if(!Array['isArray'](a))return null;if(a['length']>0x0)return null;return'voting_guard\x20is\x20empty\x20(no\x20guard-weighted\x20voters).\x20Plain\x20votes\x20hard-require\x20the\x20vote\x20permission\x20(358)\x20on\x20the\x20'+'arbitration\x27s\x20own\x20Permission:\x20only\x20that\x20Permission\x27s\x20admin\x20(its\x20creator,\x20by\x20default)\x20and\x20explicit\x20358\x20'+'grantees\x20pass\x20the\x20assert,\x20so\x20without\x20grants\x20the\x20disputing\x20CUSTOMER\x20can\x20never\x20vote\x20and\x20the\x20arb\x20admin\x20is\x20the\x20'+'only\x20possible\x20voter\x20AND\x20the\x20judge\x20—\x20a\x20dispute\x20opened\x20against\x20this\x20service\x20dead-locks\x20when\x20that\x20admin\x20is\x20'+'unresponsive.\x20Configure\x20a\x20public\x20voting_guard\x20on\x20the\x20Arbitration\x20(voting_guard\x20op=\x27set\x27\x20with\x20guard\x20+\x20vote\x20'+'weight\x20—\x20the\x20field\x20stays\x20mutable\x20after\x20publish;\x20the\x20standard\x20shape\x20is\x20tpl_voting_guard_open_vote,\x20the\x20'+'always-true\x20guard\x20at\x20FixedValue\x20weight\x201)\x20or\x20bind\x20an\x20arbitration\x20that\x20already\x20carries\x20one,\x20BEFORE\x20'+'publishing\x20this\x20service';}const TIME_PROFILE_UNIT_MS={'ms':0x1,'msec':0x1,'msecs':0x1,'millisecond':0x1,'milliseconds':0x1,'s':0x3e8,'sec':0x3e8,'secs':0x3e8,'second':0x3e8,'seconds':0x3e8,'m':0xea60,'min':0xea60,'mins':0xea60,'minute':0xea60,'minutes':0xea60,'h':0x36ee80,'hr':0x36ee80,'hrs':0x36ee80,'hour':0x36ee80,'hours':0x36ee80,'d':0x5265c00,'day':0x5265c00,'days':0x5265c00,'w':0x240c8400,'wk':0x240c8400,'wks':0x240c8400,'week':0x240c8400,'weeks':0x240c8400},TIME_PROFILE_DURATION_REGEX=/(\d+(?:\.\d+)?)\s*(ms|milliseconds?|msecs?|minutes?|mins?|seconds?|secs?|hours?|hrs?|days?|weeks?|wks?|min|sec|hr|wk|[smhdw])\b/gi,TIME_PROFILE_ADMISSION_REGEX=/compress(?:ed|ion)|accelerat(?:ed|ion)|shorten(?:ed)?(?:\s+for)?|test\s+(?:value|window|duration|constant)|demo\s+(?:value|window|duration)|for\s+(?:fast\s+|quick\s+)?test(?:ing)?|regression\s+(?:value|window)/i;function timeProfileIsTimeQuery(a){if(typeof a==='number')return a===0x4f7||a===0x4f8||a===0x500;if(typeof a==='string')return/(^|\.)time$|current_time/i['test'](a);return![];}function timeProfileNodeChildren(a){const b=[];for(const c of['nodes','node','nodeLeft','nodeRight','parameters','historyIdx','sessionIdx','forwardIdx','where','find','recipient']){const d=a[c];if(Array['isArray'](d))b['push'](...d);else{if(d&&typeof d==='object')b['push'](d);}}return b;}export function guardTimeProfileDetail(a){const b=typeof a['description']==='string'?a['description']:'',c=TIME_PROFILE_ADMISSION_REGEX['test'](b);let d=0x0;for(const l of b['matchAll'](TIME_PROFILE_DURATION_REGEX)){const n=TIME_PROFILE_UNIT_MS[l[0x2]['toLowerCase']()];if(!n)continue;const o=Number(l[0x1])*n;if(Number['isFinite'](o)&&o>d)d=o;}if(!c&&d===0x0)return null;const e=Array['isArray'](a['table'])?a['table']:[],f=p=>{const q=e['find'](r=>Number(r?.['identifier'])===p);return numericAmount(q?.['value']);},h=p=>{if(!p||typeof p!=='object')return![];const q=p;if(q['type']==='context'&&q['context']==='Clock')return!![];if(q['type']==='query'&&timeProfileIsTimeQuery(q['query']))return!![];if(q['type']==='query_progress_history_time')return!![];return timeProfileNodeChildren(q)['some'](h);},i=[],j=(p,q)=>{if(!p||typeof p!=='object')return;const r=p,s=q||typeof r['type']==='string'&&r['type']['startsWith']('calc_');if(r['type']==='identifier'&&s){const t=f(Number(r['identifier']));if(t!==undefined&&t>0x0)i['push'](t);}for(const u of timeProfileNodeChildren(r))j(u,s);};if(a['root']&&typeof a['root']==='object'&&h(a['root']))j(a['root'],![]);const k=i['find'](p=>p<d/0x64);if(k!==undefined){const p=q=>q>=0x5265c00?q/0x5265c00+'d':q>=0x36ee80?q/0x36ee80+'h':q>=0xea60?q/0xea60+'min':q/0x3e8+'s';return{'level':'critical','detail':'time\x20constant\x20'+p(k)+'\x20is\x20>=100x\x20below\x20the\x20production\x20duration\x20the\x20description\x20itself\x20'+('declares\x20('+p(d)+')\x20—\x20a\x20compressed\x20test\x20value\x20frozen\x20into\x20a\x20production\x20guard.\x20Guards\x20')+'freeze\x20at\x20publish\x20(IMMUT-001),\x20so\x20the\x20window\x20will\x20enforce\x20the\x20compressed\x20value\x20against\x20real\x20orders\x20'+'(klook\x20mainnet\x20261014:\x20\x2724h\x20free\x20cancellation\x27\x20enforced\x20as\x202\x20minutes).\x20Rebuild\x20the\x20guard\x20with\x20the\x20'+'production\x20duration\x20from\x20the\x20template\x20fee_params\x20BEFORE\x20publishing'};}if(c)return{'level':'warning','detail':'description\x20admits\x20compressed/accelerated\x20time\x20constants,\x20but\x20NO\x20time\x20constant\x20in\x20this\x20guard\x27s\x20logic\x20'+'tree\x20is\x20>=100x\x20below\x20the\x20declared\x20production\x20duration\x20—\x20the\x20values\x20look\x20production-scaled.\x20Manual\x20'+'review\x20requested\x20(prose\x20alone\x20no\x20longer\x20blocks\x20publish,\x20BF-07):\x20confirm\x20the\x20tree\x20constants\x20match\x20the\x20'+'production\x20durations\x20in\x20the\x20template\x20fee_params\x20BEFORE\x20publishing\x20—\x20guards\x20freeze\x20at\x20publish\x20'+'(IMMUT-001),\x20so\x20a\x20mis-scaled\x20window\x20(klook\x20mainnet\x20261014:\x20\x2724h\x20free\x20cancellation\x27\x20enforced\x20as\x202\x20'+'minutes)\x20is\x20UNFIXABLE'};return null;}export function rewardRefsOf(a){const b=a?.['rewards'];if(typeof b==='string'&&b['trim']()!=='')return[b];if(Array['isArray'](b))return b['filter'](c=>typeof c==='string'&&c['trim']()!=='');if(Array['isArray'](b?.['objects']))return b['objects']['filter'](c=>typeof c==='string'&&c['trim']()!=='');return[];}export function serviceRewardsUnfundedDetail(b){if(!b||typeof b!=='object')return null;const c=b['data']??b,d=Array['isArray'](c?.['guards'])?c['guards']:[],e=numericAmount(c?.['balance']?.['value']??c?.['balance']);if(e===undefined)return null;let f=0x0;for(const h of d){const i=h?.['amount'];if(i?.['type']!==0x1)continue;const j=numericAmount(i?.['value']?.['value']??i?.['value']);if(j!==undefined&&j>f)f=j;}if(f===0x0)return null;if(e>=f)return null;return'reward\x20pool\x20balance\x20'+e+'\x20cannot\x20cover\x20its\x20largest\x20single-claim\x20promise\x20('+f+').\x20'+'The\x20on-chain\x20publish\x20entry\x20does\x20NOT\x20verify\x20reward\x20funding\x20—\x20a\x20failed\x20reward_fund\x20transfer\x20still\x20'+'publishes\x20(onlyfans\x20mainnet\x20261014\x20shipped\x20a\x20store\x20promising\x20cashback\x20with\x20an\x20empty\x20pool),\x20and\x20the\x20'+'claim\x20aborts\x20once\x20the\x20pool\x20drains.\x20Fund\x20the\x20Reward\x20(reward_fund)\x20up\x20to\x20expected_orders\x20x\x20per-claim\x20'+'amount,\x20or\x20remove\x20the\x20reward\x20binding\x20BEFORE\x20publishing\x20this\x20service';}export const AUDIT_RULES=[{'id':'audit_machine_bound','description':'Service\x20should\x20have\x20a\x20Machine\x20workflow\x20bound\x20before\x20publish','severity':'warning','fields':['machine'],'check':(a,b)=>{if(!a?.['publish'])return!![];return!!a?.['machine'];},'message':()=>'Publishing\x20a\x20service\x20without\x20a\x20Machine\x20workflow.\x20Customers\x20won\x27t\x20have\x20a\x20structured\x20order\x20process.','recommendation':'Create\x20a\x20Machine\x20(workflow\x20template)\x20and\x20bind\x20it\x20to\x20the\x20service\x20before\x20publishing.\x20The\x20machine\x20field\x20becomes\x20IMMUTABLE\x20after\x20publish.'},{'id':'audit_order_allocators','description':'Service\x20should\x20have\x20order_allocators\x20for\x20fund\x20distribution','severity':'warning','fields':['order_allocators'],'check':a=>{if(!a?.['publish'])return!![];return allocatorCountOf(a)>0x0;},'message':()=>'Publishing\x20a\x20service\x20without\x20order_allocators.\x20Order\x20funds\x20cannot\x20be\x20auto-distributed\x20to\x20suppliers.','recommendation':'Configure\x20order_allocators\x20before\x20publishing\x20—\x20this\x20field\x20becomes\x20IMMUTABLE\x20after\x20publish.'},{'id':'audit_buy_guard','description':'Service\x20should\x20have\x20a\x20buy_guard\x20for\x20customer\x20screening','severity':'info','fields':['buy_guard'],'check':a=>!!a?.['buy_guard'],'message':()=>'No\x20buy_guard\x20configured\x20—\x20anyone\x20can\x20purchase\x20this\x20service\x20without\x20verification.','recommendation':'Consider\x20adding\x20a\x20Guard\x20to\x20verify\x20customer\x20eligibility\x20(e.g.,\x20identity,\x20wallet\x20balance,\x20location).'},{'id':'audit_arb_alloc_boundary','description':'Arbitration\x20and\x20Allocator\x20coexist\x20→\x20surface\x20the\x20two-system\x20boundary\x20reminder','severity':'warning','fields':['arbitrations','compensation_fund_add','compensation_fund','order_allocators'],'check':a=>{if(!a?.['publish'])return!![];const b=arbitrationRefsOf(a)['length']>0x0||compensationFundOf(a)!==undefined;return!(b&&allocatorCountOf(a)>0x0);},'message':()=>'Arbitration\x20and\x20Allocator\x20are\x20INDEPENDENT\x20systems\x20by\x20design:\x20a\x20ruling\x20records\x20the\x20case\x20and\x20pays\x20from\x20the\x20service\x20compensation\x20fund\x20—\x20it\x20never\x20moves\x20escrow\x20and\x20never\x20advances\x20the\x20workflow.\x20With\x20both\x20configured,\x20a\x20buyer\x20can\x20receive\x20BOTH\x20the\x20arbitration\x20compensation\x20AND\x20a\x20full\x20escrow\x20refund\x20unless\x20the\x20refund/settlement\x20path\x20is\x20gated.\x20This\x20is\x20a\x20boundary\x20reminder,\x20not\x20a\x20defect\x20—\x20verify\x20the\x20coupling\x20check\x20was\x20done\x20deliberately.','recommendation':'Gate\x20the\x20refund/settlement\x20allocator\x27s\x20Guard\x20on\x20order.claimed_by\x20(read-only\x20cross-system\x20evidence\x20—\x20the\x20sanctioned\x20link),\x20or\x20hold\x20the\x20final\x20settlement\x20forward\x20until\x20the\x20case\x20closes.\x20Do\x20NOT\x20couple\x20the\x20systems\x20the\x20other\x20way\x20(no\x20dispute\x20state\x20on\x20the\x20order\x20flow,\x20no\x20workflow\x20step\x20into\x20arbitration):\x20coupling\x20opens\x20the\x20double-pay\x20path.\x20For\x20per-case\x20fund\x20actions,\x20the\x20deposit-reimbursement\x20pattern\x20(guard-design\x20patterns)\x20is\x20the\x20supported\x20route.'},{'id':'audit_compensation_fund','description':'Service\x20should\x20have\x20a\x20compensation_fund\x20for\x20trust','severity':'warning','fields':['compensation_fund_add','compensation_fund'],'check':a=>compensationFundOf(a)!==undefined,'message':()=>'No\x20compensation_fund\x20configured.\x20Customers\x20have\x20no\x20financial\x20protection\x20if\x20you\x20fail\x20to\x20deliver.','recommendation':'Deposit\x20via\x20compensation_fund_add\x20{balance}\x20to\x20enable\x20arbitration\x20payouts.\x20The\x20fund\x20deters\x20fraud\x20and\x20enables\x20arbitration\x20claims.'},{'id':'audit_arbitrations','description':'Service\x20should\x20have\x20arbitration\x20options\x20for\x20dispute\x20resolution','severity':'info','fields':['arbitrations'],'check':a=>arbitrationRefsOf(a)['length']>0x0,'message':()=>'No\x20arbitration\x20configured.\x20Disputes\x20cannot\x20be\x20resolved\x20through\x20a\x20third\x20party.','recommendation':'Add\x20at\x20least\x20one\x20Arbitration\x20object\x20via\x20arbitrations:{op:\x27add\x27,\x20objects:[...]}\x20to\x20enable\x20on-chain\x20dispute\x20resolution.'},{'id':'audit_arbitration_removal_strands_awards','description':'Removing\x20an\x20authorized\x20venue\x20can\x20strand\x20an\x20award\x20it\x20already\x20ruled\x20on','severity':'error','fields':['arbitrations'],'check':a=>{const b=a?.['arbitrations']?.['remove']??a?.['arbitrations']?.['clear'],c=Array['isArray'](b)?b['length']>0x0:a?.['arbitrations']?.['op']==='clear';if(!c)return!![];if(arbitrationRefsOf(a)['length']>0x0)return!![];return compensationFundOf(a)===undefined;},'message':a=>{const b=a?.['arbitrations']?.['clear']?'every\x20authorized\x20venue':'venue(s)\x20'+(a?.['arbitrations']?.['remove']??[])['join'](',\x20');return'Removing\x20'+b+'\x20while\x20a\x20compensation\x20fund\x20is\x20configured\x20makes\x20any\x20award\x20it\x20already\x20ruled\x20on\x20UNPAYABLE:\x20an\x20on-chain\x20payout\x20now\x20requires\x20the\x20deciding\x20venue\x20to\x20still\x20be\x20on\x20the\x20Service\x27s\x20allowlist,\x20so\x20paying\x20out\x20aborts\x20with\x20E_ARBITRATION_NOT_ALLOWED=39\x20and\x20the\x20escrowed\x20funds\x20stay\x20stranded.';},'recommendation':'Before\x20removing\x20a\x20venue,\x20confirm\x20no\x20case\x20it\x20ruled\x20on\x20is\x20still\x20awaiting\x20compensation\x20payout\x20(query\x20the\x20Arb\x20objects\x20for\x20status\x20Arbitrated,\x20not\x20Finished).\x20Add\x20the\x20replacement\x20venue\x20FIRST,\x20drain\x20the\x20old\x20venue\x27s\x20cases,\x20and\x20only\x20then\x20remove\x20it.\x20A\x20buyer\x20should\x20never\x20be\x20left\x20holding\x20an\x20uncollectable\x20award.'},{'id':'audit_price','description':'Service\x20should\x20have\x20at\x20least\x20one\x20priced\x20sale\x20item','severity':'error','fields':['sales'],'check':a=>{const b=salesItemsOf(a);if(b['length']===0x0)return!![];return b['some'](c=>c?.['price']!==undefined&&c?.['price']!==null);},'message':()=>'Sales\x20list\x20present\x20but\x20no\x20item\x20has\x20a\x20price.\x20Customers\x20cannot\x20place\x20orders\x20without\x20knowing\x20the\x20cost.','recommendation':'Set\x20price\x20on\x20each\x20sales\x20item\x20(smallest-unit\x20string\x20or\x20display\x20form\x20like\x20\x272.5WOW\x27).'},{'id':'audit_compensation_fund_covers_award_ceiling','description':'compensation_fund\x20should\x20cover\x20the\x203x\x20award\x20ceiling\x20of\x20the\x20largest\x20sale\x20(disclosure)','severity':'warning','fields':['compensation_fund_add','compensation_fund','sales'],'check':a=>{if(!a?.['publish'])return!![];const b=compensationFundOf(a);if(b===undefined)return!![];const c=numericAmount(b);if(c===undefined)return!![];if(c===0x0)return![];const e=salesItemsOf(a)['map'](g=>numericAmount(g?.['price']))['filter'](g=>g!==undefined&&g>0x0);if(e['length']===0x0)return!![];const f=e['reduce']((g,h)=>g+h,0x0);return c>=MAX_INDEMNITY_MULTIPLE*f;},'message':()=>'compensation_fund\x20does\x20not\x20cover\x20the\x20award\x20ceiling\x20of\x20the\x20largest\x20sale.\x20An\x20award\x20is\x20hard-capped\x20at\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20'+'the\x20order\x20amount\x20(arb.move\x20MAX_INDEMNITY_MULTIPLE,\x20enforced\x20at\x20ruling\x20time),\x20so\x20a\x20ruling\x20at\x20the\x20ceiling\x20'+'would\x20abort\x20the\x20buyer\x27s\x20claim\x20with\x2027\x20(E_COMPENSATION_NOT_MATCH)\x20—\x20the\x20ruling\x20stands\x20but\x20is\x20unpayable\x20'+'until\x20you\x20deposit,\x20and\x20the\x20abort\x20does\x20NOT\x20consume\x20the\x20claim.\x20Disclosure\x20only:\x20this\x20no\x20longer\x20blocks\x20'+'publish\x20—\x20per-order\x20coverage\x20is\x20enforced\x20at\x20BUY\x20time\x20(the\x20buyer\x27s\x20order\x20is\x20rejected\x20while\x20the\x20fund\x20'+'cannot\x20cover\x203x\x20that\x20order),\x20so\x20under-ceiling\x20funding\x20stops\x20sales\x20instead\x20of\x20stranding\x20awards.','recommendation':'For\x20every\x20order\x20you\x20want\x20to\x20sell,\x20keep\x20the\x20fund\x20at\x20>=\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20THAT\x20order\x20via\x20'+'compensation_fund_add\x20(a\x200.49\x20course\x20needs\x201.47;\x20a\x203.99\x20course\x20needs\x2011.97\x20—\x20no\x20cross-SKU\x20subsidy).\x20'+('Above\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20the\x20current\x20order\x20is\x20optional:\x20it\x20only\x20buys\x20tolerance\x20for\x20several\x20')+'CONCURRENT\x20claims\x20against\x20the\x20one\x20per-Service\x20pool\x20(there\x20is\x20no\x20on-chain\x20concurrency\x20limit),\x20which\x20'+'is\x20a\x20capital-allocation\x20choice.\x20A\x20service\x20with\x20NO\x20fund\x20sells\x20freely\x20—\x20that\x20is\x20the\x20documented\x20'+'no-protection\x20posture\x20(audit_compensation_fund\x20discloses\x20it;\x20buyers\x20see\x20coverage\x20via\x20order\x20monitor).'},{'id':'audit_description','description':'Service\x20should\x20have\x20a\x20description','severity':'warning','fields':['description'],'check':a=>typeof a?.['description']==='string'&&a['description']['length']>0x0,'message':()=>'Service\x20has\x20no\x20description.\x20Customers\x20won\x27t\x20understand\x20what\x20you\x27re\x20offering.','recommendation':'Write\x20a\x20clear\x20description\x20of\x20the\x20service,\x20including\x20deliverables,\x20timelines,\x20and\x20terms.'},{'id':'audit_named_new_name','description':'Service\x20being\x20created\x20should\x20have\x20a\x20name','severity':'warning','check':a=>serviceNameOf(a)!==undefined,'message':()=>'Creating\x20a\x20service\x20without\x20a\x20name\x20makes\x20it\x20hard\x20to\x20reference\x20and\x20organize.','recommendation':'Set\x20object:{name:\x20...}\x20(or\x20namedNew.name)\x20following\x20the\x20convention:\x20<projectPrefix>_<service>_<purpose>.'},{'id':'audit_customer_required_needs_um','description':'customer_required\x20requires\x20a\x20Contact\x20bound\x20via\x20um\x20(SDK-enforced\x20hard\x20link;\x20mirrored\x20here)','severity':'error','fields':['customer_required','um'],'check':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];if(b['length']===0x0)return!![];return!!a?.['um'];},'message':()=>'customer_required\x20is\x20set\x20but\x20no\x20Contact\x20is\x20bound\x20via\x20um\x20—\x20customers\x20cannot\x20deliver\x20the\x20required\x20private\x20information\x20through\x20end-to-end\x20encrypted\x20Messenger.','recommendation':'Bind\x20um:{Contact\x20name/id}\x20in\x20the\x20same\x20call\x20(SDK\x20order_new\x20will\x20fail\x20the\x20buyer\x20otherwise).'},{'id':'audit_customer_required_is_declared_not_enforced','description':'customer_required\x20has\x20no\x20on-chain\x20enforcement\x20at\x20buy\x20time\x20—\x20a\x20Guard\x20must\x20gate\x20fulfilment','severity':'warning','fields':['customer_required'],'check':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];return b['length']===0x0;},'message':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];return'customer_required\x20('+b['length']+'\x20field(s):\x20'+b['join'](',\x20')+')\x20is\x20DECLARATIVE\x20ONLY:\x20the\x20on-chain\x20purchase\x20entry\x20never\x20reads\x20this\x20list,\x20so\x20an\x20order\x20that\x20supplies\x20none\x20of\x20these\x20fields\x20is\x20still\x20created\x20and\x20progresses.\x20Nothing\x20on-chain\x20will\x20stop\x20it.';},'recommendation':'Bind\x20pattern.required_info_evidence_gate\x20(schema_query\x20action=get_guard_design_patterns)\x20on\x20the\x20first\x20forward\x20that\x20needs\x20the\x20information:\x20query\x20\x27order.required_info\x20some\x27\x20(1572)\x20over\x20the\x20Order.\x20The\x20buyer\x20records\x20the\x20credential\x20via\x20order_required_info_update:\x20EITHER\x20the\x20merchant\x27s\x20IM\x20user\x20address\x20resolved\x20from\x20the\x20Service\x27s\x20Contact\x20(zero\x20cost,\x20address\x20record\x20only)\x20OR\x20an\x20on-chain\x20WTS\x20Proof\x20object\x20address\x20(embeds\x20the\x20merchant\x20IM\x20address\x20and\x20the\x20last-message\x20timestamp;\x20costs\x20gas,\x20publicly\x20verifiable).\x20\x27order.required_info\x27\x20(1573)\x20returns\x20the\x20recorded\x20address\x20but\x20aborts\x20while\x20nothing\x20is\x20recorded\x20—\x20gate\x20on\x201572\x20first.\x20When\x20the\x20listing\x20genuinely\x20promises\x20a\x20PER-ORDER\x20credential,\x20prefer\x20the\x20controlled\x20bind\x20entry\x20(order_required_info_bind):\x20the\x20chain\x20verifies\x20the\x20Proof\x20is\x20about\x20THIS\x20order\x20and\x20owner-created\x20at\x20write\x20time\x20and\x20rejects\x20a\x20mismatch\x20—\x20no\x20guard\x20needed\x20to\x20catch\x20a\x20wrong-proof\x20record.\x20BOUNDARY:\x20that\x20binding\x20proves\x20the\x20credential\x20AUTHOR\x20only,\x20never\x20its\x20content\x20or\x20any\x20rating\x20—\x20do\x20not\x20mirror\x20it\x20onto\x20review/reward\x20claims;\x20public\x20reviews\x20are\x20Repository\x20rows\x20whose\x20values\x20are\x20enforced\x20guard-side\x20via\x20data-value\x20probes,\x20not\x20through\x20Proof\x20objects.'},{'id':'audit_dangling_deps','description':'Service\x20dependencies\x20should\x20be\x20fully\x20created','severity':'error','check':(a,b)=>{if(!a?.['publish'])return!![];if(!b?.['graph'])return!![];const c=b['graph']['findDanglingDependencies']()??[];return c['length']===0x0;},'message':()=>'Service\x20references\x20objects\x20that\x20are\x20not\x20yet\x20created.\x20Publishing\x20will\x20lock\x20these\x20references.','recommendation':'Ensure\x20all\x20referenced\x20objects\x20(machine,\x20allocators,\x20guards)\x20are\x20created\x20and\x20finalized\x20before\x20publishing.'},{'id':'audit_type_parameter','description':'Service\x20should\x20have\x20a\x20token\x20type\x20specified','severity':'info','fields':['type_parameter','namedNew'],'check':a=>typeParameterOf(a)!==undefined,'message':()=>'No\x20payment\x20token\x20type\x20specified.\x20Defaulting\x20to\x20WOW\x20(0x2::wow::WOW).','recommendation':'Explicitly\x20set\x20type_parameter\x20(inside\x20object:{...})\x20if\x20you\x20want\x20to\x20accept\x20non-WOW\x20tokens\x20(e.g.,\x20USDT,\x20ETH).'},{'id':'audit_wip_unreachable_url','description':'sale.wip\x20must\x20be\x20a\x20publicly\x20reachable\x20URL\x20(no\x20localhost/LAN/file\x20paths)','severity':'error','fields':['sales'],'check':(a,b)=>{if(typeof b?.['network']==='string'&&/local/i['test'](b['network']))return!![];const c=salesItemsOf(a);if(c['length']===0x0)return!![];return c['every'](e=>{const f=e?.['wip'];if(typeof f!=='string'||f['trim']()==='')return!![];return!/^(https?:\/\/)?(localhost|127\.0\.0\.1|\[::1\]|0\.0\.0\.0)/i['test'](f)&&!/^https?:\/\/(192\.168\.|10\.|172\.(1[6-9]|2\d|3[01])\.)/i['test'](f)&&!/^file:/i['test'](f);});},'message':a=>{const b=salesItemsOf(a)['map'](c=>String(c?.['wip']??''))['filter'](c=>c!==''&&(/^(https?:\/\/)?(localhost|127\.0\.0\.1|\[::1\]|0\.0\.0\.0)/i['test'](c)||/^https?:\/\/(192\.168\.|10\.|172\.(1[6-9]|2\d|3[01])\.)/i['test'](c)||/^file:/i['test'](c)));return'sale.wip\x20is\x20NOT\x20publicly\x20reachable\x20('+b['join'](',\x20')+').\x20The\x20URL\x20is\x20stored\x20on-chain\x20and\x20every\x20'+'customer\x20fetches\x20it\x20at\x20order\x20time\x20—\x20order_new\x20aborts\x20100%\x20for\x20anyone\x20outside\x20your\x20machine.\x20'+'Host\x20the\x20file\x20publicly:\x20wip_file\x20upload\x20to\x20the\x20official\x20free\x20host\x20(wip.store.wowok.net)\x20or\x20your\x20own\x20'+'endpoint\x20(GitHub\x20Pages\x20/\x20IPFS\x20/\x20your\x20website)';},'recommendation':'Replace\x20the\x20internal\x20URL\x20with\x20a\x20public\x20one.\x20Internal\x20URLs\x20are\x20sanctioned\x20ONLY\x20on\x20env.network=localnet\x20for\x20testing.'},{'id':'audit_wip_missing_public','description':'On\x20public\x20networks\x20every\x20sale\x20item\x20should\x20carry\x20a\x20product-detail\x20(wip)\x20URL','severity':'info','fields':['sales'],'check':(a,b)=>{const c=b?.['network'];if(typeof c==='string'&&/local/i['test'](c))return!![];const e=salesItemsOf(a);if(e['length']===0x0)return!![];return e['every'](f=>typeof f?.['wip']==='string'&&f['wip']['trim']()!=='');},'message':()=>'One\x20or\x20more\x20sale\x20items\x20have\x20NO\x20product-detail\x20(wip)\x20URL.\x20The\x20listing\x20works,\x20but\x20customers\x20see\x20no\x20detail\x20'+'page\x20and\x20the\x20service\x27s\x20market\x20completeness\x20score\x20is\x20downgraded.\x20Easiest:\x20upload\x20the\x20detail\x20file\x20with\x20the\x20'+'wip_file\x20tool\x20to\x20the\x20official\x20free\x20host\x20(https://wip.store.wowok.net\x20—\x2010\x20files\x20per\x20account,\x20180-day\x20'+'retention,\x2012MB/file)\x20and\x20put\x20the\x20returned\x20URL\x20into\x20sale.wip;\x20or\x20host\x20your\x20own\x20(GitHub\x20Pages\x20/\x20IPFS\x20/\x20'+'your\x20website).\x20For\x20long-lived\x20mainnet\x20listings\x20prefer\x20your\x20own\x20endpoint\x20so\x20the\x20detail\x20outlives\x20the\x20free\x20'+'retention\x20window','recommendation':'Upload\x20a\x20WIP\x20file\x20via\x20wip_file\x20and\x20set\x20sale.wip\x20on\x20each\x20item\x20before/after\x20publish\x20(sales\x20stays\x20modifiable).'}];const RULE_INDEX=new Map(AUDIT_RULES['map'](a=>[a['id'],a]));function readSeverityOverrides(){try{const {getJudgmentDoc:a}=require('../config/judgment.js');if(typeof a!=='function')return{};const b=a()?.['rules']?.['domains'];if(!b||typeof b!=='object')return{};const c={};for(const d of Object['values'](b)){const e=d?.['severity_overrides'];if(!e||typeof e!=='object')continue;for(const [f,g]of Object['entries'](e)){if(g==='error'||g==='warning'||g==='info')c[f]=g;}}return c;}catch{return{};}}export function auditService(a,b){const c=[],d=a?.['publish']===!![]&&typeof a?.['object']==='string',e=readSeverityOverrides();for(const f of AUDIT_RULES){try{if(d&&f['fields']&&!f['fields']['some'](g=>a[g]!==undefined))continue;!f['check'](a,b)&&c['push']({'rule_id':f['id'],'severity':e[f['id']]??f['severity'],'message':f['message'](a),'recommendation':f['recommendation']});}catch{}}return c;}export function hasBlockingErrors(a){return a['some'](b=>b['severity']==='error');}export function getErrors(a){return a['filter'](b=>b['severity']==='error');}export function getWarnings(a){return a['filter'](b=>b['severity']==='warning');}export function summarizeFindings(a){if(a['length']===0x0)return'All\x20audit\x20checks\x20passed.';const b=getErrors(a),c=getWarnings(a),d=a['filter'](g=>g['severity']==='info'),e=[];if(b['length']>0x0)e['push'](b['length']+'\x20error(s)');if(c['length']>0x0)e['push'](c['length']+'\x20warning(s)');if(d['length']>0x0)e['push'](d['length']+'\x20info');return'Audit:\x20'+e['join'](',\x20')+'.\x20Review\x20before\x20publishing.';}export const AUDIT_RULES_VERSION=0xa;
|
|
1
|
+
import{MAX_INDEMNITY_MULTIPLE}from'./onchain-constants.js';import{TWO_TX_RENEW_RECIPE}from'./protocol-facts.js';import{lintForwardAmbiguity,findLoopCycles}from'./machine-topology.js';import{isRenewalLoopEdge}from'../participation/radar-core.js';function numericAmount(a){if(typeof a==='number')return Number['isFinite'](a)?a:undefined;if(typeof a==='string'){const b=a['trim']();if(/^\d+$/['test'](b))return Number(b);}return undefined;}export{numericAmount};export function salesItemsOf(a){if(Array['isArray'](a?.['sales']))return a['sales'];if(Array['isArray'](a?.['sales']?.['sales']))return a['sales']['sales'];return[];}export function allocatorCountOf(a){const b=a?.['order_allocators'];if(Array['isArray'](b))return b['length'];if(Array['isArray'](b?.['allocators']))return b['allocators']['length'];return 0x0;}export function arbitrationRefsOf(b){const c=b?.['arbitrations'];if(Array['isArray'](c))return c['filter'](e=>typeof e==='string');if(Array['isArray'](c?.['objects']))return c['objects']['filter'](e=>typeof e==='string');return[];}export function compensationFundOf(a){if(a?.['compensation_fund_add']?.['balance']!=null)return a['compensation_fund_add']['balance'];if(a?.['compensation_fund']!=null)return a['compensation_fund'];return undefined;}export function serviceNameOf(a){if(typeof a?.['object']==='string')return a['object'];if(typeof a?.['object']?.['name']==='string'&&a['object']['name'])return a['object']['name'];if(typeof a?.['namedNew']?.['name']==='string'&&a['namedNew']['name'])return a['namedNew']['name'];return undefined;}export function typeParameterOf(a){if(typeof a?.['type_parameter']==='string'&&a['type_parameter'])return a['type_parameter'];if(typeof a?.['object']?.['type_parameter']==='string'&&a['object']['type_parameter'])return a['object']['type_parameter'];if(typeof a?.['namedNew']?.['type_parameter']==='string'&&a['namedNew']['type_parameter'])return a['namedNew']['type_parameter'];return undefined;}export const DISPUTE_FAMILY_NODE_REGEX=/(^|_)(disputed?|arbitration|arb)(_|$)/i;export const FUND_TERMINAL_NODE_REGEX=/^(refund|refunded|deposit_refunded|deposit_deducted|cancel|cancelled)$/i;export const ANTI_PATTERN_NODE_REGEX=new RegExp(DISPUTE_FAMILY_NODE_REGEX['source']+'|'+FUND_TERMINAL_NODE_REGEX['source'],'i');export const REMEDY_FAMILY_NODE_REGEX=/(revis|review|rework|refund|cancel|return|claim)/i;export function isRemedyLoopEdge(a,b){return REMEDY_FAMILY_NODE_REGEX['test'](a)||REMEDY_FAMILY_NODE_REGEX['test'](b);}export function classifyLoopCycle(a,b){for(let c=0x0;c<a['length'];c++){if(isRenewalLoopEdge(a[c],a[(c+0x1)%a['length']]))return'renewal';}if(b==='review-loop')return'remedy';if(b==='paid-cycle')return'charge';if(a['some'](d=>REMEDY_FAMILY_NODE_REGEX['test'](d)))return'remedy';return'charge';}export function auditMachineNodes(a,b){const c=[],d=[];if(!Array['isArray'](a)||a['length']===0x0)return d['push']('pre_publish:\x20machine\x20node\x20set\x20unavailable\x20—\x20topology\x20not\x20verifiable;\x20'+'verify\x20via\x20machineNode2file\x20BEFORE\x20publish\x20(immutable\x20after\x20publish,\x20IMMUT-001)'),{'critical':c,'warnings':d};const e=a;for(const r of e){const s=typeof r?.['name']==='string'?r['name']:'';if(!s)continue;if(DISPUTE_FAMILY_NODE_REGEX['test'](s))c['push']('R-M1-11:\x20machine\x20node\x20\x22'+s+'\x22\x20models\x20dispute\x20flow\x20—\x20'+'disputes\x20must\x20route\x20via\x20the\x20separate\x20Arbitration\x20object\x20(off-Machine);\x20'+'rename\x20the\x20node\x20to\x20the\x20business\x20state\x20that\x20triggers\x20it');else FUND_TERMINAL_NODE_REGEX['test'](s)&&d['push']('R-M1-11:\x20machine\x20node\x20\x22'+s+'\x22\x20uses\x20a\x20bare\x20fund-terminal\x20name\x20—\x20reaching\x20'+'it\x20moves\x20no\x20funds\x20by\x20itself.\x20This\x20is\x20legitimate\x20ONLY\x20when\x20a\x20refund\x20allocator\x20'+'rail\x27s\x20guard\x20anchors\x20to\x20this\x20node\x20(per-node\x20refund\x20tracks);\x20otherwise\x20rename\x20it\x20'+'to\x20the\x20business\x20state\x20(e.g.\x20cancel_requested\x20/\x20closed_cancel)\x20and\x20route\x20the\x20'+'refund\x20via\x20an\x20Allocator\x20triggered\x20by\x20that\x20state.\x20The\x20template\x20scanner\x20verifies\x20'+'the\x20anchoring\x20when\x20a\x20template\x20is\x20present.');}const g=new Set();for(const t of e){const u=typeof t?.['name']==='string'?t['name']:'';if(!u)continue;g['has'](u)&&c['push']('MC-C-04:\x20duplicate\x20machine\x20node\x20name\x20\x22'+u+'\x22\x20—\x20on-chain\x20will\x20reject\x20the\x20publish\x20transaction'),g['add'](u);}const h=e['some'](v=>Array['isArray'](v?.['pairs'])&&v['pairs']['some'](w=>w?.['prev_node']===''));!h&&c['push']('Machine\x20has\x20no\x20entry\x20pair\x20(prev_node=\x22\x22)\x20—\x20Progress\x20can\x20never\x20advance\x20'+'from\x20the\x20initial\x20state;\x20orders\x20are\x20permanently\x20stuck');const i=new Map();for(const v of e){const w=typeof v?.['name']==='string'?v['name']:'';if(!w)continue;if(!i['has'](w))i['set'](w,[]);for(const x of v?.['pairs']??[]){const y=x?.['prev_node'];if(typeof y==='string'&&y!==''){const z=i['get'](y);if(z)z['push'](w);else i['set'](y,[w]);}}}const j=findLoopCycles(i)['map'](A=>({'c':A,'tier':classifyLoopCycle(A['cycle'],b)})),k=j['filter'](A=>A['tier']==='renewal'),l=j['filter'](A=>A['tier']==='remedy'),m=j['filter'](A=>A['tier']==='charge');m['length']>0x0&&c['push']('pre_publish:\x20machine\x20contains\x20charge-bearing\x20loop\x20cycle(s)\x20'+m['map'](A=>'['+A['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20'+'on-chain\x20a\x20revisit\x20is\x20NOT\x20verified\x20to\x20re-fund\x20the\x20Allocation,\x20and\x20this\x20static\x20pass\x20sees\x20only\x20the\x20forward\x27s\x20guard\x20reference\x20'+'(never\x20the\x20guard\x20table),\x20so\x20a\x20per-revisit-fee\x20cycle\x20(retake\x20/\x20session-card\x20shape)\x20is\x20UNPROVABLE\x20here\x20even\x20though\x20the\x20'+'allocation.balance\x20Guard\x20query\x20(1051,\x20witness\x20OrderAllocation\x20109)\x20makes\x20the\x20fee\x20enforceable\x20at\x20the\x20guard\x20layer\x20'+'(zero-value\x20re-delivery\x20cycles,\x20test/11\x20R2-F3\x20/\x20crs\x20P2-3).\x20THREE\x20WAYS\x20OUT\x20—\x20'+'(1)\x20NO-CHARGE\x20revisit\x20(F-06,\x20ctra-mn\x20261019:\x20a\x20delivered->in_progress\x20revision\x20loop\x20is\x20business-correct\x20and\x20was\x20false-CRITICAL\x20here):\x20'+'declare\x20`reentry_kind:\x20\x22review-loop\x22`\x20on\x20this\x20publish\x20payload\x20(AP-3\x20—\x20machine-checkable,\x20no\x20renaming\x20needed)\x20'+'OR\x20rename\x20ANY\x20ONE\x20node\x20of\x20the\x20cycle\x20with\x20a\x20remedy\x20word\x20root\x20the\x20classifier\x20reads\x20—\x20revis*/review*/rework*/refund*/cancel*/return*/claim*\x20'+'(e.g.\x20\x27revising\x27\x20instead\x20of\x20\x27in_progress\x27)\x20—\x20and\x20the\x20cycle\x20reclassifies\x20as\x20remedy\x20tier\x20(warning,\x20not\x20a\x20blocker);\x20'+'(2)\x20GENUINELY\x20charge-bearing\x20with\x20neutral\x20names:\x20declare\x20`reentry_kind:\x20\x22paid-cycle\x22`\x20(keeps\x20this\x20block\x20—\x20'+'it\x20is\x20the\x20declaration\x20of\x20intent)\x20and\x20bind\x20the\x20fund-gate\x20Guard\x20on\x20the\x20loop\x20forward\x20'+'(constant\x20=\x20order\x20address,\x20convert_witness\x20OrderAllocation,\x20allocation.balance\x20>=\x20revisit\x20fee)\x20AND\x20publish\x20through\x20a\x20template\x20'+'carrying\x20that\x20convention\x20—\x20PRE-STATE\x20CONSTRAINT\x20(esound-mn-261021\x20B-1):\x20the\x20gate\x20reads\x20the\x20COMMITTED\x20pre-transaction\x20'+'balance,\x20so\x20the\x20revisit\x20funds\x20must\x20be\x20committed\x20in\x20a\x20PRIOR\x20transaction.\x20'+TWO_TX_RENEW_RECIPE+'\x20'+'Alternatively\x20replace\x20the\x20loop\x20with\x20per-period\x20NEW\x20Orders\x20(REUSE\x20pattern\x20—\x20a\x20fresh\x20order\x20per\x20period\x20instead\x20of\x20an\x20in-order\x20loop\x20that\x20replays\x20its\x20forwards\x20every\x20lap).\x20'+'(3)\x20A\x20funded\x20renewal\x20loop\x20(post-period\x20node\x20back\x20into\x20a\x20charging\x20node,\x20advanced\x20via\x20the\x20one-PTB\x20order_renew\x20call,\x20'+'NO\x20balance\x20gate\x20on\x20the\x20renew\x20forward\x20—\x20see\x20the\x20PRE-STATE\x20CONSTRAINT\x20above)\x20'+'is\x20the\x20only\x20sanctioned\x20charge-bearing\x20cycle\x20shape\x20for\x20in-order\x20renewals.');k['length']>0x0&&d['push']('pre_publish:\x20machine\x20contains\x20renewal\x20loop\x20cycle(s)\x20'+k['map'](A=>'['+A['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20on-chain\x20a\x20revisit\x20'+'is\x20NOT\x20verified\x20to\x20re-fund\x20the\x20Allocation.\x20Every\x20renewal/loop\x20forward\x20MUST\x20carry\x20the\x20new-period\x20'+'payment\x20into\x20the\x20order\x20escrow\x20(use\x20the\x20order\x20call\x27s\x20order_renew\x20field:\x20create\x20the\x20period\x20payment,\x20receive\x20it\x20into\x20the\x20'+'allocation,\x20and\x20advance\x20the\x20progress\x20—\x20all\x20in\x20one\x20transaction),\x20or\x20the\x20loop\x20allows\x20zero-value\x20'+'re-delivery\x20cycles\x20(test/11\x20R2-F3).\x20'+'PRE-STATE\x20CONSTRAINT\x20(esound-mn-261021\x20B-1,\x20mainnet-verified):\x20a\x20guard\x20on\x20the\x20renew\x20forward\x20reading\x20'+'allocation.balance\x20(query\x201051)\x20evaluates\x20the\x20COMMITTED\x20pre-transaction\x20balance\x20—\x20the\x20same-PTB\x20order_renew\x20'+'payment\x20is\x20INVISIBLE\x20to\x20it,\x20so\x20a\x20balance-gated\x20renew\x20forward\x20ALWAYS\x20aborts.\x20NEVER\x20bind\x20a\x20balance\x20gate\x20to\x20a\x20'+'forward\x20that\x20order_renew\x20advances\x20in\x20the\x20same\x20PTB.\x20'+TWO_TX_RENEW_RECIPE+'\x20'+'The\x20zero-value\x20protection\x20rides\x20this\x20routing\x20convention\x20(order_renew\x27s\x20amount).');l['length']>0x0&&d['push']('pre_publish:\x20machine\x20contains\x20remedy\x20loop\x20cycle(s)\x20'+l['map'](A=>'['+A['c']['cycle']['join']('\x20->\x20')+']')['join'](',\x20')+'\x20—\x20'+'a\x20same-order\x20revisit\x20(revision/review/rework/refund/cancel\x20family)\x20implies\x20NO\x20new\x20charge,\x20so\x20no\x20fund\x20gate\x20is\x20needed\x20on\x20it\x20'+'(the\x20allocation.balance\x20query\x20exists\x20but\x20is\x20irrelevant\x20here).\x20Visible\x20by\x20design\x20(crs\x20P2-3):\x20if\x20the\x20business\x20EVER\x20intends\x20'+'a\x20revisit\x20to\x20cost\x20money,\x20that\x20fee\x20IS\x20enforceable\x20via\x20the\x20balance\x20query\x20(1051)\x20—\x20but\x20that\x20reshapes\x20the\x20cycle\x20into\x20the\x20'+'charge\x20tier\x20above;\x20keep\x20remedy\x20revisits\x20free\x20or\x20restructure\x20as\x20per-period\x20NEW\x20Orders.');for(const A of e){const B=typeof A?.['name']==='string'?A['name']:'?';for(const C of A?.['pairs']??[]){for(const D of C?.['forwards']??[]){const E=D?.['namedOperator']!==undefined&&D?.['namedOperator']!==null,F=D?.['permissionIndex']!==undefined&&D?.['permissionIndex']!==null,G=D?.['guard']!==undefined&&D?.['guard']!==null;!E&&!F&&!G&&d['push']('pre_publish:\x20node\x20\x22'+B+'\x22\x20forward\x20\x22'+String(D?.['name']??'?')+'\x22\x20has\x20no\x20executor\x20binding\x20(namedOperator\x20/\x20permissionIndex\x20/\x20guard)\x20—\x20no\x20one\x20can\x20advance\x20it');}}}const o=lintForwardAmbiguity(a,'pre_publish');c['push'](...o['critical']),d['push'](...o['warnings']);const q=computeTerminalReachability(a);return q['unreachable']['length']>0x0&&d['push']('pre_publish:\x20unreachable\x20machine\x20node(s)\x20'+q['unreachable']['map'](H=>'\x22'+H+'\x22')['join'](',\x20')+'\x20—\x20'+'no\x20path\x20from\x20the\x20entry\x20pair\x20reaches\x20them;\x20dead\x20topology\x20is\x20frozen\x20at\x20publish\x20(IMMUT-001).\x20'+'Wire\x20them\x20into\x20the\x20flow\x20or\x20remove\x20them\x20before\x20publish'),{'critical':c,'warnings':d};}export function computeTerminalReachability(a){const b=[],c=[];if(!Array['isArray'](a)||a['length']===0x0)return{'terminals':b,'unreachable':c};const d=a,e=new Map(),f=[],g=[];for(const j of d){const k=typeof j?.['name']==='string'?j['name']:'';if(!k)continue;f['push'](k);if(!e['has'](k))e['set'](k,[]);let l=![];for(const m of j?.['pairs']??[]){const o=m?.['prev_node'];if(o==='')l=!![];else{if(typeof o==='string'&&o!==''){const q=e['get'](o);if(q)q['push'](k);else e['set'](o,[k]);}}}if(l)g['push'](k);}if(f['length']===0x0||g['length']===0x0)return{'terminals':b,'unreachable':c};const h=new Set(),i=[...g];while(i['length']>0x0){const r=i['pop']();if(h['has'](r))continue;h['add'](r);for(const s of e['get'](r)??[])i['push'](s);}for(const t of f){if(!h['has'](t))c['push'](t);else{if((e['get'](t)??[])['length']===0x0)b['push'](t);}}return{'terminals':b,'unreachable':c};}export const REVIEW_FAMILY_NODE_REGEX=/(^|_)(review|reviews|reviewed|reviewing|evaluated|evaluate|feedback|rating|rated)(_|$)/i;export function lintReviewLockedTerminals(a,b){const c=[],d=[];if(!Array['isArray'](a)||a['length']===0x0)return{'critical':c,'warnings':d};const e=a,h=u=>Array['isArray'](u?.['pairs'])?u['pairs']:Array['isArray'](u?.['value'])?u['value']:[],i=[],j=[],k=[];for(const u of e){const v=typeof u?.['name']==='string'?u['name']:'';if(!v)continue;j['push'](v);let w=![];for(const x of h(u)){const y=x,z=y?.['prev_node'];if(z==='')w=!![];const A=Array['isArray'](y?.['forwards'])?y['forwards']:[],B=[];for(const C of A){const D=C,E=D?.['guard'],F=typeof E==='string'&&E['trim']()!==''?E:E&&typeof E==='object'?E['guard']??E['$ref']:undefined;if(typeof F==='string'&&F['trim']()!=='')B['push'](F);}typeof z==='string'&&z!==''&&i['push']({'from':z,'to':v,'guardRefs':B});}if(w)k['push'](v);}if(j['length']===0x0||k['length']===0x0)return{'critical':c,'warnings':d};const l=computeTerminalReachability(a);if(l['terminals']['length']===0x0)return{'critical':c,'warnings':d};const m=G=>{if(G['guardRefs']['length']===0x0)return![];for(const H of G['guardRefs']){const I=b['get'](H['toLowerCase']());if(!I||I['length']===0x0)return![];const J=I['every'](K=>REVIEW_FAMILY_NODE_REGEX['test'](K));if(!J||I['includes'](G['from']))return![];}return!![];},o=G=>REVIEW_FAMILY_NODE_REGEX['test'](G),q=G=>{const H=new Map();for(const K of i){if(m(K))continue;if(G&&(o(K['from'])||o(K['to'])))continue;const L=H['get'](K['from']);if(L)L['push'](K['to']);else H['set'](K['from'],[K['to']]);}const I=new Set(),J=[...k];while(J['length']>0x0){const M=J['pop']();if(I['has'](M))continue;I['add'](M);for(const N of H['get'](M)??[])J['push'](N);}return I;},r=q(![]),s=q(!![]);for(const G of l['terminals']){if(!r['has'](G))c['push']('REVIEW-LOCK-01:\x20terminal\x20\x22'+G+'\x22\x20is\x20enterable\x20ONLY\x20through\x20forward(s)\x20whose\x20guard\x20pins\x20a\x20'+'review/feedback\x20node\x20the\x20edge\x20itself\x20does\x20not\x20depart\x20from\x20—\x20the\x20rail\x20can\x20never\x20fire\x20(the\x20guard\x20asserts\x20a\x20'+'progress\x20state\x20this\x20transition\x20cannot\x20produce),\x20so\x20a\x20buyer\x20who\x20never\x20reviews\x20strands\x20every\x20order\x27s\x20'+'escrow\x20permanently.\x20Machine\x20topology\x20is\x20immutable\x20after\x20publish\x20(IMMUT-001).\x20Fix\x20BEFORE\x20publish:\x20'+'re-pin\x20the\x20settlement\x20guard\x20to\x20the\x20node\x20the\x20forward\x20actually\x20departs\x20from,\x20and\x20add\x20a\x20time-lock\x20keeper\x20'+'auto-confirm\x20rail\x20(the\x20template\x20deliver_confirm_timeout\x20convention)\x20so\x20settlement\x20never\x20depends\x20on\x20the\x20'+'buyer\x20choosing\x20to\x20review');else!s['has'](G)&&d['push']('REVIEW-LOCK-01:\x20terminal\x20\x22'+G+'\x22\x20is\x20reachable\x20only\x20THROUGH\x20a\x20review/feedback\x20node\x20—\x20a\x20buyer\x20who\x20'+'silently\x20skips\x20reviewing\x20can\x20never\x20let\x20their\x20order\x20reach\x20it.\x20The\x20sanctioned\x20shape\x20keeps\x20the\x20review\x20'+'stop\x20OPTIONAL\x20with\x20an\x20exit\x20edge\x20back\x20to\x20the\x20settlement\x20rail,\x20and\x20a\x20keeper\x20time-lock\x20rail\x20that\x20opens\x20'+'settlement\x20independently\x20(retail\x20deliver_confirm_timeout\x20convention).\x20Verify\x20one\x20of\x20the\x20two\x20exists;\x20'+'if\x20the\x20review\x20node\x20is\x20meant\x20to\x20be\x20keeper-advanceable,\x20this\x20is\x20satisfied\x20and\x20may\x20be\x20ignored');}return{'critical':c,'warnings':d};}export function arbitrationVotingLockDetail(a){if(!Array['isArray'](a))return null;if(a['length']>0x0)return null;return'voting_guard\x20is\x20empty\x20(no\x20guard-weighted\x20voters).\x20Plain\x20votes\x20hard-require\x20the\x20vote\x20permission\x20(358)\x20on\x20the\x20'+'arbitration\x27s\x20own\x20Permission:\x20only\x20that\x20Permission\x27s\x20admin\x20(its\x20creator,\x20by\x20default)\x20and\x20explicit\x20358\x20'+'grantees\x20pass\x20the\x20assert,\x20so\x20without\x20grants\x20the\x20disputing\x20CUSTOMER\x20can\x20never\x20vote\x20and\x20the\x20arb\x20admin\x20is\x20the\x20'+'only\x20possible\x20voter\x20AND\x20the\x20judge\x20—\x20a\x20dispute\x20opened\x20against\x20this\x20service\x20dead-locks\x20when\x20that\x20admin\x20is\x20'+'unresponsive.\x20Configure\x20a\x20public\x20voting_guard\x20on\x20the\x20Arbitration\x20(voting_guard\x20op=\x27set\x27\x20with\x20guard\x20+\x20vote\x20'+'weight\x20—\x20the\x20field\x20stays\x20mutable\x20after\x20publish;\x20the\x20standard\x20shape\x20is\x20tpl_voting_guard_open_vote,\x20the\x20'+'always-true\x20guard\x20at\x20FixedValue\x20weight\x201)\x20or\x20bind\x20an\x20arbitration\x20that\x20already\x20carries\x20one,\x20BEFORE\x20'+'publishing\x20this\x20service';}const TIME_PROFILE_UNIT_MS={'ms':0x1,'msec':0x1,'msecs':0x1,'millisecond':0x1,'milliseconds':0x1,'s':0x3e8,'sec':0x3e8,'secs':0x3e8,'second':0x3e8,'seconds':0x3e8,'m':0xea60,'min':0xea60,'mins':0xea60,'minute':0xea60,'minutes':0xea60,'h':0x36ee80,'hr':0x36ee80,'hrs':0x36ee80,'hour':0x36ee80,'hours':0x36ee80,'d':0x5265c00,'day':0x5265c00,'days':0x5265c00,'w':0x240c8400,'wk':0x240c8400,'wks':0x240c8400,'week':0x240c8400,'weeks':0x240c8400},TIME_PROFILE_DURATION_REGEX=/(\d+(?:\.\d+)?)\s*(ms|milliseconds?|msecs?|minutes?|mins?|seconds?|secs?|hours?|hrs?|days?|weeks?|wks?|min|sec|hr|wk|[smhdw])\b/gi,TIME_PROFILE_ADMISSION_REGEX=/compress(?:ed|ion)|accelerat(?:ed|ion)|shorten(?:ed)?(?:\s+for)?|test\s+(?:value|window|duration|constant)|demo\s+(?:value|window|duration)|for\s+(?:fast\s+|quick\s+)?test(?:ing)?|regression\s+(?:value|window)/i;function timeProfileIsTimeQuery(a){if(typeof a==='number')return a===0x4f7||a===0x4f8||a===0x500;if(typeof a==='string')return/(^|\.)time$|current_time/i['test'](a);return![];}function timeProfileNodeChildren(a){const b=[];for(const c of['nodes','node','nodeLeft','nodeRight','parameters','historyIdx','sessionIdx','forwardIdx','where','find','recipient']){const d=a[c];if(Array['isArray'](d))b['push'](...d);else{if(d&&typeof d==='object')b['push'](d);}}return b;}export function guardTimeProfileDetail(a){const b=typeof a['description']==='string'?a['description']:'',c=TIME_PROFILE_ADMISSION_REGEX['test'](b);let d=0x0;for(const l of b['matchAll'](TIME_PROFILE_DURATION_REGEX)){const n=TIME_PROFILE_UNIT_MS[l[0x2]['toLowerCase']()];if(!n)continue;const o=Number(l[0x1])*n;if(Number['isFinite'](o)&&o>d)d=o;}if(!c&&d===0x0)return null;const e=Array['isArray'](a['table'])?a['table']:[],f=p=>{const q=e['find'](r=>Number(r?.['identifier'])===p);return numericAmount(q?.['value']);},h=p=>{if(!p||typeof p!=='object')return![];const q=p;if(q['type']==='context'&&q['context']==='Clock')return!![];if(q['type']==='query'&&timeProfileIsTimeQuery(q['query']))return!![];if(q['type']==='query_progress_history_time')return!![];return timeProfileNodeChildren(q)['some'](h);},i=[],j=(p,q)=>{if(!p||typeof p!=='object')return;const r=p,s=q||typeof r['type']==='string'&&r['type']['startsWith']('calc_');if(r['type']==='identifier'&&s){const t=f(Number(r['identifier']));if(t!==undefined&&t>0x0)i['push'](t);}for(const u of timeProfileNodeChildren(r))j(u,s);};if(a['root']&&typeof a['root']==='object'&&h(a['root']))j(a['root'],![]);const k=i['find'](p=>p<d/0x64);if(k!==undefined){const p=q=>q>=0x5265c00?q/0x5265c00+'d':q>=0x36ee80?q/0x36ee80+'h':q>=0xea60?q/0xea60+'min':q/0x3e8+'s';return{'level':'critical','detail':'time\x20constant\x20'+p(k)+'\x20is\x20>=100x\x20below\x20the\x20production\x20duration\x20the\x20description\x20itself\x20'+('declares\x20('+p(d)+')\x20—\x20a\x20compressed\x20test\x20value\x20frozen\x20into\x20a\x20production\x20guard.\x20Guards\x20')+'freeze\x20at\x20publish\x20(IMMUT-001),\x20so\x20the\x20window\x20will\x20enforce\x20the\x20compressed\x20value\x20against\x20real\x20orders\x20'+'(klook\x20mainnet\x20261014:\x20\x2724h\x20free\x20cancellation\x27\x20enforced\x20as\x202\x20minutes).\x20Rebuild\x20the\x20guard\x20with\x20the\x20'+'production\x20duration\x20from\x20the\x20template\x20fee_params\x20BEFORE\x20publishing'};}if(c)return{'level':'warning','detail':'description\x20admits\x20compressed/accelerated\x20time\x20constants,\x20but\x20NO\x20time\x20constant\x20in\x20this\x20guard\x27s\x20logic\x20'+'tree\x20is\x20>=100x\x20below\x20the\x20declared\x20production\x20duration\x20—\x20the\x20values\x20look\x20production-scaled.\x20Manual\x20'+'review\x20requested\x20(prose\x20alone\x20no\x20longer\x20blocks\x20publish,\x20BF-07):\x20confirm\x20the\x20tree\x20constants\x20match\x20the\x20'+'production\x20durations\x20in\x20the\x20template\x20fee_params\x20BEFORE\x20publishing\x20—\x20guards\x20freeze\x20at\x20publish\x20'+'(IMMUT-001),\x20so\x20a\x20mis-scaled\x20window\x20(klook\x20mainnet\x20261014:\x20\x2724h\x20free\x20cancellation\x27\x20enforced\x20as\x202\x20'+'minutes)\x20is\x20UNFIXABLE'};return null;}export function rewardRefsOf(a){const b=a?.['rewards'];if(typeof b==='string'&&b['trim']()!=='')return[b];if(Array['isArray'](b))return b['filter'](c=>typeof c==='string'&&c['trim']()!=='');if(Array['isArray'](b?.['objects']))return b['objects']['filter'](c=>typeof c==='string'&&c['trim']()!=='');return[];}export function serviceRewardsUnfundedDetail(b){if(!b||typeof b!=='object')return null;const c=b['data']??b,d=Array['isArray'](c?.['guards'])?c['guards']:[],e=numericAmount(c?.['balance']?.['value']??c?.['balance']);if(e===undefined)return null;let f=0x0;for(const h of d){const i=h?.['amount'];if(i?.['type']!==0x1)continue;const j=numericAmount(i?.['value']?.['value']??i?.['value']);if(j!==undefined&&j>f)f=j;}if(f===0x0)return null;if(e>=f)return null;return'reward\x20pool\x20balance\x20'+e+'\x20cannot\x20cover\x20its\x20largest\x20single-claim\x20promise\x20('+f+').\x20'+'The\x20on-chain\x20publish\x20entry\x20does\x20NOT\x20verify\x20reward\x20funding\x20—\x20a\x20failed\x20reward_fund\x20transfer\x20still\x20'+'publishes\x20(onlyfans\x20mainnet\x20261014\x20shipped\x20a\x20store\x20promising\x20cashback\x20with\x20an\x20empty\x20pool),\x20and\x20the\x20'+'claim\x20aborts\x20once\x20the\x20pool\x20drains.\x20Fund\x20the\x20Reward\x20(reward_fund)\x20up\x20to\x20expected_orders\x20x\x20per-claim\x20'+'amount,\x20or\x20remove\x20the\x20reward\x20binding\x20BEFORE\x20publishing\x20this\x20service';}export const AUDIT_RULES=[{'id':'audit_machine_bound','description':'Service\x20should\x20have\x20a\x20Machine\x20workflow\x20bound\x20before\x20publish','severity':'warning','fields':['machine'],'check':(a,b)=>{if(!a?.['publish'])return!![];return!!a?.['machine'];},'message':()=>'Publishing\x20a\x20service\x20without\x20a\x20Machine\x20workflow.\x20Customers\x20won\x27t\x20have\x20a\x20structured\x20order\x20process.','recommendation':'Create\x20a\x20Machine\x20(workflow\x20template)\x20and\x20bind\x20it\x20to\x20the\x20service\x20before\x20publishing.\x20The\x20machine\x20field\x20becomes\x20IMMUTABLE\x20after\x20publish.'},{'id':'audit_order_allocators','description':'Service\x20should\x20have\x20order_allocators\x20for\x20fund\x20distribution','severity':'warning','fields':['order_allocators'],'check':a=>{if(!a?.['publish'])return!![];return allocatorCountOf(a)>0x0;},'message':()=>'Publishing\x20a\x20service\x20without\x20order_allocators.\x20Order\x20funds\x20cannot\x20be\x20auto-distributed\x20to\x20suppliers.','recommendation':'Configure\x20order_allocators\x20before\x20publishing\x20—\x20this\x20field\x20becomes\x20IMMUTABLE\x20after\x20publish.'},{'id':'audit_buy_guard','description':'Service\x20should\x20have\x20a\x20buy_guard\x20for\x20customer\x20screening','severity':'info','fields':['buy_guard'],'check':a=>!!a?.['buy_guard'],'message':()=>'No\x20buy_guard\x20configured\x20—\x20anyone\x20can\x20purchase\x20this\x20service\x20without\x20verification.','recommendation':'Consider\x20adding\x20a\x20Guard\x20to\x20verify\x20customer\x20eligibility\x20(e.g.,\x20identity,\x20wallet\x20balance,\x20location).'},{'id':'audit_arb_alloc_boundary','description':'Arbitration\x20and\x20Allocator\x20coexist\x20→\x20surface\x20the\x20two-system\x20boundary\x20reminder','severity':'warning','fields':['arbitrations','compensation_fund_add','compensation_fund','order_allocators'],'check':a=>{if(!a?.['publish'])return!![];const b=arbitrationRefsOf(a)['length']>0x0||compensationFundOf(a)!==undefined;return!(b&&allocatorCountOf(a)>0x0);},'message':()=>'Arbitration\x20and\x20Allocator\x20are\x20INDEPENDENT\x20systems\x20by\x20design:\x20a\x20ruling\x20records\x20the\x20case\x20and\x20pays\x20from\x20the\x20service\x20compensation\x20fund\x20—\x20it\x20never\x20moves\x20escrow\x20and\x20never\x20advances\x20the\x20workflow.\x20With\x20both\x20configured,\x20a\x20buyer\x20can\x20receive\x20BOTH\x20the\x20arbitration\x20compensation\x20AND\x20a\x20full\x20escrow\x20refund\x20unless\x20the\x20refund/settlement\x20path\x20is\x20gated.\x20This\x20is\x20a\x20boundary\x20reminder,\x20not\x20a\x20defect\x20—\x20verify\x20the\x20coupling\x20check\x20was\x20done\x20deliberately.','recommendation':'Gate\x20the\x20refund/settlement\x20allocator\x27s\x20Guard\x20on\x20order.claimed_by\x20(read-only\x20cross-system\x20evidence\x20—\x20the\x20sanctioned\x20link),\x20or\x20hold\x20the\x20final\x20settlement\x20forward\x20until\x20the\x20case\x20closes.\x20Do\x20NOT\x20couple\x20the\x20systems\x20the\x20other\x20way\x20(no\x20dispute\x20state\x20on\x20the\x20order\x20flow,\x20no\x20workflow\x20step\x20into\x20arbitration):\x20coupling\x20opens\x20the\x20double-pay\x20path.\x20For\x20per-case\x20fund\x20actions,\x20the\x20deposit-reimbursement\x20pattern\x20(guard-design\x20patterns)\x20is\x20the\x20supported\x20route.'},{'id':'audit_compensation_fund','description':'Service\x20should\x20have\x20a\x20compensation_fund\x20for\x20trust','severity':'warning','fields':['compensation_fund_add','compensation_fund'],'check':a=>compensationFundOf(a)!==undefined,'message':()=>'No\x20compensation_fund\x20configured.\x20Customers\x20have\x20no\x20financial\x20protection\x20if\x20you\x20fail\x20to\x20deliver.','recommendation':'Deposit\x20via\x20compensation_fund_add\x20{balance}\x20to\x20enable\x20arbitration\x20payouts.\x20The\x20fund\x20deters\x20fraud\x20and\x20enables\x20arbitration\x20claims.'},{'id':'audit_arbitrations','description':'Service\x20should\x20have\x20arbitration\x20options\x20for\x20dispute\x20resolution','severity':'info','fields':['arbitrations'],'check':a=>arbitrationRefsOf(a)['length']>0x0,'message':()=>'No\x20arbitration\x20configured.\x20Disputes\x20cannot\x20be\x20resolved\x20through\x20a\x20third\x20party.','recommendation':'Add\x20at\x20least\x20one\x20Arbitration\x20object\x20via\x20arbitrations:{op:\x27add\x27,\x20objects:[...]}\x20to\x20enable\x20on-chain\x20dispute\x20resolution.'},{'id':'audit_arbitration_removal_strands_awards','description':'Removing\x20an\x20authorized\x20venue\x20can\x20strand\x20an\x20award\x20it\x20already\x20ruled\x20on','severity':'error','fields':['arbitrations'],'check':a=>{const b=a?.['arbitrations']?.['remove']??a?.['arbitrations']?.['clear'],c=Array['isArray'](b)?b['length']>0x0:a?.['arbitrations']?.['op']==='clear';if(!c)return!![];if(arbitrationRefsOf(a)['length']>0x0)return!![];return compensationFundOf(a)===undefined;},'message':a=>{const b=a?.['arbitrations']?.['clear']?'every\x20authorized\x20venue':'venue(s)\x20'+(a?.['arbitrations']?.['remove']??[])['join'](',\x20');return'Removing\x20'+b+'\x20while\x20a\x20compensation\x20fund\x20is\x20configured\x20makes\x20any\x20award\x20it\x20already\x20ruled\x20on\x20UNPAYABLE:\x20an\x20on-chain\x20payout\x20now\x20requires\x20the\x20deciding\x20venue\x20to\x20still\x20be\x20on\x20the\x20Service\x27s\x20allowlist,\x20so\x20paying\x20out\x20aborts\x20with\x20E_ARBITRATION_NOT_ALLOWED=39\x20and\x20the\x20escrowed\x20funds\x20stay\x20stranded.';},'recommendation':'Before\x20removing\x20a\x20venue,\x20confirm\x20no\x20case\x20it\x20ruled\x20on\x20is\x20still\x20awaiting\x20compensation\x20payout\x20(query\x20the\x20Arb\x20objects\x20for\x20status\x20Arbitrated,\x20not\x20Finished).\x20Add\x20the\x20replacement\x20venue\x20FIRST,\x20drain\x20the\x20old\x20venue\x27s\x20cases,\x20and\x20only\x20then\x20remove\x20it.\x20A\x20buyer\x20should\x20never\x20be\x20left\x20holding\x20an\x20uncollectable\x20award.'},{'id':'audit_price','description':'Service\x20should\x20have\x20at\x20least\x20one\x20priced\x20sale\x20item','severity':'error','fields':['sales'],'check':a=>{const b=salesItemsOf(a);if(b['length']===0x0)return!![];return b['some'](c=>c?.['price']!==undefined&&c?.['price']!==null);},'message':()=>'Sales\x20list\x20present\x20but\x20no\x20item\x20has\x20a\x20price.\x20Customers\x20cannot\x20place\x20orders\x20without\x20knowing\x20the\x20cost.','recommendation':'Set\x20price\x20on\x20each\x20sales\x20item\x20(smallest-unit\x20string\x20or\x20display\x20form\x20like\x20\x272.5WOW\x27).'},{'id':'audit_compensation_fund_covers_award_ceiling','description':'compensation_fund\x20should\x20cover\x20the\x203x\x20award\x20ceiling\x20of\x20the\x20largest\x20sale\x20(disclosure)','severity':'warning','fields':['compensation_fund_add','compensation_fund','sales'],'check':a=>{if(!a?.['publish'])return!![];const b=compensationFundOf(a);if(b===undefined)return!![];const c=numericAmount(b);if(c===undefined)return!![];if(c===0x0)return![];const e=salesItemsOf(a)['map'](g=>numericAmount(g?.['price']))['filter'](g=>g!==undefined&&g>0x0);if(e['length']===0x0)return!![];const f=e['reduce']((g,h)=>g+h,0x0);return c>=MAX_INDEMNITY_MULTIPLE*f;},'message':()=>'compensation_fund\x20does\x20not\x20cover\x20the\x20award\x20ceiling\x20of\x20the\x20largest\x20sale.\x20An\x20award\x20is\x20hard-capped\x20at\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20'+'the\x20order\x20amount\x20(arb.move\x20MAX_INDEMNITY_MULTIPLE,\x20enforced\x20at\x20ruling\x20time),\x20so\x20a\x20ruling\x20at\x20the\x20ceiling\x20'+'would\x20abort\x20the\x20buyer\x27s\x20claim\x20with\x2027\x20(E_COMPENSATION_NOT_MATCH)\x20—\x20the\x20ruling\x20stands\x20but\x20is\x20unpayable\x20'+'until\x20you\x20deposit,\x20and\x20the\x20abort\x20does\x20NOT\x20consume\x20the\x20claim.\x20Disclosure\x20only:\x20this\x20no\x20longer\x20blocks\x20'+'publish\x20—\x20per-order\x20coverage\x20is\x20enforced\x20at\x20BUY\x20time\x20(the\x20buyer\x27s\x20order\x20is\x20rejected\x20while\x20the\x20fund\x20'+'cannot\x20cover\x203x\x20that\x20order),\x20so\x20under-ceiling\x20funding\x20stops\x20sales\x20instead\x20of\x20stranding\x20awards.','recommendation':'For\x20every\x20order\x20you\x20want\x20to\x20sell,\x20keep\x20the\x20fund\x20at\x20>=\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20THAT\x20order\x20via\x20'+'compensation_fund_add\x20(a\x200.49\x20course\x20needs\x201.47;\x20a\x203.99\x20course\x20needs\x2011.97\x20—\x20no\x20cross-SKU\x20subsidy).\x20'+('Above\x20'+MAX_INDEMNITY_MULTIPLE+'x\x20the\x20current\x20order\x20is\x20optional:\x20it\x20only\x20buys\x20tolerance\x20for\x20several\x20')+'CONCURRENT\x20claims\x20against\x20the\x20one\x20per-Service\x20pool\x20(there\x20is\x20no\x20on-chain\x20concurrency\x20limit),\x20which\x20'+'is\x20a\x20capital-allocation\x20choice.\x20A\x20service\x20with\x20NO\x20fund\x20sells\x20freely\x20—\x20that\x20is\x20the\x20documented\x20'+'no-protection\x20posture\x20(audit_compensation_fund\x20discloses\x20it;\x20buyers\x20see\x20coverage\x20via\x20order\x20monitor).'},{'id':'audit_description','description':'Service\x20should\x20have\x20a\x20description','severity':'warning','fields':['description'],'check':a=>typeof a?.['description']==='string'&&a['description']['length']>0x0,'message':()=>'Service\x20has\x20no\x20description.\x20Customers\x20won\x27t\x20understand\x20what\x20you\x27re\x20offering.','recommendation':'Write\x20a\x20clear\x20description\x20of\x20the\x20service,\x20including\x20deliverables,\x20timelines,\x20and\x20terms.'},{'id':'audit_named_new_name','description':'Service\x20being\x20created\x20should\x20have\x20a\x20name','severity':'warning','check':a=>serviceNameOf(a)!==undefined,'message':()=>'Creating\x20a\x20service\x20without\x20a\x20name\x20makes\x20it\x20hard\x20to\x20reference\x20and\x20organize.','recommendation':'Set\x20object:{name:\x20...}\x20(or\x20namedNew.name)\x20following\x20the\x20convention:\x20<projectPrefix>_<service>_<purpose>.'},{'id':'audit_customer_required_needs_um','description':'customer_required\x20requires\x20a\x20Contact\x20bound\x20via\x20um\x20(SDK-enforced\x20hard\x20link;\x20mirrored\x20here)','severity':'error','fields':['customer_required','um'],'check':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];if(b['length']===0x0)return!![];return!!a?.['um'];},'message':()=>'customer_required\x20is\x20set\x20but\x20no\x20Contact\x20is\x20bound\x20via\x20um\x20—\x20customers\x20cannot\x20deliver\x20the\x20required\x20private\x20information\x20through\x20end-to-end\x20encrypted\x20Messenger.','recommendation':'Bind\x20um:{Contact\x20name/id}\x20in\x20the\x20same\x20call\x20(SDK\x20order_new\x20will\x20fail\x20the\x20buyer\x20otherwise).'},{'id':'audit_customer_required_is_declared_not_enforced','description':'customer_required\x20has\x20no\x20on-chain\x20enforcement\x20at\x20buy\x20time\x20—\x20a\x20Guard\x20must\x20gate\x20fulfilment','severity':'warning','fields':['customer_required'],'check':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];return b['length']===0x0;},'message':a=>{const b=Array['isArray'](a?.['customer_required'])?a['customer_required']:[];return'customer_required\x20('+b['length']+'\x20field(s):\x20'+b['join'](',\x20')+')\x20is\x20DECLARATIVE\x20ONLY:\x20the\x20on-chain\x20purchase\x20entry\x20never\x20reads\x20this\x20list,\x20so\x20an\x20order\x20that\x20supplies\x20none\x20of\x20these\x20fields\x20is\x20still\x20created\x20and\x20progresses.\x20Nothing\x20on-chain\x20will\x20stop\x20it.';},'recommendation':'Bind\x20pattern.required_info_evidence_gate\x20(schema_query\x20action=get_guard_design_patterns)\x20on\x20the\x20first\x20forward\x20that\x20needs\x20the\x20information:\x20query\x20\x27order.required_info\x20some\x27\x20(1572)\x20over\x20the\x20Order.\x20The\x20buyer\x20records\x20the\x20credential\x20via\x20order_required_info_update:\x20EITHER\x20the\x20merchant\x27s\x20IM\x20user\x20address\x20resolved\x20from\x20the\x20Service\x27s\x20Contact\x20(zero\x20cost,\x20address\x20record\x20only)\x20OR\x20an\x20on-chain\x20WTS\x20Proof\x20object\x20address\x20(embeds\x20the\x20merchant\x20IM\x20address\x20and\x20the\x20last-message\x20timestamp;\x20costs\x20gas,\x20publicly\x20verifiable).\x20\x27order.required_info\x27\x20(1573)\x20returns\x20the\x20recorded\x20address\x20but\x20aborts\x20while\x20nothing\x20is\x20recorded\x20—\x20gate\x20on\x201572\x20first.\x20When\x20the\x20listing\x20genuinely\x20promises\x20a\x20PER-ORDER\x20credential,\x20prefer\x20the\x20controlled\x20bind\x20entry\x20(order_required_info_bind):\x20the\x20chain\x20verifies\x20the\x20Proof\x20is\x20about\x20THIS\x20order\x20and\x20owner-created\x20at\x20write\x20time\x20and\x20rejects\x20a\x20mismatch\x20—\x20no\x20guard\x20needed\x20to\x20catch\x20a\x20wrong-proof\x20record.\x20BOUNDARY:\x20that\x20binding\x20proves\x20the\x20credential\x20AUTHOR\x20only,\x20never\x20its\x20content\x20or\x20any\x20rating\x20—\x20do\x20not\x20mirror\x20it\x20onto\x20review/reward\x20claims;\x20public\x20reviews\x20are\x20Repository\x20rows\x20whose\x20values\x20are\x20enforced\x20guard-side\x20via\x20data-value\x20probes,\x20not\x20through\x20Proof\x20objects.'},{'id':'audit_dangling_deps','description':'Service\x20dependencies\x20should\x20be\x20fully\x20created','severity':'error','check':(a,b)=>{if(!a?.['publish'])return!![];if(!b?.['graph'])return!![];const c=b['graph']['findDanglingDependencies']()??[];return c['length']===0x0;},'message':()=>'Service\x20references\x20objects\x20that\x20are\x20not\x20yet\x20created.\x20Publishing\x20will\x20lock\x20these\x20references.','recommendation':'Ensure\x20all\x20referenced\x20objects\x20(machine,\x20allocators,\x20guards)\x20are\x20created\x20and\x20finalized\x20before\x20publishing.'},{'id':'audit_type_parameter','description':'Service\x20should\x20have\x20a\x20token\x20type\x20specified','severity':'info','fields':['type_parameter','namedNew'],'check':a=>typeParameterOf(a)!==undefined,'message':()=>'No\x20payment\x20token\x20type\x20specified.\x20Defaulting\x20to\x20WOW\x20(0x2::wow::WOW).','recommendation':'Explicitly\x20set\x20type_parameter\x20(inside\x20object:{...})\x20if\x20you\x20want\x20to\x20accept\x20non-WOW\x20tokens\x20(e.g.,\x20USDT,\x20ETH).'},{'id':'audit_wip_unreachable_url','description':'sale.wip\x20must\x20be\x20a\x20publicly\x20reachable\x20URL\x20(no\x20localhost/LAN/file\x20paths)','severity':'error','fields':['sales'],'check':(a,b)=>{if(typeof b?.['network']==='string'&&/local/i['test'](b['network']))return!![];const c=salesItemsOf(a);if(c['length']===0x0)return!![];return c['every'](e=>{const f=e?.['wip'];if(typeof f!=='string'||f['trim']()==='')return!![];return!/^(https?:\/\/)?(localhost|127\.0\.0\.1|\[::1\]|0\.0\.0\.0)/i['test'](f)&&!/^https?:\/\/(192\.168\.|10\.|172\.(1[6-9]|2\d|3[01])\.)/i['test'](f)&&!/^file:/i['test'](f);});},'message':a=>{const b=salesItemsOf(a)['map'](c=>String(c?.['wip']??''))['filter'](c=>c!==''&&(/^(https?:\/\/)?(localhost|127\.0\.0\.1|\[::1\]|0\.0\.0\.0)/i['test'](c)||/^https?:\/\/(192\.168\.|10\.|172\.(1[6-9]|2\d|3[01])\.)/i['test'](c)||/^file:/i['test'](c)));return'sale.wip\x20is\x20NOT\x20publicly\x20reachable\x20('+b['join'](',\x20')+').\x20The\x20URL\x20is\x20stored\x20on-chain\x20and\x20every\x20'+'customer\x20fetches\x20it\x20at\x20order\x20time\x20—\x20order_new\x20aborts\x20100%\x20for\x20anyone\x20outside\x20your\x20machine.\x20'+'Host\x20the\x20file\x20publicly:\x20wip_file\x20upload\x20to\x20the\x20official\x20free\x20host\x20(wip.store.wowok.net)\x20or\x20your\x20own\x20'+'endpoint\x20(GitHub\x20Pages\x20/\x20IPFS\x20/\x20your\x20website)';},'recommendation':'Replace\x20the\x20internal\x20URL\x20with\x20a\x20public\x20one.\x20Internal\x20URLs\x20are\x20sanctioned\x20ONLY\x20on\x20env.network=localnet\x20for\x20testing.'},{'id':'audit_wip_missing_public','description':'On\x20public\x20networks\x20every\x20sale\x20item\x20should\x20carry\x20a\x20product-detail\x20(wip)\x20URL','severity':'info','fields':['sales'],'check':(a,b)=>{const c=b?.['network'];if(typeof c==='string'&&/local/i['test'](c))return!![];const e=salesItemsOf(a);if(e['length']===0x0)return!![];return e['every'](f=>typeof f?.['wip']==='string'&&f['wip']['trim']()!=='');},'message':()=>'One\x20or\x20more\x20sale\x20items\x20have\x20NO\x20product-detail\x20(wip)\x20URL.\x20The\x20listing\x20works,\x20but\x20customers\x20see\x20no\x20detail\x20'+'page\x20and\x20the\x20service\x27s\x20market\x20completeness\x20score\x20is\x20downgraded.\x20Easiest:\x20upload\x20the\x20detail\x20file\x20with\x20the\x20'+'wip_file\x20tool\x20to\x20the\x20official\x20free\x20host\x20(https://wip.store.wowok.net\x20—\x2010\x20files\x20per\x20account,\x20180-day\x20'+'retention,\x2012MB/file)\x20and\x20put\x20the\x20returned\x20URL\x20into\x20sale.wip;\x20or\x20host\x20your\x20own\x20(GitHub\x20Pages\x20/\x20IPFS\x20/\x20'+'your\x20website).\x20For\x20long-lived\x20mainnet\x20listings\x20prefer\x20your\x20own\x20endpoint\x20so\x20the\x20detail\x20outlives\x20the\x20free\x20'+'retention\x20window','recommendation':'Upload\x20a\x20WIP\x20file\x20via\x20wip_file\x20and\x20set\x20sale.wip\x20on\x20each\x20item\x20before/after\x20publish\x20(sales\x20stays\x20modifiable).'},{'id':'audit_free_cancel_window_anchor','description':'A\x20free-cancellation\x20window\x20must\x20either\x20ride\x20the\x20stay-date\x20Repository\x20rail\x20or\x20be\x20disclosed\x20as\x20anchored\x20on\x20booking\x20time','severity':'warning','fields':['creation_plan'],'check':(a,b)=>{if(!a?.['publish'])return!![];const c=Array['isArray'](a?.['creation_plan']?.['guards'])?a['creation_plan']['guards']:[],e=c['some'](h=>{const i=typeof h?.['key']==='string'?h['key']:'',j=typeof h?.['purpose']==='string'?h['purpose']:'';return/free[._ ]?cancel/i['test'](i)||/cancell?ation/i['test'](j)&&/window|hours?|days?/i['test'](j);});if(!e)return!![];const f=c['some'](h=>{const i=typeof h?.['template_id']==='string'?h['template_id']:'',j=typeof h?.['purpose']==='string'?h['purpose']:'',k=/repository_data_check/i['test'](i)&&/stay[._ ]?date|use[._ ]?date|check[._ ]?in[._ ]?date|arrival/i['test'](j),l=/anchored on (booking|order\.time)|booking time by default/i['test'](j);return k||l;});return f;},'message':()=>'A\x20free-cancellation\x20window\x20is\x20declared\x20WITHOUT\x20a\x20stay-date\x20anchor\x20and\x20WITHOUT\x20a\x20booking-time\x20disclosure.\x20'+'The\x20chain\x20has\x20no\x20use-date\x20primitive\x20(order.time\x20is\x20the\x20BOOKING\x20moment\x20—\x20written\x20once,\x20immutable),\x20so\x20the\x20'+'window\x20enforces\x20as\x20\x27from\x20booking\x27.\x20If\x20your\x20buyer-facing\x20copy\x20promises\x20\x27X\x20hours\x20before\x20arrival/check-in\x27,\x20'+'the\x20promised\x20window\x20has\x20typically\x20ALREADY\x20CLOSED\x20at\x20booking\x20(bkd8\x20BK-02,\x20live\x20mainnet)\x20—\x20a\x20silent\x20policy\x20'+'inversion\x20that\x20mis-sells\x20the\x20listing.\x20TWO\x20WAYS\x20OUT:\x20(1)\x20FAITHFUL\x20WINDOW\x20—\x20ride\x20the\x20STAY-DATE\x20PRESCRIPTION\x20'+'(time_anchors.free_cancel\x20in\x20the\x20travel\x20templates):\x20a\x20batched\x20id_from\x20None(0)\x20\x27stay_date\x27\x20row\x20(u64\x20epoch-ms)\x20'+'written\x20into\x20the\x20order-scoped\x20Repository\x20at\x20buy\x20time,\x20plus\x20a\x20pattern.repository_data_check\x20leg\x20comparing\x20'+'Clock\x20against\x20row\x20+\x20window\x20offset\x20(CLOSING\x20<=);\x20(2)\x20HONEST\x20DEFAULT\x20—\x20keep\x20the\x20booking-time\x20anchor\x20and\x20state\x20'+'\x27free\x20cancellation\x20within\x20X\x20hours\x20of\x20BOOKING\x27\x20in\x20the\x20buyer-facing\x20copy\x20so\x20the\x20promise\x20matches\x20the\x20chain','recommendation':'Either\x20add\x20the\x20stay-date\x20Repository\x20row\x20+\x20repository_data_check\x20leg\x20(faithful\x20pre-use\x20window),\x20or\x20restate\x20the\x20cancellation\x20policy\x20as\x20\x27from\x20booking\x27\x20in\x20all\x20buyer-facing\x20copy.'}];const RULE_INDEX=new Map(AUDIT_RULES['map'](a=>[a['id'],a]));function readSeverityOverrides(){try{const {getJudgmentDoc:a}=require('../config/judgment.js');if(typeof a!=='function')return{};const b=a()?.['rules']?.['domains'];if(!b||typeof b!=='object')return{};const c={};for(const d of Object['values'](b)){const e=d?.['severity_overrides'];if(!e||typeof e!=='object')continue;for(const [f,g]of Object['entries'](e)){if(g==='error'||g==='warning'||g==='info')c[f]=g;}}return c;}catch{return{};}}export function auditService(a,b){const c=[],d=a?.['publish']===!![]&&typeof a?.['object']==='string',e=readSeverityOverrides();for(const f of AUDIT_RULES){try{if(d&&f['fields']&&!f['fields']['some'](g=>a[g]!==undefined))continue;!f['check'](a,b)&&c['push']({'rule_id':f['id'],'severity':e[f['id']]??f['severity'],'message':f['message'](a),'recommendation':f['recommendation']});}catch{}}return c;}export function hasBlockingErrors(a){return a['some'](b=>b['severity']==='error');}export function getErrors(a){return a['filter'](b=>b['severity']==='error');}export function getWarnings(a){return a['filter'](b=>b['severity']==='warning');}export function summarizeFindings(a){if(a['length']===0x0)return'All\x20audit\x20checks\x20passed.';const b=getErrors(a),c=getWarnings(a),d=a['filter'](g=>g['severity']==='info'),e=[];if(b['length']>0x0)e['push'](b['length']+'\x20error(s)');if(c['length']>0x0)e['push'](c['length']+'\x20warning(s)');if(d['length']>0x0)e['push'](d['length']+'\x20info');return'Audit:\x20'+e['join'](',\x20')+'.\x20Review\x20before\x20publishing.';}export const AUDIT_RULES_VERSION=0xb;
|