@artblocks/abx-cli 0.1.0-alpha.6 → 0.1.0-alpha.60
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 +192 -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 +126 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +168 -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 +293 -0
- package/dist/commands/deploy.d.ts.map +1 -0
- package/dist/commands/deploy.js +5624 -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 +458 -0
- package/dist/commands/project.d.ts.map +1 -0
- package/dist/commands/project.js +1832 -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 +881 -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 +760 -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 +638 -0
- package/dist/commands/submit-app.js.map +1 -0
- package/dist/config.d.ts +94 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +332 -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/creator-agent.d.ts +40 -0
- package/dist/creator-agent.d.ts.map +1 -0
- package/dist/creator-agent.js +206 -0
- package/dist/creator-agent.js.map +1 -0
- package/dist/creator-signer.d.ts +33 -0
- package/dist/creator-signer.d.ts.map +1 -0
- package/dist/creator-signer.js +197 -0
- package/dist/creator-signer.js.map +1 -0
- package/dist/deploy-plan.d.ts +218 -0
- package/dist/deploy-plan.d.ts.map +1 -0
- package/dist/deploy-plan.js +20 -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 +22 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +32 -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 +185 -0
- package/dist/flag-allowlists.js.map +1 -0
- package/dist/flags.d.ts +53 -0
- package/dist/flags.d.ts.map +1 -1
- package/dist/flags.js +151 -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 +837 -5213
- 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 +184 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +774 -0
- package/dist/output.js.map +1 -0
- package/dist/ownerops.d.ts +450 -57
- package/dist/ownerops.d.ts.map +1 -1
- package/dist/ownerops.js +2229 -378
- 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/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 +165 -52
- package/dist/remote.d.ts.map +1 -1
- package/dist/remote.js +459 -46
- package/dist/remote.js.map +1 -1
- package/dist/riskgate.d.ts +101 -0
- package/dist/riskgate.d.ts.map +1 -0
- package/dist/riskgate.js +326 -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 +18 -1
- package/dist/signer.d.ts.map +1 -1
- package/dist/signer.js +104 -17
- package/dist/signer.js.map +1 -1
- package/dist/update-check.d.ts +55 -1
- package/dist/update-check.d.ts.map +1 -1
- package/dist/update-check.js +103 -10
- package/dist/update-check.js.map +1 -1
- package/package.json +16 -12
- package/skill/SKILL.md +194 -347
- package/skill/agents/openai.yaml +4 -0
- package/skill/reference/capabilities.md +193 -0
- package/skill/reference/code.md +234 -0
- package/skill/reference/creator-token.md +94 -0
- package/skill/reference/deploy.md +177 -0
- package/skill/reference/diagnose.md +178 -0
- package/skill/reference/hosting.md +188 -93
- package/skill/reference/operate.md +232 -0
- package/skill/reference/services.md +160 -0
- package/skill/reference/setup.md +190 -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
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import { Chacha20Poly1305 } from '@hpke/chacha20poly1305';
|
|
2
|
+
import { CipherSuite, DhkemP256HkdfSha256, HkdfSha256 } from '@hpke/core';
|
|
3
|
+
import { generateAuthorizationSignature } from '@privy-io/node';
|
|
4
|
+
const OAUTH = 'https://auth.privy.io/api/oauth/v2';
|
|
5
|
+
const WALLET_API = 'https://api.privy.io/v1/wallets';
|
|
6
|
+
const DEVICE_GRANT = 'urn:ietf:params:oauth:grant-type:device_code';
|
|
7
|
+
export class CreatorAuthorizationError extends Error {
|
|
8
|
+
code;
|
|
9
|
+
constructor(code) {
|
|
10
|
+
super(`Creator wallet authorization: ${code}`);
|
|
11
|
+
this.code = code;
|
|
12
|
+
this.name = 'CreatorAuthorizationError';
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function object(value) {
|
|
16
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
17
|
+
throw new CreatorAuthorizationError('invalid_response');
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
function string(value) {
|
|
21
|
+
if (typeof value !== 'string' || !value || value.length > 16_384)
|
|
22
|
+
throw new CreatorAuthorizationError('invalid_response');
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
function verificationUrl(value) {
|
|
26
|
+
const raw = string(value);
|
|
27
|
+
let parsed;
|
|
28
|
+
try {
|
|
29
|
+
parsed = new URL(raw);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
throw new CreatorAuthorizationError('invalid_verification_url');
|
|
33
|
+
}
|
|
34
|
+
const local = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1' || parsed.hostname === '[::1]';
|
|
35
|
+
if (parsed.username || parsed.password || (parsed.protocol !== 'https:' && !(local && parsed.protocol === 'http:'))) {
|
|
36
|
+
throw new CreatorAuthorizationError('invalid_verification_url');
|
|
37
|
+
}
|
|
38
|
+
return parsed.toString();
|
|
39
|
+
}
|
|
40
|
+
function seconds(value) {
|
|
41
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0 || value > 86_400) {
|
|
42
|
+
throw new CreatorAuthorizationError('invalid_response');
|
|
43
|
+
}
|
|
44
|
+
return value * 1_000;
|
|
45
|
+
}
|
|
46
|
+
function base64(value) {
|
|
47
|
+
const encoded = string(value);
|
|
48
|
+
if (!/^[A-Za-z0-9+/]+={0,2}$/.test(encoded))
|
|
49
|
+
throw new CreatorAuthorizationError('invalid_response');
|
|
50
|
+
return new Uint8Array(Buffer.from(encoded, 'base64'));
|
|
51
|
+
}
|
|
52
|
+
/** Ephemeral Privy device session. Tokens and the decrypted signing key never leave this instance. */
|
|
53
|
+
export class CreatorAgentAuthorization {
|
|
54
|
+
#appId;
|
|
55
|
+
#fetch;
|
|
56
|
+
#device;
|
|
57
|
+
#accessToken;
|
|
58
|
+
#authorizationKey;
|
|
59
|
+
#keyExpiresAt = 0;
|
|
60
|
+
#wallets = [];
|
|
61
|
+
constructor(options) {
|
|
62
|
+
if (!/^[A-Za-z0-9_-]{1,200}$/.test(options.appId))
|
|
63
|
+
throw new CreatorAuthorizationError('invalid_app_id');
|
|
64
|
+
this.#appId = options.appId;
|
|
65
|
+
this.#fetch = options.fetchImpl ?? fetch;
|
|
66
|
+
}
|
|
67
|
+
async #request(path, body, token) {
|
|
68
|
+
try {
|
|
69
|
+
const response = await this.#fetch(`${OAUTH}/${path}`, {
|
|
70
|
+
method: 'POST',
|
|
71
|
+
redirect: 'error',
|
|
72
|
+
signal: AbortSignal.timeout(15_000),
|
|
73
|
+
headers: {
|
|
74
|
+
'content-type': 'application/json',
|
|
75
|
+
'privy-app-id': this.#appId,
|
|
76
|
+
...(token ? { authorization: `Bearer ${token}`, 'privy-grant-type': 'device_code' } : {}),
|
|
77
|
+
},
|
|
78
|
+
body: JSON.stringify(body),
|
|
79
|
+
});
|
|
80
|
+
const text = await response.text();
|
|
81
|
+
if (text.length > 65_536)
|
|
82
|
+
throw new CreatorAuthorizationError('invalid_response');
|
|
83
|
+
return { response, data: object(JSON.parse(text)) };
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (error instanceof CreatorAuthorizationError)
|
|
87
|
+
throw error;
|
|
88
|
+
throw new CreatorAuthorizationError('request_failed');
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async start() {
|
|
92
|
+
if (this.#device)
|
|
93
|
+
throw new CreatorAuthorizationError('already_started');
|
|
94
|
+
const { response, data } = await this.#request('device_authorization', {});
|
|
95
|
+
if (!response.ok)
|
|
96
|
+
throw new CreatorAuthorizationError('device_authorization_failed');
|
|
97
|
+
const expiresAt = Date.now() + seconds(data.expires_in);
|
|
98
|
+
this.#device = {
|
|
99
|
+
code: string(data.device_code),
|
|
100
|
+
expiresAt,
|
|
101
|
+
interval: data.interval === undefined ? 5_000 : seconds(data.interval),
|
|
102
|
+
};
|
|
103
|
+
return {
|
|
104
|
+
userCode: string(data.user_code),
|
|
105
|
+
verificationUri: verificationUrl(data.verification_uri),
|
|
106
|
+
...(data.verification_uri_complete ? { verificationUriComplete: verificationUrl(data.verification_uri_complete) } : {}),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
async wait() {
|
|
110
|
+
const device = this.#device;
|
|
111
|
+
if (!device)
|
|
112
|
+
throw new CreatorAuthorizationError('not_started');
|
|
113
|
+
for (;;) {
|
|
114
|
+
const remaining = device.expiresAt - Date.now();
|
|
115
|
+
if (remaining <= 0)
|
|
116
|
+
throw new CreatorAuthorizationError('expired');
|
|
117
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(device.interval, remaining)));
|
|
118
|
+
const { response, data } = await this.#request('token', { grant_type: DEVICE_GRANT, device_code: device.code });
|
|
119
|
+
if (response.ok) {
|
|
120
|
+
this.#accessToken = string(data.access_token);
|
|
121
|
+
await this.#authenticate();
|
|
122
|
+
this.#device = undefined;
|
|
123
|
+
return this.#wallets.map((wallet) => ({ ...wallet }));
|
|
124
|
+
}
|
|
125
|
+
const code = typeof data.error === 'string' ? data.error : '';
|
|
126
|
+
if (response.status === 400 && (code === 'authorization_pending' || code === 'slow_down')) {
|
|
127
|
+
if (code === 'slow_down')
|
|
128
|
+
device.interval += 5_000;
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
throw new CreatorAuthorizationError(code === 'access_denied' ? 'access_denied' : 'provider_error');
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
async #authenticate() {
|
|
135
|
+
if (!this.#accessToken)
|
|
136
|
+
throw new CreatorAuthorizationError('login_required');
|
|
137
|
+
try {
|
|
138
|
+
const suite = new CipherSuite({ kem: new DhkemP256HkdfSha256(), kdf: new HkdfSha256(), aead: new Chacha20Poly1305() });
|
|
139
|
+
const pair = await suite.kem.generateKeyPair();
|
|
140
|
+
const publicKey = await globalThis.crypto.subtle.exportKey('spki', pair.publicKey);
|
|
141
|
+
const { response, data } = await this.#request('wallets/authenticate', { encryption_type: 'HPKE', recipient_public_key: Buffer.from(publicKey).toString('base64') }, this.#accessToken);
|
|
142
|
+
if (!response.ok)
|
|
143
|
+
throw new CreatorAuthorizationError('wallet_authentication_failed');
|
|
144
|
+
const encrypted = object(data.encrypted_authorization_key);
|
|
145
|
+
const expiresAt = typeof data.expires_at === 'number' ? data.expires_at : Date.parse(string(data.expires_at));
|
|
146
|
+
if (!Number.isFinite(expiresAt) || expiresAt <= Date.now() + 5_000)
|
|
147
|
+
throw new CreatorAuthorizationError('expired_signing_key');
|
|
148
|
+
if (!Array.isArray(data.wallets))
|
|
149
|
+
throw new CreatorAuthorizationError('invalid_response');
|
|
150
|
+
const wallets = data.wallets.map((value) => {
|
|
151
|
+
const wallet = object(value);
|
|
152
|
+
return { id: string(wallet.id), address: string(wallet.address), chainType: string(wallet.chain_type) };
|
|
153
|
+
});
|
|
154
|
+
const recipient = await suite.createRecipientContext({ recipientKey: pair.privateKey, enc: base64(encrypted.encapsulated_key) });
|
|
155
|
+
const bytes = new Uint8Array(await recipient.open(base64(encrypted.ciphertext)));
|
|
156
|
+
try {
|
|
157
|
+
this.#authorizationKey = new TextDecoder('utf-8', { fatal: true }).decode(bytes);
|
|
158
|
+
this.#keyExpiresAt = expiresAt;
|
|
159
|
+
this.#wallets = wallets;
|
|
160
|
+
}
|
|
161
|
+
finally {
|
|
162
|
+
bytes.fill(0);
|
|
163
|
+
}
|
|
164
|
+
this.#accessToken = undefined;
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
if (error instanceof CreatorAuthorizationError)
|
|
168
|
+
throw error;
|
|
169
|
+
throw new CreatorAuthorizationError('key_exchange_failed');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
sign(input) {
|
|
173
|
+
if (!this.#authorizationKey || this.#keyExpiresAt <= Date.now())
|
|
174
|
+
throw new CreatorAuthorizationError('authorization_expired');
|
|
175
|
+
if (!/^[A-Za-z0-9_-]{1,200}$/.test(input.walletId) || !/^[A-Za-z0-9_-]{1,200}$/.test(input.idempotencyKey)) {
|
|
176
|
+
throw new CreatorAuthorizationError('invalid_request');
|
|
177
|
+
}
|
|
178
|
+
if (input.body.method !== 'eth_sendTransaction')
|
|
179
|
+
throw new CreatorAuthorizationError('unsupported_method');
|
|
180
|
+
if (!this.#wallets.some((wallet) => wallet.id === input.walletId && wallet.chainType === 'ethereum')) {
|
|
181
|
+
throw new CreatorAuthorizationError('wallet_not_authorized');
|
|
182
|
+
}
|
|
183
|
+
const expiry = Number(input.requestExpiry);
|
|
184
|
+
if (!Number.isSafeInteger(expiry) || expiry <= Date.now() || expiry > Date.now() + 60_000 || expiry > this.#keyExpiresAt) {
|
|
185
|
+
throw new CreatorAuthorizationError('invalid_request_expiry');
|
|
186
|
+
}
|
|
187
|
+
const url = `${WALLET_API}/${encodeURIComponent(input.walletId)}/rpc`;
|
|
188
|
+
const headers = {
|
|
189
|
+
'privy-app-id': this.#appId,
|
|
190
|
+
'privy-idempotency-key': input.idempotencyKey,
|
|
191
|
+
'privy-request-expiry': input.requestExpiry,
|
|
192
|
+
};
|
|
193
|
+
const signature = generateAuthorizationSignature({
|
|
194
|
+
authorizationPrivateKey: this.#authorizationKey,
|
|
195
|
+
input: { version: 1, method: 'POST', url, body: input.body, headers },
|
|
196
|
+
});
|
|
197
|
+
return { url, headers: { ...headers, 'privy-authorization-signature': signature } };
|
|
198
|
+
}
|
|
199
|
+
dispose() {
|
|
200
|
+
this.#device = undefined;
|
|
201
|
+
this.#accessToken = undefined;
|
|
202
|
+
this.#authorizationKey = undefined;
|
|
203
|
+
this.#wallets = [];
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=creator-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creator-agent.js","sourceRoot":"","sources":["../src/creator-agent.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type Address, type Hex, type PreparedTx } from '@artblocks/abx-sdk';
|
|
2
|
+
import type { TransactionReceipt } from 'viem';
|
|
3
|
+
/** Synchronous preflight for commands that may upload content before opening the signing lane. */
|
|
4
|
+
export declare function assertSponsorConfigured(chainKey: string): void;
|
|
5
|
+
/**
|
|
6
|
+
* Resolve the existing account-bound creator wallet for a sponsored preview without provisioning
|
|
7
|
+
* a wallet or opening an authorization grant. A dry run must use the signer that the real send
|
|
8
|
+
* will use; silently falling back to a local env key changes the CREATE2 salt, owner, royalty
|
|
9
|
+
* receiver, and mint recipient shown in the preview.
|
|
10
|
+
*/
|
|
11
|
+
export declare function sponsoredPreviewAddress(chainKey: string, options?: {
|
|
12
|
+
env?: NodeJS.ProcessEnv;
|
|
13
|
+
fetchImpl?: typeof fetch;
|
|
14
|
+
}): Promise<Address>;
|
|
15
|
+
export interface SponsoredReceipt {
|
|
16
|
+
txHash: Hex;
|
|
17
|
+
receipt: TransactionReceipt;
|
|
18
|
+
}
|
|
19
|
+
export interface SponsoredSession {
|
|
20
|
+
address: Address;
|
|
21
|
+
send(tx: PreparedTx): Promise<SponsoredReceipt>;
|
|
22
|
+
close(): void;
|
|
23
|
+
}
|
|
24
|
+
/** Resolve the first-party wallet API from its public remote catalog. The env override is an
|
|
25
|
+
* explicit local/staging escape hatch; production callers do not need to know `api.abx.io`. */
|
|
26
|
+
export declare function creatorApiUrl(chainId: number, env?: NodeJS.ProcessEnv): Promise<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Open one short-lived creator authorization session. The human authorizes the agent once; every
|
|
29
|
+
* exact transaction in this CLI invocation is then signed by that same ephemeral grant. Neither the
|
|
30
|
+
* OAuth token nor the decrypted authorization key is written to disk or returned to callers.
|
|
31
|
+
*/
|
|
32
|
+
export declare function openSponsoredSession(chainKey: string): Promise<SponsoredSession>;
|
|
33
|
+
//# sourceMappingURL=creator-signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creator-signer.d.ts","sourceRoot":"","sources":["../src/creator-signer.ts"],"names":[],"mappings":"AAEA,OAAO,EAWL,KAAK,OAAO,EACZ,KAAK,GAAG,EACR,KAAK,UAAU,EAChB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAC,kBAAkB,EAAC,MAAM,MAAM,CAAC;AAO7C,kGAAkG;AAClG,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAE9D;AAaD;;;;;GAKG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,KAAK,CAAA;CAAM,GAChE,OAAO,CAAC,OAAO,CAAC,CAqBlB;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,kBAAkB,CAAC;CAC7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAChD,KAAK,IAAI,IAAI,CAAC;CACf;AAmBD;+FAC+F;AAC/F,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAW1G;AAmBD;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAsGtF"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { AbxServiceClient, CREATOR_WALLET_INTERFACE, CreatorApiClient, makePublicClient, pinGas, resolveChain, resolveServiceInterfaceEndpoint, sleep, TxRevertedError, waitForCodeAt, } from '@artblocks/abx-sdk';
|
|
4
|
+
import { CreatorAgentAuthorization } from './creator-agent.js';
|
|
5
|
+
import { ABX_SERVICES_URL } from './remote.js';
|
|
6
|
+
const SPONSORABLE_BASE_CHAINS = new Set([8_453, 84_532]);
|
|
7
|
+
const MAX_SPONSORED_GAS = 3000000n;
|
|
8
|
+
/** Synchronous preflight for commands that may upload content before opening the signing lane. */
|
|
9
|
+
export function assertSponsorConfigured(chainKey) {
|
|
10
|
+
assertSponsorConfiguredWithEnv(chainKey, process.env);
|
|
11
|
+
}
|
|
12
|
+
function assertSponsorConfiguredWithEnv(chainKey, env) {
|
|
13
|
+
if (!SPONSORABLE_BASE_CHAINS.has(resolveChain(chainKey).id)) {
|
|
14
|
+
throw new Error('--sponsor is a beta for Base and Base Sepolia only, and still requires live provider and account eligibility. Use --send, --sign, or --unsigned on this network.');
|
|
15
|
+
}
|
|
16
|
+
if (!env.ABX_SERVICES_API_KEY) {
|
|
17
|
+
throw new Error('--sponsor needs ABX_SERVICES_API_KEY in your ignored .env. Run `abx auth login` first.');
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Resolve the existing account-bound creator wallet for a sponsored preview without provisioning
|
|
22
|
+
* a wallet or opening an authorization grant. A dry run must use the signer that the real send
|
|
23
|
+
* will use; silently falling back to a local env key changes the CREATE2 salt, owner, royalty
|
|
24
|
+
* receiver, and mint recipient shown in the preview.
|
|
25
|
+
*/
|
|
26
|
+
export async function sponsoredPreviewAddress(chainKey, options = {}) {
|
|
27
|
+
const env = options.env ?? process.env;
|
|
28
|
+
const chain = resolveChain(chainKey);
|
|
29
|
+
assertSponsorConfiguredWithEnv(chainKey, env);
|
|
30
|
+
const apiKey = env.ABX_SERVICES_API_KEY;
|
|
31
|
+
const api = new CreatorApiClient({
|
|
32
|
+
baseUrl: await creatorApiUrl(chain.id, env),
|
|
33
|
+
token: apiKey,
|
|
34
|
+
fetchImpl: options.fetchImpl,
|
|
35
|
+
});
|
|
36
|
+
const account = await api.account();
|
|
37
|
+
if (!account.wallet || !account.capabilities.wallet) {
|
|
38
|
+
throw new Error('Sponsored dry run needs an existing ABX creator wallet, but this account has not provisioned one yet. ' +
|
|
39
|
+
'Provision the wallet through ABX Services first, then rerun; the preview will not create external state.');
|
|
40
|
+
}
|
|
41
|
+
if (!account.capabilities.sponsorship || !account.capabilities.sponsoredChains.includes(chain.id)) {
|
|
42
|
+
throw new Error(`ABX gas sponsorship is not enabled for ${chain.name} on this account.`);
|
|
43
|
+
}
|
|
44
|
+
return account.wallet.address;
|
|
45
|
+
}
|
|
46
|
+
function checkedCreatorApiUrl(raw) {
|
|
47
|
+
const parsed = new URL(raw);
|
|
48
|
+
const local = parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1' || parsed.hostname === '[::1]';
|
|
49
|
+
if (parsed.username ||
|
|
50
|
+
parsed.password ||
|
|
51
|
+
parsed.search ||
|
|
52
|
+
parsed.hash ||
|
|
53
|
+
(parsed.protocol !== 'https:' && !(local && parsed.protocol === 'http:'))) {
|
|
54
|
+
throw new Error('ABX_CREATORS_API_URL must be HTTPS (or localhost HTTP for development) without credentials, a query, or a fragment.');
|
|
55
|
+
}
|
|
56
|
+
return parsed.toString().replace(/\/+$/, '');
|
|
57
|
+
}
|
|
58
|
+
/** Resolve the first-party wallet API from its public remote catalog. The env override is an
|
|
59
|
+
* explicit local/staging escape hatch; production callers do not need to know `api.abx.io`. */
|
|
60
|
+
export async function creatorApiUrl(chainId, env = process.env) {
|
|
61
|
+
if (env.ABX_CREATORS_API_URL)
|
|
62
|
+
return checkedCreatorApiUrl(env.ABX_CREATORS_API_URL);
|
|
63
|
+
const descriptor = await new AbxServiceClient({ baseUrl: ABX_SERVICES_URL, timeoutMs: 10_000 }).descriptor();
|
|
64
|
+
const endpoint = resolveServiceInterfaceEndpoint(ABX_SERVICES_URL, descriptor, CREATOR_WALLET_INTERFACE);
|
|
65
|
+
if (!endpoint) {
|
|
66
|
+
throw new Error('The ABX remote does not advertise an account-bound creator-wallet service. Use --send, --sign, or --unsigned.');
|
|
67
|
+
}
|
|
68
|
+
if (!endpoint.chains.includes(chainId)) {
|
|
69
|
+
throw new Error(`The ABX creator-wallet service does not support chain ${chainId}. Use --send, --sign, or --unsigned.`);
|
|
70
|
+
}
|
|
71
|
+
return endpoint.baseUrl;
|
|
72
|
+
}
|
|
73
|
+
function openBrowser(url) {
|
|
74
|
+
if (process.env.CI)
|
|
75
|
+
return;
|
|
76
|
+
try {
|
|
77
|
+
const command = process.platform === 'darwin'
|
|
78
|
+
? { file: 'open', args: [url] }
|
|
79
|
+
: process.platform === 'win32'
|
|
80
|
+
? { file: 'rundll32', args: ['url.dll,FileProtocolHandler', url] }
|
|
81
|
+
: { file: 'xdg-open', args: [url] };
|
|
82
|
+
const child = spawn(command.file, command.args, { detached: true, stdio: 'ignore' });
|
|
83
|
+
child.on('error', () => { });
|
|
84
|
+
child.unref();
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// The complete URL and code are always printed below.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Open one short-lived creator authorization session. The human authorizes the agent once; every
|
|
92
|
+
* exact transaction in this CLI invocation is then signed by that same ephemeral grant. Neither the
|
|
93
|
+
* OAuth token nor the decrypted authorization key is written to disk or returned to callers.
|
|
94
|
+
*/
|
|
95
|
+
export async function openSponsoredSession(chainKey) {
|
|
96
|
+
const chain = resolveChain(chainKey);
|
|
97
|
+
assertSponsorConfigured(chainKey);
|
|
98
|
+
const apiKey = process.env.ABX_SERVICES_API_KEY;
|
|
99
|
+
if (!apiKey)
|
|
100
|
+
throw new Error('ABX Services API key disappeared after sponsorship preflight.');
|
|
101
|
+
const api = new CreatorApiClient({ baseUrl: await creatorApiUrl(chain.id), token: apiKey });
|
|
102
|
+
const wallet = await api.provisionWallet();
|
|
103
|
+
const account = await api.account();
|
|
104
|
+
if (!account.wallet || account.wallet.address.toLowerCase() !== wallet.address.toLowerCase()) {
|
|
105
|
+
throw new Error('ABX Creators returned inconsistent wallet binding. Nothing was signed.');
|
|
106
|
+
}
|
|
107
|
+
if (!account.capabilities.sponsorship || !account.capabilities.sponsoredChains.includes(chain.id)) {
|
|
108
|
+
throw new Error(`ABX gas sponsorship is not enabled for ${chain.name} on this account.`);
|
|
109
|
+
}
|
|
110
|
+
const authorization = new CreatorAgentAuthorization({ appId: wallet.providerAppId });
|
|
111
|
+
try {
|
|
112
|
+
const device = await authorization.start();
|
|
113
|
+
const verificationUrl = device.verificationUriComplete ?? device.verificationUri;
|
|
114
|
+
console.log(`\n Authorize this agent once for the transaction group:`);
|
|
115
|
+
console.log(` ${verificationUrl}`);
|
|
116
|
+
console.log(` Code: ${device.userCode}\n`);
|
|
117
|
+
openBrowser(verificationUrl);
|
|
118
|
+
const wallets = await authorization.wait();
|
|
119
|
+
const authorized = wallets.find((candidate) => candidate.chainType === 'ethereum' && candidate.address.toLowerCase() === wallet.address.toLowerCase());
|
|
120
|
+
if (!authorized)
|
|
121
|
+
throw new Error(`Privy authorized a different wallet; expected ${wallet.address}.`);
|
|
122
|
+
const publicClient = makePublicClient({ chainKey });
|
|
123
|
+
let closed = false;
|
|
124
|
+
return {
|
|
125
|
+
address: wallet.address,
|
|
126
|
+
async send(tx) {
|
|
127
|
+
if (closed)
|
|
128
|
+
throw new Error('The creator authorization session is closed.');
|
|
129
|
+
if (tx.chainId !== chain.id)
|
|
130
|
+
throw new Error(`Refusing sponsored transaction for chain ${tx.chainId}; expected ${chain.id}.`);
|
|
131
|
+
if (!tx.to)
|
|
132
|
+
throw new Error('Direct contract creation is not sponsored; deploy through an ABX factory.');
|
|
133
|
+
if (BigInt(tx.value) !== 0n)
|
|
134
|
+
throw new Error('ABX sponsorship never covers a transaction that transfers ETH.');
|
|
135
|
+
if (tx.gasFloor)
|
|
136
|
+
await waitForCodeAt(publicClient, tx.to);
|
|
137
|
+
const gas = await pinGas(publicClient, {
|
|
138
|
+
from: wallet.address,
|
|
139
|
+
to: tx.to,
|
|
140
|
+
data: tx.data,
|
|
141
|
+
value: tx.value,
|
|
142
|
+
gasFloor: tx.gasFloor,
|
|
143
|
+
});
|
|
144
|
+
if (gas > MAX_SPONSORED_GAS) {
|
|
145
|
+
throw new Error(`This transaction needs ${gas} gas; the ABX sponsorship beta caps each transaction at ${MAX_SPONSORED_GAS}.`);
|
|
146
|
+
}
|
|
147
|
+
const operationId = `op_${randomUUID().replaceAll('-', '')}`;
|
|
148
|
+
const prepared = await api.prepare({
|
|
149
|
+
operationId,
|
|
150
|
+
chainId: chain.id,
|
|
151
|
+
to: tx.to,
|
|
152
|
+
value: tx.value,
|
|
153
|
+
data: tx.data,
|
|
154
|
+
gasLimit: Number(gas),
|
|
155
|
+
});
|
|
156
|
+
const signed = authorization.sign({
|
|
157
|
+
walletId: prepared.signingRequest.walletId,
|
|
158
|
+
body: prepared.signingRequest.body,
|
|
159
|
+
idempotencyKey: prepared.signingRequest.idempotencyKey,
|
|
160
|
+
requestExpiry: prepared.signingRequest.requestExpiry,
|
|
161
|
+
});
|
|
162
|
+
let operation = await api.submit(operationId, {
|
|
163
|
+
requestExpiry: prepared.signingRequest.requestExpiry,
|
|
164
|
+
data: tx.data,
|
|
165
|
+
signed,
|
|
166
|
+
});
|
|
167
|
+
const deadline = Date.now() + 180_000;
|
|
168
|
+
while (operation.state === 'prepared' ||
|
|
169
|
+
operation.state === 'submitting' ||
|
|
170
|
+
operation.state === 'pending' ||
|
|
171
|
+
operation.state === 'unknown') {
|
|
172
|
+
if (Date.now() >= deadline) {
|
|
173
|
+
throw new Error(`Sponsored operation ${operationId} could not be reconciled. It may have been submitted; check its status before doing anything else and do not retry it.`);
|
|
174
|
+
}
|
|
175
|
+
await sleep(1_500);
|
|
176
|
+
operation = await api.getOperation(operationId);
|
|
177
|
+
}
|
|
178
|
+
if (operation.state !== 'confirmed' || !operation.transactionHash) {
|
|
179
|
+
throw new Error(`Sponsored operation ${operationId} failed${operation.errorCode ? ` (${operation.errorCode})` : ''}.`);
|
|
180
|
+
}
|
|
181
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash: operation.transactionHash });
|
|
182
|
+
if (receipt.status !== 'success')
|
|
183
|
+
throw new TxRevertedError(tx.op, operation.transactionHash);
|
|
184
|
+
return { txHash: operation.transactionHash, receipt };
|
|
185
|
+
},
|
|
186
|
+
close() {
|
|
187
|
+
closed = true;
|
|
188
|
+
authorization.dispose();
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
authorization.dispose();
|
|
194
|
+
throw error;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=creator-signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"creator-signer.js","sourceRoot":"","sources":["../src/creator-signer.ts"],"names":[],"mappings":"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"}
|