@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,139 +0,0 @@
1
- {
2
- "$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
3
- "title": "Perps release live market order",
4
- "description": "Places one small live Perps market order through visible product controls and proves the resulting position and activity.",
5
- "paramsSchema": {
6
- "type": "object",
7
- "additionalProperties": false,
8
- "required": ["confirm_live"],
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": {
25
- "type": "string",
26
- "default": "hyperliquid"
27
- },
28
- "network": {
29
- "type": "string",
30
- "enum": [
31
- "mainnet",
32
- "testnet"
33
- ],
34
- "default": "mainnet"
35
- },
36
- "confirm_live": {
37
- "type": "boolean"
38
- },
39
- "identity_rounding_tolerance_base_units": { "type": "string", "default": "10000" },
40
- "balance_reconciliation_tolerance_base_units": { "type": "string", "default": "1000000" }
41
- }
42
- },
43
- "workflow": {
44
- "entry": "open-perps",
45
- "nodes": {
46
- "open-perps": {
47
- "action": "ui.navigate",
48
- "page": "perps",
49
- "intent": "Show the live Perps home surface",
50
- "next": "open-market-list"
51
- },
52
- "open-market-list": {
53
- "action": "ui.navigate",
54
- "page": "perps-market-list",
55
- "intent": "Show the live Perps market list",
56
- "next": "open-market"
57
- },
58
- "open-market": {
59
- "action": "ui.navigate",
60
- "page": "perps-market",
61
- "market": "{{params.market}}",
62
- "intent": "Open the requested Perps market",
63
- "next": "submit-once"
64
- },
65
- "submit-once": {
66
- "action": "metamask.perps.place_order",
67
- "market": "{{params.market}}",
68
- "side": "long",
69
- "amount": "{{params.amount}}",
70
- "leverage": "{{params.leverage}}",
71
- "provider": "{{params.provider}}",
72
- "network": "{{params.network}}",
73
- "order_type": "market",
74
- "confirm_live": "{{params.confirm_live}}",
75
- "identity_rounding_tolerance_base_units": "{{params.identity_rounding_tolerance_base_units}}",
76
- "submit_attempts": 1,
77
- "timeout_ms": 45000,
78
- "intent": "Submit the authorized order exactly once",
79
- "next": "wait-position"
80
- },
81
- "wait-position": {
82
- "action": "ui.wait_for",
83
- "test_id": "perps-position-size-value",
84
- "expected": "visible",
85
- "timeout_ms": 45000,
86
- "intent": "Confirm the filled position becomes visible",
87
- "next": "assert-position"
88
- },
89
- "assert-position": {
90
- "action": "metamask.perps.read_visible_state",
91
- "surface": "market-details",
92
- "market": "{{params.market}}",
93
- "minimum_position_count": 1,
94
- "maximum_order_count": 0,
95
- "minimum_activity_count": 1,
96
- "require_test_ids": ["perps-position-size-value", "perps-position-leverage"],
97
- "max_items": 150,
98
- "intent": "Prove the filled position appears once with market activity",
99
- "next": "capture-open"
100
- },
101
- "capture-open": {
102
- "action": "ui.screenshot",
103
- "path": "screenshots/perps-live-position.png",
104
- "label": "Perps live position",
105
- "intent": "Preserve reviewer-visible proof of the filled live position",
106
- "next": "close-position"
107
- },
108
- "close-position": {
109
- "action": "metamask.perps.close_visible_position",
110
- "market": "{{params.market}}",
111
- "confirm_live": "{{params.confirm_live}}",
112
- "funding_side": "long",
113
- "funding_amount": "{{params.amount}}",
114
- "provider": "{{params.provider}}",
115
- "network": "{{params.network}}",
116
- "leverage": "{{params.leverage}}",
117
- "identity_rounding_tolerance_base_units": "{{params.identity_rounding_tolerance_base_units}}",
118
- "balance_reconciliation_tolerance_base_units": "{{params.balance_reconciliation_tolerance_base_units}}",
119
- "intent": "Close the live position after proving it",
120
- "next": "assert-closed"
121
- },
122
- "assert-closed": {
123
- "action": "metamask.perps.read_visible_state",
124
- "surface": "home",
125
- "maximum_position_count": 0,
126
- "maximum_order_count": 0,
127
- "require_features": ["balance", "market-list"],
128
- "minimum_activity_count": 1,
129
- "max_items": 150,
130
- "intent": "Prove the position was removed and close activity was recorded",
131
- "next": "done"
132
- },
133
- "done": {
134
- "action": "end",
135
- "status": "pass"
136
- }
137
- }
138
- }
139
- }
@@ -1,111 +0,0 @@
1
- {
2
- "$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
3
- "title": "Perps release watchlist persistence",
4
- "description": "Adds and removes one live Perps market favorite and proves both states after navigating away and back.",
5
- "paramsSchema": {
6
- "type": "object",
7
- "additionalProperties": false,
8
- "properties": {
9
- "market": {
10
- "type": "string",
11
- "default": "BTC"
12
- }
13
- }
14
- },
15
- "workflow": {
16
- "entry": "open-perps",
17
- "nodes": {
18
- "open-perps": {
19
- "action": "ui.navigate",
20
- "page": "perps",
21
- "intent": "Show the Perps home surface",
22
- "next": "open-market-list"
23
- },
24
- "open-market-list": {
25
- "action": "ui.navigate",
26
- "page": "perps-market-list",
27
- "intent": "Show the complete market list",
28
- "next": "open-market"
29
- },
30
- "open-market": {
31
- "action": "ui.navigate",
32
- "page": "perps-market",
33
- "market": "{{params.market}}",
34
- "intent": "Open the market to update its favorite state",
35
- "next": "add-favorite"
36
- },
37
- "add-favorite": {
38
- "action": "metamask.perps.set_market_favorite",
39
- "market": "{{params.market}}",
40
- "favorite": true,
41
- "intent": "Ensure the market is added to favorites",
42
- "next": "return-home-added"
43
- },
44
- "return-home-added": {
45
- "action": "ui.navigate",
46
- "page": "perps",
47
- "intent": "Show Perps home after adding the favorite",
48
- "next": "reopen-market-list-added"
49
- },
50
- "reopen-market-list-added": {
51
- "action": "ui.navigate",
52
- "page": "perps-market-list",
53
- "intent": "Reopen the market list after adding the favorite",
54
- "next": "reopen-market-added"
55
- },
56
- "reopen-market-added": {
57
- "action": "ui.navigate",
58
- "page": "perps-market",
59
- "market": "{{params.market}}",
60
- "intent": "Reopen the favorited market",
61
- "next": "assert-added"
62
- },
63
- "assert-added": {
64
- "action": "metamask.perps.set_market_favorite",
65
- "market": "{{params.market}}",
66
- "favorite": true,
67
- "require_unchanged": true,
68
- "intent": "Prove the favorite persisted after navigating away and back",
69
- "next": "remove-favorite"
70
- },
71
- "remove-favorite": {
72
- "action": "metamask.perps.set_market_favorite",
73
- "market": "{{params.market}}",
74
- "favorite": false,
75
- "intent": "Ensure the market is removed from favorites",
76
- "next": "return-home-removed"
77
- },
78
- "return-home-removed": {
79
- "action": "ui.navigate",
80
- "page": "perps",
81
- "intent": "Show Perps home after removing the favorite",
82
- "next": "reopen-market-list-removed"
83
- },
84
- "reopen-market-list-removed": {
85
- "action": "ui.navigate",
86
- "page": "perps-market-list",
87
- "intent": "Reopen the market list after removing the favorite",
88
- "next": "reopen-market-removed"
89
- },
90
- "reopen-market-removed": {
91
- "action": "ui.navigate",
92
- "page": "perps-market",
93
- "market": "{{params.market}}",
94
- "intent": "Reopen the unfavorited market",
95
- "next": "assert-removed"
96
- },
97
- "assert-removed": {
98
- "action": "metamask.perps.set_market_favorite",
99
- "market": "{{params.market}}",
100
- "favorite": false,
101
- "require_unchanged": true,
102
- "intent": "Prove the removal persisted after navigating away and back",
103
- "next": "done"
104
- },
105
- "done": {
106
- "action": "end",
107
- "status": "pass"
108
- }
109
- }
110
- }
111
- }
@@ -1,72 +0,0 @@
1
- {
2
- "$schema": "https://farmslot.io/schemas/recipe-v1.schema.json",
3
- "title": "Swap release Max quote",
4
- "description": "Selects an exact live pair, uses the visible Max balance, and proves the resulting quote without submission.",
5
- "paramsSchema": {
6
- "type": "object",
7
- "additionalProperties": false,
8
- "properties": {
9
- "source_symbol": { "type": "string" },
10
- "destination_symbol": { "type": "string" },
11
- "source_chain": { "type": "string" },
12
- "destination_chain": { "type": "string" },
13
- "source_query": { "type": "string" },
14
- "destination_query": { "type": "string" },
15
- "source_asset_id": { "type": "string", "default": "" },
16
- "destination_asset_id": { "type": "string", "default": "" },
17
- "timeout_ms": { "type": "integer", "minimum": 1000, "default": 120000 }
18
- },
19
- "required": ["source_symbol", "destination_symbol", "source_chain", "destination_chain", "source_query", "destination_query"]
20
- },
21
- "workflow": {
22
- "entry": "open-swap",
23
- "nodes": {
24
- "open-swap": {
25
- "action": "ui.navigate",
26
- "page": "swap",
27
- "timeout_ms": "{{params.timeout_ms}}",
28
- "intent": "Open Swap through visible product navigation",
29
- "next": "select-assets"
30
- },
31
- "select-assets": {
32
- "action": "metamask.swap_bridge.select_assets",
33
- "source_symbol": "{{params.source_symbol}}",
34
- "destination_symbol": "{{params.destination_symbol}}",
35
- "source_chain": "{{params.source_chain}}",
36
- "destination_chain": "{{params.destination_chain}}",
37
- "source_query": "{{params.source_query}}",
38
- "destination_query": "{{params.destination_query}}",
39
- "source_asset_id": "{{params.source_asset_id}}",
40
- "destination_asset_id": "{{params.destination_asset_id}}",
41
- "timeout_ms": "{{params.timeout_ms}}",
42
- "intent": "Select the exact source and destination assets",
43
- "next": "use-max"
44
- },
45
- "use-max": {
46
- "action": "metamask.swap_bridge.set_max_amount",
47
- "wait_for_quote": true,
48
- "timeout_ms": "{{params.timeout_ms}}",
49
- "intent": "Use the visible available source balance",
50
- "next": "assert-quote"
51
- },
52
- "assert-quote": {
53
- "action": "metamask.swap_bridge.read_visible_state",
54
- "source_symbol": "{{params.source_symbol}}",
55
- "destination_symbol": "{{params.destination_symbol}}",
56
- "require_amount_inputs": true,
57
- "require_settings": true,
58
- "require_quote": true,
59
- "intent": "Prove the selected pair and Max quote remain visible",
60
- "next": "capture-quote"
61
- },
62
- "capture-quote": {
63
- "action": "ui.screenshot",
64
- "path": "screenshots/swap-max-quote.png",
65
- "label": "Swap Max quote",
66
- "intent": "Preserve reviewer-visible proof of the Max quote",
67
- "next": "done"
68
- },
69
- "done": { "action": "end", "status": "pass" }
70
- }
71
- }
72
- }