@chainvue/verus-sdk 0.6.3 → 0.8.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.
- package/dist/bundle.js +449 -310
- package/dist/core/brands.d.ts +31 -0
- package/dist/core/brands.d.ts.map +1 -0
- package/dist/core/brands.js +82 -0
- package/dist/core/brands.js.map +1 -0
- package/dist/currency/index.d.ts.map +1 -1
- package/dist/currency/index.js +10 -1
- package/dist/currency/index.js.map +1 -1
- package/dist/identity/index.d.ts +67 -14
- package/dist/identity/index.d.ts.map +1 -1
- package/dist/identity/index.js +152 -89
- package/dist/identity/index.js.map +1 -1
- package/dist/keys/index.d.ts.map +1 -1
- package/dist/keys/index.js +6 -0
- package/dist/keys/index.js.map +1 -1
- package/dist/message/index.d.ts.map +1 -1
- package/dist/message/index.js +49 -5
- package/dist/message/index.js.map +1 -1
- package/dist/transfer/index.d.ts.map +1 -1
- package/dist/transfer/index.js +3 -2
- package/dist/transfer/index.js.map +1 -1
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +7 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utxo/index.d.ts +14 -0
- package/dist/utxo/index.d.ts.map +1 -1
- package/dist/utxo/index.js +41 -0
- package/dist/utxo/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
declare const brand: unique symbol;
|
|
2
|
+
type Brand<T, B extends string> = T & {
|
|
3
|
+
readonly [brand]: B;
|
|
4
|
+
};
|
|
5
|
+
/** Transparent R-address (version 0x3c, pubkey-hash). */
|
|
6
|
+
export type RAddress = Brand<string, 'RAddress'>;
|
|
7
|
+
/** Identity i-address (version 0x66) — identities AND currency ids (offline-indistinguishable). */
|
|
8
|
+
export type IAddress = Brand<string, 'IAddress'>;
|
|
9
|
+
/** P2SH address (version 0x55). */
|
|
10
|
+
export type P2shAddress = Brand<string, 'P2shAddress'>;
|
|
11
|
+
/** Any parsed base58check address of a known kind. */
|
|
12
|
+
export type Address = RAddress | IAddress | P2shAddress;
|
|
13
|
+
/**
|
|
14
|
+
* Documentation alias: a currency id IS an i-address. There is deliberately no
|
|
15
|
+
* separate `CurrencyId` brand — an offline SDK cannot tell an i-address naming a
|
|
16
|
+
* currency from one naming an identity, so a distinct brand would be a lie the
|
|
17
|
+
* type system can't check and would force unsafe casts.
|
|
18
|
+
*/
|
|
19
|
+
export type CurrencyId = IAddress;
|
|
20
|
+
/** Parse a transparent R-address; throws InvalidAddressError otherwise. */
|
|
21
|
+
export declare function parseRAddress(s: string, label?: string): RAddress;
|
|
22
|
+
/** Parse an identity/currency i-address; throws InvalidAddressError otherwise. */
|
|
23
|
+
export declare function parseIAddress(s: string, label?: string): IAddress;
|
|
24
|
+
/** Parse any supported address into the discriminated union; throws otherwise. */
|
|
25
|
+
export declare function parseAddress(s: string, label?: string): Address;
|
|
26
|
+
/** Narrow an Address to an i-address by its version byte (replaces startsWith('i')). */
|
|
27
|
+
export declare function isIAddress(a: Address): a is IAddress;
|
|
28
|
+
/** Narrow an Address to an R-address by its version byte. */
|
|
29
|
+
export declare function isRAddress(a: Address): a is RAddress;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=brands.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brands.d.ts","sourceRoot":"","sources":["../../src/core/brands.ts"],"names":[],"mappings":"AAmBA,OAAO,CAAC,MAAM,KAAK,EAAE,OAAO,MAAM,CAAC;AACnC,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,CAAC,GAAG;IAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC;AAE9D,yDAAyD;AACzD,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACjD,mGAAmG;AACnG,MAAM,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACjD,mCAAmC;AACnC,MAAM,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;AACvD,sDAAsD;AACtD,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAExD;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;AAkBlC,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,SAAY,GAAG,QAAQ,CAMpE;AAED,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,SAAY,GAAG,QAAQ,CAMpE;AAED,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,SAAY,GAAG,OAAO,CAYlE;AAED,wFAAwF;AACxF,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,QAAQ,CAEpD;AAED,6DAA6D;AAC7D,wBAAgB,UAAU,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,QAAQ,CAEpD"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseRAddress = parseRAddress;
|
|
7
|
+
exports.parseIAddress = parseIAddress;
|
|
8
|
+
exports.parseAddress = parseAddress;
|
|
9
|
+
exports.isIAddress = isIAddress;
|
|
10
|
+
exports.isRAddress = isRAddress;
|
|
11
|
+
/**
|
|
12
|
+
* Branded domain types + parse-don't-validate constructors.
|
|
13
|
+
*
|
|
14
|
+
* The address-version-laundering bug class (KeyID/IdentityID.fromAddress and
|
|
15
|
+
* fromBase58Check discard the version byte) was defended by scattering
|
|
16
|
+
* assertAddressVersion at each call site. Brands move that guarantee into the
|
|
17
|
+
* type system: once an internal function's signature demands an `IAddress`, a
|
|
18
|
+
* raw `string` (or an `RAddress`) cannot be passed — the compiler rejects it,
|
|
19
|
+
* and a forgotten check is a build error instead of a live-testnet discovery.
|
|
20
|
+
*
|
|
21
|
+
* Brands are structural subtypes of `string`, so a value already flows into the
|
|
22
|
+
* fork's constructors with zero casts; the only way to MINT one is through a
|
|
23
|
+
* parser here, which validates the version byte. No fork imports (uses bs58check
|
|
24
|
+
* directly), so this stays at the dependency-free core.
|
|
25
|
+
*/
|
|
26
|
+
const bs58check_1 = __importDefault(require("bs58check"));
|
|
27
|
+
const index_js_1 = require("../constants/index.js");
|
|
28
|
+
const errors_js_1 = require("../errors.js");
|
|
29
|
+
const P2SH_VERSION = 0x55;
|
|
30
|
+
/** Decode a base58check string to its version byte + 20-byte hash, or throw typed. */
|
|
31
|
+
function decode(s, label) {
|
|
32
|
+
let decoded;
|
|
33
|
+
try {
|
|
34
|
+
decoded = bs58check_1.default.decode(s);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
throw new errors_js_1.InvalidAddressError(String(s), `${label} is not valid base58check: ${err.message}`);
|
|
38
|
+
}
|
|
39
|
+
if (decoded.length !== 21) {
|
|
40
|
+
throw new errors_js_1.InvalidAddressError(String(s), `${label} must decode to a 1-byte version + 20-byte hash, got ${decoded.length} bytes`);
|
|
41
|
+
}
|
|
42
|
+
return { version: decoded[0] };
|
|
43
|
+
}
|
|
44
|
+
/** Parse a transparent R-address; throws InvalidAddressError otherwise. */
|
|
45
|
+
function parseRAddress(s, label = 'address') {
|
|
46
|
+
const { version } = decode(s, label);
|
|
47
|
+
if (version !== index_js_1.PUBKEY_HASH_PREFIX) {
|
|
48
|
+
throw new errors_js_1.InvalidAddressError(s, `${label} must be an R-address (version ${index_js_1.PUBKEY_HASH_PREFIX}), got version ${version}`);
|
|
49
|
+
}
|
|
50
|
+
return s;
|
|
51
|
+
}
|
|
52
|
+
/** Parse an identity/currency i-address; throws InvalidAddressError otherwise. */
|
|
53
|
+
function parseIAddress(s, label = 'address') {
|
|
54
|
+
const { version } = decode(s, label);
|
|
55
|
+
if (version !== index_js_1.I_ADDR_VERSION) {
|
|
56
|
+
throw new errors_js_1.InvalidAddressError(s, `${label} must be an identity i-address (version ${index_js_1.I_ADDR_VERSION}), got version ${version}`);
|
|
57
|
+
}
|
|
58
|
+
return s;
|
|
59
|
+
}
|
|
60
|
+
/** Parse any supported address into the discriminated union; throws otherwise. */
|
|
61
|
+
function parseAddress(s, label = 'address') {
|
|
62
|
+
const { version } = decode(s, label);
|
|
63
|
+
switch (version) {
|
|
64
|
+
case index_js_1.PUBKEY_HASH_PREFIX:
|
|
65
|
+
return s;
|
|
66
|
+
case index_js_1.I_ADDR_VERSION:
|
|
67
|
+
return s;
|
|
68
|
+
case P2SH_VERSION:
|
|
69
|
+
return s;
|
|
70
|
+
default:
|
|
71
|
+
throw new errors_js_1.InvalidAddressError(s, `${label} has unsupported version byte ${version}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Narrow an Address to an i-address by its version byte (replaces startsWith('i')). */
|
|
75
|
+
function isIAddress(a) {
|
|
76
|
+
return decode(a, 'address').version === index_js_1.I_ADDR_VERSION;
|
|
77
|
+
}
|
|
78
|
+
/** Narrow an Address to an R-address by its version byte. */
|
|
79
|
+
function isRAddress(a) {
|
|
80
|
+
return decode(a, 'address').version === index_js_1.PUBKEY_HASH_PREFIX;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=brands.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"brands.js","sourceRoot":"","sources":["../../src/core/brands.ts"],"names":[],"mappings":";;;;;AAwDA,sCAMC;AAGD,sCAMC;AAGD,oCAYC;AAGD,gCAEC;AAGD,gCAEC;AAhGD;;;;;;;;;;;;;;GAcG;AACH,0DAAkC;AAClC,oDAA2E;AAC3E,4CAAmD;AAsBnD,MAAM,YAAY,GAAG,IAAI,CAAC;AAE1B,sFAAsF;AACtF,SAAS,MAAM,CAAC,CAAS,EAAE,KAAa;IACtC,IAAI,OAAmB,CAAC;IACxB,IAAI,CAAC;QACH,OAAO,GAAG,mBAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,+BAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,8BAA+B,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3G,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QAC1B,MAAM,IAAI,+BAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,wDAAwD,OAAO,CAAC,MAAM,QAAQ,CAAC,CAAC;IACnI,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAW,EAAE,CAAC;AAC3C,CAAC;AAED,2EAA2E;AAC3E,SAAgB,aAAa,CAAC,CAAS,EAAE,KAAK,GAAG,SAAS;IACxD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrC,IAAI,OAAO,KAAK,6BAAkB,EAAE,CAAC;QACnC,MAAM,IAAI,+BAAmB,CAAC,CAAC,EAAE,GAAG,KAAK,kCAAkC,6BAAkB,kBAAkB,OAAO,EAAE,CAAC,CAAC;IAC5H,CAAC;IACD,OAAO,CAAa,CAAC;AACvB,CAAC;AAED,kFAAkF;AAClF,SAAgB,aAAa,CAAC,CAAS,EAAE,KAAK,GAAG,SAAS;IACxD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrC,IAAI,OAAO,KAAK,yBAAc,EAAE,CAAC;QAC/B,MAAM,IAAI,+BAAmB,CAAC,CAAC,EAAE,GAAG,KAAK,2CAA2C,yBAAc,kBAAkB,OAAO,EAAE,CAAC,CAAC;IACjI,CAAC;IACD,OAAO,CAAa,CAAC;AACvB,CAAC;AAED,kFAAkF;AAClF,SAAgB,YAAY,CAAC,CAAS,EAAE,KAAK,GAAG,SAAS;IACvD,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IACrC,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,6BAAkB;YACrB,OAAO,CAAa,CAAC;QACvB,KAAK,yBAAc;YACjB,OAAO,CAAa,CAAC;QACvB,KAAK,YAAY;YACf,OAAO,CAAgB,CAAC;QAC1B;YACE,MAAM,IAAI,+BAAmB,CAAC,CAAC,EAAE,GAAG,KAAK,iCAAiC,OAAO,EAAE,CAAC,CAAC;IACzF,CAAC;AACH,CAAC;AAED,wFAAwF;AACxF,SAAgB,UAAU,CAAC,CAAU;IACnC,OAAO,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,OAAO,KAAK,yBAAc,CAAC;AACzD,CAAC;AAED,6DAA6D;AAC7D,SAAgB,UAAU,CAAC,CAAU;IACnC,OAAO,MAAM,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,OAAO,KAAK,6BAAkB,CAAC;AAC7D,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/currency/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAMlD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/currency/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACtE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAMlD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAQrD,OAAO,KAAK,EAAQ,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAI1F;;;;GAIG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,OAAO,GACf,oBAAoB,CA6ItB"}
|
package/dist/currency/index.js
CHANGED
|
@@ -28,6 +28,7 @@ const index_js_2 = require("../signing/index.js");
|
|
|
28
28
|
const index_js_3 = require("../utxo/index.js");
|
|
29
29
|
const index_js_4 = require("../utils/index.js");
|
|
30
30
|
const index_js_5 = require("../identity/index.js");
|
|
31
|
+
const brands_js_1 = require("../core/brands.js");
|
|
31
32
|
const index_js_6 = require("../keys/index.js");
|
|
32
33
|
const errors_js_1 = require("../errors.js");
|
|
33
34
|
const { completeFundedIdentityUpdate } = utxo_lib_1.smarttxs;
|
|
@@ -59,6 +60,10 @@ function defineCurrency(params, network) {
|
|
|
59
60
|
// Parse identity and set FLAG_ACTIVECURRENCY
|
|
60
61
|
const identity = new verus_typescript_primitives_1.Identity();
|
|
61
62
|
identity.fromBuffer(Buffer.from(params.identityHex, 'hex'));
|
|
63
|
+
// A currency definition spends the identity input under primary authority.
|
|
64
|
+
// The fork signs it with whatever WIF it's handed, so a WIF that doesn't
|
|
65
|
+
// control the identity yields a tx the daemon rejects only at broadcast.
|
|
66
|
+
(0, index_js_5.assertWifIsPrimary)(params.wif, identity, verusNetwork);
|
|
62
67
|
if (!identity.hasActiveCurrency()) {
|
|
63
68
|
const currentFlags = identity.flags.toNumber();
|
|
64
69
|
identity.flags = new bn_js_1.default(currentFlags | index_js_1.IDENTITY_FLAG_ACTIVECURRENCY);
|
|
@@ -70,6 +75,10 @@ function defineCurrency(params, network) {
|
|
|
70
75
|
// large; size the fee from their real byte length so the tx isn't estimated
|
|
71
76
|
// below the relay minimum.
|
|
72
77
|
const selection = (0, index_js_3.selectUtxos)(params.utxos, currencyDefValue, new Map(), 2, systemId, undefined, true, identityOutputScript.length + currencyDefScript.length);
|
|
78
|
+
// Currency definition pays only native and emits no token-change output, so a
|
|
79
|
+
// token-bearing funding UTXO would be silently dropped. Fail closed if one
|
|
80
|
+
// was selected (both maps empty ⇒ assert no token enters).
|
|
81
|
+
(0, index_js_3.assertTokenConservation)(selection.selected, new Map(), new Map(), systemId, 'currency definition');
|
|
73
82
|
// Build transaction
|
|
74
83
|
const txb = new utxo_lib_1.TransactionBuilder(verusNetwork);
|
|
75
84
|
txb.setVersion(4);
|
|
@@ -82,7 +91,7 @@ function defineCurrency(params, network) {
|
|
|
82
91
|
txb.addOutput(currencyDefScript, (0, index_js_4.toSafeNumber)(currencyDefValue));
|
|
83
92
|
if (selection.nativeChange > 0n) {
|
|
84
93
|
if (params.changeAddress.startsWith('i')) {
|
|
85
|
-
txb.addOutput((0, index_js_5.identityPaymentScript)(params.changeAddress), (0, index_js_4.toSafeNumber)(selection.nativeChange));
|
|
94
|
+
txb.addOutput((0, index_js_5.identityPaymentScript)((0, brands_js_1.parseIAddress)(params.changeAddress, 'changeAddress')), (0, index_js_4.toSafeNumber)(selection.nativeChange));
|
|
86
95
|
}
|
|
87
96
|
else {
|
|
88
97
|
txb.addOutput(params.changeAddress, (0, index_js_4.toSafeNumber)(selection.nativeChange));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/currency/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;;;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/currency/index.ts"],"names":[],"mappings":"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"}
|
package/dist/identity/index.d.ts
CHANGED
|
@@ -10,8 +10,29 @@
|
|
|
10
10
|
import { Identity } from 'verus-typescript-primitives';
|
|
11
11
|
import { nameAndParentAddrToIAddr } from 'verus-typescript-primitives';
|
|
12
12
|
import type { Network } from '../constants/index.js';
|
|
13
|
+
import { type VerusNetwork } from '../signing/index.js';
|
|
14
|
+
import { type IAddress, type RAddress, type Address } from '../core/brands.js';
|
|
13
15
|
import type { CreateCommitmentParams, CreateCommitmentResult, RegisterIdentityParams, RegisterIdentityResult, UpdateIdentityParams, UpdateIdentityResult } from '../types/index.js';
|
|
14
16
|
export { nameAndParentAddrToIAddr };
|
|
17
|
+
/**
|
|
18
|
+
* Assert a base58check address has the expected version byte.
|
|
19
|
+
*
|
|
20
|
+
* KeyID.fromAddress / IdentityID.fromAddress discard the version byte and stamp
|
|
21
|
+
* their own, so an i-address passed where an R-address is expected (or vice
|
|
22
|
+
* versa) is silently laundered into a different, uncontrollable destination —
|
|
23
|
+
* e.g. an i-address as a primary key becomes the hash of the identity paid as a
|
|
24
|
+
* P2PKH nobody controls, permanently bricking the new identity. Validate up
|
|
25
|
+
* front instead.
|
|
26
|
+
*/
|
|
27
|
+
export declare function assertAddressVersion(address: string, expectedVersion: number, label: string): void;
|
|
28
|
+
/**
|
|
29
|
+
* Assert the WIF's address is among an identity's current primary addresses.
|
|
30
|
+
* The fork signs CC (identity) inputs with whatever key it is given, so a WIF
|
|
31
|
+
* that doesn't control the identity yields a "valid" signed tx the daemon
|
|
32
|
+
* rejects at broadcast. Used by every path that spends an identity input under
|
|
33
|
+
* primary authority (currency define; update/lock/unlock check inline).
|
|
34
|
+
*/
|
|
35
|
+
export declare function assertWifIsPrimary(wif: string, identity: Identity, network: VerusNetwork): void;
|
|
15
36
|
/**
|
|
16
37
|
* Generate a random 32-byte salt for name commitment
|
|
17
38
|
*/
|
|
@@ -35,11 +56,11 @@ export declare function serializeCommitmentHash(hash: Buffer): Buffer;
|
|
|
35
56
|
/**
|
|
36
57
|
* Build the commitment output script
|
|
37
58
|
*/
|
|
38
|
-
export declare function buildCommitmentScript(commitmentHashBuf: Buffer, controlAddress:
|
|
59
|
+
export declare function buildCommitmentScript(commitmentHashBuf: Buffer, controlAddress: RAddress): Buffer;
|
|
39
60
|
/**
|
|
40
61
|
* Build the name reservation output script
|
|
41
62
|
*/
|
|
42
|
-
export declare function buildReservationScript(newIdentityIAddress:
|
|
63
|
+
export declare function buildReservationScript(newIdentityIAddress: IAddress, serializedReservation: Buffer, isAdvanced?: boolean): Buffer;
|
|
43
64
|
/**
|
|
44
65
|
* Build an identity definition output script from an Identity object
|
|
45
66
|
*/
|
|
@@ -55,7 +76,14 @@ export declare function isVRSCParent(parentIAddress: string | undefined, network
|
|
|
55
76
|
/**
|
|
56
77
|
* Build the full commitment data needed for Step 1 of identity creation
|
|
57
78
|
*/
|
|
58
|
-
export declare function prepareNameCommitment(name: string, controlAddress: string, referralIAddress?: string, parentIAddress?: string, network?: Network
|
|
79
|
+
export declare function prepareNameCommitment(name: string, controlAddress: string, referralIAddress?: string, parentIAddress?: string, network?: Network,
|
|
80
|
+
/**
|
|
81
|
+
* Explicit 32-byte salt. Omit for a fresh random salt (the normal path); pass
|
|
82
|
+
* a fixed value only to make the commitment deterministic for golden/diff
|
|
83
|
+
* tests. A reused salt on a real registration is a privacy leak, so callers
|
|
84
|
+
* outside tests must not set it.
|
|
85
|
+
*/
|
|
86
|
+
salt?: Buffer): {
|
|
59
87
|
salt: Buffer;
|
|
60
88
|
serializedReservation: Buffer;
|
|
61
89
|
commitmentHash: Buffer;
|
|
@@ -64,7 +92,14 @@ export declare function prepareNameCommitment(name: string, controlAddress: stri
|
|
|
64
92
|
identityAddress: string;
|
|
65
93
|
};
|
|
66
94
|
/**
|
|
67
|
-
* Build a
|
|
95
|
+
* Build a pay-to-identity output script for an i-address.
|
|
96
|
+
*
|
|
97
|
+
* Alias of {@link identityPaymentScript}. This previously emitted the bare
|
|
98
|
+
* 26-byte template `OP_DUP OP_HASH160 <idhash> OP_EQUALVERIFY OP_CHECKSIG
|
|
99
|
+
* OP_CHECKCRYPTOCONDITION`, which is NOT a valid Verus scriptPubKey — a Verus
|
|
100
|
+
* P2ID is a CryptoCondition (OptCCParams) output. Funds sent to the old
|
|
101
|
+
* template would have gone to a non-standard script the daemon does not treat
|
|
102
|
+
* as identity-spendable. It now delegates to the chain-verified CC builder.
|
|
68
103
|
*/
|
|
69
104
|
export declare function buildP2IDScript(iAddress: string): Buffer;
|
|
70
105
|
/**
|
|
@@ -73,11 +108,13 @@ export declare function buildP2IDScript(iAddress: string): Buffer;
|
|
|
73
108
|
* an identity (verified against on-chain P2ID outputs). Use this for change
|
|
74
109
|
* or payment outputs to an i-address.
|
|
75
110
|
*/
|
|
76
|
-
export declare function identityPaymentScript(iAddress:
|
|
111
|
+
export declare function identityPaymentScript(iAddress: IAddress): Buffer;
|
|
77
112
|
/**
|
|
78
|
-
* Build a CC referral payment output script
|
|
113
|
+
* Build a CC referral payment output script. Requires an already-parsed
|
|
114
|
+
* i-address: IdentityID.fromAddress launders the version byte, so accepting a
|
|
115
|
+
* raw string here is exactly the hole that let a wrong-kind address through.
|
|
79
116
|
*/
|
|
80
|
-
export declare function buildReferralPaymentScript(iAddress:
|
|
117
|
+
export declare function buildReferralPaymentScript(iAddress: IAddress): Buffer;
|
|
81
118
|
/**
|
|
82
119
|
* Calculate registration fee breakdown
|
|
83
120
|
*/
|
|
@@ -91,15 +128,31 @@ export declare function calculateRegistrationFees(hasReferral: boolean, totalFee
|
|
|
91
128
|
*/
|
|
92
129
|
export declare function createIdentityObject(params: {
|
|
93
130
|
name: string;
|
|
94
|
-
primaryAddresses:
|
|
131
|
+
primaryAddresses: RAddress[];
|
|
95
132
|
minSigs?: number;
|
|
96
|
-
revocationAuthority:
|
|
97
|
-
recoveryAuthority:
|
|
98
|
-
parentIAddress:
|
|
99
|
-
systemId:
|
|
133
|
+
revocationAuthority: IAddress;
|
|
134
|
+
recoveryAuthority: IAddress;
|
|
135
|
+
parentIAddress: IAddress;
|
|
136
|
+
systemId: IAddress;
|
|
100
137
|
}): Identity;
|
|
101
138
|
/**
|
|
102
|
-
* Build
|
|
139
|
+
* Build the parent-currency registration-fee output for a sub-ID.
|
|
140
|
+
*
|
|
141
|
+
* The daemon pays this fee as a plain reserve output (EVAL_RESERVE_OUTPUT)
|
|
142
|
+
* holding `feeAmount` of the parent currency AT the parent currency's own
|
|
143
|
+
* i-address, carrying zero native value. Verified against `registeridentity`
|
|
144
|
+
* on VRSCTEST and an accepted on-chain sub-ID registration: for a currency
|
|
145
|
+
* with idregistrationfees=1.0 the fee output is exactly `{parent: 1.0}` at the
|
|
146
|
+
* parent, 0 native, and the native cost that leaves the transaction is the
|
|
147
|
+
* currency's idimportfees (the caller passes it as `nativeImportFee`).
|
|
148
|
+
*
|
|
149
|
+
* A previous implementation built this as a CReserveTransfer to the
|
|
150
|
+
* reserve-transfer eval address carrying 0.0002 native — a cross-currency
|
|
151
|
+
* transfer, not a same-chain fee payment. That structure never matched the
|
|
152
|
+
* daemon and was never accepted at broadcast.
|
|
153
|
+
*
|
|
154
|
+
* `systemId`/`_controlAddress` are retained for signature compatibility and
|
|
155
|
+
* are unused: the fee is denominated in and paid to the parent currency.
|
|
103
156
|
*/
|
|
104
157
|
export declare function buildRegistrationFeeOutput(parentCurrencyId: string, feeAmount: bigint, systemId: string, _controlAddress: string): {
|
|
105
158
|
script: Buffer;
|
|
@@ -108,7 +161,7 @@ export declare function buildRegistrationFeeOutput(parentCurrencyId: string, fee
|
|
|
108
161
|
/**
|
|
109
162
|
* Build a token change output (EVAL_RESERVE_OUTPUT)
|
|
110
163
|
*/
|
|
111
|
-
export declare function buildTokenChangeOutput(changeAddress:
|
|
164
|
+
export declare function buildTokenChangeOutput(changeAddress: Address, currencyChanges: Map<string, bigint>): {
|
|
112
165
|
script: Buffer;
|
|
113
166
|
nativeValue: bigint;
|
|
114
167
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAIH,OAAO,EAQL,QAAQ,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/identity/index.ts"],"names":[],"mappings":"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"}
|