@shapeshiftoss/hdwallet-coinbase 1.49.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coinbase.js","sourceRoot":"","sources":["../src/coinbase.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mEAAqD;AAErD,mDAA2D;AAE3D,gDAAkC;AAElC,MAAa,oBAAoB;IAAjC;QACW,qBAAgB,GAAG,KAAK,CAAC;QACzB,qBAAgB,GAAG,IAAI,CAAC;QACxB,wBAAmB,GAAG,KAAK,CAAC;QAC5B,yBAAoB,GAAG,KAAK,CAAC;QAC7B,wBAAmB,GAAG,KAAK,CAAC;QAC5B,qBAAgB,GAAG,KAAK,CAAC;QACzB,qBAAgB,GAAG,KAAK,CAAC;QACzB,2BAAsB,GAAG,KAAK,CAAC;QAC/B,wBAAmB,GAAG,KAAK,CAAC;QAC5B,sBAAiB,GAAG,KAAK,CAAC;QAC1B,uBAAkB,GAAG,KAAK,CAAC;IA0EtC,CAAC;IAxEQ,SAAS;QACd,OAAO,UAAU,CAAC;IACpB,CAAC;IAEM,mBAAmB;QACxB,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,qBAAqB;QAC1B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,kBAAkB;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,mBAAmB;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6DAA6D;IACtD,mBAAmB,CAAC,OAAkB,EAAE,OAAkB;QAC/D,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,qBAAqB;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,sBAAsB;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,iBAAiB;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,YAAY,CAAC,GAAsB;QACxC,QAAQ,GAAG,CAAC,IAAI,EAAE;YAChB,KAAK,UAAU;gBACb,wCAAwC;gBACxC,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACxC;gBACE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;SACvC;IACH,CAAC;IAED,6DAA6D;IACtD,kBAAkB,CAAC,GAAwB;QAChD,4BAA4B;QAC5B,OAAO,SAAS,CAAC;IACnB,CAAC;IAEY,kBAAkB,CAAC,OAAe;;YAC7C,OAAO,OAAO,KAAK,CAAC,CAAC;QACvB,CAAC;KAAA;IAEY,yBAAyB;;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;KAAA;IAEM,2BAA2B;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAEY,kBAAkB;;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;IAEM,kBAAkB,CAAC,GAA2B;QACnD,OAAO,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;CACF;AArFD,oDAqFC;AAED,MAAa,gBAAgB;IAuC3B,YAAY,QAAiB;QAtCpB,iBAAY,GAAG,IAAI,CAAC;QACpB,qBAAgB,GAAG,IAAI,CAAC;QACxB,qBAAgB,GAAG,KAAK,CAAC;QACzB,iBAAY,GAAG,KAAK,CAAC;QACrB,wBAAmB,GAAG,KAAK,CAAC;QAC5B,oBAAe,GAAG,KAAK,CAAC;QACxB,4BAAuB,GAAG,IAAI,CAAC,CAAC,SAAS;QACzC,uBAAkB,GAAG,KAAK,CAAC;QAC3B,sBAAiB,GAAG,KAAK,CAAC;QAC1B,iBAAY,GAAG,KAAK,CAAC;QACrB,qBAAgB,GAAG,IAAI,CAAC;QACxB,yBAAoB,GAAG,KAAK,CAAC;QAC7B,qBAAgB,GAAG,KAAK,CAAC;QACzB,yBAAoB,GAAG,KAAK,CAAC;QAC7B,qBAAgB,GAAG,KAAK,CAAC;QACzB,uBAAkB,GAAG,KAAK,CAAC;QAC3B,cAAS,GAAG,KAAK,CAAC;QAClB,gBAAW,GAAG,KAAK,CAAC;QACpB,gBAAW,GAAG,IAAI,CAAC;QACnB,wBAAmB,GAAG,KAAK,CAAC;QAC5B,oBAAe,GAAG,KAAK,CAAC;QACxB,qBAAgB,GAAG,KAAK,CAAC;QACzB,iBAAY,GAAG,KAAK,CAAC;QACrB,qBAAgB,GAAG,KAAK,CAAC;QACzB,iBAAY,GAAG,KAAK,CAAC;QACrB,2BAAsB,GAAG,KAAK,CAAC;QAC/B,uBAAkB,GAAG,KAAK,CAAC;QAC3B,wBAAmB,GAAG,KAAK,CAAC;QAC5B,oBAAe,GAAG,KAAK,CAAC;QACxB,kBAAa,GAAG,KAAK,CAAC;QACtB,sBAAiB,GAAG,KAAK,CAAC;QAC1B,mBAAc,GAAG,KAAK,CAAC;QACvB,uBAAkB,GAAG,KAAK,CAAC;QAOlC,IAAI,CAAC,IAAI,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAEK,WAAW;;YACf,OAAO,EAAE,CAAC;QACZ,CAAC;KAAA;IAEY,QAAQ;;YACnB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;QAC/C,CAAC;KAAA;IAEM,SAAS;QACd,OAAO,UAAU,CAAC;IACpB,CAAC;IAEY,QAAQ;;YACnB,OAAO,UAAU,CAAC;QACpB,CAAC;KAAA;IAEY,QAAQ;;YACnB,OAAO,UAAU,CAAC;QACpB,CAAC;KAAA;IAEY,UAAU;;YACrB,wBAAwB;QAC1B,CAAC;KAAA;IAEM,mBAAmB;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;IACzC,CAAC;IAEM,qBAAqB;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC3C,CAAC;IAEM,kBAAkB;QACvB,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IACxC,CAAC;IAEM,mBAAmB;QACxB,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC;IACzC,CAAC;IAEM,mBAAmB,CAAC,OAAkB,EAAE,OAAkB;QAC/D,OAAO,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAEM,qBAAqB;QAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC3C,CAAC;IAEM,sBAAsB;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,iBAAiB;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAEY,YAAY;;YACvB,wCAAwC;QAC1C,CAAC;KAAA;IAEY,IAAI,CAAC,GAAc;;YAC9B,6DAA6D;YAC7D,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QAC1B,CAAC;KAAA;IAED,6DAA6D;IAChD,OAAO,CAAC,GAAW;;YAC9B,gCAAgC;QAClC,CAAC;KAAA;IAED,6DAA6D;IAChD,cAAc,CAAC,UAAkB;;YAC5C,6DAA6D;QAC/D,CAAC;KAAA;IAED,6DAA6D;IAChD,aAAa,CAAC,QAAgB;;YACzC,0CAA0C;QAC5C,CAAC;KAAA;IAED,6DAA6D;IAChD,QAAQ,CAAC,IAAY;;YAChC,qCAAqC;QACvC,CAAC;KAAA;IAEY,MAAM;;YACjB,mCAAmC;QACrC,CAAC;KAAA;IAED,gEAAgE;IACnD,IAAI;8DAAmB,CAAC;KAAA;IAErC,mGAAmG;IACtF,KAAK,CAAC,GAAqB;8DAAkB,CAAC;KAAA;IAE3D,6DAA6D;IAChD,OAAO,CAAC,GAAuB;;YAC1C,oCAAoC;QACtC,CAAC;KAAA;IAED,6DAA6D;IAChD,UAAU,CAAC,GAAoB;;YAC1C,6DAA6D;QAC/D,CAAC;KAAA;IAEM,YAAY,CAAC,GAAsB;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAED,6DAA6D;IAChD,aAAa,CAAC,GAA6B;;YACtD,sDAAsD;YACtD,OAAO,EAAE,CAAC;QACZ,CAAC;KAAA;IAEY,aAAa;;YACxB,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;IAED,gEAAgE;IACnD,UAAU;8DAAmB,CAAC;KAAA;IAE9B,kBAAkB,CAAC,OAAO,GAAG,CAAC;;YACzC,OAAO,OAAO,KAAK,CAAC,CAAC;QACvB,CAAC;KAAA;IAEY,aAAa;;YACxB,IAAI;gBACF,wBAAwB;gBACxB,MAAM,OAAO,GAAW,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;gBAC/E,OAAO,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;aAC9B;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBACjB,OAAO,IAAI,CAAC;aACb;QACH,CAAC;KAAA;IAEY,WAAW,CAAC,MAAiC;;YACxD,gFAAgF;YAChF,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,yBAAyB,EAAE,MAAM,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC;KAAA;IAEY,cAAc,CAAC,MAAiC;;YAC3D,IAAI;gBACF,gFAAgF;gBAChF,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,4BAA4B,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;aAC9G;YAAC,OAAO,CAAM,EAAE;gBACf,MAAM,KAAK,GAAG,+BAAc,CAAC,CAAC,CAAC,CAAC;gBAChC,+DAA+D;gBAC/D,2HAA2H;gBAC3H,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,EAAE;oBACzB,yJAAyJ;oBACzJ,kJAAkJ;oBAClJ,IAAI;wBACF,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;wBAC/B,OAAO;qBACR;oBAAC,OAAO,SAAc,EAAE;wBACvB,MAAM,aAAa,GAAG,+BAAc,CAAC,SAAS,CAAC,CAAC;wBAEhD,IAAI,aAAa,CAAC,IAAI,KAAK,IAAI,EAAE;4BAC/B,MAAM,0BAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;yBAChD;wBAED,MAAO,aAAa,CAAC,IAAY,CAAC,aAIjC,CAAC;qBACH;iBACF;gBAED,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,EAAE;oBACvB,MAAM,0BAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,CAAC;iBAChD;gBAED,MAAO,KAAK,CAAC,IAAY,CAAC,aAIzB,CAAC;aACH;QACH,CAAC;KAAA;IAEY,yBAAyB;;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;KAAA;IAEM,2BAA2B;QAChC,OAAO,KAAK,CAAC;IACf,CAAC;IAEY,kBAAkB;;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;IAEM,kBAAkB,CAAC,GAA2B;QACnD,OAAO,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;IACrC,CAAC;IAEM,kBAAkB,CAAC,GAAwB;QAChD,OAAO,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;IAED,kCAAkC;IAClC,6DAA6D;IAChD,aAAa,CAAC,GAAuB;;YAChD,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnB,OAAO,IAAI,CAAC,UAAU,CAAC;aACxB;YACD,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACvD,IAAI,OAAO,EAAE;gBACX,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC;gBAC1B,OAAO,OAAO,CAAC;aAChB;iBAAM;gBACL,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,OAAO,IAAI,CAAC;aACb;QACH,CAAC;KAAA;IAEY,SAAS,CAAC,GAAmB;;YACxC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxD,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,CAAC;KAAA;IAEY,SAAS,CAAC,GAAmB;;YACxC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxD,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrE,CAAC;KAAA;IAEY,cAAc,CAAC,GAAwB;;YAClD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxD,OAAO,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC1E,CAAC;KAAA;IAEY,gBAAgB,CAAC,GAA0B;;YACtD,OAAO,GAAG,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClD,CAAC;KAAA;IAEY,WAAW;;YACtB,OAAO,WAAW,GAAG,CAAC,MAAM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QACjE,CAAC;KAAA;IAEY,kBAAkB;;YAC7B,OAAO,UAAU,CAAC;QACpB,CAAC;KAAA;CACF;AAjSD,4CAiSC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=coinbase.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coinbase.test.d.ts","sourceRoot":"","sources":["../src/coinbase.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,177 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
+ return new (P || (P = Promise))(function (resolve, reject) {
24
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
28
+ });
29
+ };
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ const core = __importStar(require("@shapeshiftoss/hdwallet-core"));
32
+ const _1 = require(".");
33
+ describe("HDWalletInfo", () => {
34
+ const info = new _1.CoinbaseHDWalletInfo();
35
+ it("should have correct metadata", () => __awaiter(void 0, void 0, void 0, function* () {
36
+ expect(info.getVendor()).toBe("Coinbase");
37
+ expect(info.hasOnDevicePinEntry()).toBe(false);
38
+ expect(info.hasOnDevicePassphrase()).toBe(true);
39
+ expect(info.hasOnDeviceDisplay()).toBe(true);
40
+ expect(info.hasOnDeviceRecovery()).toBe(true);
41
+ expect(yield info.ethSupportsNetwork(1)).toBe(true);
42
+ expect(yield info.ethSupportsSecureTransfer()).toBe(false);
43
+ expect(info.ethSupportsNativeShapeShift()).toBe(false);
44
+ expect(yield info.ethSupportsEIP1559()).toBe(true);
45
+ expect(yield info.supportsOfflineSigning()).toBe(false);
46
+ expect(yield info.supportsBroadcast()).toBe(true);
47
+ }));
48
+ });
49
+ describe("CoinbaseHDWallet", () => {
50
+ let wallet;
51
+ beforeEach(() => {
52
+ wallet = new _1.CoinbaseHDWallet(core.untouchable("CoinbaseHDWallet:provider"));
53
+ wallet.ethAddress = "0x73d0385F4d8E00C5e6504C6030F47BF6212736A8";
54
+ });
55
+ it("should match the metadata", () => __awaiter(void 0, void 0, void 0, function* () {
56
+ expect(wallet.getVendor()).toBe("Coinbase");
57
+ expect(wallet.hasOnDevicePinEntry()).toBe(false);
58
+ expect(wallet.hasOnDevicePassphrase()).toBe(true);
59
+ expect(wallet.hasOnDeviceDisplay()).toBe(true);
60
+ expect(wallet.hasOnDeviceRecovery()).toBe(true);
61
+ expect(yield wallet.ethSupportsNetwork(1)).toBe(true);
62
+ expect(yield wallet.ethSupportsSecureTransfer()).toBe(false);
63
+ expect(wallet.ethSupportsNativeShapeShift()).toBe(false);
64
+ expect(yield wallet.ethSupportsEIP1559()).toBe(true);
65
+ expect(yield wallet.supportsOfflineSigning()).toBe(false);
66
+ expect(wallet.supportsBip44Accounts()).toBe(false);
67
+ expect(yield wallet.supportsBroadcast()).toBe(true);
68
+ }));
69
+ it("should test ethSignMessage", () => __awaiter(void 0, void 0, void 0, function* () {
70
+ wallet.provider = {
71
+ request: jest.fn().mockReturnValue(`Object {
72
+ "address": "0x73d0385F4d8E00C5e6504C6030F47BF6212736A8",
73
+ "signature": "0x05f51140905ffa33ffdc57f46b0b8d8fbb1d2a99f8cd843ca27893c01c31351c08b76d83dce412731c846e3b50649724415deb522d00950fbf4f2c1459c2b70b1b",
74
+ }`),
75
+ };
76
+ const msg = "super secret message";
77
+ expect(yield wallet.ethSignMessage({
78
+ addressNList: core.bip32ToAddressNList("m/44'/60'/0'/0/0"),
79
+ message: msg,
80
+ })).toMatchInlineSnapshot(`
81
+ Object {
82
+ "address": "0x73d0385F4d8E00C5e6504C6030F47BF6212736A8",
83
+ "signature": "Object {
84
+ \\"address\\": \\"0x73d0385F4d8E00C5e6504C6030F47BF6212736A8\\",
85
+ \\"signature\\": \\"0x05f51140905ffa33ffdc57f46b0b8d8fbb1d2a99f8cd843ca27893c01c31351c08b76d83dce412731c846e3b50649724415deb522d00950fbf4f2c1459c2b70b1b\\",
86
+ }",
87
+ }
88
+ `);
89
+ }));
90
+ it("ethSignMessage returns null on error", () => __awaiter(void 0, void 0, void 0, function* () {
91
+ wallet.provider = {
92
+ request: jest.fn().mockRejectedValue(new Error("An Error has occurred")),
93
+ };
94
+ const msg = "super secret message";
95
+ const sig = yield wallet.ethSignMessage({
96
+ addressNList: core.bip32ToAddressNList("m/44'/60'/0'/0/0"),
97
+ message: msg,
98
+ });
99
+ expect(sig).toBe(null);
100
+ }));
101
+ it("ethGetAddress returns a valid address", () => __awaiter(void 0, void 0, void 0, function* () {
102
+ wallet.provider = {
103
+ request: jest.fn().mockReturnValue(["0x73d0385F4d8E00C5e6504C6030F47BF6212736A8"]),
104
+ };
105
+ const msg = "super secret message";
106
+ const sig = yield wallet.ethSignMessage({
107
+ addressNList: core.bip32ToAddressNList("m/44'/60'/0'/0/0"),
108
+ message: msg,
109
+ });
110
+ expect(sig).toMatchObject({
111
+ address: "0x73d0385F4d8E00C5e6504C6030F47BF6212736A8",
112
+ signature: ["0x73d0385F4d8E00C5e6504C6030F47BF6212736A8"],
113
+ });
114
+ }));
115
+ it("ethSendTx returns a valid hash", () => __awaiter(void 0, void 0, void 0, function* () {
116
+ wallet.provider = {
117
+ request: jest.fn().mockReturnValue("0x123"),
118
+ };
119
+ const hash = yield wallet.ethSendTx({
120
+ addressNList: core.bip32ToAddressNList("m/44'/60'/0'/0/0"),
121
+ nonce: "0xDEADBEEF",
122
+ gasPrice: "0xDEADBEEF",
123
+ gasLimit: "0xDEADBEEF",
124
+ to: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
125
+ value: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
126
+ data: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
127
+ chainId: 1,
128
+ });
129
+ expect(wallet.provider.request).toHaveBeenCalled();
130
+ expect(hash).toMatchObject({ hash: "0x123" });
131
+ }));
132
+ it("ethSendTx returns a valid hash if maxFeePerGas is present in msg", () => __awaiter(void 0, void 0, void 0, function* () {
133
+ wallet.provider = {
134
+ request: jest.fn().mockReturnValue("0x123"),
135
+ };
136
+ const hash = yield wallet.ethSendTx({
137
+ addressNList: core.bip32ToAddressNList("m/44'/60'/0'/0/0"),
138
+ nonce: "0xDEADBEEF",
139
+ gasLimit: "0xDEADBEEF",
140
+ maxFeePerGas: "0xDEADBEEF",
141
+ to: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
142
+ value: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
143
+ data: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
144
+ chainId: 1,
145
+ });
146
+ expect(wallet.provider.request).toHaveBeenCalled();
147
+ expect(hash).toMatchObject({ hash: "0x123" });
148
+ }));
149
+ it("ethSendTx returns null on error", () => __awaiter(void 0, void 0, void 0, function* () {
150
+ wallet.provider = {
151
+ request: jest.fn().mockRejectedValue(new Error("An Error has occurred")),
152
+ };
153
+ const hash = yield wallet.ethSendTx({
154
+ addressNList: core.bip32ToAddressNList("m/44'/60'/0'/0/0"),
155
+ nonce: "0xDEADBEEF",
156
+ gasPrice: "0xDEADBEEF",
157
+ gasLimit: "0xDEADBEEF",
158
+ to: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
159
+ value: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
160
+ data: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
161
+ chainId: 1,
162
+ });
163
+ expect(wallet.provider.request).toHaveBeenCalled();
164
+ expect(hash).toBe(null);
165
+ }));
166
+ it("ethVerifyMessage returns null as its not implemented", () => __awaiter(void 0, void 0, void 0, function* () {
167
+ wallet.provider = {
168
+ request: jest.fn().mockReturnValue("0x3f2329C9ADFbcCd9A84f52c906E936A42dA18CB8"),
169
+ };
170
+ expect(yield wallet.ethVerifyMessage({
171
+ address: "0x3f2329C9ADFbcCd9A84f52c906E936A42dA18CB8",
172
+ message: "hello world",
173
+ signature: "0x29f7212ecc1c76cea81174af267b67506f754ea8c73f144afa900a0d85b24b21319621aeb062903e856352f38305710190869c3ce5a1425d65ef4fa558d0fc251b",
174
+ })).toEqual(null);
175
+ }));
176
+ });
177
+ //# sourceMappingURL=coinbase.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coinbase.test.js","sourceRoot":"","sources":["../src/coinbase.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import * as core from "@shapeshiftoss/hdwallet-core";
2
+ export declare function describeETHPath(path: core.BIP32Path): core.PathDescription;
3
+ export declare function ethGetAccountPaths(msg: core.ETHGetAccountPath): Array<core.ETHAccountPath>;
4
+ export declare function ethGetAddress(ethereum: any): Promise<string | null>;
5
+ export declare function ethSignTx(msg: core.ETHSignTx, ethereum: any, from: string): Promise<core.ETHSignedTx | null>;
6
+ export declare function ethSendTx(msg: core.ETHSignTx, ethereum: any, from: string): Promise<core.ETHTxHash | null>;
7
+ export declare function ethVerifyMessage(msg: core.ETHVerifyMessage, ethereum: any): Promise<boolean | null>;
8
+ export declare function ethSignMessage(msg: core.ETHSignMessage, ethereum: any, address: string): Promise<core.ETHSignedMessage | null>;
9
+ //# sourceMappingURL=ethereum.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ethereum.d.ts","sourceRoot":"","sources":["../src/ethereum.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,8BAA8B,CAAC;AAIrD,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAE1E;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAW1F;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAazE;AAGD,wBAAsB,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,CAGlH;AAED,wBAAsB,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,CAgChH;AAGD,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAGzG;AAED,wBAAsB,cAAc,CAClC,GAAG,EAAE,IAAI,CAAC,cAAc,EACxB,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAkBvC"}
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
22
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
23
+ return new (P || (P = Promise))(function (resolve, reject) {
24
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
25
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
26
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
27
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
28
+ });
29
+ };
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.ethSignMessage = exports.ethVerifyMessage = exports.ethSendTx = exports.ethSignTx = exports.ethGetAddress = exports.ethGetAccountPaths = exports.describeETHPath = void 0;
32
+ const core = __importStar(require("@shapeshiftoss/hdwallet-core"));
33
+ const ethers = __importStar(require("ethers"));
34
+ function describeETHPath(path) {
35
+ return core.describeETHPath(path);
36
+ }
37
+ exports.describeETHPath = describeETHPath;
38
+ function ethGetAccountPaths(msg) {
39
+ const slip44 = core.slip44ByCoin(msg.coin);
40
+ if (slip44 === undefined)
41
+ return [];
42
+ return [
43
+ {
44
+ addressNList: [0x80000000 + 44, 0x80000000 + slip44, 0x80000000 + msg.accountIdx, 0, 0],
45
+ hardenedPath: [0x80000000 + 44, 0x80000000 + slip44, 0x80000000 + msg.accountIdx],
46
+ relPath: [0, 0],
47
+ description: "Coinbase",
48
+ },
49
+ ];
50
+ }
51
+ exports.ethGetAccountPaths = ethGetAccountPaths;
52
+ function ethGetAddress(ethereum) {
53
+ return __awaiter(this, void 0, void 0, function* () {
54
+ if (!(ethereum && ethereum.request)) {
55
+ return null;
56
+ }
57
+ try {
58
+ const ethAccounts = yield ethereum.request({
59
+ method: "eth_accounts",
60
+ });
61
+ return ethAccounts[0];
62
+ }
63
+ catch (error) {
64
+ console.error(error);
65
+ return null;
66
+ }
67
+ });
68
+ }
69
+ exports.ethGetAddress = ethGetAddress;
70
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
71
+ function ethSignTx(msg, ethereum, from) {
72
+ return __awaiter(this, void 0, void 0, function* () {
73
+ console.error("Method ethSignTx unsupported for Coinbase wallet");
74
+ return null;
75
+ });
76
+ }
77
+ exports.ethSignTx = ethSignTx;
78
+ function ethSendTx(msg, ethereum, from) {
79
+ return __awaiter(this, void 0, void 0, function* () {
80
+ try {
81
+ const utxBase = {
82
+ from: from,
83
+ to: msg.to,
84
+ value: msg.value,
85
+ data: msg.data,
86
+ chainId: msg.chainId,
87
+ nonce: msg.nonce,
88
+ gas: msg.gasLimit,
89
+ };
90
+ const utx = msg.maxFeePerGas
91
+ ? Object.assign(Object.assign({}, utxBase), { maxFeePerGas: msg.maxFeePerGas, maxPriorityFeePerGas: msg.maxPriorityFeePerGas }) : Object.assign(Object.assign({}, utxBase), { gasPrice: msg.gasPrice });
92
+ const signedTx = yield ethereum.request({
93
+ method: "eth_sendTransaction",
94
+ params: [utx],
95
+ });
96
+ return {
97
+ hash: signedTx,
98
+ };
99
+ }
100
+ catch (error) {
101
+ console.error(error);
102
+ return null;
103
+ }
104
+ });
105
+ }
106
+ exports.ethSendTx = ethSendTx;
107
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
108
+ function ethVerifyMessage(msg, ethereum) {
109
+ return __awaiter(this, void 0, void 0, function* () {
110
+ console.error("Method ethVerifyMessage unsupported for Coinbase wallet!");
111
+ return null;
112
+ });
113
+ }
114
+ exports.ethVerifyMessage = ethVerifyMessage;
115
+ function ethSignMessage(msg, ethereum, address) {
116
+ return __awaiter(this, void 0, void 0, function* () {
117
+ try {
118
+ const buffer = ethers.utils.isBytes(msg.message)
119
+ ? Buffer.from(ethers.utils.arrayify(msg.message))
120
+ : Buffer.from(msg.message);
121
+ const signedMsg = yield ethereum.request({
122
+ method: "personal_sign",
123
+ params: [buffer.toString("hex"), address],
124
+ });
125
+ return {
126
+ address: address,
127
+ signature: signedMsg,
128
+ };
129
+ }
130
+ catch (error) {
131
+ console.error(error);
132
+ return null;
133
+ }
134
+ });
135
+ }
136
+ exports.ethSignMessage = ethSignMessage;
137
+ //# sourceMappingURL=ethereum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ethereum.js","sourceRoot":"","sources":["../src/ethereum.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./adapter";
2
+ export * from "./coinbase";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
10
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
11
+ };
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ __exportStar(require("./adapter"), exports);
14
+ __exportStar(require("./coinbase"), exports);
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,4CAA0B;AAC1B,6CAA2B"}
package/package.json ADDED
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "@shapeshiftoss/hdwallet-coinbase",
3
+ "version": "1.49.1-alpha.0",
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 tsconfig.tsbuildinfo",
14
+ "prepublishOnly": "yarn clean && yarn build"
15
+ },
16
+ "dependencies": {
17
+ "@coinbase/wallet-sdk": "^3.6.6",
18
+ "@shapeshiftoss/hdwallet-core": "1.49.1-alpha.0",
19
+ "eth-rpc-errors": "^4.0.3",
20
+ "lodash": "^4.17.21"
21
+ },
22
+ "devDependencies": {
23
+ "@types/lodash": "^4.14.168",
24
+ "typescript": "^4.3.2"
25
+ },
26
+ "gitHead": "156e78d40dedbf1006e1ecd3b9274829607a4212"
27
+ }
package/src/adapter.ts ADDED
@@ -0,0 +1,59 @@
1
+ import CoinbaseWalletSDK from "@coinbase/wallet-sdk";
2
+ import * as core from "@shapeshiftoss/hdwallet-core";
3
+
4
+ import { CoinbaseHDWallet } from "./coinbase";
5
+
6
+ export class CoinbaseAdapter {
7
+ keyring: core.Keyring;
8
+
9
+ private constructor(keyring: core.Keyring) {
10
+ this.keyring = keyring;
11
+ }
12
+
13
+ public static useKeyring(keyring: core.Keyring) {
14
+ return new CoinbaseAdapter(keyring);
15
+ }
16
+
17
+ public async initialize(): Promise<number> {
18
+ return Object.keys(this.keyring.wallets).length;
19
+ }
20
+
21
+ public async pairDevice(): Promise<CoinbaseHDWallet | undefined> {
22
+ const APP_NAME = "Coinbase Wallet Experiment";
23
+ const APP_LOGO_URL = "https://avatars.githubusercontent.com/u/52928763?s=50&v=4";
24
+ const DEFAULT_ETH_JSONRPC_URL = `https://mainnet.infura.io/v3/key-here`;
25
+ const DEFAULT_CHAIN_ID = 1;
26
+
27
+ // Initialize Coinbase Wallet SDK
28
+ const coinbaseWallet = new CoinbaseWalletSDK({
29
+ appName: APP_NAME,
30
+ appLogoUrl: APP_LOGO_URL,
31
+ darkMode: false,
32
+ });
33
+ // Initialize a Web3 Provider object
34
+ const coinbaseWalletProvider = coinbaseWallet.makeWeb3Provider(DEFAULT_ETH_JSONRPC_URL, DEFAULT_CHAIN_ID);
35
+
36
+ // Initialize a Web3 object
37
+ // const web3 = new Web3(coinbaseWalletProvider as any);
38
+
39
+ try {
40
+ const accts = (await coinbaseWalletProvider.request?.({ method: "eth_requestAccounts" })) as string[];
41
+ console.info(`account address: ${accts[0]}`);
42
+ } catch (err) {
43
+ console.error(`Could not get Coinbase accounts: ${err}`);
44
+ throw err;
45
+ }
46
+
47
+ const wallet = new CoinbaseHDWallet(coinbaseWalletProvider);
48
+ await wallet.initialize();
49
+ const deviceID = await wallet.getDeviceID();
50
+ console.info(`deviceID: ${deviceID}`);
51
+
52
+ this.keyring.add(wallet, deviceID);
53
+ this.keyring.emit(["Coinbase", deviceID, core.Events.CONNECT], deviceID);
54
+ // Optionally, have the default account set for web3.js
55
+ // web3.eth.defaultAccount = accounts[0]
56
+
57
+ return wallet;
58
+ }
59
+ }
@@ -0,0 +1,168 @@
1
+ import * as core from "@shapeshiftoss/hdwallet-core";
2
+
3
+ import { CoinbaseHDWallet, CoinbaseHDWalletInfo } from ".";
4
+
5
+ describe("HDWalletInfo", () => {
6
+ const info = new CoinbaseHDWalletInfo();
7
+
8
+ it("should have correct metadata", async () => {
9
+ expect(info.getVendor()).toBe("Coinbase");
10
+ expect(info.hasOnDevicePinEntry()).toBe(false);
11
+ expect(info.hasOnDevicePassphrase()).toBe(true);
12
+ expect(info.hasOnDeviceDisplay()).toBe(true);
13
+ expect(info.hasOnDeviceRecovery()).toBe(true);
14
+ expect(await info.ethSupportsNetwork(1)).toBe(true);
15
+ expect(await info.ethSupportsSecureTransfer()).toBe(false);
16
+ expect(info.ethSupportsNativeShapeShift()).toBe(false);
17
+ expect(await info.ethSupportsEIP1559()).toBe(true);
18
+ expect(await info.supportsOfflineSigning()).toBe(false);
19
+ expect(await info.supportsBroadcast()).toBe(true);
20
+ });
21
+ });
22
+
23
+ describe("CoinbaseHDWallet", () => {
24
+ let wallet: CoinbaseHDWallet;
25
+ beforeEach(() => {
26
+ wallet = new CoinbaseHDWallet(core.untouchable("CoinbaseHDWallet:provider"));
27
+ wallet.ethAddress = "0x73d0385F4d8E00C5e6504C6030F47BF6212736A8";
28
+ });
29
+
30
+ it("should match the metadata", async () => {
31
+ expect(wallet.getVendor()).toBe("Coinbase");
32
+ expect(wallet.hasOnDevicePinEntry()).toBe(false);
33
+ expect(wallet.hasOnDevicePassphrase()).toBe(true);
34
+ expect(wallet.hasOnDeviceDisplay()).toBe(true);
35
+ expect(wallet.hasOnDeviceRecovery()).toBe(true);
36
+ expect(await wallet.ethSupportsNetwork(1)).toBe(true);
37
+ expect(await wallet.ethSupportsSecureTransfer()).toBe(false);
38
+ expect(wallet.ethSupportsNativeShapeShift()).toBe(false);
39
+ expect(await wallet.ethSupportsEIP1559()).toBe(true);
40
+ expect(await wallet.supportsOfflineSigning()).toBe(false);
41
+ expect(wallet.supportsBip44Accounts()).toBe(false);
42
+ expect(await wallet.supportsBroadcast()).toBe(true);
43
+ });
44
+
45
+ it("should test ethSignMessage", async () => {
46
+ wallet.provider = {
47
+ request: jest.fn().mockReturnValue(
48
+ `Object {
49
+ "address": "0x73d0385F4d8E00C5e6504C6030F47BF6212736A8",
50
+ "signature": "0x05f51140905ffa33ffdc57f46b0b8d8fbb1d2a99f8cd843ca27893c01c31351c08b76d83dce412731c846e3b50649724415deb522d00950fbf4f2c1459c2b70b1b",
51
+ }`
52
+ ),
53
+ };
54
+ const msg = "super secret message";
55
+ expect(
56
+ await wallet.ethSignMessage({
57
+ addressNList: core.bip32ToAddressNList("m/44'/60'/0'/0/0"),
58
+ message: msg,
59
+ })
60
+ ).toMatchInlineSnapshot(`
61
+ Object {
62
+ "address": "0x73d0385F4d8E00C5e6504C6030F47BF6212736A8",
63
+ "signature": "Object {
64
+ \\"address\\": \\"0x73d0385F4d8E00C5e6504C6030F47BF6212736A8\\",
65
+ \\"signature\\": \\"0x05f51140905ffa33ffdc57f46b0b8d8fbb1d2a99f8cd843ca27893c01c31351c08b76d83dce412731c846e3b50649724415deb522d00950fbf4f2c1459c2b70b1b\\",
66
+ }",
67
+ }
68
+ `);
69
+ });
70
+
71
+ it("ethSignMessage returns null on error", async () => {
72
+ wallet.provider = {
73
+ request: jest.fn().mockRejectedValue(new Error("An Error has occurred")),
74
+ };
75
+
76
+ const msg = "super secret message";
77
+ const sig = await wallet.ethSignMessage({
78
+ addressNList: core.bip32ToAddressNList("m/44'/60'/0'/0/0"),
79
+ message: msg,
80
+ });
81
+
82
+ expect(sig).toBe(null);
83
+ });
84
+
85
+ it("ethGetAddress returns a valid address", async () => {
86
+ wallet.provider = {
87
+ request: jest.fn().mockReturnValue(["0x73d0385F4d8E00C5e6504C6030F47BF6212736A8"]),
88
+ };
89
+
90
+ const msg = "super secret message";
91
+ const sig = await wallet.ethSignMessage({
92
+ addressNList: core.bip32ToAddressNList("m/44'/60'/0'/0/0"),
93
+ message: msg,
94
+ });
95
+
96
+ expect(sig).toMatchObject({
97
+ address: "0x73d0385F4d8E00C5e6504C6030F47BF6212736A8",
98
+ signature: ["0x73d0385F4d8E00C5e6504C6030F47BF6212736A8"],
99
+ });
100
+ });
101
+ it("ethSendTx returns a valid hash", async () => {
102
+ wallet.provider = {
103
+ request: jest.fn().mockReturnValue("0x123"),
104
+ };
105
+
106
+ const hash = await wallet.ethSendTx({
107
+ addressNList: core.bip32ToAddressNList("m/44'/60'/0'/0/0"),
108
+ nonce: "0xDEADBEEF",
109
+ gasPrice: "0xDEADBEEF",
110
+ gasLimit: "0xDEADBEEF",
111
+ to: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
112
+ value: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
113
+ data: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
114
+ chainId: 1,
115
+ });
116
+ expect(wallet.provider.request).toHaveBeenCalled();
117
+ expect(hash).toMatchObject({ hash: "0x123" });
118
+ });
119
+ it("ethSendTx returns a valid hash if maxFeePerGas is present in msg", async () => {
120
+ wallet.provider = {
121
+ request: jest.fn().mockReturnValue("0x123"),
122
+ };
123
+
124
+ const hash = await wallet.ethSendTx({
125
+ addressNList: core.bip32ToAddressNList("m/44'/60'/0'/0/0"),
126
+ nonce: "0xDEADBEEF",
127
+ gasLimit: "0xDEADBEEF",
128
+ maxFeePerGas: "0xDEADBEEF",
129
+ to: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
130
+ value: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
131
+ data: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
132
+ chainId: 1,
133
+ });
134
+ expect(wallet.provider.request).toHaveBeenCalled();
135
+ expect(hash).toMatchObject({ hash: "0x123" });
136
+ });
137
+ it("ethSendTx returns null on error", async () => {
138
+ wallet.provider = {
139
+ request: jest.fn().mockRejectedValue(new Error("An Error has occurred")),
140
+ };
141
+
142
+ const hash = await wallet.ethSendTx({
143
+ addressNList: core.bip32ToAddressNList("m/44'/60'/0'/0/0"),
144
+ nonce: "0xDEADBEEF",
145
+ gasPrice: "0xDEADBEEF",
146
+ gasLimit: "0xDEADBEEF",
147
+ to: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
148
+ value: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
149
+ data: "0xDEADBEEFDEADBEEFDEADBEEFDEADBEEF",
150
+ chainId: 1,
151
+ });
152
+ expect(wallet.provider.request).toHaveBeenCalled();
153
+ expect(hash).toBe(null);
154
+ });
155
+ it("ethVerifyMessage returns null as its not implemented", async () => {
156
+ wallet.provider = {
157
+ request: jest.fn().mockReturnValue("0x3f2329C9ADFbcCd9A84f52c906E936A42dA18CB8"),
158
+ };
159
+ expect(
160
+ await wallet.ethVerifyMessage({
161
+ address: "0x3f2329C9ADFbcCd9A84f52c906E936A42dA18CB8",
162
+ message: "hello world",
163
+ signature:
164
+ "0x29f7212ecc1c76cea81174af267b67506f754ea8c73f144afa900a0d85b24b21319621aeb062903e856352f38305710190869c3ce5a1425d65ef4fa558d0fc251b",
165
+ })
166
+ ).toEqual(null);
167
+ });
168
+ });