Allow multiple base58 prefix bytes.

This commit is contained in:
tecnovert
2024-03-25 13:37:35 +02:00
parent 2a28f336e2
commit 1cbc2f44b0
6 changed files with 72 additions and 9 deletions

View File

@@ -200,18 +200,21 @@ chainparams = {
'walletrpcport': 18082,
'min_amount': 100000,
'max_amount': 10000 * XMR_COIN,
'address_prefix': 18,
},
'testnet': {
'rpcport': 28081,
'walletrpcport': 28082,
'min_amount': 100000,
'max_amount': 10000 * XMR_COIN,
'address_prefix': 18,
},
'regtest': {
'rpcport': 18081,
'walletrpcport': 18082,
'min_amount': 100000,
'max_amount': 10000 * XMR_COIN,
'address_prefix': 18,
}
},
Coins.PIVX: {

View File

@@ -81,6 +81,8 @@ class XMRInterface(CoinInterface):
def __init__(self, coin_settings, network, swap_client=None):
super().__init__(network)
self._addr_prefix = self.chainparams_network()['address_prefix']
self.blocks_confirmed = coin_settings['blocks_confirmed']
self._restore_height = coin_settings.get('restore_height', 0)
self.setFeePriority(coin_settings.get('fee_priority', 2))
@@ -165,7 +167,7 @@ class XMRInterface(CoinInterface):
Kbv = self.getPubkey(key_view)
Kbs = self.getPubkey(key_spend)
address_b58 = xmr_util.encode_address(Kbv, Kbs)
address_b58 = xmr_util.encode_address(Kbv, Kbs, self._addr_prefix)
params = {
'filename': self._wallet_filename,
@@ -289,7 +291,7 @@ class XMRInterface(CoinInterface):
def getAddressFromKeys(self, key_view: bytes, key_spend: bytes) -> str:
pk_view = self.getPubkey(key_view)
pk_spend = self.getPubkey(key_spend)
return xmr_util.encode_address(pk_view, pk_spend)
return xmr_util.encode_address(pk_view, pk_spend, self._addr_prefix)
def verifyKey(self, k: int) -> bool:
i = b2i(k)
@@ -317,7 +319,7 @@ class XMRInterface(CoinInterface):
return ed25519_add(Ka, Kb)
def encodeSharedAddress(self, Kbv: bytes, Kbs: bytes) -> str:
return xmr_util.encode_address(Kbv, Kbs)
return xmr_util.encode_address(Kbv, Kbs, self._addr_prefix)
def publishBLockTx(self, kbv: bytes, Kbs: bytes, output_amount: int, feerate: int, unlock_time: int = 0) -> bytes:
with self._mx_wallet:
@@ -325,7 +327,7 @@ class XMRInterface(CoinInterface):
self.rpc_wallet('refresh')
Kbv = self.getPubkey(kbv)
shared_addr = xmr_util.encode_address(Kbv, Kbs)
shared_addr = xmr_util.encode_address(Kbv, Kbs, self._addr_prefix)
params = {'destinations': [{'amount': output_amount, 'address': shared_addr}], 'unlock_time': unlock_time}
if self._fee_priority > 0:
@@ -339,7 +341,7 @@ class XMRInterface(CoinInterface):
def findTxB(self, kbv, Kbs, cb_swap_value, cb_block_confirmed, restore_height, bid_sender):
with self._mx_wallet:
Kbv = self.getPubkey(kbv)
address_b58 = xmr_util.encode_address(Kbv, Kbs)
address_b58 = xmr_util.encode_address(Kbv, Kbs, self._addr_prefix)
kbv_le = kbv[::-1]
params = {
@@ -417,7 +419,7 @@ class XMRInterface(CoinInterface):
with self._mx_wallet:
Kbv = self.getPubkey(kbv)
Kbs = self.getPubkey(kbs)
address_b58 = xmr_util.encode_address(Kbv, Kbs)
address_b58 = xmr_util.encode_address(Kbv, Kbs, self._addr_prefix)
wallet_filename = address_b58 + '_spend'
@@ -504,7 +506,7 @@ class XMRInterface(CoinInterface):
with self._mx_wallet:
try:
Kbv = self.getPubkey(kbv)
address_b58 = xmr_util.encode_address(Kbv, Kbs)
address_b58 = xmr_util.encode_address(Kbv, Kbs, self._addr_prefix)
wallet_file = address_b58 + '_spend'
try:
self.openWallet(wallet_file)

View File

@@ -67,6 +67,7 @@ def dumpje(jin):
def SerialiseNum(n: int) -> bytes:
# For script
if n == 0:
return bytes((0x00,))
if n > 0 and n <= 16:
@@ -85,6 +86,7 @@ def SerialiseNum(n: int) -> bytes:
def DeserialiseNum(b: bytes, o: int = 0) -> int:
# For script
if b[o] == 0:
return 0
if b[o] > 0x50 and b[o] <= 0x50 + 16:

23
basicswap/util/integer.py Normal file
View File

@@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
# Copyright (c) 2024 tecnovert
# Distributed under the MIT software license, see the accompanying
# file LICENSE or http://www.opensource.org/licenses/mit-license.php.
def decode_varint(b: bytes) -> int:
i = 0
shift = 0
for c in b:
i += (c & 0x7F) << shift
shift += 7
return i
def encode_varint(i: int) -> bytes:
b = bytearray()
while i > 0x7F:
b += bytes(((i & 0x7F) | 0x80,))
i = (i >> 7)
b += bytes((i,))
return b

View File

@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
import basicswap.contrib.Keccak as Keccak
from basicswap.util.integer import encode_varint
from .contrib.MoneroPy.base58 import encode as xmr_b58encode
@@ -9,8 +10,9 @@ def cn_fast_hash(s):
return k.Keccak((len(s) * 8, s.hex()), 1088, 512, 32 * 8, False).lower() # r = bitrate = 1088, c = capacity, n = output length in bits
def encode_address(view_point, spend_point, version=18):
buf = bytes((version,)) + spend_point + view_point
def encode_address(view_point: bytes, spend_point: bytes, version=18) -> str:
prefix_bytes = version if isinstance(version, bytes) else encode_varint(version)
buf = prefix_bytes + spend_point + view_point
h = cn_fast_hash(buf)
buf = buf + bytes.fromhex(h[0: 8])