@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
|
|
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.
|
|
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
|
-
|
|
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
|
+
"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.
|
|
26
|
+
"@cityofzion/blockchain-service": "0.12.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@types/jest": "29.5.3",
|