Merge branch 'master' into elem-23.3.1rc3

This commit is contained in:
Pablo Greco 2025-11-11 00:10:38 -08:00
commit 752b11dae7
No known key found for this signature in database
GPG key ID: 2F656B0610604482
11 changed files with 102 additions and 11 deletions

View file

@ -313,7 +313,7 @@ task:
name: 'macOS 13 native arm64 [gui, sqlite only] [no depends]'
macos_instance:
# Use latest image, but hardcode version to avoid silent upgrades (and breaks)
image: ghcr.io/cirruslabs/macos-ventura-xcode:14.1 # https://cirrus-ci.org/guide/macOS
image: ghcr.io/cirruslabs/macos-runner:sequoia # https://cirrus-ci.org/guide/macOS
<< : *MACOS_NATIVE_TASK_TEMPLATE
env:
<< : *CIRRUS_EPHEMERAL_WORKER_TEMPLATE_ENV

View file

@ -7,9 +7,7 @@
export LC_ALL=C.UTF-8
export HOST=arm64-apple-darwin
# Homebrew's python@3.12 is marked as externally managed (PEP 668).
# Therefore, `--break-system-packages` is needed.
export PIP_PACKAGES="--break-system-packages zmq"
export PIP_PACKAGES="zmq"
export GOAL="install"
# ELEMENTS: add -fno-stack-check to work around clang bug on macos
export BITCOIN_CONFIG="--with-gui --with-miniupnpc --with-natpmp --enable-reduce-exports CXXFLAGS=-fno-stack-check"

View file

@ -11,7 +11,7 @@ if [[ $QEMU_USER_CMD == qemu-s390* ]]; then
fi
if [ "$CI_OS_NAME" == "macos" ]; then
sudo -H pip3 install --upgrade --break-system-packages --ignore-installed pip
sudo -H pip3 install --upgrade --ignore-installed pip
# shellcheck disable=SC2086
IN_GETOPT_BIN="$(brew --prefix gnu-getopt)/bin/getopt" ${CI_RETRY_EXE} pip3 install --user $PIP_PACKAGES
fi

View file

@ -238,7 +238,7 @@ SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH:-$(git -c log.showSignature=false log --f
# across time.
time-machine() {
# shellcheck disable=SC2086
guix time-machine --url=https://git.savannah.gnu.org/git/guix.git \
guix time-machine --url=https://codeberg.org/guix.git \
--commit=ae03f401381e956c4c41b4cf495cbde964fa43d0 \
--cores="$JOBS" \
--keep-failed \

View file

@ -226,7 +226,7 @@ SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH:-$(git -c log.showSignature=false log --f
# across time.
time-machine() {
# shellcheck disable=SC2086
guix time-machine --url=https://git.savannah.gnu.org/git/guix.git \
guix time-machine --url=https://codeberg.org/guix.git \
--commit=ae03f401381e956c4c41b4cf495cbde964fa43d0 \
--cores="$JOBS" \
--keep-failed \

View file

@ -0,0 +1,47 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBF6i+TEBEADafn73f7PgLE0YbUCzVcQzLctsnFeAreGseYF2vC89pTZpelYP
Ulw6ALAW3ce5IDwAIDpNKwX8sluCySyOS66M8X+yPVWnyzqZYUqI5+cDAHsiNfH2
I9owGkoCOv9/e2SixYuresznehjpfLzcitn5FzG/1k0hReAYMAaFKSfwhBuBQuhZ
Yd9LLQv4Ujhwm5uc+LbMgBlzVfvUgmdztuWA9RoEqtiRT83MIbEKO9e8V0w405xT
8SJqZBAwappUmar6fcGwvOuD82nmGsKMRvW/hm4213+D5s7j+qYla2vVT319sUqj
+GegD1bVofJkkD1ivksU7f1W8/RnEfabCRs1DPu5cEhXS6nRUcLQEMFyloX+3Kce
d258Y2Fo6NmOFRgAydOiEv/PZuVaM25+uuGtxgkDHV7vvMEIdrtDN20qw04QWO3P
VpkVqxezJkZwMTR7vPNDWbgTsXzXja0tFOj1fpJjF132x4hOvIFGp0xtcz8lqeH2
bbhrx9kjmXC62dKIulUJVugg2PUCo6tMFvFd4Mvn0VbUtJ84NUdVqTSMQ6ScAKAP
eOQpU2kORttnLzMZnWJa682fTK+CdwD/+Bn27DVi8r2DfUBe2geWmGfb1sMN48W5
rJ++XuoxmUt9/F5GSIeqyPFUZgMkz40LASzOTGLVSft/GsVsh2FbE0LJBwARAQAB
tCRQYWJsbyBHcmVjbyA8cGdyZWNvQGJsb2Nrc3RyZWFtLmNvbT6JAk4EEwEIADgW
IQS9DzBi+HhCQQsGoEMvZWsGEGBEggUCXqL5MQIbAwULCQgHAgYVCgkICwIEFgID
AQIeAQIXgAAKCRAvZWsGEGBEglW3EACGqKk5WDx6qKAIOhY+B//VkX36x9gtJ49b
OEL/tEsmIySqYk7lk7WPbB8Z38Kymb1muI3AfIu2XBjVRSyG+jtIAnfEAEHU8Mmi
5+0lBx0JqVkwhkDfnpIX9ZNDT6J82U2mWj5EyOdUpYGGqg+R89iFQkdHbTPIOyFB
ONCFEcoGpXs61n71z0KR0EFwWZXU9TEdnqttmrlgMSH02TxPtJntYw5mkknD+zZs
EuknzDG/9lkDelnmHXFWagDBvzlP1hRbRoxF5XIw8NFnrftx345iqWRoVvcrfS9J
R62NPKxaaFAnu/MYGRGiXPh3c05a004V4OBWhmsqsSsbYvQGpGvt+MrzrLBLTTmg
kgmayyhU7ZfyPSd1yukoSu+LD8YLjqKLQCnQ+8oM5+H87q0EkBuUDgcNcXmXw3aU
SdeoVEWOmz7tJoHxtxOpPVTuLbRiuNVn5qxoMw2aSOeamdUQ/JuUMsdwbmrcurys
+1dfD6t8H8kjHM3Jm5H0uCKA3ZPYZrHVi7xnUoCrnIItBlUv/BbN13CbH8JJSFsD
45doq/Ckq8nkdFu6mvd+Puz3OtvtpOs49prHZ2LzccWetp8jWKDZAGT3uSn0L62z
9k9WhCmmYP7R1bTTd3BQKrlsOoBXAmK4NbUTwQlerqBpoPd01YzSXJKdAwfOw8Vf
dj8n1HCiiIkBOQQQAQoAIxYhBHSAkJN41UTqa23Ot1NbEpgLuKTTBQJiVFmeBYMH
hM4AAAoJEFNbEpgLuKTTayMIAItS+ZBXgAatSU8VcVkUtAYAvvHN42JnAhxLQSkC
vvOb2sofonC0SRBFF0YJD+/BbERhXVaTY82f8AXpXf+LYPLc/V3y6ho24CYotPWe
KRRLhkMCqFBS43/4ifmuUHd2LrVrL9CFs+q7SAg1qTu5TKJ3ll93OEL5BWDSgNJX
eLMJ4LcVtPB9Cgwb+a43iMdSe7nNVL9KwttU7vmNs5Y6MRghKJ57N81DQLL2BnJJ
4oy7K6m0SBBq7uWlzKiaSJ42SHYvZ46e3LK1DlZMsefeyLW/NqeMvDYAqvvgSV2z
J9/68+PweqOShpd7bOem9FXYVbyu6v/GbOBUfjIW7dMEd/qJAjMEEAEIAB0WIQQ9
UbLENzL3YvLiYGqqA/G8j7dvpQUCYmGvwgAKCRCqA/G8j7dvpRkSD/95gn3zeD1h
DFlCzP2jSu3MEBKYro9vHp57ReibucewavrpoUB42WtCrq23nWmtXgImx2PMzFYd
gFGIYcNTNldt8xFq61J4ywoPrka0l83/NM//8v2u3qLA2P4NJfkMM/RMjRRwx6Zi
JoZKJB+M6gK06jEwXKcEEP6iJoWJQ4m6CHU5EDb5txActiDSYABknpqSGUwp8PM0
yRjjdeq+AhqPkps5rufcj9uySAx2wNm5oNYh/V0ggPx1iT4sHxMHkuZzPqNYFGXj
IWwC0T1anc0GhBpbV+XA/oEWvc9tB94t8EqLi831NB/Z1w4vCmlaCHj1MPmCb9YB
+Iyp06DiU2wa1iseRWuYs9r7zANrj+9lRwgAsC7jVPIqnZ1Lt/NDb8AjijXPd2B8
cOBuXjV7ZEeBtURmgFasop8CkGhhVnL2qHGvzLMt46xUfraIpPcgnlnCuocoXSlw
+JF5vy0+Gcb14nDDMZAUW/RIgeF5MmiblLVwJtz2paZhrUF7G6Uo+X404Eq7aEwn
8+weikqFclABRKsmn/uA2xLJEpDaMupJLZE+VibXCIYBAl0xRn38PmfYHerjATtV
2XK+YgxvlN4WWmpGs3G7yfOTN9RgWpcUlZmVXTkyUmXIH14gI4hILm16qezzdv6D
oyVthSegrEARVcCyL6LuB5mZhO7c3elKHA==
=K/wp
-----END PGP PUBLIC KEY BLOCK-----

View file

@ -28,6 +28,8 @@ if [ "${BITCOIN_GENBUILD_NO_GIT}" != "1" ] && [ -e "$(command -v git)" ] && [ "$
RAWDESC=$(git describe --abbrev=0 2>/dev/null)
if [ "$(git rev-parse HEAD)" = "$(git rev-list -1 "$RAWDESC" 2>/dev/null)" ]; then
git diff-index --quiet HEAD -- && GIT_TAG=$RAWDESC
# Replace elements- tag with the corresponding v
case "$GIT_TAG" in elements-*) GIT_TAG="v${GIT_TAG#elements-}";; esac
fi
# otherwise generate suffix from git, i.e. string like "59887e8-dirty"

View file

@ -318,6 +318,10 @@ bool IsIssuanceInMoneyRange(const CTransaction& tx)
if (issuance.nAmount.IsExplicit() && !MoneyRange(issuance.nAmount.GetAmount())) {
return false;
}
// check the reissuance token is in range
if (!issuance.nInflationKeys.IsNull() && issuance.nInflationKeys.IsExplicit() && !MoneyRange(issuance.nInflationKeys.GetAmount())) {
return false;
}
}
return true;
}

View file

@ -130,7 +130,7 @@ class InvalidMessagesTest(BitcoinTestFramework):
def test_size(self):
self.log.info("Test message with oversized payload disconnects peer")
conn = self.nodes[0].add_p2p_connection(P2PDataStore())
with self.nodes[0].assert_debug_log(['Header error: Size too large (badmsg, 4000001 bytes)']):
with self.nodes[0].assert_debug_log(['Header error: Size too large (badmsg, 16000001 bytes)']):
msg = msg_unrecognized(str_data="d" * (VALID_DATA_LIMIT + 1))
msg = conn.build_message(msg)
conn.send_raw_message(msg)

View file

@ -244,8 +244,7 @@ BASE_SCRIPTS = [
'p2p_invalid_block.py',
'feature_elements_taproot_activation.py',
'feature_elements_simplicity_activation.py',
# ELEMENTS: needs to be fixed
#'p2p_invalid_messages.py',
'p2p_invalid_messages.py',
'p2p_invalid_tx.py',
'feature_assumevalid.py',
'example_test.py',

View file

@ -20,7 +20,7 @@ class WalletTest(BitcoinTestFramework):
self.extra_args = [
args + ["-acceptunlimitedissuances=1"],
args + ["-acceptunlimitedissuances=1"],
args, # node 2 blocks unblinded issuances out of moneyrange
args, # node 2 blocks unblinded issuances out of moneyrange (default -acceptunlimitedissuances=0)
]
def setup_network(self, split=False):
@ -61,6 +61,12 @@ class WalletTest(BitcoinTestFramework):
self.generate(self.nodes[0], 1)
assert_equal(self.nodes[0].getbalance()[unblinded_asset], 500_000_000)
self.log.info("Issue more than 21 million of a unblinded reissuance token")
issuance = self.nodes[0].issueasset(300_000_000, 100_000_000, False)
self.generate(self.nodes[0], 1)
assert_equal(self.nodes[0].getbalance()[issuance['asset']], 300_000_000)
assert_equal(self.nodes[0].getbalance()[issuance['token']], 100_000_000)
# send more than 21 million of that asset
addr = self.nodes[1].getnewaddress()
self.nodes[0].sendtoaddress(address=addr, amount=22_000_000, assetlabel=asset)
@ -130,5 +136,40 @@ class WalletTest(BitcoinTestFramework):
assert(asset not in self.nodes[0].getbalance())
assert_equal(self.nodes[2].getbalance()[asset], 300_000_000)
self.log.info("Reissue more than 21 million of a unblinded non-policy asset on node 2 - rejected from mempool")
issuance = self.nodes[2].issueasset(3_000_000, 100, False)
asset = issuance['asset']
unblinded_asset = issuance['asset']
self.generate(self.nodes[2], 1)
assert_equal(self.nodes[2].getbalance()[unblinded_asset], 3_000_000)
reissuance = self.nodes[2].reissueasset(unblinded_asset, 200_000_000)
reissuance_tx = self.nodes[2].gettransaction(reissuance["txid"])
assert_raises_rpc_error(-26, "issuance-out-of-range", self.nodes[2].sendrawtransaction, reissuance_tx['hex'])
# transaction should be accepted on node 0
self.nodes[0].sendrawtransaction(reissuance_tx["hex"])
assert(reissuance['txid'] in self.nodes[0].getrawmempool())
assert(reissuance['txid'] not in self.nodes[2].getrawmempool())
self.generate(self.nodes[0], 1)
assert(asset not in self.nodes[0].getbalance())
assert_equal(self.nodes[2].getbalance()[asset], 203_000_000)
self.log.info("Issue more than 21 million reissuance tokens on node 2 - rejected from mempool")
issuance = self.nodes[2].issueasset(3_000_000, 200_000_000, False)
asset = issuance['asset']
token = issuance['token']
issuance_tx = self.nodes[2].gettransaction(issuance["txid"])
assert_raises_rpc_error(-26, "issuance-out-of-range", self.nodes[2].sendrawtransaction, issuance_tx['hex'])
self.generate(self.nodes[0], 1)
assert(asset not in self.nodes[2].getbalance())
assert(token not in self.nodes[2].getbalance())
# transaction should be accepted on node 0
self.nodes[0].sendrawtransaction(issuance_tx["hex"])
assert(issuance['txid'] in self.nodes[0].getrawmempool())
assert(issuance['txid'] not in self.nodes[2].getrawmempool())
self.generate(self.nodes[0], 1)
assert(asset not in self.nodes[0].getbalance())
assert_equal(self.nodes[2].getbalance()[asset], 3_000_000)
assert_equal(self.nodes[2].getbalance()[token], 200_000_000)
if __name__ == '__main__':
WalletTest().main()