@chainvue/verus-sdk 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +1 -0
  2. package/dist/VerusSDK.d.ts +4 -1
  3. package/dist/VerusSDK.d.ts.map +1 -1
  4. package/dist/VerusSDK.js +6 -2
  5. package/dist/VerusSDK.js.map +1 -1
  6. package/dist/assemble/assembler.d.ts +66 -0
  7. package/dist/assemble/assembler.d.ts.map +1 -0
  8. package/dist/assemble/assembler.js +155 -0
  9. package/dist/assemble/assembler.js.map +1 -0
  10. package/dist/assemble/fundedIdentityUpdate.d.ts +35 -0
  11. package/dist/assemble/fundedIdentityUpdate.d.ts.map +1 -0
  12. package/dist/assemble/fundedIdentityUpdate.js +114 -0
  13. package/dist/assemble/fundedIdentityUpdate.js.map +1 -0
  14. package/dist/bundle.js +29248 -29255
  15. package/dist/currency/index.d.ts.map +1 -1
  16. package/dist/currency/index.js +32 -66
  17. package/dist/currency/index.js.map +1 -1
  18. package/dist/fork/boundary.d.ts +19 -0
  19. package/dist/fork/boundary.d.ts.map +1 -0
  20. package/dist/fork/boundary.js +49 -0
  21. package/dist/fork/boundary.js.map +1 -0
  22. package/dist/fork-shims.d.ts +7 -0
  23. package/dist/identity/index.d.ts +18 -17
  24. package/dist/identity/index.d.ts.map +1 -1
  25. package/dist/identity/index.js +315 -307
  26. package/dist/identity/index.js.map +1 -1
  27. package/dist/identity/public.d.ts +21 -0
  28. package/dist/identity/public.d.ts.map +1 -0
  29. package/dist/identity/public.js +38 -0
  30. package/dist/identity/public.js.map +1 -0
  31. package/dist/index.d.ts +2 -2
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +2 -1
  34. package/dist/index.js.map +1 -1
  35. package/dist/keys/index.d.ts.map +1 -1
  36. package/dist/keys/index.js +9 -0
  37. package/dist/keys/index.js.map +1 -1
  38. package/dist/message/index.js +7 -7
  39. package/dist/message/index.js.map +1 -1
  40. package/dist/signing/index.d.ts +13 -4
  41. package/dist/signing/index.d.ts.map +1 -1
  42. package/dist/signing/index.js +27 -14
  43. package/dist/signing/index.js.map +1 -1
  44. package/dist/transfer/index.d.ts.map +1 -1
  45. package/dist/transfer/index.js +40 -56
  46. package/dist/transfer/index.js.map +1 -1
  47. package/dist/types/index.d.ts +20 -48
  48. package/dist/types/index.d.ts.map +1 -1
  49. package/dist/types/index.js +6 -0
  50. package/dist/types/index.js.map +1 -1
  51. package/dist/utils/index.d.ts.map +1 -1
  52. package/dist/utils/index.js +6 -11
  53. package/dist/utils/index.js.map +1 -1
  54. package/dist/utxo/index.d.ts.map +1 -1
  55. package/dist/utxo/index.js +12 -4
  56. package/dist/utxo/index.js.map +1 -1
  57. package/package.json +1 -1
package/README.md CHANGED
@@ -66,6 +66,7 @@ Per-area guides, plus runnable offline examples in [`examples/`](./examples):
66
66
  | [transfers](./docs/transfers.md) | `transfer` / `transferToken` / `convert` / `sendCurrency`, UTXOs, change, re-validation |
67
67
  | [VerusID lifecycle](./docs/identity.md) | commit → register, update, lock/unlock, revoke/recover, sign/verify messages |
68
68
  | [signing & wire format](./docs/signing-and-wire.md) | why the bytes are the daemon's, the self-contained bundle, the proof rings |
69
+ | [architecture](./docs/architecture.md) | the fork boundary, the two assemblers, what's unrepresentable vs checked, the differential harness |
69
70
  | [testing](./docs/testing.md) | the gate, the plain-`node` rule, the live-proof ring model |
70
71
 
71
72
  ## Contributing
@@ -25,7 +25,10 @@ export declare class VerusSDK {
25
25
  registerIdentity(params: RegisterIdentityParams): RegisterIdentityResult;
26
26
  /** Update an existing identity (change primary addresses, authorities, content) */
27
27
  updateIdentity(params: UpdateIdentityParams): UpdateIdentityResult;
28
- /** Lock an identity until a specified block height */
28
+ /**
29
+ * Lock an identity for a RELATIVE delay of `unlockDelayBlocks` blocks (NOT an
30
+ * absolute block height — passing a height locks the identity for years).
31
+ */
29
32
  lockIdentity(params: LockIdentityParams): UpdateIdentityResult;
30
33
  /** Initiate identity unlock */
31
34
  unlockIdentity(params: UnlockIdentityParams): UpdateIdentityResult;
@@ -1 +1 @@
1
- {"version":3,"file":"VerusSDK.d.ts","sourceRoot":"","sources":["../src/VerusSDK.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAQ1B,qBAAa,QAAQ;IACnB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAEd,MAAM,EAAE,cAAc;IAMlC,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,kBAAkB;IAIpD,8BAA8B;IAC9B,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,kBAAkB;IAI9D,0BAA0B;IAC1B,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,kBAAkB;IAIlD,iEAAiE;IACjE,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB;IAI5D,gDAAgD;IAChD,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc;IAMxD,4DAA4D;IAC5D,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,sBAAsB;IAIxE,yDAAyD;IACzD,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,sBAAsB;IAIxE,mFAAmF;IACnF,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,oBAAoB;IAIlE,sDAAsD;IACtD,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,oBAAoB;IAgB9D,+BAA+B;IAC/B,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,oBAAoB;IAelE,6DAA6D;IAC7D,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,oBAAoB;IAelE,4DAA4D;IAC5D,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,oBAAoB;IAoBpE,6DAA6D;IAC7D,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,oBAAoB;IAMlE,uDAAuD;IACvD,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB;IAIzD,yCAAyC;IACzC,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,mBAAmB;IAM/D,4CAA4C;WAC/B,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIxD,gEAAgE;IAChE,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM;IAI3E,4CAA4C;IAC5C,MAAM,CAAC,WAAW,IAAI,MAAM;IAI5B,iCAAiC;IACjC,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAI3E,iCAAiC;IACjC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;CAGpE"}
1
+ {"version":3,"file":"VerusSDK.d.ts","sourceRoot":"","sources":["../src/VerusSDK.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,oBAAoB,EACpB,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,kBAAkB,CAAC;AAQ1B,qBAAa,QAAQ;IACnB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;gBAEd,MAAM,EAAE,cAAc;IAMlC,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,cAAc,GAAG,kBAAkB;IAIpD,8BAA8B;IAC9B,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,kBAAkB;IAI9D,0BAA0B;IAC1B,OAAO,CAAC,MAAM,EAAE,aAAa,GAAG,kBAAkB;IAIlD,iEAAiE;IACjE,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,kBAAkB;IAI5D,gDAAgD;IAChD,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,cAAc;IAMxD,4DAA4D;IAC5D,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,sBAAsB;IAIxE,yDAAyD;IACzD,gBAAgB,CAAC,MAAM,EAAE,sBAAsB,GAAG,sBAAsB;IAIxE,mFAAmF;IACnF,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,oBAAoB;IAIlE;;;OAGG;IACH,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,oBAAoB;IAgB9D,+BAA+B;IAC/B,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,oBAAoB;IAelE,6DAA6D;IAC7D,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,oBAAoB;IAelE,4DAA4D;IAC5D,eAAe,CAAC,MAAM,EAAE,qBAAqB,GAAG,oBAAoB;IAqBpE,6DAA6D;IAC7D,cAAc,CAAC,MAAM,EAAE,oBAAoB,GAAG,oBAAoB;IAMlE,uDAAuD;IACvD,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB;IAIzD,yCAAyC;IACzC,aAAa,CAAC,MAAM,EAAE,mBAAmB,GAAG,mBAAmB;IAM/D,4CAA4C;WAC/B,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAIxD,gEAAgE;IAChE,MAAM,CAAC,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM;IAI3E,4CAA4C;IAC5C,MAAM,CAAC,WAAW,IAAI,MAAM;IAI5B,iCAAiC;IACjC,MAAM,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAI3E,iCAAiC;IACjC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;CAGpE"}
package/dist/VerusSDK.js CHANGED
@@ -83,7 +83,10 @@ class VerusSDK {
83
83
  updateIdentity(params) {
84
84
  return identityModule.buildAndSignIdentityUpdate(params, this.network, 'update');
85
85
  }
86
- /** Lock an identity until a specified block height */
86
+ /**
87
+ * Lock an identity for a RELATIVE delay of `unlockDelayBlocks` blocks (NOT an
88
+ * absolute block height — passing a height locks the identity for years).
89
+ */
87
90
  lockIdentity(params) {
88
91
  return identityModule.buildAndSignIdentityUpdate({
89
92
  wif: params.wif,
@@ -92,7 +95,7 @@ class VerusSDK {
92
95
  utxos: params.utxos,
93
96
  changeAddress: params.changeAddress,
94
97
  expiryHeight: params.expiryHeight,
95
- }, this.network, 'lock', { unlockAfter: params.unlockAfter });
98
+ }, this.network, 'lock', { unlockDelayBlocks: params.unlockDelayBlocks, sanityOverride: params.sanityOverride ?? false });
96
99
  }
97
100
  /** Initiate identity unlock */
98
101
  unlockIdentity(params) {
@@ -125,6 +128,7 @@ class VerusSDK {
125
128
  utxos: params.utxos,
126
129
  changeAddress: params.changeAddress,
127
130
  ...(params.primaryAddresses !== undefined ? { primaryAddresses: params.primaryAddresses } : {}),
131
+ ...(params.minSigs !== undefined ? { minSigs: params.minSigs } : {}),
128
132
  ...(params.revocationAuthority !== undefined ? { revocationAuthority: params.revocationAuthority } : {}),
129
133
  ...(params.recoveryAuthority !== undefined ? { recoveryAuthority: params.recoveryAuthority } : {}),
130
134
  expiryHeight: params.expiryHeight,
@@ -1 +1 @@
1
- {"version":3,"file":"VerusSDK.js","sourceRoot":"","sources":["../src/VerusSDK.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VerusSDK.js","sourceRoot":"","sources":["../src/VerusSDK.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import type { Network } from '../constants/index.js';
2
+ import type { Utxo } from '../types/index.js';
3
+ /** One output the caller declares. */
4
+ export interface IntentOutput {
5
+ /** Pre-built output scriptPubKey (identity, reservation, fee, payment, …). */
6
+ script: Buffer;
7
+ /** Native satoshis carried on the output. */
8
+ nativeSat: bigint;
9
+ /** Non-native currencies the script pays out (e.g. a reserve fee output) — used
10
+ * to derive the token funding requirement and the token-conservation check. */
11
+ carries?: Map<string, bigint>;
12
+ }
13
+ export interface TxIntent {
14
+ network: Network;
15
+ /** WIF signing every input (single-key paths only). */
16
+ wif: string;
17
+ expiryHeight: number;
18
+ funding: Utxo[];
19
+ /** Inputs added before the funding inputs (e.g. a name-commitment UTXO). They
20
+ * carry 0 token value; their native value folds into the fee. */
21
+ leadingInputs?: Utxo[];
22
+ /** Declared outputs, emitted in order before change. */
23
+ outputs: IntentOutput[];
24
+ changeAddress: string;
25
+ /** Whether the outputs are CryptoCondition (smart) outputs — drives fee sizing. */
26
+ hasSmartOutputs?: boolean;
27
+ /** Extra bytes for fee sizing when a pre-built output dwarfs the fixed estimate. */
28
+ extraOutputBytes?: number;
29
+ /** Output count fed to the fee estimator; defaults to the declared outputs.
30
+ * Override only to reproduce a legacy per-path estimate byte-for-byte. */
31
+ feeOutputCount?: number;
32
+ /** Token funding requirement, when the outputs are pre-built by the fork
33
+ * (createUnfundedCurrencyTransfer) and their carried token value can't be read
34
+ * back off the opaque scripts. When set, it REPLACES the per-output `carries`
35
+ * derivation. Drives both selection and the token-conservation check. */
36
+ requiredCurrencies?: Map<string, bigint>;
37
+ /** How change is emitted. `bundled` (default) rides the native change on the
38
+ * token-change reserve output (the identity/registration convention). `separate`
39
+ * emits the token change with only its structural native value plus a distinct
40
+ * native-change output (the fork's currency-transfer convention). */
41
+ changeStrategy?: 'bundled' | 'separate';
42
+ /** `estimate` sizes the fee from the tx. `declared` names an intentional
43
+ * implicit burn — native that leaves BEYOND the outputs and the miner fee
44
+ * (e.g. the registration fee): it is added to the funding requirement and
45
+ * bounds the signing-time fee-rate cap, so it can never be an accident. */
46
+ fee: {
47
+ policy: 'estimate';
48
+ } | {
49
+ policy: 'declared';
50
+ burnSat: bigint;
51
+ reason: string;
52
+ };
53
+ /** Label used in conservation error messages. */
54
+ label: string;
55
+ }
56
+ export interface AssembledTx {
57
+ signedTx: string;
58
+ txid: string;
59
+ fee: bigint;
60
+ nativeChange: bigint;
61
+ currencyChanges: Map<string, bigint>;
62
+ selected: Utxo[];
63
+ inputsUsed: number;
64
+ }
65
+ export declare function assembleAndSign(intent: TxIntent): AssembledTx;
66
+ //# sourceMappingURL=assembler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assembler.d.ts","sourceRoot":"","sources":["../../src/assemble/assembler.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAE9C,sCAAsC;AACtC,MAAM,WAAW,YAAY;IAC3B,8EAA8E;IAC9E,MAAM,EAAE,MAAM,CAAC;IACf,6CAA6C;IAC7C,SAAS,EAAE,MAAM,CAAC;IAClB;oFACgF;IAChF,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,uDAAuD;IACvD,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,IAAI,EAAE,CAAC;IAChB;sEACkE;IAClE,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC;IACvB,wDAAwD;IACxD,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,mFAAmF;IACnF,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oFAAoF;IACpF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;+EAC2E;IAC3E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;8EAG0E;IAC1E,kBAAkB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC;;;0EAGsE;IACtE,cAAc,CAAC,EAAE,SAAS,GAAG,UAAU,CAAC;IACxC;;;gFAG4E;IAC5E,GAAG,EAAE;QAAE,MAAM,EAAE,UAAU,CAAA;KAAE,GAAG;QAAE,MAAM,EAAE,UAAU,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACtF,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACrC,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,QAAQ,GAAG,WAAW,CAsJ7D"}
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assembleAndSign = assembleAndSign;
4
+ /**
5
+ * The single transaction assembler.
6
+ *
7
+ * Every value-moving path funnels through here as a thin `TxIntent`: the caller
8
+ * declares its inputs and the outputs it wants (with each output's native value
9
+ * and any token value the script carries); the assembler derives the funding
10
+ * requirements, selects UTXOs, emits change, and enforces native + token value
11
+ * conservation on the assembled transaction BY CONSTRUCTION. A path can no
12
+ * longer forget a conservation assert, drop token change, or hand-roll a
13
+ * change-emission block that drifts from the others — those were whole classes
14
+ * of bug. Fees are either estimated (selectUtxos) or DECLARED with an intent
15
+ * (registration's implicit burn); an unnamed implicit fee is unrepresentable.
16
+ *
17
+ * Ported flows must stay byte-identical to the Phase-0 golden snapshots.
18
+ */
19
+ const boundary_js_1 = require("../fork/boundary.js");
20
+ const index_js_1 = require("../utxo/index.js");
21
+ const index_js_2 = require("../signing/index.js");
22
+ const index_js_3 = require("../utils/index.js");
23
+ const index_js_4 = require("../constants/index.js");
24
+ const index_js_5 = require("../identity/index.js");
25
+ const brands_js_1 = require("../core/brands.js");
26
+ const errors_js_1 = require("../errors.js");
27
+ function assembleAndSign(intent) {
28
+ const verusNetwork = (0, index_js_2.getNetwork)(intent.network === 'testnet');
29
+ const systemId = index_js_4.NETWORK_CONFIG[intent.network].chainId;
30
+ // Leading inputs sit OUTSIDE the token-conservation check below (which only
31
+ // sees the funding selection), so a leading input carrying token value would be
32
+ // silently burned. Fail closed. Today the only leading input is the SDK-built
33
+ // name-commitment UTXO, which carries none — this enforces the assumption the
34
+ // TxIntent doc states instead of trusting it.
35
+ for (const u of intent.leadingInputs ?? []) {
36
+ // Native on a leading input folds into the fee (burned to miner), so reject it
37
+ // — matching the identity-respend assembler, which fails closed on a nonzero
38
+ // identity UTXO. A name-commitment output is value 0.
39
+ if (u.satoshis !== 0n) {
40
+ throw new errors_js_1.TransactionBuildError(`${intent.label}: leading input ${u.txid}:${u.outputIndex} carries ${u.satoshis} native satoshis, ` +
41
+ `which would be burned to miner fee. Spend that value separately first.`);
42
+ }
43
+ let currencyValues;
44
+ try {
45
+ ({ currencyValues } = (0, index_js_1.decodeUtxo)(u, systemId));
46
+ }
47
+ catch {
48
+ // Undecodable smart output — e.g. the name-commitment's eval-17 CC, which
49
+ // unpackOutput doesn't model. It is not a reserve output, so it carries no
50
+ // token value. A token-bearing leading input IS a reserve output (eval 8/9)
51
+ // and decodes cleanly, so it is still caught below.
52
+ continue;
53
+ }
54
+ for (const [currency, amount] of currencyValues) {
55
+ if (currency !== systemId && amount > 0n) {
56
+ throw new errors_js_1.TransactionBuildError(`${intent.label}: leading input ${u.txid}:${u.outputIndex} carries ${amount} of ${currency}, ` +
57
+ `which is outside token conservation and would be burned. Fund token-bearing inputs through the funding path.`);
58
+ }
59
+ }
60
+ }
61
+ // Funding requirements are DERIVED from the declared outputs — never restated
62
+ // by the caller (the token-burn class came from a path building these by hand).
63
+ // A declared implicit burn (registration fee) is native that must be funded
64
+ // but leaves as fee rather than to an output, so it adds to the native need.
65
+ const burnSat = intent.fee.policy === 'declared' ? intent.fee.burnSat : 0n;
66
+ let requiredNative = burnSat;
67
+ // Token requirement: an explicit override (fork-built outputs) replaces the
68
+ // per-output carries; otherwise it is summed from the outputs' declared carries.
69
+ const requiredCurrencies = new Map(intent.requiredCurrencies ?? []);
70
+ for (const o of intent.outputs) {
71
+ requiredNative += o.nativeSat;
72
+ if (!intent.requiredCurrencies && o.carries) {
73
+ for (const [c, v] of o.carries)
74
+ requiredCurrencies.set(c, (requiredCurrencies.get(c) ?? 0n) + v);
75
+ }
76
+ }
77
+ const selection = (0, index_js_1.selectUtxos)(intent.funding, requiredNative, requiredCurrencies, intent.feeOutputCount ?? intent.outputs.length, systemId, undefined, intent.hasSmartOutputs ?? true, intent.extraOutputBytes ?? 0);
78
+ const txb = new boundary_js_1.TransactionBuilder(verusNetwork);
79
+ txb.setVersion(4);
80
+ txb.setExpiryHeight((0, index_js_2.resolveExpiryHeight)(intent.expiryHeight));
81
+ txb.setVersionGroupId(index_js_4.VERSION_GROUP_ID);
82
+ const leading = intent.leadingInputs ?? [];
83
+ const allUtxos = [...leading, ...selection.selected];
84
+ for (const utxo of allUtxos) {
85
+ txb.addInput(Buffer.from(utxo.txid, 'hex').reverse(), utxo.outputIndex, 0xffffffff, Buffer.from(utxo.script, 'hex'));
86
+ }
87
+ for (const o of intent.outputs) {
88
+ txb.addOutput(o.script, (0, index_js_3.toSafeNumber)(o.nativeSat));
89
+ }
90
+ // Change, emitted in one place — bundled onto the reserve output or as a
91
+ // separate native output (per changeStrategy). utxo-lib's addOutput only
92
+ // resolves base58 R-addresses, so an i-address change needs the explicit P2ID
93
+ // script.
94
+ const hasTokenChange = selection.currencyChanges.size > 0;
95
+ const emitNativeChange = (value) => {
96
+ if (intent.changeAddress.startsWith('i')) {
97
+ txb.addOutput((0, index_js_5.identityPaymentScript)((0, brands_js_1.parseIAddress)(intent.changeAddress, 'changeAddress')), (0, index_js_3.toSafeNumber)(value));
98
+ }
99
+ else {
100
+ txb.addOutput(intent.changeAddress, (0, index_js_3.toSafeNumber)(value));
101
+ }
102
+ };
103
+ if ((intent.changeStrategy ?? 'bundled') === 'separate') {
104
+ // Token change carries only its own structural native value; the native change
105
+ // is a distinct output (the fork's currency-transfer convention).
106
+ if (hasTokenChange) {
107
+ const tokenChange = (0, index_js_5.buildTokenChangeOutput)((0, brands_js_1.parseAddress)(intent.changeAddress, 'changeAddress'), selection.currencyChanges);
108
+ txb.addOutput(tokenChange.script, (0, index_js_3.toSafeNumber)(tokenChange.nativeValue));
109
+ }
110
+ if (selection.nativeChange > 0n)
111
+ emitNativeChange(selection.nativeChange);
112
+ }
113
+ else if (hasTokenChange || selection.nativeChange > 0n) {
114
+ // Bundled: the native change rides on the token-change reserve output.
115
+ if (hasTokenChange) {
116
+ const tokenChange = (0, index_js_5.buildTokenChangeOutput)((0, brands_js_1.parseAddress)(intent.changeAddress, 'changeAddress'), selection.currencyChanges);
117
+ txb.addOutput(tokenChange.script, (0, index_js_3.toSafeNumber)(selection.nativeChange));
118
+ }
119
+ else {
120
+ emitNativeChange(selection.nativeChange);
121
+ }
122
+ }
123
+ const unsignedTx = txb.buildIncomplete();
124
+ // Conservation postconditions on the assembled transaction.
125
+ //
126
+ // The token check is a CONSISTENCY check, not an independent audit:
127
+ // selection.currencyChanges was computed by selectUtxos as (inputs −
128
+ // requiredCurrencies), so `inputs == requiredCurrencies + change` holds by
129
+ // construction. It catches a re-decode disagreement between the two calls, or a
130
+ // `requiredCurrencies` override (sendCurrency) that doesn't match the funded
131
+ // token value — NOT a per-currency semantic error. For currency transfers, the
132
+ // semantic audit (conversion, export, fee-currency accounting) is
133
+ // validateFundedTransaction, which sendCurrency runs on the signed hex.
134
+ (0, index_js_1.assertTokenConservation)(selection.selected, requiredCurrencies, selection.currencyChanges, systemId, intent.label);
135
+ // The native check IS an independent audit: inputs − outputs must equal the
136
+ // intended fee = miner fee + any declared burn. Leading inputs are guarded to 0
137
+ // native above, so their term is 0; it stays explicit as honest accounting.
138
+ const leadingNative = leading.reduce((sum, u) => sum + u.satoshis, 0n);
139
+ const expectedFee = selection.fee + burnSat + leadingNative;
140
+ (0, index_js_2.assertNativeConservation)(allUtxos, unsignedTx.outs, expectedFee, intent.label);
141
+ // A declared burn tells the fork's absurd-fee-rate cap the intended absolute
142
+ // fee, or build() rejects the (legitimately large) registration burn.
143
+ const maxFeeSats = intent.fee.policy === 'declared' ? expectedFee : undefined;
144
+ const { signedTx, txid } = (0, index_js_2.signTransactionSmart)(unsignedTx.toHex(), intent.wif, allUtxos, verusNetwork, maxFeeSats);
145
+ return {
146
+ signedTx,
147
+ txid,
148
+ fee: selection.fee,
149
+ nativeChange: selection.nativeChange,
150
+ currencyChanges: selection.currencyChanges,
151
+ selected: selection.selected,
152
+ inputsUsed: allUtxos.length,
153
+ };
154
+ }
155
+ //# sourceMappingURL=assembler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assembler.js","sourceRoot":"","sources":["../../src/assemble/assembler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { Network } from '../constants/index.js';
2
+ import type { Utxo } from '../types/index.js';
3
+ /** One pre-built output, added before change. */
4
+ export interface FundedUpdateOutput {
5
+ script: Buffer;
6
+ nativeSat: bigint;
7
+ }
8
+ export interface FundedIdentityUpdateIntent {
9
+ network: Network;
10
+ wif: string;
11
+ expiryHeight: number;
12
+ funding: Utxo[];
13
+ /** The identity UTXO — respent, its definition output recreated at value 0,
14
+ * and re-signed last by the fork. Must carry 0 native (else it burns to fee). */
15
+ identityUtxo: Utxo;
16
+ /** Pre-built outputs (the recreated identity output, plus e.g. a currency
17
+ * definition), emitted before change. Native funding is derived from them. */
18
+ outputs: FundedUpdateOutput[];
19
+ changeAddress: string;
20
+ /** Extra output bytes for fee sizing — the identity/definition scripts are
21
+ * large, so the caller passes their real byte length. */
22
+ extraOutputBytes: number;
23
+ /** Label used in conservation error messages. */
24
+ label: string;
25
+ }
26
+ export interface FundedIdentityUpdateResult {
27
+ signedTx: string;
28
+ txid: string;
29
+ fee: bigint;
30
+ nativeChange: bigint;
31
+ selected: Utxo[];
32
+ inputsUsed: number;
33
+ }
34
+ export declare function assembleFundedIdentityUpdate(intent: FundedIdentityUpdateIntent): FundedIdentityUpdateResult;
35
+ //# sourceMappingURL=fundedIdentityUpdate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fundedIdentityUpdate.d.ts","sourceRoot":"","sources":["../../src/assemble/fundedIdentityUpdate.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAI9C,iDAAiD;AACjD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,IAAI,EAAE,CAAC;IAChB;sFACkF;IAClF,YAAY,EAAE,IAAI,CAAC;IACnB;mFAC+E;IAC/E,OAAO,EAAE,kBAAkB,EAAE,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB;8DAC0D;IAC1D,gBAAgB,EAAE,MAAM,CAAC;IACzB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,0BAA0B,GACjC,0BAA0B,CAqH5B"}
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assembleFundedIdentityUpdate = assembleFundedIdentityUpdate;
4
+ /**
5
+ * The assembler for identity-input-respending transactions.
6
+ *
7
+ * A distinct shape from the value-output assembler (`assembler.ts`): these flows
8
+ * (identity update / revoke / recover / lock / unlock, and currency definition)
9
+ * respend the identity's own UTXO and RECREATE its definition output, which the
10
+ * fork must re-sign LAST via `completeFundedIdentityUpdate`. So the tx is built
11
+ * with the funding inputs + pre-built outputs, THEN the identity input is grafted
12
+ * on and the whole thing completed — the value-output assembler's leading-input
13
+ * model doesn't fit.
14
+ *
15
+ * Both callers previously hand-rolled this identical dance (select → build →
16
+ * native change → complete → dual-conservation → sign); it lived in two places
17
+ * and drifted. Centralising it here removes the duplication and makes the
18
+ * value-conservation checks postconditions of the one code path.
19
+ *
20
+ * These paths pay only native (fee + any output value) and emit no token change,
21
+ * so a token-bearing funding UTXO would be silently dropped — the token check
22
+ * fails closed if one is selected. Ported flows stay byte-identical to the
23
+ * Phase-0 goldens.
24
+ */
25
+ const boundary_js_1 = require("../fork/boundary.js");
26
+ const index_js_1 = require("../utxo/index.js");
27
+ const index_js_2 = require("../signing/index.js");
28
+ const index_js_3 = require("../utils/index.js");
29
+ const index_js_4 = require("../constants/index.js");
30
+ const index_js_5 = require("../identity/index.js");
31
+ const brands_js_1 = require("../core/brands.js");
32
+ const errors_js_1 = require("../errors.js");
33
+ const { completeFundedIdentityUpdate } = boundary_js_1.smarttxs;
34
+ function assembleFundedIdentityUpdate(intent) {
35
+ const verusNetwork = (0, index_js_2.getNetwork)(intent.network === 'testnet');
36
+ const systemId = index_js_4.NETWORK_CONFIG[intent.network].chainId;
37
+ const requiredNative = intent.outputs.reduce((sum, o) => sum + o.nativeSat, 0n);
38
+ const selection = (0, index_js_1.selectUtxos)(intent.funding, requiredNative, new Map(), intent.outputs.length, systemId, undefined, true, intent.extraOutputBytes);
39
+ // These paths emit no token-change output, so a token-bearing funding UTXO
40
+ // would be silently dropped; fail closed if one entered (both maps empty ⇒
41
+ // assert no token value is present).
42
+ (0, index_js_1.assertTokenConservation)(selection.selected, new Map(), new Map(), systemId, intent.label);
43
+ const txb = new boundary_js_1.TransactionBuilder(verusNetwork);
44
+ txb.setVersion(4);
45
+ txb.setExpiryHeight((0, index_js_2.resolveExpiryHeight)(intent.expiryHeight));
46
+ txb.setVersionGroupId(index_js_4.VERSION_GROUP_ID);
47
+ for (const utxo of selection.selected) {
48
+ txb.addInput(Buffer.from(utxo.txid, 'hex').reverse(), utxo.outputIndex, 0xffffffff, Buffer.from(utxo.script, 'hex'));
49
+ }
50
+ for (const o of intent.outputs) {
51
+ txb.addOutput(o.script, (0, index_js_3.toSafeNumber)(o.nativeSat));
52
+ }
53
+ if (selection.nativeChange > 0n) {
54
+ // utxo-lib's addOutput only resolves base58 R-addresses; an i-address
55
+ // changeAddress needs the explicit P2ID script or it throws "no matching Script".
56
+ if (intent.changeAddress.startsWith('i')) {
57
+ txb.addOutput((0, index_js_5.identityPaymentScript)((0, brands_js_1.parseIAddress)(intent.changeAddress, 'changeAddress')), (0, index_js_3.toSafeNumber)(selection.nativeChange));
58
+ }
59
+ else {
60
+ txb.addOutput(intent.changeAddress, (0, index_js_3.toSafeNumber)(selection.nativeChange));
61
+ }
62
+ }
63
+ const fundedHex = txb.buildIncomplete().toHex();
64
+ const prevOutScripts = selection.selected.map((u) => Buffer.from(u.script, 'hex'));
65
+ const idUtxo = intent.identityUtxo;
66
+ // The identity input is spent and its definition output recreated with value 0,
67
+ // so any native value on idUtxo would be silently burned to miner fee.
68
+ if (idUtxo.satoshis !== 0n) {
69
+ throw new errors_js_1.TransactionBuildError(`identityUtxo carries ${idUtxo.satoshis} native satoshis, which would be burned to miner fee ` +
70
+ `(the recreated identity output is value 0). Spend that value separately before this operation.`);
71
+ }
72
+ // The identity input is grafted on AFTER assertTokenConservation ran over
73
+ // selection.selected, so any token value it carries sits outside conservation
74
+ // accounting entirely and would be silently dropped. Mirrors the value-output
75
+ // assembler's leading-input guard: enforce the assumption this module's doc
76
+ // comment states rather than trusting it.
77
+ let idCurrencyValues;
78
+ try {
79
+ ({ currencyValues: idCurrencyValues } = (0, index_js_1.decodeUtxo)(idUtxo, systemId));
80
+ }
81
+ catch {
82
+ // An identity output is an EVAL_IDENTITY_PRIMARY CC that decodeUtxo does not
83
+ // model as a value-bearing output, so a failed decode is the NORMAL path
84
+ // here. A token-bearing UTXO is a reserve output (eval 8/9), which decodes
85
+ // cleanly and is still caught below.
86
+ idCurrencyValues = new Map();
87
+ }
88
+ for (const [currency, amount] of idCurrencyValues) {
89
+ if (currency !== systemId && amount > 0n) {
90
+ throw new errors_js_1.TransactionBuildError(`${intent.label}: identityUtxo carries ${amount} of ${currency}, which is outside token ` +
91
+ `conservation and would be burned. An identity output must not carry reserve value.`);
92
+ }
93
+ }
94
+ const completedHex = completeFundedIdentityUpdate(fundedHex, verusNetwork, prevOutScripts, {
95
+ hash: Buffer.from(idUtxo.txid, 'hex').reverse(),
96
+ index: idUtxo.outputIndex,
97
+ sequence: 0xffffffff,
98
+ script: Buffer.from(idUtxo.script, 'hex'),
99
+ });
100
+ const allUtxos = [...selection.selected, idUtxo];
101
+ // The identity input and its recreated output are both value 0, so the
102
+ // assembled native fee must equal selection.fee. Fail loudly on any slip.
103
+ (0, index_js_2.assertNativeConservation)(allUtxos, boundary_js_1.Transaction.fromHex(completedHex, verusNetwork).outs, selection.fee, intent.label);
104
+ const { signedTx, txid } = (0, index_js_2.signTransactionSmart)(completedHex, intent.wif, allUtxos, verusNetwork);
105
+ return {
106
+ signedTx,
107
+ txid,
108
+ fee: selection.fee,
109
+ nativeChange: selection.nativeChange,
110
+ selected: selection.selected,
111
+ inputsUsed: allUtxos.length,
112
+ };
113
+ }
114
+ //# sourceMappingURL=fundedIdentityUpdate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fundedIdentityUpdate.js","sourceRoot":"","sources":["../../src/assemble/fundedIdentityUpdate.ts"],"names":[],"mappings":"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"}