@deeeed/metamask-harness 0.47.4 → 0.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (146) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +3 -2
  3. package/adapters/extension/lib/macos-focus.cjs +2 -2
  4. package/adapters/extension/live.sh +6 -8
  5. package/adapters/mobile/bridge-runtime/lib/bridge-errors.cjs +1 -0
  6. package/adapters/shared/ensure-runner-deps.sh +6 -0
  7. package/dist/adapters/extension/runtime-decision.js +18 -1
  8. package/dist/adapters/extension/runtime.js +5 -5
  9. package/dist/adapters/extension/surface.js +1 -0
  10. package/dist/app-lifecycle.js +3 -1
  11. package/dist/command-contract.js +2 -0
  12. package/dist/commands/call.js +1 -8
  13. package/dist/commands/device-target.js +12 -3
  14. package/dist/commands/doctor.js +7 -5
  15. package/dist/commands/fixtures.js +1 -1
  16. package/dist/commands/launch/index.js +10 -0
  17. package/dist/commands/manifest.js +3 -1
  18. package/dist/commands/mobile-device-view.js +13 -3
  19. package/dist/commands/parse-args.js +2 -0
  20. package/dist/commands/run-engine.js +29 -4
  21. package/dist/commands/run.js +1 -1
  22. package/dist/commands/runtime-launch.js +10 -1
  23. package/dist/commands/status.js +8 -4
  24. package/dist/devices.js +31 -9
  25. package/dist/execution-provenance.js +8 -7
  26. package/dist/funding-execution-context.js +43 -13
  27. package/dist/heal-bounds.js +3 -3
  28. package/dist/live-adapter-contract.js +4 -0
  29. package/dist/manifest.js +2 -13
  30. package/dist/mm-harness-cli.js +2 -1
  31. package/dist/runner.js +14 -3
  32. package/docs/RECIPES.md +133 -22
  33. package/docs/RELEASE-QA-CAPABILITY-MAP.md +3 -2
  34. package/library/actions/core/perps/_controller.mjs +10 -0
  35. package/library/actions/core/perps/close_orders.mjs +13 -17
  36. package/library/actions/extension/assets/home-token-identity.mjs +30 -0
  37. package/library/actions/extension/assets/import_custom_token.mjs +61 -79
  38. package/library/actions/extension/assets/open_details.mjs +18 -7
  39. package/library/actions/extension/assets/read_details.mjs +61 -29
  40. package/library/actions/extension/assets/read_visible_state.mjs +4 -1
  41. package/library/actions/extension/assets/select_network_scope.mjs +16 -9
  42. package/library/actions/extension/assets/set_token_visibility.mjs +84 -17
  43. package/library/actions/extension/assets/verify_sorting.mjs +62 -14
  44. package/library/actions/extension/networks/add_custom.mjs +19 -17
  45. package/library/actions/extension/networks/custom_network.mjs +8 -3
  46. package/library/actions/extension/networks/read_visible_state.mjs +1 -0
  47. package/library/actions/extension/performance/_navigation-memory.mjs +35 -6
  48. package/library/actions/extension/performance/compare_idle_navigation_memory.mjs +3 -2
  49. package/library/actions/extension/performance/measure_detached_dom.mjs +3 -2
  50. package/library/actions/extension/performance/measure_navigation_memory.mjs +3 -2
  51. package/library/actions/extension/perps/assert_visible_consistency.mjs +9 -4
  52. package/library/actions/extension/perps/close_visible_position.mjs +3 -3
  53. package/library/actions/extension/perps/edit_margin.mjs +1 -1
  54. package/library/actions/extension/perps/open_balance_action.mjs +16 -7
  55. package/library/actions/extension/perps/perps.mjs +150 -45
  56. package/library/actions/extension/perps/read_funds_confirmation.mjs +8 -0
  57. package/library/actions/extension/perps/read_snapshot.mjs +2 -1
  58. package/library/actions/extension/perps/read_visible_state.mjs +10 -6
  59. package/library/actions/extension/perps/search_markets.mjs +7 -2
  60. package/library/actions/extension/perps/select_activity_filter.mjs +1 -1
  61. package/library/actions/extension/perps/select_market_filter.mjs +74 -45
  62. package/library/actions/extension/perps/set_market_favorite.mjs +6 -3
  63. package/library/actions/extension/perps/state.mjs +1 -0
  64. package/library/actions/extension/perps/update_position_tpsl.mjs +1 -1
  65. package/library/actions/extension/perps/visible-mutation-identity.mjs +4 -2
  66. package/library/actions/extension/platform/cdp.mjs +23 -142
  67. package/library/actions/extension/swap_bridge/quote-state.mjs +54 -0
  68. package/library/actions/extension/swap_bridge/read_visible_state.mjs +4 -1
  69. package/library/actions/extension/swap_bridge/select_assets.mjs +11 -1
  70. package/library/actions/extension/swap_bridge/set_amount.mjs +10 -8
  71. package/library/actions/extension/swap_bridge/set_max_amount.mjs +17 -18
  72. package/library/actions/extension/swap_bridge/set_slippage.mjs +0 -9
  73. package/library/actions/extension/ui/navigate.mjs +58 -14
  74. package/library/actions/extension/wallet/lock.mjs +2 -1
  75. package/library/actions/mobile/assets/import_custom_token.mjs +1 -0
  76. package/library/actions/mobile/assets/read_visible_state.mjs +3 -1
  77. package/library/actions/mobile/assets/set_token_visibility.mjs +13 -9
  78. package/library/actions/mobile/networks/network-management.mjs +22 -15
  79. package/library/actions/mobile/networks/remove_custom.mjs +6 -2
  80. package/library/actions/mobile/perps/perps.mjs +3 -0
  81. package/library/actions/mobile/perps/read-visible-state-loop.mjs +1 -0
  82. package/library/actions/mobile/perps/set_market_favorite.mjs +15 -19
  83. package/library/actions/mobile/platform/native-session.mjs +26 -17
  84. package/library/actions/mobile/platform/observe-ui.mjs +2 -2
  85. package/library/actions/mobile/ui/navigate.mjs +1 -1
  86. package/library/actions/shared/perps/visible-state.mjs +14 -3
  87. package/library/manifests/core.action-manifest.json +14 -2
  88. package/library/manifests/extension.action-manifest.json +49 -16
  89. package/library/manifests/mobile.action-manifest.json +8 -7
  90. package/library/recipes/core/perps/smoke.recipe.json +23 -0
  91. package/library/recipes/core/perps/snapshot.recipe.json +26 -1
  92. package/library/recipes/extension/assets/release-custom-network-token-persistence.recipe.json +25 -8
  93. package/library/recipes/extension/performance/navigation-memory-suite.recipe.json +219 -0
  94. package/library/recipes/extension/performance/navigation-memory.recipe.json +61 -156
  95. package/library/recipes/extension/wallet/smoke.recipe.json +17 -8
  96. package/library/recipes/mobile/app/lifecycle.android-smoke.recipe.json +23 -4
  97. package/library/recipes/mobile/networks/release-custom-network-persistence.recipe.json +31 -6
  98. package/library/recipes/mobile/networks/release-multichain-visibility.recipe.json +5 -4
  99. package/library/recipes/mobile/wallet/smoke.recipe.json +17 -8
  100. package/library/recipes/{assets → shared/assets}/release-token-address-import.recipe.json +7 -0
  101. package/library/recipes/{assets → shared/assets}/release-token-details.recipe.json +2 -2
  102. package/library/recipes/shared/assets/release-token-hide-readd.recipe.json +91 -0
  103. package/library/recipes/{assets → shared/assets}/release-token-persistence.recipe.json +3 -0
  104. package/library/recipes/{assets → shared/assets}/release-token-search-import.recipe.json +4 -1
  105. package/library/recipes/{assets → shared/assets}/release-token-sorting.recipe.json +13 -2
  106. package/library/recipes/{swap-bridge → shared/swap-bridge}/release-quote.recipe.json +29 -3
  107. package/package.json +3 -3
  108. package/site/assets/help-recipes.json +63 -23
  109. package/library/recipes/assets/release-token-hide-readd.recipe.json +0 -57
  110. package/library/recipes/core/perps/clean-market-testnet.recipe.json +0 -44
  111. package/library/recipes/core/perps/order-lifecycle.recipe.json +0 -82
  112. package/library/recipes/core/perps/read-markets.recipe.json +0 -36
  113. package/library/recipes/core/perps/trading-lifecycle.recipe.json +0 -80
  114. package/library/recipes/extension/perps/release-activity-filters.recipe.json +0 -51
  115. package/library/recipes/extension/perps/release-funds-flows.recipe.json +0 -76
  116. package/library/recipes/extension/perps/release-live-limit-order.recipe.json +0 -109
  117. package/library/recipes/extension/perps/release-market-filters.recipe.json +0 -97
  118. package/library/recipes/extension/perps/release-order-entry.recipe.json +0 -158
  119. package/library/recipes/extension/perps/release-order-validation.recipe.json +0 -259
  120. package/library/recipes/extension/perps/release-visible-consistency.recipe.json +0 -47
  121. package/library/recipes/extension/perps/source-dev-snapshot-consistency.recipe.json +0 -76
  122. package/library/recipes/mobile/perps/chase-assert-running.recipe.json +0 -110
  123. package/library/recipes/mobile/perps/chase-place.recipe.json +0 -145
  124. package/library/recipes/mobile/perps/chase-terminate.recipe.json +0 -98
  125. package/library/recipes/mobile/perps/performance.recipe.json +0 -722
  126. package/library/recipes/mobile/perps/pro-order-setup.recipe.json +0 -111
  127. package/library/recipes/mobile/perps/pro-order-start-state.recipe.json +0 -53
  128. package/library/recipes/mobile/perps/scale-assert-orders.recipe.json +0 -126
  129. package/library/recipes/mobile/perps/scale-place.recipe.json +0 -186
  130. package/library/recipes/mobile/perps/twap-assert-active.recipe.json +0 -97
  131. package/library/recipes/mobile/perps/twap-place.recipe.json +0 -146
  132. package/library/recipes/mobile/runner/action-validation.recipe.json +0 -336
  133. package/library/recipes/perps/clean-market-testnet.recipe.json +0 -49
  134. package/library/recipes/perps/lifecycle.recipe.json +0 -144
  135. package/library/recipes/perps/release-live-market-order.recipe.json +0 -139
  136. package/library/recipes/perps/release-watchlist.recipe.json +0 -111
  137. package/library/recipes/swap-bridge/release-max-quote.recipe.json +0 -72
  138. /package/library/recipes/{assets → shared/assets}/release-token-list.recipe.json +0 -0
  139. /package/library/recipes/{perps → shared/perps}/release-market-details.recipe.json +0 -0
  140. /package/library/recipes/{perps → shared/perps}/release-market-search.recipe.json +0 -0
  141. /package/library/recipes/{swap-bridge → shared/swap-bridge}/release-custom-slippage.recipe.json +0 -0
  142. /package/library/recipes/{swap-bridge → shared/swap-bridge}/release-live-max-swap.recipe.json +0 -0
  143. /package/library/recipes/{swap-bridge → shared/swap-bridge}/release-live-swap.recipe.json +0 -0
  144. /package/library/recipes/{swap-bridge → shared/swap-bridge}/release-surface.recipe.json +0 -0
  145. /package/library/recipes/{wallet → shared/wallet}/import.recipe.json +0 -0
  146. /package/library/recipes/{wallet → shared/wallet}/reset-import.recipe.json +0 -0
@@ -1,44 +0,0 @@
1
- {
2
- "$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
3
- "title": "Clean Perps testnet market",
4
- "description": "Converge one Core Perps testnet market to no matching open position or order.",
5
- "paramsSchema": {
6
- "type": "object",
7
- "additionalProperties": false,
8
- "required": [
9
- "market"
10
- ],
11
- "properties": {
12
- "market": {
13
- "type": "string",
14
- "default": "ETH",
15
- "description": "Perps market symbol to clean."
16
- }
17
- }
18
- },
19
- "workflow": {
20
- "entry": "clean-market",
21
- "nodes": {
22
- "clean-market": {
23
- "action": "metamask.perps.start_state",
24
- "intent": "Converge Core Perps to a clean testnet market",
25
- "profile": "clean_market_testnet",
26
- "network": "testnet",
27
- "market": "{{params.market}}",
28
- "positions": {
29
- "state": "none",
30
- "mode": "matching"
31
- },
32
- "orders": {
33
- "state": "none",
34
- "mode": "matching"
35
- },
36
- "next": "done"
37
- },
38
- "done": {
39
- "action": "end",
40
- "status": "pass"
41
- }
42
- }
43
- }
44
- }
@@ -1,82 +0,0 @@
1
- {
2
- "$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
3
- "title": "MetaMask core headless Perps order lifecycle",
4
- "description": "Proves the headless `core` adapter places and cancels a REAL resting Perps LIMIT order on HyperLiquid testnet through the full signing path: a default viem signer backs the perps controller's wallet adapter, the active HyperLiquid testnet provider is initialized, a BTC limit BUY 30% below mid is placed (does not fill — rests on the book), asserted open, then canceled and asserted gone. Leaves the account FLAT — no open orders and no open positions. No CDP, bridge, or UI.",
5
- "workflow": {
6
- "entry": "status",
7
- "nodes": {
8
- "status": {
9
- "action": "app.status",
10
- "next": "start_flat",
11
- "intent": "Resolve the core checkout and report headless compatibility mode"
12
- },
13
- "start_flat": {
14
- "action": "metamask.perps.start_state",
15
- "market": "BTC",
16
- "positions": {
17
- "state": "none"
18
- },
19
- "orders": {
20
- "state": "none"
21
- },
22
- "network": "testnet",
23
- "timeout_ms": 45000,
24
- "next": "place_order",
25
- "intent": "Converge BTC testnet baseline to flat (no positions, no orders) before the proof window"
26
- },
27
- "place_order": {
28
- "action": "metamask.perps.place_order",
29
- "market": "BTC",
30
- "side": "long",
31
- "order_type": "limit",
32
- "offset_pct": -30,
33
- "notional": "11",
34
- "leverage": 2,
35
- "timeout_ms": 45000,
36
- "next": "assert_open",
37
- "intent": "Place a resting BTC limit BUY 30% below mid via the headless controller (real signed limit order to HL testnet; does not fill)"
38
- },
39
- "assert_open": {
40
- "action": "metamask.perps.assert_orders",
41
- "market": "BTC",
42
- "state": "open",
43
- "timeout_ms": 30000,
44
- "next": "cancel_order",
45
- "intent": "Assert the BTC resting limit order opened"
46
- },
47
- "cancel_order": {
48
- "action": "metamask.perps.close_orders",
49
- "market": "BTC",
50
- "timeout_ms": 45000,
51
- "next": "assert_none",
52
- "intent": "Cancel the BTC resting limit order via the headless controller (real signed cancel to HL testnet)"
53
- },
54
- "assert_none": {
55
- "action": "metamask.perps.assert_orders",
56
- "market": "BTC",
57
- "state": "none",
58
- "timeout_ms": 30000,
59
- "next": "teardown_flat",
60
- "intent": "Assert the BTC order canceled — no open orders remain"
61
- },
62
- "teardown_flat": {
63
- "action": "metamask.perps.teardown_state",
64
- "market": "BTC",
65
- "positions": {
66
- "state": "none"
67
- },
68
- "orders": {
69
- "state": "none"
70
- },
71
- "network": "testnet",
72
- "timeout_ms": 45000,
73
- "next": "done",
74
- "intent": "Restore BTC testnet baseline to flat after the proof (leave the shared account clean)"
75
- },
76
- "done": {
77
- "action": "end",
78
- "status": "pass"
79
- }
80
- }
81
- }
82
- }
@@ -1,36 +0,0 @@
1
- {
2
- "$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
3
- "title": "MetaMask core headless Perps read",
4
- "description": "Proves the headless `core` adapter instantiates @metamask/perps-controller against a resolved MetaMask/core checkout and reads live HyperLiquid testnet Perps state (positions, open orders, account state) over HTTP — no CDP, bridge, or UI.",
5
- "workflow": {
6
- "entry": "status",
7
- "nodes": {
8
- "status": {
9
- "action": "app.status",
10
- "next": "read_positions",
11
- "intent": "Resolve the core checkout and report headless compatibility mode"
12
- },
13
- "read_positions": {
14
- "action": "metamask.perps.read_positions",
15
- "mode": "all",
16
- "next": "read_orders",
17
- "intent": "Read live Perps positions from the headless controller"
18
- },
19
- "read_orders": {
20
- "action": "metamask.perps.read_orders",
21
- "mode": "all",
22
- "next": "read_account",
23
- "intent": "Read live Perps open orders from the headless controller"
24
- },
25
- "read_account": {
26
- "action": "metamask.perps.read_account",
27
- "next": "done",
28
- "intent": "Read live Perps account state from the headless controller"
29
- },
30
- "done": {
31
- "action": "end",
32
- "status": "pass"
33
- }
34
- }
35
- }
36
- }
@@ -1,80 +0,0 @@
1
- {
2
- "$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
3
- "title": "MetaMask core headless Perps trading lifecycle",
4
- "description": "Proves the headless `core` adapter places and closes a REAL Perps order on HyperLiquid testnet through the full signing path: a default viem signer backs the perps controller's wallet adapter, the active HyperLiquid testnet provider is initialized, and a small BTC long is opened then closed. Leaves the account FLAT. No CDP, bridge, or UI.",
5
- "workflow": {
6
- "entry": "status",
7
- "nodes": {
8
- "status": {
9
- "action": "app.status",
10
- "next": "start_flat",
11
- "intent": "Resolve the core checkout and report headless compatibility mode"
12
- },
13
- "start_flat": {
14
- "action": "metamask.perps.start_state",
15
- "market": "BTC",
16
- "positions": {
17
- "state": "none"
18
- },
19
- "orders": {
20
- "state": "none"
21
- },
22
- "network": "testnet",
23
- "timeout_ms": 45000,
24
- "next": "place_order",
25
- "intent": "Converge BTC testnet baseline to flat (no positions, no orders) before the proof window"
26
- },
27
- "place_order": {
28
- "action": "metamask.perps.place_order",
29
- "market": "BTC",
30
- "side": "long",
31
- "notional": "11",
32
- "leverage": 2,
33
- "timeout_ms": 45000,
34
- "next": "assert_open",
35
- "intent": "Place a small BTC long market order via the headless controller (real signed order to HL testnet)"
36
- },
37
- "assert_open": {
38
- "action": "metamask.perps.assert_positions",
39
- "market": "BTC",
40
- "state": "open",
41
- "timeout_ms": 30000,
42
- "next": "close_position",
43
- "intent": "Assert the BTC position opened"
44
- },
45
- "close_position": {
46
- "action": "metamask.perps.close_positions",
47
- "market": "BTC",
48
- "timeout_ms": 45000,
49
- "next": "assert_flat",
50
- "intent": "Close the BTC position via the headless controller (real signed close to HL testnet)"
51
- },
52
- "assert_flat": {
53
- "action": "metamask.perps.assert_positions",
54
- "market": "BTC",
55
- "state": "none",
56
- "timeout_ms": 30000,
57
- "next": "teardown_flat",
58
- "intent": "Assert the BTC position closed — account is flat"
59
- },
60
- "teardown_flat": {
61
- "action": "metamask.perps.teardown_state",
62
- "market": "BTC",
63
- "positions": {
64
- "state": "none"
65
- },
66
- "orders": {
67
- "state": "none"
68
- },
69
- "network": "testnet",
70
- "timeout_ms": 45000,
71
- "next": "done",
72
- "intent": "Restore BTC testnet baseline to flat after the proof (leave the shared account clean)"
73
- },
74
- "done": {
75
- "action": "end",
76
- "status": "pass"
77
- }
78
- }
79
- }
80
- }
@@ -1,51 +0,0 @@
1
- {
2
- "$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
3
- "title": "Perps release activity filters",
4
- "description": "Selects the Trades, Orders, Funding, and Deposits controls and proves each selected label and route; populated or typed activity rows are not required.",
5
- "workflow": {
6
- "entry": "open-activity",
7
- "nodes": {
8
- "open-activity": {
9
- "action": "ui.navigate",
10
- "page": "perps-activity",
11
- "intent": "Open the full live Perps activity surface",
12
- "next": "trades"
13
- },
14
- "trades": {
15
- "action": "metamask.perps.select_activity_filter",
16
- "filter": "trades",
17
- "intent": "Prove the Trades filter label and route",
18
- "next": "orders"
19
- },
20
- "orders": {
21
- "action": "metamask.perps.select_activity_filter",
22
- "filter": "orders",
23
- "intent": "Prove the Orders filter label and route",
24
- "next": "funding"
25
- },
26
- "funding": {
27
- "action": "metamask.perps.select_activity_filter",
28
- "filter": "funding",
29
- "intent": "Prove the Funding filter label and route",
30
- "next": "deposits"
31
- },
32
- "deposits": {
33
- "action": "metamask.perps.select_activity_filter",
34
- "filter": "deposits",
35
- "intent": "Prove the Deposits filter label and route",
36
- "next": "capture"
37
- },
38
- "capture": {
39
- "action": "ui.screenshot",
40
- "path": "screenshots/perps-activity-filters.png",
41
- "label": "Perps activity filters",
42
- "intent": "Preserve reviewer-visible proof of the activity surface",
43
- "next": "done"
44
- },
45
- "done": {
46
- "action": "end",
47
- "status": "pass"
48
- }
49
- }
50
- }
51
- }
@@ -1,76 +0,0 @@
1
- {
2
- "$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
3
- "title": "Perps release funds flows",
4
- "description": "Opens the live Perps deposit and withdraw forms, records the currently rendered preview fields, proves zero withdrawal is disabled, and dismisses both without submission.",
5
- "workflow": {
6
- "entry": "open-perps-deposit",
7
- "nodes": {
8
- "open-perps-deposit": {
9
- "action": "ui.navigate",
10
- "page": "perps",
11
- "intent": "Show Perps home before opening Add funds",
12
- "next": "open-deposit"
13
- },
14
- "open-deposit": {
15
- "action": "metamask.perps.open_balance_action",
16
- "balance_action": "add-funds",
17
- "intent": "Open the Perps Add funds confirmation",
18
- "next": "read-deposit"
19
- },
20
- "read-deposit": {
21
- "action": "metamask.perps.read_funds_confirmation",
22
- "mode": "deposit",
23
- "intent": "Prove the deposit form loaded and record any rendered preview fields",
24
- "next": "dismiss-deposit"
25
- },
26
- "dismiss-deposit": {
27
- "action": "ui.press",
28
- "test_id": "wallet-initiated-header-back-button",
29
- "intent": "Dismiss the deposit without submitting funds",
30
- "next": "open-perps-withdraw"
31
- },
32
- "open-perps-withdraw": {
33
- "action": "ui.navigate",
34
- "page": "perps",
35
- "intent": "Show Perps home before opening Withdraw",
36
- "next": "open-withdraw"
37
- },
38
- "open-withdraw": {
39
- "action": "metamask.perps.open_balance_action",
40
- "balance_action": "withdraw",
41
- "intent": "Open the Perps Withdraw confirmation",
42
- "next": "read-withdraw"
43
- },
44
- "read-withdraw": {
45
- "action": "metamask.perps.read_funds_confirmation",
46
- "mode": "withdraw",
47
- "intent": "Prove the withdraw form loaded and record any rendered preview fields",
48
- "next": "enter-zero"
49
- },
50
- "enter-zero": {
51
- "action": "ui.set_input",
52
- "test_id": "custom-amount-input",
53
- "value": "0",
54
- "intent": "Enter zero to exercise withdrawal validation",
55
- "next": "assert-zero"
56
- },
57
- "assert-zero": {
58
- "action": "metamask.perps.read_funds_confirmation",
59
- "mode": "withdraw",
60
- "expected_submit_enabled": false,
61
- "intent": "Prove zero remains non-submittable",
62
- "next": "dismiss-withdraw"
63
- },
64
- "dismiss-withdraw": {
65
- "action": "ui.press",
66
- "test_id": "wallet-initiated-header-back-button",
67
- "intent": "Dismiss the withdrawal without submitting funds",
68
- "next": "done"
69
- },
70
- "done": {
71
- "action": "end",
72
- "status": "pass"
73
- }
74
- }
75
- }
76
- }
@@ -1,109 +0,0 @@
1
- {
2
- "$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
3
- "title": "Perps release live limit order",
4
- "description": "Places and cancels one small resting Perps limit order through visible product controls.",
5
- "paramsSchema": {
6
- "type": "object",
7
- "additionalProperties": false,
8
- "required": ["confirm_live", "limit_price", "provider", "network"],
9
- "properties": {
10
- "market": {
11
- "type": "string",
12
- "default": "BTC"
13
- },
14
- "amount": {
15
- "type": "integer",
16
- "minimum": 10,
17
- "default": 10
18
- },
19
- "leverage": {
20
- "type": "integer",
21
- "minimum": 1,
22
- "default": 1
23
- },
24
- "provider": { "type": "string" },
25
- "network": { "type": "string", "enum": ["mainnet", "testnet"] },
26
- "limit_price": { "type": "string" },
27
- "offset_pct": { "type": "number" },
28
- "confirm_live": {
29
- "type": "boolean"
30
- },
31
- "identity_rounding_tolerance_base_units": { "type": "string", "default": "10000" }
32
- }
33
- },
34
- "workflow": {
35
- "entry": "open-market",
36
- "nodes": {
37
- "open-market": {
38
- "action": "ui.navigate",
39
- "page": "perps-market",
40
- "market": "{{params.market}}",
41
- "intent": "Open the requested live Perps market",
42
- "next": "place-limit"
43
- },
44
- "place-limit": {
45
- "action": "metamask.perps.place_order",
46
- "market": "{{params.market}}",
47
- "side": "long",
48
- "amount": "{{params.amount}}",
49
- "leverage": "{{params.leverage}}",
50
- "provider": "{{params.provider}}",
51
- "network": "{{params.network}}",
52
- "order_type": "limit",
53
- "limit_price": "{{params.limit_price}}",
54
- "confirm_live": "{{params.confirm_live}}",
55
- "identity_rounding_tolerance_base_units": "{{params.identity_rounding_tolerance_base_units}}",
56
- "submit_attempts": 1,
57
- "timeout_ms": 45000,
58
- "intent": "Submit one authorized resting limit order through visible controls",
59
- "next": "assert-open"
60
- },
61
- "assert-open": {
62
- "action": "metamask.perps.read_visible_state",
63
- "surface": "market-details",
64
- "market": "{{params.market}}",
65
- "minimum_order_count": 1,
66
- "maximum_position_count": 0,
67
- "require_test_ids": ["perps-orders-section-header"],
68
- "max_items": 200,
69
- "intent": "Prove the live limit order appears in the market",
70
- "next": "capture-open"
71
- },
72
- "capture-open": {
73
- "action": "ui.screenshot",
74
- "path": "screenshots/perps-live-limit-order.png",
75
- "label": "Perps live limit order",
76
- "intent": "Preserve reviewer-visible proof of the resting order",
77
- "next": "cancel-order"
78
- },
79
- "cancel-order": {
80
- "action": "metamask.perps.close_orders",
81
- "market": "{{params.market}}",
82
- "side": "long",
83
- "amount": "{{params.amount}}",
84
- "leverage": "{{params.leverage}}",
85
- "provider": "{{params.provider}}",
86
- "network": "{{params.network}}",
87
- "limit_price": "{{params.limit_price}}",
88
- "identity_rounding_tolerance_base_units": "{{params.identity_rounding_tolerance_base_units}}",
89
- "confirm_live": "{{params.confirm_live}}",
90
- "timeout_ms": 30000,
91
- "intent": "Cancel the authorized live limit order through visible controls",
92
- "next": "assert-canceled"
93
- },
94
- "assert-canceled": {
95
- "action": "metamask.perps.read_visible_state",
96
- "surface": "home",
97
- "maximum_position_count": 0,
98
- "maximum_order_count": 0,
99
- "require_features": ["balance", "market-list"],
100
- "intent": "Prove global positions and orders remain empty after cancellation",
101
- "next": "done"
102
- },
103
- "done": {
104
- "action": "end",
105
- "status": "pass"
106
- }
107
- }
108
- }
109
- }
@@ -1,97 +0,0 @@
1
- {
2
- "$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
3
- "title": "Perps release market filters",
4
- "description": "Exercises every stable live Perps market category through visible controls after resetting the market-list surface.",
5
- "workflow": {
6
- "entry": "open-perps",
7
- "nodes": {
8
- "open-perps": {
9
- "action": "ui.navigate",
10
- "page": "perps",
11
- "intent": "Reset transient market-list state on the Perps home surface",
12
- "next": "open-market-list"
13
- },
14
- "open-market-list": {
15
- "action": "ui.navigate",
16
- "page": "perps-market-list",
17
- "intent": "Open the complete live Perps market selection",
18
- "next": "wait-market-filter"
19
- },
20
- "wait-market-filter": {
21
- "action": "ui.wait_for",
22
- "test_id": "filter-select-button",
23
- "expected": "visible",
24
- "timeout_ms": 30000,
25
- "intent": "Confirm the market filter control is ready",
26
- "next": "all"
27
- },
28
- "all": {
29
- "action": "metamask.perps.select_market_filter",
30
- "filter": "all",
31
- "minimum_market_count": 1,
32
- "intent": "Prove the complete live market category",
33
- "next": "crypto"
34
- },
35
- "crypto": {
36
- "action": "metamask.perps.select_market_filter",
37
- "filter": "crypto",
38
- "minimum_market_count": 0,
39
- "intent": "Prove the Crypto market category",
40
- "next": "stocks"
41
- },
42
- "stocks": {
43
- "action": "metamask.perps.select_market_filter",
44
- "filter": "stocks",
45
- "minimum_market_count": 0,
46
- "intent": "Prove the Stocks market category",
47
- "next": "pre-ipo"
48
- },
49
- "pre-ipo": {
50
- "action": "metamask.perps.select_market_filter",
51
- "filter": "pre-ipo",
52
- "minimum_market_count": 0,
53
- "intent": "Prove the Pre-IPO market category control",
54
- "next": "index"
55
- },
56
- "index": {
57
- "action": "metamask.perps.select_market_filter",
58
- "filter": "index",
59
- "minimum_market_count": 0,
60
- "intent": "Prove the Index market category control",
61
- "next": "etf"
62
- },
63
- "etf": {
64
- "action": "metamask.perps.select_market_filter",
65
- "filter": "etf",
66
- "minimum_market_count": 0,
67
- "intent": "Prove the ETF market category control",
68
- "next": "commodities"
69
- },
70
- "commodities": {
71
- "action": "metamask.perps.select_market_filter",
72
- "filter": "commodities",
73
- "minimum_market_count": 0,
74
- "intent": "Prove the Commodities market category",
75
- "next": "forex"
76
- },
77
- "forex": {
78
- "action": "metamask.perps.select_market_filter",
79
- "filter": "forex",
80
- "minimum_market_count": 0,
81
- "intent": "Prove the Forex market category",
82
- "next": "capture"
83
- },
84
- "capture": {
85
- "action": "ui.screenshot",
86
- "path": "screenshots/perps-market-filters.png",
87
- "label": "Perps release market filters",
88
- "intent": "Preserve reviewer-visible proof of the final market filter",
89
- "next": "done"
90
- },
91
- "done": {
92
- "action": "end",
93
- "status": "pass"
94
- }
95
- }
96
- }
97
- }