@artblocks/abx-cli 0.1.0-alpha.9 → 0.2.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 (201) hide show
  1. package/CHANGELOG.md +429 -0
  2. package/assets/renderer-scaffold/README.md +44 -13
  3. package/assets/renderer-scaffold/foundry.toml +5 -0
  4. package/assets/renderer-scaffold/remappings.txt +1 -1
  5. package/assets/renderer-scaffold/script/DeployHooks.s.sol +24 -0
  6. package/assets/renderer-scaffold/script/Preview.s.sol +99 -0
  7. package/assets/renderer-scaffold/src/MyHooks.sol +20 -0
  8. package/assets/renderer-scaffold/src/MyRenderer.sol +4 -4
  9. package/assets/renderer-scaffold/src/MyTraits.sol +2 -2
  10. package/assets/renderer-scaffold/test/MyRenderer.t.sol +60 -3
  11. package/dist/bin.d.ts +26 -0
  12. package/dist/bin.d.ts.map +1 -0
  13. package/dist/bin.js +63 -0
  14. package/dist/bin.js.map +1 -0
  15. package/dist/capabilities.d.ts +132 -0
  16. package/dist/capabilities.d.ts.map +1 -0
  17. package/dist/capabilities.js +175 -0
  18. package/dist/capabilities.js.map +1 -0
  19. package/dist/commands/auth.d.ts +54 -0
  20. package/dist/commands/auth.d.ts.map +1 -0
  21. package/dist/commands/auth.js +483 -0
  22. package/dist/commands/auth.js.map +1 -0
  23. package/dist/commands/contract.d.ts +19 -0
  24. package/dist/commands/contract.d.ts.map +1 -0
  25. package/dist/commands/contract.js +171 -0
  26. package/dist/commands/contract.js.map +1 -0
  27. package/dist/commands/deploy.d.ts +296 -0
  28. package/dist/commands/deploy.d.ts.map +1 -0
  29. package/dist/commands/deploy.js +5756 -0
  30. package/dist/commands/deploy.js.map +1 -0
  31. package/dist/commands/feedback.d.ts +7 -0
  32. package/dist/commands/feedback.d.ts.map +1 -0
  33. package/dist/commands/feedback.js +154 -0
  34. package/dist/commands/feedback.js.map +1 -0
  35. package/dist/commands/maintenance.d.ts +4 -0
  36. package/dist/commands/maintenance.d.ts.map +1 -0
  37. package/dist/commands/maintenance.js +114 -0
  38. package/dist/commands/maintenance.js.map +1 -0
  39. package/dist/commands/project.d.ts +458 -0
  40. package/dist/commands/project.d.ts.map +1 -0
  41. package/dist/commands/project.js +1837 -0
  42. package/dist/commands/project.js.map +1 -0
  43. package/dist/commands/reads.d.ts +85 -0
  44. package/dist/commands/reads.d.ts.map +1 -0
  45. package/dist/commands/reads.js +881 -0
  46. package/dist/commands/reads.js.map +1 -0
  47. package/dist/commands/scaffold.d.ts +89 -0
  48. package/dist/commands/scaffold.d.ts.map +1 -0
  49. package/dist/commands/scaffold.js +741 -0
  50. package/dist/commands/scaffold.js.map +1 -0
  51. package/dist/commands/service.d.ts +67 -0
  52. package/dist/commands/service.d.ts.map +1 -0
  53. package/dist/commands/service.js +761 -0
  54. package/dist/commands/service.js.map +1 -0
  55. package/dist/commands/storage.d.ts +51 -0
  56. package/dist/commands/storage.d.ts.map +1 -0
  57. package/dist/commands/storage.js +399 -0
  58. package/dist/commands/storage.js.map +1 -0
  59. package/dist/commands/submit-app.d.ts +102 -0
  60. package/dist/commands/submit-app.d.ts.map +1 -0
  61. package/dist/commands/submit-app.js +638 -0
  62. package/dist/commands/submit-app.js.map +1 -0
  63. package/dist/config.d.ts +94 -2
  64. package/dist/config.d.ts.map +1 -1
  65. package/dist/config.js +332 -12
  66. package/dist/config.js.map +1 -1
  67. package/dist/conformance.d.ts +31 -0
  68. package/dist/conformance.d.ts.map +1 -0
  69. package/dist/conformance.js +400 -0
  70. package/dist/conformance.js.map +1 -0
  71. package/dist/contract-read-error.d.ts +5 -0
  72. package/dist/contract-read-error.d.ts.map +1 -0
  73. package/dist/contract-read-error.js +37 -0
  74. package/dist/contract-read-error.js.map +1 -0
  75. package/dist/creator-agent.d.ts +49 -0
  76. package/dist/creator-agent.d.ts.map +1 -0
  77. package/dist/creator-agent.js +363 -0
  78. package/dist/creator-agent.js.map +1 -0
  79. package/dist/creator-keyring.d.ts +26 -0
  80. package/dist/creator-keyring.d.ts.map +1 -0
  81. package/dist/creator-keyring.js +57 -0
  82. package/dist/creator-keyring.js.map +1 -0
  83. package/dist/creator-signer.d.ts +52 -0
  84. package/dist/creator-signer.d.ts.map +1 -0
  85. package/dist/creator-signer.js +267 -0
  86. package/dist/creator-signer.js.map +1 -0
  87. package/dist/deploy-plan.d.ts +218 -0
  88. package/dist/deploy-plan.d.ts.map +1 -0
  89. package/dist/deploy-plan.js +20 -0
  90. package/dist/deploy-plan.js.map +1 -0
  91. package/dist/deps.d.ts +6 -39
  92. package/dist/deps.d.ts.map +1 -1
  93. package/dist/deps.js +4 -68
  94. package/dist/deps.js.map +1 -1
  95. package/dist/errors.d.ts +22 -0
  96. package/dist/errors.d.ts.map +1 -0
  97. package/dist/errors.js +32 -0
  98. package/dist/errors.js.map +1 -0
  99. package/dist/flag-allowlists.d.ts +53 -0
  100. package/dist/flag-allowlists.d.ts.map +1 -0
  101. package/dist/flag-allowlists.js +188 -0
  102. package/dist/flag-allowlists.js.map +1 -0
  103. package/dist/flags.d.ts +53 -0
  104. package/dist/flags.d.ts.map +1 -1
  105. package/dist/flags.js +151 -1
  106. package/dist/flags.js.map +1 -1
  107. package/dist/jsonout.d.ts +37 -0
  108. package/dist/jsonout.d.ts.map +1 -0
  109. package/dist/jsonout.js +79 -0
  110. package/dist/jsonout.js.map +1 -0
  111. package/dist/kind.d.ts +57 -0
  112. package/dist/kind.d.ts.map +1 -0
  113. package/dist/kind.js +122 -0
  114. package/dist/kind.js.map +1 -0
  115. package/dist/main.js +859 -5374
  116. package/dist/main.js.map +1 -1
  117. package/dist/mintpage.d.ts +17 -2
  118. package/dist/mintpage.d.ts.map +1 -1
  119. package/dist/mintpage.js +241 -54
  120. package/dist/mintpage.js.map +1 -1
  121. package/dist/output.d.ts +184 -0
  122. package/dist/output.d.ts.map +1 -0
  123. package/dist/output.js +774 -0
  124. package/dist/output.js.map +1 -0
  125. package/dist/ownerops.d.ts +463 -59
  126. package/dist/ownerops.d.ts.map +1 -1
  127. package/dist/ownerops.js +2329 -366
  128. package/dist/ownerops.js.map +1 -1
  129. package/dist/preview.d.ts +23 -5
  130. package/dist/preview.d.ts.map +1 -1
  131. package/dist/preview.js +95 -43
  132. package/dist/preview.js.map +1 -1
  133. package/dist/provision.d.ts +3 -13
  134. package/dist/provision.d.ts.map +1 -1
  135. package/dist/provision.js +19 -21
  136. package/dist/provision.js.map +1 -1
  137. package/dist/remote.d.ts +116 -9
  138. package/dist/remote.d.ts.map +1 -1
  139. package/dist/remote.js +371 -14
  140. package/dist/remote.js.map +1 -1
  141. package/dist/riskgate.d.ts +101 -0
  142. package/dist/riskgate.d.ts.map +1 -0
  143. package/dist/riskgate.js +343 -0
  144. package/dist/riskgate.js.map +1 -0
  145. package/dist/scaffold.d.ts +12 -0
  146. package/dist/scaffold.d.ts.map +1 -0
  147. package/dist/scaffold.js +56 -0
  148. package/dist/scaffold.js.map +1 -0
  149. package/dist/schema.d.ts +36 -1
  150. package/dist/schema.d.ts.map +1 -1
  151. package/dist/schema.js +121 -26
  152. package/dist/schema.js.map +1 -1
  153. package/dist/script-chunks.d.ts +8 -0
  154. package/dist/script-chunks.d.ts.map +1 -0
  155. package/dist/script-chunks.js +35 -0
  156. package/dist/script-chunks.js.map +1 -0
  157. package/dist/served.d.ts +30 -0
  158. package/dist/served.d.ts.map +1 -0
  159. package/dist/served.js +112 -0
  160. package/dist/served.js.map +1 -0
  161. package/dist/signer.d.ts +20 -1
  162. package/dist/signer.d.ts.map +1 -1
  163. package/dist/signer.js +110 -18
  164. package/dist/signer.js.map +1 -1
  165. package/dist/update-check.d.ts +60 -9
  166. package/dist/update-check.d.ts.map +1 -1
  167. package/dist/update-check.js +105 -18
  168. package/dist/update-check.js.map +1 -1
  169. package/package.json +17 -12
  170. package/skill/SKILL.md +213 -354
  171. package/skill/agents/openai.yaml +4 -0
  172. package/skill/reference/capabilities.md +195 -0
  173. package/skill/reference/code.md +236 -0
  174. package/skill/reference/creator-token.md +94 -0
  175. package/skill/reference/deploy.md +191 -0
  176. package/skill/reference/diagnose.md +178 -0
  177. package/skill/reference/hosting.md +191 -102
  178. package/skill/reference/operate.md +237 -0
  179. package/skill/reference/services.md +173 -0
  180. package/skill/reference/setup.md +221 -42
  181. package/assets/renderer-scaffold/src/interfaces/IAbxFieldRenderer.sol +0 -32
  182. package/assets/renderer-scaffold/src/interfaces/IAbxParams.sol +0 -26
  183. package/dist/inspect.d.ts +0 -48
  184. package/dist/inspect.d.ts.map +0 -1
  185. package/dist/inspect.js +0 -184
  186. package/dist/inspect.js.map +0 -1
  187. package/dist/migrate.d.ts +0 -65
  188. package/dist/migrate.d.ts.map +0 -1
  189. package/dist/migrate.js +0 -180
  190. package/dist/migrate.js.map +0 -1
  191. package/dist/onchain-uri.d.ts +0 -97
  192. package/dist/onchain-uri.d.ts.map +0 -1
  193. package/dist/onchain-uri.js +0 -243
  194. package/dist/onchain-uri.js.map +0 -1
  195. package/dist/upload.d.ts +0 -28
  196. package/dist/upload.d.ts.map +0 -1
  197. package/dist/upload.js +0 -41
  198. package/dist/upload.js.map +0 -1
  199. package/skill/reference/code-projects.md +0 -246
  200. package/skill/reference/operating.md +0 -118
  201. package/skill/reference/troubleshooting.md +0 -28
@@ -1 +1 @@
1
- {"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,OAAO,EAAC,gBAAgB,EAA6B,MAAM,oBAAoB,CAAC;AAEhF,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,OAAO,GAAG,SAAS,CAAC;AAEvD,MAAM,WAAW,YAAY;IAC3B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,YAAY,CAAC;IACrB,4FAA4F;IAC5F,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,SAAS,CAAC,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,YAAY,GAAG,IAAI,CAgCrB;AAED;2EAC2E;AAC3E,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,MAAM,CAehG;AAED;+FAC+F;AAC/F,wBAAgB,qBAAqB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,KAAK,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAA;CAAC,CAAC,CAQjI;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAC,CAAC,CAUjH;AAED;6BAC6B;AAC7B,wBAAgB,aAAa,CAAC,CAAC,EAAE,YAAY,GAAG,gBAAgB,CAE/D;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAgCvF"}
1
+ {"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
package/dist/remote.js CHANGED
@@ -1,22 +1,40 @@
1
1
  /**
2
2
  * Remote-resolver resolution — which service `--remote` means, and whose credential drives it.
3
3
  * The HTTP client itself lives in the SDK (`AbxServiceClient`, speaking the /v1 control plane from
4
- * specs/self-host-toolkit/remote-services.md); this module owns the CLI conventions around it:
4
+ * site/content/docs/using-abx/remote-services.mdx); this module owns the CLI conventions around it:
5
5
  *
6
6
  * --remote <name> a NAMED remote — `ABX_REMOTE_<NAME>_URL` + `ABX_REMOTE_<NAME>_TOKEN` in .env
7
- * (same env-name normalization as ABX_RPC_URLS_<CHAIN>). A managed provider's
8
- * per-account API key lives here — and deliberately NEVER falls back to
9
- * ABX_RESOLVER_ADMIN_TOKEN, so your node-admin secret can't silently go to a
10
- * third party.
11
- * --remote <url> an ad-hoc URL — token from --remote-token or ABX_RESOLVER_ADMIN_TOKEN.
7
+ * (same env-name normalization as ABX_RPC_URLS_<CHAIN>). "self" is just a name
8
+ * under this SAME convention — the node YOU run reads ABX_REMOTE_SELF_URL/_TOKEN
9
+ * with zero special-casing below. A managed provider's per-account API key lives
10
+ * under its own name — and deliberately NEVER falls back to ABX_REMOTE_SELF_TOKEN,
11
+ * so your node-admin secret can't silently go to a third party.
12
+ * `abx` is the built-in first-party name: https://services.abx.io plus
13
+ * ABX_SERVICES_API_KEY. It needs no URL pasted into project configuration.
14
+ * --remote <url> an ad-hoc URL — token from --remote-token or ABX_REMOTE_SELF_TOKEN (the local
15
+ * client credential for a node you run; `abx deploy-resolver` generates it).
12
16
  * --remote bare: the self-host default — ABX_PUBLIC_BASE_URL (the URL baked on-chain,
13
- * else ABX_RESOLVER_URL) + ABX_RESOLVER_ADMIN_TOKEN. Unchanged from day one.
17
+ * else ABX_RESOLVER_URL) + ABX_REMOTE_SELF_TOKEN.
14
18
  *
15
19
  * Every token here authorizes indexing/metadata control only — never on-chain signing — so the
16
20
  * "no signing key on the host" rule is intact. (`--remote-token`, not `--token`: `--token` already
17
21
  * means a token ID across the owner ops.)
22
+ *
23
+ * The RESOLVER's own env var — what gates ITS control plane, server-side (packages/token-api/src/
24
+ * control-plane.ts) — is unchanged: still `ABX_RESOLVER_ADMIN_TOKEN`. Only the CLIENT-side lookup
25
+ * for a self-run node moved to the named-remote grammar above; `abx deploy-resolver` prints the exact
26
+ * command that carries the value across the name boundary (fly secrets set ABX_RESOLVER_ADMIN_TOKEN
27
+ * from your local ABX_REMOTE_SELF_TOKEN).
18
28
  */
19
- import { AbxServiceClient, AbxServiceError, envSuffix } from '@artblocks/abx-sdk';
29
+ import { AbxIndexTimeoutError, AbxServiceClient, AbxServiceError, CONTROL_PLANE_INTERFACE, envSuffix, indexProgress, isAccepted, } from '@artblocks/abx-sdk';
30
+ import { CHAIN } from './config.js';
31
+ import { bold, c, dim, g, info, ok, warn } from './output.js';
32
+ export const ABX_SERVICES_URL = 'https://services.abx.io';
33
+ export const ABX_SERVICES_API_KEY_VAR = 'ABX_SERVICES_API_KEY';
34
+ /** How to refer to the credential this target is using, in an error the creator has to act on. */
35
+ export function tokenSourceLabel(t) {
36
+ return t.tokenFrom === 'flag' ? 'the token you passed with --remote-token' : t.tokenVar;
37
+ }
20
38
  /**
21
39
  * Resolve the `--remote` flag value (undefined = local op → null). Pure: pass `env` in tests.
22
40
  * `tokenFlag` is `--remote-token` and wins over any env token for this invocation.
@@ -31,11 +49,24 @@ export function resolveRemote(spec, tokenFlag, env = process.env) {
31
49
  if (!base) {
32
50
  throw new Error('`--remote` needs a target: pass `--remote <name>` (ABX_REMOTE_<NAME>_URL in .env), `--remote https://host`, or set ABX_PUBLIC_BASE_URL in .env');
33
51
  }
34
- return { url: strip(base), token: tokenFlag ?? env.ABX_RESOLVER_ADMIN_TOKEN, source: 'default', tokenVar: 'ABX_RESOLVER_ADMIN_TOKEN' };
52
+ return { url: strip(base), token: tokenFlag ?? env.ABX_REMOTE_SELF_TOKEN, source: 'default', tokenVar: 'ABX_REMOTE_SELF_TOKEN', tokenFrom: tokenFlag ? 'flag' : 'env' };
35
53
  }
36
54
  // `--remote <url>` — ad-hoc URL, self-host credential conventions
37
55
  if (spec.includes('://')) {
38
- return { url: strip(spec), token: tokenFlag ?? env.ABX_RESOLVER_ADMIN_TOKEN, source: 'url', tokenVar: 'ABX_RESOLVER_ADMIN_TOKEN' };
56
+ return { url: strip(spec), token: tokenFlag ?? env.ABX_REMOTE_SELF_TOKEN, source: 'url', tokenVar: 'ABX_REMOTE_SELF_TOKEN', tokenFrom: tokenFlag ? 'flag' : 'env' };
57
+ }
58
+ // The first-party provider has a stable, verified identity. Keep it out of standing agent docs
59
+ // and generic URL config: a user stores only the credential, while an explicit URL remains the
60
+ // escape hatch for local/staging services.
61
+ if (envSuffix(spec) === 'ABX') {
62
+ return {
63
+ url: ABX_SERVICES_URL,
64
+ token: tokenFlag ?? env[ABX_SERVICES_API_KEY_VAR],
65
+ name: 'ABX',
66
+ source: 'builtin',
67
+ tokenVar: ABX_SERVICES_API_KEY_VAR,
68
+ tokenFrom: tokenFlag ? 'flag' : 'env',
69
+ };
39
70
  }
40
71
  // `--remote <name>` — a named remote (a managed provider, another node of yours, a staging box)
41
72
  const name = envSuffix(spec);
@@ -46,13 +77,32 @@ export function resolveRemote(spec, tokenFlag, env = process.env) {
46
77
  throw new Error(`--remote ${spec}: no ${urlVar} in your .env. Set ${urlVar}=<the provider's base URL> (+ ${tokenVar}=<your API key>). ` +
47
78
  `(Meant a URL? Pass a scheme: --remote https://host)`);
48
79
  }
49
- return { url: strip(url), token: tokenFlag ?? env[tokenVar], name, source: 'named', tokenVar };
80
+ return { url: strip(url), token: tokenFlag ?? env[tokenVar], name, source: 'named', tokenVar, tokenFrom: tokenFlag ? 'flag' : 'env' };
81
+ }
82
+ /**
83
+ * The OLD client-side var (`ABX_RESOLVER_ADMIN_TOKEN`) sitting unused in `.env` because the
84
+ * self-host default's credential moved to the named-remote grammar (`ABX_REMOTE_SELF_TOKEN`) — a
85
+ * silent fallback would mean an operator's `.env` never gets renamed, so this is the ONE place both
86
+ * {@link requireRemoteToken} (the hard-stop for a real command) and `abx doctor` (the same fault,
87
+ * surfaced before a command needs it) decide whether to flag it — sharing the check means they can
88
+ * never drift on the condition. `null` when there's nothing to flag (old var absent, or the new one
89
+ * is already set and simply wins).
90
+ */
91
+ export function selfTokenMigrationWarning(env = process.env) {
92
+ if (!env.ABX_RESOLVER_ADMIN_TOKEN || env.ABX_REMOTE_SELF_TOKEN)
93
+ return null;
94
+ return ('ABX_RESOLVER_ADMIN_TOKEN is set but is no longer read for the self-host default — rename it to ' +
95
+ 'ABX_REMOTE_SELF_TOKEN (and, if you address it by name, ABX_REMOTE_SELF_URL).');
50
96
  }
51
97
  /** The token, when the remote is the command's OBJECT (add/index/forget/render/migrate-dest) —
52
98
  * a missing credential is a hard stop that names the exact var to set. */
53
99
  export function requireRemoteToken(t, env = process.env) {
54
100
  if (t.token)
55
101
  return t.token;
102
+ if (t.source === 'builtin') {
103
+ throw new Error(`remote 'abx' needs ${ABX_SERVICES_API_KEY_VAR} in your private .env, or --remote-token. ` +
104
+ `Run \`abx auth login\` for the browser-approved flow (manual fallback: ${ABX_SERVICES_URL}/signup).`);
105
+ }
56
106
  if (t.source === 'named') {
57
107
  // The likeliest cause of "URL but no token" is a near-miss var name, and the value is sitting
58
108
  // right there in .env — so name it instead of letting them diff strings by eye.
@@ -60,17 +110,27 @@ export function requireRemoteToken(t, env = process.env) {
60
110
  throw new Error(`remote '${t.name}' has a URL but no token — set ${t.tokenVar} in your .env (the API key the provider issued), or pass --remote-token.` +
61
111
  (nearMiss ? `\n Found ${nearMiss.key} in your env — that name isn't read; rename it to ${t.tokenVar}.` : ''));
62
112
  }
113
+ // The self-host default/URL lane used to read ABX_RESOLVER_ADMIN_TOKEN directly. It's now just
114
+ // the named remote called "self" — no special-casing, same grammar as any other name — so the OLD
115
+ // var is never read here. No silent fallback: point at both new vars, once, by name.
116
+ const migration = selfTokenMigrationWarning(env);
117
+ if (migration)
118
+ throw new Error(`${migration} Or pass --remote-token.`);
63
119
  throw new Error(`remote ops need ${t.tokenVar} in your .env — it must match the token set on the resolver ` +
64
120
  '(`abx deploy-resolver` generates one and wires both sides). Or pass --remote-token.');
65
121
  }
66
122
  /** Every named remote configured in the env (`ABX_REMOTE_<NAME>_URL`). The normalized name is
67
123
  * canonical — the env convention is lossy, so enumeration reads the env, never inverts it. */
68
124
  export function listConfiguredRemotes(env = process.env) {
69
- const out = [];
125
+ const out = [
126
+ { name: 'ABX', url: ABX_SERVICES_URL, hasToken: !!env[ABX_SERVICES_API_KEY_VAR] },
127
+ ];
70
128
  for (const [key, value] of Object.entries(env)) {
71
129
  const m = /^ABX_REMOTE_(.+)_URL$/.exec(key);
72
130
  if (!m || !value)
73
131
  continue;
132
+ if (m[1] === 'ABX')
133
+ continue;
74
134
  out.push({ name: m[1], url: value.replace(/\/+$/, ''), hasToken: !!env[`ABX_REMOTE_${m[1]}_TOKEN`] });
75
135
  }
76
136
  return out.sort((a, b) => a.name.localeCompare(b.name));
@@ -99,6 +159,74 @@ export function misnamedRemoteVars(env = process.env) {
99
159
  export function serviceClient(t) {
100
160
  return new AbxServiceClient({ baseUrl: t.url, token: t.token });
101
161
  }
162
+ /** Resolve one provider interface from the catalog selected by `--remote`. */
163
+ export async function serviceInterfaceClient(t, interfaceId, descriptor) {
164
+ const catalog = serviceClient(t);
165
+ try {
166
+ return await catalog.forInterface(interfaceId, descriptor);
167
+ }
168
+ catch (err) {
169
+ // Pre-descriptor self-hosted resolvers served every route from the supplied origin. Preserve
170
+ // that compatibility only when discovery itself is absent; a catalog that answers and omits an
171
+ // interface is an intentional capability boundary and must not be guessed around.
172
+ if (!descriptor && err instanceof AbxServiceError && err.status === 404)
173
+ return catalog;
174
+ throw err;
175
+ }
176
+ }
177
+ /** The provider-neutral control-plane client used by registration, status and artifact writes. */
178
+ export async function controlPlaneClient(t, descriptor) {
179
+ return serviceInterfaceClient(t, CONTROL_PLANE_INTERFACE, descriptor);
180
+ }
181
+ /**
182
+ * Is this named remote's stored credential actually accepted? One cheap authed read, so `doctor` can
183
+ * report capability instead of mere presence.
184
+ *
185
+ * Doctor is the command a creator runs FIRST, and it used to print a clean `remotes: meridian` for a
186
+ * key the service rejects — the 401 only surfaced later, from `abx remote <name>`, after they had
187
+ * already trusted the line. Same class as an RPC that answers `[]` because it pruned its logs: an
188
+ * empty success is not evidence of capability.
189
+ *
190
+ * Never throws and never blocks doctor for long: a short per-attempt timeout, and anything that is
191
+ * not a definitive rejection is reported as a soft note rather than a ✗, because a slow or briefly
192
+ * unreachable provider is not a misconfiguration the creator can act on.
193
+ */
194
+ export async function probeRemoteCredential(name, timeoutMs = 4000) {
195
+ const target = resolveRemote(name);
196
+ if (!target)
197
+ return { ok: false, fatal: false, detail: '(unresolved)' };
198
+ try {
199
+ // retryDelayMs 0: a 401 is definitive and never retries anyway, but an unreachable provider
200
+ // would otherwise back off across four attempts and stall the one command that must stay quick.
201
+ const catalog = new AbxServiceClient({ baseUrl: target.url, token: target.token, timeoutMs, retryDelayMs: 0 });
202
+ let client;
203
+ try {
204
+ client = await catalog.forInterface(CONTROL_PLANE_INTERFACE);
205
+ }
206
+ catch (err) {
207
+ if (!(err instanceof AbxServiceError && err.status === 404))
208
+ throw err;
209
+ client = catalog;
210
+ }
211
+ const projects = await client.listProjects();
212
+ return { ok: true, fatal: false, detail: `· ${projects.length} project(s) visible` };
213
+ }
214
+ catch (err) {
215
+ if (err instanceof AbxServiceError && err.status === 401) {
216
+ return { ok: false, fatal: true, detail: `token rejected (401) — fix or rotate ${tokenVarFor(name)}` };
217
+ }
218
+ if (err instanceof AbxServiceError && err.status === 403) {
219
+ return { ok: false, fatal: false, detail: '(authorized key, scoped by the provider — not a misconfiguration)' };
220
+ }
221
+ return { ok: false, fatal: false, detail: `(unreachable right now: ${err.message.slice(0, 60)})` };
222
+ }
223
+ }
224
+ /** The env var a named remote's token is read from — the one to name when it is rejected. */
225
+ export function tokenVarFor(name) {
226
+ if (name.toUpperCase() === 'ABX')
227
+ return ABX_SERVICES_API_KEY_VAR;
228
+ return `ABX_REMOTE_${name.toUpperCase()}_TOKEN`;
229
+ }
102
230
  /**
103
231
  * Map a control-plane failure to an actionable CLI error. Keys off `AbxServiceError.code`/status,
104
232
  * never off message prose (the machine-code half of the interface spec):
@@ -117,16 +245,27 @@ export function describeRemoteError(err, t, label) {
117
245
  ? ' (bare `--remote` uses ABX_PUBLIC_BASE_URL, else ABX_RESOLVER_URL)'
118
246
  : t.source === 'named'
119
247
  ? ` (from ABX_REMOTE_${t.name}_URL)`
120
- : '';
248
+ : t.source === 'builtin'
249
+ ? ' (built-in first-party ABX Services target)'
250
+ : '';
121
251
  return new Error(`${label}: nothing responded at ${t.url}${from}. Is it running, and is that the right address?`);
122
252
  }
123
253
  if (err.status === 401) {
124
- return new Error(`${label}: 401 unauthorized — ${t.url} rejected the token from ${t.tokenVar}. Fix or rotate the key (or pass --remote-token).`);
254
+ return new Error(`${label}: 401 unauthorized — ${t.url} rejected ${tokenSourceLabel(t)}. ` +
255
+ (t.tokenFrom === 'flag'
256
+ ? `That value is wrong or stale — get a fresh key from the provider (${t.tokenVar} in .env is what a normal run reads).`
257
+ : 'Fix or rotate the key (or pass --remote-token to test a replacement).'));
125
258
  }
126
259
  if (err.status === 403) {
127
260
  return new Error(`${label}: 403 forbidden — the token is valid but not authorized for this project/chain (provider-side scoping, not a typo). ` +
128
261
  `Check the provider's dashboard and its descriptor (\`abx remote ${t.name ?? t.url}\`).`);
129
262
  }
263
+ if (err.code === 'not_registered') {
264
+ // The likeliest cause when READING a remote (status/index/render) is that the bridge step was
265
+ // never done — the service has no idea this contract exists. Name the fix, not the 404.
266
+ return new Error(`${label}: ${t.url} doesn't have this project registered — it can't serve or report on a contract it was never told about. ` +
267
+ `Register it: \`abx add <address> --remote ${t.name?.toLowerCase() ?? t.url}\`.`);
268
+ }
130
269
  if (err.code === 'disabled') {
131
270
  return new Error(`${label}: the resolver at ${t.url} has no control-plane token configured — it can't accept remote registrations. For your own node, set ABX_RESOLVER_ADMIN_TOKEN on it (\`abx deploy-resolver\` wires it).`);
132
271
  }
@@ -134,6 +273,224 @@ export function describeRemoteError(err, t, label) {
134
273
  return new Error(`${label}: ${t.url} has no /v1 control plane — an older resolver (redeploy it: \`abx deploy-resolver\`), or not an ABX service. ` +
135
274
  `Check: curl ${t.url}/.well-known/abx-service`);
136
275
  }
276
+ // A 5xx that volunteered a failure CLASS is the difference between "wait" and "something is
277
+ // broken" — and it's the only thing a credential-free 500 body is allowed to tell us, so use it.
278
+ if (err.class === 'rpc_rate_limited' || err.class === 'rpc_unavailable') {
279
+ return new Error(`${label}: the service reached its chain RPC ${err.class === 'rpc_rate_limited' ? 'rate limit' : 'and got no answer'} (${err.class}) — ` +
280
+ `not your credential and not your address. It retries with backoff; check progress with \`abx status <address> --remote ${t.name?.toLowerCase() ?? t.url}\`.`);
281
+ }
137
282
  return new Error(`${label}: ${err.message}`);
138
283
  }
284
+ // The `--remote <name|url>` target (remote.ts owns the convention): a named remote's
285
+ // `ABX_REMOTE_<NAME>_URL/_TOKEN`, an ad-hoc URL, or bare `--remote` = the self-host default.
286
+ // Returns null for a local op (the default).
287
+ export function remoteFlag(flags) {
288
+ return resolveRemote(flags.remote, flags['remote-token']);
289
+ }
290
+ /**
291
+ * The factory-verification tri-state, said plainly. `null` means the check never ran (no factory
292
+ * configured, or the configured one has no code on this chain — common on a local/dev chain), which
293
+ * is NOT the same as the chain telling us this contract isn't a clone of it.
294
+ */
295
+ export function canonicalLabel(isCanonical, provenance) {
296
+ if (isCanonical === true) {
297
+ // Say WHICH generation stamped it, and its core version — "canonically ABX v3" is a thing a
298
+ // consumer can repeat, and `abxVersion()` on the clone is where they can verify it themselves.
299
+ const v = provenance?.coreVersion !== null && provenance?.coreVersion !== undefined ? ` — ABX v${provenance.coreVersion}` : '';
300
+ if (provenance?.generation === 'prior') {
301
+ return `${g('yes (factory-verified)')}${dim(`${v}, a PRIOR anchor generation — canonically ABX, deployed by a factory since replaced`)}`;
302
+ }
303
+ return g(`yes (factory-verified${v})`);
304
+ }
305
+ // "the configured factory" (singular) understated the check and misdirected the reader: since the
306
+ // edition anchors were added, `detectCanonicalFactory` probes ALL SIX trust anchors (three 721 +
307
+ // three ERC-1155) and only falls back to the 1/1 anchor when none of them claim the clone. So a
308
+ // `false` means "no trust anchor this CLI knows deployed this", not "you configured the wrong one" —
309
+ // and the usual real cause is a contract from a SUPERSEDED factory, or one deployed by hand.
310
+ if (isCanonical === false) {
311
+ return `${c.orange}NO — not a clone of any trust anchor this CLI knows${c.reset}${dim(' (a superseded factory, or deployed outside one — `abx doctor` lists the current anchors)')}`;
312
+ }
313
+ if (provenance && provenance.anchorsAnswered === 0) {
314
+ return dim('not checked (no anchor answered — a coverage gap, not a verdict; retry or check the RPC)');
315
+ }
316
+ return dim('not checked (no canonical factory for this chain — `abx doctor` shows which)');
317
+ }
318
+ /** How a lifecycle state reads at a glance — the same word everywhere it's printed. */
319
+ export function statusLabel(s) {
320
+ if (s === 'live')
321
+ return g('live');
322
+ if (s === 'failed')
323
+ return `${c.orange}failed${c.reset}`;
324
+ if (s === 'stale')
325
+ return `${c.orange}stale${c.reset}`;
326
+ return dim(s); // queued | backfilling — in progress, not a problem
327
+ }
328
+ /** `label value` with only the label dimmed — status values carry their own color, and wrapping
329
+ * them in `info()` would fight it. */
330
+ export const statusRow = (label, value) => console.log(` ${dim(label.padEnd(10))} ${value}`);
331
+ /**
332
+ * What to DO about a failure class — whose problem it is and whether waiting is the answer.
333
+ * The class alone told an agent enough to reason it out; it does not tell a creator, and "whose
334
+ * problem is this" is the single question a failed catch-up has to answer.
335
+ */
336
+ export function indexErrorAction(cls) {
337
+ if (cls === 'rpc_rate_limited')
338
+ return "the SERVICE's chain RPC is throttled — not your key, address, or chain. It retries on its own; if it stays this way, that's the operator's to fix.";
339
+ if (cls === 'rpc_unavailable')
340
+ return "the SERVICE can't reach its chain RPC — not your key, address, or chain. It retries on its own; if it stays this way, contact the operator.";
341
+ if (cls === 'not_abx_contract')
342
+ return 'the service found no ABX events at that address on this chain — check the address and that the service serves the right chain.';
343
+ return 'the cause is in the service operator’s logs — nothing you can fix from here; contact them if it persists.';
344
+ }
345
+ /** The one wording for "registered, but catch-up failed" — shared by add/index so both say the same
346
+ * thing: what failed, whose problem it is, and that the registration survived. */
347
+ export function failedCatchUpMessage(address, remote, err, check) {
348
+ const cls = err?.class;
349
+ return (`${address} is registered on ${remote.url}, but its catch-up FAILED` +
350
+ `${cls ? ` (${cls}${err?.message ? `: ${err.message}` : ''})` : ''}.\n` +
351
+ ` ${cls ? `→ ${indexErrorAction(cls)}\n ` : ''}` +
352
+ `The registration is durable and the service retries with backoff — watch it with ${bold(check + ' --watch')}.`);
353
+ }
354
+ /**
355
+ * One human line for a status read: where it is, how far along, and why if it's unhappy.
356
+ *
357
+ * What "where" means depends on the state, so say the right thing rather than one number that reads
358
+ * differently in each: a percentage is only honest while BACKFILLING (see indexProgress). A `live`
359
+ * project's `toBlock` only advances when that project has events, so on a busy chain a perfectly
360
+ * current project sits far below head — printing that as a ratio makes healthy look broken.
361
+ */
362
+ export function statusLine(s) {
363
+ const p = indexProgress(s);
364
+ let where;
365
+ if (p)
366
+ where = `${s.toBlock}/${s.headBlock} ${dim(`(${p.percent}%)`)}`;
367
+ else if (!s.toBlock)
368
+ where = dim('not indexed yet');
369
+ else if (s.status === 'live')
370
+ where = `${g('caught up')} ${dim(`· scanned through block ${s.toBlock}`)}`;
371
+ else if (s.status === 'stale')
372
+ where = `${dim('not tracking head right now')} ${dim(`· scanned through block ${s.toBlock}${s.headBlock ? ` of ${s.headBlock}` : ''}`)}`;
373
+ else
374
+ where = dim(`scanned through block ${s.toBlock}`);
375
+ const why = s.error ? ` ${c.orange}${s.error.class}${c.reset}${s.error.message ? dim(` — ${s.error.message}`) : ''}` : '';
376
+ return `${statusLabel(s.status)} ${where}${why}`;
377
+ }
378
+ /**
379
+ * Report a register/reindex answer, whichever of the two conformant shapes the service used.
380
+ *
381
+ * A `200` already carries the counts. A `202` means the registration is durable and catch-up is still
382
+ * running — so by default we poll to a terminal state and print the SAME summary line, giving the
383
+ * human the "waits, then tells you what happened" UX without the service holding a socket open for
384
+ * minutes. `--no-wait` stops at the 202 and names the command that checks later.
385
+ */
386
+ export async function reportRemoteIndexing(remote, chainId, address, r, flags, verb, client) {
387
+ const control = client ?? (await controlPlaneClient(remote));
388
+ // A real ABX clone ALWAYS emits a spine (its extension registrations at minimum), so a caught-up
389
+ // projection with zero events means the service scanned the wrong chain/floor or its RPC hasn't
390
+ // served the logs — not that the project is empty. A ✓ there is the lie that produces an empty
391
+ // dashboard (the same guard `reindexAfterDeploy` applies locally).
392
+ const settledLine = (events, tail) => {
393
+ if (events > 0)
394
+ ok(`remote resolver ${verb} ${address}: ${tail}`);
395
+ else
396
+ warn(`${address} is registered and caught up on ${remote.url}, but with ${bold('0 events')} — it will serve nothing. Check the service covers ${CHAIN} and that its RPC serves logs from the deploy block.`);
397
+ };
398
+ if (!isAccepted(r)) {
399
+ settledLine(r.project.eventCount, `${r.project.eventCount} events ${dim(`(${r.mode}, ${r.elapsedMs}ms)`)}`);
400
+ return {
401
+ status: r.project.status ?? 'live',
402
+ completed: true,
403
+ backfilling: false,
404
+ eventCount: r.project.eventCount,
405
+ tokenCount: r.project.tokenCount,
406
+ };
407
+ }
408
+ const spec = remote.name ? remote.name.toLowerCase() : remote.source === 'default' ? '' : remote.url;
409
+ const check = `abx status ${address} --remote${spec ? ` ${spec}` : ''}`;
410
+ // The registration is durable in EVERY branch here — but don't claim it "is catching up" when the
411
+ // service already told us the catch-up failed. Two different sentences for two different facts.
412
+ if (r.project.status === 'failed') {
413
+ // Lead with the outcome, not the successful sub-step: a line starting "registered on …" reads
414
+ // as success even with the failure later in the sentence.
415
+ warn(`${bold('catch-up FAILED')} on ${remote.url} — nothing is being served yet ${dim('(the registration itself is durable; the service retries it)')}`);
416
+ }
417
+ else {
418
+ info(`registered — ${r.project.status} ${dim('(the service accepted it and is catching up; the registration is durable)')}`);
419
+ }
420
+ // A known failure is not something to "not wait" for — we already have the answer, so report it as
421
+ // one regardless of --no-wait (never a ✓ over a broken index).
422
+ if (flags['no-wait'] !== undefined && r.project.status !== 'failed') {
423
+ info(`not waiting (--no-wait). Check with ${bold(check)}`);
424
+ return {
425
+ status: r.project.status,
426
+ completed: false,
427
+ backfilling: r.project.status === 'queued' || r.project.status === 'backfilling',
428
+ };
429
+ }
430
+ const label = `remote ${verb === 'indexed' ? 'add' : 'index'}`;
431
+ if (r.project.status === 'failed') {
432
+ // Fetch the class the register response may not have carried, so the "whose problem" line is
433
+ // never missing on the path that reports the failure soonest.
434
+ const st = await control.projectStatus(chainId, address).catch(() => undefined);
435
+ throw new Error(`${label}: ${failedCatchUpMessage(address, remote, st?.error ?? undefined, check)}`);
436
+ }
437
+ let shown = -100;
438
+ let lastStatus;
439
+ try {
440
+ const final = await control.awaitIndexed(chainId, address, {
441
+ onProgress: (s) => {
442
+ const p = indexProgress(s);
443
+ // Print on a state change or a meaningful step — a poll line every 3s is noise in a log an
444
+ // agent has to read back.
445
+ if (s.status !== lastStatus || (p && p.percent - shown >= 10)) {
446
+ lastStatus = s.status;
447
+ if (p)
448
+ shown = p.percent;
449
+ console.log(` ${statusLine(s)}`);
450
+ }
451
+ },
452
+ });
453
+ if (final.status === 'failed') {
454
+ throw new Error(`${label}: ${failedCatchUpMessage(address, remote, final.error, check)}`);
455
+ }
456
+ settledLine(final.eventCount, `${final.eventCount} events, ${final.tokenCount} token(s) ${dim('(live)')}`);
457
+ return {
458
+ status: final.status,
459
+ completed: final.status === 'live',
460
+ backfilling: final.status === 'backfilling',
461
+ eventCount: final.eventCount,
462
+ tokenCount: final.tokenCount,
463
+ };
464
+ }
465
+ catch (err) {
466
+ if (err instanceof AbxIndexTimeoutError) {
467
+ warn(`${address} is still ${err.last?.status ?? 'catching up'} on ${remote.url} — nothing is lost, it just isn't done.`);
468
+ info(`follow it with ${bold(check + ' --watch')}`);
469
+ const status = err.last?.status ?? r.project.status;
470
+ return {
471
+ status,
472
+ completed: false,
473
+ backfilling: status === 'queued' || status === 'backfilling',
474
+ eventCount: err.last?.eventCount,
475
+ tokenCount: err.last?.tokenCount,
476
+ };
477
+ }
478
+ // The service went away mid-wait (or rejected the poll). The registration still landed — say
479
+ // which failure this is, in the same words every other remote command uses.
480
+ if (err instanceof AbxServiceError)
481
+ throw describeRemoteError(err, remote, `remote ${verb}: registered, but polling status`);
482
+ throw err;
483
+ }
484
+ }
485
+ /** "3 live, 1 backfilling, 1 failed (rpc_rate_limited)" — the one-line answer to "is my stuff ok?" */
486
+ export function rollUp(projects) {
487
+ const counts = new Map();
488
+ for (const p of projects) {
489
+ const k = p.status ?? 'unknown';
490
+ counts.set(k, (counts.get(k) ?? 0) + 1);
491
+ }
492
+ const classes = [...new Set(projects.filter((p) => p.error).map((p) => p.error.class))];
493
+ const parts = [...counts.entries()].map(([k, n]) => `${n} ${k}`);
494
+ return `${parts.join(', ')}${classes.length ? ` ${dim(`(${classes.join(', ')})`)}` : ''}`;
495
+ }
139
496
  //# sourceMappingURL=remote.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * The CLI's one risk gate for a write — the choke point every signing path (owner-op or deploy)
3
+ * routes an already-prepared tx through, so `--dry-run` and `--confirm` behave IDENTICALLY no
4
+ * matter which command reached them.
5
+ *
6
+ * Before this module existed, the same three-part shape (preview-and-stop under `--dry-run` →
7
+ * optional interactive `--confirm` → pick a lane → sign) was hand-written THREE times: ownerops.ts's
8
+ * `runWrite` (every owner-op), a near-identical `runMinterWrite` ("the minter path does not go
9
+ * through runWrite, so it needs its OWN dry-run guard" — its own comment conceding the duplication),
10
+ * and a third copy inline in main.ts's `deploy-code --resume` send path. Each could drift from the
11
+ * others without anyone deciding it should — and the two owner-op copies HAD already drifted: only
12
+ * one of them printed the `owner` line on a dry-run preview when the caller supplied one.
13
+ *
14
+ * `gatedSend` is the merge. Callers that had NO `--confirm` support (every owner-op) gain it for
15
+ * free just by routing through here — there is no owner-op-specific reason they lacked it; it was
16
+ * simply never wired.
17
+ */
18
+ import { type PublicClient } from 'viem';
19
+ import { type Address } from '@artblocks/abx-sdk';
20
+ import { type Lane, type SignResult, type TxProvider } from './signer.js';
21
+ import { type Flags } from './flags.js';
22
+ /** Resolve the signing lane from flags: `--unsigned` (cold) · `--sign` (wallet) · `--sponsor`
23
+ * (ABX creator wallet) · default hot. The one place every write makes this decision. */
24
+ export declare function laneFromFlags(flags: Flags): Lane;
25
+ /**
26
+ * Refuse a real deploy on the HOT lane when there is no key to sign with — before the command has
27
+ * spent anything.
28
+ *
29
+ * The signing lanes are checked at *signing* time, which is the end of a deploy. Everything that
30
+ * makes a deploy possible happens first, and some of it is neither free nor reversible: `--backend
31
+ * arweave|ipfs|cloud` UPLOADS the creator's art before any transaction is prepared. So a deploy run
32
+ * with no key, and no `--dry-run` to say "preview only", would mint an Arweave identity, publish the
33
+ * art, and only THEN discover it could never have deployed. Under Turbo's free tier the upload
34
+ * *succeeds*, so the art is published permanently — an irreversible side effect from a run that was
35
+ * always going to fail.
36
+ *
37
+ * `--dry-run` guards every signing choke point (`isDryRun`, `gatedSend`); this is the same idea one
38
+ * step earlier, and the rule it enforces is the sibling of that one: **a spend or a publish never
39
+ * precedes the check that this run can be signed at all.** Only the hot lane is checked — `--sign`
40
+ * (browser wallet) and `--unsigned` (offline signer) deliberately have no local key, and a preview
41
+ * spends nothing.
42
+ */
43
+ export declare function assertLaneCanSign(flags: Flags): void;
44
+ /**
45
+ * Opt-in pre-send confirmation gate (`--confirm`). OFF by default → scripted use is untouched. Even
46
+ * when opted in, it never blocks automation: `--yes` or a non-TTY stdin proceeds silently. Only an
47
+ * interactive `--confirm` prints the summary and waits for a y/N. Aborts on anything but yes.
48
+ */
49
+ export declare function confirmSend(summary: string, flags: Flags): Promise<void>;
50
+ export interface DryRunSimulation {
51
+ /** Three honest states, never collapsed into one another: `would-succeed` is earned (state check
52
+ * passed AND the signer can afford it), `would-revert` is a proven failure (a state revert OR an
53
+ * insufficient-funds shortfall — see `reason`), and `unknown` means neither could be established —
54
+ * it is NOT a synonym for "probably fine" and must never be reported as `would-succeed`. */
55
+ status: 'would-succeed' | 'would-revert' | 'unknown';
56
+ reason?: string;
57
+ /** The gas the REAL send would use, from the same {@link pinGas} `makeHotSender` calls at send
58
+ * time — never `transaction.gasFloor` (a proven MINIMUM used to detect an implausible estimate,
59
+ * not a prediction of what the send needs; see `pinGas`'s own doc in execute.ts). Present only
60
+ * when a real estimate was obtained. Decimal string — a `bigint` doesn't survive `JSON.stringify`. */
61
+ estimatedGas?: string;
62
+ /** `estimatedGas × current gas price`, plus the tx's own value if any — in wei, decimal string. */
63
+ estimatedCostWei?: string;
64
+ /** The signer's current balance, in wei, decimal string — present whenever a balance read was
65
+ * attempted, so the numbers behind an insufficient-funds verdict are visible even to a caller
66
+ * that only reads the JSON. */
67
+ balanceWei?: string;
68
+ }
69
+ /**
70
+ * A revert's own name, when the payload carries one — `RoyaltyTooHigh()` instead of a raw hex dump
71
+ * or "reverted for an unknown reason".
72
+ *
73
+ * Whether we get one is the NODE's choice, not ours: many public endpoints (measured:
74
+ * `base-sepolia-rpc.publicnode.com` and `sepolia.base.org`) answer a failed `eth_call` with a bare
75
+ * `execution reverted` and no data at all. So the no-data case says *that*, rather than implying we
76
+ * looked at a reason and couldn't read it.
77
+ */
78
+ export declare function revertReason(err: unknown): string;
79
+ export interface GatedSendOptions {
80
+ chainKey: string;
81
+ /** The address that must sign (onlyOwner / token holder) — shown to the human, guards the hot
82
+ * lane, and (when set) printed on the dry-run preview. */
83
+ expectedSigner?: Address;
84
+ /** Test-only seam: a pre-built client for the dry-run simulation, instead of one `simulateDryRun`
85
+ * would otherwise construct from `chainKey`. Every production caller omits this. */
86
+ client?: PublicClient;
87
+ }
88
+ /** Resolve the signer a preview should simulate from the same source the hot send will use.
89
+ * Explicit owner/buyer pinning always wins; wallet and cold lanes cannot be inferred locally. */
90
+ export declare function previewSigner(flags: Flags, explicit?: Address, signingKey?: `0x${string}` | undefined): Address | undefined;
91
+ /**
92
+ * The one send choke point for a SINGLE already-prepared write: `--dry-run` preview (nothing sent,
93
+ * returns `null`) → optional `--confirm` prompt → lane selection → `signTx`. Every caller — an
94
+ * owner-op's `runWrite`/`runMinterWrite`, or the deploy family's resumed-setup send — resolves to
95
+ * this, so the two families can never again each carry their own (possibly diverging) idea of what
96
+ * `--dry-run` or `--confirm` means. The historical bug class this forecloses structurally: a write
97
+ * reaching the send lane under `--dry-run` because some caller re-derived the check by hand and
98
+ * missed a branch.
99
+ */
100
+ export declare function gatedSend(provider: TxProvider, flags: Flags, opts: GatedSendOptions): Promise<SignResult | null>;
101
+ //# sourceMappingURL=riskgate.d.ts.map