@artblocks/abx-cli 0.1.0-alpha.4 → 0.1.0-alpha.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +161 -0
- package/assets/renderer-scaffold/README.md +41 -11
- package/assets/renderer-scaffold/foundry.toml +5 -0
- package/assets/renderer-scaffold/remappings.txt +1 -1
- package/assets/renderer-scaffold/script/DeployHooks.s.sol +24 -0
- package/assets/renderer-scaffold/script/Preview.s.sol +99 -0
- package/assets/renderer-scaffold/src/MyHooks.sol +20 -0
- package/assets/renderer-scaffold/src/MyRenderer.sol +4 -4
- package/assets/renderer-scaffold/src/MyTraits.sol +2 -2
- package/assets/renderer-scaffold/test/MyRenderer.t.sol +60 -3
- package/dist/bin.d.ts +26 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +63 -0
- package/dist/bin.js.map +1 -0
- package/dist/capabilities.d.ts +99 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +144 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/commands/auth.d.ts +54 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +447 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/deploy.d.ts +242 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +5429 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/feedback.d.ts +7 -0
- package/dist/commands/feedback.d.ts.map +1 -0
- package/dist/commands/feedback.js +147 -0
- package/dist/commands/feedback.js.map +1 -0
- package/dist/commands/maintenance.d.ts +4 -0
- package/dist/commands/maintenance.d.ts.map +1 -0
- package/dist/commands/maintenance.js +114 -0
- package/dist/commands/maintenance.js.map +1 -0
- package/dist/commands/project.d.ts +429 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +1720 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/reads.d.ts +85 -0
- package/dist/commands/reads.d.ts.map +1 -0
- package/dist/commands/reads.js +868 -0
- package/dist/commands/reads.js.map +1 -0
- package/dist/commands/scaffold.d.ts +89 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +738 -0
- package/dist/commands/scaffold.js.map +1 -0
- package/dist/commands/service.d.ts +67 -0
- package/dist/commands/service.d.ts.map +1 -0
- package/dist/commands/service.js +748 -0
- package/dist/commands/service.js.map +1 -0
- package/dist/commands/storage.d.ts +51 -0
- package/dist/commands/storage.d.ts.map +1 -0
- package/dist/commands/storage.js +399 -0
- package/dist/commands/storage.js.map +1 -0
- package/dist/commands/submit-app.d.ts +102 -0
- package/dist/commands/submit-app.d.ts.map +1 -0
- package/dist/commands/submit-app.js +622 -0
- package/dist/commands/submit-app.js.map +1 -0
- package/dist/config.d.ts +105 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +351 -12
- package/dist/config.js.map +1 -1
- package/dist/conformance.d.ts +31 -0
- package/dist/conformance.d.ts.map +1 -0
- package/dist/conformance.js +390 -0
- package/dist/conformance.js.map +1 -0
- package/dist/contract-read-error.d.ts +5 -0
- package/dist/contract-read-error.d.ts.map +1 -0
- package/dist/contract-read-error.js +37 -0
- package/dist/contract-read-error.js.map +1 -0
- package/dist/deploy-plan.d.ts +150 -0
- package/dist/deploy-plan.d.ts.map +1 -0
- package/dist/deploy-plan.js +31 -0
- package/dist/deploy-plan.js.map +1 -0
- package/dist/deps.d.ts +6 -39
- package/dist/deps.d.ts.map +1 -1
- package/dist/deps.js +4 -68
- package/dist/deps.js.map +1 -1
- package/dist/errors.d.ts +20 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +25 -0
- package/dist/errors.js.map +1 -0
- package/dist/flag-allowlists.d.ts +53 -0
- package/dist/flag-allowlists.d.ts.map +1 -0
- package/dist/flag-allowlists.js +184 -0
- package/dist/flag-allowlists.js.map +1 -0
- package/dist/flags.d.ts +47 -0
- package/dist/flags.d.ts.map +1 -1
- package/dist/flags.js +125 -1
- package/dist/flags.js.map +1 -1
- package/dist/jsonout.d.ts +37 -0
- package/dist/jsonout.d.ts.map +1 -0
- package/dist/jsonout.js +79 -0
- package/dist/jsonout.js.map +1 -0
- package/dist/kind.d.ts +57 -0
- package/dist/kind.d.ts.map +1 -0
- package/dist/kind.js +122 -0
- package/dist/kind.js.map +1 -0
- package/dist/main.js +786 -4838
- package/dist/main.js.map +1 -1
- package/dist/mintpage.d.ts +17 -2
- package/dist/mintpage.d.ts.map +1 -1
- package/dist/mintpage.js +241 -54
- package/dist/mintpage.js.map +1 -1
- package/dist/output.d.ts +179 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +780 -0
- package/dist/output.js.map +1 -0
- package/dist/ownerops.d.ts +381 -57
- package/dist/ownerops.d.ts.map +1 -1
- package/dist/ownerops.js +2014 -359
- package/dist/ownerops.js.map +1 -1
- package/dist/preview.d.ts +23 -5
- package/dist/preview.d.ts.map +1 -1
- package/dist/preview.js +95 -43
- package/dist/preview.js.map +1 -1
- package/dist/prompt.d.ts +17 -0
- package/dist/prompt.d.ts.map +1 -0
- package/dist/prompt.js +19 -0
- package/dist/prompt.js.map +1 -0
- package/dist/provision.d.ts +3 -13
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +19 -21
- package/dist/provision.js.map +1 -1
- package/dist/remote.d.ts +157 -52
- package/dist/remote.d.ts.map +1 -1
- package/dist/remote.js +435 -46
- package/dist/remote.js.map +1 -1
- package/dist/riskgate.d.ts +62 -0
- package/dist/riskgate.d.ts.map +1 -0
- package/dist/riskgate.js +234 -0
- package/dist/riskgate.js.map +1 -0
- package/dist/scaffold.d.ts +12 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +56 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/schema.d.ts +36 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +121 -26
- package/dist/schema.js.map +1 -1
- package/dist/script-chunks.d.ts +8 -0
- package/dist/script-chunks.d.ts.map +1 -0
- package/dist/script-chunks.js +35 -0
- package/dist/script-chunks.js.map +1 -0
- package/dist/served.d.ts +30 -0
- package/dist/served.d.ts.map +1 -0
- package/dist/served.js +112 -0
- package/dist/served.js.map +1 -0
- package/dist/signer.d.ts +13 -0
- package/dist/signer.d.ts.map +1 -1
- package/dist/signer.js +84 -15
- package/dist/signer.js.map +1 -1
- package/dist/update-check.d.ts +86 -5
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +161 -20
- package/dist/update-check.js.map +1 -1
- package/package.json +13 -12
- package/skill/SKILL.md +181 -347
- package/skill/agents/openai.yaml +4 -0
- package/skill/reference/capabilities.md +188 -0
- package/skill/reference/code.md +220 -0
- package/skill/reference/creator-token.md +94 -0
- package/skill/reference/deploy.md +174 -0
- package/skill/reference/diagnose.md +178 -0
- package/skill/reference/hosting.md +186 -93
- package/skill/reference/operate.md +220 -0
- package/skill/reference/services.md +121 -0
- package/skill/reference/setup.md +154 -36
- package/assets/renderer-scaffold/src/interfaces/IAbxFieldRenderer.sol +0 -32
- package/assets/renderer-scaffold/src/interfaces/IAbxParams.sol +0 -26
- package/dist/inspect.d.ts +0 -48
- package/dist/inspect.d.ts.map +0 -1
- package/dist/inspect.js +0 -184
- package/dist/inspect.js.map +0 -1
- package/dist/migrate.d.ts +0 -65
- package/dist/migrate.d.ts.map +0 -1
- package/dist/migrate.js +0 -180
- package/dist/migrate.js.map +0 -1
- package/dist/onchain-uri.d.ts +0 -97
- package/dist/onchain-uri.d.ts.map +0 -1
- package/dist/onchain-uri.js +0 -243
- package/dist/onchain-uri.js.map +0 -1
- package/dist/upload.d.ts +0 -28
- package/dist/upload.d.ts.map +0 -1
- package/dist/upload.js +0 -41
- package/dist/upload.js.map +0 -1
- package/skill/reference/code-projects.md +0 -246
- package/skill/reference/operating.md +0 -116
- package/skill/reference/troubleshooting.md +0 -28
package/dist/remote.js
CHANGED
|
@@ -1,54 +1,443 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
* this
|
|
5
|
-
* contract you deploy here is registered with the *local* store; the resolver baked
|
|
6
|
-
* into your on-chain tokenURI is a *different* store and must be told separately, or
|
|
7
|
-
* it answers "unknown project". These helpers do the telling.
|
|
2
|
+
* Remote-resolver resolution — which service `--remote` means, and whose credential drives it.
|
|
3
|
+
* The HTTP client itself lives in the SDK (`AbxServiceClient`, speaking the /v1 control plane from
|
|
4
|
+
* site/content/docs/using-abx/remote-services.mdx); this module owns the CLI conventions around it:
|
|
8
5
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
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>). "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).
|
|
16
|
+
* --remote bare: the self-host default — ABX_PUBLIC_BASE_URL (the URL baked on-chain,
|
|
17
|
+
* else ABX_RESOLVER_URL) + ABX_REMOTE_SELF_TOKEN.
|
|
18
|
+
*
|
|
19
|
+
* Every token here authorizes indexing/metadata control only — never on-chain signing — so the
|
|
20
|
+
* "no signing key on the host" rule is intact. (`--remote-token`, not `--token`: `--token` already
|
|
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).
|
|
28
|
+
*/
|
|
29
|
+
import { AbxIndexTimeoutError, AbxServiceClient, AbxServiceError, 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
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Resolve the `--remote` flag value (undefined = local op → null). Pure: pass `env` in tests.
|
|
40
|
+
* `tokenFlag` is `--remote-token` and wins over any env token for this invocation.
|
|
41
|
+
*/
|
|
42
|
+
export function resolveRemote(spec, tokenFlag, env = process.env) {
|
|
43
|
+
if (spec === undefined)
|
|
44
|
+
return null;
|
|
45
|
+
const strip = (u) => u.replace(/\/+$/, '');
|
|
46
|
+
// bare `--remote` — the self-host default (the resolver this project's on-chain URIs point at)
|
|
47
|
+
if (spec === 'true' || spec === '') {
|
|
48
|
+
const base = env.ABX_PUBLIC_BASE_URL ?? env.ABX_RESOLVER_URL;
|
|
49
|
+
if (!base) {
|
|
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');
|
|
51
|
+
}
|
|
52
|
+
return { url: strip(base), token: tokenFlag ?? env.ABX_REMOTE_SELF_TOKEN, source: 'default', tokenVar: 'ABX_REMOTE_SELF_TOKEN', tokenFrom: tokenFlag ? 'flag' : 'env' };
|
|
53
|
+
}
|
|
54
|
+
// `--remote <url>` — ad-hoc URL, self-host credential conventions
|
|
55
|
+
if (spec.includes('://')) {
|
|
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
|
+
};
|
|
70
|
+
}
|
|
71
|
+
// `--remote <name>` — a named remote (a managed provider, another node of yours, a staging box)
|
|
72
|
+
const name = envSuffix(spec);
|
|
73
|
+
const urlVar = `ABX_REMOTE_${name}_URL`;
|
|
74
|
+
const tokenVar = `ABX_REMOTE_${name}_TOKEN`;
|
|
75
|
+
const url = env[urlVar];
|
|
76
|
+
if (!url) {
|
|
77
|
+
throw new Error(`--remote ${spec}: no ${urlVar} in your .env. Set ${urlVar}=<the provider's base URL> (+ ${tokenVar}=<your API key>). ` +
|
|
78
|
+
`(Meant a URL? Pass a scheme: --remote https://host)`);
|
|
79
|
+
}
|
|
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).');
|
|
96
|
+
}
|
|
97
|
+
/** The token, when the remote is the command's OBJECT (add/index/forget/render/migrate-dest) —
|
|
98
|
+
* a missing credential is a hard stop that names the exact var to set. */
|
|
99
|
+
export function requireRemoteToken(t, env = process.env) {
|
|
100
|
+
if (t.token)
|
|
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
|
+
}
|
|
106
|
+
if (t.source === 'named') {
|
|
107
|
+
// The likeliest cause of "URL but no token" is a near-miss var name, and the value is sitting
|
|
108
|
+
// right there in .env — so name it instead of letting them diff strings by eye.
|
|
109
|
+
const nearMiss = misnamedRemoteVars(env).find((v) => v.suggestion === t.tokenVar);
|
|
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.` +
|
|
111
|
+
(nearMiss ? `\n Found ${nearMiss.key} in your env — that name isn't read; rename it to ${t.tokenVar}.` : ''));
|
|
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.`);
|
|
119
|
+
throw new Error(`remote ops need ${t.tokenVar} in your .env — it must match the token set on the resolver ` +
|
|
120
|
+
'(`abx deploy-resolver` generates one and wires both sides). Or pass --remote-token.');
|
|
121
|
+
}
|
|
122
|
+
/** Every named remote configured in the env (`ABX_REMOTE_<NAME>_URL`). The normalized name is
|
|
123
|
+
* canonical — the env convention is lossy, so enumeration reads the env, never inverts it. */
|
|
124
|
+
export function listConfiguredRemotes(env = process.env) {
|
|
125
|
+
const out = [
|
|
126
|
+
{ name: 'ABX', url: ABX_SERVICES_URL, hasToken: !!env[ABX_SERVICES_API_KEY_VAR] },
|
|
127
|
+
];
|
|
128
|
+
for (const [key, value] of Object.entries(env)) {
|
|
129
|
+
const m = /^ABX_REMOTE_(.+)_URL$/.exec(key);
|
|
130
|
+
if (!m || !value)
|
|
131
|
+
continue;
|
|
132
|
+
if (m[1] === 'ABX')
|
|
133
|
+
continue;
|
|
134
|
+
out.push({ name: m[1], url: value.replace(/\/+$/, ''), hasToken: !!env[`ABX_REMOTE_${m[1]}_TOKEN`] });
|
|
135
|
+
}
|
|
136
|
+
return out.sort((a, b) => a.name.localeCompare(b.name));
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* `ABX_REMOTE_*` vars that follow no recognized suffix — i.e. a typo. The convention has exactly two
|
|
140
|
+
* suffixes (`_URL`, `_TOKEN`), and anything else (`_KEY`, `_APIKEY`, `_SECRET`) is silently ignored:
|
|
141
|
+
* the CLI reports "no token" while the value sits right there in `.env`. Cheap to detect, so detect
|
|
142
|
+
* it rather than leaving the creator to compare strings by eye.
|
|
143
|
+
*/
|
|
144
|
+
export function misnamedRemoteVars(env = process.env) {
|
|
145
|
+
const out = [];
|
|
146
|
+
for (const key of Object.keys(env)) {
|
|
147
|
+
if (!key.startsWith('ABX_REMOTE_') || key === 'ABX_REMOTE_TOKEN')
|
|
148
|
+
continue;
|
|
149
|
+
if (/_URL$/.test(key) || /_TOKEN$/.test(key))
|
|
150
|
+
continue;
|
|
151
|
+
// Strip a trailing credential-ish word to recover the intended remote name.
|
|
152
|
+
const name = key.replace(/^ABX_REMOTE_/, '').replace(/_(KEY|APIKEY|API_KEY|SECRET|PASS|PASSWORD|BEARER|AUTH)$/, '');
|
|
153
|
+
out.push({ key, suggestion: `ABX_REMOTE_${name}_TOKEN` });
|
|
154
|
+
}
|
|
155
|
+
return out.sort((a, b) => a.key.localeCompare(b.key));
|
|
156
|
+
}
|
|
157
|
+
/** The SDK service client bound to this target (call {@link requireRemoteToken} first when the
|
|
158
|
+
* operation needs auth). */
|
|
159
|
+
export function serviceClient(t) {
|
|
160
|
+
return new AbxServiceClient({ baseUrl: t.url, token: t.token });
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Is this named remote's stored credential actually accepted? One cheap authed read, so `doctor` can
|
|
164
|
+
* report capability instead of mere presence.
|
|
165
|
+
*
|
|
166
|
+
* Doctor is the command a creator runs FIRST, and it used to print a clean `remotes: meridian` for a
|
|
167
|
+
* key the service rejects — the 401 only surfaced later, from `abx remote <name>`, after they had
|
|
168
|
+
* already trusted the line. Same class as an RPC that answers `[]` because it pruned its logs: an
|
|
169
|
+
* empty success is not evidence of capability.
|
|
170
|
+
*
|
|
171
|
+
* Never throws and never blocks doctor for long: a short per-attempt timeout, and anything that is
|
|
172
|
+
* not a definitive rejection is reported as a soft note rather than a ✗, because a slow or briefly
|
|
173
|
+
* unreachable provider is not a misconfiguration the creator can act on.
|
|
174
|
+
*/
|
|
175
|
+
export async function probeRemoteCredential(name, timeoutMs = 4000) {
|
|
176
|
+
const target = resolveRemote(name);
|
|
177
|
+
if (!target)
|
|
178
|
+
return { ok: false, fatal: false, detail: '(unresolved)' };
|
|
179
|
+
try {
|
|
180
|
+
// retryDelayMs 0: a 401 is definitive and never retries anyway, but an unreachable provider
|
|
181
|
+
// would otherwise back off across four attempts and stall the one command that must stay quick.
|
|
182
|
+
const client = new AbxServiceClient({ baseUrl: target.url, token: target.token, timeoutMs, retryDelayMs: 0 });
|
|
183
|
+
const projects = await client.listProjects();
|
|
184
|
+
return { ok: true, fatal: false, detail: `· ${projects.length} project(s) visible` };
|
|
185
|
+
}
|
|
186
|
+
catch (err) {
|
|
187
|
+
if (err instanceof AbxServiceError && err.status === 401) {
|
|
188
|
+
return { ok: false, fatal: true, detail: `token rejected (401) — fix or rotate ${tokenVarFor(name)}` };
|
|
189
|
+
}
|
|
190
|
+
if (err instanceof AbxServiceError && err.status === 403) {
|
|
191
|
+
return { ok: false, fatal: false, detail: '(authorized key, scoped by the provider — not a misconfiguration)' };
|
|
192
|
+
}
|
|
193
|
+
return { ok: false, fatal: false, detail: `(unreachable right now: ${err.message.slice(0, 60)})` };
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
/** The env var a named remote's token is read from — the one to name when it is rejected. */
|
|
197
|
+
export function tokenVarFor(name) {
|
|
198
|
+
if (name.toUpperCase() === 'ABX')
|
|
199
|
+
return ABX_SERVICES_API_KEY_VAR;
|
|
200
|
+
return `ABX_REMOTE_${name.toUpperCase()}_TOKEN`;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Map a control-plane failure to an actionable CLI error. Keys off `AbxServiceError.code`/status,
|
|
204
|
+
* never off message prose (the machine-code half of the interface spec):
|
|
205
|
+
* 401 — the credential itself was rejected → name the var that supplied it.
|
|
206
|
+
* 403 — credential fine, not authorized for this resource → provider scoping, don't retry.
|
|
207
|
+
* `disabled` — the node has no control-plane token configured at all.
|
|
208
|
+
* bare 404 on /v1 — no control plane at this URL (pre-/v1 node, or not an ABX service).
|
|
12
209
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
210
|
+
export function describeRemoteError(err, t, label) {
|
|
211
|
+
if (!(err instanceof AbxServiceError))
|
|
212
|
+
return err;
|
|
213
|
+
if (err.status === 0) {
|
|
214
|
+
// Nothing answered. Say WHERE we asked and, for the bare form, which env var chose it — a lone
|
|
215
|
+
// `fetch failed` leaves the creator with no idea which URL was even tried.
|
|
216
|
+
const from = t.source === 'default'
|
|
217
|
+
? ' (bare `--remote` uses ABX_PUBLIC_BASE_URL, else ABX_RESOLVER_URL)'
|
|
218
|
+
: t.source === 'named'
|
|
219
|
+
? ` (from ABX_REMOTE_${t.name}_URL)`
|
|
220
|
+
: t.source === 'builtin'
|
|
221
|
+
? ' (built-in first-party ABX Services target)'
|
|
222
|
+
: '';
|
|
223
|
+
return new Error(`${label}: nothing responded at ${t.url}${from}. Is it running, and is that the right address?`);
|
|
224
|
+
}
|
|
225
|
+
if (err.status === 401) {
|
|
226
|
+
return new Error(`${label}: 401 unauthorized — ${t.url} rejected ${tokenSourceLabel(t)}. ` +
|
|
227
|
+
(t.tokenFrom === 'flag'
|
|
228
|
+
? `That value is wrong or stale — get a fresh key from the provider (${t.tokenVar} in .env is what a normal run reads).`
|
|
229
|
+
: 'Fix or rotate the key (or pass --remote-token to test a replacement).'));
|
|
230
|
+
}
|
|
231
|
+
if (err.status === 403) {
|
|
232
|
+
return new Error(`${label}: 403 forbidden — the token is valid but not authorized for this project/chain (provider-side scoping, not a typo). ` +
|
|
233
|
+
`Check the provider's dashboard and its descriptor (\`abx remote ${t.name ?? t.url}\`).`);
|
|
234
|
+
}
|
|
235
|
+
if (err.code === 'not_registered') {
|
|
236
|
+
// The likeliest cause when READING a remote (status/index/render) is that the bridge step was
|
|
237
|
+
// never done — the service has no idea this contract exists. Name the fix, not the 404.
|
|
238
|
+
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. ` +
|
|
239
|
+
`Register it: \`abx add <address> --remote ${t.name?.toLowerCase() ?? t.url}\`.`);
|
|
240
|
+
}
|
|
241
|
+
if (err.code === 'disabled') {
|
|
242
|
+
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).`);
|
|
243
|
+
}
|
|
244
|
+
if (err.status === 404 && !err.code) {
|
|
245
|
+
return new Error(`${label}: ${t.url} has no /v1 control plane — an older resolver (redeploy it: \`abx deploy-resolver\`), or not an ABX service. ` +
|
|
246
|
+
`Check: curl ${t.url}/.well-known/abx-service`);
|
|
247
|
+
}
|
|
248
|
+
// A 5xx that volunteered a failure CLASS is the difference between "wait" and "something is
|
|
249
|
+
// broken" — and it's the only thing a credential-free 500 body is allowed to tell us, so use it.
|
|
250
|
+
if (err.class === 'rpc_rate_limited' || err.class === 'rpc_unavailable') {
|
|
251
|
+
return new Error(`${label}: the service reached its chain RPC ${err.class === 'rpc_rate_limited' ? 'rate limit' : 'and got no answer'} (${err.class}) — ` +
|
|
252
|
+
`not your credential and not your address. It retries with backoff; check progress with \`abx status <address> --remote ${t.name?.toLowerCase() ?? t.url}\`.`);
|
|
253
|
+
}
|
|
254
|
+
return new Error(`${label}: ${err.message}`);
|
|
255
|
+
}
|
|
256
|
+
// The `--remote <name|url>` target (remote.ts owns the convention): a named remote's
|
|
257
|
+
// `ABX_REMOTE_<NAME>_URL/_TOKEN`, an ad-hoc URL, or bare `--remote` = the self-host default.
|
|
258
|
+
// Returns null for a local op (the default).
|
|
259
|
+
export function remoteFlag(flags) {
|
|
260
|
+
return resolveRemote(flags.remote, flags['remote-token']);
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* The factory-verification tri-state, said plainly. `null` means the check never ran (no factory
|
|
264
|
+
* configured, or the configured one has no code on this chain — common on a local/dev chain), which
|
|
265
|
+
* is NOT the same as the chain telling us this contract isn't a clone of it.
|
|
266
|
+
*/
|
|
267
|
+
export function canonicalLabel(isCanonical, provenance) {
|
|
268
|
+
if (isCanonical === true) {
|
|
269
|
+
// Say WHICH generation stamped it, and its core version — "canonically ABX v2" is a thing a
|
|
270
|
+
// consumer can repeat, and `abxVersion()` on the clone is where they can verify it themselves.
|
|
271
|
+
const v = provenance?.coreVersion !== null && provenance?.coreVersion !== undefined ? ` — ABX v${provenance.coreVersion}` : '';
|
|
272
|
+
if (provenance?.generation === 'prior') {
|
|
273
|
+
return `${g('yes (factory-verified)')}${dim(`${v}, a PRIOR anchor generation — canonically ABX, deployed by a factory since replaced`)}`;
|
|
274
|
+
}
|
|
275
|
+
return g(`yes (factory-verified${v})`);
|
|
276
|
+
}
|
|
277
|
+
// "the configured factory" (singular) understated the check and misdirected the reader: since the
|
|
278
|
+
// edition anchors were added, `detectCanonicalFactory` probes ALL SIX trust anchors (three 721 +
|
|
279
|
+
// three ERC-1155) and only falls back to the 1/1 anchor when none of them claim the clone. So a
|
|
280
|
+
// `false` means "no trust anchor this CLI knows deployed this", not "you configured the wrong one" —
|
|
281
|
+
// and the usual real cause is a contract from a SUPERSEDED factory, or one deployed by hand.
|
|
282
|
+
if (isCanonical === false) {
|
|
283
|
+
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)')}`;
|
|
284
|
+
}
|
|
285
|
+
if (provenance && provenance.anchorsAnswered === 0) {
|
|
286
|
+
return dim('not checked (no anchor answered — a coverage gap, not a verdict; retry or check the RPC)');
|
|
287
|
+
}
|
|
288
|
+
return dim('not checked (no canonical factory for this chain — `abx doctor` shows which)');
|
|
289
|
+
}
|
|
290
|
+
/** How a lifecycle state reads at a glance — the same word everywhere it's printed. */
|
|
291
|
+
export function statusLabel(s) {
|
|
292
|
+
if (s === 'live')
|
|
293
|
+
return g('live');
|
|
294
|
+
if (s === 'failed')
|
|
295
|
+
return `${c.orange}failed${c.reset}`;
|
|
296
|
+
if (s === 'stale')
|
|
297
|
+
return `${c.orange}stale${c.reset}`;
|
|
298
|
+
return dim(s); // queued | backfilling — in progress, not a problem
|
|
299
|
+
}
|
|
300
|
+
/** `label value` with only the label dimmed — status values carry their own color, and wrapping
|
|
301
|
+
* them in `info()` would fight it. */
|
|
302
|
+
export const statusRow = (label, value) => console.log(` ${dim(label.padEnd(10))} ${value}`);
|
|
303
|
+
/**
|
|
304
|
+
* What to DO about a failure class — whose problem it is and whether waiting is the answer.
|
|
305
|
+
* The class alone told an agent enough to reason it out; it does not tell a creator, and "whose
|
|
306
|
+
* problem is this" is the single question a failed catch-up has to answer.
|
|
307
|
+
*/
|
|
308
|
+
export function indexErrorAction(cls) {
|
|
309
|
+
if (cls === 'rpc_rate_limited')
|
|
310
|
+
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.";
|
|
311
|
+
if (cls === 'rpc_unavailable')
|
|
312
|
+
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.";
|
|
313
|
+
if (cls === 'not_abx_contract')
|
|
314
|
+
return 'the service found no ABX events at that address on this chain — check the address and that the service serves the right chain.';
|
|
315
|
+
return 'the cause is in the service operator’s logs — nothing you can fix from here; contact them if it persists.';
|
|
316
|
+
}
|
|
317
|
+
/** The one wording for "registered, but catch-up failed" — shared by add/index so both say the same
|
|
318
|
+
* thing: what failed, whose problem it is, and that the registration survived. */
|
|
319
|
+
export function failedCatchUpMessage(address, remote, err, check) {
|
|
320
|
+
const cls = err?.class;
|
|
321
|
+
return (`${address} is registered on ${remote.url}, but its catch-up FAILED` +
|
|
322
|
+
`${cls ? ` (${cls}${err?.message ? `: ${err.message}` : ''})` : ''}.\n` +
|
|
323
|
+
` ${cls ? `→ ${indexErrorAction(cls)}\n ` : ''}` +
|
|
324
|
+
`The registration is durable and the service retries with backoff — watch it with ${bold(check + ' --watch')}.`);
|
|
16
325
|
}
|
|
17
|
-
|
|
18
|
-
|
|
326
|
+
/**
|
|
327
|
+
* One human line for a status read: where it is, how far along, and why if it's unhappy.
|
|
328
|
+
*
|
|
329
|
+
* What "where" means depends on the state, so say the right thing rather than one number that reads
|
|
330
|
+
* differently in each: a percentage is only honest while BACKFILLING (see indexProgress). A `live`
|
|
331
|
+
* project's `toBlock` only advances when that project has events, so on a busy chain a perfectly
|
|
332
|
+
* current project sits far below head — printing that as a ratio makes healthy look broken.
|
|
333
|
+
*/
|
|
334
|
+
export function statusLine(s) {
|
|
335
|
+
const p = indexProgress(s);
|
|
336
|
+
let where;
|
|
337
|
+
if (p)
|
|
338
|
+
where = `${s.toBlock}/${s.headBlock} ${dim(`(${p.percent}%)`)}`;
|
|
339
|
+
else if (!s.toBlock)
|
|
340
|
+
where = dim('not indexed yet');
|
|
341
|
+
else if (s.status === 'live')
|
|
342
|
+
where = `${g('caught up')} ${dim(`· scanned through block ${s.toBlock}`)}`;
|
|
343
|
+
else if (s.status === 'stale')
|
|
344
|
+
where = `${dim('not tracking head right now')} ${dim(`· scanned through block ${s.toBlock}${s.headBlock ? ` of ${s.headBlock}` : ''}`)}`;
|
|
345
|
+
else
|
|
346
|
+
where = dim(`scanned through block ${s.toBlock}`);
|
|
347
|
+
const why = s.error ? ` ${c.orange}${s.error.class}${c.reset}${s.error.message ? dim(` — ${s.error.message}`) : ''}` : '';
|
|
348
|
+
return `${statusLabel(s.status)} ${where}${why}`;
|
|
19
349
|
}
|
|
20
|
-
/**
|
|
21
|
-
|
|
22
|
-
|
|
350
|
+
/**
|
|
351
|
+
* Report a register/reindex answer, whichever of the two conformant shapes the service used.
|
|
352
|
+
*
|
|
353
|
+
* A `200` already carries the counts. A `202` means the registration is durable and catch-up is still
|
|
354
|
+
* running — so by default we poll to a terminal state and print the SAME summary line, giving the
|
|
355
|
+
* human the "waits, then tells you what happened" UX without the service holding a socket open for
|
|
356
|
+
* minutes. `--no-wait` stops at the 202 and names the command that checks later.
|
|
357
|
+
*/
|
|
358
|
+
export async function reportRemoteIndexing(remote, chainId, address, r, flags, verb) {
|
|
359
|
+
// A real ABX clone ALWAYS emits a spine (its extension registrations at minimum), so a caught-up
|
|
360
|
+
// projection with zero events means the service scanned the wrong chain/floor or its RPC hasn't
|
|
361
|
+
// served the logs — not that the project is empty. A ✓ there is the lie that produces an empty
|
|
362
|
+
// dashboard (the same guard `reindexAfterDeploy` applies locally).
|
|
363
|
+
const settledLine = (events, tail) => {
|
|
364
|
+
if (events > 0)
|
|
365
|
+
ok(`remote resolver ${verb} ${address}: ${tail}`);
|
|
366
|
+
else
|
|
367
|
+
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.`);
|
|
368
|
+
};
|
|
369
|
+
if (!isAccepted(r)) {
|
|
370
|
+
settledLine(r.project.eventCount, `${r.project.eventCount} events ${dim(`(${r.mode}, ${r.elapsedMs}ms)`)}`);
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
const spec = remote.name ? remote.name.toLowerCase() : remote.source === 'default' ? '' : remote.url;
|
|
374
|
+
const check = `abx status ${address} --remote${spec ? ` ${spec}` : ''}`;
|
|
375
|
+
// The registration is durable in EVERY branch here — but don't claim it "is catching up" when the
|
|
376
|
+
// service already told us the catch-up failed. Two different sentences for two different facts.
|
|
377
|
+
if (r.project.status === 'failed') {
|
|
378
|
+
// Lead with the outcome, not the successful sub-step: a line starting "registered on …" reads
|
|
379
|
+
// as success even with the failure later in the sentence.
|
|
380
|
+
warn(`${bold('catch-up FAILED')} on ${remote.url} — nothing is being served yet ${dim('(the registration itself is durable; the service retries it)')}`);
|
|
381
|
+
}
|
|
382
|
+
else {
|
|
383
|
+
info(`registered — ${r.project.status} ${dim('(the service accepted it and is catching up; the registration is durable)')}`);
|
|
384
|
+
}
|
|
385
|
+
// A known failure is not something to "not wait" for — we already have the answer, so report it as
|
|
386
|
+
// one regardless of --no-wait (never a ✓ over a broken index).
|
|
387
|
+
if (flags['no-wait'] !== undefined && r.project.status !== 'failed') {
|
|
388
|
+
info(`not waiting (--no-wait). Check with ${bold(check)}`);
|
|
389
|
+
return;
|
|
390
|
+
}
|
|
391
|
+
const label = `remote ${verb === 'indexed' ? 'add' : 'index'}`;
|
|
392
|
+
if (r.project.status === 'failed') {
|
|
393
|
+
// Fetch the class the register response may not have carried, so the "whose problem" line is
|
|
394
|
+
// never missing on the path that reports the failure soonest.
|
|
395
|
+
const st = await serviceClient(remote).projectStatus(chainId, address).catch(() => undefined);
|
|
396
|
+
throw new Error(`${label}: ${failedCatchUpMessage(address, remote, st?.error ?? undefined, check)}`);
|
|
397
|
+
}
|
|
398
|
+
let shown = -100;
|
|
399
|
+
let lastStatus;
|
|
23
400
|
try {
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
throw
|
|
401
|
+
const final = await serviceClient(remote).awaitIndexed(chainId, address, {
|
|
402
|
+
onProgress: (s) => {
|
|
403
|
+
const p = indexProgress(s);
|
|
404
|
+
// Print on a state change or a meaningful step — a poll line every 3s is noise in a log an
|
|
405
|
+
// agent has to read back.
|
|
406
|
+
if (s.status !== lastStatus || (p && p.percent - shown >= 10)) {
|
|
407
|
+
lastStatus = s.status;
|
|
408
|
+
if (p)
|
|
409
|
+
shown = p.percent;
|
|
410
|
+
console.log(` ${statusLine(s)}`);
|
|
411
|
+
}
|
|
412
|
+
},
|
|
413
|
+
});
|
|
414
|
+
if (final.status === 'failed') {
|
|
415
|
+
throw new Error(`${label}: ${failedCatchUpMessage(address, remote, final.error, check)}`);
|
|
416
|
+
}
|
|
417
|
+
settledLine(final.eventCount, `${final.eventCount} events, ${final.tokenCount} token(s) ${dim('(live)')}`);
|
|
418
|
+
}
|
|
419
|
+
catch (err) {
|
|
420
|
+
if (err instanceof AbxIndexTimeoutError) {
|
|
421
|
+
warn(`${address} is still ${err.last?.status ?? 'catching up'} on ${remote.url} — nothing is lost, it just isn't done.`);
|
|
422
|
+
info(`follow it with ${bold(check + ' --watch')}`);
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
// The service went away mid-wait (or rejected the poll). The registration still landed — say
|
|
426
|
+
// which failure this is, in the same words every other remote command uses.
|
|
427
|
+
if (err instanceof AbxServiceError)
|
|
428
|
+
throw describeRemoteError(err, remote, `remote ${verb}: registered, but polling status`);
|
|
429
|
+
throw err;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
/** "3 live, 1 backfilling, 1 failed (rpc_rate_limited)" — the one-line answer to "is my stuff ok?" */
|
|
433
|
+
export function rollUp(projects) {
|
|
434
|
+
const counts = new Map();
|
|
435
|
+
for (const p of projects) {
|
|
436
|
+
const k = p.status ?? 'unknown';
|
|
437
|
+
counts.set(k, (counts.get(k) ?? 0) + 1);
|
|
438
|
+
}
|
|
439
|
+
const classes = [...new Set(projects.filter((p) => p.error).map((p) => p.error.class))];
|
|
440
|
+
const parts = [...counts.entries()].map(([k, n]) => `${n} ${k}`);
|
|
441
|
+
return `${parts.join(', ')}${classes.length ? ` ${dim(`(${classes.join(', ')})`)}` : ''}`;
|
|
53
442
|
}
|
|
54
443
|
//# sourceMappingURL=remote.js.map
|
package/dist/remote.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA6BH,qFAAqF;AACrF,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,iBAAiB,CAAC;AACtD,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,EAAC,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAC,CAAC;AAChF,CAAC;AAED,wFAAwF;AACxF,KAAK,UAAU,OAAO,CAAC,KAAa,EAAE,IAAc;IAClD,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC;QACH,MAAM,GAAI,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAsB,CAAC,KAAK,IAAI,EAAE,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,mBAAmB;IACrB,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QACxB,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,wFAAwF,CAAC,CAAC;IACrH,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACvD,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,8EAA8E,MAAM,EAAE,CAAC,CAAC;IACnH,CAAC;IACD,OAAO,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,MAAM,IAAI,MAAM,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,KAAa,EAAE,IAAmB;IACrF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE;QAC/C,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC;QAC3B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IACH,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,MAAM,MAAM,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACtD,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAoB,CAAC;AAChD,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,IAAY,EAAE,KAAa,EAAE,OAAe;IACpF,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,OAAO,EAAE,EAAE,EAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,CAAC,KAAK,CAAC,EAAC,CAAC,CAAC;IAClH,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,MAAM,OAAO,CAAC,eAAe,EAAE,IAAI,CAAC,CAAC;AAClF,CAAC"}
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type Address } from '@artblocks/abx-sdk';
|
|
2
|
+
import { type Lane, type SignResult, type TxProvider } from './signer.js';
|
|
3
|
+
import { type Flags } from './flags.js';
|
|
4
|
+
/** Resolve the signing lane from flags: `--unsigned` (cold) · `--sign` (wallet) · default hot. The
|
|
5
|
+
* one place this decision is made — every write reads the same three flags the same way. */
|
|
6
|
+
export declare function laneFromFlags(flags: Flags): Lane;
|
|
7
|
+
/**
|
|
8
|
+
* Refuse a real deploy on the HOT lane when there is no key to sign with — before the command has
|
|
9
|
+
* spent anything.
|
|
10
|
+
*
|
|
11
|
+
* The signing lanes are checked at *signing* time, which is the end of a deploy. Everything that
|
|
12
|
+
* makes a deploy possible happens first, and some of it is neither free nor reversible: `--backend
|
|
13
|
+
* arweave|ipfs|cloud` UPLOADS the creator's art before any transaction is prepared. So a deploy run
|
|
14
|
+
* with no key, and no `--dry-run` to say "preview only", would mint an Arweave identity, publish the
|
|
15
|
+
* art, and only THEN discover it could never have deployed. Under Turbo's free tier the upload
|
|
16
|
+
* *succeeds*, so the art is published permanently — an irreversible side effect from a run that was
|
|
17
|
+
* always going to fail.
|
|
18
|
+
*
|
|
19
|
+
* `--dry-run` guards every signing choke point (`isDryRun`, `gatedSend`); this is the same idea one
|
|
20
|
+
* step earlier, and the rule it enforces is the sibling of that one: **a spend or a publish never
|
|
21
|
+
* precedes the check that this run can be signed at all.** Only the hot lane is checked — `--sign`
|
|
22
|
+
* (browser wallet) and `--unsigned` (offline signer) deliberately have no local key, and a preview
|
|
23
|
+
* spends nothing.
|
|
24
|
+
*/
|
|
25
|
+
export declare function assertLaneCanSign(flags: Flags): void;
|
|
26
|
+
/**
|
|
27
|
+
* Opt-in pre-send confirmation gate (`--confirm`). OFF by default → scripted use is untouched. Even
|
|
28
|
+
* when opted in, it never blocks automation: `--yes` or a non-TTY stdin proceeds silently. Only an
|
|
29
|
+
* interactive `--confirm` prints the summary and waits for a y/N. Aborts on anything but yes.
|
|
30
|
+
*/
|
|
31
|
+
export declare function confirmSend(summary: string, flags: Flags): Promise<void>;
|
|
32
|
+
export interface DryRunSimulation {
|
|
33
|
+
status: 'would-succeed' | 'would-revert' | 'unknown';
|
|
34
|
+
reason?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* A revert's own name, when the payload carries one — `RoyaltyTooHigh()` instead of a raw hex dump
|
|
38
|
+
* or "reverted for an unknown reason".
|
|
39
|
+
*
|
|
40
|
+
* Whether we get one is the NODE's choice, not ours: many public endpoints (measured:
|
|
41
|
+
* `base-sepolia-rpc.publicnode.com` and `sepolia.base.org`) answer a failed `eth_call` with a bare
|
|
42
|
+
* `execution reverted` and no data at all. So the no-data case says *that*, rather than implying we
|
|
43
|
+
* looked at a reason and couldn't read it.
|
|
44
|
+
*/
|
|
45
|
+
export declare function revertReason(err: unknown): string;
|
|
46
|
+
export interface GatedSendOptions {
|
|
47
|
+
chainKey: string;
|
|
48
|
+
/** The address that must sign (onlyOwner / token holder) — shown to the human, guards the hot
|
|
49
|
+
* lane, and (when set) printed on the dry-run preview. */
|
|
50
|
+
expectedSigner?: Address;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The one send choke point for a SINGLE already-prepared write: `--dry-run` preview (nothing sent,
|
|
54
|
+
* returns `null`) → optional `--confirm` prompt → lane selection → `signTx`. Every caller — an
|
|
55
|
+
* owner-op's `runWrite`/`runMinterWrite`, or the deploy family's resumed-setup send — resolves to
|
|
56
|
+
* this, so the two families can never again each carry their own (possibly diverging) idea of what
|
|
57
|
+
* `--dry-run` or `--confirm` means. The historical bug class this forecloses structurally: a write
|
|
58
|
+
* reaching the send lane under `--dry-run` because some caller re-derived the check by hand and
|
|
59
|
+
* missed a branch.
|
|
60
|
+
*/
|
|
61
|
+
export declare function gatedSend(provider: TxProvider, flags: Flags, opts: GatedSendOptions): Promise<SignResult | null>;
|
|
62
|
+
//# sourceMappingURL=riskgate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"riskgate.d.ts","sourceRoot":"","sources":["../src/riskgate.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAgE,KAAK,OAAO,EAAkB,MAAM,oBAAoB,CAAC;AAChI,OAAO,EAAS,KAAK,IAAI,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAC,MAAM,aAAa,CAAC;AAChF,OAAO,EAAW,KAAK,KAAK,EAAC,MAAM,YAAY,CAAC;AAOhD;6FAC6F;AAC7F,wBAAgB,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAoBhD;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAUpD;AAED;;;;GAIG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAO9E;AAaD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,eAAe,GAAG,cAAc,GAAG,SAAS,CAAC;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAkBjD;AA4DD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB;+DAC2D;IAC3D,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA+BtH"}
|