Compare commits

...

22 Commits

Author SHA1 Message Date
fanquake
dd314fe0c2 Merge bitcoin/bitcoin#26503: [24.x] bump version to v24.0
0ee1cfe94a doc: add 24.0 release notes (fanquake)
7b9d904c68 doc: Generate manual pages for 24.0 final (fanquake)
7c8e5e69d9 build: Bump version to 24.0 final (fanquake)

Pull request description:

  Bump version to v24.0.
  Regenerate manpages.
  Pull in the release notes from [the devwiki](https://github.com/bitcoin-core/bitcoin-devwiki/wiki/24.0-Release-Notes-draft):
  - I've added the credits section; please comment if a name is missing / needs amending.
  - I've dropped any content-less sections.
  - If there are items that should be in the release notes, and are still missing, please comment.

ACKs for top commit:
  0xB10C:
    ACK 0ee1cfe94a

Tree-SHA512: b2e9477f515709faf3991a5b4aa4b300cb24178e282bf544e0b86a2cb18e8d79f5f42e65addbf90d74862b816d333735c2793f1bcb50e1b0ed0974ea5821f909
2022-11-17 11:48:01 +00:00
fanquake
0ee1cfe94a doc: add 24.0 release notes 2022-11-17 10:04:07 +00:00
fanquake
7b9d904c68 doc: Generate manual pages for 24.0 final 2022-11-15 10:03:33 +00:00
fanquake
7c8e5e69d9 build: Bump version to 24.0 final 2022-11-15 09:56:30 +00:00
MacroFake
dce93b2dd7 Merge bitcoin/bitcoin#26475: [24.x] Bump version to 24.0rc4
da1e753eeb doc: Generate manual pages for 24.0rc4 (fanquake)
1e4db14df9 build: Bump version to 24.0rc4 (fanquake)

Pull request description:

  Bump version.
  Regen manpages.
  Hopefully the final rc given no further bugs / major issues.

ACKs for top commit:
  dergoegge:
    ACK da1e753eeb
  hebasto:
    ACK da1e753eeb

Tree-SHA512: aa1e6c44f0d0acdc7348587fc085540e6ea87e09fe9ec5f5856a572f9bbb9ec89c1e16a8c767e26168b32802735108021dd08da3a21d7238296fd7e9c3377d30
2022-11-09 15:32:43 +01:00
MacroFake
4cc994e9d6 Merge bitcoin/bitcoin#26476: qt: 24.0rc4 translations update
7948fdd060 qt: 24.0rc4 translations update (Hennadii Stepanov)

Pull request description:

  This PR pulls the recent translations from the [Transifex.com](https://www.transifex.com/bitcoin/bitcoin) using the [`bitcoin-maintainer-tools/update-translations.py`](https://github.com/bitcoin-core/bitcoin-maintainer-tools/blob/main/update-translations.py) tool.

  According to our [Release Process docs](https://github.com/bitcoin/bitcoin/blob/master/doc/release-process.md#before-every-release-candidate), it is supposed to be merged (just) before `v24.0rc4` tagging.

  Will keep this PR updated regularly until merging.

Top commit has no ACKs.

Tree-SHA512: 600e07bbd48116726899b60086acf1e507722bf7458c78f812e13110e58f67cefc6dd8833fcfeb649b40285b706ab89c2ee88a7ac9f6aeb4fc935e47c33f6bdc
2022-11-09 15:31:30 +01:00
Hennadii Stepanov
7948fdd060 qt: 24.0rc4 translations update 2022-11-09 11:22:59 +00:00
fanquake
da1e753eeb doc: Generate manual pages for 24.0rc4 2022-11-09 10:33:44 +00:00
fanquake
1e4db14df9 build: Bump version to 24.0rc4 2022-11-09 10:30:40 +00:00
fanquake
2a5d9818ed Merge bitcoin/bitcoin#26452: [24.x] rc4 backports
42c74a0a4c rpc: doc: add missing option "bech32m" for `change_type` parameters (Sebastian Falbesoner)
6e4d87e696 tests: Test Taproot PSBT signing with keys in other descriptor (Andrew Chow)
0a5ea2aa84 tests: Use new wallets for each test in wallet_taproot.py (Andrew Chow)
2159676b6e psbt: Include output pubkey in additional pubkeys to sign (Andrew Chow)
754eefd21c sign: Fill in taproot pubkey info for all script path sigs (Andrew Chow)
bb1fabda30 doc: mention BIP86 in doc/bips.md (Sebastian Falbesoner)

Pull request description:

  Currently backports:
  * https://github.com/bitcoin/bitcoin/pull/26418
  * https://github.com/bitcoin/bitcoin/pull/26443
  * https://github.com/bitcoin/bitcoin/pull/26449

ACKs for top commit:
  dergoegge:
    ACK 42c74a0a4c

Tree-SHA512: e40f57b28cc4c06fc9dedebad6c9ab647fa0b98af1aef2d36874c6a05d39164c99fd763a2eb9ca162b7e276aa2e7d0f5934465ab4d7c1f5ba4a3162087e7089f
2022-11-09 10:28:17 +00:00
Sebastian Falbesoner
42c74a0a4c rpc: doc: add missing option "bech32m" for change_type parameters
Affects the help of the `fundrawtransaction`, `send` and
`walletcratefundedpsbt` RPCs.

Github-Pull: #26449
Rebased-From: c3b1fe59db
2022-11-07 10:32:10 +00:00
Andrew Chow
6e4d87e696 tests: Test Taproot PSBT signing with keys in other descriptor
Test that the same keys included in other descriptors will still be able
to sign a PSBT that requires those keys.

Github-Pull: #26418
Rebased-From: 0de30ed509
2022-11-04 15:56:51 +00:00
Andrew Chow
0a5ea2aa84 tests: Use new wallets for each test in wallet_taproot.py
To avoid a wallet potentially being able to sign a transaction using
keys from descriptors imported in previous tests, make new wallets for
each test case rather than sharing them.

Github-Pull: #26418
Rebased-From: 6efcdf6b7f
2022-11-04 15:56:18 +00:00
Andrew Chow
2159676b6e psbt: Include output pubkey in additional pubkeys to sign
In addition to the pubkeys in hd_keypaths and tap_bip32_keypaths, also
see if the descriptor can produce a SigningProvider for the output
pubkey.

Also slightly refactors this area to reduce code duplication.

Github-Pull: #26418
Rebased-From: 8781a1b6bb
2022-11-04 15:55:48 +00:00
Andrew Chow
754eefd21c sign: Fill in taproot pubkey info for all script path sigs
Taproot pubkey info was not being added for multi_a signing. The filling
of this info is moved into the common function CreateTaprootScriptSig so
that any signing of taproot scripts will include the pubkey info.

Github-Pull: #26418
Rebased-From: 323890d0d7
2022-11-04 15:55:16 +00:00
Sebastian Falbesoner
bb1fabda30 doc: mention BIP86 in doc/bips.md
Github-Pull: #26443
Rebased-From: 303fb8ff45
2022-11-04 15:50:15 +00:00
MacroFake
ca5f8f0de2 Merge bitcoin/bitcoin#26436: [24.x] CI backports
7f2dc610a5 ci: Use same `merge_script` implementation for Windows as for all (Hennadii Stepanov)
14784aa02c ci: Move `git config` commands into script where they are used (Hennadii Stepanov)
b1268254ba ci: Use remote pull/merge ref instead of local git merge (MacroFake)

Pull request description:

  This PR backports:
  - https://github.com/bitcoin/bitcoin/pull/26202
  - https://github.com/bitcoin/bitcoin/pull/26236

  to avoid CI failures like that:
  - https://cirrus-ci.com/task/5653459278495744
  - https://cirrus-ci.com/task/6075671743561728

ACKs for top commit:
  fanquake:
    ACK 7f2dc610a5 - backports look correct.

Tree-SHA512: 46b45df8137efd42491dd3ac110c00e6e1bf4ab18a6bbbf68307fe976f391055b1987a22c101060ef5ae8ff1a2b738e197ad579754d1068d78f5eddcd45c7f69
2022-11-01 18:22:53 +01:00
fanquake
067dc42b79 Merge bitcoin/bitcoin#26434: [24.x] [gui] Bugfix: Check for readlink buffer overflow and handle gracefully
e049fd76f0 Bugfix: Check for readlink buffer overflow and handle gracefully (Luke Dashjr)

Pull request description:

  Identical commit taken as-is from https://github.com/bitcoin/bitcoin/pull/25548 for backport

ACKs for top commit:
  hebasto:
    ACK e049fd76f0

Tree-SHA512: 37e63d570de898187c1bc8dd311c299c527adea51faa08aa6a3923bdb9390e3263902ace3d52a1cfc34ac2ba84e9358961574f886be1f64b5749a62e3c50ad57
2022-11-01 13:31:40 +00:00
Hennadii Stepanov
7f2dc610a5 ci: Use same merge_script implementation for Windows as for all
Github-Pull: bitcoin/bitcoin#26236
Rebased-From: 37cf472063
2022-11-01 12:52:05 +00:00
Hennadii Stepanov
14784aa02c ci: Move git config commands into script where they are used
Github-Pull: bitcoin/bitcoin#26236
Rebased-From: ac1d99240a
2022-11-01 12:52:04 +00:00
MacroFake
b1268254ba ci: Use remote pull/merge ref instead of local git merge
The merge strategy on the remote may be different than the local one.
This may cause local merges to be different or fail completely. Fix this
by using the result of the remote merge.

Github-Pull: bitcoin/bitcoin#26202
Rebased-From: fad7281d78
2022-11-01 12:52:04 +00:00
Luke Dashjr
e049fd76f0 Bugfix: Check for readlink buffer overflow and handle gracefully
If readlink returns the size of the buffer, an overflow may have (safely) occurred.
Pass a buffer size of MAX_PATH+1 (the size of the actual buffer) to detect this scenario.
2022-07-05 23:44:18 +00:00
25 changed files with 1305 additions and 254 deletions

View File

@@ -24,14 +24,11 @@ filter_template: &FILTER_TEMPLATE
base_template: &BASE_TEMPLATE
<< : *FILTER_TEMPLATE
merge_base_script:
# Unconditionally install git (used in fingerprint_script) and set the
# default git author name (used in verify-commits.py)
# Unconditionally install git (used in fingerprint_script).
- bash -c "$PACKAGE_MANAGER_INSTALL git"
- git config --global user.email "ci@ci.ci"
- git config --global user.name "ci"
- if [ "$CIRRUS_PR" = "" ]; then exit 0; fi
- git fetch $CIRRUS_REPO_CLONE_URL $CIRRUS_BASE_BRANCH
- git merge FETCH_HEAD # Merge base to detect silent merge conflicts
- git fetch $CIRRUS_REPO_CLONE_URL "pull/${CIRRUS_PR}/merge"
- git checkout FETCH_HEAD # Use merged changes to detect silent merge conflicts
main_template: &MAIN_TEMPLATE
timeout_in: 120m # https://cirrus-ci.org/faq/#instance-timed-out
@@ -117,14 +114,7 @@ task:
QT_CONFIGURE_COMMAND: '..\configure -release -silent -opensource -confirm-license -opengl desktop -static -static-runtime -mp -qt-zlib -qt-pcre -qt-libpng -nomake examples -nomake tests -nomake tools -no-angle -no-dbus -no-gif -no-gtk -no-ico -no-icu -no-libjpeg -no-libudev -no-sql-sqlite -no-sql-odbc -no-sqlite -no-vulkan -skip qt3d -skip qtactiveqt -skip qtandroidextras -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtdeclarative -skip doc -skip qtdoc -skip qtgamepad -skip qtgraphicaleffects -skip qtimageformats -skip qtlocation -skip qtlottie -skip qtmacextras -skip qtmultimedia -skip qtnetworkauth -skip qtpurchasing -skip qtquick3d -skip qtquickcontrols -skip qtquickcontrols2 -skip qtquicktimeline -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qtsvg -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebglplugin -skip qtwebsockets -skip qtwebview -skip qtx11extras -skip qtxmlpatterns -no-openssl -no-feature-bearermanagement -no-feature-printdialog -no-feature-printer -no-feature-printpreviewdialog -no-feature-printpreviewwidget -no-feature-sql -no-feature-sqlmodel -no-feature-textbrowser -no-feature-textmarkdownwriter -no-feature-textodfwriter -no-feature-xml'
IgnoreWarnIntDirInTempDetected: 'true'
merge_script:
- git config --global user.email "ci@ci.ci"
- git config --global user.name "ci"
# Windows filesystem loses the executable bit, and all of the executable
# files are considered "modified" now. It will break the following `git merge`
# command. The next two commands make git ignore this issue.
- git config core.filemode false
- git reset --hard
- PowerShell -NoLogo -Command if ($env:CIRRUS_PR -ne $null) { git fetch $env:CIRRUS_REPO_CLONE_URL $env:CIRRUS_BASE_BRANCH; git merge FETCH_HEAD; }
- PowerShell -NoLogo -Command if ($env:CIRRUS_PR -ne $null) { git fetch $env:CIRRUS_REPO_CLONE_URL pull/$env:CIRRUS_PR/merge; git checkout FETCH_HEAD; }
msvc_qt_built_cache:
folder: "%QTBASEDIR%"
reupload_on_changes: false

View File

@@ -31,6 +31,8 @@ if [ "$CIRRUS_REPO_FULL_NAME" = "bitcoin/bitcoin" ] && [ "$CIRRUS_PR" = "" ] ; t
git log HEAD~10 -1 --format='%H' > ./contrib/verify-commits/trusted-sha512-root-commit
git log HEAD~10 -1 --format='%H' > ./contrib/verify-commits/trusted-git-root
mapfile -t KEYS < contrib/verify-commits/trusted-keys
git config user.email "ci@ci.ci"
git config user.name "ci"
${CI_RETRY_EXE} gpg --keyserver hkps://keys.openpgp.org --recv-keys "${KEYS[@]}" &&
./contrib/verify-commits/verify-commits.py;
fi

View File

@@ -2,7 +2,7 @@ AC_PREREQ([2.69])
define(_CLIENT_VERSION_MAJOR, 24)
define(_CLIENT_VERSION_MINOR, 0)
define(_CLIENT_VERSION_BUILD, 0)
define(_CLIENT_VERSION_RC, 3)
define(_CLIENT_VERSION_RC, 0)
define(_CLIENT_VERSION_IS_RELEASE, true)
define(_COPYRIGHT_YEAR, 2022)
define(_COPYRIGHT_HOLDERS,[The %s developers])

View File

@@ -28,6 +28,7 @@ BIPs that are implemented by Bitcoin Core (up-to-date up to **v24.0**):
and it is disabled by default at build time since **v0.19.0** ([PR #15584](https://github.com/bitcoin/bitcoin/pull/15584)).
It has been removed as of **v0.20.0** ([PR 17165](https://github.com/bitcoin/bitcoin/pull/17165)).
* [`BIP 84`](https://github.com/bitcoin/bips/blob/master/bip-0084.mediawiki): The experimental descriptor wallets introduced in **v0.21.0** by default use the Hierarchical Deterministic Wallet derivation proposed by BIP 84. ([PR #16528](https://github.com/bitcoin/bitcoin/pull/16528))
* [`BIP 86`](https://github.com/bitcoin/bips/blob/master/bip-0086.mediawiki): Descriptor wallets by default use the Hierarchical Deterministic Wallet derivation proposed by BIP 86 since **v23.0** ([PR #22364](https://github.com/bitcoin/bitcoin/pull/22364)).
* [`BIP 90`](https://github.com/bitcoin/bips/blob/master/bip-0090.mediawiki): Trigger mechanism for activation of BIPs 34, 65, and 66 has been simplified to block height checks since **v0.14.0** ([PR #8391](https://github.com/bitcoin/bitcoin/pull/8391)).
* [`BIP 111`](https://github.com/bitcoin/bips/blob/master/bip-0111.mediawiki): `NODE_BLOOM` service bit added, and enforced for all peer versions as of **v0.13.0** ([PR #6579](https://github.com/bitcoin/bitcoin/pull/6579) and [PR #6641](https://github.com/bitcoin/bitcoin/pull/6641)).
* [`BIP 112`](https://github.com/bitcoin/bips/blob/master/bip-0112.mediawiki): The CHECKSEQUENCEVERIFY opcode has been implemented since **v0.12.1** ([PR #7524](https://github.com/bitcoin/bitcoin/pull/7524)), and has been *buried* since **v0.19.0** ([PR #16060](https://github.com/bitcoin/bitcoin/pull/16060)).

View File

@@ -1,7 +1,7 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.2.
.TH BITCOIN-CLI "1" "October 2022" "bitcoin-cli v24.0.0rc3" "User Commands"
.TH BITCOIN-CLI "1" "November 2022" "bitcoin-cli v24.0.0" "User Commands"
.SH NAME
bitcoin-cli \- manual page for bitcoin-cli v24.0.0rc3
bitcoin-cli \- manual page for bitcoin-cli v24.0.0
.SH SYNOPSIS
.B bitcoin-cli
[\fI\,options\/\fR] \fI\,<command> \/\fR[\fI\,params\/\fR] \fI\,Send command to Bitcoin Core\/\fR
@@ -15,7 +15,7 @@ bitcoin-cli \- manual page for bitcoin-cli v24.0.0rc3
.B bitcoin-cli
[\fI\,options\/\fR] \fI\,help <command> Get help for a command\/\fR
.SH DESCRIPTION
Bitcoin Core RPC client version v24.0.0rc3
Bitcoin Core RPC client version v24.0.0
.SH OPTIONS
.HP
\-?

View File

@@ -1,12 +1,12 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.2.
.TH BITCOIN-QT "1" "October 2022" "bitcoin-qt v24.0.0rc3" "User Commands"
.TH BITCOIN-QT "1" "November 2022" "bitcoin-qt v24.0.0" "User Commands"
.SH NAME
bitcoin-qt \- manual page for bitcoin-qt v24.0.0rc3
bitcoin-qt \- manual page for bitcoin-qt v24.0.0
.SH SYNOPSIS
.B bitcoin-qt
[\fI\,command-line options\/\fR]
.SH DESCRIPTION
Bitcoin Core version v24.0.0rc3
Bitcoin Core version v24.0.0
.SH OPTIONS
.HP
\-?

View File

@@ -1,7 +1,7 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.2.
.TH BITCOIN-TX "1" "October 2022" "bitcoin-tx v24.0.0rc3" "User Commands"
.TH BITCOIN-TX "1" "November 2022" "bitcoin-tx v24.0.0" "User Commands"
.SH NAME
bitcoin-tx \- manual page for bitcoin-tx v24.0.0rc3
bitcoin-tx \- manual page for bitcoin-tx v24.0.0
.SH SYNOPSIS
.B bitcoin-tx
[\fI\,options\/\fR] \fI\,<hex-tx> \/\fR[\fI\,commands\/\fR] \fI\,Update hex-encoded bitcoin transaction\/\fR
@@ -9,7 +9,7 @@ bitcoin-tx \- manual page for bitcoin-tx v24.0.0rc3
.B bitcoin-tx
[\fI\,options\/\fR] \fI\,-create \/\fR[\fI\,commands\/\fR] \fI\,Create hex-encoded bitcoin transaction\/\fR
.SH DESCRIPTION
Bitcoin Core bitcoin\-tx utility version v24.0.0rc3
Bitcoin Core bitcoin\-tx utility version v24.0.0
.SH OPTIONS
.HP
\-?

View File

@@ -1,12 +1,12 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.2.
.TH BITCOIN-UTIL "1" "October 2022" "bitcoin-util v24.0.0rc3" "User Commands"
.TH BITCOIN-UTIL "1" "November 2022" "bitcoin-util v24.0.0" "User Commands"
.SH NAME
bitcoin-util \- manual page for bitcoin-util v24.0.0rc3
bitcoin-util \- manual page for bitcoin-util v24.0.0
.SH SYNOPSIS
.B bitcoin-util
[\fI\,options\/\fR] [\fI\,commands\/\fR] \fI\,Do stuff\/\fR
.SH DESCRIPTION
Bitcoin Core bitcoin\-util utility version v24.0.0rc3
Bitcoin Core bitcoin\-util utility version v24.0.0
.SH OPTIONS
.HP
\-?

View File

@@ -1,9 +1,9 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.2.
.TH BITCOIN-WALLET "1" "October 2022" "bitcoin-wallet v24.0.0rc3" "User Commands"
.TH BITCOIN-WALLET "1" "November 2022" "bitcoin-wallet v24.0.0" "User Commands"
.SH NAME
bitcoin-wallet \- manual page for bitcoin-wallet v24.0.0rc3
bitcoin-wallet \- manual page for bitcoin-wallet v24.0.0
.SH DESCRIPTION
Bitcoin Core bitcoin\-wallet version v24.0.0rc3
Bitcoin Core bitcoin\-wallet version v24.0.0
.PP
bitcoin\-wallet is an offline tool for creating and interacting with Bitcoin Core wallet files.
By default bitcoin\-wallet will act on wallets in the default mainnet wallet directory in the datadir.

View File

@@ -1,12 +1,12 @@
.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.2.
.TH BITCOIND "1" "October 2022" "bitcoind v24.0.0rc3" "User Commands"
.TH BITCOIND "1" "November 2022" "bitcoind v24.0.0" "User Commands"
.SH NAME
bitcoind \- manual page for bitcoind v24.0.0rc3
bitcoind \- manual page for bitcoind v24.0.0
.SH SYNOPSIS
.B bitcoind
[\fI\,options\/\fR] \fI\,Start Bitcoin Core\/\fR
.SH DESCRIPTION
Bitcoin Core version v24.0.0rc3
Bitcoin Core version v24.0.0
.SH OPTIONS
.HP
\-?

View File

@@ -1,99 +0,0 @@
*The release notes draft is a temporary file that can be added to by anyone. See
[/doc/developer-notes.md#release-notes](/doc/developer-notes.md#release-notes)
for the process.*
*version* Release Notes Draft
===============================
Bitcoin Core version *version* is now available from:
<https://bitcoincore.org/bin/bitcoin-core-*version*/>
This release includes new features, various bug fixes and performance
improvements, as well as updated translations.
Please report bugs using the issue tracker at GitHub:
<https://github.com/bitcoin/bitcoin/issues>
To receive security and update notifications, please subscribe to:
<https://bitcoincore.org/en/list/announcements/join/>
How to Upgrade
==============
If you are running an older version, shut it down. Wait until it has completely
shut down (which might take a few minutes in some cases), then run the
installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on Mac)
or `bitcoind`/`bitcoin-qt` (on Linux).
Upgrading directly from a version of Bitcoin Core that has reached its EOL is
possible, but it might take some time if the data directory needs to be migrated. Old
wallet versions of Bitcoin Core are generally supported.
Compatibility
==============
Bitcoin Core is supported and extensively tested on operating systems
using the Linux kernel, macOS 10.15+, and Windows 7 and newer. Bitcoin
Core should also work on most other Unix-like systems but is not as
frequently tested on them. It is not recommended to use Bitcoin Core on
unsupported systems.
Notable changes
===============
P2P and network changes
-----------------------
Updated RPCs
------------
Changes to wallet related RPCs can be found in the Wallet section below.
New RPCs
--------
Build System
------------
Updated settings
----------------
Changes to GUI or wallet related settings can be found in the GUI or Wallet section below.
New settings
------------
Tools and Utilities
-------------------
Wallet
------
GUI changes
-----------
Low-level changes
=================
RPC
---
Tests
-----
*version* change log
====================
Credits
=======
Thanks to everyone who directly contributed to this release:
As well as to everyone that helped with translations on
[Transifex](https://www.transifex.com/bitcoin/bitcoin/).

388
doc/release-notes.md Normal file
View File

@@ -0,0 +1,388 @@
24.0 Release Notes
==================
Bitcoin Core version 24.0 is now available from:
<https://bitcoincore.org/bin/bitcoin-core-24.0/>
This release includes new features, various bug fixes and performance
improvements, as well as updated translations.
Please report bugs using the issue tracker at GitHub:
<https://github.com/bitcoin/bitcoin/issues>
To receive security and update notifications, please subscribe to:
<https://bitcoincore.org/en/list/announcements/join/>
How to Upgrade
==============
If you are running an older version, shut it down. Wait until it has completely
shut down (which might take a few minutes in some cases), then run the
installer (on Windows) or just copy over `/Applications/Bitcoin-Qt` (on macOS)
or `bitcoind`/`bitcoin-qt` (on Linux).
Upgrading directly from a version of Bitcoin Core that has reached its EOL is
possible, but it might take some time if the data directory needs to be migrated. Old
wallet versions of Bitcoin Core are generally supported.
Compatibility
==============
Bitcoin Core is supported and extensively tested on operating systems
using the Linux kernel, macOS 10.15+, and Windows 7 and newer. Bitcoin
Core should also work on most other Unix-like systems but is not as
frequently tested on them. It is not recommended to use Bitcoin Core on
unsupported systems.
Notice of new option for transaction replacement policies
=========================================================
This version of Bitcoin Core adds a new `mempoolfullrbf` configuration
option which allows users to change the policy their individual node
will use for relaying and mining unconfirmed transactions. The option
defaults to the same policy that was used in previous releases and no
changes to node policy will occur if everyone uses the default.
Some Bitcoin services today expect that the first version of an
unconfirmed transaction that they see will be the version of the
transaction that ultimately gets confirmed---a transaction acceptance
policy sometimes called "first-seen".
The Bitcoin Protocol does not, and cannot, provide any assurance that
the first version of an unconfirmed transaction seen by a particular
node will be the version that gets confirmed. If there are multiple
versions of the same unconfirmed transaction available, only the miner
who includes one of those transactions in a block gets to decide which
version of the transaction gets confirmed.
Despite this lack of assurance, multiple merchants and services today
still make this assumption.
There are several benefits to users from removing this *first-seen*
simplification. One key benefit, the ability for the sender of a
transaction to replace it with an alternative version paying higher
fees, was realized in [Bitcoin Core 0.12.0][] (February 2016) with the
introduction of [BIP125][] opt-in Replace By Fee (RBF).
Since then, there has been discussion about completely removing the
first-seen simplification and allowing users to replace any of their
older unconfirmed transactions with newer transactions, a feature called
*full-RBF*. This release includes a `mempoolfullrbf` configuration
option that allows enabling full-RBF, although it defaults to off
(allowing only opt-in RBF).
Several alternative node implementations have already enabled full-RBF by
default for years, and several contributors to Bitcoin Core are
advocating for enabling full-RBF by default in a future version of
Bitcoin Core.
As more nodes that participate in relay and mining begin enabling
full-RBF, replacement of unconfirmed transactions by ones offering higher
fees may rapidly become more reliable.
Contributors to this project strongly recommend that merchants and services
not accept unconfirmed transactions as final, and if they insist on doing so,
to take the appropriate steps to ensure they have some recourse or plan for
when their assumptions do not hold.
[Bitcoin Core 0.12.0]: https://bitcoincore.org/en/releases/0.12.0/#opt-in-replace-by-fee-transactions
[bip125]: https://github.com/bitcoin/bips/blob/master/bip-0125.mediawiki
Notable changes
===============
P2P and network changes
-----------------------
- To address a potential denial-of-service, the logic to download headers from peers
has been reworked. This is particularly relevant for nodes starting up for the
first time (or for nodes which are starting up after being offline for a long time).
Whenever headers are received from a peer that have a total chainwork that is either
less than the node's `-minimumchainwork` value or is sufficiently below the work at
the node's tip, a "presync" phase will begin, in which the node will download the
peer's headers and verify the cumulative work on the peer's chain, prior to storing
those headers permanently. Once that cumulative work is verified to be sufficiently high,
the headers will be redownloaded from that peer and fully validated and stored.
This may result in initial headers sync taking longer for new nodes starting up for
the first time, both because the headers will be downloaded twice, and because the effect
of a peer disconnecting during the presync phase (or while the node's best headers chain has less
than `-minimumchainwork`), will result in the node needing to use the headers presync mechanism
with the next peer as well (downloading the headers twice, again). (#25717)
- With I2P connections, a new, transient address is used for each outbound
connection if `-i2pacceptincoming=0`. (#25355)
Updated RPCs
------------
- The `-deprecatedrpc=softforks` configuration option has been removed. The
RPC `getblockchaininfo` no longer returns the `softforks` field, which was
previously deprecated in 23.0. (#23508) Information on soft fork status is
now only available via the `getdeploymentinfo` RPC.
- The `deprecatedrpc=exclude_coinbase` configuration option has been removed.
The `receivedby` RPCs (`listreceivedbyaddress`, `listreceivedbylabel`,
`getreceivedbyaddress` and `getreceivedbylabel`) now always return results
accounting for received coins from coinbase outputs, without an option to
change that behaviour. Excluding coinbases was previously deprecated in 23.0.
(#25171)
- The `deprecatedrpc=fees` configuration option has been removed. The top-level
fee fields `fee`, `modifiedfee`, `ancestorfees` and `descendantfees` are no
longer returned by RPCs `getmempoolentry`, `getrawmempool(verbose=true)`,
`getmempoolancestors(verbose=true)` and `getmempooldescendants(verbose=true)`.
The same fee fields can be accessed through the `fees` object in the result.
The top-level fee fields were previously deprecated in 23.0. (#25204)
- The `getpeerinfo` RPC has been updated with a new `presynced_headers` field,
indicating the progress on the presync phase mentioned in the
"P2P and network changes" section above.
Changes to wallet related RPCs can be found in the Wallet section below.
New RPCs
--------
- The `sendall` RPC spends specific UTXOs to one or more recipients
without creating change. By default, the `sendall` RPC will spend
every UTXO in the wallet. `sendall` is useful to empty wallets or to
create a changeless payment from select UTXOs. When creating a payment
from a specific amount for which the recipient incurs the transaction
fee, continue to use the `subtractfeefromamount` option via the
`send`, `sendtoaddress`, or `sendmany` RPCs. (#24118)
- A new `gettxspendingprevout` RPC has been added, which scans the mempool to find
transactions spending any of the given outpoints. (#24408)
- The `simulaterawtransaction` RPC iterates over the inputs and outputs of the given
transactions, and tallies up the balance change for the given wallet. This can be
useful e.g. when verifying that a coin join like transaction doesn't contain unexpected
inputs that the wallet will then sign for unintentionally. (#22751)
Updated REST APIs
-----------------
- The `/headers/` and `/blockfilterheaders/` endpoints have been updated to use
a query parameter instead of path parameter to specify the result count. The
count parameter is now optional, and defaults to 5 for both endpoints. The old
endpoints are still functional, and have no documented behaviour change.
For `/headers`, use
`GET /rest/headers/<BLOCK-HASH>.<bin|hex|json>?count=<COUNT=5>`
instead of
`GET /rest/headers/<COUNT>/<BLOCK-HASH>.<bin|hex|json>` (deprecated)
For `/blockfilterheaders/`, use
`GET /rest/blockfilterheaders/<FILTERTYPE>/<BLOCK-HASH>.<bin|hex|json>?count=<COUNT=5>`
instead of
`GET /rest/blockfilterheaders/<FILTERTYPE>/<COUNT>/<BLOCK-HASH>.<bin|hex|json>` (deprecated)
(#24098)
Build System
------------
- Guix builds are now reproducible across architectures (x86_64 & aarch64). (#21194)
New settings
------------
- A new `mempoolfullrbf` option has been added, which enables the mempool to
accept transaction replacement without enforcing BIP125 replaceability
signaling. (#25353)
Wallet
------
- The `-walletrbf` startup option will now default to `true`. The
wallet will now default to opt-in RBF on transactions that it creates. (#25610)
- The `replaceable` option for the `createrawtransaction` and
`createpsbt` RPCs will now default to `true`. Transactions created
with these RPCs will default to having opt-in RBF enabled. (#25610)
- The `wsh()` output descriptor was extended with Miniscript support. You can import Miniscript
descriptors for P2WSH in a watchonly wallet to track coins, but you can't spend from them using
the Bitcoin Core wallet yet.
You can find more about Miniscript on the [reference website](https://bitcoin.sipa.be/miniscript/). (#24148)
- The `tr()` output descriptor now supports multisig scripts through the `multi_a()` and
`sortedmulti_a()` functions. (#24043)
- To help prevent fingerprinting transactions created by the Bitcoin Core wallet, change output
amounts are now randomized. (#24494)
- The `listtransactions`, `gettransaction`, and `listsinceblock`
RPC methods now include a wtxid field (hash of serialized transaction,
including witness data) for each transaction. (#24198)
- The `listsinceblock`, `listtransactions` and `gettransaction` output now contain a new
`parent_descs` field for every "receive" entry. (#25504)
- A new optional `include_change` parameter was added to the `listsinceblock` command.
- RPC `getreceivedbylabel` now returns an error, "Label not found
in wallet" (-4), if the label is not in the address book. (#25122)
Migrating Legacy Wallets to Descriptor Wallets
---------------------------------------------
An experimental RPC `migratewallet` has been added to migrate Legacy (non-descriptor) wallets to
Descriptor wallets. More information about the migration process is available in the
[documentation](https://github.com/bitcoin/bitcoin/blob/master/doc/managing-wallets.md#migrating-legacy-wallets-to-descriptor-wallets).
GUI changes
-----------
- A new menu item to restore a wallet from a backup file has been added (gui#471).
- Configuration changes made in the bitcoin GUI (such as the pruning setting,
proxy settings, UPNP preferences) are now saved to `<datadir>/settings.json`
file rather than to the Qt settings backend (windows registry or unix desktop
config files), so these settings will now apply to bitcoind, instead of being
ignored. (#15936, gui#602)
- Also, the interaction between GUI settings and `bitcoin.conf` settings is
simplified. Settings from `bitcoin.conf` are now displayed normally in the GUI
settings dialog, instead of in a separate warning message ("Options set in this
dialog are overridden by the configuration file: -setting=value"). And these
settings can now be edited because `settings.json` values take precedence over
`bitcoin.conf` values. (#15936)
Low-level changes
=================
RPC
---
- The `deriveaddresses`, `getdescriptorinfo`, `importdescriptors` and `scantxoutset` commands now
accept Miniscript expression within a `wsh()` descriptor. (#24148)
- The `getaddressinfo`, `decodescript`, `listdescriptors` and `listunspent` commands may now output
a Miniscript descriptor inside a `wsh()` where a `wsh(raw())` descriptor was previously returned. (#24148)
Credits
=======
Thanks to everyone who directly contributed to this release:
- /dev/fd0
- 0xb10c
- Adam Jonas
- akankshakashyap
- Ali Sherief
- amadeuszpawlik
- Andreas Kouloumos
- Andrew Chow
- Anthony Towns
- Antoine Poinsot
- Antoine Riard
- Aurèle Oulès
- avirgovi
- Ayush Sharma
- Baas
- Ben Woosley
- BrokenProgrammer
- brunoerg
- brydinh
- Bushstar
- Calvin Kim
- CAnon
- Carl Dong
- chinggg
- Cory Fields
- Daniel Kraft
- Daniela Brozzoni
- darosior
- Dave Scotese
- David Bakin
- dergoegge
- dhruv
- Dimitri
- dontbyte
- Duncan Dean
- eugene
- Eunoia
- Fabian Jahr
- furszy
- Gleb Naumenko
- glozow
- Greg Weber
- Gregory Sanders
- gruve-p
- Hennadii Stepanov
- hiago
- Igor Bubelov
- ishaanam
- Jacob P.
- Jadi
- James O'Beirne
- Janna
- Jarol Rodriguez
- Jeremy Rand
- Jeremy Rubin
- jessebarton
- João Barbosa
- John Newbery
- Jon Atack
- Josiah Baker
- Karl-Johan Alm
- KevinMusgrave
- Kiminuo
- klementtan
- Kolby Moroz
- kouloumos
- Kristaps Kaupe
- Larry Ruane
- Luke Dashjr
- MarcoFalke
- Marnix
- Martin Leitner-Ankerl
- Martin Zumsande
- Michael Dietz
- Michael Folkson
- Michael Ford
- Murch
- mutatrum
- muxator
- Oskar Mendel
- Pablo Greco
- pasta
- Patrick Strateman
- Pavol Rusnak
- Peter Bushnell
- phyBrackets
- Pieter Wuille
- practicalswift
- randymcmillan
- Robert Spigler
- Russell Yanofsky
- S3RK
- Samer Afach
- Sebastian Falbesoner
- Seibart Nedor
- Shashwat
- Sjors Provoost
- Smlep
- sogoagain
- Stacie
- Stéphan Vuylsteke
- Suhail Saqan
- Suhas Daftuar
- t-bast
- TakeshiMusgrave
- Vasil Dimov
- W. J. van der Laan
- w0xlt
- whiteh0rse
- willcl-ark
- William Casarin
- Yancy Ribbens
As well as to everyone that helped with translations on
[Transifex](https://www.transifex.com/bitcoin/bitcoin/).

View File

@@ -59,6 +59,7 @@ QT_TS = \
qt/locale/bitcoin_ne.ts \
qt/locale/bitcoin_nl.ts \
qt/locale/bitcoin_no.ts \
qt/locale/bitcoin_pa.ts \
qt/locale/bitcoin_pam.ts \
qt/locale/bitcoin_pl.ts \
qt/locale/bitcoin_pt.ts \

View File

@@ -60,6 +60,7 @@
<file alias="ne">locale/bitcoin_ne.qm</file>
<file alias="nl">locale/bitcoin_nl.qm</file>
<file alias="no">locale/bitcoin_no.qm</file>
<file alias="pa">locale/bitcoin_pa.qm</file>
<file alias="pam">locale/bitcoin_pam.qm</file>
<file alias="pl">locale/bitcoin_pl.qm</file>
<file alias="pt">locale/bitcoin_pt.qm</file>

View File

@@ -615,9 +615,10 @@ bool SetStartOnSystemStartup(bool fAutoStart)
else
{
char pszExePath[MAX_PATH+1];
ssize_t r = readlink("/proc/self/exe", pszExePath, sizeof(pszExePath) - 1);
if (r == -1)
ssize_t r = readlink("/proc/self/exe", pszExePath, sizeof(pszExePath));
if (r == -1 || r > MAX_PATH) {
return false;
}
pszExePath[r] = '\0';
fs::create_directories(GetAutostartDir());

View File

@@ -258,6 +258,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
</context>
<context>
<name>BitcoinApplication</name>
<message>
<source>Settings file %1 might be corrupt or invalid.</source>
<translation type="unfinished">فایل تنظیمات %1 ممکن است خراب یا نامعتبر باشد.</translation>
</message>
<message>
<source>Runaway exception</source>
<translation type="unfinished">استثناء فراری (این استثناء نشان دهنده این است که هسته بیتکوین نتوانست چیزی را در کیف(والت) بنویسد.)</translation>
@@ -1013,7 +1017,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
<numerusform />
<numerusform>سابقه تراکنش بلوک(های) %n پردازش شد.</numerusform>
</translation>
</message>
<message>
@@ -1086,6 +1090,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Close wallet</source>
<translation type="unfinished">کیف پول را ببندید</translation>
</message>
<message>
<source>Restore Wallet…</source>
<extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
<translation type="unfinished">بازیابی کیف پول…</translation>
</message>
<message>
<source>Restore a wallet from a backup file</source>
<extracomment>Status tip for Restore Wallet menu item</extracomment>
<translation type="unfinished">بازیابی یک کیف پول از یک فایل پشتیبان</translation>
</message>
<message>
<source>Close all wallets</source>
<translation type="unfinished">همه‌ی کیف پول‌ها را ببند</translation>
@@ -1104,6 +1118,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<extracomment>Name of the wallet data file format.</extracomment>
<translation type="unfinished">داده های کیف پول</translation>
</message>
<message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
<translation type="unfinished">بارگیری پشتیبان‌گیری کیف پول</translation>
</message>
<message>
<source>Restore Wallet</source>
<extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
<translation type="unfinished">بازیابی کیف پول</translation>
</message>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
@@ -1133,7 +1157,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
<numerusform />
<numerusform>%n اتصال(های) فعال به شبکه بیت کوین.</numerusform>
</translation>
</message>
<message>
@@ -1156,6 +1180,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<extracomment>A context menu item. The network activity was disabled previously.</extracomment>
<translation type="unfinished">فعال‌سازی فعالیت شبکه</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)…</source>
<translation type="unfinished">پیش‌همگام‌سازی سرصفحه‌ها (%1%)…</translation>
</message>
<message>
<source>Error: %1</source>
<translation type="unfinished">خطا: %1</translation>
@@ -1414,7 +1442,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Can't list signers</source>
<translation type="unfinished">نمیتوان امضاکنندگان را فهرست کرد</translation>
</message>
</context>
<message>
<source>Too many external signers found</source>
<translation type="unfinished">تعداد زیادی امضاکننده خارجی پیدا شد</translation>
</message>
</context>
<context>
<name>LoadWalletsActivity</name>
<message>
@@ -1455,6 +1487,34 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">در حال باز کردن کیف پول &lt;b&gt;%1&lt;/b&gt;</translation>
</message>
</context>
<context>
<name>RestoreWalletActivity</name>
<message>
<source>Restore Wallet</source>
<extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
<translation type="unfinished">بازیابی کیف پول</translation>
</message>
<message>
<source>Restoring Wallet &lt;b&gt;%1&lt;/b&gt;</source>
<extracomment>Descriptive text of the restore wallets progress window which indicates to the user that wallets are currently being restored.</extracomment>
<translation type="unfinished">بازیابی کیف پول &lt;b&gt;%1&lt;/b&gt; ...</translation>
</message>
<message>
<source>Restore wallet failed</source>
<extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
<translation type="unfinished">بازیابی کیف پول انجام نشد</translation>
</message>
<message>
<source>Restore wallet warning</source>
<extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
<translation type="unfinished">هشدار بازیابی کیف پول</translation>
</message>
<message>
<source>Restore wallet message</source>
<extracomment>Title of message box which is displayed when the wallet is successfully restored.</extracomment>
<translation type="unfinished">بازیابی پیام کیف پول</translation>
</message>
</context>
<context>
<name>WalletController</name>
<message>
@@ -1611,19 +1671,19 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
<numerusform />
<numerusform>%n گیگابایت فضای موجود</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(of %n GB needed)</source>
<translation type="unfinished">
<numerusform />
<numerusform>(از %n گیگابایت مورد نیاز)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(%n GB needed for full chain)</source>
<translation type="unfinished">
<numerusform />
<numerusform>(%n گیگابایت برای زنجیره کامل مورد نیاز است)</numerusform>
</translation>
</message>
<message>
@@ -1638,7 +1698,7 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
<translation type="unfinished">
<numerusform />
<numerusform>(برای بازیابی نسخههای پشتیبان %n روز (های) قدیمی کافی است)</numerusform>
</translation>
</message>
<message>
@@ -1673,6 +1733,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source> GB</source>
<translation type="unfinished">گیگابایت</translation>
</message>
<message>
<source>When you click OK, %1 will begin to download and process the full %4 block chain (%2 GB) starting with the earliest transactions in %3 when %4 initially launched.</source>
<translation type="unfinished">وقتی تأیید را کلیک میکنید، %1 شروع به دانلود و پردازش زنجیره بلاک %4 کامل (%2 گیگابایت) میکند که با اولین تراکنشها در %3 شروع میشود که %4 در ابتدا راهاندازی می شود.</translation>
</message>
<message>
<source>If you have chosen to limit block chain storage (pruning), the historical data must still be downloaded and processed, but will be deleted afterward to keep your disk usage low.</source>
<translation type="unfinished">اگر تصمیم بگیرید که فضای ذخیره سازی زنجیره بلوک (هرس) را محدود کنید ، داده های تاریخی باید بارگیری و پردازش شود ، اما اگر آن را حذف کنید ، اگر شما دیسک کم استفاده کنید.
@@ -1765,7 +1829,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Unknown. Syncing Headers (%1, %2%)…</source>
<translation type="unfinished">ناشناخته. هماهنگ‌سازی سربرگ‌ها (%1، %2%) </translation>
</message>
</context>
<message>
<source>Unknown. Pre-syncing Headers (%1, %2%)…</source>
<translation type="unfinished">ناشناس. پیش‌همگام‌سازی سرصفحه‌ها (%1، %2% )…</translation>
</message>
</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -1800,6 +1868,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Size of &amp;database cache</source>
<translation type="unfinished">اندازه کش پایگاه داده.</translation>
</message>
<message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">گزینه های تنظیم شده در این گفتگو توسط خط فرمان لغو می شوند:</translation>
</message>
<message>
<source>Open Configuration File</source>
<translation type="unfinished">بازکردن فایل پیکربندی</translation>
@@ -2038,6 +2110,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<extracomment>Text explaining that the settings changed will not come into effect until the client is restarted.</extracomment>
<translation type="unfinished">کلاینت نیازمند ریست شدن است برای فعال کردن تغییرات</translation>
</message>
<message>
<source>Current settings will be backed up at "%1".</source>
<extracomment>Text explaining to the user that the client's current settings will be backed up at a specific location. %1 is a stand-in argument for the backup location's path.</extracomment>
<translation type="unfinished">تنظیمات فعلی در "%1" پشتیبان گیری خواهد شد.</translation>
</message>
<message>
<source>Client will be shut down. Do you want to proceed?</source>
<extracomment>Text asking the user to confirm if they would like to proceed with a client shutdown.</extracomment>
@@ -2080,6 +2157,13 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">آدرس پراکسی ارائه شده نامعتبر است.</translation>
</message>
</context>
<context>
<name>OptionsModel</name>
<message>
<source>Could not read setting "%1", %2.</source>
<translation type="unfinished">نمی توان تنظیم "%1"، %2 را خواند.</translation>
</message>
</context>
<context>
<name>OverviewPage</name>
<message>

View File

@@ -85,6 +85,11 @@
<source>Export Address List</source>
<translation type="unfinished"> ि </translation>
</message>
<message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished"> </translation>
</message>
<message>
<source>Exporting Failed</source>
<translation type="unfinished">ि </translation>
@@ -105,8 +110,23 @@
<translation type="unfinished">( )</translation>
</message>
</context>
<context>
<name>BitcoinApplication</name>
<message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
<translation type="unfinished"> . %1 ि ि .</translation>
</message>
<message>
<source>Internal error</source>
<translation type="unfinished"> </translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<source>%1 didn't yet exit safely</source>
<translation type="unfinished">%1 ि ...</translation>
</message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
@@ -150,8 +170,80 @@
</translation>
</message>
</context>
<context>
<name>bitcoin-core</name>
<message>
<source>Settings file could not be read</source>
<translation type="unfinished">ि </translation>
</message>
<message>
<source>Settings file could not be written</source>
<translation type="unfinished">ि िि </translation>
</message>
</context>
<context>
<name>BitcoinGUI</name>
<message>
<source>&amp;Minimize</source>
<translation type="unfinished">&amp;ि</translation>
</message>
<message>
<source>&amp;Options</source>
<translation type="unfinished">&amp;</translation>
</message>
<message>
<source>&amp;Encrypt Wallet</source>
<translation type="unfinished">&amp;ि </translation>
</message>
<message>
<source>&amp;Backup Wallet</source>
<translation type="unfinished">&amp;
 </translation>
</message>
<message>
<source>&amp;Change Passphrase</source>
<translation type="unfinished">&amp; ...</translation>
</message>
<message>
<source>Sign &amp;message</source>
<translation type="unfinished"> ि ...</translation>
</message>
<message>
<source>&amp;Verify message</source>
<translation type="unfinished">&amp; ि ...</translation>
</message>
<message>
<source>&amp;Load PSBT from file</source>
<translation type="unfinished"> PSBT &amp; ...</translation>
</message>
<message>
<source>Close Wallet</source>
<translation type="unfinished"> ...</translation>
</message>
<message>
<source>Create Wallet</source>
<translation type="unfinished"> ...</translation>
</message>
<message>
<source>Close All Wallets</source>
<translation type="unfinished"> ...</translation>
</message>
<message>
<source>Syncing Headers (%1%)</source>
<translation type="unfinished"> ि (%1%)</translation>
</message>
<message>
<source>Synchronizing with network</source>
<translation type="unfinished"> ि ...</translation>
</message>
<message>
<source>Indexing blocks on disk</source>
<translation type="unfinished">ि ि ...</translation>
</message>
<message>
<source>Processing blocks on disk</source>
<translation type="unfinished">ि ि ...</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
@@ -263,6 +355,11 @@
</context>
<context>
<name>TransactionView</name>
<message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished"> </translation>
</message>
<message>
<source>Label</source>
<translation type="unfinished"></translation>

View File

@@ -268,6 +268,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<extracomment>Explanatory text shown on startup when the settings file cannot be read. Prompts user to make a choice between resetting or aborting.</extracomment>
<translation type="unfinished">Vil du tilbakestille innstillingene til utgangsverdiene, eller vil du avbryte uten å gjøre endringer?</translation>
</message>
<message>
<source>A fatal error occurred. Check that settings file is writable, or try running with -nosettings.</source>
<extracomment>Explanatory text shown on startup when the settings file could not be written. Prompts user to check that we have the ability to write to the file. Explains that the user has the option of running without a settings file.</extracomment>
<translation type="unfinished">En fatal feil har oppstått. Sjekk at filen med innstillinger er skrivbar eller prøv å kjøre med -nosettings.</translation>
</message>
<message>
<source>Error: Specified data directory "%1" does not exist.</source>
<translation type="unfinished">Feil: Den spesifiserte datamappen "%1" finnes ikke.</translation>
@@ -350,36 +355,36 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
<numerusform>%n sekund</numerusform>
<numerusform>%n sekunder</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
<numerusform>%n minutt</numerusform>
<numerusform>%n minutter</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
<numerusform>%n time</numerusform>
<numerusform>%n timer</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
<numerusform>%n dag</numerusform>
<numerusform>%n dager</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
<numerusform>%n uke</numerusform>
<numerusform>%n uker</numerusform>
</translation>
</message>
<message>
@@ -389,8 +394,8 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
<numerusform>%n år</numerusform>
<numerusform>%n år</numerusform>
</translation>
</message>
</context>
@@ -552,6 +557,12 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Cannot set -peerblockfilters without -blockfilterindex.</source>
<translation type="unfinished">Kan ikke sette -peerblockfilters uten -blockfilterindex</translation>
</message>
<message>
<source>
Unable to restore backup of wallet.</source>
<translation type="unfinished">
Kunne ikke gjenopprette sikkerhetskopi av lommebok.</translation>
</message>
<message>
<source>Copyright (C) %i-%i</source>
<translation type="unfinished">Kopirett © %i-%i</translation>
@@ -748,6 +759,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Need to specify a port with -whitebind: '%s'</source>
<translation type="unfinished"> oppgi en port med -whitebind: '%s'</translation>
</message>
<message>
<source>No addresses available</source>
<translation type="unfinished">Ingen adresser tilgjengelig</translation>
</message>
<message>
<source>Not enough file descriptors available.</source>
<translation type="unfinished">For fildeskriptorer tilgjengelig.</translation>
@@ -1187,6 +1202,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Close wallet</source>
<translation type="unfinished">Lukk lommebok</translation>
</message>
<message>
<source>Restore Wallet</source>
<extracomment>Name of the menu item that restores wallet from a backup file.</extracomment>
<translation type="unfinished">Gjenopprett lommebok...</translation>
</message>
<message>
<source>Restore a wallet from a backup file</source>
<extracomment>Status tip for Restore Wallet menu item</extracomment>
<translation type="unfinished">Gjenopprett en lommebok fra en sikkerhetskopi</translation>
</message>
<message>
<source>Close all wallets</source>
<translation type="unfinished">Lukk alle lommebøker</translation>
@@ -1216,6 +1241,16 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<extracomment>Name of the wallet data file format.</extracomment>
<translation type="unfinished">Lommebokdata</translation>
</message>
<message>
<source>Load Wallet Backup</source>
<extracomment>The title for Restore Wallet File Windows</extracomment>
<translation type="unfinished">Last lommebok sikkerhetskopi</translation>
</message>
<message>
<source>Restore Wallet</source>
<extracomment>Title of pop-up window shown when the user is attempting to restore a wallet.</extracomment>
<translation type="unfinished">Gjenopprett lommebok</translation>
</message>
<message>
<source>Wallet Name</source>
<extracomment>Label of the input field where the name of the wallet is entered.</extracomment>
@@ -1261,6 +1296,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<extracomment>A context menu item. The network activity was disabled previously.</extracomment>
<translation type="unfinished">Klikk for å aktivere nettverksaktivitet.</translation>
</message>
<message>
<source>Pre-syncing Headers (%1%)</source>
<translation type="unfinished">Synkroniserer blokkhoder (%1%)...</translation>
</message>
<message>
<source>Error: %1</source>
<translation type="unfinished">Feil: %1</translation>
@@ -1549,6 +1588,14 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<translation type="unfinished">Åpner lommebok &lt;b&gt;%1&lt;/b&gt;...</translation>
</message>
</context>
<context>
<name>RestoreWalletActivity</name>
<message>
<source>Restore Wallet</source>
<extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
<translation type="unfinished">Gjenopprett lommebok</translation>
</message>
</context>
<context>
<name>WalletController</name>
<message>
@@ -1730,15 +1777,15 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<message numerus="yes">
<source>(of %n GB needed)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
<numerusform>(av %n GB som trengs)</numerusform>
<numerusform>(av %n GB som trengs)</numerusform>
</translation>
</message>
<message numerus="yes">
<source>(%n GB needed for full chain)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
<numerusform>(%n GB kreves for hele kjeden)</numerusform>
<numerusform>(%n GB kreves for hele kjeden)</numerusform>
</translation>
</message>
<message>
@@ -1890,7 +1937,11 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>%1 is currently syncing. It will download headers and blocks from peers and validate them until reaching the tip of the block chain.</source>
<translation type="unfinished">%1 synkroniseres for øyeblikket. Den vil laste ned blokkhoder og blokker fra likemenn og validere dem til de når enden av blokkjeden.</translation>
</message>
</context>
<message>
<source>Unknown. Pre-syncing Headers (%1, %2%)</source>
<translation type="unfinished">Ukjent.Synkroniser blokkhoder (%1,%2%)...</translation>
</message>
</context>
<context>
<name>OpenURIDialog</name>
<message>
@@ -1941,6 +1992,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Exit in the menu.</source>
<translation type="unfinished">Minimer i stedet for å avslutte applikasjonen når vinduet lukkes. Når dette er valgt, vil applikasjonen avsluttes kun etter at Avslutte er valgt i menyen.</translation>
</message>
<message>
<source>Options set in this dialog are overridden by the command line:</source>
<translation type="unfinished">Alternativer som er satt i denne dialogboksen overstyres av kommandolinjen:</translation>
</message>
<message>
<source>Open the %1 configuration file from the working directory.</source>
<translation type="unfinished">Åpne %1-oppsettsfila fra arbeidsmappen.</translation>
@@ -2350,6 +2405,10 @@ Signing is only possible with addresses of the type 'legacy'.</source>
<source>Transaction still needs signature(s).</source>
<translation type="unfinished">Transaksjonen trenger signatur(er).</translation>
</message>
<message>
<source>(But no wallet is loaded.)</source>
<translation type="unfinished">(Men ingen lommebok er lastet.)</translation>
</message>
<message>
<source>(But this wallet cannot sign transactions.)</source>
<translation type="unfinished">(Men denne lommeboken kan ikke signere transaksjoner.)</translation>
@@ -2419,6 +2478,11 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<extracomment>Title of Peers Table column which contains a unique number used to identify a connection.</extracomment>
<translation type="unfinished">Likemann</translation>
</message>
<message>
<source>Age</source>
<extracomment>Title of Peers Table column which indicates the duration (length of time) since the peer connection started.</extracomment>
<translation type="unfinished">Alder</translation>
</message>
<message>
<source>Direction</source>
<extracomment>Title of Peers Table column which indicates the direction the peer connection was initiated from.</extracomment>
@@ -2601,6 +2665,11 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<source>Mapped AS</source>
<translation type="unfinished">Kartlagt AS</translation>
</message>
<message>
<source>Addresses Processed</source>
<extracomment>Text title for the Addresses Processed field in the peer details area, which displays the total number of addresses received from this peer that were processed (excludes addresses that were dropped due to rate-limiting).</extracomment>
<translation type="unfinished">Adresser Prosessert</translation>
</message>
<message>
<source>User Agent</source>
<translation type="unfinished">Brukeragent</translation>
@@ -3271,6 +3340,11 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<extracomment>Text to inform a user attempting to create a transaction of their current options. At this stage, a user can only create a PSBT. This string is displayed when private keys are disabled and an external signer is not available.</extracomment>
<translation type="unfinished">Se over ditt transaksjonsforslag. Dette kommer til å produsere en Delvis Signert Bitcoin Transaksjon (PSBT) som du kan lagre eller kopiere og så signere med f.eks. en offline %1 lommebok, eller en PSBT kompatibel hardware lommebok.</translation>
</message>
<message>
<source>Do you want to create this transaction?</source>
<extracomment>Message displayed when attempting to create a transaction. Cautionary text to prompt the user to verify that the displayed transaction details represent the transaction the user intends to create.</extracomment>
<translation type="unfinished">Vil du lage denne transaksjonen?</translation>
</message>
<message>
<source>Please, review your transaction.</source>
<extracomment>Text to prompt a user to review the details of the transaction they are attempting to send.</extracomment>
@@ -3637,8 +3711,8 @@ Hvis du får denne feilen burde du be forretningsdrivende om å tilby en BIP21 k
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
<numerusform>modner om %n blokk</numerusform>
<numerusform>modner om %n blokker</numerusform>
</translation>
</message>
<message>

448
src/qt/locale/bitcoin_pa.ts Normal file
View File

@@ -0,0 +1,448 @@
<TS version="2.1" language="pa">
<context>
<name>AddressBookPage</name>
<message>
<source>Right-click to edit address or label</source>
<translation type="unfinished"> -ਿ </translation>
</message>
<message>
<source>Create a new address</source>
<translation type="unfinished"> </translation>
</message>
<message>
<source>&amp;New</source>
<translation type="unfinished">&amp;</translation>
</message>
<message>
<source>Copy the currently selected address to the system clipboard</source>
<translation type="unfinished"> ਿ - 'ਤੇ ਨਕਲ ਲਾਹੋ</translation>
</message>
<message>
<source>&amp;Copy</source>
<translation type="unfinished">&amp;ਨਕਲ ਲਾਹੋ</translation>
</message>
<message>
<source>C&amp;lose</source>
<translation type="unfinished">ਬੰ&amp;ਦ ਕਰੋ</translation>
</message>
<message>
<source>Delete the currently selected address from the list</source>
<translation type="unfinished">ਚੁਣੇ ਪਤੇ ਨੂੰ ਸੂਚੀ ਵਿੱਚੋਂ ਮਿਟਾਓ</translation>
</message>
<message>
<source>Enter address or label to search</source>
<translation type="unfinished">ਖੋਜਣ ਲਈ ਪਤਾ ਜਾਂ ਲੇਬਲ ਦਾਖਲ ਕਰੋ</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
<translation type="unfinished">ਮੌਜੂਦਾ ਟੈਬ ਵਿੱਚ ਡੇਟਾ ਨੂੰ ਫਾਈਲ ਵਿੱਚ ਐਕਸਪੋਰਟ ਕਰੋ</translation>
</message>
<message>
<source>&amp;Export</source>
<translation type="unfinished">&amp;ਨਿਰਯਾਤ</translation>
</message>
<message>
<source>&amp;Delete</source>
<translation type="unfinished">&amp;ਮਿਟਾਓ</translation>
</message>
<message>
<source>Choose the address to send coins to</source>
<translation type="unfinished">ਸਿੱਕੇ ਭੇਜਣ ਲਈ ਪਤਾ ਚੁਣੋ</translation>
</message>
<message>
<source>Choose the address to receive coins with</source>
<translation type="unfinished">ਸਿੱਕੇ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ ਪਤਾ ਚੁਣੋ</translation>
</message>
<message>
<source>These are your Bitcoin addresses for sending payments. Always check the amount and the receiving address before sending coins.</source>
<translation type="unfinished">ਇਹ ਭੁਗਤਾਨ ਭੇਜਣ ਲਈ ਤੁਹਾਡੇ ਬਿਟਕੋਇਨ ਪਤੇ ਹਨ। ਸਿੱਕੇ ਭੇਜਣ ਤੋਂ ਪਹਿਲਾਂ ਹਮੇਸ਼ਾਂ ਰਕਮ ਅਤੇ ਪ੍ਰਾਪਤ ਕਰਨ ਵਾਲੇ ਪਤੇ ਦੀ ਜਾਂਚ ਕਰੋ।</translation>
</message>
<message>
<source>&amp;Copy Address</source>
<translation type="unfinished">&amp;ਕਾਪੀ ਪਤਾ</translation>
</message>
<message>
<source>Copy &amp;Label</source>
<translation type="unfinished">&amp;ਲੇਬਲ ਕਾਪੀ ਕਰੋ</translation>
</message>
<message>
<source>&amp;Edit</source>
<translation type="unfinished">&amp;ਸੋਧੋ</translation>
</message>
<message>
<source>Export Address List</source>
<translation type="unfinished">ਪਤਾ ਸੂਚੀ ਨਿਰਯਾਤ ਕਰੋ</translation>
</message>
<message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished">ਕਾਮੇ ਨਾਲ ਵੱਖ ਕੀਤੀ ਫਾਈਲ</translation>
</message>
<message>
<source>Exporting Failed</source>
<translation type="unfinished">ਨਿਰਯਾਤ ਅਸਫਲ ਰਿਹਾ</translation>
</message>
</context>
<context>
<name>AddressTableModel</name>
<message>
<source>Label</source>
<translation type="unfinished">ਲੇਬਲ</translation>
</message>
<message>
<source>Address</source>
<translation type="unfinished">ਪਤਾ</translation>
</message>
</context>
<context>
<name>AskPassphraseDialog</name>
<message>
<source>Passphrase Dialog</source>
<translation type="unfinished">ਪਾਸਫਰੇਜ ਡਾਇਲਾਗ</translation>
</message>
<message>
<source>Enter passphrase</source>
<translation type="unfinished">ਪਾਸਫਰੇਜ ਲਿਖੋ</translation>
</message>
<message>
<source>New passphrase</source>
<translation type="unfinished">ਨਵਾਂ ਪਾਸਫਰੇਜ</translation>
</message>
<message>
<source>Repeat new passphrase</source>
<translation type="unfinished">ਨਵਾਂ ਪਾਸਫਰੇਜ ਦੁਹਰਾਓ</translation>
</message>
<message>
<source>Show passphrase</source>
<translation type="unfinished">ਪਾਸਫਰੇਜ ਦਿਖਾਓ</translation>
</message>
<message>
<source>Encrypt wallet</source>
<translation type="unfinished">ਵਾਲਿਟ ਐਨਕ੍ਰਿਪਟ ਕਰੋ</translation>
</message>
<message>
<source>Unlock wallet</source>
<translation type="unfinished">ਵਾਲਿਟ ਨੂੰ ਅਨਲੌਕ ਕਰੋ</translation>
</message>
<message>
<source>Change passphrase</source>
<translation type="unfinished">ਪਾਸਫਰੇਜ ਬਦਲੋ</translation>
</message>
<message>
<source>Confirm wallet encryption</source>
<translation type="unfinished">ਵਾਲਿਟ ਇਨਕ੍ਰਿਪਸ਼ਨ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ</translation>
</message>
<message>
<source>Are you sure you wish to encrypt your wallet?</source>
<translation type="unfinished">ਕੀ ਤੁਸੀਂ ਯਕੀਨੀ ਤੌਰ ' ਿ ਿ ?</translation>
</message>
<message>
<source>Wallet encrypted</source>
<translation type="unfinished">ਿ ਿ ਿ</translation>
</message>
<message>
<source>Wallet to be encrypted</source>
<translation type="unfinished">ਿ ਿ</translation>
</message>
<message>
<source>Your wallet is about to be encrypted. </source>
<translation type="unfinished"> ਿ ਿ </translation>
</message>
<message>
<source>Your wallet is now encrypted. </source>
<translation type="unfinished"> ਿ ਿ ਿ </translation>
</message>
<message>
<source>Wallet encryption failed</source>
<translation type="unfinished">ਿ ਿ </translation>
</message>
<message>
<source>The supplied passphrases do not match.</source>
<translation type="unfinished"> </translation>
</message>
<message>
<source>Wallet unlock failed</source>
<translation type="unfinished">ਿ ਿ</translation>
</message>
<message>
<source>Wallet passphrase was successfully changed.</source>
<translation type="unfinished">ਿ ਿ ਿ</translation>
</message>
<message>
<source>Warning: The Caps Lock key is on!</source>
<translation type="unfinished">: Caps Lock !</translation>
</message>
</context>
<context>
<name>BitcoinApplication</name>
<message>
<source>A fatal error occurred. %1 can no longer continue safely and will quit.</source>
<translation type="unfinished"> %1 ਿ ਿ </translation>
</message>
<message>
<source>Internal error</source>
<translation type="unfinished"> </translation>
</message>
</context>
<context>
<name>QObject</name>
<message>
<source>Error: %1</source>
<translation type="unfinished">: %1</translation>
</message>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
</translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
</translation>
</message>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
</translation>
</message>
</context>
<context>
<name>bitcoin-core</name>
<message>
<source>Settings file could not be read</source>
<translation type="unfinished">ਿ ਿ </translation>
</message>
<message>
<source>Settings file could not be written</source>
<translation type="unfinished">ਿ ਿ ਿ </translation>
</message>
</context>
<context>
<name>BitcoinGUI</name>
<message>
<source>&amp;Overview</source>
<translation type="unfinished">&amp;ਿ</translation>
</message>
<message>
<source>&amp;Transactions</source>
<translation type="unfinished">&amp;-</translation>
</message>
<message>
<source>Browse transaction history</source>
<translation type="unfinished">- ਿ </translation>
</message>
<message>
<source>Quit application</source>
<translation type="unfinished"> </translation>
</message>
<message>
<source>Create a new wallet</source>
<translation type="unfinished"> ਿ </translation>
</message>
<message>
<source>Wallet:</source>
<translation type="unfinished">: </translation>
</message>
<message>
<source>Send coins to a Bitcoin address</source>
<translation type="unfinished">ਿ 'ਤੇ ਸਿੱਕੇ ਭੇਜੋ</translation>
</message>
<message>
<source>Backup wallet to another location</source>
<translation type="unfinished">ਵਾਲਿਟ ਨੂੰ ਕਿਸੇ ਹੋਰ ਥਾਂ ' </translation>
</message>
<message>
<source>Change the passphrase used for wallet encryption</source>
<translation type="unfinished">ਿ ਿ ਿ </translation>
</message>
<message>
<source>&amp;Send</source>
<translation type="unfinished">&amp;</translation>
</message>
<message>
<source>&amp;Receive</source>
<translation type="unfinished">&amp; </translation>
</message>
<message>
<source>&amp;Encrypt Wallet</source>
<translation type="unfinished">&amp;ਿ ਿ ...</translation>
</message>
<message>
<source>Encrypt the private keys that belong to your wallet</source>
<translation type="unfinished">ਿ ਿ ਿ </translation>
</message>
<message>
<source>&amp;Backup Wallet</source>
<translation type="unfinished">&amp; ਿ</translation>
</message>
<message>
<source>&amp;Change Passphrase</source>
<translation type="unfinished"> &amp;...</translation>
</message>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
<numerusform />
<numerusform />
</translation>
</message>
<message numerus="yes">
<source>%n active connection(s) to Bitcoin network.</source>
<extracomment>A substring of the tooltip.</extracomment>
<translation type="unfinished">
<numerusform />
<numerusform />
</translation>
</message>
<message>
<source>Error: %1</source>
<translation type="unfinished">: %1</translation>
</message>
</context>
<context>
<name>Intro</name>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
<numerusform />
<numerusform />
</translation>
</message>
<message numerus="yes">
<source>(of %n GB needed)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
</translation>
</message>
<message numerus="yes">
<source>(%n GB needed for full chain)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
</translation>
</message>
<message numerus="yes">
<source>(sufficient to restore backups %n day(s) old)</source>
<extracomment>Explanatory text on the capability of the current prune target.</extracomment>
<translation type="unfinished">
<numerusform />
<numerusform />
</translation>
</message>
</context>
<context>
<name>PeerTableModel</name>
<message>
<source>Address</source>
<extracomment>Title of Peers Table column which contains the IP/Onion/I2P address of the connected peer.</extracomment>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ReceiveRequestDialog</name>
<message>
<source>Wallet:</source>
<translation type="unfinished">: </translation>
</message>
</context>
<context>
<name>RecentRequestsTableModel</name>
<message>
<source>Label</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>SendCoinsDialog</name>
<message numerus="yes">
<source>Estimated to begin confirmation within %n block(s).</source>
<translation type="unfinished">
<numerusform />
<numerusform />
</translation>
</message>
</context>
<context>
<name>TransactionDesc</name>
<message numerus="yes">
<source>matures in %n more block(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform />
</translation>
</message>
</context>
<context>
<name>TransactionTableModel</name>
<message>
<source>Label</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TransactionView</name>
<message>
<source>Comma separated file</source>
<extracomment>Expanded name of the CSV file format. See: https://en.wikipedia.org/wiki/Comma-separated_values.</extracomment>
<translation type="unfinished"> </translation>
</message>
<message>
<source>Label</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Address</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Exporting Failed</source>
<translation type="unfinished">ਿ ਿ</translation>
</message>
</context>
<context>
<name>WalletFrame</name>
<message>
<source>Create a new wallet</source>
<translation type="unfinished"> ਿ </translation>
</message>
</context>
<context>
<name>WalletView</name>
<message>
<source>&amp;Export</source>
<translation type="unfinished">&amp;ਿ</translation>
</message>
<message>
<source>Export the data in the current tab to a file</source>
<translation type="unfinished"> ਿ ਿ </translation>
</message>
</context>
</TS>

View File

@@ -312,31 +312,31 @@ Signing is only possible with addresses of the type 'legacy'</translation>
<message numerus="yes">
<source>%n second(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform>%nวินาที</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n minute(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform>%nนาที</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n hour(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform>%nชั่วโมง</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n day(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform>%nวัน</numerusform>
</translation>
</message>
<message numerus="yes">
<source>%n week(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform>%nสัปดาห์</numerusform>
</translation>
</message>
<message>
@@ -346,7 +346,7 @@ Signing is only possible with addresses of the type 'legacy'</translation>
<message numerus="yes">
<source>%n year(s)</source>
<translation type="unfinished">
<numerusform />
<numerusform>%nปี</numerusform>
</translation>
</message>
<message>
@@ -1526,13 +1526,13 @@ Signing is only possible with addresses of the type 'legacy'</translation>
<message numerus="yes">
<source>%n GB of space available</source>
<translation type="unfinished">
<numerusform />
<numerusform> %n GB </numerusform>
</translation>
</message>
<message numerus="yes">
<source>(of %n GB needed)</source>
<translation type="unfinished">
<numerusform />
<numerusform>( %n GB )</numerusform>
</translation>
</message>
<message numerus="yes">

View File

@@ -247,6 +247,10 @@ Cüzdan kilidini aç.</translation>
</context>
<context>
<name>BitcoinApplication</name>
<message>
<source>Settings file %1 might be corrupt or invalid.</source>
<translation type="unfinished">%1 ayar dosyası bozuk veya geçersiz olabilir.</translation>
</message>
<message>
<source>Runaway exception</source>
<translation type="unfinished">Sızıntı istisnası</translation>
@@ -985,7 +989,7 @@ Cüzdan kilidini aç.</translation>
<message numerus="yes">
<source>Processed %n block(s) of transaction history.</source>
<translation type="unfinished">
<numerusform />
<numerusform>İşlem geçmişinin %n bloğu işlendi.</numerusform>
</translation>
</message>
<message>
@@ -1403,7 +1407,11 @@ Cüzdan kilidini aç.</translation>
<source>Create wallet warning</source>
<translation type="unfinished">Cüzdan oluşturma uyarısı</translation>
</message>
</context>
<message>
<source>Too many external signers found</source>
<translation type="unfinished">Çok fazla harici imzalayan bulundu</translation>
</message>
</context>
<context>
<name>LoadWalletsActivity</name>
<message>
@@ -1449,6 +1457,16 @@ Cüzdan kilidini aç.</translation>
<extracomment>Title of progress window which is displayed when wallets are being restored.</extracomment>
<translation type="unfinished">Cüzdanı Geri Yükle</translation>
</message>
<message>
<source>Restore wallet failed</source>
<extracomment>Title of message box which is displayed when the wallet could not be restored.</extracomment>
<translation type="unfinished">Cüzdan geri yüklenemedi</translation>
</message>
<message>
<source>Restore wallet warning</source>
<extracomment>Title of message box which is displayed when the wallet is restored with some warning.</extracomment>
<translation type="unfinished">Cüzdan uyarısını geri yükle</translation>
</message>
</context>
<context>
<name>WalletController</name>

View File

@@ -146,6 +146,16 @@ static bool CreateSig(const BaseSignatureCreator& creator, SignatureData& sigdat
static bool CreateTaprootScriptSig(const BaseSignatureCreator& creator, SignatureData& sigdata, const SigningProvider& provider, std::vector<unsigned char>& sig_out, const XOnlyPubKey& pubkey, const uint256& leaf_hash, SigVersion sigversion)
{
KeyOriginInfo info;
if (provider.GetKeyOriginByXOnly(pubkey, info)) {
auto it = sigdata.taproot_misc_pubkeys.find(pubkey);
if (it == sigdata.taproot_misc_pubkeys.end()) {
sigdata.taproot_misc_pubkeys.emplace(pubkey, std::make_pair(std::set<uint256>({leaf_hash}), info));
} else {
it->second.first.insert(leaf_hash);
}
}
auto lookup_key = std::make_pair(pubkey, leaf_hash);
auto it = sigdata.taproot_script_sigs.find(lookup_key);
if (it != sigdata.taproot_script_sigs.end()) {
@@ -170,17 +180,6 @@ static bool SignTaprootScript(const SigningProvider& provider, const BaseSignatu
// <xonly pubkey> OP_CHECKSIG
if (script.size() == 34 && script[33] == OP_CHECKSIG && script[0] == 0x20) {
XOnlyPubKey pubkey{Span{script}.subspan(1, 32)};
KeyOriginInfo info;
if (provider.GetKeyOriginByXOnly(pubkey, info)) {
auto it = sigdata.taproot_misc_pubkeys.find(pubkey);
if (it == sigdata.taproot_misc_pubkeys.end()) {
sigdata.taproot_misc_pubkeys.emplace(pubkey, std::make_pair(std::set<uint256>({leaf_hash}), info));
} else {
it->second.first.insert(leaf_hash);
}
}
std::vector<unsigned char> sig;
if (CreateTaprootScriptSig(creator, sigdata, provider, sig, pubkey, leaf_hash, sigversion)) {
result = Vector(std::move(sig));

View File

@@ -747,7 +747,7 @@ RPCHelpMan fundrawtransaction()
"If that happens, you will need to fund the transaction with different inputs and republish it."},
{"changeAddress", RPCArg::Type::STR, RPCArg::DefaultHint{"automatic"}, "The bitcoin address to receive the change"},
{"changePosition", RPCArg::Type::NUM, RPCArg::DefaultHint{"random"}, "The index of the change output"},
{"change_type", RPCArg::Type::STR, RPCArg::DefaultHint{"set by -changetype"}, "The output type to use. Only valid if changeAddress is not specified. Options are \"legacy\", \"p2sh-segwit\", and \"bech32\"."},
{"change_type", RPCArg::Type::STR, RPCArg::DefaultHint{"set by -changetype"}, "The output type to use. Only valid if changeAddress is not specified. Options are \"legacy\", \"p2sh-segwit\", \"bech32\", and \"bech32m\"."},
{"includeWatching", RPCArg::Type::BOOL, RPCArg::DefaultHint{"true for watch-only wallets, otherwise false"}, "Also select inputs which are watch only.\n"
"Only solvable inputs can be used. Watch-only destinations are solvable if the public key and/or output script was imported,\n"
"e.g. with 'importpubkey' or 'importmulti' with the 'pubkeys' or 'desc' field."},
@@ -1144,7 +1144,7 @@ RPCHelpMan send()
{"add_to_wallet", RPCArg::Type::BOOL, RPCArg::Default{true}, "When false, returns a serialized transaction which will not be added to the wallet or broadcast"},
{"change_address", RPCArg::Type::STR, RPCArg::DefaultHint{"automatic"}, "The bitcoin address to receive the change"},
{"change_position", RPCArg::Type::NUM, RPCArg::DefaultHint{"random"}, "The index of the change output"},
{"change_type", RPCArg::Type::STR, RPCArg::DefaultHint{"set by -changetype"}, "The output type to use. Only valid if change_address is not specified. Options are \"legacy\", \"p2sh-segwit\", and \"bech32\"."},
{"change_type", RPCArg::Type::STR, RPCArg::DefaultHint{"set by -changetype"}, "The output type to use. Only valid if change_address is not specified. Options are \"legacy\", \"p2sh-segwit\", \"bech32\" and \"bech32m\"."},
{"fee_rate", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"not set, fall back to wallet fee estimation"}, "Specify a fee rate in " + CURRENCY_ATOM + "/vB."},
{"include_watching", RPCArg::Type::BOOL, RPCArg::DefaultHint{"true for watch-only wallets, otherwise false"}, "Also select inputs which are watch only.\n"
"Only solvable inputs can be used. Watch-only destinations are solvable if the public key and/or output script was imported,\n"
@@ -1597,7 +1597,7 @@ RPCHelpMan walletcreatefundedpsbt()
"If that happens, you will need to fund the transaction with different inputs and republish it."},
{"changeAddress", RPCArg::Type::STR, RPCArg::DefaultHint{"automatic"}, "The bitcoin address to receive the change"},
{"changePosition", RPCArg::Type::NUM, RPCArg::DefaultHint{"random"}, "The index of the change output"},
{"change_type", RPCArg::Type::STR, RPCArg::DefaultHint{"set by -changetype"}, "The output type to use. Only valid if changeAddress is not specified. Options are \"legacy\", \"p2sh-segwit\", and \"bech32\"."},
{"change_type", RPCArg::Type::STR, RPCArg::DefaultHint{"set by -changetype"}, "The output type to use. Only valid if changeAddress is not specified. Options are \"legacy\", \"p2sh-segwit\", \"bech32\", and \"bech32m\"."},
{"includeWatching", RPCArg::Type::BOOL, RPCArg::DefaultHint{"true for watch-only wallets, otherwise false"}, "Also select inputs which are watch only"},
{"lockUnspents", RPCArg::Type::BOOL, RPCArg::Default{false}, "Lock selected unspent outputs"},
{"fee_rate", RPCArg::Type::AMOUNT, RPCArg::DefaultHint{"not set, fall back to wallet fee estimation"}, "Specify a fee rate in " + CURRENCY_ATOM + "/vB."},

View File

@@ -2499,14 +2499,23 @@ TransactionError DescriptorScriptPubKeyMan::FillPSBT(PartiallySignedTransaction&
keys->Merge(std::move(*script_keys));
} else {
// Maybe there are pubkeys listed that we can sign for
script_keys = std::make_unique<FlatSigningProvider>();
for (const auto& pk_pair : input.hd_keypaths) {
const CPubKey& pubkey = pk_pair.first;
std::unique_ptr<FlatSigningProvider> pk_keys = GetSigningProvider(pubkey);
if (pk_keys) {
keys->Merge(std::move(*pk_keys));
}
std::vector<CPubKey> pubkeys;
// ECDSA Pubkeys
for (const auto& [pk, _] : input.hd_keypaths) {
pubkeys.push_back(pk);
}
// Taproot output pubkey
std::vector<std::vector<unsigned char>> sols;
if (Solver(script, sols) == TxoutType::WITNESS_V1_TAPROOT) {
sols[0].insert(sols[0].begin(), 0x02);
pubkeys.emplace_back(sols[0]);
sols[0][0] = 0x03;
pubkeys.emplace_back(sols[0]);
}
// Taproot pubkeys
for (const auto& pk_pair : input.m_tap_bip32_paths) {
const XOnlyPubKey& pubkey = pk_pair.first;
for (unsigned char prefix : {0x02, 0x03}) {
@@ -2514,10 +2523,14 @@ TransactionError DescriptorScriptPubKeyMan::FillPSBT(PartiallySignedTransaction&
std::copy(pubkey.begin(), pubkey.end(), b + 1);
CPubKey fullpubkey;
fullpubkey.Set(b, b + 33);
std::unique_ptr<FlatSigningProvider> pk_keys = GetSigningProvider(fullpubkey);
if (pk_keys) {
keys->Merge(std::move(*pk_keys));
}
pubkeys.push_back(fullpubkey);
}
}
for (const auto& pubkey : pubkeys) {
std::unique_ptr<FlatSigningProvider> pk_keys = GetSigningProvider(pubkey);
if (pk_keys) {
keys->Merge(std::move(*pk_keys));
}
}
}

View File

@@ -5,6 +5,7 @@
"""Test generation and spending of P2TR addresses."""
import random
import uuid
from decimal import Decimal
from test_framework.address import output_key_to_p2tr
@@ -229,17 +230,28 @@ class WalletTaprootTest(BitcoinTestFramework):
def do_test_addr(self, comment, pattern, privmap, treefn, keys):
self.log.info("Testing %s address derivation" % comment)
# Create wallets
wallet_uuid = uuid.uuid4().hex
self.nodes[0].createwallet(wallet_name=f"privs_tr_enabled_{wallet_uuid}", descriptors=True, blank=True)
self.nodes[0].createwallet(wallet_name=f"pubs_tr_enabled_{wallet_uuid}", descriptors=True, blank=True, disable_private_keys=True)
self.nodes[0].createwallet(wallet_name=f"addr_gen_{wallet_uuid}", descriptors=True, disable_private_keys=True, blank=True)
privs_tr_enabled = self.nodes[0].get_wallet_rpc(f"privs_tr_enabled_{wallet_uuid}")
pubs_tr_enabled = self.nodes[0].get_wallet_rpc(f"pubs_tr_enabled_{wallet_uuid}")
addr_gen = self.nodes[0].get_wallet_rpc(f"addr_gen_{wallet_uuid}")
desc = self.make_desc(pattern, privmap, keys, False)
desc_pub = self.make_desc(pattern, privmap, keys, True)
assert_equal(self.nodes[0].getdescriptorinfo(desc)['descriptor'], desc_pub)
result = self.addr_gen.importdescriptors([{"desc": desc_pub, "active": True, "timestamp": "now"}])
result = addr_gen.importdescriptors([{"desc": desc_pub, "active": True, "timestamp": "now"}])
assert(result[0]['success'])
address_type = "bech32m" if "tr" in pattern else "bech32"
for i in range(4):
addr_g = self.addr_gen.getnewaddress(address_type='bech32m')
addr_g = addr_gen.getnewaddress(address_type=address_type)
if treefn is not None:
addr_r = self.make_addr(treefn, keys, i)
assert_equal(addr_g, addr_r)
desc_a = self.addr_gen.getaddressinfo(addr_g)['desc']
desc_a = addr_gen.getaddressinfo(addr_g)['desc']
if desc.startswith("tr("):
assert desc_a.startswith("tr(")
rederive = self.nodes[1].deriveaddresses(desc_a)
@@ -247,25 +259,37 @@ class WalletTaprootTest(BitcoinTestFramework):
assert_equal(rederive[0], addr_g)
# tr descriptors can be imported
result = self.privs_tr_enabled.importdescriptors([{"desc": desc, "timestamp": "now"}])
result = privs_tr_enabled.importdescriptors([{"desc": desc, "timestamp": "now"}])
assert(result[0]["success"])
result = self.pubs_tr_enabled.importdescriptors([{"desc": desc_pub, "timestamp": "now"}])
result = pubs_tr_enabled.importdescriptors([{"desc": desc_pub, "timestamp": "now"}])
assert(result[0]["success"])
# Cleanup
privs_tr_enabled.unloadwallet()
pubs_tr_enabled.unloadwallet()
addr_gen.unloadwallet()
def do_test_sendtoaddress(self, comment, pattern, privmap, treefn, keys_pay, keys_change):
self.log.info("Testing %s through sendtoaddress" % comment)
# Create wallets
wallet_uuid = uuid.uuid4().hex
self.nodes[0].createwallet(wallet_name=f"rpc_online_{wallet_uuid}", descriptors=True, blank=True)
rpc_online = self.nodes[0].get_wallet_rpc(f"rpc_online_{wallet_uuid}")
desc_pay = self.make_desc(pattern, privmap, keys_pay)
desc_change = self.make_desc(pattern, privmap, keys_change)
desc_pay_pub = self.make_desc(pattern, privmap, keys_pay, True)
desc_change_pub = self.make_desc(pattern, privmap, keys_change, True)
assert_equal(self.nodes[0].getdescriptorinfo(desc_pay)['descriptor'], desc_pay_pub)
assert_equal(self.nodes[0].getdescriptorinfo(desc_change)['descriptor'], desc_change_pub)
result = self.rpc_online.importdescriptors([{"desc": desc_pay, "active": True, "timestamp": "now"}])
result = rpc_online.importdescriptors([{"desc": desc_pay, "active": True, "timestamp": "now"}])
assert(result[0]['success'])
result = self.rpc_online.importdescriptors([{"desc": desc_change, "active": True, "timestamp": "now", "internal": True}])
result = rpc_online.importdescriptors([{"desc": desc_change, "active": True, "timestamp": "now", "internal": True}])
assert(result[0]['success'])
address_type = "bech32m" if "tr" in pattern else "bech32"
for i in range(4):
addr_g = self.rpc_online.getnewaddress(address_type='bech32m')
addr_g = rpc_online.getnewaddress(address_type=address_type)
if treefn is not None:
addr_r = self.make_addr(treefn, keys_pay, i)
assert_equal(addr_g, addr_r)
@@ -273,31 +297,51 @@ class WalletTaprootTest(BitcoinTestFramework):
to_amnt = random.randrange(1000000, boring_balance)
self.boring.sendtoaddress(address=addr_g, amount=Decimal(to_amnt) / 100000000, subtractfeefromamount=True)
self.generatetoaddress(self.nodes[0], 1, self.boring.getnewaddress(), sync_fun=self.no_op)
test_balance = int(self.rpc_online.getbalance() * 100000000)
test_balance = int(rpc_online.getbalance() * 100000000)
ret_amnt = random.randrange(100000, test_balance)
# Increase fee_rate to compensate for the wallet's inability to estimate fees for script path spends.
res = self.rpc_online.sendtoaddress(address=self.boring.getnewaddress(), amount=Decimal(ret_amnt) / 100000000, subtractfeefromamount=True, fee_rate=200)
res = rpc_online.sendtoaddress(address=self.boring.getnewaddress(), amount=Decimal(ret_amnt) / 100000000, subtractfeefromamount=True, fee_rate=200)
self.generatetoaddress(self.nodes[0], 1, self.boring.getnewaddress(), sync_fun=self.no_op)
assert(self.rpc_online.gettransaction(res)["confirmations"] > 0)
assert(rpc_online.gettransaction(res)["confirmations"] > 0)
# Cleanup
txid = rpc_online.sendall(recipients=[self.boring.getnewaddress()])["txid"]
self.generatetoaddress(self.nodes[0], 1, self.boring.getnewaddress(), sync_fun=self.no_op)
assert(rpc_online.gettransaction(txid)["confirmations"] > 0)
rpc_online.unloadwallet()
def do_test_psbt(self, comment, pattern, privmap, treefn, keys_pay, keys_change):
self.log.info("Testing %s through PSBT" % comment)
# Create wallets
wallet_uuid = uuid.uuid4().hex
self.nodes[0].createwallet(wallet_name=f"psbt_online_{wallet_uuid}", descriptors=True, disable_private_keys=True, blank=True)
self.nodes[1].createwallet(wallet_name=f"psbt_offline_{wallet_uuid}", descriptors=True, blank=True)
self.nodes[1].createwallet(f"key_only_wallet_{wallet_uuid}", descriptors=True, blank=True)
psbt_online = self.nodes[0].get_wallet_rpc(f"psbt_online_{wallet_uuid}")
psbt_offline = self.nodes[1].get_wallet_rpc(f"psbt_offline_{wallet_uuid}")
key_only_wallet = self.nodes[1].get_wallet_rpc(f"key_only_wallet_{wallet_uuid}")
desc_pay = self.make_desc(pattern, privmap, keys_pay, False)
desc_change = self.make_desc(pattern, privmap, keys_change, False)
desc_pay_pub = self.make_desc(pattern, privmap, keys_pay, True)
desc_change_pub = self.make_desc(pattern, privmap, keys_change, True)
assert_equal(self.nodes[0].getdescriptorinfo(desc_pay)['descriptor'], desc_pay_pub)
assert_equal(self.nodes[0].getdescriptorinfo(desc_change)['descriptor'], desc_change_pub)
result = self.psbt_online.importdescriptors([{"desc": desc_pay_pub, "active": True, "timestamp": "now"}])
result = psbt_online.importdescriptors([{"desc": desc_pay_pub, "active": True, "timestamp": "now"}])
assert(result[0]['success'])
result = self.psbt_online.importdescriptors([{"desc": desc_change_pub, "active": True, "timestamp": "now", "internal": True}])
result = psbt_online.importdescriptors([{"desc": desc_change_pub, "active": True, "timestamp": "now", "internal": True}])
assert(result[0]['success'])
result = self.psbt_offline.importdescriptors([{"desc": desc_pay, "active": True, "timestamp": "now"}])
result = psbt_offline.importdescriptors([{"desc": desc_pay, "active": True, "timestamp": "now"}])
assert(result[0]['success'])
result = self.psbt_offline.importdescriptors([{"desc": desc_change, "active": True, "timestamp": "now", "internal": True}])
result = psbt_offline.importdescriptors([{"desc": desc_change, "active": True, "timestamp": "now", "internal": True}])
assert(result[0]['success'])
for key in keys_pay + keys_change:
result = key_only_wallet.importdescriptors([{"desc": descsum_create(f"wpkh({key['xprv']}/*)"), "timestamp":"now"}])
assert(result[0]["success"])
address_type = "bech32m" if "tr" in pattern else "bech32"
for i in range(4):
addr_g = self.psbt_online.getnewaddress(address_type='bech32m')
addr_g = psbt_online.getnewaddress(address_type=address_type)
if treefn is not None:
addr_r = self.make_addr(treefn, keys_pay, i)
assert_equal(addr_g, addr_r)
@@ -305,28 +349,43 @@ class WalletTaprootTest(BitcoinTestFramework):
to_amnt = random.randrange(1000000, boring_balance)
self.boring.sendtoaddress(address=addr_g, amount=Decimal(to_amnt) / 100000000, subtractfeefromamount=True)
self.generatetoaddress(self.nodes[0], 1, self.boring.getnewaddress(), sync_fun=self.no_op)
test_balance = int(self.psbt_online.getbalance() * 100000000)
test_balance = int(psbt_online.getbalance() * 100000000)
ret_amnt = random.randrange(100000, test_balance)
# Increase fee_rate to compensate for the wallet's inability to estimate fees for script path spends.
psbt = self.psbt_online.walletcreatefundedpsbt([], [{self.boring.getnewaddress(): Decimal(ret_amnt) / 100000000}], None, {"subtractFeeFromOutputs":[0], "fee_rate": 200, "change_type": "bech32m"})['psbt']
res = self.psbt_offline.walletprocesspsbt(psbt=psbt, finalize=False)
psbt = psbt_online.walletcreatefundedpsbt([], [{self.boring.getnewaddress(): Decimal(ret_amnt) / 100000000}], None, {"subtractFeeFromOutputs":[0], "fee_rate": 200, "change_type": address_type})['psbt']
res = psbt_offline.walletprocesspsbt(psbt=psbt, finalize=False)
for wallet in [psbt_offline, key_only_wallet]:
res = wallet.walletprocesspsbt(psbt=psbt, finalize=False)
decoded = self.psbt_offline.decodepsbt(res["psbt"])
if pattern.startswith("tr("):
for psbtin in decoded["inputs"]:
assert "non_witness_utxo" not in psbtin
assert "witness_utxo" in psbtin
assert "taproot_internal_key" in psbtin
assert "taproot_bip32_derivs" in psbtin
assert "taproot_key_path_sig" in psbtin or "taproot_script_path_sigs" in psbtin
if "taproot_script_path_sigs" in psbtin:
assert "taproot_merkle_root" in psbtin
assert "taproot_scripts" in psbtin
decoded = wallet.decodepsbt(res["psbt"])
if pattern.startswith("tr("):
for psbtin in decoded["inputs"]:
assert "non_witness_utxo" not in psbtin
assert "witness_utxo" in psbtin
assert "taproot_internal_key" in psbtin
assert "taproot_bip32_derivs" in psbtin
assert "taproot_key_path_sig" in psbtin or "taproot_script_path_sigs" in psbtin
if "taproot_script_path_sigs" in psbtin:
assert "taproot_merkle_root" in psbtin
assert "taproot_scripts" in psbtin
rawtx = self.nodes[0].finalizepsbt(res['psbt'])['hex']
res = self.nodes[0].testmempoolaccept([rawtx])
assert res[0]["allowed"]
rawtx = self.nodes[0].finalizepsbt(res['psbt'])['hex']
txid = self.nodes[0].sendrawtransaction(rawtx)
self.generatetoaddress(self.nodes[0], 1, self.boring.getnewaddress(), sync_fun=self.no_op)
assert(self.psbt_online.gettransaction(txid)['confirmations'] > 0)
assert(psbt_online.gettransaction(txid)['confirmations'] > 0)
# Cleanup
psbt = psbt_online.sendall(recipients=[self.boring.getnewaddress()], options={"psbt": True})["psbt"]
res = psbt_offline.walletprocesspsbt(psbt=psbt, finalize=False)
rawtx = self.nodes[0].finalizepsbt(res['psbt'])['hex']
txid = self.nodes[0].sendrawtransaction(rawtx)
self.generatetoaddress(self.nodes[0], 1, self.boring.getnewaddress(), sync_fun=self.no_op)
assert(psbt_online.gettransaction(txid)['confirmations'] > 0)
psbt_online.unloadwallet()
psbt_offline.unloadwallet()
def do_test(self, comment, pattern, privmap, treefn):
nkeys = len(privmap)
@@ -336,21 +395,8 @@ class WalletTaprootTest(BitcoinTestFramework):
self.do_test_psbt(comment, pattern, privmap, treefn, keys[2*nkeys:3*nkeys], keys[3*nkeys:4*nkeys])
def run_test(self):
self.log.info("Creating wallets...")
self.nodes[0].createwallet(wallet_name="privs_tr_enabled", descriptors=True, blank=True)
self.privs_tr_enabled = self.nodes[0].get_wallet_rpc("privs_tr_enabled")
self.nodes[0].createwallet(wallet_name="pubs_tr_enabled", descriptors=True, blank=True, disable_private_keys=True)
self.pubs_tr_enabled = self.nodes[0].get_wallet_rpc("pubs_tr_enabled")
self.nodes[0].createwallet(wallet_name="boring")
self.nodes[0].createwallet(wallet_name="addr_gen", descriptors=True, disable_private_keys=True, blank=True)
self.nodes[0].createwallet(wallet_name="rpc_online", descriptors=True, blank=True)
self.nodes[0].createwallet(wallet_name="psbt_online", descriptors=True, disable_private_keys=True, blank=True)
self.nodes[1].createwallet(wallet_name="psbt_offline", descriptors=True, blank=True)
self.boring = self.nodes[0].get_wallet_rpc("boring")
self.addr_gen = self.nodes[0].get_wallet_rpc("addr_gen")
self.rpc_online = self.nodes[0].get_wallet_rpc("rpc_online")
self.psbt_online = self.nodes[0].get_wallet_rpc("psbt_online")
self.psbt_offline = self.nodes[1].get_wallet_rpc("psbt_offline")
self.log.info("Mining blocks...")
gen_addr = self.boring.getnewaddress()
@@ -460,18 +506,5 @@ class WalletTaprootTest(BitcoinTestFramework):
lambda k1: key(k1)
)
self.log.info("Sending everything back...")
txid = self.rpc_online.sendall(recipients=[self.boring.getnewaddress()])["txid"]
self.generatetoaddress(self.nodes[0], 1, self.boring.getnewaddress(), sync_fun=self.no_op)
assert(self.rpc_online.gettransaction(txid)["confirmations"] > 0)
psbt = self.psbt_online.sendall(recipients=[self.boring.getnewaddress()], options={"psbt": True})["psbt"]
res = self.psbt_offline.walletprocesspsbt(psbt=psbt, finalize=False)
rawtx = self.nodes[0].finalizepsbt(res['psbt'])['hex']
txid = self.nodes[0].sendrawtransaction(rawtx)
self.generatetoaddress(self.nodes[0], 1, self.boring.getnewaddress(), sync_fun=self.no_op)
assert(self.psbt_online.gettransaction(txid)['confirmations'] > 0)
if __name__ == '__main__':
WalletTaprootTest().main()