@bitgo-beta/sdk-lib-safes 1.0.0-beta.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.
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ /**
18
+ * @prettier
19
+ *
20
+ * @experimental Pure Safe derivation leaf. Never imports sdk-core/BaseCoin/Wallet/Safe/key-card.
21
+ */
22
+ __exportStar(require("./ed25519KeyDeriver"), exports);
23
+ __exportStar(require("./ed25519Pub"), exports);
24
+ __exportStar(require("./safeDerivation"), exports);
25
+ __exportStar(require("./safeSlot"), exports);
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7O0dBSUc7QUFDSCxzREFBb0M7QUFDcEMsK0NBQTZCO0FBQzdCLG1EQUFpQztBQUNqQyw2Q0FBMkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBwcmV0dGllclxuICpcbiAqIEBleHBlcmltZW50YWwgUHVyZSBTYWZlIGRlcml2YXRpb24gbGVhZi4gTmV2ZXIgaW1wb3J0cyBzZGstY29yZS9CYXNlQ29pbi9XYWxsZXQvU2FmZS9rZXktY2FyZC5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9lZDI1NTE5S2V5RGVyaXZlcic7XG5leHBvcnQgKiBmcm9tICcuL2VkMjU1MTlQdWInO1xuZXhwb3J0ICogZnJvbSAnLi9zYWZlRGVyaXZhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3NhZmVTbG90JztcbiJdfQ==
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @prettier
3
+ *
4
+ * @experimental Shared safe child derivation for mint and sign.
5
+ *
6
+ * User child: hardened `m/<index>'` from the sequential `safe.derivationIndex[slot]`.
7
+ * Backup / BitGo children are soft-derived server-side at `m/<index>` (not here).
8
+ *
9
+ * Do not use `derivedFromParentWithSeed` / `deriveKeyWithSeed` (`m/999999/a/b`) —
10
+ * that is the custody hashed path and cannot reproduce a safe child.
11
+ */
12
+ import * as t from 'io-ts';
13
+ export declare const DERIVED_FROM_PARENT_WITH_HARDENED_PATH: RegExp;
14
+ export declare function parseSafeDerivationIndex(index: string | number): number;
15
+ export declare function getSafeHardenedDerivationPath(index: string | number): string;
16
+ export interface DerivedFromParentWithHardenedPathBrand {
17
+ readonly DerivedFromParentWithHardenedPath: unique symbol;
18
+ }
19
+ export type DerivedFromParentWithHardenedPath = t.Branded<string, DerivedFromParentWithHardenedPathBrand>;
20
+ export declare const DerivedFromParentWithHardenedPath: t.BrandC<t.StringC, DerivedFromParentWithHardenedPathBrand>;
21
+ export declare function parseDerivedFromParentWithHardenedPath(path: string): number;
22
+ export interface SafeHardenedChildKey {
23
+ prv: string;
24
+ pub: string;
25
+ derivationPath: string;
26
+ }
27
+ export declare function deriveSafeChildHardenedFromXprv(rootXprv: string, index: string | number): SafeHardenedChildKey;
28
+ /** Re-derive and assert both results match before the child is registered. */
29
+ export declare function deriveAndSelfCheckSafeChildHardened(rootXprv: string, index: string | number): SafeHardenedChildKey;
30
+ /**
31
+ * SLIP-0010 hardened derivation of a safe user child from an ed25519 root secret seed.
32
+ *
33
+ * `rootPrv` is a Stellar StrKey `S…` secret seed (what slot-④ `ed25519Multisig` user roots store).
34
+ * The derivation reuses the existing SLIP-0010 implementation {@link Ed25519KeyDeriver.derivePath}
35
+ * (hardened-only CKDPriv over the `ed25519 seed` HMAC master), then expands the resulting 32-byte
36
+ * child seed into a keypair with `nacl`. The child `pub` is a bare StrKey `G…`; the `prv` is the
37
+ * raw 32-byte child seed as hex (the seed input a signer needs).
38
+ *
39
+ * Unlike the secp256k1 path, ed25519 hardened derivation needs no chain code — the composite
40
+ * `pub‖chainCode` form is only for SOFT co-signer derivation and is not used here.
41
+ */
42
+ export declare function deriveSafeChildEd25519Hardened(rootPrv: string, index: string | number): SafeHardenedChildKey;
43
+ //# sourceMappingURL=safeDerivation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeDerivation.d.ts","sourceRoot":"","sources":["../../src/safeDerivation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAQ3B,eAAO,MAAM,sCAAsC,QAAgB,CAAC;AAEpE,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAavE;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAE5E;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,iCAAiC,EAAE,OAAO,MAAM,CAAC;CAC3D;AAED,MAAM,MAAM,iCAAiC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,sCAAsC,CAAC,CAAC;AAE1G,eAAO,MAAM,iCAAiC,6DAI7C,CAAC;AAcF,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO3E;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;CACxB;AAaD,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAI9G;AAED,8EAA8E;AAC9E,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAOlH;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,oBAAoB,CAY5G"}
@@ -0,0 +1,151 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.DerivedFromParentWithHardenedPath = exports.DERIVED_FROM_PARENT_WITH_HARDENED_PATH = void 0;
37
+ exports.parseSafeDerivationIndex = parseSafeDerivationIndex;
38
+ exports.getSafeHardenedDerivationPath = getSafeHardenedDerivationPath;
39
+ exports.parseDerivedFromParentWithHardenedPath = parseDerivedFromParentWithHardenedPath;
40
+ exports.deriveSafeChildHardenedFromXprv = deriveSafeChildHardenedFromXprv;
41
+ exports.deriveAndSelfCheckSafeChildHardened = deriveAndSelfCheckSafeChildHardened;
42
+ exports.deriveSafeChildEd25519Hardened = deriveSafeChildEd25519Hardened;
43
+ /**
44
+ * @prettier
45
+ *
46
+ * @experimental Shared safe child derivation for mint and sign.
47
+ *
48
+ * User child: hardened `m/<index>'` from the sequential `safe.derivationIndex[slot]`.
49
+ * Backup / BitGo children are soft-derived server-side at `m/<index>` (not here).
50
+ *
51
+ * Do not use `derivedFromParentWithSeed` / `deriveKeyWithSeed` (`m/999999/a/b`) —
52
+ * that is the custody hashed path and cannot reproduce a safe child.
53
+ */
54
+ const t = __importStar(require("io-ts"));
55
+ const nacl = __importStar(require("tweetnacl"));
56
+ const utxo_lib_1 = require("@bitgo-beta/utxo-lib");
57
+ const ed25519KeyDeriver_1 = require("./ed25519KeyDeriver");
58
+ const codecs_1 = require("./codecs");
59
+ const ed25519Pub_1 = require("./ed25519Pub");
60
+ const MAX_BIP32_INDEX = 0x7fffffff;
61
+ exports.DERIVED_FROM_PARENT_WITH_HARDENED_PATH = /^m\/(\d+)'$/;
62
+ function parseSafeDerivationIndex(index) {
63
+ let idx;
64
+ if (typeof index === 'number') {
65
+ idx = index;
66
+ }
67
+ else if (/^\d+$/.test(index)) {
68
+ idx = Number(index);
69
+ }
70
+ else {
71
+ throw new Error(`Invalid safe derivation index '${index}': expected a non-negative integer`);
72
+ }
73
+ if (!Number.isInteger(idx) || idx < 0 || idx > MAX_BIP32_INDEX) {
74
+ throw new Error(`Invalid safe derivation index '${index}': expected a non-negative integer`);
75
+ }
76
+ return idx;
77
+ }
78
+ function getSafeHardenedDerivationPath(index) {
79
+ return `m/${parseSafeDerivationIndex(index)}'`;
80
+ }
81
+ exports.DerivedFromParentWithHardenedPath = t.brand(t.string, (s) => parseDerivedFromParentWithHardenedPathIndex(s) !== undefined, 'DerivedFromParentWithHardenedPath');
82
+ function parseDerivedFromParentWithHardenedPathIndex(path) {
83
+ const match = exports.DERIVED_FROM_PARENT_WITH_HARDENED_PATH.exec(path);
84
+ if (!match) {
85
+ return undefined;
86
+ }
87
+ try {
88
+ return parseSafeDerivationIndex(match[1]);
89
+ }
90
+ catch {
91
+ return undefined;
92
+ }
93
+ }
94
+ function parseDerivedFromParentWithHardenedPath(path) {
95
+ const validated = (0, codecs_1.decodeWithCodec)(exports.DerivedFromParentWithHardenedPath, path, 'derivedFromParentWithHardenedPath');
96
+ const index = parseDerivedFromParentWithHardenedPathIndex(validated);
97
+ if (index === undefined) {
98
+ throw new Error(`Invalid derivedFromParentWithHardenedPath '${path}': expected m/<n>'`);
99
+ }
100
+ return index;
101
+ }
102
+ function childFromNode(child, derivationPath) {
103
+ if (!child.privateKey) {
104
+ throw new Error(`Failed to derive hardened safe child at ${derivationPath}`);
105
+ }
106
+ return {
107
+ prv: child.toBase58(),
108
+ pub: child.neutered().toBase58(),
109
+ derivationPath,
110
+ };
111
+ }
112
+ function deriveSafeChildHardenedFromXprv(rootXprv, index) {
113
+ const idx = parseSafeDerivationIndex(index);
114
+ const derivationPath = getSafeHardenedDerivationPath(idx);
115
+ return childFromNode(utxo_lib_1.bip32.fromBase58(rootXprv).deriveHardened(idx), derivationPath);
116
+ }
117
+ /** Re-derive and assert both results match before the child is registered. */
118
+ function deriveAndSelfCheckSafeChildHardened(rootXprv, index) {
119
+ const first = deriveSafeChildHardenedFromXprv(rootXprv, index);
120
+ const second = deriveSafeChildHardenedFromXprv(rootXprv, index);
121
+ if (first.pub !== second.pub || first.prv !== second.prv) {
122
+ throw new Error(`Safe child self-check failed at ${first.derivationPath}: derivation was not deterministic`);
123
+ }
124
+ return first;
125
+ }
126
+ /**
127
+ * SLIP-0010 hardened derivation of a safe user child from an ed25519 root secret seed.
128
+ *
129
+ * `rootPrv` is a Stellar StrKey `S…` secret seed (what slot-④ `ed25519Multisig` user roots store).
130
+ * The derivation reuses the existing SLIP-0010 implementation {@link Ed25519KeyDeriver.derivePath}
131
+ * (hardened-only CKDPriv over the `ed25519 seed` HMAC master), then expands the resulting 32-byte
132
+ * child seed into a keypair with `nacl`. The child `pub` is a bare StrKey `G…`; the `prv` is the
133
+ * raw 32-byte child seed as hex (the seed input a signer needs).
134
+ *
135
+ * Unlike the secp256k1 path, ed25519 hardened derivation needs no chain code — the composite
136
+ * `pub‖chainCode` form is only for SOFT co-signer derivation and is not used here.
137
+ */
138
+ function deriveSafeChildEd25519Hardened(rootPrv, index) {
139
+ const idx = parseSafeDerivationIndex(index);
140
+ const derivationPath = getSafeHardenedDerivationPath(idx);
141
+ const rawSeedHex = (0, ed25519Pub_1.decodeEd25519StrKeySecretSeed)(rootPrv).toString('hex');
142
+ const childSeed = ed25519KeyDeriver_1.Ed25519KeyDeriver.derivePath(derivationPath, rawSeedHex).key;
143
+ const keyPair = nacl.sign.keyPair.fromSeed(Uint8Array.from(childSeed));
144
+ const pub = (0, ed25519Pub_1.encodeEd25519StrKeyPublicKey)(Buffer.from(keyPair.publicKey));
145
+ return {
146
+ prv: Buffer.from(childSeed).toString('hex'),
147
+ pub,
148
+ derivationPath,
149
+ };
150
+ }
151
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZURlcml2YXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2FmZURlcml2YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBcUJBLDREQWFDO0FBRUQsc0VBRUM7QUEwQkQsd0ZBT0M7QUFtQkQsMEVBSUM7QUFHRCxrRkFPQztBQWNELHdFQVlDO0FBbElEOzs7Ozs7Ozs7O0dBVUc7QUFDSCx5Q0FBMkI7QUFDM0IsZ0RBQWtDO0FBQ2xDLG1EQUE2RDtBQUM3RCwyREFBd0Q7QUFDeEQscUNBQTJDO0FBQzNDLDZDQUEyRjtBQUUzRixNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUM7QUFDdEIsUUFBQSxzQ0FBc0MsR0FBRyxhQUFhLENBQUM7QUFFcEUsU0FBZ0Isd0JBQXdCLENBQUMsS0FBc0I7SUFDN0QsSUFBSSxHQUFXLENBQUM7SUFDaEIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixHQUFHLEdBQUcsS0FBSyxDQUFDO0lBQ2QsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQy9CLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEIsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxLQUFLLG9DQUFvQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksR0FBRyxHQUFHLGVBQWUsRUFBRSxDQUFDO1FBQy9ELE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLEtBQUssb0NBQW9DLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsU0FBZ0IsNkJBQTZC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Q0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxRCxNQUFNLFVBQVUsR0FBRyxJQUFBLDBDQUE2QixFQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxRSxNQUFNLFNBQVMsR0FBRyxxQ0FBaUIsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQztJQUMvRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sR0FBRyxHQUFHLElBQUEseUNBQTRCLEVBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN6RSxPQUFPO1FBQ0wsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUMzQyxHQUFHO1FBQ0gsY0FBYztLQUNmLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFNoYXJlZCBzYWZlIGNoaWxkIGRlcml2YXRpb24gZm9yIG1pbnQgYW5kIHNpZ24uXG4gKlxuICogVXNlciBjaGlsZDogaGFyZGVuZWQgYG0vPGluZGV4PidgIGZyb20gdGhlIHNlcXVlbnRpYWwgYHNhZmUuZGVyaXZhdGlvbkluZGV4W3Nsb3RdYC5cbiAqIEJhY2t1cCAvIEJpdEdvIGNoaWxkcmVuIGFyZSBzb2Z0LWRlcml2ZWQgc2VydmVyLXNpZGUgYXQgYG0vPGluZGV4PmAgKG5vdCBoZXJlKS5cbiAqXG4gKiBEbyBub3QgdXNlIGBkZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkYCAvIGBkZXJpdmVLZXlXaXRoU2VlZGAgKGBtLzk5OTk5OS9hL2JgKSDigJRcbiAqIHRoYXQgaXMgdGhlIGN1c3RvZHkgaGFzaGVkIHBhdGggYW5kIGNhbm5vdCByZXByb2R1Y2UgYSBzYWZlIGNoaWxkLlxuICovXG5pbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcbmltcG9ydCAqIGFzIG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCB7IGJpcDMyLCBCSVAzMkludGVyZmFjZSB9IGZyb20gJ0BiaXRnby1iZXRhL3V0eG8tbGliJztcbmltcG9ydCB7IEVkMjU1MTlLZXlEZXJpdmVyIH0gZnJvbSAnLi9lZDI1NTE5S2V5RGVyaXZlcic7XG5pbXBvcnQgeyBkZWNvZGVXaXRoQ29kZWMgfSBmcm9tICcuL2NvZGVjcyc7XG5pbXBvcnQgeyBkZWNvZGVFZDI1NTE5U3RyS2V5U2VjcmV0U2VlZCwgZW5jb2RlRWQyNTUxOVN0cktleVB1YmxpY0tleSB9IGZyb20gJy4vZWQyNTUxOVB1Yic7XG5cbmNvbnN0IE1BWF9CSVAzMl9JTkRFWCA9IDB4N2ZmZmZmZmY7XG5leHBvcnQgY29uc3QgREVSSVZFRF9GUk9NX1BBUkVOVF9XSVRIX0hBUkRFTkVEX1BBVEggPSAvXm1cXC8oXFxkKyknJC87XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgoaW5kZXg6IHN0cmluZyB8IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBpZHg6IG51bWJlcjtcbiAgaWYgKHR5cGVvZiBpbmRleCA9PT0gJ251bWJlcicpIHtcbiAgICBpZHggPSBpbmRleDtcbiAgfSBlbHNlIGlmICgvXlxcZCskLy50ZXN0KGluZGV4KSkge1xuICAgIGlkeCA9IE51bWJlcihpbmRleCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNhZmUgZGVyaXZhdGlvbiBpbmRleCAnJHtpbmRleH0nOiBleHBlY3RlZCBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYCk7XG4gIH1cbiAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGlkeCkgfHwgaWR4IDwgMCB8fCBpZHggPiBNQVhfQklQMzJfSU5ERVgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgc2FmZSBkZXJpdmF0aW9uIGluZGV4ICcke2luZGV4fSc6IGV4cGVjdGVkIGEgbm9uLW5lZ2F0aXZlIGludGVnZXJgKTtcbiAgfVxuICByZXR1cm4gaWR4O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2FmZUhhcmRlbmVkRGVyaXZhdGlvblBhdGgoaW5kZXg6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBgbS8ke3BhcnNlU2FmZURlcml2YXRpb25JbmRleChpbmRleCl9J2A7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoQnJhbmQge1xuICByZWFkb25seSBEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGg6IHVuaXF1ZSBzeW1ib2w7XG59XG5cbmV4cG9ydCB0eXBlIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCA9IHQuQnJhbmRlZDxzdHJpbmcsIERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aEJyYW5kPjtcblxuZXhwb3J0IGNvbnN0IERlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCA9IHQuYnJhbmQoXG4gIHQuc3RyaW5nLFxuICAocyk6IHMgaXMgRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoID0+IHBhcnNlRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoSW5kZXgocykgIT09IHVuZGVmaW5lZCxcbiAgJ0Rlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aCdcbik7XG5cbmZ1bmN0aW9uIHBhcnNlRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoSW5kZXgocGF0aDogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWF0Y2ggPSBERVJJVkVEX0ZST01fUEFSRU5UX1dJVEhfSEFSREVORURfUEFUSC5leGVjKHBhdGgpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgobWF0Y2hbMV0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZURlcml2ZWRGcm9tUGFyZW50V2l0aEhhcmRlbmVkUGF0aChwYXRoOiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCB2YWxpZGF0ZWQgPSBkZWNvZGVXaXRoQ29kZWMoRGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoLCBwYXRoLCAnZGVyaXZlZEZyb21QYXJlbnRXaXRoSGFyZGVuZWRQYXRoJyk7XG4gIGNvbnN0IGluZGV4ID0gcGFyc2VEZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGhJbmRleCh2YWxpZGF0ZWQpO1xuICBpZiAoaW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkZXJpdmVkRnJvbVBhcmVudFdpdGhIYXJkZW5lZFBhdGggJyR7cGF0aH0nOiBleHBlY3RlZCBtLzxuPidgKTtcbiAgfVxuICByZXR1cm4gaW5kZXg7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBwcnY6IHN0cmluZztcbiAgcHViOiBzdHJpbmc7XG4gIGRlcml2YXRpb25QYXRoOiBzdHJpbmc7XG59XG5cbmZ1bmN0aW9uIGNoaWxkRnJvbU5vZGUoY2hpbGQ6IEJJUDMySW50ZXJmYWNlLCBkZXJpdmF0aW9uUGF0aDogc3RyaW5nKTogU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBpZiAoIWNoaWxkLnByaXZhdGVLZXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBkZXJpdmUgaGFyZGVuZWQgc2FmZSBjaGlsZCBhdCAke2Rlcml2YXRpb25QYXRofWApO1xuICB9XG4gIHJldHVybiB7XG4gICAgcHJ2OiBjaGlsZC50b0Jhc2U1OCgpLFxuICAgIHB1YjogY2hpbGQubmV1dGVyZWQoKS50b0Jhc2U1OCgpLFxuICAgIGRlcml2YXRpb25QYXRoLFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlU2FmZUNoaWxkSGFyZGVuZWRGcm9tWHBydihyb290WHBydjogc3RyaW5nLCBpbmRleDogc3RyaW5nIHwgbnVtYmVyKTogU2FmZUhhcmRlbmVkQ2hpbGRLZXkge1xuICBjb25zdCBpZHggPSBwYXJzZVNhZmVEZXJpdmF0aW9uSW5kZXgoaW5kZXgpO1xuICBjb25zdCBkZXJpdmF0aW9uUGF0aCA9IGdldFNhZmVIYXJkZW5lZERlcml2YXRpb25QYXRoKGlkeCk7XG4gIHJldHVybiBjaGlsZEZyb21Ob2RlKGJpcDMyLmZyb21CYXNlNTgocm9vdFhwcnYpLmRlcml2ZUhhcmRlbmVkKGlkeCksIGRlcml2YXRpb25QYXRoKTtcbn1cblxuLyoqIFJlLWRlcml2ZSBhbmQgYXNzZXJ0IGJvdGggcmVzdWx0cyBtYXRjaCBiZWZvcmUgdGhlIGNoaWxkIGlzIHJlZ2lzdGVyZWQuICovXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlQW5kU2VsZkNoZWNrU2FmZUNoaWxkSGFyZGVuZWQocm9vdFhwcnY6IHN0cmluZywgaW5kZXg6IHN0cmluZyB8IG51bWJlcik6IFNhZmVIYXJkZW5lZENoaWxkS2V5IHtcbiAgY29uc3QgZmlyc3QgPSBkZXJpdmVTYWZlQ2hpbGRIYXJkZW5lZEZyb21YcHJ2KHJvb3RYcHJ2LCBpbmRleCk7XG4gIGNvbnN0IHNlY29uZCA9IGRlcml2ZVNhZmVDaGlsZEhhcmRlbmVkRnJvbVhwcnYocm9vdFhwcnYsIGluZGV4KTtcbiAgaWYgKGZpcnN0LnB1YiAhPT0gc2Vjb25kLnB1YiB8fCBmaXJzdC5wcnYgIT09IHNlY29uZC5wcnYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNhZmUgY2hpbGQgc2VsZi1jaGVjayBmYWlsZWQgYXQgJHtmaXJzdC5kZXJpdmF0aW9uUGF0aH06IGRlcml2YXRpb24gd2FzIG5vdCBkZXRlcm1pbmlzdGljYCk7XG4gIH1cbiAgcmV0dXJuIGZpcnN0O1xufVxuXG4vKipcbiAqIFNMSVAtMDAxMCBoYXJkZW5lZCBkZXJpdmF0aW9uIG9mIGEgc2FmZSB1c2VyIGNoaWxkIGZyb20gYW4gZWQyNTUxOSByb290IHNlY3JldCBzZWVkLlxuICpcbiAqIGByb290UHJ2YCBpcyBhIFN0ZWxsYXIgU3RyS2V5IGBT4oCmYCBzZWNyZXQgc2VlZCAod2hhdCBzbG90LeKRoyBgZWQyNTUxOU11bHRpc2lnYCB1c2VyIHJvb3RzIHN0b3JlKS5cbiAqIFRoZSBkZXJpdmF0aW9uIHJldXNlcyB0aGUgZXhpc3RpbmcgU0xJUC0wMDEwIGltcGxlbWVudGF0aW9uIHtAbGluayBFZDI1NTE5S2V5RGVyaXZlci5kZXJpdmVQYXRofVxuICogKGhhcmRlbmVkLW9ubHkgQ0tEUHJpdiBvdmVyIHRoZSBgZWQyNTUxOSBzZWVkYCBITUFDIG1hc3RlciksIHRoZW4gZXhwYW5kcyB0aGUgcmVzdWx0aW5nIDMyLWJ5dGVcbiAqIGNoaWxkIHNlZWQgaW50byBhIGtleXBhaXIgd2l0aCBgbmFjbGAuIFRoZSBjaGlsZCBgcHViYCBpcyBhIGJhcmUgU3RyS2V5IGBH4oCmYDsgdGhlIGBwcnZgIGlzIHRoZVxuICogcmF3IDMyLWJ5dGUgY2hpbGQgc2VlZCBhcyBoZXggKHRoZSBzZWVkIGlucHV0IGEgc2lnbmVyIG5lZWRzKS5cbiAqXG4gKiBVbmxpa2UgdGhlIHNlY3AyNTZrMSBwYXRoLCBlZDI1NTE5IGhhcmRlbmVkIGRlcml2YXRpb24gbmVlZHMgbm8gY2hhaW4gY29kZSDigJQgdGhlIGNvbXBvc2l0ZVxuICogYHB1YuKAlmNoYWluQ29kZWAgZm9ybSBpcyBvbmx5IGZvciBTT0ZUIGNvLXNpZ25lciBkZXJpdmF0aW9uIGFuZCBpcyBub3QgdXNlZCBoZXJlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVyaXZlU2FmZUNoaWxkRWQyNTUxOUhhcmRlbmVkKHJvb3RQcnY6IHN0cmluZywgaW5kZXg6IHN0cmluZyB8IG51bWJlcik6IFNhZmVIYXJkZW5lZENoaWxkS2V5IHtcbiAgY29uc3QgaWR4ID0gcGFyc2VTYWZlRGVyaXZhdGlvbkluZGV4KGluZGV4KTtcbiAgY29uc3QgZGVyaXZhdGlvblBhdGggPSBnZXRTYWZlSGFyZGVuZWREZXJpdmF0aW9uUGF0aChpZHgpO1xuICBjb25zdCByYXdTZWVkSGV4ID0gZGVjb2RlRWQyNTUxOVN0cktleVNlY3JldFNlZWQocm9vdFBydikudG9TdHJpbmcoJ2hleCcpO1xuICBjb25zdCBjaGlsZFNlZWQgPSBFZDI1NTE5S2V5RGVyaXZlci5kZXJpdmVQYXRoKGRlcml2YXRpb25QYXRoLCByYXdTZWVkSGV4KS5rZXk7XG4gIGNvbnN0IGtleVBhaXIgPSBuYWNsLnNpZ24ua2V5UGFpci5mcm9tU2VlZChVaW50OEFycmF5LmZyb20oY2hpbGRTZWVkKSk7XG4gIGNvbnN0IHB1YiA9IGVuY29kZUVkMjU1MTlTdHJLZXlQdWJsaWNLZXkoQnVmZmVyLmZyb20oa2V5UGFpci5wdWJsaWNLZXkpKTtcbiAgcmV0dXJuIHtcbiAgICBwcnY6IEJ1ZmZlci5mcm9tKGNoaWxkU2VlZCkudG9TdHJpbmcoJ2hleCcpLFxuICAgIHB1YixcbiAgICBkZXJpdmF0aW9uUGF0aCxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ import type { RootKeyType } from '@bitgo/public-types';
2
+ type OnchainSafeRootKeySlot = Extract<RootKeyType, 'secp256k1Multisig' | 'ed25519Multisig'>;
3
+ type TssSafeRootKeySlot = Extract<RootKeyType, 'ecdsaMpc'>;
4
+ export declare function onchainSlotForCoin(chain: string): OnchainSafeRootKeySlot;
5
+ export declare function tssSlotForCoin(chain: string): TssSafeRootKeySlot;
6
+ export {};
7
+ //# sourceMappingURL=safeSlot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safeSlot.d.ts","sourceRoot":"","sources":["../../src/safeSlot.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,KAAK,sBAAsB,GAAG,OAAO,CAAC,WAAW,EAAE,mBAAmB,GAAG,iBAAiB,CAAC,CAAC;AAC5F,KAAK,kBAAkB,GAAG,OAAO,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AAE3D,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,sBAAsB,CASxE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAShE"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.onchainSlotForCoin = onchainSlotForCoin;
4
+ exports.tssSlotForCoin = tssSlotForCoin;
5
+ /**
6
+ * @prettier
7
+ *
8
+ * @experimental Shared safe slot-for-coin mapping.
9
+ *
10
+ * Maps a coin chain + minting model to the safe root slot that derives it. The slot
11
+ * is a signing scheme, not a coin: slot ① secp256k1Multisig serves UTXO + XRP + TRX + …,
12
+ * slot ④ ed25519Multisig serves ALGO/XLM/HBAR, and ecdsaMpc serves TSS coins.
13
+ *
14
+ * The multisigType-vs-coin validation stays in sdk-core (it needs IBaseCoin); these
15
+ * functions take only the chain so this leaf never imports sdk-core.
16
+ */
17
+ const statics_1 = require("@bitgo-beta/statics");
18
+ function onchainSlotForCoin(chain) {
19
+ const curve = statics_1.coins.get(chain).primaryKeyCurve;
20
+ if (curve === statics_1.KeyCurve.Secp256k1) {
21
+ return 'secp256k1Multisig';
22
+ }
23
+ if (curve === statics_1.KeyCurve.Ed25519) {
24
+ return 'ed25519Multisig';
25
+ }
26
+ throw new Error(`Coin '${chain}' is not supported for safe wallet minting`);
27
+ }
28
+ function tssSlotForCoin(chain) {
29
+ const curve = statics_1.coins.get(chain).primaryKeyCurve;
30
+ if (curve === statics_1.KeyCurve.Secp256k1) {
31
+ return 'ecdsaMpc';
32
+ }
33
+ if (curve === statics_1.KeyCurve.Ed25519) {
34
+ throw new Error('ed25519 MPC safe wallet minting is not yet supported');
35
+ }
36
+ throw new Error(`Coin '${chain}' is not supported for safe wallet minting`);
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FmZVNsb3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2FmZVNsb3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFrQkEsZ0RBU0M7QUFFRCx3Q0FTQztBQXRDRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILGlEQUFzRDtBQU10RCxTQUFnQixrQkFBa0IsQ0FBQyxLQUFhO0lBQzlDLE1BQU0sS0FBSyxHQUFHLGVBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsZUFBZSxDQUFDO0lBQy9DLElBQUksS0FBSyxLQUFLLGtCQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDakMsT0FBTyxtQkFBbUIsQ0FBQztJQUM3QixDQUFDO0lBQ0QsSUFBSSxLQUFLLEtBQUssa0JBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMvQixPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7SUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLFNBQVMsS0FBSyw0Q0FBNEMsQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsS0FBYTtJQUMxQyxNQUFNLEtBQUssR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLGVBQWUsQ0FBQztJQUMvQyxJQUFJLEtBQUssS0FBSyxrQkFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFJLEtBQUssS0FBSyxrQkFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQy9CLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxTQUFTLEtBQUssNENBQTRDLENBQUMsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqXG4gKiBAZXhwZXJpbWVudGFsIFNoYXJlZCBzYWZlIHNsb3QtZm9yLWNvaW4gbWFwcGluZy5cbiAqXG4gKiBNYXBzIGEgY29pbiBjaGFpbiArIG1pbnRpbmcgbW9kZWwgdG8gdGhlIHNhZmUgcm9vdCBzbG90IHRoYXQgZGVyaXZlcyBpdC4gVGhlIHNsb3RcbiAqIGlzIGEgc2lnbmluZyBzY2hlbWUsIG5vdCBhIGNvaW46IHNsb3Qg4pGgIHNlY3AyNTZrMU11bHRpc2lnIHNlcnZlcyBVVFhPICsgWFJQICsgVFJYICsg4oCmLFxuICogc2xvdCDikaMgZWQyNTUxOU11bHRpc2lnIHNlcnZlcyBBTEdPL1hMTS9IQkFSLCBhbmQgZWNkc2FNcGMgc2VydmVzIFRTUyBjb2lucy5cbiAqXG4gKiBUaGUgbXVsdGlzaWdUeXBlLXZzLWNvaW4gdmFsaWRhdGlvbiBzdGF5cyBpbiBzZGstY29yZSAoaXQgbmVlZHMgSUJhc2VDb2luKTsgdGhlc2VcbiAqIGZ1bmN0aW9ucyB0YWtlIG9ubHkgdGhlIGNoYWluIHNvIHRoaXMgbGVhZiBuZXZlciBpbXBvcnRzIHNkay1jb3JlLlxuICovXG5pbXBvcnQgeyBjb2lucywgS2V5Q3VydmUgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCB0eXBlIHsgUm9vdEtleVR5cGUgfSBmcm9tICdAYml0Z28vcHVibGljLXR5cGVzJztcblxudHlwZSBPbmNoYWluU2FmZVJvb3RLZXlTbG90ID0gRXh0cmFjdDxSb290S2V5VHlwZSwgJ3NlY3AyNTZrMU11bHRpc2lnJyB8ICdlZDI1NTE5TXVsdGlzaWcnPjtcbnR5cGUgVHNzU2FmZVJvb3RLZXlTbG90ID0gRXh0cmFjdDxSb290S2V5VHlwZSwgJ2VjZHNhTXBjJz47XG5cbmV4cG9ydCBmdW5jdGlvbiBvbmNoYWluU2xvdEZvckNvaW4oY2hhaW46IHN0cmluZyk6IE9uY2hhaW5TYWZlUm9vdEtleVNsb3Qge1xuICBjb25zdCBjdXJ2ZSA9IGNvaW5zLmdldChjaGFpbikucHJpbWFyeUtleUN1cnZlO1xuICBpZiAoY3VydmUgPT09IEtleUN1cnZlLlNlY3AyNTZrMSkge1xuICAgIHJldHVybiAnc2VjcDI1NmsxTXVsdGlzaWcnO1xuICB9XG4gIGlmIChjdXJ2ZSA9PT0gS2V5Q3VydmUuRWQyNTUxOSkge1xuICAgIHJldHVybiAnZWQyNTUxOU11bHRpc2lnJztcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYENvaW4gJyR7Y2hhaW59JyBpcyBub3Qgc3VwcG9ydGVkIGZvciBzYWZlIHdhbGxldCBtaW50aW5nYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0c3NTbG90Rm9yQ29pbihjaGFpbjogc3RyaW5nKTogVHNzU2FmZVJvb3RLZXlTbG90IHtcbiAgY29uc3QgY3VydmUgPSBjb2lucy5nZXQoY2hhaW4pLnByaW1hcnlLZXlDdXJ2ZTtcbiAgaWYgKGN1cnZlID09PSBLZXlDdXJ2ZS5TZWNwMjU2azEpIHtcbiAgICByZXR1cm4gJ2VjZHNhTXBjJztcbiAgfVxuICBpZiAoY3VydmUgPT09IEtleUN1cnZlLkVkMjU1MTkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2VkMjU1MTkgTVBDIHNhZmUgd2FsbGV0IG1pbnRpbmcgaXMgbm90IHlldCBzdXBwb3J0ZWQnKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYENvaW4gJyR7Y2hhaW59JyBpcyBub3Qgc3VwcG9ydGVkIGZvciBzYWZlIHdhbGxldCBtaW50aW5nYCk7XG59XG4iXX0=