hodl-wallet 2.1.0 → 2.3.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/README.md +11 -11
- package/dist/app/account.d.ts +7 -0
- package/dist/app/account.js +248 -0
- package/dist/app/account.js.map +1 -0
- package/dist/app/format.d.ts +5 -0
- package/dist/app/format.js +33 -0
- package/dist/app/format.js.map +1 -0
- package/dist/app/history.d.ts +48 -0
- package/dist/app/history.js +115 -0
- package/dist/app/history.js.map +1 -0
- package/dist/app/index.d.ts +12 -0
- package/dist/app/index.js +9 -0
- package/dist/app/index.js.map +1 -0
- package/dist/app/menu.d.ts +13 -0
- package/dist/app/menu.js +93 -0
- package/dist/app/menu.js.map +1 -0
- package/dist/app/output.d.ts +17 -0
- package/dist/app/output.js +107 -0
- package/dist/app/output.js.map +1 -0
- package/dist/app/session.d.ts +125 -0
- package/dist/app/session.js +2 -0
- package/dist/app/session.js.map +1 -0
- package/dist/app/swap.d.ts +5 -0
- package/dist/app/swap.js +274 -0
- package/dist/app/swap.js.map +1 -0
- package/dist/app/transfer.d.ts +3 -0
- package/dist/app/transfer.js +144 -0
- package/dist/app/transfer.js.map +1 -0
- package/dist/app/ui.d.ts +73 -0
- package/dist/app/ui.js +15 -0
- package/dist/app/ui.js.map +1 -0
- package/dist/browser-core.d.ts +7 -1
- package/dist/browser-core.js +6 -1
- package/dist/browser-core.js.map +1 -1
- package/dist/config.d.ts +11 -0
- package/dist/config.js +12 -0
- package/dist/config.js.map +1 -0
- package/dist/hodl-file.d.ts +31 -0
- package/dist/hodl-file.js +78 -0
- package/dist/hodl-file.js.map +1 -0
- package/dist/index.js +24 -1096
- package/dist/index.js.map +1 -1
- package/dist/network/abis/erc20.d.ts +35 -13
- package/dist/network/abis/erc20.js +6 -26
- package/dist/network/abis/erc20.js.map +1 -1
- package/dist/network/arb.d.ts +5 -0
- package/dist/network/arb.js +5 -0
- package/dist/network/arb.js.map +1 -1
- package/dist/network/avax.d.ts +6 -0
- package/dist/network/avax.js +6 -0
- package/dist/network/avax.js.map +1 -1
- package/dist/network/bsc.d.ts +6 -0
- package/dist/network/bsc.js +6 -0
- package/dist/network/bsc.js.map +1 -1
- package/dist/network/eth.d.ts +6 -0
- package/dist/network/eth.js +6 -0
- package/dist/network/eth.js.map +1 -1
- package/dist/network/ftm.d.ts +6 -0
- package/dist/network/ftm.js +6 -0
- package/dist/network/ftm.js.map +1 -1
- package/dist/network/lib/BitcoinNetwork.d.ts +3 -1
- package/dist/network/lib/BitcoinNetwork.js +58 -13
- package/dist/network/lib/BitcoinNetwork.js.map +1 -1
- package/dist/network/lib/Web3Network.d.ts +10 -4
- package/dist/network/lib/Web3Network.js +141 -73
- package/dist/network/lib/Web3Network.js.map +1 -1
- package/dist/network/op.d.ts +5 -0
- package/dist/network/op.js +5 -0
- package/dist/network/op.js.map +1 -1
- package/dist/network/pol.d.ts +6 -0
- package/dist/network/pol.js +6 -0
- package/dist/network/pol.js.map +1 -1
- package/dist/network/types.d.ts +35 -0
- package/dist/network-registry.d.ts +6 -1
- package/dist/network-registry.js +28 -0
- package/dist/network-registry.js.map +1 -1
- package/dist/node-session.d.ts +53 -0
- package/dist/node-session.js +359 -0
- package/dist/node-session.js.map +1 -0
- package/dist/persist.d.ts +14 -7
- package/dist/persist.js +83 -108
- package/dist/persist.js.map +1 -1
- package/dist/request.d.ts +7 -0
- package/dist/request.js +26 -0
- package/dist/request.js.map +1 -0
- package/dist/swap/bitcoin.d.ts +1 -1
- package/dist/swap/bitcoin.js +7 -6
- package/dist/swap/bitcoin.js.map +1 -1
- package/dist/swap/chain.js +25 -40
- package/dist/swap/chain.js.map +1 -1
- package/dist/swap/config.d.ts +12 -0
- package/dist/swap/config.js +6 -0
- package/dist/swap/config.js.map +1 -1
- package/dist/swap/http.d.ts +2 -1
- package/dist/swap/http.js +8 -4
- package/dist/swap/http.js.map +1 -1
- package/dist/swap/providers.d.ts +15 -0
- package/dist/swap/providers.js +187 -1
- package/dist/swap/providers.js.map +1 -1
- package/dist/swap/routes.d.ts +28 -0
- package/dist/swap/routes.js +5 -3
- package/dist/swap/routes.js.map +1 -1
- package/dist/swap/service.d.ts +2 -1
- package/dist/swap/service.js +16 -5
- package/dist/swap/service.js.map +1 -1
- package/dist/swap/types.d.ts +3 -1
- package/dist/swap/types.js.map +1 -1
- package/dist/transfer-service.js +1 -2
- package/dist/transfer-service.js.map +1 -1
- package/dist/ui-inquirer.d.ts +37 -0
- package/dist/ui-inquirer.js +97 -0
- package/dist/ui-inquirer.js.map +1 -0
- package/dist/wallet-store.d.ts +2 -1
- package/package.json +17 -14
- package/dist/swap/ui.d.ts +0 -3
- package/dist/swap/ui.js +0 -257
- package/dist/swap/ui.js.map +0 -1
package/dist/persist.js
CHANGED
|
@@ -1,34 +1,55 @@
|
|
|
1
1
|
import Deepbase from 'deepbase';
|
|
2
|
+
import { encryptedDocument } from 'deepbase/plugins/encryption';
|
|
2
3
|
import crypto from 'node:crypto';
|
|
3
4
|
import fs from 'node:fs';
|
|
4
5
|
import path from 'node:path';
|
|
5
|
-
import {
|
|
6
|
+
import { HODL_FILE_IV_BYTES, HODL_FILE_KEY_BYTES, HODL_FILE_SALT_BYTES, HODL_FILE_SCRYPT, formatHodlFile, hodlFileHeader, isHodlFile, parseHodlFile, scryptMemory } from './hodl-file.js';
|
|
7
|
+
import { clearSensitiveData } from './sensitive-data.js';
|
|
6
8
|
const ALGORITHM = 'aes-256-gcm';
|
|
7
9
|
const KEY_LENGTH = 32;
|
|
8
|
-
const IV_LENGTH = 12;
|
|
9
|
-
const SALT_LENGTH = 16;
|
|
10
|
-
const SEALED_SECRET_VERSION = 1;
|
|
11
10
|
class Persist extends Deepbase {
|
|
12
11
|
encryptionKey;
|
|
13
|
-
|
|
12
|
+
legacy;
|
|
14
13
|
disposed = false;
|
|
15
14
|
storagePath;
|
|
16
15
|
constructor(opts) {
|
|
17
16
|
const encryptionKey = Buffer.from(opts.encryptionKey, 'utf8');
|
|
18
|
-
const
|
|
17
|
+
const legacy = {};
|
|
19
18
|
opts.encryptionKey = '';
|
|
20
19
|
super({
|
|
21
20
|
name: 'persist',
|
|
22
21
|
path: opts.path,
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
22
|
+
parse: (text) => {
|
|
23
|
+
if (!Persist.isLegacyProfile(text))
|
|
24
|
+
return JSON.parse(text);
|
|
25
|
+
legacy.profile = Persist.decryptProfile(text, encryptionKey);
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
27
28
|
});
|
|
29
|
+
this.use(encryptedDocument({ password: encryptionKey }));
|
|
28
30
|
this.encryptionKey = encryptionKey;
|
|
29
|
-
this.
|
|
31
|
+
this.legacy = legacy;
|
|
30
32
|
this.storagePath = opts.path;
|
|
31
33
|
}
|
|
34
|
+
/** Opens the profile, rejecting a wrong password, and rewrites one saved before the encrypted document format. */
|
|
35
|
+
async connect() {
|
|
36
|
+
const result = await super.connect();
|
|
37
|
+
const { profile } = this.legacy;
|
|
38
|
+
delete this.legacy.profile;
|
|
39
|
+
if (profile === undefined) {
|
|
40
|
+
clearSensitiveData(await this.get());
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
try {
|
|
44
|
+
await this.set(profile);
|
|
45
|
+
await this.flush();
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
clearSensitiveData(profile);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
32
53
|
async flush() {
|
|
33
54
|
const descriptor = fs.openSync(path.join(this.storagePath, 'persist.json'), 'r');
|
|
34
55
|
try {
|
|
@@ -46,6 +67,16 @@ class Persist extends Deepbase {
|
|
|
46
67
|
fs.closeSync(directory);
|
|
47
68
|
}
|
|
48
69
|
}
|
|
70
|
+
/** Whether the password is the one this profile is encrypted with. */
|
|
71
|
+
matchesPassword(password) {
|
|
72
|
+
const candidate = Buffer.from(password, 'utf8');
|
|
73
|
+
try {
|
|
74
|
+
return candidate.length === this.encryptionKey.length && crypto.timingSafeEqual(candidate, this.encryptionKey);
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
candidate.fill(0);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
49
80
|
async dispose() {
|
|
50
81
|
if (this.disposed) {
|
|
51
82
|
return;
|
|
@@ -55,58 +86,70 @@ class Persist extends Deepbase {
|
|
|
55
86
|
}
|
|
56
87
|
finally {
|
|
57
88
|
this.encryptionKey.fill(0);
|
|
58
|
-
this.memoryKey.fill(0);
|
|
59
89
|
this.disposed = true;
|
|
60
90
|
}
|
|
61
91
|
}
|
|
62
92
|
static clearSensitiveData(value) {
|
|
63
93
|
clearSensitiveData(value);
|
|
64
94
|
}
|
|
95
|
+
/** A .HODL file in the current format, v3. */
|
|
65
96
|
static encrypt(obj, encryptionKey) {
|
|
66
|
-
const salt = crypto.randomBytes(
|
|
67
|
-
const iv = crypto.randomBytes(
|
|
68
|
-
const
|
|
97
|
+
const salt = crypto.randomBytes(HODL_FILE_SALT_BYTES);
|
|
98
|
+
const iv = crypto.randomBytes(HODL_FILE_IV_BYTES);
|
|
99
|
+
const header = hodlFileHeader(salt);
|
|
100
|
+
const key = Persist.fileKey(encryptionKey, salt, HODL_FILE_SCRYPT);
|
|
69
101
|
let serialized;
|
|
70
102
|
try {
|
|
71
103
|
serialized = Buffer.from(JSON.stringify(obj), 'utf8');
|
|
72
104
|
const cipher = crypto.createCipheriv(ALGORITHM, key, iv);
|
|
105
|
+
cipher.setAAD(Buffer.from(header, 'utf8'));
|
|
73
106
|
const encrypted = Buffer.concat([
|
|
74
107
|
cipher.update(serialized),
|
|
75
108
|
cipher.final()
|
|
76
109
|
]);
|
|
77
|
-
|
|
78
|
-
return `v2:${salt.toString('hex')}:${iv.toString('hex')}:${authTag.toString('hex')}:${encrypted.toString('hex')}`;
|
|
110
|
+
return formatHodlFile(header, iv, cipher.getAuthTag(), encrypted);
|
|
79
111
|
}
|
|
80
112
|
finally {
|
|
81
113
|
key.fill(0);
|
|
82
114
|
serialized?.fill(0);
|
|
83
115
|
}
|
|
84
116
|
}
|
|
117
|
+
static isLegacyProfile(text) {
|
|
118
|
+
return /^v\d+:/.test(text);
|
|
119
|
+
}
|
|
120
|
+
/** Whether the text is a v2 or v3 .HODL file. */
|
|
121
|
+
static isCurrentFormat(encryptedData) {
|
|
122
|
+
return isHodlFile(encryptedData);
|
|
123
|
+
}
|
|
124
|
+
/** A v2 or v3 .HODL file. Profiles saved before v2 are read with decryptProfile. */
|
|
85
125
|
static decrypt(encryptedData, encryptionKey) {
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
104
|
-
finally {
|
|
105
|
-
key.fill(0);
|
|
106
|
-
decrypted?.fill(0);
|
|
107
|
-
}
|
|
126
|
+
const file = parseHodlFile(encryptedData);
|
|
127
|
+
const key = Persist.fileKey(encryptionKey, file.salt, file.cost);
|
|
128
|
+
let decrypted;
|
|
129
|
+
try {
|
|
130
|
+
const decipher = crypto.createDecipheriv(ALGORITHM, key, file.iv);
|
|
131
|
+
if (file.additionalData)
|
|
132
|
+
decipher.setAAD(file.additionalData);
|
|
133
|
+
decipher.setAuthTag(file.tag);
|
|
134
|
+
decrypted = Buffer.concat([
|
|
135
|
+
decipher.update(file.ciphertext),
|
|
136
|
+
decipher.final()
|
|
137
|
+
]);
|
|
138
|
+
return JSON.parse(decrypted.toString('utf8'));
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
key.fill(0);
|
|
142
|
+
decrypted?.fill(0);
|
|
108
143
|
}
|
|
109
|
-
|
|
144
|
+
}
|
|
145
|
+
static fileKey(encryptionKey, salt, cost) {
|
|
146
|
+
return crypto.scryptSync(encryptionKey, salt, HODL_FILE_KEY_BYTES, { ...cost, maxmem: scryptMemory(cost) });
|
|
147
|
+
}
|
|
148
|
+
/** A profile saved as a v2 or older string, before the encrypted document format. */
|
|
149
|
+
static decryptProfile(encryptedData, encryptionKey) {
|
|
150
|
+
return Persist.isCurrentFormat(encryptedData)
|
|
151
|
+
? Persist.decrypt(encryptedData, encryptionKey)
|
|
152
|
+
: Persist.decryptLegacy(encryptedData, encryptionKey);
|
|
110
153
|
}
|
|
111
154
|
static decryptLegacy(encryptedData, encryptionKey) {
|
|
112
155
|
const [, encrypted] = encryptedData.split(':');
|
|
@@ -150,74 +193,6 @@ class Persist extends Deepbase {
|
|
|
150
193
|
iv: derived.subarray(keyLen, keyLen + ivLen)
|
|
151
194
|
};
|
|
152
195
|
}
|
|
153
|
-
static transformSecrets(value, path, transform) {
|
|
154
|
-
if (Persist.isSensitivePath(path)) {
|
|
155
|
-
return transform(value);
|
|
156
|
-
}
|
|
157
|
-
if (Array.isArray(value)) {
|
|
158
|
-
return value.map((item, index) => Persist.transformSecrets(item, [...path, String(index)], transform));
|
|
159
|
-
}
|
|
160
|
-
if (Persist.isRecord(value)) {
|
|
161
|
-
return Object.fromEntries(Object.entries(value).map(([key, item]) => [
|
|
162
|
-
key,
|
|
163
|
-
Persist.transformSecrets(item, [...path, key], transform)
|
|
164
|
-
]));
|
|
165
|
-
}
|
|
166
|
-
return value;
|
|
167
|
-
}
|
|
168
|
-
static isSensitivePath(path) {
|
|
169
|
-
const field = path.at(-1);
|
|
170
|
-
return field !== undefined && isSensitiveField(field);
|
|
171
|
-
}
|
|
172
|
-
static isRecord(value) {
|
|
173
|
-
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
174
|
-
}
|
|
175
|
-
static isSealedSecret(value) {
|
|
176
|
-
if (!Persist.isRecord(value)) {
|
|
177
|
-
return false;
|
|
178
|
-
}
|
|
179
|
-
return (value.__hodlSealed === SEALED_SECRET_VERSION &&
|
|
180
|
-
typeof value.iv === 'string' &&
|
|
181
|
-
typeof value.authTag === 'string' &&
|
|
182
|
-
typeof value.ciphertext === 'string');
|
|
183
|
-
}
|
|
184
|
-
static sealSecret(secret, memoryKey) {
|
|
185
|
-
if (typeof secret !== 'string') {
|
|
186
|
-
throw new TypeError('Sensitive values must be strings before entering memory');
|
|
187
|
-
}
|
|
188
|
-
const iv = crypto.randomBytes(IV_LENGTH);
|
|
189
|
-
const cipher = crypto.createCipheriv(ALGORITHM, memoryKey, iv);
|
|
190
|
-
const plaintext = Buffer.from(secret, 'utf8');
|
|
191
|
-
try {
|
|
192
|
-
const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
193
|
-
return {
|
|
194
|
-
__hodlSealed: SEALED_SECRET_VERSION,
|
|
195
|
-
iv: iv.toString('hex'),
|
|
196
|
-
authTag: cipher.getAuthTag().toString('hex'),
|
|
197
|
-
ciphertext: ciphertext.toString('hex')
|
|
198
|
-
};
|
|
199
|
-
}
|
|
200
|
-
finally {
|
|
201
|
-
plaintext.fill(0);
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
static unsealSecret(secret, memoryKey) {
|
|
205
|
-
if (!Persist.isSealedSecret(secret)) {
|
|
206
|
-
throw new TypeError('Sensitive value is not sealed in memory');
|
|
207
|
-
}
|
|
208
|
-
const iv = Buffer.from(secret.iv, 'hex');
|
|
209
|
-
const authTag = Buffer.from(secret.authTag, 'hex');
|
|
210
|
-
const ciphertext = Buffer.from(secret.ciphertext, 'hex');
|
|
211
|
-
const decipher = crypto.createDecipheriv(ALGORITHM, memoryKey, iv);
|
|
212
|
-
decipher.setAuthTag(authTag);
|
|
213
|
-
const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
|
|
214
|
-
try {
|
|
215
|
-
return plaintext.toString('utf8');
|
|
216
|
-
}
|
|
217
|
-
finally {
|
|
218
|
-
plaintext.fill(0);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
196
|
}
|
|
222
197
|
export default Persist;
|
|
223
198
|
//# sourceMappingURL=persist.js.map
|
package/dist/persist.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persist.js","sourceRoot":"","sources":["../persist.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"persist.js","sourceRoot":"","sources":["../persist.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** A request that got no HTTP response: the host was unreachable, refused it, or did not answer in time. */
|
|
2
|
+
export declare class NetworkError extends Error {
|
|
3
|
+
}
|
|
4
|
+
/** fetch, naming the host when no response arrives; fetch reports that as a bare TypeError. */
|
|
5
|
+
export declare function request(input: string | URL | Request, init?: RequestInit): Promise<Response>;
|
|
6
|
+
/** What to show for an error: a network failure among its causes outranks the wrappers that describe the request. */
|
|
7
|
+
export declare function errorMessage(error: unknown): string;
|
package/dist/request.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** A request that got no HTTP response: the host was unreachable, refused it, or did not answer in time. */
|
|
2
|
+
export class NetworkError extends Error {
|
|
3
|
+
}
|
|
4
|
+
/** fetch, naming the host when no response arrives; fetch reports that as a bare TypeError. */
|
|
5
|
+
export async function request(input, init) {
|
|
6
|
+
try {
|
|
7
|
+
return await fetch(input, init);
|
|
8
|
+
}
|
|
9
|
+
catch (error) {
|
|
10
|
+
const host = new URL(input instanceof Request ? input.url : input).host;
|
|
11
|
+
if (error instanceof Error && error.name === 'TimeoutError')
|
|
12
|
+
throw new NetworkError(`${host} did not respond in time.`, { cause: error });
|
|
13
|
+
if (error instanceof TypeError)
|
|
14
|
+
throw new NetworkError(`Could not reach ${host}.`, { cause: error });
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** What to show for an error: a network failure among its causes outranks the wrappers that describe the request. */
|
|
19
|
+
export function errorMessage(error) {
|
|
20
|
+
for (let cause = error; cause instanceof Error; cause = cause.cause) {
|
|
21
|
+
if (cause instanceof NetworkError)
|
|
22
|
+
return cause.message;
|
|
23
|
+
}
|
|
24
|
+
return error instanceof Error ? error.message : String(error);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request.js","sourceRoot":"","sources":["../request.ts"],"names":[],"mappings":"AAAA,4GAA4G;AAC5G,MAAM,OAAO,YAAa,SAAQ,KAAK;CAAG;AAE1C,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAA6B,EAAE,IAAkB;IAC3E,IAAI,CAAC;QACD,OAAO,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC;QACxE,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc;YAAE,MAAM,IAAI,YAAY,CAAC,GAAG,IAAI,2BAA2B,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC1I,IAAI,KAAK,YAAY,SAAS;YAAE,MAAM,IAAI,YAAY,CAAC,mBAAmB,IAAI,GAAG,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACrG,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC;AAED,qHAAqH;AACrH,MAAM,UAAU,YAAY,CAAC,KAAc;IACvC,KAAK,IAAI,KAAK,GAAG,KAAK,EAAE,KAAK,YAAY,KAAK,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAClE,IAAI,KAAK,YAAY,YAAY;YAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IAC5D,CAAC;IACD,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClE,CAAC"}
|
package/dist/swap/bitcoin.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { WalletAccount } from '../network/types.js';
|
|
|
2
2
|
import { BitcoinPayments } from './chain.js';
|
|
3
3
|
import type { ChainReceipt, FundingEstimate, ProviderQuote, SwapChain, SwapInput, SwapPlan, SwapQuote, SwapStep } from './types.js';
|
|
4
4
|
type Output = {
|
|
5
|
-
script:
|
|
5
|
+
script: Uint8Array;
|
|
6
6
|
value: number;
|
|
7
7
|
};
|
|
8
8
|
export declare function bitcoinMemoOutputs(memo?: string): Output[];
|
package/dist/swap/bitcoin.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as bitcoin from 'bitcoinjs-lib';
|
|
2
2
|
import BitcoinNetwork, { signBitcoinTransaction } from '../network/lib/BitcoinNetwork.js';
|
|
3
|
+
import { request } from '../request.js';
|
|
3
4
|
import { BscPayments, BitcoinPayments } from './chain.js';
|
|
4
5
|
import { swapConfig as config } from './config.js';
|
|
5
6
|
import { integer, list, record, swapJson, swapText, SwapHttpError, textField, transactionHash, units } from './http.js';
|
|
@@ -79,7 +80,7 @@ export class BitcoinSwapChain extends BitcoinPayments {
|
|
|
79
80
|
};
|
|
80
81
|
}
|
|
81
82
|
async assertAvailable(address) {
|
|
82
|
-
const script = bitcoin.address.toOutputScript(address).toString('hex');
|
|
83
|
+
const script = Buffer.from(bitcoin.address.toOutputScript(address)).toString('hex');
|
|
83
84
|
const pending = list(await swapJson(`${config.destination.url}/address/${address}/txs/mempool`)).map(record);
|
|
84
85
|
if (pending.some(tx => list(tx.vin).some(input => record(record(input).prevout).scriptpubkey === script))) {
|
|
85
86
|
throw new Error('An outgoing Bitcoin transaction is still pending.');
|
|
@@ -121,7 +122,7 @@ export class BitcoinSwapChain extends BitcoinPayments {
|
|
|
121
122
|
const raw = await swapText(`${config.destination.url}/tx/${input.txid}/hex`);
|
|
122
123
|
const parent = bitcoin.Transaction.fromHex(raw.trim());
|
|
123
124
|
const output = parent.outs[input.vout];
|
|
124
|
-
if (parent.getId() !== input.txid || !output || output.value !== input.value || !output.script.equals(script)) {
|
|
125
|
+
if (parent.getId() !== input.txid || !output || output.value !== BigInt(input.value) || !Buffer.from(output.script).equals(Buffer.from(script))) {
|
|
125
126
|
throw new Error('Bitcoin funding input does not match the source wallet.');
|
|
126
127
|
}
|
|
127
128
|
if (quote.provider === 'thorchain' && parent.outs.length > config.bitcoin.maxOutputs) {
|
|
@@ -137,10 +138,10 @@ export class BitcoinSwapChain extends BitcoinPayments {
|
|
|
137
138
|
}
|
|
138
139
|
const memo = bitcoinMemoOutputs(quote.provider === 'thorchain' ? textField(plan.memo) : undefined);
|
|
139
140
|
const memoCost = memo.reduce((sum, output) => sum + BigInt(output.value), 0n);
|
|
140
|
-
psbt.addOutput({ address: plan.depositAddress, value:
|
|
141
|
-
psbt.addOutput({ address: quote.from, value:
|
|
141
|
+
psbt.addOutput({ address: plan.depositAddress, value: amount });
|
|
142
|
+
psbt.addOutput({ address: quote.from, value: change });
|
|
142
143
|
for (const output of memo)
|
|
143
|
-
psbt.addOutput(output);
|
|
144
|
+
psbt.addOutput({ script: output.script, value: BigInt(output.value) });
|
|
144
145
|
signBitcoinTransaction(psbt, account.privateKey, bitcoin.networks.bitcoin);
|
|
145
146
|
const transaction = psbt.extractTransaction();
|
|
146
147
|
const minerFee = BigInt(quote.funding.budgetBaseUnits) - memoCost;
|
|
@@ -150,7 +151,7 @@ export class BitcoinSwapChain extends BitcoinPayments {
|
|
|
150
151
|
return { kind, hash: transaction.getId(), rawTransaction: transaction.toHex(), confirmed: false, broadcastAttempted: false };
|
|
151
152
|
}
|
|
152
153
|
async broadcast(step) {
|
|
153
|
-
const response = await
|
|
154
|
+
const response = await request(`${config.destination.url}/tx`, {
|
|
154
155
|
method: 'POST', headers: { 'content-type': 'text/plain' }, body: step.rawTransaction,
|
|
155
156
|
signal: AbortSignal.timeout(config.httpTimeoutMs), redirect: 'error'
|
|
156
157
|
});
|
package/dist/swap/bitcoin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bitcoin.js","sourceRoot":"","sources":["../../swap/bitcoin.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bitcoin.js","sourceRoot":"","sources":["../../swap/bitcoin.ts"],"names":[],"mappings":"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"}
|
package/dist/swap/chain.js
CHANGED
|
@@ -1,28 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { encodeFunctionData, keccak256, parseAbi, toBytes } from 'viem';
|
|
2
|
+
import { privateKeyToAccount } from 'viem/accounts';
|
|
2
3
|
import * as bitcoin from 'bitcoinjs-lib';
|
|
3
4
|
import { swapConfig as config } from './config.js';
|
|
4
5
|
import { evmAddress, integer, list, record, swapJson, swapText, textField, transactionHash } from './http.js';
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
name: 'allowance', type: 'function',
|
|
12
|
-
inputs: [{ name: 'owner', type: 'address' }, { name: 'spender', type: 'address' }]
|
|
13
|
-
};
|
|
14
|
-
const transferAbi = {
|
|
15
|
-
name: 'transfer', type: 'function',
|
|
16
|
-
inputs: [{ name: 'to', type: 'address' }, { name: 'amount', type: 'uint256' }]
|
|
17
|
-
};
|
|
18
|
-
const depositAbi = {
|
|
19
|
-
name: 'depositWithExpiry', type: 'function',
|
|
20
|
-
inputs: [
|
|
21
|
-
{ name: 'vault', type: 'address' }, { name: 'asset', type: 'address' },
|
|
22
|
-
{ name: 'amount', type: 'uint256' }, { name: 'memo', type: 'string' },
|
|
23
|
-
{ name: 'expiry', type: 'uint256' }
|
|
24
|
-
]
|
|
25
|
-
};
|
|
6
|
+
const abi = parseAbi([
|
|
7
|
+
'function approve(address spender, uint256 amount)',
|
|
8
|
+
'function allowance(address owner, address spender)',
|
|
9
|
+
'function transfer(address to, uint256 amount)',
|
|
10
|
+
'function depositWithExpiry(address vault, address asset, uint256 amount, string memo, uint256 expiry)'
|
|
11
|
+
]);
|
|
26
12
|
function hex(value) {
|
|
27
13
|
if (typeof value !== 'string' || !/^0x[\da-f]+$/i.test(value))
|
|
28
14
|
throw new Error('Invalid RPC number.');
|
|
@@ -80,7 +66,7 @@ export class BscPayments {
|
|
|
80
66
|
return { amount: 0n, confirmations: 0 };
|
|
81
67
|
if (hex(receipt.status) !== 1n)
|
|
82
68
|
throw new Error('Refund transaction reverted.');
|
|
83
|
-
const transferTopic =
|
|
69
|
+
const transferTopic = keccak256(toBytes('Transfer(address,address,uint256)'));
|
|
84
70
|
const recipient = `0x${evmAddress(address).slice(2).toLowerCase().padStart(64, '0')}`;
|
|
85
71
|
let amount = 0n;
|
|
86
72
|
for (const value of list(receipt.logs)) {
|
|
@@ -101,7 +87,7 @@ export class BitcoinPayments {
|
|
|
101
87
|
const tx = record(await swapJson(`${config.destination.url}/tx/${id}`));
|
|
102
88
|
if (transactionHash(tx.txid) !== id)
|
|
103
89
|
throw new Error('Bitcoin transaction hash mismatch.');
|
|
104
|
-
const script = bitcoin.address.toOutputScript(address, bitcoin.networks.bitcoin).toString('hex');
|
|
90
|
+
const script = Buffer.from(bitcoin.address.toOutputScript(address, bitcoin.networks.bitcoin)).toString('hex');
|
|
105
91
|
let sats = 0n;
|
|
106
92
|
for (const entry of list(tx.vout)) {
|
|
107
93
|
const output = record(entry);
|
|
@@ -147,7 +133,7 @@ export class BscSwapChain extends BscPayments {
|
|
|
147
133
|
}
|
|
148
134
|
async allowance(address, router) {
|
|
149
135
|
await this.assertChain();
|
|
150
|
-
const data =
|
|
136
|
+
const data = encodeFunctionData({ abi, functionName: 'allowance', args: [evmAddress(address), evmAddress(router)] });
|
|
151
137
|
return hex(await this.rpc('eth_call', [{ to: config.token, data }, 'latest']));
|
|
152
138
|
}
|
|
153
139
|
async assertNonceAvailable(address) {
|
|
@@ -160,7 +146,8 @@ export class BscSwapChain extends BscPayments {
|
|
|
160
146
|
}
|
|
161
147
|
async sign(quote, plan, kind, account) {
|
|
162
148
|
await this.assertChain();
|
|
163
|
-
|
|
149
|
+
const signer = privateKeyToAccount(account.privateKey);
|
|
150
|
+
if (signer.address.toLowerCase() !== quote.from.toLowerCase()) {
|
|
164
151
|
throw new Error('Swap signer does not match source account.');
|
|
165
152
|
}
|
|
166
153
|
await this.assertNonceAvailable(quote.from);
|
|
@@ -170,19 +157,19 @@ export class BscSwapChain extends BscPayments {
|
|
|
170
157
|
if (kind !== 'deposit') {
|
|
171
158
|
if (quote.provider !== 'thorchain' || plan.router !== config.thorchain.router)
|
|
172
159
|
throw new Error('Invalid approval router.');
|
|
173
|
-
data =
|
|
160
|
+
data = encodeFunctionData({ abi, functionName: 'approve', args: [plan.router, kind === 'approve' ? BigInt(quote.amountBaseUnits) : 0n] });
|
|
174
161
|
}
|
|
175
|
-
else if (quote.provider
|
|
176
|
-
data =
|
|
162
|
+
else if (quote.provider !== 'thorchain') {
|
|
163
|
+
data = encodeFunctionData({ abi, functionName: 'transfer', args: [evmAddress(plan.depositAddress), BigInt(quote.amountBaseUnits)] });
|
|
177
164
|
limit = config.gas.transfer;
|
|
178
165
|
}
|
|
179
166
|
else {
|
|
180
167
|
if (plan.router !== config.thorchain.router || !plan.memo || !plan.expirySeconds)
|
|
181
168
|
throw new Error('Invalid THORChain deposit.');
|
|
182
169
|
to = plan.router;
|
|
183
|
-
data =
|
|
184
|
-
|
|
185
|
-
|
|
170
|
+
data = encodeFunctionData({ abi, functionName: 'depositWithExpiry', args: [
|
|
171
|
+
evmAddress(plan.depositAddress), config.token, BigInt(quote.amountBaseUnits), plan.memo, BigInt(plan.expirySeconds)
|
|
172
|
+
] });
|
|
186
173
|
limit = config.gas.deposit;
|
|
187
174
|
}
|
|
188
175
|
const nonce = hex(await this.rpc('eth_getTransactionCount', [quote.from, 'pending']));
|
|
@@ -191,14 +178,12 @@ export class BscSwapChain extends BscPayments {
|
|
|
191
178
|
const estimate = hex(await this.rpc('eth_estimateGas', [request]));
|
|
192
179
|
if (estimate > BigInt(limit))
|
|
193
180
|
throw new Error('Gas exceeds the accepted budget; obtain a new quote.');
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
}
|
|
197
|
-
if (!signed.rawTransaction)
|
|
198
|
-
throw new Error('Could not sign swap transaction.');
|
|
181
|
+
const rawTransaction = await signer.signTransaction({
|
|
182
|
+
to, data, value: 0n, nonce: Number(nonce), gas: BigInt(limit), gasPrice, chainId: config.source.chainId, type: 'legacy'
|
|
183
|
+
});
|
|
199
184
|
return {
|
|
200
|
-
kind, nonce: nonce.toString(), rawTransaction
|
|
201
|
-
hash: transactionHash(
|
|
185
|
+
kind, nonce: nonce.toString(), rawTransaction,
|
|
186
|
+
hash: transactionHash(keccak256(rawTransaction), true), confirmed: false, broadcastAttempted: false
|
|
202
187
|
};
|
|
203
188
|
}
|
|
204
189
|
async broadcast(step) {
|
|
@@ -244,7 +229,7 @@ export class BscSwapChain extends BscPayments {
|
|
|
244
229
|
kind = allowance > 0n ? 'reset_approval' : 'approve';
|
|
245
230
|
}
|
|
246
231
|
const spent = steps.reduce((sum, step) => sum + (step.kind === 'deposit' ? config.gas.deposit : config.gas.approval), 0);
|
|
247
|
-
const next = kind === 'deposit' ? (quote.provider === '
|
|
232
|
+
const next = kind === 'deposit' ? (quote.provider === 'thorchain' ? config.gas.deposit : config.gas.transfer) : config.gas.approval;
|
|
248
233
|
if (spent + next > quote.funding.units)
|
|
249
234
|
throw new Error('Funding requirements exceed the accepted gas budget.');
|
|
250
235
|
return kind;
|