Aegis 0.32.2: no transaction is marked replaceable

Start of the next batch; 0.32.1 is published.

Bitcoin inputs were given the BIP125 sequence that opts in to
replace-by-fee. Aegis does not replace transactions on any chain and has
no way to bump one, so advertising a payment as replaceable only told the
recipient to distrust it until confirmed. Inputs are final again.
This commit is contained in:
Local Dev 2026-10-05 22:54:25 +02:00
parent a1eceb444a
commit bf92548267
3 changed files with 6 additions and 6 deletions

View file

@ -1,7 +1,7 @@
{ {
"id": "aegis", "id": "aegis",
"name": "Aegis Wallet", "name": "Aegis Wallet",
"version": "0.32.1", "version": "0.32.2",
"category": "plugin", "category": "plugin",
"description": "Multi-chain wallet (BCH, BTC, TRX, ETH, SOL, SC, DGB) derived from your Theseus vault. Dapps get window.bitcoincash and window.wizardconnect on any site; window.tronWeb / window.tronLink / window.ethereum / window.solana too. Every call needs your approval.", "description": "Multi-chain wallet (BCH, BTC, TRX, ETH, SOL, SC, DGB) derived from your Theseus vault. Dapps get window.bitcoincash and window.wizardconnect on any site; window.tronWeb / window.tronLink / window.ethereum / window.solana too. Every call needs your approval.",
"author": "Silent Mode", "author": "Silent Mode",

View file

@ -193,7 +193,6 @@ module.exports = function makeBtcAdapter({
// number of vbytes, and paying for 152.5 of 153 lands under the rate. // number of vbytes, and paying for 152.5 of 153 lands under the rate.
Math.ceil(Math.ceil(OVERHEAD_VB + nIn * (INPUT_VB[kind] || 68) + outScripts.reduce((a, s) => a + 9 + s.length, 0)) * feePerVb); Math.ceil(Math.ceil(OVERHEAD_VB + nIn * (INPUT_VB[kind] || 68) + outScripts.reduce((a, s) => a + 9 + s.length, 0)) * feePerVb);
const DEFAULT_RATE = 5; // sat/vB when the server has no estimate const DEFAULT_RATE = 5; // sat/vB when the server has no estimate
const RBF_SEQUENCE = 0xfffffffd; // BIP125: opt in to replace-by-fee
class BtcWallet { class BtcWallet {
constructor(root32, networkId, { constructor(root32, networkId, {
@ -460,9 +459,10 @@ module.exports = function makeBtcAdapter({
const prevHex = await verifyFunding({ chosen: plan._chosen, client: this._client, Transaction: bitcoinjs.Transaction }); const prevHex = await verifyFunding({ chosen: plan._chosen, client: this._client, Transaction: bitcoinjs.Transaction });
const psbt = new Psbt({ network: this._bjsNet }); const psbt = new Psbt({ network: this._bjsNet });
for (const u of plan._chosen) { for (const u of plan._chosen) {
// Signal replace-by-fee, so a payment sent at too low a rate can be // Final sequence on every input: Aegis does not do replace-by-fee on
// re-issued at a higher one instead of sitting unconfirmed for days. // any chain, so it must not advertise a transaction as replaceable
const inp = { hash: u.txid, index: u.vout, sequence: RBF_SEQUENCE }; // (a recipient would then be right to distrust it until confirmed).
const inp = { hash: u.txid, index: u.vout, sequence: 0xffffffff };
const fam = u.entry.family; const fam = u.entry.family;
if (fam === "bip44") { if (fam === "bip44") {
inp.nonWitnessUtxo = Buffer.from(prevHex.get(u.txid), "hex"); inp.nonWitnessUtxo = Buffer.from(prevHex.get(u.txid), "hex");

View file

@ -365,7 +365,7 @@ module.exports = function makeDgbAdapter({
// ---- plan + sign (via @dgb-wallet/psbt) ----------------------------- // ---- plan + sign (via @dgb-wallet/psbt) -----------------------------
// sat/vB from the Electrum server, never below the 20 this wallet has // sat/vB from the Electrum server, never below the 20 this wallet has
// always paid (DigiByte's relay floor is far above Bitcoin's, and there // always paid (DigiByte's relay floor is far above Bitcoin's, and there
// is no replace-by-fee on DGB to rescue an underpaid transaction). // is nothing to rescue an underpaid transaction: Aegis never replaces one).
async _estimateRate() { async _estimateRate() {
if (this._feeEst && Date.now() - this._feeEstAt < 60_000) return this._feeEst; if (this._feeEst && Date.now() - this._feeEstAt < 60_000) return this._feeEst;
try { try {