-
Notifications
You must be signed in to change notification settings - Fork 302
Expand file tree
/
Copy pathassertDescriptorWalletAddress.ts
More file actions
40 lines (36 loc) · 1.62 KB
/
assertDescriptorWalletAddress.ts
File metadata and controls
40 lines (36 loc) · 1.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import assert from 'assert';
import { Descriptor, address, descriptorWallet } from '@bitgo/wasm-utxo';
import { UtxoCoinSpecific, VerifyAddressOptions } from '../abstractUtxoCoin.js';
import { UtxoCoinName } from '../names.js';
class DescriptorAddressMismatchError extends Error {
constructor(descriptor: Descriptor, index: number, derivedAddress: string, expectedAddress: string) {
super(
`Address mismatch for descriptor ${descriptor.toString()} at index ${index}: ${derivedAddress} !== ${expectedAddress}`
);
}
}
export function assertDescriptorWalletAddress(
coinName: UtxoCoinName,
params: VerifyAddressOptions<UtxoCoinSpecific>,
descriptors: descriptorWallet.DescriptorMap
): void {
assert(params.coinSpecific);
assert('descriptorName' in params.coinSpecific);
assert('descriptorChecksum' in params.coinSpecific);
const { descriptorName, descriptorChecksum } = params.coinSpecific;
const descriptor = descriptors.get(params.coinSpecific.descriptorName);
if (!descriptor) {
throw new Error(`Descriptor ${descriptorName} not found`);
}
const checksum = descriptor.toString().slice(-8);
if (checksum !== descriptorChecksum) {
throw new Error(
`Descriptor checksum mismatch for descriptor name=${descriptorName}: ${checksum} !== ${descriptorChecksum}`
);
}
const derivedScript = Buffer.from(descriptor.atDerivationIndex(params.index).scriptPubkey());
const derivedAddress = address.fromOutputScriptWithCoin(derivedScript, coinName);
if (params.address !== derivedAddress) {
throw new DescriptorAddressMismatchError(descriptor, params.index, derivedAddress, params.address);
}
}