@ledgerhq/hw-app-solana 7.0.7 → 7.0.8-nightly.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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +8 -0
- package/lib/Solana.d.ts +1 -1
- package/lib/Solana.d.ts.map +1 -1
- package/lib/Solana.js +100 -203
- package/lib/Solana.js.map +1 -1
- package/lib-es/Solana.d.ts +1 -1
- package/lib-es/Solana.d.ts.map +1 -1
- package/lib-es/Solana.js +96 -200
- package/lib-es/Solana.js.map +1 -1
- package/package.json +6 -7
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> @ledgerhq/hw-app-solana@7.0.
|
|
2
|
+
> @ledgerhq/hw-app-solana@7.0.8-nightly.0 build /home/runner/work/ledger-live/ledger-live/libs/ledgerjs/packages/hw-app-solana
|
|
3
3
|
> tsc && tsc -m ES6 --outDir lib-es
|
|
4
4
|
|
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
# @ledgerhq/hw-app-solana
|
|
2
2
|
|
|
3
|
+
## 7.0.8-nightly.0
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- Updated dependencies [[`87d2349fd8`](https://github.com/LedgerHQ/ledger-live/commit/87d2349fd835e5deb39d1ee8dfcf3539f4195472)]:
|
|
8
|
+
- @ledgerhq/errors@6.12.5-nightly.0
|
|
9
|
+
- @ledgerhq/hw-transport@6.28.3-nightly.0
|
|
10
|
+
|
|
3
11
|
## 7.0.7
|
|
4
12
|
|
|
5
13
|
### Patch Changes
|
package/lib/Solana.d.ts
CHANGED
package/lib/Solana.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Solana.d.ts","sourceRoot":"","sources":["../src/Solana.ts"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,wBAAwB,CAAC;AA2B/C;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,OAAO,MAAM;IACzB,OAAO,CAAC,SAAS,CAAY;gBAG3B,SAAS,EAAE,SAAS,EAGpB,WAAW,GAAE,MAAsC;IAUrD;;;;;;;;;;;;OAYG;IACG,UAAU,CACd,IAAI,EAAE,MAAM,EAGZ,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC;QACT,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAcF;;;;;;;;;;OAUG;IACG,eAAe,CACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QACT,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAmBF;;;;;;;;;;OAUG;IACG,mBAAmB,CACvB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QACT,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAmBF;;;;;;;OAOG;IACG,mBAAmB,IAAI,OAAO,CAAC,SAAS,CAAC;IAU/C,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,aAAa;YAUP,YAAY;IAiD1B,OAAO,CAAC,cAAc;CAavB;AAED,aAAK,iBAAiB;IACpB,IAAI,IAAA;IACJ,KAAK,IAAA;CACN;AAED,
|
|
1
|
+
{"version":3,"file":"Solana.d.ts","sourceRoot":"","sources":["../src/Solana.ts"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,wBAAwB,CAAC;AA2B/C;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,OAAO,MAAM;IACzB,OAAO,CAAC,SAAS,CAAY;gBAG3B,SAAS,EAAE,SAAS,EAGpB,WAAW,GAAE,MAAsC;IAUrD;;;;;;;;;;;;OAYG;IACG,UAAU,CACd,IAAI,EAAE,MAAM,EAGZ,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC;QACT,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAcF;;;;;;;;;;OAUG;IACG,eAAe,CACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QACT,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAmBF;;;;;;;;;;OAUG;IACG,mBAAmB,CACvB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QACT,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAmBF;;;;;;;OAOG;IACG,mBAAmB,IAAI,OAAO,CAAC,SAAS,CAAC;IAU/C,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,aAAa;YAUP,YAAY;IAiD1B,OAAO,CAAC,cAAc;CAavB;AAED,aAAK,iBAAiB;IACpB,IAAI,IAAA;IACJ,KAAK,IAAA;CACN;AAED,KAAK,SAAS,GAAG;IACf,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC"}
|
package/lib/Solana.js
CHANGED
|
@@ -8,77 +8,23 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
8
8
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
9
|
});
|
|
10
10
|
};
|
|
11
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
-
function step(op) {
|
|
16
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
-
while (_) try {
|
|
18
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
-
switch (op[0]) {
|
|
21
|
-
case 0: case 1: t = op; break;
|
|
22
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
-
default:
|
|
26
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
-
if (t[2]) _.ops.pop();
|
|
31
|
-
_.trys.pop(); continue;
|
|
32
|
-
}
|
|
33
|
-
op = body.call(thisArg, _);
|
|
34
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
-
}
|
|
37
|
-
};
|
|
38
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
39
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
40
|
-
if (!m) return o;
|
|
41
|
-
var i = m.call(o), r, ar = [], e;
|
|
42
|
-
try {
|
|
43
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
44
|
-
}
|
|
45
|
-
catch (error) { e = { error: error }; }
|
|
46
|
-
finally {
|
|
47
|
-
try {
|
|
48
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
49
|
-
}
|
|
50
|
-
finally { if (e) throw e.error; }
|
|
51
|
-
}
|
|
52
|
-
return ar;
|
|
53
|
-
};
|
|
54
|
-
var __values = (this && this.__values) || function(o) {
|
|
55
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
56
|
-
if (m) return m.call(o);
|
|
57
|
-
if (o && typeof o.length === "number") return {
|
|
58
|
-
next: function () {
|
|
59
|
-
if (o && i >= o.length) o = void 0;
|
|
60
|
-
return { value: o && o[i++], done: !o };
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
64
|
-
};
|
|
65
11
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
66
12
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
67
13
|
};
|
|
68
|
-
exports
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const errors_1 = require("@ledgerhq/errors");
|
|
16
|
+
const bip32_path_1 = __importDefault(require("bip32-path"));
|
|
17
|
+
const P1_NON_CONFIRM = 0x00;
|
|
18
|
+
const P1_CONFIRM = 0x01;
|
|
19
|
+
const P2_EXTEND = 0x01;
|
|
20
|
+
const P2_MORE = 0x02;
|
|
21
|
+
const MAX_PAYLOAD = 255;
|
|
22
|
+
const LEDGER_CLA = 0xe0;
|
|
23
|
+
const INS = {
|
|
78
24
|
GET_VERSION: 0x04,
|
|
79
25
|
GET_ADDR: 0x05,
|
|
80
26
|
SIGN: 0x06,
|
|
81
|
-
SIGN_OFFCHAIN: 0x07
|
|
27
|
+
SIGN_OFFCHAIN: 0x07,
|
|
82
28
|
};
|
|
83
29
|
var EXTRA_STATUS_CODES;
|
|
84
30
|
(function (EXTRA_STATUS_CODES) {
|
|
@@ -94,12 +40,11 @@ var EXTRA_STATUS_CODES;
|
|
|
94
40
|
* import Solana from "@ledgerhq/hw-app-solana";
|
|
95
41
|
* const solana = new Solana(transport);
|
|
96
42
|
*/
|
|
97
|
-
|
|
98
|
-
|
|
43
|
+
class Solana {
|
|
44
|
+
constructor(transport,
|
|
99
45
|
// the type annotation is needed for doc generator
|
|
100
46
|
// eslint-disable-next-line @typescript-eslint/no-inferrable-types
|
|
101
|
-
scrambleKey) {
|
|
102
|
-
if (scrambleKey === void 0) { scrambleKey = "solana_default_scramble_key"; }
|
|
47
|
+
scrambleKey = "solana_default_scramble_key") {
|
|
103
48
|
this.transport = transport;
|
|
104
49
|
this.transport.decorateAppAPIMethods(this, ["getAddress", "signTransaction", "getAppConfiguration"], scrambleKey);
|
|
105
50
|
}
|
|
@@ -116,27 +61,18 @@ var Solana = /** @class */ (function () {
|
|
|
116
61
|
* @example
|
|
117
62
|
* solana.getAddress("44'/501'/0'").then(r => r.address)
|
|
118
63
|
*/
|
|
119
|
-
|
|
64
|
+
getAddress(path,
|
|
120
65
|
// the type annotation is needed for doc generator
|
|
121
66
|
// eslint-disable-next-line @typescript-eslint/no-inferrable-types
|
|
122
|
-
display) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
return
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
pathBuffer = this.pathToBuffer(path);
|
|
130
|
-
return [4 /*yield*/, this.sendToDevice(INS.GET_ADDR, display ? P1_CONFIRM : P1_NON_CONFIRM, pathBuffer)];
|
|
131
|
-
case 1:
|
|
132
|
-
addressBuffer = _a.sent();
|
|
133
|
-
return [2 /*return*/, {
|
|
134
|
-
address: addressBuffer
|
|
135
|
-
}];
|
|
136
|
-
}
|
|
137
|
-
});
|
|
67
|
+
display = false) {
|
|
68
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
+
const pathBuffer = this.pathToBuffer(path);
|
|
70
|
+
const addressBuffer = yield this.sendToDevice(INS.GET_ADDR, display ? P1_CONFIRM : P1_NON_CONFIRM, pathBuffer);
|
|
71
|
+
return {
|
|
72
|
+
address: addressBuffer,
|
|
73
|
+
};
|
|
138
74
|
});
|
|
139
|
-
}
|
|
75
|
+
}
|
|
140
76
|
/**
|
|
141
77
|
* Sign a Solana transaction.
|
|
142
78
|
*
|
|
@@ -148,26 +84,19 @@ var Solana = /** @class */ (function () {
|
|
|
148
84
|
* @example
|
|
149
85
|
* solana.signTransaction("44'/501'/0'", txBuffer).then(r => r.signature)
|
|
150
86
|
*/
|
|
151
|
-
|
|
152
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
case 1:
|
|
163
|
-
signatureBuffer = _a.sent();
|
|
164
|
-
return [2 /*return*/, {
|
|
165
|
-
signature: signatureBuffer
|
|
166
|
-
}];
|
|
167
|
-
}
|
|
168
|
-
});
|
|
87
|
+
signTransaction(path, txBuffer) {
|
|
88
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
89
|
+
const pathBuffer = this.pathToBuffer(path);
|
|
90
|
+
// Ledger app supports only a single derivation path per call ATM
|
|
91
|
+
const pathsCountBuffer = Buffer.alloc(1);
|
|
92
|
+
pathsCountBuffer.writeUInt8(1, 0);
|
|
93
|
+
const payload = Buffer.concat([pathsCountBuffer, pathBuffer, txBuffer]);
|
|
94
|
+
const signatureBuffer = yield this.sendToDevice(INS.SIGN, P1_CONFIRM, payload);
|
|
95
|
+
return {
|
|
96
|
+
signature: signatureBuffer,
|
|
97
|
+
};
|
|
169
98
|
});
|
|
170
|
-
}
|
|
99
|
+
}
|
|
171
100
|
/**
|
|
172
101
|
* Sign a Solana off-chain message.
|
|
173
102
|
*
|
|
@@ -179,26 +108,19 @@ var Solana = /** @class */ (function () {
|
|
|
179
108
|
* @example
|
|
180
109
|
* solana.signOffchainMessage("44'/501'/0'", msgBuffer).then(r => r.signature)
|
|
181
110
|
*/
|
|
182
|
-
|
|
183
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
case 1:
|
|
194
|
-
signatureBuffer = _a.sent();
|
|
195
|
-
return [2 /*return*/, {
|
|
196
|
-
signature: signatureBuffer
|
|
197
|
-
}];
|
|
198
|
-
}
|
|
199
|
-
});
|
|
111
|
+
signOffchainMessage(path, msgBuffer) {
|
|
112
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
113
|
+
const pathBuffer = this.pathToBuffer(path);
|
|
114
|
+
// Ledger app supports only a single derivation path per call ATM
|
|
115
|
+
const pathsCountBuffer = Buffer.alloc(1);
|
|
116
|
+
pathsCountBuffer.writeUInt8(1, 0);
|
|
117
|
+
const payload = Buffer.concat([pathsCountBuffer, pathBuffer, msgBuffer]);
|
|
118
|
+
const signatureBuffer = yield this.sendToDevice(INS.SIGN_OFFCHAIN, P1_CONFIRM, payload);
|
|
119
|
+
return {
|
|
120
|
+
signature: signatureBuffer,
|
|
121
|
+
};
|
|
200
122
|
});
|
|
201
|
-
}
|
|
123
|
+
}
|
|
202
124
|
/**
|
|
203
125
|
* Get application configuration.
|
|
204
126
|
*
|
|
@@ -207,101 +129,76 @@ var Solana = /** @class */ (function () {
|
|
|
207
129
|
* @example
|
|
208
130
|
* solana.getAppConfiguration().then(r => r.version)
|
|
209
131
|
*/
|
|
210
|
-
|
|
211
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
212
|
-
|
|
213
|
-
return
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
return [2 /*return*/, {
|
|
219
|
-
blindSigningEnabled: Boolean(blindSigningEnabled),
|
|
220
|
-
pubKeyDisplayMode: pubKeyDisplayMode,
|
|
221
|
-
version: "".concat(major, ".").concat(minor, ".").concat(patch)
|
|
222
|
-
}];
|
|
223
|
-
}
|
|
224
|
-
});
|
|
132
|
+
getAppConfiguration() {
|
|
133
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
134
|
+
const [blindSigningEnabled, pubKeyDisplayMode, major, minor, patch] = yield this.sendToDevice(INS.GET_VERSION, P1_NON_CONFIRM, Buffer.alloc(0));
|
|
135
|
+
return {
|
|
136
|
+
blindSigningEnabled: Boolean(blindSigningEnabled),
|
|
137
|
+
pubKeyDisplayMode,
|
|
138
|
+
version: `${major}.${minor}.${patch}`,
|
|
139
|
+
};
|
|
225
140
|
});
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
|
|
141
|
+
}
|
|
142
|
+
pathToBuffer(originalPath) {
|
|
143
|
+
const path = originalPath
|
|
229
144
|
.split("/")
|
|
230
|
-
.map(
|
|
231
|
-
return value.endsWith("'") || value.endsWith("h") ? value : value + "'";
|
|
232
|
-
})
|
|
145
|
+
.map((value) => value.endsWith("'") || value.endsWith("h") ? value : value + "'")
|
|
233
146
|
.join("/");
|
|
234
|
-
|
|
147
|
+
const pathNums = bip32_path_1.default.fromString(path).toPathArray();
|
|
235
148
|
return this.serializePath(pathNums);
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
var buf = Buffer.alloc(1 + path.length * 4);
|
|
149
|
+
}
|
|
150
|
+
serializePath(path) {
|
|
151
|
+
const buf = Buffer.alloc(1 + path.length * 4);
|
|
240
152
|
buf.writeUInt8(path.length, 0);
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
var _d = __read(_c.value, 2), i = _d[0], num = _d[1];
|
|
244
|
-
buf.writeUInt32BE(num, 1 + i * 4);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
247
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
248
|
-
finally {
|
|
249
|
-
try {
|
|
250
|
-
if (_c && !_c.done && (_a = _b["return"])) _a.call(_b);
|
|
251
|
-
}
|
|
252
|
-
finally { if (e_1) throw e_1.error; }
|
|
153
|
+
for (const [i, num] of path.entries()) {
|
|
154
|
+
buf.writeUInt32BE(num, 1 + i * 4);
|
|
253
155
|
}
|
|
254
156
|
return buf;
|
|
255
|
-
}
|
|
157
|
+
}
|
|
256
158
|
// send chunked if payload size exceeds maximum for a call
|
|
257
|
-
|
|
258
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
p2 |= P2_EXTEND;
|
|
280
|
-
return [3 /*break*/, 1];
|
|
281
|
-
case 3:
|
|
282
|
-
buf = payload.slice(payload_offset);
|
|
283
|
-
return [4 /*yield*/, this.transport.send(LEDGER_CLA, instruction, p1, p2, buf, acceptStatusList)];
|
|
284
|
-
case 4:
|
|
285
|
-
reply = _a.sent();
|
|
286
|
-
this.throwOnFailure(reply);
|
|
287
|
-
return [2 /*return*/, reply.slice(0, reply.length - 2)];
|
|
159
|
+
sendToDevice(instruction, p1, payload) {
|
|
160
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
161
|
+
/*
|
|
162
|
+
* By default transport will throw if status code is not OK.
|
|
163
|
+
* For some pyaloads we need to enable blind sign in the app settings
|
|
164
|
+
* and this is reported with StatusCodes.MISSING_CRITICAL_PARAMETER first byte prefix
|
|
165
|
+
* so we handle it and show a user friendly error message.
|
|
166
|
+
*/
|
|
167
|
+
const acceptStatusList = [
|
|
168
|
+
errors_1.StatusCodes.OK,
|
|
169
|
+
EXTRA_STATUS_CODES.BLIND_SIGNATURE_REQUIRED,
|
|
170
|
+
];
|
|
171
|
+
let p2 = 0;
|
|
172
|
+
let payload_offset = 0;
|
|
173
|
+
if (payload.length > MAX_PAYLOAD) {
|
|
174
|
+
while (payload.length - payload_offset > MAX_PAYLOAD) {
|
|
175
|
+
const buf = payload.slice(payload_offset, payload_offset + MAX_PAYLOAD);
|
|
176
|
+
payload_offset += MAX_PAYLOAD;
|
|
177
|
+
// console.log( "send", (p2 | P2_MORE).toString(16), buf.length.toString(16), buf);
|
|
178
|
+
const reply = yield this.transport.send(LEDGER_CLA, instruction, p1, p2 | P2_MORE, buf, acceptStatusList);
|
|
179
|
+
this.throwOnFailure(reply);
|
|
180
|
+
p2 |= P2_EXTEND;
|
|
288
181
|
}
|
|
289
|
-
}
|
|
182
|
+
}
|
|
183
|
+
const buf = payload.slice(payload_offset);
|
|
184
|
+
// console.log("send", p2.toString(16), buf.length.toString(16), buf);
|
|
185
|
+
const reply = yield this.transport.send(LEDGER_CLA, instruction, p1, p2, buf, acceptStatusList);
|
|
186
|
+
this.throwOnFailure(reply);
|
|
187
|
+
return reply.slice(0, reply.length - 2);
|
|
290
188
|
});
|
|
291
|
-
}
|
|
292
|
-
|
|
189
|
+
}
|
|
190
|
+
throwOnFailure(reply) {
|
|
293
191
|
// transport makes sure reply has a valid length
|
|
294
|
-
|
|
192
|
+
const status = reply.readUInt16BE(reply.length - 2);
|
|
295
193
|
switch (status) {
|
|
296
194
|
case EXTRA_STATUS_CODES.BLIND_SIGNATURE_REQUIRED:
|
|
297
195
|
throw new Error("Missing a parameter. Try enabling blind signature in the app");
|
|
298
196
|
default:
|
|
299
197
|
return;
|
|
300
198
|
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
exports["default"] = Solana;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
exports.default = Solana;
|
|
305
202
|
var PubKeyDisplayMode;
|
|
306
203
|
(function (PubKeyDisplayMode) {
|
|
307
204
|
PubKeyDisplayMode[PubKeyDisplayMode["LONG"] = 0] = "LONG";
|
package/lib/Solana.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Solana.js","sourceRoot":"","sources":["../src/Solana.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Solana.js","sourceRoot":"","sources":["../src/Solana.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAEA,6CAA+C;AAE/C,4DAAiC;AAEjC,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,MAAM,SAAS,GAAG,IAAI,CAAC;AACvB,MAAM,OAAO,GAAG,IAAI,CAAC;AAErB,MAAM,WAAW,GAAG,GAAG,CAAC;AAExB,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,MAAM,GAAG,GAAG;IACV,WAAW,EAAE,IAAI;IACjB,QAAQ,EAAE,IAAI;IACd,IAAI,EAAE,IAAI;IACV,aAAa,EAAE,IAAI;CACpB,CAAC;AAEF,IAAK,kBAEJ;AAFD,WAAK,kBAAkB;IACrB,uGAAiC,CAAA;AACnC,CAAC,EAFI,kBAAkB,KAAlB,kBAAkB,QAEtB;AAED;;;;;;;;;GASG;AACH,MAAqB,MAAM;IAGzB,YACE,SAAoB;IACpB,kDAAkD;IAClD,kEAAkE;IAClE,cAAsB,6BAA6B;QAEnD,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAClC,IAAI,EACJ,CAAC,YAAY,EAAE,iBAAiB,EAAE,qBAAqB,CAAC,EACxD,WAAW,CACZ,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;OAYG;IACG,UAAU,CACd,IAAY;IACZ,kDAAkD;IAClD,kEAAkE;IAClE,UAAmB,KAAK;;YAIxB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAE3C,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,YAAY,CAC3C,GAAG,CAAC,QAAQ,EACZ,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,cAAc,EACrC,UAAU,CACX,CAAC;YAEF,OAAO;gBACL,OAAO,EAAE,aAAa;aACvB,CAAC;QACJ,CAAC;KAAA;IAED;;;;;;;;;;OAUG;IACG,eAAe,CACnB,IAAY,EACZ,QAAgB;;YAIhB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC3C,iEAAiE;YACjE,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,gBAAgB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAElC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;YAExE,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,YAAY,CAC7C,GAAG,CAAC,IAAI,EACR,UAAU,EACV,OAAO,CACR,CAAC;YAEF,OAAO;gBACL,SAAS,EAAE,eAAe;aAC3B,CAAC;QACJ,CAAC;KAAA;IAED;;;;;;;;;;OAUG;IACG,mBAAmB,CACvB,IAAY,EACZ,SAAiB;;YAIjB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YAC3C,iEAAiE;YACjE,MAAM,gBAAgB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACzC,gBAAgB,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAElC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,gBAAgB,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;YAEzE,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,YAAY,CAC7C,GAAG,CAAC,aAAa,EACjB,UAAU,EACV,OAAO,CACR,CAAC;YAEF,OAAO;gBACL,SAAS,EAAE,eAAe;aAC3B,CAAC;QACJ,CAAC;KAAA;IAED;;;;;;;OAOG;IACG,mBAAmB;;YACvB,MAAM,CAAC,mBAAmB,EAAE,iBAAiB,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,GACjE,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,cAAc,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5E,OAAO;gBACL,mBAAmB,EAAE,OAAO,CAAC,mBAAmB,CAAC;gBACjD,iBAAiB;gBACjB,OAAO,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,KAAK,EAAE;aACtC,CAAC;QACJ,CAAC;KAAA;IAEO,YAAY,CAAC,YAAoB;QACvC,MAAM,IAAI,GAAG,YAAY;aACtB,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACb,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CACjE;aACA,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,MAAM,QAAQ,GAAa,oBAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;QAClE,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IAEO,aAAa,CAAC,IAAc;QAClC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC9C,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC/B,KAAK,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;YACrC,GAAG,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;SACnC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,0DAA0D;IAC5C,YAAY,CAAC,WAAmB,EAAE,EAAU,EAAE,OAAe;;YACzE;;;;;eAKG;YACH,MAAM,gBAAgB,GAAG;gBACvB,oBAAW,CAAC,EAAE;gBACd,kBAAkB,CAAC,wBAAwB;aAC5C,CAAC;YAEF,IAAI,EAAE,GAAG,CAAC,CAAC;YACX,IAAI,cAAc,GAAG,CAAC,CAAC;YAEvB,IAAI,OAAO,CAAC,MAAM,GAAG,WAAW,EAAE;gBAChC,OAAO,OAAO,CAAC,MAAM,GAAG,cAAc,GAAG,WAAW,EAAE;oBACpD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,cAAc,GAAG,WAAW,CAAC,CAAC;oBACxE,cAAc,IAAI,WAAW,CAAC;oBAC9B,mFAAmF;oBACnF,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACrC,UAAU,EACV,WAAW,EACX,EAAE,EACF,EAAE,GAAG,OAAO,EACZ,GAAG,EACH,gBAAgB,CACjB,CAAC;oBACF,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;oBAC3B,EAAE,IAAI,SAAS,CAAC;iBACjB;aACF;YAED,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;YAC1C,sEAAsE;YACtE,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CACrC,UAAU,EACV,WAAW,EACX,EAAE,EACF,EAAE,EACF,GAAG,EACH,gBAAgB,CACjB,CAAC;YAEF,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;YAE3B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC1C,CAAC;KAAA;IAEO,cAAc,CAAC,KAAa;QAClC,gDAAgD;QAChD,MAAM,MAAM,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEpD,QAAQ,MAAM,EAAE;YACd,KAAK,kBAAkB,CAAC,wBAAwB;gBAC9C,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;YACJ;gBACE,OAAO;SACV;IACH,CAAC;CACF;AA9ND,yBA8NC;AAED,IAAK,iBAGJ;AAHD,WAAK,iBAAiB;IACpB,yDAAI,CAAA;IACJ,2DAAK,CAAA;AACP,CAAC,EAHI,iBAAiB,KAAjB,iBAAiB,QAGrB"}
|
package/lib-es/Solana.d.ts
CHANGED
package/lib-es/Solana.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Solana.d.ts","sourceRoot":"","sources":["../src/Solana.ts"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,wBAAwB,CAAC;AA2B/C;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,OAAO,MAAM;IACzB,OAAO,CAAC,SAAS,CAAY;gBAG3B,SAAS,EAAE,SAAS,EAGpB,WAAW,GAAE,MAAsC;IAUrD;;;;;;;;;;;;OAYG;IACG,UAAU,CACd,IAAI,EAAE,MAAM,EAGZ,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC;QACT,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAcF;;;;;;;;;;OAUG;IACG,eAAe,CACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QACT,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAmBF;;;;;;;;;;OAUG;IACG,mBAAmB,CACvB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QACT,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAmBF;;;;;;;OAOG;IACG,mBAAmB,IAAI,OAAO,CAAC,SAAS,CAAC;IAU/C,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,aAAa;YAUP,YAAY;IAiD1B,OAAO,CAAC,cAAc;CAavB;AAED,aAAK,iBAAiB;IACpB,IAAI,IAAA;IACJ,KAAK,IAAA;CACN;AAED,
|
|
1
|
+
{"version":3,"file":"Solana.d.ts","sourceRoot":"","sources":["../src/Solana.ts"],"names":[],"mappings":";AAAA,OAAO,SAAS,MAAM,wBAAwB,CAAC;AA2B/C;;;;;;;;;GASG;AACH,MAAM,CAAC,OAAO,OAAO,MAAM;IACzB,OAAO,CAAC,SAAS,CAAY;gBAG3B,SAAS,EAAE,SAAS,EAGpB,WAAW,GAAE,MAAsC;IAUrD;;;;;;;;;;;;OAYG;IACG,UAAU,CACd,IAAI,EAAE,MAAM,EAGZ,OAAO,GAAE,OAAe,GACvB,OAAO,CAAC;QACT,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IAcF;;;;;;;;;;OAUG;IACG,eAAe,CACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QACT,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAmBF;;;;;;;;;;OAUG;IACG,mBAAmB,CACvB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC;QACT,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IAmBF;;;;;;;OAOG;IACG,mBAAmB,IAAI,OAAO,CAAC,SAAS,CAAC;IAU/C,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,aAAa;YAUP,YAAY;IAiD1B,OAAO,CAAC,cAAc;CAavB;AAED,aAAK,iBAAiB;IACpB,IAAI,IAAA;IACJ,KAAK,IAAA;CACN;AAED,KAAK,SAAS,GAAG;IACf,mBAAmB,EAAE,OAAO,CAAC;IAC7B,iBAAiB,EAAE,iBAAiB,CAAC;IACrC,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC"}
|
package/lib-es/Solana.js
CHANGED
|
@@ -7,73 +7,19 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
-
function step(op) {
|
|
15
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
-
while (_) try {
|
|
17
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
-
switch (op[0]) {
|
|
20
|
-
case 0: case 1: t = op; break;
|
|
21
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
-
default:
|
|
25
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
-
if (t[2]) _.ops.pop();
|
|
30
|
-
_.trys.pop(); continue;
|
|
31
|
-
}
|
|
32
|
-
op = body.call(thisArg, _);
|
|
33
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
38
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
39
|
-
if (!m) return o;
|
|
40
|
-
var i = m.call(o), r, ar = [], e;
|
|
41
|
-
try {
|
|
42
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
43
|
-
}
|
|
44
|
-
catch (error) { e = { error: error }; }
|
|
45
|
-
finally {
|
|
46
|
-
try {
|
|
47
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
48
|
-
}
|
|
49
|
-
finally { if (e) throw e.error; }
|
|
50
|
-
}
|
|
51
|
-
return ar;
|
|
52
|
-
};
|
|
53
|
-
var __values = (this && this.__values) || function(o) {
|
|
54
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
55
|
-
if (m) return m.call(o);
|
|
56
|
-
if (o && typeof o.length === "number") return {
|
|
57
|
-
next: function () {
|
|
58
|
-
if (o && i >= o.length) o = void 0;
|
|
59
|
-
return { value: o && o[i++], done: !o };
|
|
60
|
-
}
|
|
61
|
-
};
|
|
62
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
63
|
-
};
|
|
64
10
|
import { StatusCodes } from "@ledgerhq/errors";
|
|
65
11
|
import BIPPath from "bip32-path";
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
12
|
+
const P1_NON_CONFIRM = 0x00;
|
|
13
|
+
const P1_CONFIRM = 0x01;
|
|
14
|
+
const P2_EXTEND = 0x01;
|
|
15
|
+
const P2_MORE = 0x02;
|
|
16
|
+
const MAX_PAYLOAD = 255;
|
|
17
|
+
const LEDGER_CLA = 0xe0;
|
|
18
|
+
const INS = {
|
|
73
19
|
GET_VERSION: 0x04,
|
|
74
20
|
GET_ADDR: 0x05,
|
|
75
21
|
SIGN: 0x06,
|
|
76
|
-
SIGN_OFFCHAIN: 0x07
|
|
22
|
+
SIGN_OFFCHAIN: 0x07,
|
|
77
23
|
};
|
|
78
24
|
var EXTRA_STATUS_CODES;
|
|
79
25
|
(function (EXTRA_STATUS_CODES) {
|
|
@@ -89,12 +35,11 @@ var EXTRA_STATUS_CODES;
|
|
|
89
35
|
* import Solana from "@ledgerhq/hw-app-solana";
|
|
90
36
|
* const solana = new Solana(transport);
|
|
91
37
|
*/
|
|
92
|
-
|
|
93
|
-
|
|
38
|
+
export default class Solana {
|
|
39
|
+
constructor(transport,
|
|
94
40
|
// the type annotation is needed for doc generator
|
|
95
41
|
// eslint-disable-next-line @typescript-eslint/no-inferrable-types
|
|
96
|
-
scrambleKey) {
|
|
97
|
-
if (scrambleKey === void 0) { scrambleKey = "solana_default_scramble_key"; }
|
|
42
|
+
scrambleKey = "solana_default_scramble_key") {
|
|
98
43
|
this.transport = transport;
|
|
99
44
|
this.transport.decorateAppAPIMethods(this, ["getAddress", "signTransaction", "getAppConfiguration"], scrambleKey);
|
|
100
45
|
}
|
|
@@ -111,27 +56,18 @@ var Solana = /** @class */ (function () {
|
|
|
111
56
|
* @example
|
|
112
57
|
* solana.getAddress("44'/501'/0'").then(r => r.address)
|
|
113
58
|
*/
|
|
114
|
-
|
|
59
|
+
getAddress(path,
|
|
115
60
|
// the type annotation is needed for doc generator
|
|
116
61
|
// eslint-disable-next-line @typescript-eslint/no-inferrable-types
|
|
117
|
-
display) {
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
return
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
pathBuffer = this.pathToBuffer(path);
|
|
125
|
-
return [4 /*yield*/, this.sendToDevice(INS.GET_ADDR, display ? P1_CONFIRM : P1_NON_CONFIRM, pathBuffer)];
|
|
126
|
-
case 1:
|
|
127
|
-
addressBuffer = _a.sent();
|
|
128
|
-
return [2 /*return*/, {
|
|
129
|
-
address: addressBuffer
|
|
130
|
-
}];
|
|
131
|
-
}
|
|
132
|
-
});
|
|
62
|
+
display = false) {
|
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
+
const pathBuffer = this.pathToBuffer(path);
|
|
65
|
+
const addressBuffer = yield this.sendToDevice(INS.GET_ADDR, display ? P1_CONFIRM : P1_NON_CONFIRM, pathBuffer);
|
|
66
|
+
return {
|
|
67
|
+
address: addressBuffer,
|
|
68
|
+
};
|
|
133
69
|
});
|
|
134
|
-
}
|
|
70
|
+
}
|
|
135
71
|
/**
|
|
136
72
|
* Sign a Solana transaction.
|
|
137
73
|
*
|
|
@@ -143,26 +79,19 @@ var Solana = /** @class */ (function () {
|
|
|
143
79
|
* @example
|
|
144
80
|
* solana.signTransaction("44'/501'/0'", txBuffer).then(r => r.signature)
|
|
145
81
|
*/
|
|
146
|
-
|
|
147
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
case 1:
|
|
158
|
-
signatureBuffer = _a.sent();
|
|
159
|
-
return [2 /*return*/, {
|
|
160
|
-
signature: signatureBuffer
|
|
161
|
-
}];
|
|
162
|
-
}
|
|
163
|
-
});
|
|
82
|
+
signTransaction(path, txBuffer) {
|
|
83
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
+
const pathBuffer = this.pathToBuffer(path);
|
|
85
|
+
// Ledger app supports only a single derivation path per call ATM
|
|
86
|
+
const pathsCountBuffer = Buffer.alloc(1);
|
|
87
|
+
pathsCountBuffer.writeUInt8(1, 0);
|
|
88
|
+
const payload = Buffer.concat([pathsCountBuffer, pathBuffer, txBuffer]);
|
|
89
|
+
const signatureBuffer = yield this.sendToDevice(INS.SIGN, P1_CONFIRM, payload);
|
|
90
|
+
return {
|
|
91
|
+
signature: signatureBuffer,
|
|
92
|
+
};
|
|
164
93
|
});
|
|
165
|
-
}
|
|
94
|
+
}
|
|
166
95
|
/**
|
|
167
96
|
* Sign a Solana off-chain message.
|
|
168
97
|
*
|
|
@@ -174,26 +103,19 @@ var Solana = /** @class */ (function () {
|
|
|
174
103
|
* @example
|
|
175
104
|
* solana.signOffchainMessage("44'/501'/0'", msgBuffer).then(r => r.signature)
|
|
176
105
|
*/
|
|
177
|
-
|
|
178
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
case 1:
|
|
189
|
-
signatureBuffer = _a.sent();
|
|
190
|
-
return [2 /*return*/, {
|
|
191
|
-
signature: signatureBuffer
|
|
192
|
-
}];
|
|
193
|
-
}
|
|
194
|
-
});
|
|
106
|
+
signOffchainMessage(path, msgBuffer) {
|
|
107
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
108
|
+
const pathBuffer = this.pathToBuffer(path);
|
|
109
|
+
// Ledger app supports only a single derivation path per call ATM
|
|
110
|
+
const pathsCountBuffer = Buffer.alloc(1);
|
|
111
|
+
pathsCountBuffer.writeUInt8(1, 0);
|
|
112
|
+
const payload = Buffer.concat([pathsCountBuffer, pathBuffer, msgBuffer]);
|
|
113
|
+
const signatureBuffer = yield this.sendToDevice(INS.SIGN_OFFCHAIN, P1_CONFIRM, payload);
|
|
114
|
+
return {
|
|
115
|
+
signature: signatureBuffer,
|
|
116
|
+
};
|
|
195
117
|
});
|
|
196
|
-
}
|
|
118
|
+
}
|
|
197
119
|
/**
|
|
198
120
|
* Get application configuration.
|
|
199
121
|
*
|
|
@@ -202,101 +124,75 @@ var Solana = /** @class */ (function () {
|
|
|
202
124
|
* @example
|
|
203
125
|
* solana.getAppConfiguration().then(r => r.version)
|
|
204
126
|
*/
|
|
205
|
-
|
|
206
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
207
|
-
|
|
208
|
-
return
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
return [2 /*return*/, {
|
|
214
|
-
blindSigningEnabled: Boolean(blindSigningEnabled),
|
|
215
|
-
pubKeyDisplayMode: pubKeyDisplayMode,
|
|
216
|
-
version: "".concat(major, ".").concat(minor, ".").concat(patch)
|
|
217
|
-
}];
|
|
218
|
-
}
|
|
219
|
-
});
|
|
127
|
+
getAppConfiguration() {
|
|
128
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
129
|
+
const [blindSigningEnabled, pubKeyDisplayMode, major, minor, patch] = yield this.sendToDevice(INS.GET_VERSION, P1_NON_CONFIRM, Buffer.alloc(0));
|
|
130
|
+
return {
|
|
131
|
+
blindSigningEnabled: Boolean(blindSigningEnabled),
|
|
132
|
+
pubKeyDisplayMode,
|
|
133
|
+
version: `${major}.${minor}.${patch}`,
|
|
134
|
+
};
|
|
220
135
|
});
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
|
|
136
|
+
}
|
|
137
|
+
pathToBuffer(originalPath) {
|
|
138
|
+
const path = originalPath
|
|
224
139
|
.split("/")
|
|
225
|
-
.map(
|
|
226
|
-
return value.endsWith("'") || value.endsWith("h") ? value : value + "'";
|
|
227
|
-
})
|
|
140
|
+
.map((value) => value.endsWith("'") || value.endsWith("h") ? value : value + "'")
|
|
228
141
|
.join("/");
|
|
229
|
-
|
|
142
|
+
const pathNums = BIPPath.fromString(path).toPathArray();
|
|
230
143
|
return this.serializePath(pathNums);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
var buf = Buffer.alloc(1 + path.length * 4);
|
|
144
|
+
}
|
|
145
|
+
serializePath(path) {
|
|
146
|
+
const buf = Buffer.alloc(1 + path.length * 4);
|
|
235
147
|
buf.writeUInt8(path.length, 0);
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
var _d = __read(_c.value, 2), i = _d[0], num = _d[1];
|
|
239
|
-
buf.writeUInt32BE(num, 1 + i * 4);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
243
|
-
finally {
|
|
244
|
-
try {
|
|
245
|
-
if (_c && !_c.done && (_a = _b["return"])) _a.call(_b);
|
|
246
|
-
}
|
|
247
|
-
finally { if (e_1) throw e_1.error; }
|
|
148
|
+
for (const [i, num] of path.entries()) {
|
|
149
|
+
buf.writeUInt32BE(num, 1 + i * 4);
|
|
248
150
|
}
|
|
249
151
|
return buf;
|
|
250
|
-
}
|
|
152
|
+
}
|
|
251
153
|
// send chunked if payload size exceeds maximum for a call
|
|
252
|
-
|
|
253
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
p2 |= P2_EXTEND;
|
|
275
|
-
return [3 /*break*/, 1];
|
|
276
|
-
case 3:
|
|
277
|
-
buf = payload.slice(payload_offset);
|
|
278
|
-
return [4 /*yield*/, this.transport.send(LEDGER_CLA, instruction, p1, p2, buf, acceptStatusList)];
|
|
279
|
-
case 4:
|
|
280
|
-
reply = _a.sent();
|
|
281
|
-
this.throwOnFailure(reply);
|
|
282
|
-
return [2 /*return*/, reply.slice(0, reply.length - 2)];
|
|
154
|
+
sendToDevice(instruction, p1, payload) {
|
|
155
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
156
|
+
/*
|
|
157
|
+
* By default transport will throw if status code is not OK.
|
|
158
|
+
* For some pyaloads we need to enable blind sign in the app settings
|
|
159
|
+
* and this is reported with StatusCodes.MISSING_CRITICAL_PARAMETER first byte prefix
|
|
160
|
+
* so we handle it and show a user friendly error message.
|
|
161
|
+
*/
|
|
162
|
+
const acceptStatusList = [
|
|
163
|
+
StatusCodes.OK,
|
|
164
|
+
EXTRA_STATUS_CODES.BLIND_SIGNATURE_REQUIRED,
|
|
165
|
+
];
|
|
166
|
+
let p2 = 0;
|
|
167
|
+
let payload_offset = 0;
|
|
168
|
+
if (payload.length > MAX_PAYLOAD) {
|
|
169
|
+
while (payload.length - payload_offset > MAX_PAYLOAD) {
|
|
170
|
+
const buf = payload.slice(payload_offset, payload_offset + MAX_PAYLOAD);
|
|
171
|
+
payload_offset += MAX_PAYLOAD;
|
|
172
|
+
// console.log( "send", (p2 | P2_MORE).toString(16), buf.length.toString(16), buf);
|
|
173
|
+
const reply = yield this.transport.send(LEDGER_CLA, instruction, p1, p2 | P2_MORE, buf, acceptStatusList);
|
|
174
|
+
this.throwOnFailure(reply);
|
|
175
|
+
p2 |= P2_EXTEND;
|
|
283
176
|
}
|
|
284
|
-
}
|
|
177
|
+
}
|
|
178
|
+
const buf = payload.slice(payload_offset);
|
|
179
|
+
// console.log("send", p2.toString(16), buf.length.toString(16), buf);
|
|
180
|
+
const reply = yield this.transport.send(LEDGER_CLA, instruction, p1, p2, buf, acceptStatusList);
|
|
181
|
+
this.throwOnFailure(reply);
|
|
182
|
+
return reply.slice(0, reply.length - 2);
|
|
285
183
|
});
|
|
286
|
-
}
|
|
287
|
-
|
|
184
|
+
}
|
|
185
|
+
throwOnFailure(reply) {
|
|
288
186
|
// transport makes sure reply has a valid length
|
|
289
|
-
|
|
187
|
+
const status = reply.readUInt16BE(reply.length - 2);
|
|
290
188
|
switch (status) {
|
|
291
189
|
case EXTRA_STATUS_CODES.BLIND_SIGNATURE_REQUIRED:
|
|
292
190
|
throw new Error("Missing a parameter. Try enabling blind signature in the app");
|
|
293
191
|
default:
|
|
294
192
|
return;
|
|
295
193
|
}
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
}());
|
|
299
|
-
export default Solana;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
300
196
|
var PubKeyDisplayMode;
|
|
301
197
|
(function (PubKeyDisplayMode) {
|
|
302
198
|
PubKeyDisplayMode[PubKeyDisplayMode["LONG"] = 0] = "LONG";
|
package/lib-es/Solana.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Solana.js","sourceRoot":"","sources":["../src/Solana.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"Solana.js","sourceRoot":"","sources":["../src/Solana.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ledgerhq/hw-app-solana",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.8-nightly.0",
|
|
4
4
|
"description": "Ledger Hardware Wallet Solana Application API",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"Ledger",
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"license": "Apache-2.0",
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"bip32-path": "^0.4.2",
|
|
31
|
-
"@ledgerhq/errors": "^6.12.
|
|
32
|
-
"@ledgerhq/hw-transport": "^6.28.
|
|
31
|
+
"@ledgerhq/errors": "^6.12.5-nightly.0",
|
|
32
|
+
"@ledgerhq/hw-transport": "^6.28.3-nightly.0",
|
|
33
33
|
"@ledgerhq/logs": "^6.10.1"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
@@ -38,13 +38,12 @@
|
|
|
38
38
|
"axios": "^0.26.1",
|
|
39
39
|
"documentation": "13.2.4",
|
|
40
40
|
"jest": "^28.1.1",
|
|
41
|
-
"rimraf": "^4.1
|
|
41
|
+
"rimraf": "^4.4.1",
|
|
42
42
|
"source-map-support": "^0.5.21",
|
|
43
43
|
"ts-jest": "^28.0.5",
|
|
44
44
|
"ts-node": "^10.4.0",
|
|
45
|
-
"
|
|
46
|
-
"@ledgerhq/hw-transport-
|
|
47
|
-
"@ledgerhq/hw-transport-node-speculos": "^6.27.13"
|
|
45
|
+
"@ledgerhq/hw-transport-mocker": "^6.27.14-nightly.0",
|
|
46
|
+
"@ledgerhq/hw-transport-node-speculos": "^6.27.14-nightly.0"
|
|
48
47
|
},
|
|
49
48
|
"scripts": {
|
|
50
49
|
"clean": "rimraf lib lib-es",
|