@tatumio/wallet-sdk 0.1.0 → 0.2.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.
package/README.md CHANGED
@@ -99,11 +99,8 @@ Before signing, you can simulate/validate a transaction (balance changes, risk s
99
99
  ```ts
100
100
  const evaluation = await client.evaluateTransaction({
101
101
  query: { chainId: WalletChain.ETHEREUM_MAINNET },
102
- body: {
103
- network: "ethereum",
104
- transaction: { toAddress: "0x...", value: "10000000000000000" },
105
- },
106
- }); // typed as EvaluateTransactionResponse
102
+ body: { to: "0x...", value: "0x2386f26fc10000", operationType: "all" },
103
+ }); // typed as EvaluateTransactionResponse ({ chain, validation?, simulation? })
107
104
  ```
108
105
 
109
106
  ### Backup and recovery
@@ -0,0 +1,7 @@
1
+ export interface Bk {
2
+ x: bigint;
3
+ rank: number;
4
+ }
5
+ /** First row of the pseudoinverse — the interpolation weights that recover the secret. */
6
+ export declare function computeBkCoefficient(bks: Bk[], threshold: number, fieldOrder: bigint): bigint[];
7
+ //# sourceMappingURL=birkhoff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"birkhoff.d.ts","sourceRoot":"","sources":["../../src/eject/birkhoff.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,EAAE;IACjB,CAAC,EAAE,MAAM,CAAC;IACV,IAAI,EAAE,MAAM,CAAC;CACd;AAgCD,0FAA0F;AAC1F,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE,CAG/F"}
@@ -0,0 +1,33 @@
1
+ import { Matrix } from './matrix.js';
2
+ import { modPow } from './curves.js';
3
+ /** Coefficient of the differential monomial of given degree/rank evaluated at x. */
4
+ function getDiffMonomialCoeff(x, fieldOrder, degree, rank) {
5
+ if (degree < rank)
6
+ return 0n;
7
+ if (degree === 0)
8
+ return 1n;
9
+ let extra = 1n;
10
+ for (let j = 0; j < rank; j++)
11
+ extra *= BigInt(degree - j);
12
+ const power = BigInt(degree - rank);
13
+ const result = modPow(x, power, fieldOrder);
14
+ return (result * extra) % fieldOrder;
15
+ }
16
+ function getLinearEquationCoefficient(bkX, fieldOrder, degreePoly, rank) {
17
+ const result = new Array(degreePoly + 1);
18
+ for (let i = 0; i < result.length; i++) {
19
+ result[i] = getDiffMonomialCoeff(bkX, fieldOrder, i, rank);
20
+ }
21
+ return result;
22
+ }
23
+ function linearEquationCoefficientMatrix(bks, threshold, fieldOrder) {
24
+ const degree = threshold - 1;
25
+ const data = bks.map((bk) => getLinearEquationCoefficient(bk.x, fieldOrder, degree, bk.rank));
26
+ return new Matrix(fieldOrder, data);
27
+ }
28
+ /** First row of the pseudoinverse — the interpolation weights that recover the secret. */
29
+ export function computeBkCoefficient(bks, threshold, fieldOrder) {
30
+ const matrix = linearEquationCoefficientMatrix(bks, threshold, fieldOrder);
31
+ return matrix.Pseudoinverse().GetRow(0);
32
+ }
33
+ //# sourceMappingURL=birkhoff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"birkhoff.js","sourceRoot":"","sources":["../../src/eject/birkhoff.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAOrC,oFAAoF;AACpF,SAAS,oBAAoB,CAAC,CAAS,EAAE,UAAkB,EAAE,MAAc,EAAE,IAAY;IACvF,IAAI,MAAM,GAAG,IAAI;QAAE,OAAO,EAAE,CAAC;IAC7B,IAAI,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC5B,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE;QAAE,KAAK,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAC5C,OAAO,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,UAAU,CAAC;AACvC,CAAC;AAED,SAAS,4BAA4B,CACnC,GAAW,EACX,UAAkB,EAClB,UAAkB,EAClB,IAAY;IAEZ,MAAM,MAAM,GAAa,IAAI,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;IACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,CAAC,CAAC,GAAG,oBAAoB,CAAC,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,+BAA+B,CAAC,GAAS,EAAE,SAAiB,EAAE,UAAkB;IACvF,MAAM,MAAM,GAAG,SAAS,GAAG,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9F,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,oBAAoB,CAAC,GAAS,EAAE,SAAiB,EAAE,UAAkB;IACnF,MAAM,MAAM,GAAG,+BAA+B,CAAC,GAAG,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC3E,OAAO,MAAM,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,24 @@
1
+ import type { Curve } from '../portal/types/index.js';
2
+ export type { Curve };
3
+ /** Group orders for the supported curves (the modulus for share arithmetic). */
4
+ export declare const FIELD_ORDER: Record<Curve, bigint>;
5
+ /** Always-non-negative remainder. */
6
+ export declare function mod(a: bigint, m: bigint): bigint;
7
+ /** Modular exponentiation x^n mod m. */
8
+ export declare function modPow(x: bigint, n: bigint, m: bigint): bigint;
9
+ /** Modular inverse via the extended Euclidean algorithm. Throws if none exists. */
10
+ export declare function modInverse(a: bigint, m: bigint): bigint;
11
+ export declare function bytesToHex(bytes: Uint8Array): string;
12
+ /** Minimal big-endian byte representation of a non-negative bigint. */
13
+ export declare function bigIntToBytesBE(value: bigint): Uint8Array;
14
+ /** 32-byte big-endian hex string (left-padded). */
15
+ export declare function toPaddedHexBE(value: bigint): string;
16
+ /**
17
+ * Reverse the minimal big-endian bytes of `value` into a 32-byte buffer,
18
+ * right-aligned (zero-padded at the front). This matches @portal-hq/eject-js's
19
+ * ed25519 output exactly — including its treatment of scalars with leading
20
+ * zero bytes — so reconstructed keys are byte-identical to the reference.
21
+ * Note: this is NOT a plain left-aligned little-endian encoding.
22
+ */
23
+ export declare function toLittleEndian32(value: bigint): Uint8Array;
24
+ //# sourceMappingURL=curves.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curves.d.ts","sourceRoot":"","sources":["../../src/eject/curves.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAEtD,YAAY,EAAE,KAAK,EAAE,CAAC;AAEtB,gFAAgF;AAChF,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAG7C,CAAC;AAEF,qCAAqC;AACrC,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wCAAwC;AACxC,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAW9D;AAED,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAYvD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIpD;AAED,uEAAuE;AACvE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CASzD;AAED,mDAAmD;AACnD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAQ1D"}
@@ -0,0 +1,85 @@
1
+ /** Group orders for the supported curves (the modulus for share arithmetic). */
2
+ export const FIELD_ORDER = {
3
+ SECP256K1: BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141'),
4
+ ED25519: BigInt('0x1000000000000000000000000000000014def9dea2f79cd65812631a5cf5d3ed'),
5
+ };
6
+ /** Always-non-negative remainder. */
7
+ export function mod(a, m) {
8
+ return ((a % m) + m) % m;
9
+ }
10
+ /** Modular exponentiation x^n mod m. */
11
+ export function modPow(x, n, m) {
12
+ if (m === 1n)
13
+ return 0n;
14
+ let result = 1n;
15
+ let base = x % m;
16
+ let exp = n;
17
+ while (exp > 0n) {
18
+ if (exp % 2n === 1n)
19
+ result = (result * base) % m;
20
+ exp /= 2n;
21
+ base = (base * base) % m;
22
+ }
23
+ return result;
24
+ }
25
+ /** Modular inverse via the extended Euclidean algorithm. Throws if none exists. */
26
+ export function modInverse(a, m) {
27
+ const aa = mod(a, m);
28
+ if (aa === 0n)
29
+ throw new Error('Modular inverse does not exist');
30
+ let [oldR, r] = [aa, m];
31
+ let [oldS, s] = [1n, 0n];
32
+ while (r !== 0n) {
33
+ const q = oldR / r;
34
+ [oldR, r] = [r, oldR - q * r];
35
+ [oldS, s] = [s, oldS - q * s];
36
+ }
37
+ if (oldR !== 1n)
38
+ throw new Error('Modular inverse does not exist');
39
+ return mod(oldS, m);
40
+ }
41
+ export function bytesToHex(bytes) {
42
+ let out = '';
43
+ for (const b of bytes)
44
+ out += b.toString(16).padStart(2, '0');
45
+ return out;
46
+ }
47
+ /** Minimal big-endian byte representation of a non-negative bigint. */
48
+ export function bigIntToBytesBE(value) {
49
+ let hex = value.toString(16);
50
+ if (hex.length % 2)
51
+ hex = '0' + hex;
52
+ const len = hex.length / 2;
53
+ const out = new Uint8Array(len);
54
+ for (let i = 0; i < len; i++) {
55
+ out[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
56
+ }
57
+ return out;
58
+ }
59
+ /** 32-byte big-endian hex string (left-padded). */
60
+ export function toPaddedHexBE(value) {
61
+ const bytes = bigIntToBytesBE(value);
62
+ if (bytes.length > 32)
63
+ throw new Error('Private key is longer than 32 bytes');
64
+ const padded = new Uint8Array(32);
65
+ padded.set(bytes, 32 - bytes.length);
66
+ return bytesToHex(padded);
67
+ }
68
+ /**
69
+ * Reverse the minimal big-endian bytes of `value` into a 32-byte buffer,
70
+ * right-aligned (zero-padded at the front). This matches @portal-hq/eject-js's
71
+ * ed25519 output exactly — including its treatment of scalars with leading
72
+ * zero bytes — so reconstructed keys are byte-identical to the reference.
73
+ * Note: this is NOT a plain left-aligned little-endian encoding.
74
+ */
75
+ export function toLittleEndian32(value) {
76
+ const bytes = bigIntToBytesBE(value);
77
+ if (bytes.length > 32)
78
+ throw new Error('Private key is longer than 32 bytes');
79
+ const reversed = new Uint8Array(32);
80
+ for (let i = 0; i < bytes.length; i++) {
81
+ reversed[32 - 1 - i] = bytes[i];
82
+ }
83
+ return reversed;
84
+ }
85
+ //# sourceMappingURL=curves.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"curves.js","sourceRoot":"","sources":["../../src/eject/curves.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { reconstructPrivateKey } from './reconstruct.js';
2
+ export type { ReconstructPrivateKeyParams } from './reconstruct.js';
3
+ export type { ShareInput } from './shares.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/eject/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,YAAY,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AACpE,YAAY,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { reconstructPrivateKey } from './reconstruct.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/eject/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /** Dense matrix over the integers mod `fieldOrder`. Ported from @portal-hq/eject-js. */
2
+ export declare class Matrix {
3
+ readonly fieldOrder: bigint;
4
+ data: bigint[][];
5
+ rows: number;
6
+ cols: number;
7
+ constructor(fieldOrder: bigint, data: bigint[][]);
8
+ Copy(): Matrix;
9
+ Transpose(): Matrix;
10
+ multiply(other: Matrix): Matrix;
11
+ Inverse(): Matrix;
12
+ modulus(): Matrix;
13
+ GetRow(index: number): bigint[];
14
+ /** (MᵀM)⁻¹Mᵀ — left pseudoinverse, reduced mod field order. */
15
+ Pseudoinverse(): Matrix;
16
+ }
17
+ //# sourceMappingURL=matrix.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrix.d.ts","sourceRoot":"","sources":["../../src/eject/matrix.ts"],"names":[],"mappings":"AAEA,wFAAwF;AACxF,qBAAa,MAAM;IACjB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;gBAED,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IAOhD,IAAI,IAAI,MAAM;IAOd,SAAS,IAAI,MAAM;IAcnB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAmB/B,OAAO,IAAI,MAAM;IAyCjB,OAAO,IAAI,MAAM;IASjB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAK/B,+DAA+D;IAC/D,aAAa,IAAI,MAAM;CASxB"}
@@ -0,0 +1,110 @@
1
+ import { mod, modInverse } from './curves.js';
2
+ /** Dense matrix over the integers mod `fieldOrder`. Ported from @portal-hq/eject-js. */
3
+ export class Matrix {
4
+ fieldOrder;
5
+ data;
6
+ rows;
7
+ cols;
8
+ constructor(fieldOrder, data) {
9
+ this.fieldOrder = fieldOrder;
10
+ this.data = data;
11
+ this.rows = data.length;
12
+ this.cols = data[0]?.length ?? 0;
13
+ }
14
+ Copy() {
15
+ return new Matrix(this.fieldOrder, this.data.map((row) => [...row]));
16
+ }
17
+ Transpose() {
18
+ const newData = Array.from({ length: this.cols }, () => Array.from({ length: this.rows }, () => 0n));
19
+ for (let i = 0; i < this.rows; i++) {
20
+ for (let j = 0; j < this.cols; j++) {
21
+ newData[j][i] = this.data[i][j];
22
+ }
23
+ }
24
+ this.data = newData;
25
+ [this.rows, this.cols] = [this.cols, this.rows];
26
+ return this;
27
+ }
28
+ multiply(other) {
29
+ if (this.cols !== other.rows) {
30
+ throw new Error("Matrix dimensions don't match for multiplication");
31
+ }
32
+ const result = Array.from({ length: this.rows }, () => Array.from({ length: other.cols }, () => 0n));
33
+ for (let i = 0; i < this.rows; i++) {
34
+ for (let j = 0; j < other.cols; j++) {
35
+ let acc = 0n;
36
+ for (let k = 0; k < this.cols; k++) {
37
+ acc = (acc + this.data[i][k] * other.data[k][j]) % this.fieldOrder;
38
+ }
39
+ result[i][j] = acc;
40
+ }
41
+ }
42
+ return new Matrix(this.fieldOrder, result);
43
+ }
44
+ Inverse() {
45
+ if (this.rows !== this.cols)
46
+ throw new Error('Only square matrices can be inverted');
47
+ const n = this.rows;
48
+ const aug = Array.from({ length: n }, () => Array.from({ length: 2 * n }, () => 0n));
49
+ for (let i = 0; i < n; i++) {
50
+ for (let j = 0; j < n; j++)
51
+ aug[i][j] = this.data[i][j];
52
+ aug[i][i + n] = 1n;
53
+ }
54
+ for (let i = 0; i < n; i++) {
55
+ let pivotRow = i;
56
+ for (let j = i + 1; j < n; j++) {
57
+ if (aug[j][i] !== 0n) {
58
+ pivotRow = j;
59
+ break;
60
+ }
61
+ }
62
+ if (aug[pivotRow][i] === 0n)
63
+ throw new Error('Matrix is singular and cannot be inverted');
64
+ if (pivotRow !== i)
65
+ [aug[i], aug[pivotRow]] = [aug[pivotRow], aug[i]];
66
+ const pivotInv = modInverse(aug[i][i], this.fieldOrder);
67
+ for (let j = 0; j < 2 * n; j++) {
68
+ aug[i][j] = (aug[i][j] * pivotInv) % this.fieldOrder;
69
+ }
70
+ for (let j = 0; j < n; j++) {
71
+ if (j === i)
72
+ continue;
73
+ const factor = aug[j][i];
74
+ for (let k = 0; k < 2 * n; k++) {
75
+ aug[j][k] = mod(aug[j][k] - factor * aug[i][k], this.fieldOrder);
76
+ }
77
+ }
78
+ }
79
+ const inverse = Array.from({ length: n }, () => Array.from({ length: n }, () => 0n));
80
+ for (let i = 0; i < n; i++) {
81
+ for (let j = 0; j < n; j++)
82
+ inverse[i][j] = aug[i][j + n];
83
+ }
84
+ return new Matrix(this.fieldOrder, inverse);
85
+ }
86
+ modulus() {
87
+ for (let i = 0; i < this.rows; i++) {
88
+ for (let j = 0; j < this.cols; j++) {
89
+ this.data[i][j] = mod(this.data[i][j], this.fieldOrder);
90
+ }
91
+ }
92
+ return this;
93
+ }
94
+ GetRow(index) {
95
+ if (index < 0 || index >= this.rows)
96
+ throw new Error('Row index out of bounds');
97
+ return [...this.data[index]];
98
+ }
99
+ /** (MᵀM)⁻¹Mᵀ — left pseudoinverse, reduced mod field order. */
100
+ Pseudoinverse() {
101
+ const copy = this.Copy();
102
+ const copyTranspose = this.Copy().Transpose();
103
+ const symmetric = copyTranspose.multiply(copy);
104
+ const inverseSymmetric = symmetric.Inverse();
105
+ const result = inverseSymmetric.multiply(copyTranspose);
106
+ result.modulus();
107
+ return result;
108
+ }
109
+ }
110
+ //# sourceMappingURL=matrix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"matrix.js","sourceRoot":"","sources":["../../src/eject/matrix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { type Curve } from './curves.js';
2
+ import { type ShareInput } from './shares.js';
3
+ export interface ReconstructPrivateKeyParams {
4
+ curve: Curve;
5
+ /** Decrypted client backup share (plaintext of encryptedClientBackupShare). */
6
+ clientShare: ShareInput;
7
+ /** Custodian backup share, as returned by getEjectableBackupShares. */
8
+ custodianShare: ShareInput;
9
+ }
10
+ /**
11
+ * Reconstruct a wallet's full private key from its two ejectable backup shares.
12
+ * Returns 64-char big-endian hex for SECP256K1, Base58 for ED25519. Throws on
13
+ * malformed shares or a public-key mismatch.
14
+ */
15
+ export declare function reconstructPrivateKey(params: ReconstructPrivateKeyParams): Promise<string>;
16
+ //# sourceMappingURL=reconstruct.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconstruct.d.ts","sourceRoot":"","sources":["../../src/eject/reconstruct.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,KAAK,KAAK,EACX,MAAM,aAAa,CAAC;AACrB,OAAO,EAML,KAAK,UAAU,EAChB,MAAM,aAAa,CAAC;AAIrB,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,KAAK,CAAC;IACb,+EAA+E;IAC/E,WAAW,EAAE,UAAU,CAAC;IACxB,uEAAuE;IACvE,cAAc,EAAE,UAAU,CAAC;CAC5B;AA+BD;;;;GAIG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,2BAA2B,GAAG,OAAO,CAAC,MAAM,CAAC,CAehG"}
@@ -0,0 +1,48 @@
1
+ import { secp256k1 } from '@noble/curves/secp256k1';
2
+ import { ed25519 } from '@noble/curves/ed25519';
3
+ import { base58 } from '@scure/base';
4
+ import { computeBkCoefficient } from './birkhoff.js';
5
+ import { FIELD_ORDER, mod, toLittleEndian32, toPaddedHexBE, } from './curves.js';
6
+ import { setupPeers, validateClientShare, validateCustodianShare, } from './shares.js';
7
+ const THRESHOLD = 2;
8
+ /** secret · G, in affine coordinates, for the chosen curve. */
9
+ function derivePublicKeyPoint(curve, secret) {
10
+ const point = curve === 'SECP256K1'
11
+ ? secp256k1.Point.BASE.multiply(secret)
12
+ : ed25519.Point.BASE.multiply(secret);
13
+ const { x, y } = point.toAffine();
14
+ return { x, y };
15
+ }
16
+ /** Combine peers into the secret scalar and verify it against the expected pubkey. */
17
+ function recoverScalar(curve, expectedPubkey, peers) {
18
+ const fieldOrder = FIELD_ORDER[curve];
19
+ const coefs = computeBkCoefficient(peers.map((p) => p.bk), THRESHOLD, fieldOrder);
20
+ let secret = 0n;
21
+ for (let i = 0; i < coefs.length; i++) {
22
+ secret = mod(secret + coefs[i] * peers[i].share, fieldOrder);
23
+ }
24
+ const derived = derivePublicKeyPoint(curve, secret);
25
+ if (derived.x !== expectedPubkey.x || derived.y !== expectedPubkey.y) {
26
+ throw new Error('Derived public key does not match expected public key');
27
+ }
28
+ return secret;
29
+ }
30
+ /**
31
+ * Reconstruct a wallet's full private key from its two ejectable backup shares.
32
+ * Returns 64-char big-endian hex for SECP256K1, Base58 for ED25519. Throws on
33
+ * malformed shares or a public-key mismatch.
34
+ */
35
+ export async function reconstructPrivateKey(params) {
36
+ const { curve } = params;
37
+ if (curve !== 'SECP256K1' && curve !== 'ED25519') {
38
+ throw new Error(`Unsupported curve: ${String(curve)}`);
39
+ }
40
+ const client = validateClientShare(params.clientShare);
41
+ const custodian = validateCustodianShare(params.custodianShare);
42
+ const peers = setupPeers({ share: client.share, serverBkX: client.serverBkX }, { share: custodian.share, clientBkX: custodian.clientBkX });
43
+ const secret = recoverScalar(curve, client.pubkey, peers);
44
+ if (curve === 'SECP256K1')
45
+ return toPaddedHexBE(secret);
46
+ return base58.encode(toLittleEndian32(secret));
47
+ }
48
+ //# sourceMappingURL=reconstruct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconstruct.js","sourceRoot":"","sources":["../../src/eject/reconstruct.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { Bk } from './birkhoff.js';
2
+ export type ShareInput = string | object | Uint8Array;
3
+ export interface PublicKeyCoords {
4
+ x: bigint;
5
+ y: bigint;
6
+ }
7
+ export interface Peer {
8
+ share: bigint;
9
+ bk: Bk;
10
+ }
11
+ /** Normalize a string | Uint8Array | object DKG result into a plain record. */
12
+ export declare function parseShareInput(input: ShareInput): Record<string, unknown>;
13
+ export declare function validateClientShare(input: ShareInput): {
14
+ pubkey: PublicKeyCoords;
15
+ share: string;
16
+ serverBkX: string;
17
+ };
18
+ export declare function validateCustodianShare(input: ShareInput): {
19
+ share: string;
20
+ clientBkX: string;
21
+ };
22
+ /**
23
+ * Build the two peers for recovery. Mirrors the reference cross-wiring:
24
+ * the client peer's Birkhoff x comes from the custodian share's clientBk, and
25
+ * the server peer's Birkhoff x comes from the client share's bks.server.x.
26
+ */
27
+ export declare function setupPeers(client: {
28
+ share: string;
29
+ serverBkX: string;
30
+ }, custodian: {
31
+ share: string;
32
+ clientBkX: string;
33
+ }): [Peer, Peer];
34
+ //# sourceMappingURL=shares.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shares.d.ts","sourceRoot":"","sources":["../../src/eject/shares.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,IAAI;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,EAAE,CAAC;CACR;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAO1E;AAcD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG;IACtD,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAkBA;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAS9F;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAC5C,SAAS,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAC9C,CAAC,IAAI,EAAE,IAAI,CAAC,CAUd"}
@@ -0,0 +1,67 @@
1
+ /** Normalize a string | Uint8Array | object DKG result into a plain record. */
2
+ export function parseShareInput(input) {
3
+ if (typeof input === 'string')
4
+ return JSON.parse(input);
5
+ if (input instanceof Uint8Array) {
6
+ return JSON.parse(new TextDecoder().decode(input));
7
+ }
8
+ if (typeof input === 'object' && input !== null)
9
+ return { ...input };
10
+ throw new Error('Invalid share format');
11
+ }
12
+ /** Read a property by lower- or upper-cased first letter (DKG results vary in case). */
13
+ function pick(obj, lower, upper) {
14
+ return obj[lower] !== undefined ? obj[lower] : obj[upper];
15
+ }
16
+ function asRecord(value, context) {
17
+ if (typeof value !== 'object' || value === null) {
18
+ throw new Error(`Inputted share does not include necessary fields (${context})`);
19
+ }
20
+ return value;
21
+ }
22
+ export function validateClientShare(input) {
23
+ const share = parseShareInput(input);
24
+ const pubkeyRaw = pick(share, 'pubkey', 'Pubkey');
25
+ const bksRaw = pick(share, 'bks', 'Bks');
26
+ if (pubkeyRaw === undefined || share['share'] === undefined || bksRaw === undefined) {
27
+ throw new Error('Inputted share does not include necessary fields');
28
+ }
29
+ const pubkeyObj = asRecord(pubkeyRaw, 'pubkey');
30
+ const bksObj = asRecord(bksRaw, 'bks');
31
+ const serverBk = asRecord(pick(bksObj, 'server', 'Server'), 'bks.server');
32
+ return {
33
+ pubkey: {
34
+ x: BigInt(String(pick(pubkeyObj, 'x', 'X'))),
35
+ y: BigInt(String(pick(pubkeyObj, 'y', 'Y'))),
36
+ },
37
+ share: String(share['share']),
38
+ serverBkX: String(pick(serverBk, 'x', 'X')),
39
+ };
40
+ }
41
+ export function validateCustodianShare(input) {
42
+ const backup = parseShareInput(input);
43
+ if (backup['share'] === undefined || backup['clientBk'] === undefined) {
44
+ throw new Error('Custodian share does not include necessary fields');
45
+ }
46
+ return {
47
+ share: String(backup['share']),
48
+ clientBkX: String(backup['clientBk']),
49
+ };
50
+ }
51
+ /**
52
+ * Build the two peers for recovery. Mirrors the reference cross-wiring:
53
+ * the client peer's Birkhoff x comes from the custodian share's clientBk, and
54
+ * the server peer's Birkhoff x comes from the client share's bks.server.x.
55
+ */
56
+ export function setupPeers(client, custodian) {
57
+ const clientPeer = {
58
+ share: BigInt(client.share),
59
+ bk: { x: BigInt(custodian.clientBkX), rank: 0 },
60
+ };
61
+ const serverPeer = {
62
+ share: BigInt(custodian.share),
63
+ bk: { x: BigInt(client.serverBkX), rank: 0 },
64
+ };
65
+ return [clientPeer, serverPeer];
66
+ }
67
+ //# sourceMappingURL=shares.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shares.js","sourceRoot":"","sources":["../../src/eject/shares.ts"],"names":[],"mappings":"AAcA,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,KAAiB;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAA4B,CAAC;IACnF,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAA4B,CAAC;IAChF,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,EAAE,GAAI,KAAiC,EAAE,CAAC;IAClG,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;AAC1C,CAAC;AAED,wFAAwF;AACxF,SAAS,IAAI,CAAC,GAA4B,EAAE,KAAa,EAAE,KAAa;IACtE,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,OAAe;IAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CAAC,qDAAqD,OAAO,GAAG,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAiB;IAKnD,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACzC,IAAI,SAAS,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACpF,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,SAAS,GAAG,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,YAAY,CAAC,CAAC;IAC1E,OAAO;QACL,MAAM,EAAE;YACN,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;YAC5C,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;SAC7C;QACD,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC7B,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAiB;IACtD,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,SAAS,EAAE,CAAC;QACtE,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IACD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC9B,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;KACtC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CACxB,MAA4C,EAC5C,SAA+C;IAE/C,MAAM,UAAU,GAAS;QACvB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;QAC3B,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;KAChD,CAAC;IACF,MAAM,UAAU,GAAS;QACvB,KAAK,EAAE,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC;QAC9B,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;KAC7C,CAAC;IACF,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAClC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ export { CustodianApi, custodianOperations } from './portal/custodian.js';
4
4
  export { clientOperations } from './portal/client-api.js';
5
5
  export { enclaveOperations } from './portal/enclave-api.js';
6
6
  export { WalletsClient } from './portal/wallets-client.js';
7
+ export { reconstructPrivateKey } from './eject/index.js';
7
8
  export { TatumWalletsSdk } from './sdk.js';
8
9
  export { WalletsApiClient } from './tatum/api-client.js';
9
10
  export type { WalletChainConfig } from './chains.js';
@@ -11,7 +12,8 @@ export type { CustodianOperation, CustodianRequestOptions } from './portal/custo
11
12
  export type { ClientOperation } from './portal/client-api.js';
12
13
  export type { EnclaveOperation } from './portal/enclave-api.js';
13
14
  export type { InitClientConfig, WalletsClientRequestOptions } from './portal/wallets-client.js';
15
+ export type { ReconstructPrivateKeyParams, ShareInput } from './eject/index.js';
14
16
  export type { PathParamValue } from './path.js';
15
17
  export type { ApiErrorOptions, ApiRequestOptions, HttpMethod, QueryParams, QueryValue, WalletsSDKConfig } from './types.js';
16
- export type { BackupShareCipherTextResponse, BackupSharePair, BackupWalletBody, BackupWalletResponse, BitcoinTransactionResult, BuildTransactionBody, BuildTransactionResponse, ClientDetails, ClientEjectableBackupSharesQuery, ClientEjectableBackupSharesResponse, CreateClientBody, CreateClientResponse, CreateClientSessionBody, CreateClientSessionResponse, Curve, CurveShares, Eip155TransactionResult, EjectableBackupShares, EjectableBackupSharesBackupMethod, EnableEjectBody, EnableEjectResponse, EvaluateTransactionBody, EvaluateTransactionInput, EvaluateTransactionOperationType, EvaluateTransactionQuery, EvaluateTransactionResponse, EvaluateTransactionToken, GenerateWalletResponse, ListClientsQuery, ListClientsResponse, PortalRequestOptions, RawSignBody, RawSignResponse, RecoverWalletBody, RecoverWalletResponse, SendAssetsBody, SendAssetsResponse, SignBody, SignResponse, SigningSharePair, StoreBackupShareBody, SolanaTransactionResult, StellarTransactionResult, TransactionBalanceChange, TransactionEvaluation, TronTransactionResult, UpdateBackupSharePairsBody, UpdateSigningSharePairsBody, Wallet, WalletShare } from './portal/types/index.js';
18
+ export type { BackupShareCipherTextResponse, BackupSharePair, BackupWalletBody, BackupWalletResponse, BitcoinTransactionResult, BuildTransactionBody, BuildTransactionResponse, ClientDetails, ClientEjectableBackupSharesQuery, ClientEjectableBackupSharesResponse, CreateClientBody, CreateClientResponse, CreateClientSessionBody, CreateClientSessionResponse, Curve, CurveShares, Eip155TransactionResult, EjectableBackupShares, EjectableBackupSharesBackupMethod, EnableEjectBody, EnableEjectResponse, EvaluateTransactionBody, EvaluateTransactionEvmBody, EvaluateTransactionOperationType, EvaluateTransactionQuery, EvaluateTransactionResponse, EvaluateTransactionSimulation, EvaluateTransactionSolanaBody, EvaluateTransactionValidation, GenerateWalletResponse, ListClientsQuery, ListClientsResponse, PortalRequestOptions, RawSignBody, RawSignResponse, RecoverWalletBody, RecoverWalletResponse, SendAssetsBody, SendAssetsResponse, SignBody, SignResponse, SigningSharePair, StoreBackupShareBody, SolanaTransactionResult, StellarTransactionResult, TronTransactionResult, UpdateBackupSharePairsBody, UpdateSigningSharePairsBody, Wallet, WalletShare } from './portal/types/index.js';
17
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,YAAY,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACzF,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAChG,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,UAAU,EACV,gBAAgB,EACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,6BAA6B,EAC7B,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,EACb,gCAAgC,EAChC,mCAAmC,EACnC,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,2BAA2B,EAC3B,KAAK,EACL,WAAW,EACX,uBAAuB,EACvB,qBAAqB,EACrB,iCAAiC,EACjC,eAAe,EACf,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,EACxB,gCAAgC,EAChC,wBAAwB,EACxB,2BAA2B,EAC3B,wBAAwB,EACxB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,EACxB,wBAAwB,EACxB,qBAAqB,EACrB,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC3B,MAAM,EACN,WAAW,EACZ,MAAM,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,YAAY,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACzF,YAAY,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,YAAY,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,4BAA4B,CAAC;AAChG,YAAY,EAAE,2BAA2B,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAChF,YAAY,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChD,YAAY,EACV,eAAe,EACf,iBAAiB,EACjB,UAAU,EACV,WAAW,EACX,UAAU,EACV,gBAAgB,EACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,6BAA6B,EAC7B,eAAe,EACf,gBAAgB,EAChB,oBAAoB,EACpB,wBAAwB,EACxB,oBAAoB,EACpB,wBAAwB,EACxB,aAAa,EACb,gCAAgC,EAChC,mCAAmC,EACnC,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,2BAA2B,EAC3B,KAAK,EACL,WAAW,EACX,uBAAuB,EACvB,qBAAqB,EACrB,iCAAiC,EACjC,eAAe,EACf,mBAAmB,EACnB,uBAAuB,EACvB,0BAA0B,EAC1B,gCAAgC,EAChC,wBAAwB,EACxB,2BAA2B,EAC3B,6BAA6B,EAC7B,6BAA6B,EAC7B,6BAA6B,EAC7B,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,EACpB,WAAW,EACX,eAAe,EACf,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,kBAAkB,EAClB,QAAQ,EACR,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,wBAAwB,EACxB,qBAAqB,EACrB,0BAA0B,EAC1B,2BAA2B,EAC3B,MAAM,EACN,WAAW,EACZ,MAAM,yBAAyB,CAAC"}
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ export { CustodianApi, custodianOperations } from './portal/custodian.js';
4
4
  export { clientOperations } from './portal/client-api.js';
5
5
  export { enclaveOperations } from './portal/enclave-api.js';
6
6
  export { WalletsClient } from './portal/wallets-client.js';
7
+ export { reconstructPrivateKey } from './eject/index.js';
7
8
  export { TatumWalletsSdk } from './sdk.js';
8
9
  export { WalletsApiClient } from './tatum/api-client.js';
9
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -1,47 +1,56 @@
1
1
  import type { WalletChain } from '../../chains.js';
2
2
  import type { EjectableBackupShares } from './shared.js';
3
- export interface EvaluateTransactionToken {
4
- address: string;
5
- decimals: number;
6
- symbol: string;
7
- }
8
- export interface EvaluateTransactionInput {
9
- toAddress: string;
10
- /** Native amount in base units (wei for EVM, lamports for Solana). */
11
- value: string;
12
- /** Calldata for contract interactions. */
3
+ export type EvaluateTransactionOperationType = 'validation' | 'simulation' | 'all';
4
+ /** EVM (EIP-155) transaction fields. Mirrors the JSON-RPC tx object. */
5
+ export interface EvaluateTransactionEvmBody {
6
+ /** Target contract or recipient address. */
7
+ to: string;
8
+ /** Encoded calldata (hex). */
13
9
  data?: string;
14
- /** Present when interacting with a token rather than the native asset. */
15
- token?: EvaluateTransactionToken;
10
+ /** Native value in wei (hex). */
11
+ value?: string;
12
+ gas?: string;
13
+ gasPrice?: string;
14
+ maxFeePerGas?: string;
15
+ maxPriorityFeePerGas?: string;
16
+ operationType?: EvaluateTransactionOperationType;
16
17
  }
17
- export type EvaluateTransactionOperationType = 'validation' | 'simulation' | 'all';
18
- export interface EvaluateTransactionBody {
19
- /** Network name, e.g. 'ethereum', 'solana'. */
20
- network: string;
21
- transaction: EvaluateTransactionInput;
22
- /** Defaults to 'all' server-side. */
18
+ /** Solana transaction(s) to evaluate. */
19
+ export interface EvaluateTransactionSolanaBody {
20
+ /** Base58-encoded Solana transactions. */
21
+ transactions: string[];
23
22
  operationType?: EvaluateTransactionOperationType;
24
23
  }
24
+ /** oneOf: EVM tx fields or a Solana `transactions` array, selected by `chainId`. */
25
+ export type EvaluateTransactionBody = EvaluateTransactionEvmBody | EvaluateTransactionSolanaBody;
25
26
  export type EvaluateTransactionQuery = {
27
+ /** CAIP-2 chain id, e.g. `eip155:1`. */
26
28
  chainId: WalletChain;
27
29
  };
28
- export interface TransactionBalanceChange {
29
- token?: EvaluateTransactionToken;
30
- amount?: string;
31
- type?: 'IN' | 'OUT';
32
- }
33
- export interface TransactionEvaluation {
34
- balanceChanges?: TransactionBalanceChange[];
35
- riskScore?: number;
30
+ /** Static validation result (present when `operationType` includes validation). */
31
+ export interface EvaluateTransactionValidation {
32
+ status?: string;
33
+ resultType?: string;
34
+ description?: string;
35
+ reason?: string;
36
36
  classification?: string;
37
+ features?: unknown[];
38
+ }
39
+ /** Simulation result (present when `operationType` includes simulation). */
40
+ export interface EvaluateTransactionSimulation {
41
+ status?: string;
42
+ assetsDiffs?: unknown[];
43
+ totalUsdDiff?: unknown;
44
+ exposures?: unknown[];
45
+ totalUsdExposure?: unknown;
46
+ addressDetails?: unknown;
47
+ accountSummary?: unknown;
37
48
  }
38
- /** Shape varies by chain; EVM returns `evaluation`, Bitcoin returns `unsignedTx`. */
39
49
  export interface EvaluateTransactionResponse {
40
- evaluation?: TransactionEvaluation;
41
- unsignedTx?: {
42
- data?: string;
43
- recentBlockhash?: string;
44
- };
50
+ /** CAIP-2 chain id the evaluation ran against. */
51
+ chain: string;
52
+ validation?: EvaluateTransactionValidation;
53
+ simulation?: EvaluateTransactionSimulation;
45
54
  }
46
55
  export interface UpdateSigningSharePairsBody {
47
56
  signingSharePairIds: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/portal/types/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAGzD,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0EAA0E;IAC1E,KAAK,CAAC,EAAE,wBAAwB,CAAC;CAClC;AACD,MAAM,MAAM,gCAAgC,GAAG,YAAY,GAAG,YAAY,GAAG,KAAK,CAAC;AACnF,MAAM,WAAW,uBAAuB;IACtC,+CAA+C;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,wBAAwB,CAAC;IACtC,qCAAqC;IACrC,aAAa,CAAC,EAAE,gCAAgC,CAAC;CAClD;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,OAAO,EAAE,WAAW,CAAC;CACtB,CAAC;AACF,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,wBAAwB,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,GAAG,KAAK,CAAC;CACrB;AACD,MAAM,WAAW,qBAAqB;IACpC,cAAc,CAAC,EAAE,wBAAwB,EAAE,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AACD,qFAAqF;AACrF,MAAM,WAAW,2BAA2B;IAC1C,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D;AAGD,MAAM,WAAW,2BAA2B;IAC1C,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,MAAM,EAAE,eAAe,CAAC;CACzB;AACD,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,MAAM,EAAE,4BAA4B,GAAG,gCAAgC,CAAC;CACzE;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,+DAA+D;AAC/D,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,iCAAiC,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAE7F,MAAM,MAAM,gCAAgC,GAAG;IAC7C,YAAY,EAAE,iCAAiC,CAAC;CACjD,CAAC;AACF,MAAM,WAAW,mCAAmC;IAClD,IAAI,CAAC,EAAE,qBAAqB,CAAC;CAC9B"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../../src/portal/types/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAIzD,MAAM,MAAM,gCAAgC,GAAG,YAAY,GAAG,YAAY,GAAG,KAAK,CAAC;AAEnF,wEAAwE;AACxE,MAAM,WAAW,0BAA0B;IACzC,4CAA4C;IAC5C,EAAE,EAAE,MAAM,CAAC;IACX,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,gCAAgC,CAAC;CAClD;AAED,yCAAyC;AACzC,MAAM,WAAW,6BAA6B;IAC5C,0CAA0C;IAC1C,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,gCAAgC,CAAC;CAClD;AAED,oFAAoF;AACpF,MAAM,MAAM,uBAAuB,GAAG,0BAA0B,GAAG,6BAA6B,CAAC;AAGjG,MAAM,MAAM,wBAAwB,GAAG;IACrC,wCAAwC;IACxC,OAAO,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,mFAAmF;AACnF,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,4EAA4E;AAC5E,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC;IACtB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,2BAA2B;IAC1C,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,6BAA6B,CAAC;IAC3C,UAAU,CAAC,EAAE,6BAA6B,CAAC;CAC5C;AAGD,MAAM,WAAW,2BAA2B;IAC1C,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,MAAM,EAAE,eAAe,CAAC;CACzB;AACD,MAAM,WAAW,0BAA0B;IACzC,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,MAAM,EAAE,4BAA4B,GAAG,gCAAgC,CAAC;CACzE;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,kEAAkE;IAClE,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,+DAA+D;AAC/D,MAAM,WAAW,6BAA6B;IAC5C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,iCAAiC,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,SAAS,CAAC;AAE7F,MAAM,MAAM,gCAAgC,GAAG;IAC7C,YAAY,EAAE,iCAAiC,CAAC;CACjD,CAAC;AACF,MAAM,WAAW,mCAAmC;IAClD,IAAI,CAAC,EAAE,qBAAqB,CAAC;CAC9B"}
@@ -1,3 +1,4 @@
1
+ import type { ReconstructPrivateKeyParams } from '../eject/index.js';
1
2
  import type { ClientOperation } from './client-api.js';
2
3
  import type { EnclaveOperation } from './enclave-api.js';
3
4
  import type { Curve } from './types/index.js';
@@ -71,6 +72,13 @@ export declare class WalletsClient {
71
72
  completeEject<TResponse = void>(options: PortalRequestOptions<never, {
72
73
  walletId: string;
73
74
  }>): Promise<TResponse>;
75
+ /**
76
+ * Reconstruct this wallet's full private key from its ejectable backup shares.
77
+ * Pure and network-free: decrypt `encryptedClientBackupShare` yourself first,
78
+ * then pass it with the `custodianBackupShare` from {@link getEjectableBackupShares}.
79
+ * Returns hex (SECP256K1) or Base58 (ED25519).
80
+ */
81
+ reconstructPrivateKey(params: ReconstructPrivateKeyParams): Promise<string>;
74
82
  /**
75
83
  * Generate a new MPC wallet (Enclave API), producing one signing share per
76
84
  * curve (`SECP256K1` and `ED25519`). Returns the shares to store client-side.
@@ -1 +1 @@
1
- {"version":3,"file":"wallets-client.d.ts","sourceRoot":"","sources":["../../src/portal/wallets-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"wallets-client.d.ts","sourceRoot":"","sources":["../../src/portal/wallets-client.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { ClientApi } from './client-api.js';
2
2
  import { EnclaveApi } from './enclave-api.js';
3
+ import { reconstructPrivateKey } from '../eject/index.js';
3
4
  /**
4
5
  * Client-scoped Portal operations for a single Portal client.
5
6
  *
@@ -81,6 +82,15 @@ export class WalletsClient {
81
82
  completeEject(options) {
82
83
  return this.clientApi.completeEject(options);
83
84
  }
85
+ /**
86
+ * Reconstruct this wallet's full private key from its ejectable backup shares.
87
+ * Pure and network-free: decrypt `encryptedClientBackupShare` yourself first,
88
+ * then pass it with the `custodianBackupShare` from {@link getEjectableBackupShares}.
89
+ * Returns hex (SECP256K1) or Base58 (ED25519).
90
+ */
91
+ reconstructPrivateKey(params) {
92
+ return reconstructPrivateKey(params);
93
+ }
84
94
  // ── enclave MPC layer ──────────────────────────────────────────────
85
95
  /**
86
96
  * Generate a new MPC wallet (Enclave API), producing one signing share per
@@ -1 +1 @@
1
- {"version":3,"file":"wallets-client.js","sourceRoot":"","sources":["../../src/portal/wallets-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAwC9C;;;;;;;;GAQG;AACH,MAAM,OAAO,aAAa;IACP,SAAS,CAAY;IACrB,UAAU,CAAa;IAExC,YAAY,YAA8B,EAAE,QAA6B,EAAE,SAA2B;QACpG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC5E,CAAC;IAED;;;OAGG;IACH,OAAO,CACL,aAA8B,EAC9B,UAAuC,EAAE;QAEzC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAY,aAAa,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC;IAED;;;;OAIG;IACH,cAAc,CACZ,aAA+B,EAC/B,UAAuC,EAAE;QAEzC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAY,aAAa,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAED,sEAAsE;IAEtE,iFAAiF;IACjF,gBAAgB,CAA4B,OAA8B;QACxE,OAAO,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAY,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED;;;OAGG;IACH,gBAAgB,CACd,OAA2E;QAE3E,OAAO,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAY,OAAO,CAAC,CAAC;IAC7D,CAAC;IAED,2FAA2F;IAC3F,mBAAmB,CACjB,OAAuF;QAEvF,OAAO,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAY,OAAO,CAAC,CAAC;IAChE,CAAC;IAED,wFAAwF;IACxF,uBAAuB,CACrB,OAA0D;QAE1D,OAAO,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAY,OAAO,CAAC,CAAC;IACpE,CAAC;IAED;;;OAGG;IACH,sBAAsB,CACpB,OAAyD;QAEzD,OAAO,IAAI,CAAC,SAAS,CAAC,sBAAsB,CAAY,OAAO,CAAC,CAAC;IACnE,CAAC;IAED;;;;OAIG;IACH,yBAAyB,CACvB,OAAkF;QAElF,OAAO,IAAI,CAAC,SAAS,CAAC,yBAAyB,CAAY,OAAO,CAAC,CAAC;IACtE,CAAC;IAED,6EAA6E;IAC7E,wBAAwB,CACtB,OAAmE;QAEnE,OAAO,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAY,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,+EAA+E;IAC/E,wBAAwB,CACtB,OAA4F;QAE5F,OAAO,IAAI,CAAC,SAAS,CAAC,wBAAwB,CAAY,OAAO,CAAC,CAAC;IACrE,CAAC;IAED,iFAAiF;IACjF,aAAa,CACX,OAA0D;QAE1D,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAY,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,sEAAsE;IAEtE;;;OAGG;IACH,cAAc,CAAqC,OAA8B;QAC/E,OAAO,IAAI,CAAC,UAAU,CAAC,cAAc,CAAY,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED;;;OAGG;IACH,YAAY,CACV,OAA+C;QAE/C,OAAO,IAAI,CAAC,UAAU,CAAC,YAAY,CAAY,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,mFAAmF;IACnF,aAAa,CACX,OAAgD;QAEhD,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAY,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED;;;;OAIG;IACH,IAAI,CAA2B,OAAuC;QACpE,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAY,OAAO,CAAC,CAAC;IAClD,CAAC;IAED;;;OAGG;IACH,OAAO,CACL,OAA4D;QAE5D,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAY,OAAO,CAAC,CAAC;IACrD,CAAC;IAED;;;OAGG;IACH,UAAU,CACR,OAA6C;QAE7C,OAAO,IAAI,CAAC,UAAU,CAAC,UAAU,CAAY,OAAO,CAAC,CAAC;IACxD,CAAC;CACF"}
1
+ {"version":3,"file":"wallets-client.js","sourceRoot":"","sources":["../../src/portal/wallets-client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tatumio/wallet-sdk",
3
- "version": "0.1.0",
3
+ "version": "0.2.1",
4
4
  "description": "TypeScript SDK for Tatum-hosted MPC wallets — wallet generation, signing, sending, backup/recovery, and custodian/client management.",
5
5
  "license": "MIT",
6
6
  "author": "Tatum",
@@ -57,5 +57,9 @@
57
57
  "@types/node": "^22.15.29",
58
58
  "typescript": "^5.8.3",
59
59
  "vitest": "^3.1.4"
60
+ },
61
+ "dependencies": {
62
+ "@noble/curves": "^1.9.7",
63
+ "@scure/base": "^1.2.6"
60
64
  }
61
65
  }