@hardkas/accounts 0.11.4-alpha → 0.12.0-rc.1

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.
@@ -2,7 +2,7 @@ import {
2
2
  LazyAccountAuthorizer,
3
3
  PrivateKeyAuthorizer,
4
4
  StaticSignatureScriptAuthorizer
5
- } from "./chunk-MRXCDBKH.js";
5
+ } from "./chunk-YJL7P33W.js";
6
6
  export {
7
7
  LazyAccountAuthorizer,
8
8
  PrivateKeyAuthorizer,
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  parseWasmTxToRpc
3
- } from "./chunk-WRRHW2WO.js";
3
+ } from "./chunk-R5P3WIWR.js";
4
4
  import {
5
5
  resolveHardkasAccount
6
- } from "./chunk-ILASLDZU.js";
6
+ } from "./chunk-TRVIQTIO.js";
7
7
  import {
8
8
  loadKaspaWasm
9
9
  } from "./chunk-6DPO5V3N.js";
@@ -24,7 +24,7 @@ var KaspaWasmPrivateKeySigner = class {
24
24
  this.options = options;
25
25
  }
26
26
  options;
27
- kind = "kaspa-private-key";
27
+ kind = "kaspa";
28
28
  async signTxPlan(input) {
29
29
  const plan = input.planArtifact;
30
30
  const sdk = await loadKaspaWasm(this.options.wasmConfig);
@@ -56,7 +56,7 @@ var KaspaWasmPrivateKeySigner = class {
56
56
  if (!pkValue && account.keystorePath) {
57
57
  try {
58
58
  const KeystoreManager2 = (await import("./keystore-CMWEKGBF.js")).KeystoreManager;
59
- const DEV_ACCOUNTS_PASSWORD2 = (await import("./dev-accounts-FU4XTSGF.js")).DEV_ACCOUNTS_PASSWORD;
59
+ const DEV_ACCOUNTS_PASSWORD2 = (await import("./dev-accounts-B6ZVTPCW.js")).DEV_ACCOUNTS_PASSWORD;
60
60
  const keystore = await KeystoreManager2.loadEncryptedKeystore(account.keystorePath);
61
61
  const unlock = await KeystoreManager2.decryptEncryptedKeystore(keystore, DEV_ACCOUNTS_PASSWORD2);
62
62
  if (unlock.success && unlock.payload) {
@@ -76,7 +76,7 @@ var KaspaWasmPrivateKeySigner = class {
76
76
  throw err;
77
77
  }
78
78
  const expectedAddress = new sdk.PrivateKey(pkValue).toKeypair().toAddress(plan.networkId || "simnet").toString();
79
- const { PrivateKeyAuthorizer } = await import("./authorizers-N2RUAVJV.js");
79
+ const { PrivateKeyAuthorizer } = await import("./authorizers-OVWWAL5J.js");
80
80
  const sourceInputs = plan.inputs || plan.selectedUtxos || [];
81
81
  for (let i = 0; i < numInputs; i++) {
82
82
  if (!authorizers[i]) {
@@ -184,9 +184,11 @@ var KaspaWasmPrivateKeySigner = class {
184
184
  };
185
185
  });
186
186
  console.log("DEBUG: Calling V0 createTransaction with:", { utxos: utxos.length, wasmOutputs: wasmOutputs.length, priorityFee });
187
+ const dummyChange = plan.change?.address || plan.from.address;
187
188
  unsignedTx = sdk.createTransaction(
188
189
  utxos,
189
190
  wasmOutputs,
191
+ dummyChange,
190
192
  priorityFee
191
193
  );
192
194
  }
@@ -200,7 +202,6 @@ var KaspaWasmPrivateKeySigner = class {
200
202
  inputs[i].sigOpCount = 0;
201
203
  }
202
204
  }
203
- unsignedTx.inputs = inputs;
204
205
  console.log("DEBUG createFreshTx RETURNING:", unsignedTx?.constructor?.name);
205
206
  return unsignedTx;
206
207
  };
@@ -244,10 +245,12 @@ var KaspaWasmPrivateKeySigner = class {
244
245
  const finalTx = createFreshTx();
245
246
  const signedTx = finalTx;
246
247
  const wasmTxStr = typeof signedTx.serializeToJSON === "function" ? signedTx.serializeToJSON() : signedTx.toString();
248
+ console.log("DEBUG wasmTxStr:", wasmTxStr);
249
+ console.log("DEBUG: about to parseWasmTxToRpc");
247
250
  const rpcTx = parseWasmTxToRpc(wasmTxStr, signedTx, inputOverrides, plan);
248
251
  const rawTx = JSON.stringify(rpcTx);
249
252
  return {
250
- signatureKind: "kaspa-private-key",
253
+ signatureKind: "kaspa",
251
254
  signerAddress: input.accountName || plan.from.address || "authorized",
252
255
  signedTransaction: {
253
256
  format: "hex",
@@ -261,6 +264,7 @@ var KaspaWasmPrivateKeySigner = class {
261
264
  };
262
265
  } catch (error) {
263
266
  console.error("DEBUG SIGNING ERROR:", error);
267
+ console.error("DEBUG STACK:", error?.stack || "NO STACK (raw panic)");
264
268
  throw new Error(
265
269
  `Kaspa WASM signing failed: ${error instanceof Error ? error.stack || error.message : JSON.stringify(error, Object.getOwnPropertyNames(error))}`
266
270
  );
@@ -432,7 +436,7 @@ async function createDevSigner(workspaceDir, accountNameOrAddress) {
432
436
  nameOrAddress: accountNameOrAddress,
433
437
  config: { cwd: workspaceDir }
434
438
  });
435
- if (account.kind !== "kaspa-private-key") {
439
+ if (account.kind !== "kaspa") {
436
440
  throw new Error(`Account '${accountNameOrAddress}' is not a private key account, cannot create local dev signer.`);
437
441
  }
438
442
  return new KaspaWasmPrivateKeySigner({
@@ -28,7 +28,7 @@ function parseWasmTxToRpc(wasmTxStr, signedTx, inputOverrides, plan) {
28
28
  return {
29
29
  version,
30
30
  inputs: (txInner.inputs || []).map((i, idx) => {
31
- const isFlattened = !!txInner.outputs || !!i.previousOutpoint || !!i.transactionId;
31
+ const isFlattened = !!i.previousOutpoint || !!i.transactionId;
32
32
  const prevOut = isFlattened ? i.previousOutpoint || i : i.inner.previousOutpoint.inner;
33
33
  const originalSigScript = isFlattened ? i.signatureScript || "" : toHex(i.inner.signatureScript);
34
34
  const originalSigOpCount = isFlattened ? i.sigOpCount : i.inner.sigOpCount;
@@ -56,9 +56,9 @@ function parseWasmTxToRpc(wasmTxStr, signedTx, inputOverrides, plan) {
56
56
  };
57
57
  }),
58
58
  outputs: (txInner.outputs || []).map((o, idx) => {
59
- const isFlattened = !!txInner.outputs || !!o.scriptPublicKey || !!o.value || !!o.amount;
59
+ const isFlattened = !!o.scriptPublicKey || !!o.script_public_key || !!o.value || !!o.amount;
60
60
  const innerOut = isFlattened ? o : o.inner;
61
- const scriptObj = innerOut.scriptPublicKey;
61
+ const scriptObj = innerOut.scriptPublicKey || innerOut.script_public_key;
62
62
  const ret = {
63
63
  amount: (innerOut.value || innerOut.amount || 0).toString(),
64
64
  scriptPublicKey: {
@@ -2,6 +2,7 @@
2
2
  import fs2 from "fs";
3
3
  import path2 from "path";
4
4
  import { createDeterministicAccounts } from "@hardkas/localnet";
5
+ import { CrossWorldAccountCollisionError, AccountNetworkMismatchError } from "@hardkas/core";
5
6
 
6
7
  // src/real-accounts.ts
7
8
  import fs from "fs";
@@ -193,83 +194,37 @@ function resolveRealAccountOrAddress(store, nameOrAddress) {
193
194
  // src/resolve.ts
194
195
  function resolveHardkasAccount(options) {
195
196
  const { nameOrAddress, config } = options;
197
+ if (nameOrAddress.startsWith("kaspa:sim_")) {
198
+ return {
199
+ name: nameOrAddress,
200
+ kind: "synthetic",
201
+ executionMode: "simulator",
202
+ address: nameOrAddress
203
+ };
204
+ }
196
205
  if (nameOrAddress.startsWith("kaspa:") || nameOrAddress.startsWith("kaspatest:") || nameOrAddress.startsWith("kaspasim:")) {
206
+ let network = "mainnet";
207
+ if (nameOrAddress.startsWith("kaspasim:")) network = "simnet";
208
+ else if (nameOrAddress.startsWith("kaspatest:")) {
209
+ const match = nameOrAddress.match(/^kaspatest:(\d+)_/);
210
+ network = match ? `testnet-${match[1]}` : void 0;
211
+ }
197
212
  return {
198
213
  name: nameOrAddress,
199
214
  kind: "external-wallet",
215
+ ...network ? { network } : {},
200
216
  address: nameOrAddress
201
217
  };
202
218
  }
203
219
  let alias = nameOrAddress;
204
220
  if (alias === "0") alias = "alice";
205
221
  if (alias === "1") alias = "bob";
206
- const workspaceRoot = config?.cwd || process.cwd();
207
- const devAccountPath = path2.join(
208
- workspaceRoot,
209
- ".hardkas",
210
- "dev-accounts",
211
- `${alias}.json`
212
- );
213
- if (fs2.existsSync(devAccountPath)) {
214
- try {
215
- const data = fs2.readFileSync(devAccountPath, "utf-8");
216
- const keystore = JSON.parse(data);
217
- if (keystore.type === "hardkas.encryptedKeystore.v2") {
218
- return {
219
- name: alias,
220
- kind: "kaspa-private-key",
221
- address: keystore.metadata?.address,
222
- keystorePath: devAccountPath
223
- };
224
- }
225
- } catch (e) {
226
- }
222
+ const accounts = listHardkasAccounts(config);
223
+ const found = accounts.find((a) => a.name === alias);
224
+ if (found) {
225
+ return found;
227
226
  }
228
- const keystoreJsonPath = path2.join(workspaceRoot, ".hardkas", "keystore.json");
229
- if (fs2.existsSync(keystoreJsonPath)) {
230
- try {
231
- const data = fs2.readFileSync(keystoreJsonPath, "utf-8");
232
- const ks = JSON.parse(data);
233
- if (ks[alias]) {
234
- return {
235
- name: alias,
236
- kind: ks[alias].type === "simulated" ? "simulated" : "kaspa-private-key",
237
- address: ks[alias].address
238
- };
239
- }
240
- } catch (e) {
241
- }
242
- }
243
- if (config?.accounts && config.accounts[alias]) {
244
- const accConfig = config.accounts[alias];
245
- return {
246
- name: alias,
247
- ...accConfig
248
- };
249
- }
250
- const realStore = loadRealAccountStoreSync({ cwd: workspaceRoot });
251
- const realAcc = realStore ? getRealDevAccount(realStore, alias) : null;
252
- if (realAcc) {
253
- return {
254
- name: realAcc.name,
255
- kind: "kaspa-private-key",
256
- // Assuming Kaspa for now, could be extensible
257
- address: realAcc.address,
258
- ...realAcc.privateKeyEnv ? { privateKeyEnv: realAcc.privateKeyEnv } : {},
259
- ...realAcc.privateKey ? { privateKey: realAcc.privateKey } : {}
260
- };
261
- }
262
- const detAccounts = createDeterministicAccounts();
263
- const det = detAccounts.find((a) => a.name === alias);
264
- if (det) {
265
- return {
266
- name: det.name,
267
- kind: "simulated",
268
- address: det.address,
269
- evmAddress: det.evmAddress
270
- };
271
- }
272
- const available = listHardkasAccounts(config).map((a) => a.name).join(", ");
227
+ const available = accounts.map((a) => a.name).join(", ");
273
228
  throw new Error(
274
229
  `Unknown HardKAS account '${nameOrAddress}'. Available accounts: ${available}`
275
230
  );
@@ -280,7 +235,8 @@ function listHardkasAccounts(config) {
280
235
  for (const det of detAccounts) {
281
236
  accounts.set(det.name, {
282
237
  name: det.name,
283
- kind: "simulated",
238
+ kind: "synthetic",
239
+ executionMode: "simulator",
284
240
  address: det.address,
285
241
  evmAddress: det.evmAddress
286
242
  });
@@ -296,14 +252,19 @@ function listHardkasAccounts(config) {
296
252
  const data = fs2.readFileSync(path2.join(devAccountsDir, file), "utf-8");
297
253
  const keystore = JSON.parse(data);
298
254
  if (keystore.type === "hardkas.encryptedKeystore.v2") {
255
+ if (!keystore.metadata?.network) {
256
+ throw new AccountNetworkMismatchError({ expected: "known network", actual: "undefined", detail: `at ${path2.join(devAccountsDir, file)}` });
257
+ }
299
258
  accounts.set(name, {
300
259
  name,
301
- kind: "kaspa-private-key",
260
+ kind: "kaspa",
261
+ network: keystore.metadata.network,
302
262
  address: keystore.payload?.address || keystore.metadata?.address,
303
263
  keystorePath: path2.join(devAccountsDir, file)
304
264
  });
305
265
  }
306
266
  } catch (e) {
267
+ if (e instanceof AccountNetworkMismatchError) throw e;
307
268
  }
308
269
  }
309
270
  }
@@ -314,21 +275,33 @@ function listHardkasAccounts(config) {
314
275
  const data = fs2.readFileSync(keystoreJsonPath, "utf-8");
315
276
  const ks = JSON.parse(data);
316
277
  for (const [name, acc] of Object.entries(ks)) {
278
+ const existing = accounts.get(name);
279
+ const configKind = acc.type === "simulated" ? "synthetic" : "kaspa";
280
+ if (existing && existing.kind !== configKind) {
281
+ console.error(`COLLISION DETECTED for ${name}. existing:`, existing, `configKind:`, configKind, `workspaceRoot:`, workspaceRoot, `keystoreJsonPath:`, keystoreJsonPath);
282
+ throw new CrossWorldAccountCollisionError({ accountId: name, worlds: [existing.kind, configKind] });
283
+ }
317
284
  if (acc.type === "simulated") {
318
285
  accounts.set(name, {
319
286
  name,
320
- kind: "simulated",
287
+ kind: "synthetic",
288
+ executionMode: "simulator",
321
289
  address: acc.address
322
290
  });
323
291
  } else {
292
+ if (!acc.network) {
293
+ throw new AccountNetworkMismatchError({ expected: "known network", actual: "undefined", detail: "in keystore.json" });
294
+ }
324
295
  accounts.set(name, {
325
296
  name,
326
- kind: "kaspa-private-key",
297
+ kind: "kaspa",
298
+ network: acc.network,
327
299
  address: acc.address
328
300
  });
329
301
  }
330
302
  }
331
303
  } catch (e) {
304
+ if (e instanceof CrossWorldAccountCollisionError || e instanceof AccountNetworkMismatchError) throw e;
332
305
  }
333
306
  }
334
307
  const realStore = loadRealAccountStoreSync({ cwd: workspaceRoot });
@@ -336,7 +309,9 @@ function listHardkasAccounts(config) {
336
309
  for (const realAcc of listRealDevAccounts(realStore)) {
337
310
  accounts.set(realAcc.name, {
338
311
  name: realAcc.name,
339
- kind: "kaspa-private-key",
312
+ kind: "kaspa",
313
+ network: "simnet",
314
+ // Wait, listRealDevAccounts returns accounts, does it have network? The legacy real store assumed simnet. We'll leave it as simnet for now, or maybe the store should provide it.
340
315
  address: realAcc.address,
341
316
  ...realAcc.privateKeyEnv ? { privateKeyEnv: realAcc.privateKeyEnv } : {},
342
317
  ...realAcc.privateKey ? { privateKey: realAcc.privateKey } : {}
@@ -353,15 +328,20 @@ function listHardkasAccounts(config) {
353
328
  const data = fs2.readFileSync(path2.join(keystoreDir, file), "utf-8");
354
329
  const keystore = JSON.parse(data);
355
330
  if (keystore.type === "hardkas.encryptedKeystore.v2") {
331
+ if (!keystore.metadata?.network) {
332
+ throw new AccountNetworkMismatchError({ expected: "known network", actual: "undefined", detail: `at ${path2.join(keystoreDir, file)}` });
333
+ }
356
334
  accounts.set(name, {
357
335
  name,
358
- kind: "kaspa-private-key",
336
+ kind: "kaspa",
337
+ network: keystore.metadata.network,
359
338
  address: keystore.payload?.address || keystore.metadata?.address,
360
339
  // Payloads are encrypted, but address might be in metadata
361
340
  keystorePath: path2.join(keystoreDir, file)
362
341
  });
363
342
  }
364
343
  } catch (e) {
344
+ if (e instanceof AccountNetworkMismatchError) throw e;
365
345
  }
366
346
  }
367
347
  }
@@ -369,12 +349,16 @@ function listHardkasAccounts(config) {
369
349
  if (config?.accounts) {
370
350
  for (const [name, accConfig] of Object.entries(config.accounts)) {
371
351
  const existing = accounts.get(name);
372
- if (existing && existing.kind === "kaspa-private-key" && accConfig.kind === "simulated") {
373
- continue;
352
+ const configKind = accConfig.kind === "simulated" ? "synthetic" : accConfig.kind;
353
+ if (existing && existing.kind !== configKind) {
354
+ console.error(`COLLISION DETECTED for ${name}. existing:`, existing, `configKind:`, configKind);
355
+ throw new CrossWorldAccountCollisionError({ accountId: name, worlds: [existing.kind, configKind] });
374
356
  }
375
357
  accounts.set(name, {
376
358
  name,
377
- ...accConfig
359
+ ...accConfig,
360
+ kind: configKind,
361
+ ...configKind === "synthetic" ? { executionMode: "simulator" } : {}
378
362
  });
379
363
  }
380
364
  }
@@ -441,7 +425,7 @@ function describeAccount(account) {
441
425
  if (account.address) {
442
426
  desc.address = account.address;
443
427
  }
444
- if (account.kind === "kaspa-private-key" || account.kind === "evm-private-key") {
428
+ if (account.kind === "kaspa" || account.kind === "evm-private-key") {
445
429
  desc.privateKeyEnv = account.privateKeyEnv;
446
430
  }
447
431
  if (account.kind === "external-wallet" && account.walletId) {
@@ -38,7 +38,9 @@ var PrivateKeyAuthorizer = class {
38
38
  }
39
39
  const tx = wasmTransaction;
40
40
  try {
41
+ console.log("DEBUG: Calling signTransaction");
41
42
  const signedTx = wasm.signTransaction(tx, [privateKey], false);
43
+ console.log("DEBUG: signTransaction OK");
42
44
  const sigScript = signedTx.inputs[inputIndex].signatureScript;
43
45
  if (!sigScript || sigScript.length === 0) {
44
46
  throw new Error(`UNAUTHORIZED_TRANSACTION_INPUT: Kaspa WASM failed to generate a signature script for input ${inputIndex} using account '${this.accountName}'.`);
@@ -61,7 +63,7 @@ var LazyAccountAuthorizer = class {
61
63
  accountName;
62
64
  workspaceRoot;
63
65
  async authorize(context) {
64
- const { resolveHardkasAccount } = await import("./resolve-EXYT2GAC.js");
66
+ const { resolveHardkasAccount } = await import("./resolve-GHZEED5L.js");
65
67
  const account = await resolveHardkasAccount({
66
68
  nameOrAddress: this.accountName,
67
69
  config: { cwd: this.workspaceRoot }
@@ -73,7 +75,7 @@ var LazyAccountAuthorizer = class {
73
75
  if (!pkValue && account.keystorePath) {
74
76
  try {
75
77
  const { KeystoreManager } = await import("./keystore-CMWEKGBF.js");
76
- const { DEV_ACCOUNTS_PASSWORD } = await import("./dev-accounts-FU4XTSGF.js");
78
+ const { DEV_ACCOUNTS_PASSWORD } = await import("./dev-accounts-B6ZVTPCW.js");
77
79
  const keystore = await KeystoreManager.loadEncryptedKeystore(account.keystorePath);
78
80
  const unlock = await KeystoreManager.decryptEncryptedKeystore(keystore, DEV_ACCOUNTS_PASSWORD);
79
81
  if (unlock.success && unlock.payload) {
@@ -4,9 +4,9 @@ import {
4
4
  ensureDevAccounts,
5
5
  getOrCreateDevAccount,
6
6
  listDevAccountsSync
7
- } from "./chunk-TY5CXPHB.js";
8
- import "./chunk-WRRHW2WO.js";
9
- import "./chunk-ILASLDZU.js";
7
+ } from "./chunk-6Q4K4A24.js";
8
+ import "./chunk-R5P3WIWR.js";
9
+ import "./chunk-TRVIQTIO.js";
10
10
  import "./chunk-6DPO5V3N.js";
11
11
  import "./chunk-YLG2NIAU.js";
12
12
  export {
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { TxPlanArtifact, SignedTxArtifact, HardkasArtifactBase } from '@hardkas/artifacts';
2
2
  import { HardkasConfig } from '@hardkas/config';
3
+ import * as _hardkas_core from '@hardkas/core';
3
4
  import { NetworkId } from '@hardkas/core';
4
5
  import { TxPlan } from '@hardkas/tx-builder';
5
6
 
@@ -40,7 +41,7 @@ declare class LazyAccountAuthorizer implements TxInputAuthorizer {
40
41
  authorize(context: TxInputAuthorizationContext): Promise<InputAuthorization>;
41
42
  }
42
43
 
43
- type HardkasAccountKind = "simulated" | "kaspa-private-key" | "external-wallet" | "evm-private-key";
44
+ type HardkasAccountKind = "synthetic" | "kaspa" | "external-wallet" | "evm-private-key";
44
45
  interface KeystorePayload {
45
46
  address: string;
46
47
  privateKey: string;
@@ -87,29 +88,33 @@ interface HardkasBaseAccount {
87
88
  kind: HardkasAccountKind;
88
89
  address?: string;
89
90
  }
90
- interface HardkasSimulatedAccount extends HardkasBaseAccount {
91
- kind: "simulated";
91
+ interface HardkasSyntheticAccount extends HardkasBaseAccount {
92
+ kind: "synthetic";
93
+ executionMode: "simulator";
92
94
  address: string;
93
95
  evmAddress?: string;
94
96
  }
95
- interface HardkasKaspaPrivateKeyAccount extends HardkasBaseAccount {
96
- kind: "kaspa-private-key";
97
- privateKeyEnv?: string | undefined;
98
- keystorePath?: string | undefined;
99
- address?: string;
97
+ interface HardkasKaspaAccount extends HardkasBaseAccount {
98
+ kind: "kaspa";
99
+ network: "simnet" | "testnet-10" | "testnet-11" | "mainnet" | string;
100
+ privateKeyEnv?: string;
101
+ privateKey?: string;
102
+ keystorePath?: string;
103
+ address: string;
100
104
  }
101
105
  interface HardkasExternalWalletAccount extends HardkasBaseAccount {
102
106
  kind: "external-wallet";
107
+ network?: "simnet" | "testnet-10" | "testnet-11" | "mainnet" | string;
103
108
  walletId?: string;
104
109
  address?: string;
105
110
  }
106
111
  interface HardkasEvmPrivateKeyAccount extends HardkasBaseAccount {
107
112
  kind: "evm-private-key";
108
- privateKeyEnv?: string | undefined;
113
+ privateKeyEnv?: string;
109
114
  address?: string;
110
115
  }
111
- type HardkasAccount = HardkasSimulatedAccount | HardkasKaspaPrivateKeyAccount | HardkasExternalWalletAccount | HardkasEvmPrivateKeyAccount;
112
- type HardkasSignerKind = "simulated" | "kaspa-private-key" | "external-wallet" | "unsupported";
116
+ type HardkasAccount = HardkasSyntheticAccount | HardkasKaspaAccount | HardkasExternalWalletAccount | HardkasEvmPrivateKeyAccount;
117
+ type HardkasSignerKind = "synthetic" | "kaspa" | "external-wallet" | "unsupported";
113
118
 
114
119
  interface SignTxPlanInput {
115
120
  planArtifact: any;
@@ -138,8 +143,8 @@ interface HardkasSigner<TTx = unknown, TSignedTx = unknown> {
138
143
  }
139
144
 
140
145
  declare class SimulatedSigner implements HardkasSigner {
141
- readonly account: HardkasSimulatedAccount;
142
- constructor(account: HardkasSimulatedAccount);
146
+ readonly account: HardkasSyntheticAccount;
147
+ constructor(account: HardkasSyntheticAccount);
143
148
  signTransaction(tx: unknown): Promise<unknown>;
144
149
  }
145
150
 
@@ -184,6 +189,7 @@ declare class UnsupportedRealKaspaSigner implements HardkasTxPlanSigner {
184
189
  * Main entry point for signing transaction plan artifacts.
185
190
  */
186
191
  declare function signTxPlanArtifact(input: {
192
+ target: _hardkas_core.HardkasExecutionTarget;
187
193
  planArtifact: TxPlanArtifact;
188
194
  account?: HardkasAccount;
189
195
  authorizers?: Readonly<Record<number, TxInputAuthorizer>>;
@@ -248,6 +254,11 @@ interface CreateKaspaWalletOptions {
248
254
  */
249
255
  declare function createLocalKaspaWallet(options?: CreateKaspaWalletOptions): Promise<GeneratedKaspaDevAccount>;
250
256
 
257
+ interface KaspaWasmSignerOptions {
258
+ account?: HardkasKaspaAccount;
259
+ allowMainnet?: boolean;
260
+ wasmConfig?: WasmProviderConfig;
261
+ }
251
262
  /**
252
263
  * Real Kaspa signer using the official WASM SDK.
253
264
  * Only works if the 'kaspa' package is installed.
@@ -255,11 +266,7 @@ declare function createLocalKaspaWallet(options?: CreateKaspaWalletOptions): Pro
255
266
  declare class KaspaWasmPrivateKeySigner implements HardkasTxPlanSigner {
256
267
  private options;
257
268
  kind: HardkasSignerKind;
258
- constructor(options: {
259
- account?: HardkasKaspaPrivateKeyAccount;
260
- allowMainnet?: boolean | undefined;
261
- wasmConfig?: WasmProviderConfig;
262
- });
269
+ constructor(options: KaspaWasmSignerOptions);
263
270
  signTxPlan(input: SignTxPlanInput): Promise<SignTxPlanResult>;
264
271
  }
265
272
  /**
@@ -558,4 +565,4 @@ declare class WalletStateStoreJson {
558
565
  nextChangeIndex(walletId: string): number;
559
566
  }
560
567
 
561
- export { AddressManager, type ChainType, type CreateKaspaWalletOptions, DEV_ACCOUNTS_PASSWORD, type DeriveRequest, type DerivedAddress, type EncryptedKeystoreV2, type EvmExportResult, type GeneratedKaspaDevAccount, type HardkasAccount, type HardkasAccountKind, type HardkasBaseAccount, type HardkasEvmPrivateKeyAccount, type HardkasExternalWalletAccount, type HardkasKaspaPrivateKeyAccount, type HardkasSigner, type HardkasSignerKind, type HardkasSimulatedAccount, type HardkasTxPlanSigner, type HelperDeriveRequest, type InputAuthorization, type KaspaKeyGenerator, KaspaSdkKeyGenerator, type KaspaSdkKeyGeneratorOptions, KaspaSdkRealTxSigner, type KaspaSdkRealTxSignerOptions, type KaspaSigningBackendStatus, KaspaWasmPrivateKeySigner, type KeystoreCipherParams, type KeystoreKdfParams, KeystoreManager, type KeystorePayload, type KeystoreUnlockResult, LazyAccountAuthorizer, type NetworkType, type PathRequest, PrivateKeyAuthorizer, type RealAccountStore, type RealDevAccount, type RealTxSigner, type RealTxSigningInput, type RealTxSigningResult, type ResolveAccountOptions, type SignTxPlanInput, type SignTxPlanResult, SimulatedSigner, StaticSignatureScriptAuthorizer, type TxInputAuthorizationContext, type TxInputAuthorizer, UnsupportedKaspaKeyGenerator, UnsupportedRealKaspaSigner, UnsupportedRealTxSigner, type WalletArtifact, type WalletClaims, type WalletCreateRequest, type WalletImportRequest, WalletManager, WalletManagerImpl, type WalletMetadata, type WalletState, WalletStateStoreJson, type WalletStateStoreOptions, type WasmInputSigner, type WasmProviderConfig, appendToKeystoreJson, assertSigningNetworkAllowed, createDevSigner, createEmptyRealAccountStore, createLocalKaspaWallet, describeAccount, detectCapabilities, ensureDevAccounts, getDefaultRealAccountsPath, getKaspaSigningBackendStatus, getOrCreateDevAccount, getRealDevAccount, getRequiredEnv, importRealDevAccount, listDevAccountsSync, listHardkasAccounts, listRealDevAccounts, loadKaspaWasm, loadOrCreateRealAccountStore, loadRealAccountStore, loadRealAccountStoreSync, prepareEvmAccountExport, removeRealDevAccount, resolveHardkasAccount, resolveHardkasAccountAddress, resolveRealAccountOrAddress, saveRealAccountStore, signTxPlanArtifact, validateAccountName, validateAddressNetwork, validateAddressPrefix, withKeystoreLock };
568
+ export { AddressManager, type ChainType, type CreateKaspaWalletOptions, DEV_ACCOUNTS_PASSWORD, type DeriveRequest, type DerivedAddress, type EncryptedKeystoreV2, type EvmExportResult, type GeneratedKaspaDevAccount, type HardkasAccount, type HardkasAccountKind, type HardkasBaseAccount, type HardkasEvmPrivateKeyAccount, type HardkasExternalWalletAccount, type HardkasKaspaAccount, type HardkasSigner, type HardkasSignerKind, type HardkasSyntheticAccount, type HardkasTxPlanSigner, type HelperDeriveRequest, type InputAuthorization, type KaspaKeyGenerator, KaspaSdkKeyGenerator, type KaspaSdkKeyGeneratorOptions, KaspaSdkRealTxSigner, type KaspaSdkRealTxSignerOptions, type KaspaSigningBackendStatus, KaspaWasmPrivateKeySigner, type KaspaWasmSignerOptions, type KeystoreCipherParams, type KeystoreKdfParams, KeystoreManager, type KeystorePayload, type KeystoreUnlockResult, LazyAccountAuthorizer, type NetworkType, type PathRequest, PrivateKeyAuthorizer, type RealAccountStore, type RealDevAccount, type RealTxSigner, type RealTxSigningInput, type RealTxSigningResult, type ResolveAccountOptions, type SignTxPlanInput, type SignTxPlanResult, SimulatedSigner, StaticSignatureScriptAuthorizer, type TxInputAuthorizationContext, type TxInputAuthorizer, UnsupportedKaspaKeyGenerator, UnsupportedRealKaspaSigner, UnsupportedRealTxSigner, type WalletArtifact, type WalletClaims, type WalletCreateRequest, type WalletImportRequest, WalletManager, WalletManagerImpl, type WalletMetadata, type WalletState, WalletStateStoreJson, type WalletStateStoreOptions, type WasmInputSigner, type WasmProviderConfig, appendToKeystoreJson, assertSigningNetworkAllowed, createDevSigner, createEmptyRealAccountStore, createLocalKaspaWallet, describeAccount, detectCapabilities, ensureDevAccounts, getDefaultRealAccountsPath, getKaspaSigningBackendStatus, getOrCreateDevAccount, getRealDevAccount, getRequiredEnv, importRealDevAccount, listDevAccountsSync, listHardkasAccounts, listRealDevAccounts, loadKaspaWasm, loadOrCreateRealAccountStore, loadRealAccountStore, loadRealAccountStoreSync, prepareEvmAccountExport, removeRealDevAccount, resolveHardkasAccount, resolveHardkasAccountAddress, resolveRealAccountOrAddress, saveRealAccountStore, signTxPlanArtifact, validateAccountName, validateAddressNetwork, validateAddressPrefix, withKeystoreLock };
package/dist/index.js CHANGED
@@ -6,8 +6,8 @@ import {
6
6
  ensureDevAccounts,
7
7
  getOrCreateDevAccount,
8
8
  listDevAccountsSync
9
- } from "./chunk-TY5CXPHB.js";
10
- import "./chunk-WRRHW2WO.js";
9
+ } from "./chunk-6Q4K4A24.js";
10
+ import "./chunk-R5P3WIWR.js";
11
11
  import {
12
12
  createEmptyRealAccountStore,
13
13
  describeAccount,
@@ -27,7 +27,7 @@ import {
27
27
  validateAccountName,
28
28
  validateAddressNetwork,
29
29
  validateAddressPrefix
30
- } from "./chunk-ILASLDZU.js";
30
+ } from "./chunk-TRVIQTIO.js";
31
31
  import {
32
32
  detectCapabilities,
33
33
  getKaspaSigningBackendStatus,
@@ -40,7 +40,7 @@ import {
40
40
  LazyAccountAuthorizer,
41
41
  PrivateKeyAuthorizer,
42
42
  StaticSignatureScriptAuthorizer
43
- } from "./chunk-MRXCDBKH.js";
43
+ } from "./chunk-YJL7P33W.js";
44
44
 
45
45
  // src/simulated.ts
46
46
  var SimulatedSigner = class {
@@ -134,13 +134,26 @@ var UnsupportedRealKaspaSigner = class {
134
134
  }
135
135
  };
136
136
  async function signTxPlanArtifact(input) {
137
- const { planArtifact, account, authorizers } = input;
137
+ const { target, planArtifact, account, authorizers } = input;
138
138
  const planRecord = planArtifact;
139
139
  if (planArtifact.schema === "hardkas.txPlan") {
140
140
  } else if (planRecord.status !== "built" && planRecord.status !== "unsigned") {
141
141
  throw new Error(`Cannot sign artifact with status: ${planRecord.status}`);
142
142
  }
143
- if (planArtifact.mode === "simulated") {
143
+ const { assertExecutionCompatibility } = await import("@hardkas/core");
144
+ assertExecutionCompatibility({
145
+ operation: "sign",
146
+ target,
147
+ ...account ? {
148
+ account: {
149
+ kind: account.kind,
150
+ ...account.network ? { network: account.network } : {},
151
+ ...account.executionMode ? { executionMode: account.executionMode } : {}
152
+ }
153
+ } : {},
154
+ artifact: { execution: planArtifact.execution }
155
+ });
156
+ if (planArtifact.mode === "simulator") {
144
157
  return createSimulatedSignedTxArtifact(
145
158
  planArtifact,
146
159
  `simulated-signed-tx:${planArtifact.planId}`,
@@ -152,12 +165,12 @@ async function signTxPlanArtifact(input) {
152
165
  "Mainnet signing is disabled by default. Use --allow-mainnet-signing only if you understand the risks."
153
166
  );
154
167
  }
155
- if (account && account.kind === "simulated") {
168
+ if (account && account.kind === "synthetic") {
156
169
  throw new Error(
157
- `Real Kaspa transaction plans (mode: ${planArtifact.mode}) cannot be signed with simulated accounts.`
170
+ `Real Kaspa transaction plans (mode: ${planArtifact.mode}) cannot be signed with synthetic accounts.`
158
171
  );
159
172
  }
160
- if (!account || account.kind === "kaspa-private-key" || typeof account.authorize === "function") {
173
+ if (!account || account.kind === "kaspa" || typeof account.authorize === "function") {
161
174
  const status = await getKaspaSigningBackendStatus(input.config?.wasm);
162
175
  if (!status.available) {
163
176
  throw new Error(
@@ -196,6 +209,7 @@ async function signTxPlanArtifact(input) {
196
209
  payload: result.signedTransaction?.payload || ""
197
210
  },
198
211
  lineage: createLineageTransition(planArtifact, "hardkas.signedTx"),
212
+ ...planArtifact.execution ? { execution: planArtifact.execution } : {},
199
213
  ...planArtifact.workflowId ? { workflowId: planArtifact.workflowId } : {},
200
214
  ...planArtifact.assumptionLevel ? { assumptionLevel: planArtifact.assumptionLevel } : {},
201
215
  ...planArtifact.policyRefs ? { policyRefs: planArtifact.policyRefs } : {},
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  parseWasmTxToRpc
3
- } from "../chunk-WRRHW2WO.js";
3
+ } from "../chunk-R5P3WIWR.js";
4
4
  export {
5
5
  parseWasmTxToRpc
6
6
  };
@@ -3,7 +3,7 @@ import {
3
3
  listHardkasAccounts,
4
4
  resolveHardkasAccount,
5
5
  resolveHardkasAccountAddress
6
- } from "./chunk-ILASLDZU.js";
6
+ } from "./chunk-TRVIQTIO.js";
7
7
  export {
8
8
  describeAccount,
9
9
  listHardkasAccounts,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hardkas/accounts",
3
- "version": "0.11.4-alpha",
3
+ "version": "0.12.0-rc.1",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -24,11 +24,11 @@
24
24
  "dependencies": {
25
25
  "hash-wasm": "^4.12.0",
26
26
  "kaspa-wasm": "0.13.0",
27
- "@hardkas/tx-builder": "0.11.4-alpha",
28
- "@hardkas/artifacts": "0.11.4-alpha",
29
- "@hardkas/config": "0.11.4-alpha",
30
- "@hardkas/core": "0.11.4-alpha",
31
- "@hardkas/localnet": "0.11.4-alpha"
27
+ "@hardkas/artifacts": "0.12.0-rc.1",
28
+ "@hardkas/tx-builder": "0.12.0-rc.1",
29
+ "@hardkas/localnet": "0.12.0-rc.1",
30
+ "@hardkas/config": "0.12.0-rc.1",
31
+ "@hardkas/core": "0.12.0-rc.1"
32
32
  },
33
33
  "devDependencies": {
34
34
  "tsup": "^8.3.5",