@shapeshiftoss/hdwallet-gridplus 1.62.10-alpha.3 → 1.62.10
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/adapter.d.ts +11 -3
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +98 -26
- package/dist/adapter.js.map +1 -1
- package/dist/bitcoin.d.ts +2 -1
- package/dist/bitcoin.d.ts.map +1 -1
- package/dist/bitcoin.js +555 -130
- package/dist/bitcoin.js.map +1 -1
- package/dist/ethereum.d.ts.map +1 -1
- package/dist/ethereum.js +34 -18
- package/dist/ethereum.js.map +1 -1
- package/dist/gridplus.d.ts +22 -17
- package/dist/gridplus.d.ts.map +1 -1
- package/dist/gridplus.js +101 -74
- package/dist/gridplus.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/transport.d.ts +28 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +148 -0
- package/dist/transport.js.map +1 -0
- package/dist/utils.d.ts +16 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +87 -2
- package/dist/utils.js.map +1 -1
- package/package.json +5 -6
- package/src/adapter.ts +84 -26
- package/src/bitcoin.ts +651 -133
- package/src/ethereum.ts +47 -11
- package/src/gridplus.ts +130 -83
- package/src/index.ts +1 -0
- package/src/transport.ts +131 -0
- package/src/utils.ts +100 -2
- package/tsconfig.json +1 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +0 -1
package/dist/adapter.d.ts
CHANGED
|
@@ -1,11 +1,19 @@
|
|
|
1
1
|
import * as core from "@shapeshiftoss/hdwallet-core";
|
|
2
2
|
import { GridPlusHDWallet } from "./gridplus";
|
|
3
|
+
import { GridPlusTransport } from "./transport";
|
|
3
4
|
export declare class GridPlusAdapter {
|
|
4
5
|
keyring: core.Keyring;
|
|
5
|
-
private
|
|
6
|
+
private activeTransports;
|
|
6
7
|
constructor(keyring: core.Keyring);
|
|
7
8
|
static useKeyring(keyring: core.Keyring): GridPlusAdapter;
|
|
8
|
-
connectDevice(deviceId: string, password?: string): Promise<
|
|
9
|
-
|
|
9
|
+
connectDevice(deviceId: string, password?: string, existingSessionId?: string): Promise<{
|
|
10
|
+
transport: GridPlusTransport;
|
|
11
|
+
isPaired: boolean;
|
|
12
|
+
sessionId: string;
|
|
13
|
+
}>;
|
|
14
|
+
pairConnectedDevice(deviceId: string, pairingCode: string): Promise<GridPlusHDWallet>;
|
|
15
|
+
pairDevice(deviceId: string, password?: string, pairingCode?: string, existingSessionId?: string): Promise<GridPlusHDWallet>;
|
|
16
|
+
initialize(deviceId: string, password?: string): Promise<number>;
|
|
17
|
+
get(deviceId: string): GridPlusHDWallet;
|
|
10
18
|
}
|
|
11
19
|
//# sourceMappingURL=adapter.d.ts.map
|
package/dist/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,8BAA8B,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,qBAAa,eAAe;IAC1B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC;IACtB,OAAO,CAAC,gBAAgB,CAA6C;gBAEzD,OAAO,EAAE,IAAI,CAAC,OAAO;WAInB,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO;IAIjC,aAAa,CACxB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,EACjB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC;QAAE,SAAS,EAAE,iBAAiB,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAiBrE,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAyBrF,UAAU,CACrB,QAAQ,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,EACjB,WAAW,CAAC,EAAE,MAAM,EACpB,iBAAiB,CAAC,EAAE,MAAM,GACzB,OAAO,CAAC,gBAAgB,CAAC;IAgCf,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKtE,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,gBAAgB;CAG/C"}
|
package/dist/adapter.js
CHANGED
|
@@ -1,4 +1,27 @@
|
|
|
1
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 (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
2
25
|
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
26
|
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
27
|
return new (P || (P = Promise))(function (resolve, reject) {
|
|
@@ -10,48 +33,97 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
10
33
|
};
|
|
11
34
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
35
|
exports.GridPlusAdapter = void 0;
|
|
13
|
-
const
|
|
14
|
-
const gridplus_sdk_1 = require("gridplus-sdk");
|
|
36
|
+
const core = __importStar(require("@shapeshiftoss/hdwallet-core"));
|
|
15
37
|
const gridplus_1 = require("./gridplus");
|
|
16
|
-
const
|
|
17
|
-
const baseUrl = "https://signing.gridpl.us";
|
|
38
|
+
const transport_1 = require("./transport");
|
|
18
39
|
class GridPlusAdapter {
|
|
19
40
|
constructor(keyring) {
|
|
41
|
+
this.activeTransports = new Map();
|
|
20
42
|
this.keyring = keyring;
|
|
21
43
|
}
|
|
22
44
|
static useKeyring(keyring) {
|
|
23
45
|
return new GridPlusAdapter(keyring);
|
|
24
46
|
}
|
|
25
|
-
connectDevice(
|
|
26
|
-
return __awaiter(this,
|
|
27
|
-
const
|
|
28
|
-
.
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
47
|
+
connectDevice(deviceId, password, existingSessionId) {
|
|
48
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
49
|
+
const transport = (() => {
|
|
50
|
+
const existing = this.activeTransports.get(deviceId);
|
|
51
|
+
if (existing)
|
|
52
|
+
return existing;
|
|
53
|
+
const newTransport = new transport_1.GridPlusTransport({
|
|
54
|
+
deviceId,
|
|
55
|
+
password: password || "shapeshift-default",
|
|
56
|
+
});
|
|
57
|
+
this.activeTransports.set(deviceId, newTransport);
|
|
58
|
+
return newTransport;
|
|
59
|
+
})();
|
|
60
|
+
const { isPaired, sessionId } = yield transport.setup(deviceId, password, existingSessionId);
|
|
61
|
+
return { transport, isPaired, sessionId };
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
pairConnectedDevice(deviceId, pairingCode) {
|
|
65
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
66
|
+
const transport = this.activeTransports.get(deviceId);
|
|
67
|
+
if (!transport) {
|
|
68
|
+
throw new Error("Device not connected. Call connectDevice first.");
|
|
69
|
+
}
|
|
70
|
+
try {
|
|
71
|
+
const pairingSuccess = yield transport.pair(pairingCode);
|
|
72
|
+
if (!pairingSuccess) {
|
|
73
|
+
throw new Error("Pairing failed. Please check the 8-character code displayed on your Lattice device.");
|
|
74
|
+
}
|
|
75
|
+
const wallet = new gridplus_1.GridPlusHDWallet(transport);
|
|
76
|
+
wallet.setActiveWalletId(deviceId);
|
|
77
|
+
yield wallet.initialize();
|
|
78
|
+
this.keyring.add(wallet, deviceId);
|
|
79
|
+
this.activeTransports.delete(deviceId);
|
|
80
|
+
return wallet;
|
|
32
81
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
// This is critical when switching between SafeCards - ensures fresh wallet state from device
|
|
36
|
-
this.client.resetActiveWallets();
|
|
82
|
+
catch (error) {
|
|
83
|
+
throw new Error(`GridPlus pairing failed: ${error instanceof Error ? error.message : "Unknown error"}`);
|
|
37
84
|
}
|
|
38
|
-
const isPaired = yield this.client.connect(deviceId);
|
|
39
|
-
if (isPaired)
|
|
40
|
-
return new gridplus_1.GridPlusHDWallet(this.client);
|
|
41
85
|
});
|
|
42
86
|
}
|
|
43
|
-
pairDevice(pairingCode) {
|
|
87
|
+
pairDevice(deviceId, password, pairingCode, existingSessionId) {
|
|
44
88
|
return __awaiter(this, void 0, void 0, function* () {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
89
|
+
const existingWallet = this.keyring.get(deviceId);
|
|
90
|
+
if (existingWallet) {
|
|
91
|
+
// Reset Client activeWallets state and fetch fresh UIDs from currently inserted SafeCard
|
|
92
|
+
yield existingWallet.transport.setup(deviceId, password, existingSessionId);
|
|
93
|
+
// Ensure the wallet has the correct active walletId set
|
|
94
|
+
existingWallet.setActiveWalletId(deviceId);
|
|
95
|
+
// Reinitialize to clear cached addresses when reconnecting (e.g., SafeCard swap)
|
|
96
|
+
yield existingWallet.initialize();
|
|
97
|
+
return existingWallet;
|
|
98
|
+
}
|
|
99
|
+
const { isPaired } = yield this.connectDevice(deviceId, password, existingSessionId);
|
|
100
|
+
if (!isPaired) {
|
|
101
|
+
if (pairingCode) {
|
|
102
|
+
return yield this.pairConnectedDevice(deviceId, pairingCode);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
throw new Error("PAIRING_REQUIRED");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Already paired - create wallet directly
|
|
109
|
+
const transport = this.activeTransports.get(deviceId);
|
|
110
|
+
const wallet = new gridplus_1.GridPlusHDWallet(transport);
|
|
111
|
+
wallet.setActiveWalletId(deviceId);
|
|
112
|
+
yield wallet.initialize();
|
|
113
|
+
this.keyring.add(wallet, deviceId);
|
|
114
|
+
this.activeTransports.delete(deviceId);
|
|
52
115
|
return wallet;
|
|
53
116
|
});
|
|
54
117
|
}
|
|
118
|
+
initialize(deviceId, password) {
|
|
119
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
120
|
+
yield this.pairDevice(deviceId, password);
|
|
121
|
+
return Object.keys(this.keyring.wallets).length;
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
get(deviceId) {
|
|
125
|
+
return core.mustBeDefined(this.keyring.get(deviceId));
|
|
126
|
+
}
|
|
55
127
|
}
|
|
56
128
|
exports.GridPlusAdapter = GridPlusAdapter;
|
|
57
129
|
//# sourceMappingURL=adapter.js.map
|
package/dist/adapter.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/bitcoin.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import * as core from "@shapeshiftoss/hdwallet-core";
|
|
2
2
|
import { Client } from "gridplus-sdk";
|
|
3
|
-
export declare
|
|
3
|
+
export declare const btcGetAccountPaths: (msg: core.BTCGetAccountPaths) => Array<core.BTCAccountPath>;
|
|
4
4
|
export declare function btcGetAddress(client: Client, msg: core.BTCGetAddress): Promise<string | null>;
|
|
5
5
|
export declare function btcSignTx(client: Client, msg: core.BTCSignTx): Promise<core.BTCSignedTx | null>;
|
|
6
|
+
export declare const btcNextAccountPath: (msg: core.BTCAccountPath) => core.BTCAccountPath | undefined;
|
|
6
7
|
//# sourceMappingURL=bitcoin.d.ts.map
|
package/dist/bitcoin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bitcoin.d.ts","sourceRoot":"","sources":["../src/bitcoin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bitcoin.d.ts","sourceRoot":"","sources":["../src/bitcoin.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,8BAA8B,CAAC;AAKrD,OAAO,EAAE,MAAM,EAAa,MAAM,cAAc,CAAC;AAkDjD,eAAO,MAAM,kBAAkB,QAAS,IAAI,CAAC,kBAAkB,KAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAwB1F,CAAC;AAEF,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA4BnG;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CA2kBrG;AAED,eAAO,MAAM,kBAAkB,QAAS,IAAI,CAAC,cAAc,KAAG,IAAI,CAAC,cAAc,GAAG,SAQnF,CAAC"}
|