@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,146 +0,0 @@
1
- {
2
- "$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
3
- "title": "Place a Mobile Pro TWAP",
4
- "description": "Places one parameterized TWAP through visible Mobile Pro controls, cleaning only the testnet path.",
5
- "paramsSchema": {
6
- "type": "object",
7
- "additionalProperties": false,
8
- "properties": {
9
- "account": {
10
- "type": "string",
11
- "default": "",
12
- "description": "Optional exact fixture account name, such as Trading or dev1. Omit it to keep the currently selected account."
13
- },
14
- "provider": { "type": "string", "default": "hyperliquid" },
15
- "network": {
16
- "type": "string",
17
- "enum": ["testnet", "mainnet"],
18
- "default": "testnet",
19
- "description": "Mainnet placement requires an explicit user request."
20
- },
21
- "market": {
22
- "type": "string",
23
- "default": "BTC"
24
- },
25
- "side": {
26
- "type": "string",
27
- "enum": [
28
- "long",
29
- "short"
30
- ],
31
- "default": "long"
32
- },
33
- "notional": {
34
- "type": "string",
35
- "default": "110"
36
- },
37
- "randomize": {
38
- "type": "string",
39
- "enum": ["true", "false"],
40
- "default": "false"
41
- }
42
- }
43
- },
44
- "workflow": {
45
- "entry": "prepare",
46
- "nodes": {
47
- "prepare": {
48
- "action": "call",
49
- "ref": "perps.pro-order-setup",
50
- "params": {
51
- "account": "{{params.account}}",
52
- "provider": "{{params.provider}}",
53
- "network": "{{params.network}}",
54
- "market": "{{params.market}}",
55
- "side": "{{params.side}}"
56
- },
57
- "intent": "Prepare the requested Pro order form and Advanced picker.",
58
- "next": "position-twap"
59
- },
60
- "position-twap": {
61
- "action": "ui.scroll",
62
- "test_id": "perps-order-type-twap",
63
- "scroll_into_view": true,
64
- "intent": "Expose the TWAP option for visible selection.",
65
- "next": "wait-twap"
66
- },
67
- "wait-twap": {
68
- "action": "ui.wait_for",
69
- "test_id": "perps-order-type-twap",
70
- "expected": "visible",
71
- "timeout_ms": 10000,
72
- "intent": "Fail closed unless TWAP is visibly offered.",
73
- "next": "select-twap"
74
- },
75
- "select-twap": {
76
- "action": "ui.press",
77
- "test_id": "perps-order-type-twap",
78
- "intent": "Select TWAP.",
79
- "next": "position-size"
80
- },
81
- "position-size": {
82
- "action": "ui.scroll",
83
- "test_id": "perps-pro-order-form-size-card",
84
- "scroll_into_view": true,
85
- "intent": "Expose the TWAP size input for visible entry.",
86
- "next": "wait-size"
87
- },
88
- "wait-size": {
89
- "action": "ui.wait_for",
90
- "test_id": "perps-pro-order-form-size-card",
91
- "expected": "visible",
92
- "timeout_ms": 10000,
93
- "intent": "Confirm the TWAP size card is visible.",
94
- "next": "set-size"
95
- },
96
- "set-size": {
97
- "action": "ui.set_input",
98
- "test_id": "perps-pro-order-form-size-input",
99
- "value": "{{params.notional}}",
100
- "intent": "Enter the requested USD notional.",
101
- "next": "choose-randomize"
102
- },
103
- "choose-randomize": {
104
- "action": "switch",
105
- "value": "{{params.randomize}}",
106
- "equals": "true",
107
- "cases": {
108
- "match": "enable-randomize"
109
- },
110
- "default": "position-submit",
111
- "intent": "Apply the requested randomization setting."
112
- },
113
- "enable-randomize": {
114
- "action": "ui.press",
115
- "test_id": "perps-pro-order-form-twap-randomize",
116
- "intent": "Enable randomized slice timing.",
117
- "next": "position-submit"
118
- },
119
- "position-submit": {
120
- "action": "ui.scroll",
121
- "test_id": "perps-pro-order-form-summary-fees",
122
- "scroll_into_view": true,
123
- "intent": "Expose the final TWAP fee row directly above submission.",
124
- "next": "wait-submit"
125
- },
126
- "wait-submit": {
127
- "action": "ui.wait_for",
128
- "test_id": "perps-pro-order-form-place-order",
129
- "expected": "visible",
130
- "timeout_ms": 10000,
131
- "intent": "Confirm the valid TWAP can be submitted.",
132
- "next": "submit"
133
- },
134
- "submit": {
135
- "action": "ui.press",
136
- "test_id": "perps-pro-order-form-place-order",
137
- "intent": "Submit the TWAP to the selected provider and network.",
138
- "next": "done"
139
- },
140
- "done": {
141
- "action": "end",
142
- "status": "pass"
143
- }
144
- }
145
- }
146
- }
@@ -1,336 +0,0 @@
1
- {
2
- "$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
3
- "title": "MetaMask Mobile action E2E validation",
4
- "description": "Exercises every Mobile manifest-declared action against mm-4 and leaves trace output for false-positive checks.",
5
- "workflow": {
6
- "entry": "prepare-files",
7
- "nodes": {
8
- "prepare-files": {
9
- "action": "command",
10
- "cmd": "mkdir -p temp/recipe-runner.action-validation && printf 'E2E_ACTION_VALIDATION mobile\\n' > temp/recipe-runner.action-validation/probe.txt && printf '{\"platform\":\"mobile\",\"ok\":true}\n' > temp/recipe-runner.action-validation/probe.json && printf 'mobile log E2E_ACTION_VALIDATION\\n' >> temp/recipe-runner.action-validation/validation.log && echo E2E_ACTION_VALIDATION mobile",
11
- "next": "assert-command-exit",
12
- "intent": "Prepare runner.action-validation probe files"
13
- },
14
- "assert-command-exit": {
15
- "action": "assert_exit_code",
16
- "source": "prepare-files",
17
- "expected": 0,
18
- "next": "assert-command-output",
19
- "intent": "Verify the probe command exited successfully"
20
- },
21
- "assert-command-output": {
22
- "action": "assert_output",
23
- "source": "prepare-files",
24
- "stream": "stdout",
25
- "contains": "E2E_ACTION_VALIDATION mobile",
26
- "next": "assert-file",
27
- "intent": "Verify the probe command produced expected output"
28
- },
29
- "assert-file": {
30
- "action": "assert_file",
31
- "path": "temp/recipe-runner.action-validation/probe.txt",
32
- "contains": "E2E_ACTION_VALIDATION mobile",
33
- "next": "assert-json",
34
- "intent": "Verify file assertions work"
35
- },
36
- "assert-json": {
37
- "action": "assert_json",
38
- "path": "temp/recipe-runner.action-validation/probe.json",
39
- "assert": {
40
- "path": "$.platform",
41
- "operator": "eq",
42
- "value": "mobile"
43
- },
44
- "next": "watch-logs",
45
- "intent": "Verify JSON assertions work"
46
- },
47
- "watch-logs": {
48
- "action": "watch_logs",
49
- "path": "temp/recipe-runner.action-validation/validation.log",
50
- "contains": "E2E_ACTION_VALIDATION",
51
- "next": "index-artifacts",
52
- "intent": "Verify log watching works"
53
- },
54
- "index-artifacts": {
55
- "action": "index_artifacts",
56
- "artifacts": [
57
- {
58
- "path": "temp/recipe-runner.action-validation/probe.txt",
59
- "type": "log",
60
- "category": "debug",
61
- "label": "Mobile action validation probe"
62
- }
63
- ],
64
- "next": "wait",
65
- "intent": "Register the probe file as an artifact"
66
- },
67
- "wait": {
68
- "action": "wait",
69
- "duration_ms": 1,
70
- "next": "status",
71
- "intent": "Verify the base wait action works"
72
- },
73
- "status": {
74
- "action": "app.status",
75
- "next": "app-hud",
76
- "intent": "Read project runner compatibility status"
77
- },
78
- "cdp-probe": {
79
- "action": "cdp.target",
80
- "next": "fixture",
81
- "required": true,
82
- "intent": "Verify the automation channel is reachable"
83
- },
84
- "fixture": {
85
- "action": "metamask.wallet.fixture_status",
86
- "next": "wallet-setup",
87
- "intent": "Verify wallet fixture availability"
88
- },
89
- "wallet-setup": {
90
- "action": "metamask.wallet.setup",
91
- "next": "wallet-unlock",
92
- "intent": "Verify wallet setup is ready"
93
- },
94
- "wallet-unlock": {
95
- "action": "metamask.wallet.ensure_unlocked",
96
- "next": "wallet-read-state",
97
- "intent": "Ensure the wallet is unlocked"
98
- },
99
- "wallet-read-state": {
100
- "action": "metamask.wallet.read_state",
101
- "next": "wallet-list-accounts",
102
- "intent": "Read wallet state for proof"
103
- },
104
- "wallet-list-accounts": {
105
- "action": "metamask.wallet.list_accounts",
106
- "next": "select-account",
107
- "intent": "List wallet accounts for proof"
108
- },
109
- "select-account": {
110
- "action": "metamask.wallet.select_account",
111
- "address": "0x8dc623e964475d4d669da601fd15ea9125469003",
112
- "next": "app-navigate-wallet",
113
- "intent": "Select the validation account"
114
- },
115
- "app-navigate-wallet": {
116
- "action": "ui.navigate",
117
- "next": "ui-wait-wallet",
118
- "intent": "Show the wallet home surface",
119
- "route": "WalletView"
120
- },
121
- "ui-wait-wallet": {
122
- "action": "ui.wait_for",
123
- "test_id": "wallet-screen",
124
- "expected": "present",
125
- "next": "ui-press",
126
- "intent": "Confirm the wallet surface is ready"
127
- },
128
- "ui-press": {
129
- "action": "ui.press",
130
- "test_id": "wallet-account-copy-button",
131
- "next": "ui-scroll",
132
- "intent": "Activate the visible control"
133
- },
134
- "ui-scroll": {
135
- "action": "ui.scroll",
136
- "test_id": "wallet-screen",
137
- "offset": 1000,
138
- "next": "ui-scroll-into-view",
139
- "intent": "Expose the next visible content"
140
- },
141
- "ui-screenshot-wallet": {
142
- "action": "ui.screenshot",
143
- "path": "screenshots/mobile-wallet-runner.action-validation.png",
144
- "next": "wallet-navigate-perps",
145
- "intent": "Record the visible wallet state as evidence"
146
- },
147
- "wallet-navigate-perps": {
148
- "action": "ui.navigate",
149
- "next": "perps-navigate-home",
150
- "intent": "Show the Perps home surface",
151
- "route": "PerpsMarketListView"
152
- },
153
- "perps-navigate-home": {
154
- "action": "ui.navigate",
155
- "next": "perps-navigate-market",
156
- "intent": "Show the Perps home surface",
157
- "route": "PerpsMarketListView"
158
- },
159
- "perps-navigate-market": {
160
- "action": "ui.navigate",
161
- "next": "start-state",
162
- "intent": "Show the ETH Perps market details",
163
- "route": "PerpsMarketDetails",
164
- "params": {
165
- "market": {
166
- "symbol": "ETH"
167
- }
168
- }
169
- },
170
- "ensure-clean": {
171
- "action": "metamask.perps.ensure_positions",
172
- "market": "ETH",
173
- "next": "ensure-orders-clean",
174
- "state": "none",
175
- "intent": "Ensure no positions are open",
176
- "mode": "matching"
177
- },
178
- "assert-no-position": {
179
- "action": "metamask.perps.assert_positions",
180
- "market": "ETH",
181
- "next": "read-orders-empty",
182
- "state": "none",
183
- "intent": "Confirm selected ETH position state is clean",
184
- "mode": "matching"
185
- },
186
- "read-orders-empty": {
187
- "action": "metamask.perps.read_orders",
188
- "market": "ETH",
189
- "next": "assert-no-orders",
190
- "intent": "Read order state after cleanup"
191
- },
192
- "place-order": {
193
- "action": "metamask.perps.place_order",
194
- "market": "ETH",
195
- "side": "long",
196
- "amount": "11",
197
- "leverage": 3,
198
- "next": "read-positions",
199
- "intent": "Place a small ETH 3x long validation order"
200
- },
201
- "read-positions": {
202
- "action": "metamask.perps.read_positions",
203
- "market": "ETH",
204
- "next": "assert-position",
205
- "intent": "Read ETH position after order placement"
206
- },
207
- "assert-position": {
208
- "action": "metamask.perps.assert_positions",
209
- "market": "ETH",
210
- "next": "read-orders-open",
211
- "state": "open",
212
- "intent": "Confirm the ETH validation position opened"
213
- },
214
- "read-orders-open": {
215
- "action": "metamask.perps.read_orders",
216
- "market": "ETH",
217
- "next": "close-orders",
218
- "intent": "Read ETH orders before cleanup"
219
- },
220
- "assert-closed": {
221
- "action": "metamask.perps.assert_positions",
222
- "market": "ETH",
223
- "next": "teardown-state",
224
- "state": "none",
225
- "intent": "Confirm global position cleanup completed",
226
- "mode": "matching"
227
- },
228
- "done": {
229
- "action": "end",
230
- "status": "pass"
231
- },
232
- "ensure-orders-clean": {
233
- "action": "metamask.perps.ensure_orders",
234
- "market": "ETH",
235
- "state": "none",
236
- "next": "assert-no-position",
237
- "intent": "Ensure no orders are open",
238
- "mode": "matching"
239
- },
240
- "assert-no-orders": {
241
- "action": "metamask.perps.assert_orders",
242
- "market": "ETH",
243
- "state": "none",
244
- "next": "place-order",
245
- "intent": "Confirm selected ETH order state is clean",
246
- "mode": "matching"
247
- },
248
- "close-orders": {
249
- "action": "metamask.perps.close_orders",
250
- "market": "ETH",
251
- "next": "close-positions",
252
- "intent": "Close ETH orders created by validation"
253
- },
254
- "close-positions": {
255
- "action": "metamask.perps.close_positions",
256
- "market": "ETH",
257
- "next": "assert-closed",
258
- "intent": "Close the ETH validation position"
259
- },
260
- "start-state": {
261
- "action": "metamask.perps.start_state",
262
- "profile": "clean_market_testnet",
263
- "market": "ETH",
264
- "positions": {
265
- "state": "none",
266
- "mode": "matching"
267
- },
268
- "orders": {
269
- "state": "none",
270
- "mode": "matching"
271
- },
272
- "page": "market",
273
- "next": "ensure-clean",
274
- "intent": "Prepare selected-market clean testnet Perps validation state",
275
- "mode": "matching"
276
- },
277
- "teardown-state": {
278
- "action": "metamask.perps.teardown_state",
279
- "market": "ETH",
280
- "positions": {
281
- "state": "none",
282
- "mode": "matching"
283
- },
284
- "orders": {
285
- "state": "none",
286
- "mode": "matching"
287
- },
288
- "page": "home",
289
- "next": "done",
290
- "intent": "Return Perps to a selected-market clean home state",
291
- "mode": "matching"
292
- },
293
- "app-hud": {
294
- "action": "app.hud",
295
- "text": "mobile action parity validation",
296
- "status": "running",
297
- "next": "cdp-probe",
298
- "intent": "Start visible recipe progress HUD"
299
- },
300
- "ui-scroll-into-view": {
301
- "action": "ui.scroll",
302
- "test_id": "wallet-screen",
303
- "scroll_into_view": true,
304
- "offset": 40,
305
- "next": "app-navigate-network-selector",
306
- "intent": "Expose the wallet content needed for proof"
307
- },
308
- "app-navigate-network-selector": {
309
- "action": "ui.press",
310
- "test_id": "import-token-button",
311
- "next": "wait-token-search-input",
312
- "intent": "Open token search input"
313
- },
314
- "ui-set-input-network": {
315
- "action": "ui.set_input",
316
- "test_id": "input-search-asset",
317
- "value": "ETH",
318
- "next": "return-wallet-after-input",
319
- "intent": "Filter the visible token list"
320
- },
321
- "return-wallet-after-input": {
322
- "action": "ui.navigate",
323
- "next": "ui-screenshot-wallet",
324
- "intent": "Return to wallet after input validation",
325
- "route": "WalletView"
326
- },
327
- "wait-token-search-input": {
328
- "action": "ui.wait_for",
329
- "test_id": "input-search-asset",
330
- "expected": "present",
331
- "next": "ui-set-input-network",
332
- "intent": "Confirm token search is ready"
333
- }
334
- }
335
- }
336
- }
@@ -1,49 +0,0 @@
1
- {
2
- "$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
3
- "title": "Clean Perps testnet market",
4
- "description": "Converge one Perps testnet market to an unlocked wallet with 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": "ensure-wallet",
21
- "nodes": {
22
- "ensure-wallet": {
23
- "action": "metamask.wallet.ensure_unlocked",
24
- "intent": "Ensure the wallet is unlocked before cleaning the Perps market",
25
- "next": "clean-market"
26
- },
27
- "clean-market": {
28
- "action": "metamask.perps.start_state",
29
- "intent": "Converge Perps to a clean testnet market",
30
- "profile": "clean_market_testnet",
31
- "network": "testnet",
32
- "market": "{{params.market}}",
33
- "positions": {
34
- "state": "none",
35
- "mode": "matching"
36
- },
37
- "orders": {
38
- "state": "none",
39
- "mode": "matching"
40
- },
41
- "next": "done"
42
- },
43
- "done": {
44
- "action": "end",
45
- "status": "pass"
46
- }
47
- }
48
- }
49
- }
@@ -1,144 +0,0 @@
1
- {
2
- "$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
3
- "title": "MetaMask Perps lifecycle smoke",
4
- "description": "Reusable Recipe v1 smoke that proves a deterministic Perps prestate, opens a small ETH testnet position, verifies it, closes it, and tears down to a clean state.",
5
- "workflow": {
6
- "entry": "status",
7
- "nodes": {
8
- "status": {
9
- "action": "app.status",
10
- "intent": "Read runner compatibility status",
11
- "next": "fixture"
12
- },
13
- "fixture": {
14
- "action": "metamask.wallet.fixture_status",
15
- "intent": "Verify wallet fixture availability",
16
- "next": "wallet-setup"
17
- },
18
- "wallet-setup": {
19
- "action": "metamask.wallet.setup",
20
- "intent": "Ensure wallet fixture setup is ready",
21
- "next": "wallet-unlock"
22
- },
23
- "wallet-unlock": {
24
- "action": "metamask.wallet.ensure_unlocked",
25
- "intent": "Ensure the wallet is unlocked",
26
- "next": "select-account"
27
- },
28
- "select-account": {
29
- "action": "metamask.wallet.select_account",
30
- "address": "0x8dc623e964475d4d669da601fd15ea9125469003",
31
- "intent": "Select the validation account",
32
- "next": "wallet-read-state"
33
- },
34
- "wallet-read-state": {
35
- "action": "metamask.wallet.read_state",
36
- "intent": "Capture wallet state proof",
37
- "next": "navigate-perps"
38
- },
39
- "navigate-perps": {
40
- "action": "ui.navigate",
41
- "intent": "Show the Perps home surface",
42
- "next": "navigate-market",
43
- "page": "perps"
44
- },
45
- "navigate-market": {
46
- "action": "ui.navigate",
47
- "intent": "Show the ETH Perps market details",
48
- "next": "start-state",
49
- "page": "perps-market",
50
- "market": "ETH"
51
- },
52
- "start-state": {
53
- "action": "metamask.perps.start_state",
54
- "profile": "clean_market_testnet",
55
- "market": "ETH",
56
- "positions": {
57
- "state": "none",
58
- "mode": "matching"
59
- },
60
- "orders": {
61
- "state": "none",
62
- "mode": "matching"
63
- },
64
- "page": "market",
65
- "intent": "Prepare clean ETH testnet Perps state",
66
- "next": "assert-clean-position"
67
- },
68
- "assert-clean-position": {
69
- "action": "metamask.perps.assert_positions",
70
- "market": "ETH",
71
- "state": "none",
72
- "intent": "Confirm ETH position state is clean",
73
- "next": "assert-clean-orders"
74
- },
75
- "assert-clean-orders": {
76
- "action": "metamask.perps.assert_orders",
77
- "market": "ETH",
78
- "state": "none",
79
- "intent": "Confirm ETH order state is clean",
80
- "next": "place-order"
81
- },
82
- "place-order": {
83
- "action": "metamask.perps.place_order",
84
- "market": "ETH",
85
- "side": "long",
86
- "amount": "11",
87
- "leverage": 3,
88
- "intent": "Open a small ETH 3x long position",
89
- "next": "assert-open"
90
- },
91
- "assert-open": {
92
- "action": "metamask.perps.assert_positions",
93
- "market": "ETH",
94
- "state": "open",
95
- "intent": "Confirm the ETH position opened",
96
- "next": "read-orders"
97
- },
98
- "read-orders": {
99
- "action": "metamask.perps.read_orders",
100
- "market": "ETH",
101
- "intent": "Read ETH orders before cleanup",
102
- "next": "close-orders"
103
- },
104
- "close-orders": {
105
- "action": "metamask.perps.close_orders",
106
- "market": "ETH",
107
- "intent": "Close ETH orders from the lifecycle",
108
- "next": "close-position"
109
- },
110
- "close-position": {
111
- "action": "metamask.perps.close_positions",
112
- "market": "ETH",
113
- "intent": "Close the ETH lifecycle position",
114
- "next": "assert-closed"
115
- },
116
- "assert-closed": {
117
- "action": "metamask.perps.assert_positions",
118
- "market": "ETH",
119
- "state": "none",
120
- "intent": "Confirm ETH position cleanup completed",
121
- "next": "teardown-state"
122
- },
123
- "teardown-state": {
124
- "action": "metamask.perps.teardown_state",
125
- "market": "ETH",
126
- "positions": {
127
- "state": "none",
128
- "mode": "matching"
129
- },
130
- "orders": {
131
- "state": "none",
132
- "mode": "matching"
133
- },
134
- "page": "home",
135
- "intent": "Return Perps to globally clean home state",
136
- "next": "done"
137
- },
138
- "done": {
139
- "action": "end",
140
- "status": "pass"
141
- }
142
- }
143
- }
144
- }