@shapeshiftoss/hdwallet-phantom 1.55.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,394 @@
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
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.PhantomHDWallet = exports.PhantomHDWalletInfo = void 0;
39
+ exports.isPhantom = isPhantom;
40
+ const core = __importStar(require("@shapeshiftoss/hdwallet-core"));
41
+ const hdwallet_core_1 = require("@shapeshiftoss/hdwallet-core");
42
+ const base64_js_1 = __importDefault(require("base64-js"));
43
+ const bitcoinMsg = __importStar(require("bitcoinjs-message"));
44
+ const utils_js_1 = require("ethers/lib/utils.js");
45
+ const lodash_1 = __importDefault(require("lodash"));
46
+ const btc = __importStar(require("./bitcoin"));
47
+ const eth = __importStar(require("./ethereum"));
48
+ function isPhantom(wallet) {
49
+ return lodash_1.default.isObject(wallet) && wallet._isPhantom;
50
+ }
51
+ class PhantomHDWalletInfo {
52
+ constructor(evmProvider) {
53
+ this._supportsBTCInfo = true;
54
+ this._supportsETHInfo = true;
55
+ this.evmProvider = evmProvider;
56
+ }
57
+ getVendor() {
58
+ return "Phantom";
59
+ }
60
+ hasOnDevicePinEntry() {
61
+ return false;
62
+ }
63
+ hasOnDevicePassphrase() {
64
+ return true;
65
+ }
66
+ hasOnDeviceDisplay() {
67
+ return true;
68
+ }
69
+ hasOnDeviceRecovery() {
70
+ return true;
71
+ }
72
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
73
+ hasNativeShapeShift(srcCoin, dstCoin) {
74
+ return false;
75
+ }
76
+ supportsBip44Accounts() {
77
+ return false;
78
+ }
79
+ supportsOfflineSigning() {
80
+ return false;
81
+ }
82
+ supportsBroadcast() {
83
+ return true;
84
+ }
85
+ describePath(msg) {
86
+ switch (msg.coin.toLowerCase()) {
87
+ case "bitcoin": {
88
+ const unknown = core.unknownUTXOPath(msg.path, msg.coin, msg.scriptType);
89
+ if (!msg.scriptType)
90
+ return unknown;
91
+ if (!this.btcSupportsCoin(msg.coin))
92
+ return unknown;
93
+ if (!this.btcSupportsScriptType(msg.coin, msg.scriptType))
94
+ return unknown;
95
+ return core.describeUTXOPath(msg.path, msg.coin, msg.scriptType);
96
+ }
97
+ case "ethereum":
98
+ return core.describeETHPath(msg.path);
99
+ default:
100
+ throw new Error("Unsupported path");
101
+ }
102
+ }
103
+ /** Ethereum */
104
+ ethSupportsNetwork(chainId) {
105
+ return __awaiter(this, void 0, void 0, function* () {
106
+ return chainId === 1;
107
+ });
108
+ }
109
+ ethGetChainId() {
110
+ return __awaiter(this, void 0, void 0, function* () {
111
+ try {
112
+ if (!this.evmProvider.request)
113
+ throw new Error("Provider does not support ethereum.request");
114
+ // chainId as hex string
115
+ const chainId = yield this.evmProvider.request({ method: "eth_chainId" });
116
+ return parseInt(chainId, 16);
117
+ }
118
+ catch (e) {
119
+ console.error(e);
120
+ return null;
121
+ }
122
+ });
123
+ }
124
+ ethSupportsSecureTransfer() {
125
+ return __awaiter(this, void 0, void 0, function* () {
126
+ return false;
127
+ });
128
+ }
129
+ ethSupportsNativeShapeShift() {
130
+ return false;
131
+ }
132
+ ethSupportsEIP1559() {
133
+ return __awaiter(this, void 0, void 0, function* () {
134
+ return true;
135
+ });
136
+ }
137
+ ethGetAccountPaths(msg) {
138
+ return eth.ethGetAccountPaths(msg);
139
+ }
140
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
141
+ ethNextAccountPath(msg) {
142
+ throw new Error("Method not implemented");
143
+ }
144
+ /** Bitcoin */
145
+ btcSupportsCoin(coin) {
146
+ return __awaiter(this, void 0, void 0, function* () {
147
+ return coin === "bitcoin";
148
+ });
149
+ }
150
+ btcSupportsScriptType(coin, scriptType) {
151
+ return __awaiter(this, void 0, void 0, function* () {
152
+ if (!this.btcSupportsCoin(coin))
153
+ return false;
154
+ switch (scriptType) {
155
+ case core.BTCInputScriptType.SpendWitness:
156
+ return true;
157
+ default:
158
+ return false;
159
+ }
160
+ });
161
+ }
162
+ btcSupportsSecureTransfer() {
163
+ return __awaiter(this, void 0, void 0, function* () {
164
+ return false;
165
+ });
166
+ }
167
+ btcSupportsNativeShapeShift() {
168
+ return false;
169
+ }
170
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
171
+ btcGetAccountPaths(msg) {
172
+ return btc.btcGetAccountPaths(msg);
173
+ }
174
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
175
+ btcIsSameAccount(msg) {
176
+ throw new Error("Method not implemented.");
177
+ }
178
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
179
+ btcNextAccountPath(msg) {
180
+ throw new Error("Method not implemented");
181
+ }
182
+ }
183
+ exports.PhantomHDWalletInfo = PhantomHDWalletInfo;
184
+ class PhantomHDWallet extends PhantomHDWalletInfo {
185
+ constructor(evmProvider, bitcoinProvider) {
186
+ super(evmProvider);
187
+ this._supportsBTC = true;
188
+ this._supportsETH = true;
189
+ this._supportsEthSwitchChain = false;
190
+ this._supportsAvalanche = false;
191
+ this._supportsOptimism = false;
192
+ this._supportsPolygon = true;
193
+ this._supportsGnosis = false;
194
+ this._supportsArbitrum = false;
195
+ this._supportsArbitrumNova = false;
196
+ this._supportsBase = false;
197
+ this._supportsBSC = false;
198
+ this._isPhantom = true;
199
+ this.evmProvider = evmProvider;
200
+ this.bitcoinProvider = bitcoinProvider;
201
+ }
202
+ getDeviceID() {
203
+ return __awaiter(this, void 0, void 0, function* () {
204
+ return "phantom:" + (yield this.ethGetAddress());
205
+ });
206
+ }
207
+ getFeatures() {
208
+ return __awaiter(this, void 0, void 0, function* () {
209
+ return {};
210
+ });
211
+ }
212
+ getFirmwareVersion() {
213
+ return __awaiter(this, void 0, void 0, function* () {
214
+ return "phantom";
215
+ });
216
+ }
217
+ getModel() {
218
+ return __awaiter(this, void 0, void 0, function* () {
219
+ return "Phantom";
220
+ });
221
+ }
222
+ getLabel() {
223
+ return __awaiter(this, void 0, void 0, function* () {
224
+ return "Phantom";
225
+ });
226
+ }
227
+ isInitialized() {
228
+ return __awaiter(this, void 0, void 0, function* () {
229
+ return true;
230
+ });
231
+ }
232
+ isLocked() {
233
+ return __awaiter(this, void 0, void 0, function* () {
234
+ return !this.evmProvider._metamask.isUnlocked();
235
+ });
236
+ }
237
+ clearSession() {
238
+ return __awaiter(this, void 0, void 0, function* () { });
239
+ }
240
+ initialize() {
241
+ return __awaiter(this, void 0, void 0, function* () { });
242
+ }
243
+ ping(msg) {
244
+ return __awaiter(this, void 0, void 0, function* () {
245
+ return { msg: msg.msg };
246
+ });
247
+ }
248
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
249
+ sendPin(pin) {
250
+ return __awaiter(this, void 0, void 0, function* () { });
251
+ }
252
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
253
+ sendPassphrase(passphrase) {
254
+ return __awaiter(this, void 0, void 0, function* () { });
255
+ }
256
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
257
+ sendCharacter(charater) {
258
+ return __awaiter(this, void 0, void 0, function* () { });
259
+ }
260
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
261
+ sendWord(word) {
262
+ return __awaiter(this, void 0, void 0, function* () { });
263
+ }
264
+ cancel() {
265
+ return __awaiter(this, void 0, void 0, function* () { });
266
+ }
267
+ wipe() {
268
+ return __awaiter(this, void 0, void 0, function* () { });
269
+ }
270
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
271
+ reset(msg) {
272
+ return __awaiter(this, void 0, void 0, function* () { });
273
+ }
274
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
275
+ recover(msg) {
276
+ return __awaiter(this, void 0, void 0, function* () { });
277
+ }
278
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
279
+ loadDevice(msg) {
280
+ return __awaiter(this, void 0, void 0, function* () { });
281
+ }
282
+ disconnect() {
283
+ return __awaiter(this, void 0, void 0, function* () { });
284
+ }
285
+ getPublicKeys(msg) {
286
+ return __awaiter(this, void 0, void 0, function* () {
287
+ return yield Promise.all(msg.map((getPublicKey) => __awaiter(this, void 0, void 0, function* () {
288
+ const { coin, scriptType } = getPublicKey;
289
+ // Only p2wpkh effectively supported for now
290
+ if (coin === "Bitcoin" && scriptType === hdwallet_core_1.BTCInputScriptType.SpendWitness) {
291
+ // Note this is a pubKey, not an xpub, however phantom does not support utxo derivation,
292
+ // so this functions as an account (xpub) for all intents and purposes
293
+ const pubKey = yield this.btcGetAddress({ coin: "Bitcoin" });
294
+ return { xpub: pubKey };
295
+ }
296
+ return null;
297
+ })));
298
+ });
299
+ }
300
+ /** Ethereum */
301
+ ethGetAddress() {
302
+ return __awaiter(this, void 0, void 0, function* () {
303
+ return eth.ethGetAddress(this.evmProvider);
304
+ });
305
+ }
306
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
307
+ ethSignTx(msg) {
308
+ return __awaiter(this, void 0, void 0, function* () {
309
+ throw new Error("Method not implemented");
310
+ });
311
+ }
312
+ ethSendTx(msg) {
313
+ return __awaiter(this, void 0, void 0, function* () {
314
+ const address = yield this.ethGetAddress();
315
+ return address ? eth.ethSendTx(msg, this.evmProvider, address) : null;
316
+ });
317
+ }
318
+ ethSignMessage(msg) {
319
+ return __awaiter(this, void 0, void 0, function* () {
320
+ const address = yield this.ethGetAddress();
321
+ return address ? eth.ethSignMessage(msg, this.evmProvider, address) : null;
322
+ });
323
+ }
324
+ ethSignTypedData(msg) {
325
+ return __awaiter(this, void 0, void 0, function* () {
326
+ const address = yield this.ethGetAddress();
327
+ return address ? eth.ethSignTypedData(msg, this.evmProvider, address) : null;
328
+ });
329
+ }
330
+ ethVerifyMessage(msg) {
331
+ return __awaiter(this, void 0, void 0, function* () {
332
+ if (!msg.signature.startsWith("0x"))
333
+ msg.signature = `0x${msg.signature}`;
334
+ const digest = (0, utils_js_1.keccak256)(core.buildMessage(msg.message));
335
+ return (0, utils_js_1.recoverAddress)(digest, msg.signature) === msg.address;
336
+ });
337
+ }
338
+ /** Bitcoin */
339
+ btcGetAddress(msg) {
340
+ return __awaiter(this, void 0, void 0, function* () {
341
+ const value = yield (() => __awaiter(this, void 0, void 0, function* () {
342
+ var _a;
343
+ switch (msg.coin) {
344
+ case "Bitcoin": {
345
+ const accounts = yield this.bitcoinProvider.requestAccounts();
346
+ const paymentAddress = (_a = accounts.find((account) => account.purpose === "payment")) === null || _a === void 0 ? void 0 : _a.address;
347
+ return paymentAddress;
348
+ }
349
+ default:
350
+ return null;
351
+ }
352
+ }))();
353
+ if (!value || typeof value !== "string")
354
+ return null;
355
+ return value;
356
+ });
357
+ }
358
+ btcSignTx(msg) {
359
+ return __awaiter(this, void 0, void 0, function* () {
360
+ const { coin } = msg;
361
+ switch (coin) {
362
+ case "Bitcoin":
363
+ return btc.bitcoinSignTx(this, msg, this.bitcoinProvider);
364
+ default:
365
+ return null;
366
+ }
367
+ });
368
+ }
369
+ btcSignMessage(msg) {
370
+ return __awaiter(this, void 0, void 0, function* () {
371
+ const { coin } = msg;
372
+ switch (coin) {
373
+ case "Bitcoin": {
374
+ const address = yield this.btcGetAddress({ coin });
375
+ if (!address)
376
+ throw new Error(`Could not get ${coin} address`);
377
+ const message = new TextEncoder().encode(msg.message);
378
+ const { signature } = yield this.bitcoinProvider.signMessage(address, message);
379
+ return { signature: core.toHexString(signature), address };
380
+ }
381
+ default:
382
+ return null;
383
+ }
384
+ });
385
+ }
386
+ btcVerifyMessage(msg) {
387
+ return __awaiter(this, void 0, void 0, function* () {
388
+ const signature = base64_js_1.default.fromByteArray(core.fromHexString(msg.signature));
389
+ return bitcoinMsg.verify(msg.message, msg.address, signature);
390
+ });
391
+ }
392
+ }
393
+ exports.PhantomHDWallet = PhantomHDWallet;
394
+ //# sourceMappingURL=phantom.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phantom.js","sourceRoot":"","sources":["../src/phantom.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { providers } from "ethers";
2
+ import { BtcAccount } from "./bitcoin";
3
+ export type PhantomEvmProvider = providers.ExternalProvider & {
4
+ _metamask: {
5
+ isUnlocked: () => boolean;
6
+ };
7
+ };
8
+ export type PhantomUtxoProvider = providers.ExternalProvider & {
9
+ requestAccounts: () => Promise<BtcAccount[]>;
10
+ signMessage: (address: string, message: Uint8Array) => Promise<{
11
+ signature: Uint8Array;
12
+ }>;
13
+ signPSBT(psbt: Uint8Array, options: {
14
+ inputsToSign: {
15
+ sigHash?: number | undefined;
16
+ address: string;
17
+ signingIndexes: number[];
18
+ }[];
19
+ }): Promise<Uint8Array>;
20
+ };
21
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,MAAM,MAAM,kBAAkB,GAAG,SAAS,CAAC,gBAAgB,GAAG;IAC5D,SAAS,EAAE;QACT,UAAU,EAAE,MAAM,OAAO,CAAC;KAC3B,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,SAAS,CAAC,gBAAgB,GAAG;IAC7D,eAAe,EAAE,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7C,WAAW,EAAE,CACX,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,UAAU,KAChB,OAAO,CAAC;QACX,SAAS,EAAE,UAAU,CAAC;KACvB,CAAC,CAAC;IACH,QAAQ,CACN,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE;QAAE,YAAY,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;YAAC,OAAO,EAAE,MAAM,CAAC;YAAC,cAAc,EAAE,MAAM,EAAE,CAAA;SAAE,EAAE,CAAA;KAAE,GACvG,OAAO,CAAC,UAAU,CAAC,CAAC;CACxB,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@shapeshiftoss/hdwallet-phantom",
3
+ "version": "1.55.6",
4
+ "license": "MIT",
5
+ "publishConfig": {
6
+ "access": "public"
7
+ },
8
+ "main": "dist/index.js",
9
+ "source": "src/index.ts",
10
+ "types": "dist/index.d.ts",
11
+ "scripts": {
12
+ "build": "tsc --build",
13
+ "clean": "rm -rf dist node_modules tsconfig.tsbuildinfo",
14
+ "prepublishOnly": "yarn clean && yarn build"
15
+ },
16
+ "dependencies": {
17
+ "@shapeshiftoss/bitcoinjs-lib": "5.2.0-shapeshift.2",
18
+ "@shapeshiftoss/hdwallet-core": "1.55.6",
19
+ "base64-js": "^1.5.1",
20
+ "bitcoinjs-message": "^2.0.0",
21
+ "lodash": "^4.17.21"
22
+ },
23
+ "devDependencies": {
24
+ "@types/lodash": "^4.14.168"
25
+ },
26
+ "gitHead": "f7fd72c5fb004c48e99c0b0db8d33d4181e2b80a"
27
+ }
package/src/adapter.ts ADDED
@@ -0,0 +1,62 @@
1
+ import * as core from "@shapeshiftoss/hdwallet-core";
2
+
3
+ import { PhantomHDWallet } from "./phantom";
4
+ import { PhantomEvmProvider, PhantomUtxoProvider } from "./types";
5
+
6
+ declare global {
7
+ interface Window {
8
+ phantom?: {
9
+ ethereum?: PhantomEvmProvider;
10
+ bitcoin?: PhantomUtxoProvider;
11
+ // TODO: update with proper types once implemented
12
+ // https://github.com/anza-xyz/wallet-adapter/blob/3761cd8cc867da39da7c0b070bbf8779402cff36/packages/wallets/phantom/src/adapter.ts#L36
13
+ solana?: any;
14
+ };
15
+ }
16
+ }
17
+
18
+ export class PhantomAdapter {
19
+ keyring: core.Keyring;
20
+
21
+ private constructor(keyring: core.Keyring) {
22
+ this.keyring = keyring;
23
+ }
24
+
25
+ public static useKeyring(keyring: core.Keyring) {
26
+ return new PhantomAdapter(keyring);
27
+ }
28
+
29
+ public async initialize(): Promise<number> {
30
+ return Object.keys(this.keyring.wallets).length;
31
+ }
32
+
33
+ public async pairDevice(): Promise<PhantomHDWallet | undefined> {
34
+ const evmProvider = window.phantom?.ethereum;
35
+ const bitcoinProvider = window.phantom?.bitcoin;
36
+
37
+ if (!evmProvider || !bitcoinProvider) {
38
+ window.open("https://phantom.app/", "_blank");
39
+ console.error("Please install Phantom!");
40
+ throw new Error("Phantom provider not found");
41
+ }
42
+
43
+ try {
44
+ await evmProvider.request?.({ method: "eth_requestAccounts" }).catch(() =>
45
+ evmProvider.request?.({
46
+ method: "wallet_requestPermissions",
47
+ params: [{ eth_accounts: {} }],
48
+ })
49
+ );
50
+ } catch (error) {
51
+ console.error("Could not get Phantom accounts. ");
52
+ throw error;
53
+ }
54
+ const wallet = new PhantomHDWallet(evmProvider, bitcoinProvider);
55
+ await wallet.initialize();
56
+ const deviceID = await wallet.getDeviceID();
57
+ this.keyring.add(wallet, deviceID);
58
+ this.keyring.emit(["Phantom", deviceID, core.Events.CONNECT], deviceID);
59
+
60
+ return wallet;
61
+ }
62
+ }