Aegis now shares its DGB code with the standalone DigiByte web-wallet at
D:\Dev\SilentCode\Digibyte. Address derivation and PSBT construction come
from that project's @dgb-wallet/core and @dgb-wallet/psbt packages instead
of Aegis-local reimplementations. Any bugfix upstream flows in via a
re-vendor of dist/*.
- lib/dgb/{core,psbt}/ — vendored dist/ output of the two packages plus
a tiny package.json shim marking them as ESM. @dgb-wallet/core's own
import specifier "@dgb-wallet/core" inside psbt/*.js is rewritten to
"../core/index.js" so the sibling module resolves without a workspace.
- New Theseus deps: bitcoinjs-lib, bip32, bip39, @bitcoinerlab/secp256k1,
ecpair — the peer deps the vendored packages need. Loaded via
api.require in index.js's loadDeps().
- chain-dgb.js is a thin adapter now: BIP32 tree via bip32 + DGB
Network object, addresses via core.p2wpkhAddress, tx via
psbt.buildPsbt + PSBT.signInput (per-input, since each UTXO's key
differs) + psbt.finalizeAndExtract. Runtime backend stays the same —
Theseus's lib/electrum.js against the DGB ElectrumX pool.
- Verified end-to-end in scratchpad: abandon×11 mnemonic derives
dgb1q9gmf0pv8jdymcly6lz6fl7lf6mhslsd72e2jq8 (matches iancoleman.io/bip39
and the previous inline implementation, so no on-chain address change
for anyone who was already using Aegis's DGB slot). PSBT build+sign+
finalize on a mock UTXO produces a valid 223-byte witness tx.
BIP44 (D…) and BIP49 (S…) address families are implemented in the
vendored core but not yet exposed in Aegis's picker — the panel needs
an "address family" selector inside the DGB settings block first. Left
for a follow-up; today's DGB pick uses BIP84 native SegWit only.
72 lines
No EOL
3.3 KiB
JavaScript
72 lines
No EOL
3.3 KiB
JavaScript
import { ECPairFactory } from 'ecpair';
|
|
import * as ecc from '@bitcoinerlab/secp256k1';
|
|
import { payments, initEccLib } from 'bitcoinjs-lib';
|
|
import { digibyte, digibyteLegacyP2SH, digibyteLegacyWIF } from './network.js';
|
|
const ECPair = ECPairFactory(ecc);
|
|
initEccLib(ecc);
|
|
// Import a DigiByte private key in WIF (Wallet Import Format).
|
|
// Tries the modern 0x80 prefix first, falls back to the legacy 0x9e
|
|
// prefix that older DGB tools produced. Rejects anything else with a
|
|
// clear message that identifies the network mismatch.
|
|
export function importWif(wif) {
|
|
const trimmed = wif.trim();
|
|
try {
|
|
return { keyPair: ECPair.fromWIF(trimmed, digibyte), variant: 'modern' };
|
|
}
|
|
catch {
|
|
// fall through to legacy attempt
|
|
}
|
|
try {
|
|
return { keyPair: ECPair.fromWIF(trimmed, digibyteLegacyWIF), variant: 'legacy' };
|
|
}
|
|
catch (e) {
|
|
throw new Error(`Not a valid DigiByte WIF (tried both current 0x80 and legacy 0x9e prefixes). ` +
|
|
`Underlying error: ${e.message}. Check the key is for DGB mainnet, not testnet or another chain.`);
|
|
}
|
|
}
|
|
// Import against a specific network only (advanced / testing).
|
|
export function importWifStrict(wif, network = digibyte) {
|
|
return ECPair.fromWIF(wif.trim(), network);
|
|
}
|
|
export function exportWif(keyPair) {
|
|
return keyPair.toWIF();
|
|
}
|
|
export function addressesForPubkey(pubkey, network = digibyte) {
|
|
const p2pkh = payments.p2pkh({ pubkey, network });
|
|
const wpkhRedeem = payments.p2wpkh({ pubkey, network });
|
|
// bitcoinjs-lib enforces `redeem.network === outerNetwork` (identity
|
|
// comparison, not shape). To render the legacy 3-prefix P2SH address
|
|
// we need a fresh redeem whose .network property is the legacy variant
|
|
// — same bytes on the wire, different object identity.
|
|
const wpkhRedeemLegacy = payments.p2wpkh({ pubkey, network: digibyteLegacyP2SH });
|
|
const p2shModern = payments.p2sh({ redeem: wpkhRedeem, network });
|
|
const p2shLegacy = payments.p2sh({ redeem: wpkhRedeemLegacy, network: digibyteLegacyP2SH });
|
|
const p2wpkh = payments.p2wpkh({ pubkey, network });
|
|
const p2tr = payments.p2tr({ internalPubkey: pubkey.subarray(1, 33), network });
|
|
if (!p2pkh.address || !p2shModern.address || !p2shLegacy.address || !p2wpkh.address || !p2tr.address) {
|
|
throw new Error('bitcoinjs-lib returned an empty address for one of the payment types');
|
|
}
|
|
if (!p2pkh.output || !p2shModern.output || !p2wpkh.output || !p2tr.output) {
|
|
throw new Error('bitcoinjs-lib returned an empty scriptPubKey for one of the payment types');
|
|
}
|
|
return {
|
|
p2pkh: p2pkh.address,
|
|
p2shP2wpkhModern: p2shModern.address,
|
|
p2shP2wpkhLegacy: p2shLegacy.address,
|
|
p2wpkh: p2wpkh.address,
|
|
p2tr: p2tr.address,
|
|
scripts: {
|
|
p2pkh: Buffer.from(p2pkh.output).toString('hex'),
|
|
p2shP2wpkh: Buffer.from(p2shModern.output).toString('hex'),
|
|
p2wpkh: Buffer.from(p2wpkh.output).toString('hex'),
|
|
p2tr: Buffer.from(p2tr.output).toString('hex'),
|
|
},
|
|
};
|
|
}
|
|
export function importWifWithAddresses(wif) {
|
|
const imported = importWif(wif);
|
|
const pubkey = Buffer.from(imported.keyPair.publicKey);
|
|
const addrs = addressesForPubkey(pubkey);
|
|
return { ...imported, ...addrs };
|
|
}
|
|
//# sourceMappingURL=wif.js.map
|