@cityofzion/bs-ethereum 1.3.0 → 1.4.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.
@@ -1,16 +1,10 @@
1
- import { Account, LedgerService } from '@cityofzion/blockchain-service';
1
+ import { Account, LedgerService, LedgerServiceEmitter } from '@cityofzion/blockchain-service';
2
2
  import Transport from '@ledgerhq/hw-transport';
3
3
  import { ethers, Signer } from 'ethers';
4
4
  import { TypedDataSigner } from '@ethersproject/abstract-signer';
5
- export declare class LedgerServiceEthereum implements LedgerService {
6
- getLedgerTransport?: ((account: Account) => Promise<Transport>) | undefined;
7
- constructor(getLedgerTransport?: ((account: Account) => Promise<Transport>) | undefined);
8
- getAddress(transport: Transport): Promise<string>;
9
- getPublicKey(transport: Transport): Promise<string>;
10
- }
11
5
  export declare class LedgerSigner extends Signer implements TypedDataSigner {
12
6
  #private;
13
- constructor(transport: Transport, provider?: ethers.providers.Provider);
7
+ constructor(transport: Transport, provider?: ethers.providers.Provider, emitter?: LedgerServiceEmitter);
14
8
  connect(provider: ethers.providers.Provider): LedgerSigner;
15
9
  getAddress(): Promise<string>;
16
10
  getPublicKey(): Promise<string>;
@@ -18,3 +12,11 @@ export declare class LedgerSigner extends Signer implements TypedDataSigner {
18
12
  signTransaction(transaction: ethers.utils.Deferrable<ethers.providers.TransactionRequest>): Promise<string>;
19
13
  _signTypedData(domain: ethers.TypedDataDomain, types: Record<string, ethers.TypedDataField[]>, value: Record<string, any>): Promise<string>;
20
14
  }
15
+ export declare class LedgerServiceEthereum implements LedgerService {
16
+ getLedgerTransport?: ((account: Account) => Promise<Transport>) | undefined;
17
+ emitter: LedgerServiceEmitter;
18
+ constructor(getLedgerTransport?: ((account: Account) => Promise<Transport>) | undefined);
19
+ getAddress(transport: Transport): Promise<string>;
20
+ getPublicKey(transport: Transport): Promise<string>;
21
+ getSigner(transport: Transport): LedgerSigner;
22
+ }
@@ -42,44 +42,27 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
42
42
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
43
43
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
44
44
  };
45
- var _LedgerSigner_instances, _LedgerSigner_transport, _LedgerSigner_path, _LedgerSigner_retry;
45
+ var __importDefault = (this && this.__importDefault) || function (mod) {
46
+ return (mod && mod.__esModule) ? mod : { "default": mod };
47
+ };
48
+ var _LedgerSigner_instances, _LedgerSigner_transport, _LedgerSigner_emitter, _LedgerSigner_path, _LedgerSigner_retry;
46
49
  Object.defineProperty(exports, "__esModule", { value: true });
47
- exports.LedgerSigner = exports.LedgerServiceEthereum = void 0;
50
+ exports.LedgerServiceEthereum = exports.LedgerSigner = void 0;
48
51
  const hw_app_eth_1 = __importStar(require("@ledgerhq/hw-app-eth"));
49
52
  const ethers_1 = require("ethers");
50
53
  const properties_1 = require("@ethersproject/properties");
51
54
  const constants_1 = require("./constants");
52
- class LedgerServiceEthereum {
53
- constructor(getLedgerTransport) {
54
- this.getLedgerTransport = getLedgerTransport;
55
- }
56
- getAddress(transport) {
57
- return __awaiter(this, void 0, void 0, function* () {
58
- const signer = new LedgerSigner(transport);
59
- return yield signer.getAddress();
60
- });
61
- }
62
- getPublicKey(transport) {
63
- return __awaiter(this, void 0, void 0, function* () {
64
- const signer = new LedgerSigner(transport);
65
- return yield signer.getPublicKey();
66
- });
67
- }
68
- }
69
- exports.LedgerServiceEthereum = LedgerServiceEthereum;
70
- function wait(duration) {
71
- return new Promise(resolve => {
72
- setTimeout(resolve, duration);
73
- });
74
- }
55
+ const events_1 = __importDefault(require("events"));
75
56
  class LedgerSigner extends ethers_1.Signer {
76
- constructor(transport, provider) {
57
+ constructor(transport, provider, emitter) {
77
58
  super();
78
59
  _LedgerSigner_instances.add(this);
79
60
  _LedgerSigner_transport.set(this, void 0);
61
+ _LedgerSigner_emitter.set(this, void 0);
80
62
  _LedgerSigner_path.set(this, void 0);
81
63
  __classPrivateFieldSet(this, _LedgerSigner_path, constants_1.DEFAULT_PATH, "f");
82
64
  __classPrivateFieldSet(this, _LedgerSigner_transport, transport, "f");
65
+ __classPrivateFieldSet(this, _LedgerSigner_emitter, emitter, "f");
83
66
  (0, properties_1.defineReadOnly)(this, 'provider', provider);
84
67
  }
85
68
  connect(provider) {
@@ -100,12 +83,15 @@ class LedgerSigner extends ethers_1.Signer {
100
83
  });
101
84
  }
102
85
  signMessage(message) {
86
+ var _a, _b;
103
87
  return __awaiter(this, void 0, void 0, function* () {
104
88
  if (typeof message === 'string') {
105
89
  message = ethers_1.ethers.utils.toUtf8Bytes(message);
106
90
  }
107
91
  const ledgerApp = new hw_app_eth_1.default(__classPrivateFieldGet(this, _LedgerSigner_transport, "f"));
92
+ (_a = __classPrivateFieldGet(this, _LedgerSigner_emitter, "f")) === null || _a === void 0 ? void 0 : _a.emit('getSignatureStart');
108
93
  const obj = yield __classPrivateFieldGet(this, _LedgerSigner_instances, "m", _LedgerSigner_retry).call(this, () => ledgerApp.signPersonalMessage(__classPrivateFieldGet(this, _LedgerSigner_path, "f"), ethers_1.ethers.utils.hexlify(message).substring(2)));
94
+ (_b = __classPrivateFieldGet(this, _LedgerSigner_emitter, "f")) === null || _b === void 0 ? void 0 : _b.emit('getSignatureEnd');
109
95
  // Normalize the signature for Ethers
110
96
  obj.r = '0x' + obj.r;
111
97
  obj.s = '0x' + obj.s;
@@ -113,13 +99,16 @@ class LedgerSigner extends ethers_1.Signer {
113
99
  });
114
100
  }
115
101
  signTransaction(transaction) {
102
+ var _a, _b;
116
103
  return __awaiter(this, void 0, void 0, function* () {
117
104
  const ledgerApp = new hw_app_eth_1.default(__classPrivateFieldGet(this, _LedgerSigner_transport, "f"));
118
105
  const tx = yield ethers_1.ethers.utils.resolveProperties(transaction);
119
106
  const unsignedTransaction = Object.assign(Object.assign({}, tx), { nonce: tx.nonce ? ethers_1.ethers.BigNumber.from(transaction.nonce).toNumber() : undefined });
120
107
  const serializedUnsignedTransaction = ethers_1.ethers.utils.serializeTransaction(unsignedTransaction).substring(2);
121
108
  const resolution = yield hw_app_eth_1.ledgerService.resolveTransaction(serializedUnsignedTransaction, {}, {});
109
+ (_a = __classPrivateFieldGet(this, _LedgerSigner_emitter, "f")) === null || _a === void 0 ? void 0 : _a.emit('getSignatureStart');
122
110
  const signature = yield __classPrivateFieldGet(this, _LedgerSigner_instances, "m", _LedgerSigner_retry).call(this, () => ledgerApp.signTransaction(__classPrivateFieldGet(this, _LedgerSigner_path, "f"), serializedUnsignedTransaction, resolution));
111
+ (_b = __classPrivateFieldGet(this, _LedgerSigner_emitter, "f")) === null || _b === void 0 ? void 0 : _b.emit('getSignatureEnd');
123
112
  return ethers_1.ethers.utils.serializeTransaction(unsignedTransaction, {
124
113
  v: ethers_1.ethers.BigNumber.from('0x' + signature.v).toNumber(),
125
114
  r: '0x' + signature.r,
@@ -128,6 +117,7 @@ class LedgerSigner extends ethers_1.Signer {
128
117
  });
129
118
  }
130
119
  _signTypedData(domain, types, value) {
120
+ var _a, _b;
131
121
  return __awaiter(this, void 0, void 0, function* () {
132
122
  const populated = yield ethers_1.ethers.utils._TypedDataEncoder.resolveNames(domain, types, value, (name) => __awaiter(this, void 0, void 0, function* () {
133
123
  if (!this.provider)
@@ -139,7 +129,9 @@ class LedgerSigner extends ethers_1.Signer {
139
129
  }));
140
130
  const payload = ethers_1.ethers.utils._TypedDataEncoder.getPayload(populated.domain, types, populated.value);
141
131
  const ledgerApp = new hw_app_eth_1.default(__classPrivateFieldGet(this, _LedgerSigner_transport, "f"));
132
+ (_a = __classPrivateFieldGet(this, _LedgerSigner_emitter, "f")) === null || _a === void 0 ? void 0 : _a.emit('getSignatureStart');
142
133
  const obj = yield __classPrivateFieldGet(this, _LedgerSigner_instances, "m", _LedgerSigner_retry).call(this, () => ledgerApp.signEIP712Message(__classPrivateFieldGet(this, _LedgerSigner_path, "f"), payload));
134
+ (_b = __classPrivateFieldGet(this, _LedgerSigner_emitter, "f")) === null || _b === void 0 ? void 0 : _b.emit('getSignatureEnd');
143
135
  // Normalize the signature for Ethers
144
136
  obj.r = '0x' + obj.r;
145
137
  obj.s = '0x' + obj.s;
@@ -148,7 +140,7 @@ class LedgerSigner extends ethers_1.Signer {
148
140
  }
149
141
  }
150
142
  exports.LedgerSigner = LedgerSigner;
151
- _LedgerSigner_transport = new WeakMap(), _LedgerSigner_path = new WeakMap(), _LedgerSigner_instances = new WeakSet(), _LedgerSigner_retry = function _LedgerSigner_retry(callback) {
143
+ _LedgerSigner_transport = new WeakMap(), _LedgerSigner_emitter = new WeakMap(), _LedgerSigner_path = new WeakMap(), _LedgerSigner_instances = new WeakSet(), _LedgerSigner_retry = function _LedgerSigner_retry(callback) {
152
144
  // eslint-disable-next-line no-async-promise-executor
153
145
  return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
154
146
  // Wait up to 5 seconds
@@ -167,3 +159,30 @@ _LedgerSigner_transport = new WeakMap(), _LedgerSigner_path = new WeakMap(), _Le
167
159
  return reject(new Error('timeout'));
168
160
  }));
169
161
  };
162
+ class LedgerServiceEthereum {
163
+ constructor(getLedgerTransport) {
164
+ this.getLedgerTransport = getLedgerTransport;
165
+ this.emitter = new events_1.default();
166
+ }
167
+ getAddress(transport) {
168
+ return __awaiter(this, void 0, void 0, function* () {
169
+ const signer = new LedgerSigner(transport);
170
+ return yield signer.getAddress();
171
+ });
172
+ }
173
+ getPublicKey(transport) {
174
+ return __awaiter(this, void 0, void 0, function* () {
175
+ const signer = new LedgerSigner(transport);
176
+ return yield signer.getPublicKey();
177
+ });
178
+ }
179
+ getSigner(transport) {
180
+ return new LedgerSigner(transport, undefined, this.emitter);
181
+ }
182
+ }
183
+ exports.LedgerServiceEthereum = LedgerServiceEthereum;
184
+ function wait(duration) {
185
+ return new Promise(resolve => {
186
+ setTimeout(resolve, duration);
187
+ });
188
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cityofzion/bs-ethereum",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "repository": "https://github.com/CityOfZion/blockchain-services",
@@ -23,7 +23,7 @@
23
23
  "@ledgerhq/hw-app-eth": "~6.35.7",
24
24
  "@ethersproject/abstract-signer": "~5.7.0",
25
25
  "@ethersproject/properties": "~5.7.0",
26
- "@cityofzion/blockchain-service": "0.11.2"
26
+ "@cityofzion/blockchain-service": "0.12.0"
27
27
  },
28
28
  "devDependencies": {
29
29
  "@types/jest": "29.5.3",