mirror of
https://github.com/Chia-Network/chia-blockchain.git
synced 2026-08-24 10:05:29 -05:00
Remove references to old offer mod (#15694)
* Remove references to old offer mod * Add guards in RPC against parsing old offers * Fix benchmark test * test coverage
This commit is contained in:
@@ -1127,7 +1127,6 @@ class DataLayerWallet:
|
||||
driver_dict: Dict[bytes32, PuzzleInfo],
|
||||
solver: Solver,
|
||||
fee: uint64 = uint64(0),
|
||||
old: bool = False,
|
||||
) -> Offer:
|
||||
dl_wallet = None
|
||||
for wallet in wallet_state_manager.wallets.values():
|
||||
@@ -1190,7 +1189,7 @@ class DataLayerWallet:
|
||||
for k, v in offer_dict.items()
|
||||
if v > 0
|
||||
}
|
||||
return Offer(requested_payments, SpendBundle.aggregate(all_bundles), driver_dict, old)
|
||||
return Offer(requested_payments, SpendBundle.aggregate(all_bundles), driver_dict)
|
||||
|
||||
@staticmethod
|
||||
async def finish_graftroot_solutions(offer: Offer, solver: Solver) -> Offer:
|
||||
@@ -1264,7 +1263,7 @@ class DataLayerWallet:
|
||||
spend = new_spend
|
||||
new_spends.append(spend)
|
||||
|
||||
return Offer({}, SpendBundle(new_spends, offer.aggregated_signature()), offer.driver_dict, offer.old)
|
||||
return Offer({}, SpendBundle(new_spends, offer.aggregated_signature()), offer.driver_dict)
|
||||
|
||||
@staticmethod
|
||||
async def get_offer_summary(offer: Offer) -> Dict[str, Any]:
|
||||
|
||||
@@ -3,6 +3,7 @@ from __future__ import annotations
|
||||
import dataclasses
|
||||
import json
|
||||
import logging
|
||||
import zlib
|
||||
from pathlib import Path
|
||||
from typing import Any, ClassVar, Dict, List, Optional, Set, Tuple, Union
|
||||
|
||||
@@ -1674,14 +1675,12 @@ class WalletRpcApi:
|
||||
|
||||
async def get_offer_summary(self, request) -> EndpointResult:
|
||||
offer_hex: str = request["offer"]
|
||||
offer = Offer.from_bech32(offer_hex)
|
||||
offered, requested, infos = offer.summary()
|
||||
|
||||
###
|
||||
# This is temporary code, delete it when we no longer care about incorrectly parsing CAT1s
|
||||
# This is temporary code, delete it when we no longer care about incorrectly parsing CAT1s or old offers
|
||||
# There's also temp code in test_wallet_rpc.py and wallet_funcs.py
|
||||
from chia.util.bech32m import bech32_decode, convertbits
|
||||
from chia.wallet.util.puzzle_compression import decompress_object_with_puzzles
|
||||
from chia.wallet.util.puzzle_compression import OFFER_MOD_OLD, decompress_object_with_puzzles
|
||||
|
||||
hrpgot, data = bech32_decode(offer_hex, max_length=len(offer_hex))
|
||||
if data is None:
|
||||
@@ -1690,8 +1689,11 @@ class WalletRpcApi:
|
||||
decoded_bytes = bytes(decoded)
|
||||
try:
|
||||
decompressed_bytes = decompress_object_with_puzzles(decoded_bytes)
|
||||
except TypeError:
|
||||
except zlib.error:
|
||||
decompressed_bytes = decoded_bytes
|
||||
###
|
||||
###
|
||||
# This is temporary code, delete it when we no longer care about incorrectly parsing CAT1s
|
||||
bundle = SpendBundle.from_bytes(decompressed_bytes)
|
||||
for spend in bundle.coin_spends:
|
||||
mod, _ = spend.puzzle_reveal.to_program().uncurry()
|
||||
@@ -1700,6 +1702,14 @@ class WalletRpcApi:
|
||||
):
|
||||
raise ValueError("CAT1s are no longer supported")
|
||||
###
|
||||
###
|
||||
# This is temporary code, delete it when we no longer care about incorrectly parsing old offers
|
||||
if bytes(OFFER_MOD_OLD) in decompressed_bytes:
|
||||
raise ValueError("Old offer format is no longer supported")
|
||||
###
|
||||
|
||||
offer = Offer.from_bech32(offer_hex)
|
||||
offered, requested, infos = offer.summary()
|
||||
|
||||
if request.get("advanced", False):
|
||||
return {
|
||||
@@ -1714,6 +1724,26 @@ class WalletRpcApi:
|
||||
|
||||
async def check_offer_validity(self, request) -> EndpointResult:
|
||||
offer_hex: str = request["offer"]
|
||||
|
||||
###
|
||||
# This is temporary code, delete it when we no longer care about incorrectly parsing old offers
|
||||
# There's also temp code in test_wallet_rpc.py
|
||||
from chia.util.bech32m import bech32_decode, convertbits
|
||||
from chia.wallet.util.puzzle_compression import OFFER_MOD_OLD, decompress_object_with_puzzles
|
||||
|
||||
hrpgot, data = bech32_decode(offer_hex, max_length=len(offer_hex))
|
||||
if data is None:
|
||||
raise ValueError("Invalid Offer") # pragma: no cover
|
||||
decoded = convertbits(list(data), 5, 8, False)
|
||||
decoded_bytes = bytes(decoded)
|
||||
try:
|
||||
decompressed_bytes = decompress_object_with_puzzles(decoded_bytes)
|
||||
except zlib.error:
|
||||
decompressed_bytes = decoded_bytes
|
||||
if bytes(OFFER_MOD_OLD) in decompressed_bytes:
|
||||
raise ValueError("Old offer format is no longer supported")
|
||||
###
|
||||
|
||||
offer = Offer.from_bech32(offer_hex)
|
||||
peer = self.service.get_full_node_peer()
|
||||
return {
|
||||
@@ -1723,6 +1753,26 @@ class WalletRpcApi:
|
||||
|
||||
async def take_offer(self, request) -> EndpointResult:
|
||||
offer_hex: str = request["offer"]
|
||||
|
||||
###
|
||||
# This is temporary code, delete it when we no longer care about incorrectly parsing old offers
|
||||
# There's also temp code in test_wallet_rpc.py
|
||||
from chia.util.bech32m import bech32_decode, convertbits
|
||||
from chia.wallet.util.puzzle_compression import OFFER_MOD_OLD, decompress_object_with_puzzles
|
||||
|
||||
hrpgot, data = bech32_decode(offer_hex, max_length=len(offer_hex))
|
||||
if data is None:
|
||||
raise ValueError("Invalid Offer") # pragma: no cover
|
||||
decoded = convertbits(list(data), 5, 8, False)
|
||||
decoded_bytes = bytes(decoded)
|
||||
try:
|
||||
decompressed_bytes = decompress_object_with_puzzles(decoded_bytes)
|
||||
except zlib.error:
|
||||
decompressed_bytes = decoded_bytes
|
||||
if bytes(OFFER_MOD_OLD) in decompressed_bytes:
|
||||
raise ValueError("Old offer format is no longer supported")
|
||||
###
|
||||
|
||||
offer = Offer.from_bech32(offer_hex)
|
||||
fee: uint64 = uint64(request.get("fee", 0))
|
||||
min_coin_amount: uint64 = uint64(request.get("min_coin_amount", 0))
|
||||
|
||||
@@ -39,14 +39,7 @@ from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import (
|
||||
calculate_synthetic_secret_key,
|
||||
puzzle_for_pk,
|
||||
)
|
||||
from chia.wallet.trading.offer import (
|
||||
OFFER_MOD,
|
||||
OFFER_MOD_HASH,
|
||||
OFFER_MOD_OLD,
|
||||
OFFER_MOD_OLD_HASH,
|
||||
NotarizedPayment,
|
||||
Offer,
|
||||
)
|
||||
from chia.wallet.trading.offer import OFFER_MOD, OFFER_MOD_HASH, NotarizedPayment, Offer
|
||||
from chia.wallet.transaction_record import TransactionRecord
|
||||
from chia.wallet.uncurried_puzzle import uncurry_puzzle
|
||||
from chia.wallet.util.compute_memos import compute_memos
|
||||
@@ -800,10 +793,7 @@ class NFTWallet:
|
||||
fee: uint64,
|
||||
min_coin_amount: Optional[uint64] = None,
|
||||
max_coin_amount: Optional[uint64] = None,
|
||||
old: bool = False,
|
||||
) -> Offer:
|
||||
DESIRED_OFFER_MOD = OFFER_MOD_OLD if old else OFFER_MOD
|
||||
DESIRED_OFFER_MOD_HASH = OFFER_MOD_OLD_HASH if old else OFFER_MOD_HASH
|
||||
# First, let's take note of all the royalty enabled NFTs
|
||||
royalty_nft_asset_dict: Dict[bytes32, int] = {}
|
||||
for asset, amount in offer_dict.items():
|
||||
@@ -836,9 +826,7 @@ class NFTWallet:
|
||||
for asset, amount in fungible_asset_dict.items(): # requested fungible items
|
||||
if amount > 0 and offer_side_royalty_split > 0:
|
||||
settlement_ph: bytes32 = (
|
||||
DESIRED_OFFER_MOD_HASH
|
||||
if asset is None
|
||||
else construct_puzzle(driver_dict[asset], DESIRED_OFFER_MOD).get_tree_hash()
|
||||
OFFER_MOD_HASH if asset is None else construct_puzzle(driver_dict[asset], OFFER_MOD).get_tree_hash()
|
||||
)
|
||||
trade_prices.append((uint64(math.floor(amount / offer_side_royalty_split)), settlement_ph))
|
||||
|
||||
@@ -914,19 +902,19 @@ class NFTWallet:
|
||||
notarized_payments: Dict[Optional[bytes32], List[NotarizedPayment]] = Offer.notarize_payments(
|
||||
requested_payments, list(all_offered_coins)
|
||||
)
|
||||
announcements_to_assert = Offer.calculate_announcements(notarized_payments, driver_dict, old)
|
||||
announcements_to_assert = Offer.calculate_announcements(notarized_payments, driver_dict)
|
||||
for asset, payments in royalty_payments.items():
|
||||
if asset is None: # xch offer
|
||||
offer_puzzle = DESIRED_OFFER_MOD
|
||||
royalty_ph = DESIRED_OFFER_MOD_HASH
|
||||
offer_puzzle = OFFER_MOD
|
||||
royalty_ph = OFFER_MOD_HASH
|
||||
else:
|
||||
offer_puzzle = construct_puzzle(driver_dict[asset], DESIRED_OFFER_MOD)
|
||||
offer_puzzle = construct_puzzle(driver_dict[asset], OFFER_MOD)
|
||||
royalty_ph = offer_puzzle.get_tree_hash()
|
||||
announcements_to_assert.extend(
|
||||
[
|
||||
Announcement(royalty_ph, Program.to((launcher_id, [p.as_condition_args()])).get_tree_hash())
|
||||
for launcher_id, p in payments
|
||||
if p.amount > 0 or old
|
||||
if p.amount > 0
|
||||
]
|
||||
)
|
||||
|
||||
@@ -949,10 +937,8 @@ class NFTWallet:
|
||||
payment_sum = sum(p.amount for _, p in payments)
|
||||
tx = await wallet.generate_signed_transaction(
|
||||
abs(amount),
|
||||
DESIRED_OFFER_MOD_HASH,
|
||||
primaries=[Payment(DESIRED_OFFER_MOD_HASH, uint64(payment_sum))]
|
||||
if payment_sum > 0 or old
|
||||
else [],
|
||||
OFFER_MOD_HASH,
|
||||
primaries=[Payment(OFFER_MOD_HASH, uint64(payment_sum))] if payment_sum > 0 else [],
|
||||
fee=fee,
|
||||
coins=offered_coins_by_asset[asset],
|
||||
puzzle_announcements_to_consume=announcements_to_assert,
|
||||
@@ -962,21 +948,21 @@ class NFTWallet:
|
||||
assert asset is not None
|
||||
txs = await wallet.generate_signed_transaction(
|
||||
[abs(amount)],
|
||||
[DESIRED_OFFER_MOD_HASH],
|
||||
[OFFER_MOD_HASH],
|
||||
fee=fee_left_to_pay,
|
||||
coins=offered_coins_by_asset[asset],
|
||||
puzzle_announcements_to_consume=announcements_to_assert,
|
||||
trade_prices_list=[
|
||||
list(price)
|
||||
for price in trade_prices
|
||||
if math.floor(price[0] * (offered_royalty_percentages[asset] / 10000)) != 0 or old
|
||||
if math.floor(price[0] * (offered_royalty_percentages[asset] / 10000)) != 0
|
||||
],
|
||||
)
|
||||
else:
|
||||
payments = royalty_payments[asset] if asset in royalty_payments else []
|
||||
txs = await wallet.generate_signed_transaction(
|
||||
[abs(amount), sum(p.amount for _, p in payments)],
|
||||
[DESIRED_OFFER_MOD_HASH, DESIRED_OFFER_MOD_HASH],
|
||||
[OFFER_MOD_HASH, OFFER_MOD_HASH],
|
||||
fee=fee_left_to_pay,
|
||||
coins=offered_coins_by_asset[asset],
|
||||
puzzle_announcements_to_consume=announcements_to_assert,
|
||||
@@ -990,7 +976,7 @@ class NFTWallet:
|
||||
|
||||
# Skip it if we're paying 0 royalties
|
||||
payments = royalty_payments[asset] if asset in royalty_payments else []
|
||||
if not old and sum(p.amount for _, p in payments) == 0:
|
||||
if sum(p.amount for _, p in payments) == 0:
|
||||
continue
|
||||
|
||||
# We cannot create coins with the same puzzle hash and amount
|
||||
@@ -1020,7 +1006,7 @@ class NFTWallet:
|
||||
None,
|
||||
[
|
||||
Payment(
|
||||
DESIRED_OFFER_MOD_HASH,
|
||||
OFFER_MOD_HASH,
|
||||
uint64(sum(p.amount for _, p in duplicate_payments)),
|
||||
).as_condition_args()
|
||||
],
|
||||
@@ -1028,10 +1014,10 @@ class NFTWallet:
|
||||
).cons(inner_royalty_sol)
|
||||
|
||||
if asset is None: # xch offer
|
||||
offer_puzzle = DESIRED_OFFER_MOD
|
||||
royalty_ph = DESIRED_OFFER_MOD_HASH
|
||||
offer_puzzle = OFFER_MOD
|
||||
royalty_ph = OFFER_MOD_HASH
|
||||
else:
|
||||
offer_puzzle = construct_puzzle(driver_dict[asset], DESIRED_OFFER_MOD)
|
||||
offer_puzzle = construct_puzzle(driver_dict[asset], OFFER_MOD)
|
||||
royalty_ph = offer_puzzle.get_tree_hash()
|
||||
if royalty_coin is None:
|
||||
for tx in txs:
|
||||
@@ -1072,7 +1058,7 @@ class NFTWallet:
|
||||
"sibling_solutions": "()",
|
||||
}
|
||||
)
|
||||
royalty_sol = solve_puzzle(driver_dict[asset], solver, DESIRED_OFFER_MOD, inner_royalty_sol)
|
||||
royalty_sol = solve_puzzle(driver_dict[asset], solver, OFFER_MOD, inner_royalty_sol)
|
||||
|
||||
new_coin_spend = CoinSpend(royalty_coin, offer_puzzle, royalty_sol)
|
||||
additional_bundles.append(SpendBundle([new_coin_spend], G2Element()))
|
||||
@@ -1090,7 +1076,7 @@ class NFTWallet:
|
||||
# Finally, assemble the tx records properly
|
||||
txs_bundle = SpendBundle.aggregate([tx.spend_bundle for tx in all_transactions if tx.spend_bundle is not None])
|
||||
aggregate_bundle = SpendBundle.aggregate([txs_bundle, *additional_bundles])
|
||||
offer = Offer(notarized_payments, aggregate_bundle, driver_dict, old)
|
||||
offer = Offer(notarized_payments, aggregate_bundle, driver_dict)
|
||||
return offer
|
||||
|
||||
async def set_bulk_nft_did(
|
||||
|
||||
@@ -43,7 +43,6 @@
|
||||
"pool_waitingroom_innerpuz": "a317541a765bf8375e1c6e7c13503d0d2cbf56cacad5182befe947e78e2c0307",
|
||||
"rom_bootstrap_generator": "161bade1f822dcd62ab712ebaf30f3922a301e48a639e4295c5685f8bece7bd9",
|
||||
"settlement_payments": "cfbfdeed5c4ca2de3d0bf520b9cb4bb7743a359bd2e6a188d19ce7dffc21d3e7",
|
||||
"settlement_payments_old": "bae24162efbd568f89bc7a340798a6118df0189eb9e3f8697bcea27af99f8f79",
|
||||
"sha256tree_module": "eb4ead6576048c9d730b5ced00646c7fdd390649cfdf48a00de1590cdd8ee18f",
|
||||
"singleton_launcher": "eff07522495060c066f66f32acc2a77e3a3e737aca8baea4d1a64ea4cdc13da9",
|
||||
"singleton_top_layer": "24e044101e57b3d8c908b8a38ad57848afd29d3eecc439dba45f4412df4954fd",
|
||||
|
||||
@@ -1,45 +0,0 @@
|
||||
(mod notarized_payments
|
||||
;; `notarized_payments` is a list of notarized coin payments
|
||||
;; a notarized coin payment is `(nonce . ((puzzle_hash amount ...) (puzzle_hash amount ...) ...))`
|
||||
;; Each notarized coin payment creates some `(CREATE_COIN puzzle_hash amount ...)` payments
|
||||
;; and a `(CREATE_PUZZLE_ANNOUNCEMENT (sha256tree notarized_coin_payment))` announcement
|
||||
;; The idea is the other side of this trade requires observing the announcement from a
|
||||
;; `settlement_payments` puzzle hash as a condition of one or more coin spends.
|
||||
|
||||
(include condition_codes.clib)
|
||||
|
||||
(defun sha256tree (TREE)
|
||||
(if (l TREE)
|
||||
(sha256 2 (sha256tree (f TREE)) (sha256tree (r TREE)))
|
||||
(sha256 1 TREE)
|
||||
)
|
||||
)
|
||||
|
||||
(defun create_coins_for_payment (payment_params so_far)
|
||||
(if payment_params
|
||||
(c (c CREATE_COIN (f payment_params)) (create_coins_for_payment (r payment_params) so_far))
|
||||
so_far
|
||||
)
|
||||
)
|
||||
|
||||
(defun-inline create_announcement_for_payment (notarized_payment)
|
||||
(list CREATE_PUZZLE_ANNOUNCEMENT
|
||||
(sha256tree notarized_payment))
|
||||
)
|
||||
|
||||
(defun-inline augment_condition_list (notarized_payment so_far)
|
||||
(c
|
||||
(create_announcement_for_payment notarized_payment)
|
||||
(create_coins_for_payment (r notarized_payment) so_far)
|
||||
)
|
||||
)
|
||||
|
||||
(defun construct_condition_list (notarized_payments)
|
||||
(if notarized_payments
|
||||
(augment_condition_list (f notarized_payments) (construct_condition_list (r notarized_payments)))
|
||||
()
|
||||
)
|
||||
)
|
||||
|
||||
(construct_condition_list notarized_payments)
|
||||
)
|
||||
@@ -1 +0,0 @@
|
||||
ff02ffff01ff02ff0affff04ff02ffff04ff03ff80808080ffff04ffff01ffff333effff02ffff03ff05ffff01ff04ffff04ff0cffff04ffff02ff1effff04ff02ffff04ff09ff80808080ff808080ffff02ff16ffff04ff02ffff04ff19ffff04ffff02ff0affff04ff02ffff04ff0dff80808080ff808080808080ff8080ff0180ffff02ffff03ff05ffff01ff04ffff04ff08ff0980ffff02ff16ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff1effff04ff02ffff04ff09ff80808080ffff02ff1effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080
|
||||
@@ -24,7 +24,7 @@ from chia.wallet.payment import Payment
|
||||
from chia.wallet.puzzle_drivers import PuzzleInfo, Solver
|
||||
from chia.wallet.puzzles.load_clvm import load_clvm_maybe_recompile
|
||||
from chia.wallet.trade_record import TradeRecord
|
||||
from chia.wallet.trading.offer import OFFER_MOD_OLD_HASH, NotarizedPayment, Offer
|
||||
from chia.wallet.trading.offer import NotarizedPayment, Offer
|
||||
from chia.wallet.trading.trade_status import TradeStatus
|
||||
from chia.wallet.trading.trade_store import TradeStore
|
||||
from chia.wallet.transaction_record import TransactionRecord
|
||||
@@ -460,7 +460,6 @@ class TradeManager:
|
||||
fee: uint64 = uint64(0),
|
||||
min_coin_amount: Optional[uint64] = None,
|
||||
max_coin_amount: Optional[uint64] = None,
|
||||
old: bool = False,
|
||||
reuse_puzhash: Optional[bool] = None,
|
||||
) -> Union[Tuple[Literal[True], Offer, None], Tuple[Literal[False], None, str]]:
|
||||
"""
|
||||
@@ -554,7 +553,7 @@ class TradeManager:
|
||||
raise ValueError(f"Wallet for asset id {asset_id} is not properly integrated with TradeManager")
|
||||
|
||||
potential_special_offer: Optional[Offer] = await self.check_for_special_offer_making(
|
||||
offer_dict_no_ints, driver_dict, solver, fee, min_coin_amount, max_coin_amount, old
|
||||
offer_dict_no_ints, driver_dict, solver, fee, min_coin_amount, max_coin_amount
|
||||
)
|
||||
|
||||
if potential_special_offer is not None:
|
||||
@@ -564,7 +563,7 @@ class TradeManager:
|
||||
notarized_payments: Dict[Optional[bytes32], List[NotarizedPayment]] = Offer.notarize_payments(
|
||||
requested_payments, all_coins
|
||||
)
|
||||
announcements_to_assert = Offer.calculate_announcements(notarized_payments, driver_dict, old)
|
||||
announcements_to_assert = Offer.calculate_announcements(notarized_payments, driver_dict)
|
||||
|
||||
all_transactions: List[TransactionRecord] = []
|
||||
fee_left_to_pay: uint64 = fee
|
||||
@@ -580,7 +579,7 @@ class TradeManager:
|
||||
if wallet.type() == WalletType.STANDARD_WALLET:
|
||||
tx = await wallet.generate_signed_transaction(
|
||||
abs(offer_dict[id]),
|
||||
OFFER_MOD_OLD_HASH if old else Offer.ph(),
|
||||
Offer.ph(),
|
||||
fee=fee_left_to_pay,
|
||||
coins=set(selected_coins),
|
||||
puzzle_announcements_to_consume=announcements_to_assert,
|
||||
@@ -594,7 +593,7 @@ class TradeManager:
|
||||
txs = await wallet.generate_signed_transaction(
|
||||
# [abs(offer_dict[id])],
|
||||
amounts,
|
||||
[OFFER_MOD_OLD_HASH if old else Offer.ph()],
|
||||
[Offer.ph()],
|
||||
fee=fee_left_to_pay,
|
||||
coins=set(selected_coins),
|
||||
puzzle_announcements_to_consume=announcements_to_assert,
|
||||
@@ -605,7 +604,7 @@ class TradeManager:
|
||||
# ATTENTION: new_wallets
|
||||
txs = await wallet.generate_signed_transaction(
|
||||
[abs(offer_dict[id])],
|
||||
[OFFER_MOD_OLD_HASH if old else Offer.ph()],
|
||||
[Offer.ph()],
|
||||
fee=fee_left_to_pay,
|
||||
coins=set(selected_coins),
|
||||
puzzle_announcements_to_consume=announcements_to_assert,
|
||||
@@ -619,7 +618,7 @@ class TradeManager:
|
||||
[x.spend_bundle for x in all_transactions if x.spend_bundle is not None]
|
||||
)
|
||||
|
||||
offer = Offer(notarized_payments, total_spend_bundle, driver_dict, old)
|
||||
offer = Offer(notarized_payments, total_spend_bundle, driver_dict)
|
||||
return True, offer, None
|
||||
|
||||
except Exception as e:
|
||||
@@ -781,7 +780,6 @@ class TradeManager:
|
||||
fee=fee,
|
||||
min_coin_amount=min_coin_amount,
|
||||
max_coin_amount=max_coin_amount,
|
||||
old=offer.old,
|
||||
reuse_puzhash=reuse_puzhash,
|
||||
)
|
||||
if not result[0] or result[1] is None:
|
||||
@@ -846,7 +844,6 @@ class TradeManager:
|
||||
fee: uint64 = uint64(0),
|
||||
min_coin_amount: Optional[uint64] = None,
|
||||
max_coin_amount: Optional[uint64] = None,
|
||||
old: bool = False,
|
||||
) -> Optional[Offer]:
|
||||
for puzzle_info in driver_dict.values():
|
||||
if (
|
||||
@@ -856,7 +853,7 @@ class TradeManager:
|
||||
== AssetType.ROYALTY_TRANSFER_PROGRAM.value
|
||||
):
|
||||
return await NFTWallet.make_nft1_offer(
|
||||
self.wallet_state_manager, offer_dict, driver_dict, fee, min_coin_amount, max_coin_amount, old
|
||||
self.wallet_state_manager, offer_dict, driver_dict, fee, min_coin_amount, max_coin_amount
|
||||
)
|
||||
elif (
|
||||
puzzle_info.check_type(
|
||||
@@ -868,7 +865,7 @@ class TradeManager:
|
||||
and puzzle_info.also()["updater_hash"] == ACS_MU_PH # type: ignore
|
||||
):
|
||||
return await DataLayerWallet.make_update_offer(
|
||||
self.wallet_state_manager, offer_dict, driver_dict, solver, fee, old
|
||||
self.wallet_state_manager, offer_dict, driver_dict, solver, fee
|
||||
)
|
||||
return None
|
||||
|
||||
|
||||
@@ -34,9 +34,7 @@ from chia.wallet.util.puzzle_compression import (
|
||||
lowest_best_version,
|
||||
)
|
||||
|
||||
OFFER_MOD_OLD = load_clvm_maybe_recompile("settlement_payments_old.clsp")
|
||||
OFFER_MOD = load_clvm_maybe_recompile("settlement_payments.clsp")
|
||||
OFFER_MOD_OLD_HASH = OFFER_MOD_OLD.get_tree_hash()
|
||||
OFFER_MOD_HASH = OFFER_MOD.get_tree_hash()
|
||||
ZERO_32 = bytes32([0] * 32)
|
||||
|
||||
@@ -73,7 +71,6 @@ class Offer:
|
||||
] # The key is the asset id of the asset being requested
|
||||
_bundle: SpendBundle
|
||||
driver_dict: Dict[bytes32, PuzzleInfo] # asset_id -> asset driver
|
||||
old: bool = False
|
||||
|
||||
# this is a cache of the coin additions made by the SpendBundle (_bundle)
|
||||
# ordered by the coin being spent
|
||||
@@ -109,18 +106,15 @@ class Offer:
|
||||
def calculate_announcements(
|
||||
notarized_payments: Dict[Optional[bytes32], List[NotarizedPayment]],
|
||||
driver_dict: Dict[bytes32, PuzzleInfo],
|
||||
old: bool = False,
|
||||
) -> List[Announcement]:
|
||||
announcements: List[Announcement] = []
|
||||
for asset_id, payments in notarized_payments.items():
|
||||
if asset_id is not None:
|
||||
if asset_id not in driver_dict:
|
||||
raise ValueError("Cannot calculate announcements without driver of requested item")
|
||||
settlement_ph: bytes32 = construct_puzzle(
|
||||
driver_dict[asset_id], OFFER_MOD_OLD if old else OFFER_MOD
|
||||
).get_tree_hash()
|
||||
settlement_ph: bytes32 = construct_puzzle(driver_dict[asset_id], OFFER_MOD).get_tree_hash()
|
||||
else:
|
||||
settlement_ph = OFFER_MOD_OLD_HASH if old else OFFER_MOD_HASH
|
||||
settlement_ph = OFFER_MOD_HASH
|
||||
|
||||
msg: bytes32 = Program.to((payments[0].nonce, [p.as_condition_args() for p in payments])).get_tree_hash()
|
||||
announcements.append(Announcement(settlement_ph, msg))
|
||||
@@ -197,7 +191,7 @@ class Offer:
|
||||
expected_num_matches: int = 0
|
||||
offered_amounts: List[int] = []
|
||||
for condition in conditions.as_iter():
|
||||
if condition.first() == 51 and condition.rest().first() in [OFFER_MOD_HASH, OFFER_MOD_OLD_HASH]:
|
||||
if condition.first() == 51 and condition.rest().first() == OFFER_MOD_HASH:
|
||||
expected_num_matches += 1
|
||||
offered_amounts.append(condition.rest().rest().first().as_int())
|
||||
|
||||
@@ -215,14 +209,9 @@ class Offer:
|
||||
a
|
||||
for a in matching_spend_additions
|
||||
if a.puzzle_hash
|
||||
in [
|
||||
construct_puzzle(puzzle_driver, OFFER_MOD_OLD_HASH).get_tree_hash_precalc( # type: ignore
|
||||
OFFER_MOD_OLD_HASH
|
||||
),
|
||||
construct_puzzle(puzzle_driver, OFFER_MOD_HASH).get_tree_hash_precalc( # type: ignore
|
||||
OFFER_MOD_HASH
|
||||
),
|
||||
]
|
||||
== construct_puzzle(puzzle_driver, OFFER_MOD_HASH).get_tree_hash_precalc( # type: ignore
|
||||
OFFER_MOD_HASH
|
||||
)
|
||||
]
|
||||
if len(matching_spend_additions) == expected_num_matches:
|
||||
coins_for_this_spend.extend(matching_spend_additions)
|
||||
@@ -231,9 +220,7 @@ class Offer:
|
||||
else:
|
||||
# It's much easier if the asset is bare XCH
|
||||
asset_id = None
|
||||
coins_for_this_spend.extend(
|
||||
[a for a in additions if a.puzzle_hash in [OFFER_MOD_HASH, OFFER_MOD_OLD_HASH]]
|
||||
)
|
||||
coins_for_this_spend.extend([a for a in additions if a.puzzle_hash == OFFER_MOD_HASH])
|
||||
|
||||
# We only care about unspent coins
|
||||
coins_for_this_spend = [c for c in coins_for_this_spend if c not in self._bundle.removals()]
|
||||
@@ -408,8 +395,7 @@ class Offer:
|
||||
total_requested_payments: Dict[Optional[bytes32], List[NotarizedPayment]] = {}
|
||||
total_bundle = SpendBundle([], G2Element())
|
||||
total_driver_dict: Dict[bytes32, PuzzleInfo] = {}
|
||||
old: bool = False
|
||||
for i, offer in enumerate(offers):
|
||||
for offer in offers:
|
||||
# First check for any overlap in inputs
|
||||
total_inputs: Set[Coin] = {cs.coin for cs in total_bundle.coin_spends}
|
||||
offer_inputs: Set[Coin] = {cs.coin for cs in offer._bundle.coin_spends}
|
||||
@@ -429,13 +415,8 @@ class Offer:
|
||||
|
||||
total_bundle = SpendBundle.aggregate([total_bundle, offer._bundle])
|
||||
total_driver_dict.update(offer.driver_dict)
|
||||
if i == 0:
|
||||
old = offer.old
|
||||
else:
|
||||
if offer.old != old:
|
||||
raise ValueError("Attempting to aggregate two offers with different mods")
|
||||
|
||||
return cls(total_requested_payments, total_bundle, total_driver_dict, old)
|
||||
return cls(total_requested_payments, total_bundle, total_driver_dict)
|
||||
|
||||
# Validity is defined by having enough funds within the offer to satisfy both sides
|
||||
def is_valid(self) -> bool:
|
||||
@@ -480,17 +461,11 @@ class Offer:
|
||||
|
||||
for coin in offered_coins:
|
||||
if asset_id:
|
||||
if coin.puzzle_hash == construct_puzzle(
|
||||
self.driver_dict[asset_id], OFFER_MOD_OLD_HASH # type: ignore
|
||||
).get_tree_hash_precalc(OFFER_MOD_OLD_HASH):
|
||||
offer_mod: Program = OFFER_MOD_OLD
|
||||
else:
|
||||
offer_mod = OFFER_MOD
|
||||
siblings: str = "("
|
||||
sibling_spends: str = "("
|
||||
sibling_puzzles: str = "("
|
||||
sibling_solutions: str = "("
|
||||
disassembled_offer_mod: str = disassemble(offer_mod)
|
||||
disassembled_offer_mod: str = disassemble(OFFER_MOD)
|
||||
for sibling_coin in offered_coins:
|
||||
if sibling_coin != coin:
|
||||
siblings += (
|
||||
@@ -523,20 +498,16 @@ class Offer:
|
||||
"sibling_solutions": sibling_solutions,
|
||||
}
|
||||
),
|
||||
offer_mod,
|
||||
OFFER_MOD,
|
||||
Program.to(coin_to_solution_dict[coin]),
|
||||
)
|
||||
else:
|
||||
if coin.puzzle_hash == OFFER_MOD_OLD_HASH:
|
||||
offer_mod = OFFER_MOD_OLD
|
||||
else:
|
||||
offer_mod = OFFER_MOD
|
||||
solution = Program.to(coin_to_solution_dict[coin])
|
||||
|
||||
completion_spends.append(
|
||||
CoinSpend(
|
||||
coin,
|
||||
construct_puzzle(self.driver_dict[asset_id], offer_mod) if asset_id else offer_mod,
|
||||
construct_puzzle(self.driver_dict[asset_id], OFFER_MOD) if asset_id else OFFER_MOD,
|
||||
solution,
|
||||
)
|
||||
)
|
||||
@@ -586,11 +557,7 @@ class Offer:
|
||||
requested_payments: Dict[Optional[bytes32], List[NotarizedPayment]] = {}
|
||||
driver_dict: Dict[bytes32, PuzzleInfo] = {}
|
||||
leftover_coin_spends: List[CoinSpend] = []
|
||||
old: bool = False
|
||||
for coin_spend in bundle.coin_spends:
|
||||
if not old and bytes(OFFER_MOD_OLD) in bytes(coin_spend):
|
||||
old = True
|
||||
|
||||
driver = match_puzzle(uncurry_puzzle(coin_spend.puzzle_reveal.to_program()))
|
||||
if driver is not None:
|
||||
asset_id = create_asset_id(driver)
|
||||
@@ -611,7 +578,7 @@ class Offer:
|
||||
else:
|
||||
leftover_coin_spends.append(coin_spend)
|
||||
|
||||
return cls(requested_payments, SpendBundle(leftover_coin_spends, bundle.aggregated_signature), driver_dict, old)
|
||||
return cls(requested_payments, SpendBundle(leftover_coin_spends, bundle.aggregated_signature), driver_dict)
|
||||
|
||||
def name(self) -> bytes32:
|
||||
return self.to_spend_bundle().name()
|
||||
|
||||
@@ -20,7 +20,9 @@ LEGACY_CAT_MOD = Program.fromhex(
|
||||
"ff02ffff01ff02ff5effff04ff02ffff04ffff04ff05ffff04ffff0bff2cff0580ffff04ff0bff80808080ffff04ffff02ff17ff2f80ffff04ff5fffff04ffff02ff2effff04ff02ffff04ff17ff80808080ffff04ffff0bff82027fff82057fff820b7f80ffff04ff81bfffff04ff82017fffff04ff8202ffffff04ff8205ffffff04ff820bffff80808080808080808080808080ffff04ffff01ffffffff81ca3dff46ff0233ffff3c04ff01ff0181cbffffff02ff02ffff03ff05ffff01ff02ff32ffff04ff02ffff04ff0dffff04ffff0bff22ffff0bff2cff3480ffff0bff22ffff0bff22ffff0bff2cff5c80ff0980ffff0bff22ff0bffff0bff2cff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ff0bffff01ff02ffff03ffff09ffff02ff2effff04ff02ffff04ff13ff80808080ff820b9f80ffff01ff02ff26ffff04ff02ffff04ffff02ff13ffff04ff5fffff04ff17ffff04ff2fffff04ff81bfffff04ff82017fffff04ff1bff8080808080808080ffff04ff82017fff8080808080ffff01ff088080ff0180ffff01ff02ffff03ff17ffff01ff02ffff03ffff20ff81bf80ffff0182017fffff01ff088080ff0180ffff01ff088080ff018080ff0180ffff04ffff04ff05ff2780ffff04ffff10ff0bff5780ff778080ff02ffff03ff05ffff01ff02ffff03ffff09ffff02ffff03ffff09ff11ff7880ffff0159ff8080ff0180ffff01818f80ffff01ff02ff7affff04ff02ffff04ff0dffff04ff0bffff04ffff04ff81b9ff82017980ff808080808080ffff01ff02ff5affff04ff02ffff04ffff02ffff03ffff09ff11ff7880ffff01ff04ff78ffff04ffff02ff36ffff04ff02ffff04ff13ffff04ff29ffff04ffff0bff2cff5b80ffff04ff2bff80808080808080ff398080ffff01ff02ffff03ffff09ff11ff2480ffff01ff04ff24ffff04ffff0bff20ff2980ff398080ffff010980ff018080ff0180ffff04ffff02ffff03ffff09ff11ff7880ffff0159ff8080ff0180ffff04ffff02ff7affff04ff02ffff04ff0dffff04ff0bffff04ff17ff808080808080ff80808080808080ff0180ffff01ff04ff80ffff04ff80ff17808080ff0180ffffff02ffff03ff05ffff01ff04ff09ffff02ff26ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff0bff22ffff0bff2cff5880ffff0bff22ffff0bff22ffff0bff2cff5c80ff0580ffff0bff22ffff02ff32ffff04ff02ffff04ff07ffff04ffff0bff2cff2c80ff8080808080ffff0bff2cff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bff2cff058080ff0180ffff04ffff04ff28ffff04ff5fff808080ffff02ff7effff04ff02ffff04ffff04ffff04ff2fff0580ffff04ff5fff82017f8080ffff04ffff02ff7affff04ff02ffff04ff0bffff04ff05ffff01ff808080808080ffff04ff17ffff04ff81bfffff04ff82017fffff04ffff0bff8204ffffff02ff36ffff04ff02ffff04ff09ffff04ff820affffff04ffff0bff2cff2d80ffff04ff15ff80808080808080ff8216ff80ffff04ff8205ffffff04ff820bffff808080808080808080808080ff02ff2affff04ff02ffff04ff5fffff04ff3bffff04ffff02ffff03ff17ffff01ff09ff2dffff0bff27ffff02ff36ffff04ff02ffff04ff29ffff04ff57ffff04ffff0bff2cff81b980ffff04ff59ff80808080808080ff81b78080ff8080ff0180ffff04ff17ffff04ff05ffff04ff8202ffffff04ffff04ffff04ff24ffff04ffff0bff7cff2fff82017f80ff808080ffff04ffff04ff30ffff04ffff0bff81bfffff0bff7cff15ffff10ff82017fffff11ff8202dfff2b80ff8202ff808080ff808080ff138080ff80808080808080808080ff018080" # noqa
|
||||
)
|
||||
|
||||
OFFER_MOD_OLD = load_clvm_maybe_recompile("settlement_payments_old.clsp")
|
||||
OFFER_MOD_OLD = Program.fromhex(
|
||||
"ff02ffff01ff02ff0affff04ff02ffff04ff03ff80808080ffff04ffff01ffff333effff02ffff03ff05ffff01ff04ffff04ff0cffff04ffff02ff1effff04ff02ffff04ff09ff80808080ff808080ffff02ff16ffff04ff02ffff04ff19ffff04ffff02ff0affff04ff02ffff04ff0dff80808080ff808080808080ff8080ff0180ffff02ffff03ff05ffff01ff04ffff04ff08ff0980ffff02ff16ffff04ff02ffff04ff0dffff04ff0bff808080808080ffff010b80ff0180ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff1effff04ff02ffff04ff09ff80808080ffff02ff1effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080" # noqa
|
||||
)
|
||||
OFFER_MOD = load_clvm_maybe_recompile("settlement_payments.clsp")
|
||||
|
||||
# For backwards compatibility to work, we must assume that these mods (already deployed) will not change
|
||||
|
||||
@@ -12,9 +12,10 @@ from chia.types.spend_bundle import SpendBundle
|
||||
from chia.util.ints import uint64
|
||||
from chia.wallet.cat_wallet.cat_utils import CAT_MOD, construct_cat_puzzle
|
||||
from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import puzzle_for_pk
|
||||
from chia.wallet.trading.offer import OFFER_MOD, OFFER_MOD_OLD
|
||||
from chia.wallet.trading.offer import OFFER_MOD
|
||||
from chia.wallet.util.puzzle_compression import (
|
||||
LATEST_VERSION,
|
||||
OFFER_MOD_OLD,
|
||||
compress_object_with_puzzles,
|
||||
decompress_object_with_puzzles,
|
||||
lowest_best_version,
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1161,6 +1161,52 @@ async def test_offer_endpoints(wallet_rpc_environment: WalletRpcTestEnvironment)
|
||||
},
|
||||
)
|
||||
###
|
||||
###
|
||||
# This is temporary code, delete it when we no longer care about incorrectly parsing old offers
|
||||
# There's also temp code in wallet_rpc_api.py
|
||||
with pytest.raises(ValueError, match="Old offer format is no longer supported"):
|
||||
await wallet_1_rpc.fetch(
|
||||
"get_offer_summary",
|
||||
{
|
||||
"offer": "offer1qqr83wcuu2rykcmqvpsxygqq0qthwpmsrsutadthxda7ppk8wemm74e88h2dh265k7fv7kdk2etmg99xpm0yu8ddl4rkhl73mflmfasl4h75w6lllup4t7urp0mstehm8cnmc6mdxn0rvdejdfpway2ccm6srenn6urvdmgvand96gat25z42f4u2sh7ad7upvhfty77v6ak76dmrdxrzdgn89mlr58ya6j77yax8095r2u2g826yg9jq4q6xzt4g6yveqnhg6r77lrt3weksdwcwz5ava4t5mtdem5syjejwg53q6t5lfd2t5p6dds9dylj7jxw2fmquugdnkvke5jckmsr8ne4akwha9hv9y24x6shezhaxqjegegprjp6h8hua2a24lntev22zkxdkhya5u7k6uhenv2jwwf8nddcs99707290u0yw7jv8w500yarnlew75keam9mwejmanardkdpk6awxj7ndl9ka35zfvydvfj646fuq7j6zv5uzl3czrw76psrnaudu2d65mtez7m9sz9xat52s87v6vmlpmknvju0u4wq5kklflwuamnaczl8vkne284ehyamaaxuzkcdvpjg3tlt7cxhy0r6fammc0arha65nxcv7kpxmra5zck7emrn7v4teuk6473eh7l39mqp5zafdmygm0tf0hp2ug20fhk7mlkmve4atg76xv9mw0xe2ped72mvkqall4hstp0a9jsxyyasz6dl7zmka2kwfx94w0knut43r4x447w3shmw5alldevrdu2gthelcjt8h6775p92ktlmlg846varj62rghj67e2hyhlauwkkv6nhnvt7wm6tt2kh2xw6kze0ttxsqplfct7mk4jvnykm0arw2juvnmkudgyerj59dn4ja8r5avud67zd7mr2cl54skynhs4twu2qgwrcdzcchhfee008e30yazzwu96h2uhaprejkrgns5w8nds244k3uyfhtmmzne29hmmdsvvlrtr02w0nc0thtkpywwmmxuqfc0tsssdflned" # noqa: E501
|
||||
},
|
||||
)
|
||||
with pytest.raises(ValueError, match="Old offer format is no longer supported"):
|
||||
await wallet_1_rpc.fetch(
|
||||
"check_offer_validity",
|
||||
{
|
||||
"offer": "offer1qqr83wcuu2rykcmqvpsxygqq0qthwpmsrsutadthxda7ppk8wemm74e88h2dh265k7fv7kdk2etmg99xpm0yu8ddl4rkhl73mflmfasl4h75w6lllup4t7urp0mstehm8cnmc6mdxn0rvdejdfpway2ccm6srenn6urvdmgvand96gat25z42f4u2sh7ad7upvhfty77v6ak76dmrdxrzdgn89mlr58ya6j77yax8095r2u2g826yg9jq4q6xzt4g6yveqnhg6r77lrt3weksdwcwz5ava4t5mtdem5syjejwg53q6t5lfd2t5p6dds9dylj7jxw2fmquugdnkvke5jckmsr8ne4akwha9hv9y24x6shezhaxqjegegprjp6h8hua2a24lntev22zkxdkhya5u7k6uhenv2jwwf8nddcs99707290u0yw7jv8w500yarnlew75keam9mwejmanardkdpk6awxj7ndl9ka35zfvydvfj646fuq7j6zv5uzl3czrw76psrnaudu2d65mtez7m9sz9xat52s87v6vmlpmknvju0u4wq5kklflwuamnaczl8vkne284ehyamaaxuzkcdvpjg3tlt7cxhy0r6fammc0arha65nxcv7kpxmra5zck7emrn7v4teuk6473eh7l39mqp5zafdmygm0tf0hp2ug20fhk7mlkmve4atg76xv9mw0xe2ped72mvkqall4hstp0a9jsxyyasz6dl7zmka2kwfx94w0knut43r4x447w3shmw5alldevrdu2gthelcjt8h6775p92ktlmlg846varj62rghj67e2hyhlauwkkv6nhnvt7wm6tt2kh2xw6kze0ttxsqplfct7mk4jvnykm0arw2juvnmkudgyerj59dn4ja8r5avud67zd7mr2cl54skynhs4twu2qgwrcdzcchhfee008e30yazzwu96h2uhaprejkrgns5w8nds244k3uyfhtmmzne29hmmdsvvlrtr02w0nc0thtkpywwmmxuqfc0tsssdflned" # noqa: E501
|
||||
},
|
||||
)
|
||||
with pytest.raises(ValueError, match="Old offer format is no longer supported"):
|
||||
await wallet_1_rpc.fetch(
|
||||
"take_offer",
|
||||
{
|
||||
"offer": "offer1qqr83wcuu2rykcmqvpsxygqq0qthwpmsrsutadthxda7ppk8wemm74e88h2dh265k7fv7kdk2etmg99xpm0yu8ddl4rkhl73mflmfasl4h75w6lllup4t7urp0mstehm8cnmc6mdxn0rvdejdfpway2ccm6srenn6urvdmgvand96gat25z42f4u2sh7ad7upvhfty77v6ak76dmrdxrzdgn89mlr58ya6j77yax8095r2u2g826yg9jq4q6xzt4g6yveqnhg6r77lrt3weksdwcwz5ava4t5mtdem5syjejwg53q6t5lfd2t5p6dds9dylj7jxw2fmquugdnkvke5jckmsr8ne4akwha9hv9y24x6shezhaxqjegegprjp6h8hua2a24lntev22zkxdkhya5u7k6uhenv2jwwf8nddcs99707290u0yw7jv8w500yarnlew75keam9mwejmanardkdpk6awxj7ndl9ka35zfvydvfj646fuq7j6zv5uzl3czrw76psrnaudu2d65mtez7m9sz9xat52s87v6vmlpmknvju0u4wq5kklflwuamnaczl8vkne284ehyamaaxuzkcdvpjg3tlt7cxhy0r6fammc0arha65nxcv7kpxmra5zck7emrn7v4teuk6473eh7l39mqp5zafdmygm0tf0hp2ug20fhk7mlkmve4atg76xv9mw0xe2ped72mvkqall4hstp0a9jsxyyasz6dl7zmka2kwfx94w0knut43r4x447w3shmw5alldevrdu2gthelcjt8h6775p92ktlmlg846varj62rghj67e2hyhlauwkkv6nhnvt7wm6tt2kh2xw6kze0ttxsqplfct7mk4jvnykm0arw2juvnmkudgyerj59dn4ja8r5avud67zd7mr2cl54skynhs4twu2qgwrcdzcchhfee008e30yazzwu96h2uhaprejkrgns5w8nds244k3uyfhtmmzne29hmmdsvvlrtr02w0nc0thtkpywwmmxuqfc0tsssdflned" # noqa: E501
|
||||
},
|
||||
)
|
||||
with pytest.raises(ValueError, match="Old offer format is no longer supported"):
|
||||
await wallet_1_rpc.fetch(
|
||||
"get_offer_summary",
|
||||
{
|
||||
"offer": "offer1qqqqqqsqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqx68z6sprqv0dvdkvr4rv8r8mwlw7mzuyht6gn74y8yx8ta952h2qqqqqqqqqqqqrls9lllq8ls9lllq8ls9l67lllsflczlllsflllqnlstlllqnll7zllxnlstq8lluz07zllszqgpq8lluz0llczlutl7tuqlllsfl6llllsflllqtljalllqnls9lllqnl30luqszqgplllqnll7qhl9tll7p8lqtll7p8lsgp8llllqnlcyptllllsfluzpdlllqyqszqgpq8lluz0lqdllllsfluzq9llllcyl7pq9lllluz0lqs9llll7p8lsg9llluqszqgpqyqszqgpqyqszq0llcylllsrlllllln63hlqtlnx08lluzqrlcpl7qukqhlllljplczllls8lc9lllsrlczlue0llcylup0llcyluxlllcylllshlmulllshle5lujgplllp0lhelllp0lhelllp0lnflevsrlsnq8llu9l7l8lp0ll7zllxnlcpqyqszq0lqyqszqgplllqy9cplcpsrll7qhlluplllezlllsnlllphlstq8ly2q0llcflllsmlctsrlj9q8llu2l79llluqcrluqsrll7q0lp0lstlctlutcplllq8ls3qyqluqcplllqtll7qllp0ll7q0lqtll7qllluylllczluh0llcylup0llcylufllqyqszq0lqstn7q0llcplup074hlluz07qhlluz0llczluflllcyla0lllcylutlllcyluhlllcyl7qmllllqnlcyqtllllsflcml7qgpqyqszqgpq8lluz0lqsp0llcpqyqszq0llcpluygpq8lqxq0llcplup0llcrlutlllcplup0llcrllljpluph7q0llcpsgqhllllq8ls3qyqluqcplllq8ls3qyqluqcpq8lqxq07p8lluz07p0ly7q0llcylll3plctlatcplmhszq0llllqtll7qllqhll7q0lqtll7qllluylllczllls8lllp8l3rl6csrll7q2el7qgplcpsrll7qvp37q0llcplup07fhlluz07qhlluz07r0lluz07zllluz0llcyl7qmnluzq9ucpluqszqgpqyqlllsrlczlaa0llcylup0llcyllls9lllq0ll7z0lz8l43q8lluql7p8ltrll7p8llup07ahlluz07qhlluz07yllluz0720lluz0llctlu607kuqlllsfletl7qgpqyqszqgpleeszq0llcplup0llcrlllsnlc3laugplllq8ls9lllq0ll7g8llup0llcrlllsnlllqyslllcdlu5cpq8lluql7qhlluplllcflllselefl7q07dyqlawgplllq8lszq0lszq07qvql7qgplcpszq0llcpp8ll7q0lpzqgplcpsrll7qgfsrlsrqyqluqcplllqnll7qhlluplllcflugl7kyqlllszk0lszq07qvqlllsflllqtljdlllqnls9lllqnlsmlllqnlshlllqnl30luqszqgpqyql7qgpqyqszqgplcpsrll7q0lqnlcplllqnlcplchszqgplcpsrll7qhllupl7p0lluql7p8lp8ll7qhl2mll7p8lqtll7p8lphll7p8lp0lcpqyqszqgplllqy9cplcpsrlshlmulllshle5lu5gplllp0lhelllp0lhelllp0lnflevsrlstq8llu9l7l8llup07vhlluz07qhlluz07pllluz0llctlu607dyql7qgpqyqsrll7zllxnlcpqyqszq0llczllls8lllqllstq8lluql7zllluqs9lllqtljalllqnls9lllqnlsnluqszqgplllqtljalllqnls9lllqnlsmluqszqgpq8lluql7zllluqsrlc9szq07qvqlllsflllqnlnplllqnl4lluqszq0llczlal0llcylup0llcylllsflllqnljllc9srll7p8ltllcyqtlszq0llcyllls9lexlllsflczlllsflctlllsflc9lllsrluqszqgpqyqlllsflchlllsfluphlll7p8lsgqhllllqnll7qhl9tll7p8lqtll7p8lsgz0llllqnll7qhlwmll7p8lqtll7p8lp8ll7p8lsg90llllqnll7zllxnljmq8lluz0790lszqgpqyqszq0llcyl7ppdlllszqgpqyqsrll7p8lsgzlllllqnlcyzlll7qgpqyqszqgpqyqszqgplczlad0llcylup0llcyla0lllcylualllcyllls9lllq0l30lllq8lsnledllls9le2lllsflczlllsfle8lllsflllqtlhdlllqnls9lllqnljnlllqnl40lllqnll7zllxnlcrwvqlllsfl6el7qgpqyqszqgplllqnlcrdllszqgpqyqszq0lqyqluqcplllqnl30lllqnlstlllqnlcyqhllllsflllqnll7p8l0rll7p8llu807h8llup07thlluz07qhlluz0llcyluhlllcyl7pqzlllszqgpluqszqgpq8lszqgplllqnll7p8lyrll7p8llu9llqdllaw0llczluh0llcylup0llcylllsflc4lllsflllzrlcyqtllll3rluzqt0l72uql7pq9luql7qgpq8lszqgpqyql7qgpq8lzwqgpluqszqgpqyqszqgpq8lqxqgplllqnll7qdqx7l0xc8wskqn8d5at9dfqmwyt5q675phnkk4zh4e2x9tklqa9fa0llcylllsrgqn55h9a7c7aq9zfj2tx6aa5268xz2r2ds5emgu9yut5hhkp96rrmll7p8lluql7qhlluql7qhlptll7p8lqtll7p8lq0lcpqyqsrll7p8lluqlllen8mll7qhllupl7p0lluql7p8lluz07r8lluz0llczlu00llcylup0llcyluyllqyqszq0lqyqsrll7qhlzmll7p8lqtll7p8lr8ll7p8llup07zhlluz07qhlluz07r0lszqgpq8lszqgpqyqsrlcpq8lqxq0llczllls8lc9lllsrlcylllsflcgluycplllqtl3dlllqnls9lllqnlsmlllqnlshluqszqgpqyqlllszzuqluqcplczllls8lllqllstq8lluql7zllluqs9lllqtl3alllqnls9lllqnlsnluqszqgplllqtl3alllqnls9lllqnlsmluqszqgpq8lluql7zllluqsrlc9szq07qvqluqcpq8lqxqgpqyqlll6pm3jc0w0dpj78zznpvxj057m22f2nk94gc3kus29jvxnefjjd4nklll6qehe6qve5g6r23z4txtrxjqhdg8npntzhw2w8yrkg7y50ksplt32lup0llaqvmuaqxv6ydp4g324n93nfqtk5rese43th98rjpmy0z28mgql4c4gpqyqsq00wsa2002kemp6v5g4avmmdc4edymhaj5vjzvnxuupgu00ufh83e8mt9q2autw93k0a55w5wf5mtdfdaxw9d3fk97dfqhtx8m2d32eqqqqqw3499peelczlllsrlczlllsrlczllls8lctlllsrlczllls8lllp8lstlllrhlshlllrmll7zllp0ll7qhlqmll7p8lqtll7p8lzllcpqyqszqgpqyqlllsrlczlutl7tuqlllsrlcgszq07qvqlllsrlcylllsflcylllsflc9lllsflllqtlsdlllqnls9lllqnl30luqszqgpluqszqgplllqtl30le0szqgplcpsrll7p8lluql7vhlqtll7qlllurl7pvqlllsrlctlllszqhllup07phlluz07qhlluz07z0lszqgpq8llup07phlluz07qhlluz07r0lszqgpqyqlllsrlctlllszq0lqkqgplcpsrlsrqyqlllsflllqxcgqwvaass7c74kdmgtgwq3v5kzcf7pdchnqjuw9yqd0agsgjr8tmua30nshgv7ddn8t3xehd0htnk5luqcpq8lsrll7q0lluellg96ufqk9maa268cn0r6xsre3fs33hcp384eu0uxj77w5fa0n8u008lsrq8lluellgyyddvdkw7jgeu9ugpwah0mk34v4un87qgnqaphe48qss0nmf637mlc2w3499pe4q8llu607qvqlllnelaqhyk2jzy6hxkmuzskhzpz5m6mwylj0h0akznfr3r7sw0e9n8ka2ycplll8ll6pp0j4c0pkvfpy06hd4gelhdvdp3798ghlx6m6eawkk5f4dcazw5cszq0lqyq5xlm42y5nv02th262u6tkmtmrq28nggx4mgvj35gewqav8wcn28jfgtphpthhwrs2pqys2s8zmwv6pur6s6vtyytar26hgp0tgcrc2xg0cxkqdfx3zyyckk769hp4p5dmvcfshc9a4j7feww6uvqc2mthvez7ttx" # noqa: E501
|
||||
},
|
||||
)
|
||||
with pytest.raises(ValueError, match="Old offer format is no longer supported"):
|
||||
await wallet_1_rpc.fetch(
|
||||
"check_offer_validity",
|
||||
{
|
||||
"offer": "offer1qqqqqqsqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqx68z6sprqv0dvdkvr4rv8r8mwlw7mzuyht6gn74y8yx8ta952h2qqqqqqqqqqqqrls9lllq8ls9lllq8ls9l67lllsflczlllsflllqnlstlllqnll7zllxnlstq8lluz07zllszqgpq8lluz0llczlutl7tuqlllsfl6llllsflllqtljalllqnls9lllqnl30luqszqgplllqnll7qhl9tll7p8lqtll7p8lsgp8llllqnlcyptllllsfluzpdlllqyqszqgpq8lluz0lqdllllsfluzq9llllcyl7pq9lllluz0lqs9llll7p8lsg9llluqszqgpqyqszqgpqyqszq0llcylllsrlllllln63hlqtlnx08lluzqrlcpl7qukqhlllljplczllls8lc9lllsrlczlue0llcylup0llcyluxlllcylllshlmulllshle5lujgplllp0lhelllp0lhelllp0lnflevsrlsnq8llu9l7l8lp0ll7zllxnlcpqyqszq0lqyqszqgplllqy9cplcpsrll7qhlluplllezlllsnlllphlstq8ly2q0llcflllsmlctsrlj9q8llu2l79llluqcrluqsrll7q0lp0lstlctlutcplllq8ls3qyqluqcplllqtll7qllp0ll7q0lqtll7qllluylllczluh0llcylup0llcylufllqyqszq0lqstn7q0llcplup074hlluz07qhlluz0llczluflllcyla0lllcylutlllcyluhlllcyl7qmllllqnlcyqtllllsflcml7qgpqyqszqgpq8lluz0lqsp0llcpqyqszq0llcpluygpq8lqxq0llcplup0llcrlutlllcplup0llcrllljpluph7q0llcpsgqhllllq8ls3qyqluqcplllq8ls3qyqluqcpq8lqxq07p8lluz07p0ly7q0llcylll3plctlatcplmhszq0llllqtll7qllqhll7q0lqtll7qllluylllczllls8lllp8l3rl6csrll7q2el7qgplcpsrll7qvp37q0llcplup07fhlluz07qhlluz07r0lluz07zllluz0llcyl7qmnluzq9ucpluqszqgpqyqlllsrlczlaa0llcylup0llcyllls9lllq0ll7z0lz8l43q8lluql7p8ltrll7p8llup07ahlluz07qhlluz07yllluz0720lluz0llctlu607kuqlllsfletl7qgpqyqszqgpleeszq0llcplup0llcrlllsnlc3laugplllq8ls9lllq0ll7g8llup0llcrlllsnlllqyslllcdlu5cpq8lluql7qhlluplllcflllselefl7q07dyqlawgplllq8lszq0lszq07qvql7qgplcpszq0llcpp8ll7q0lpzqgplcpsrll7qgfsrlsrqyqluqcplllqnll7qhlluplllcflugl7kyqlllszk0lszq07qvqlllsflllqtljdlllqnls9lllqnlsmlllqnlshlllqnl30luqszqgpqyql7qgpqyqszqgplcpsrll7q0lqnlcplllqnlcplchszqgplcpsrll7qhllupl7p0lluql7p8lp8ll7qhl2mll7p8lqtll7p8lphll7p8lp0lcpqyqszqgplllqy9cplcpsrlshlmulllshle5lu5gplllp0lhelllp0lhelllp0lnflevsrlstq8llu9l7l8llup07vhlluz07qhlluz07pllluz0llctlu607dyql7qgpqyqsrll7zllxnlcpqyqszq0llczllls8lllqllstq8lluql7zllluqs9lllqtljalllqnls9lllqnlsnluqszqgplllqtljalllqnls9lllqnlsmluqszqgpq8lluql7zllluqsrlc9szq07qvqlllsflllqnlnplllqnl4lluqszq0llczlal0llcylup0llcylllsflllqnljllc9srll7p8ltllcyqtlszq0llcyllls9lexlllsflczlllsflctlllsflc9lllsrluqszqgpqyqlllsflchlllsfluphlll7p8lsgqhllllqnll7qhl9tll7p8lqtll7p8lsgz0llllqnll7qhlwmll7p8lqtll7p8lp8ll7p8lsg90llllqnll7zllxnljmq8lluz0790lszqgpqyqszq0llcyl7ppdlllszqgpqyqsrll7p8lsgzlllllqnlcyzlll7qgpqyqszqgpqyqszqgplczlad0llcylup0llcyla0lllcylualllcyllls9lllq0l30lllq8lsnledllls9le2lllsflczlllsfle8lllsflllqtlhdlllqnls9lllqnljnlllqnl40lllqnll7zllxnlcrwvqlllsfl6el7qgpqyqszqgplllqnlcrdllszqgpqyqszq0lqyqluqcplllqnl30lllqnlstlllqnlcyqhllllsflllqnll7p8l0rll7p8llu807h8llup07thlluz07qhlluz0llcyluhlllcyl7pqzlllszqgpluqszqgpq8lszqgplllqnll7p8lyrll7p8llu9llqdllaw0llczluh0llcylup0llcylllsflc4lllsflllzrlcyqtllll3rluzqt0l72uql7pq9luql7qgpq8lszqgpqyql7qgpq8lzwqgpluqszqgpqyqszqgpq8lqxqgplllqnll7qdqx7l0xc8wskqn8d5at9dfqmwyt5q675phnkk4zh4e2x9tklqa9fa0llcylllsrgqn55h9a7c7aq9zfj2tx6aa5268xz2r2ds5emgu9yut5hhkp96rrmll7p8lluql7qhlluql7qhlptll7p8lqtll7p8lq0lcpqyqsrll7p8lluqlllen8mll7qhllupl7p0lluql7p8lluz07r8lluz0llczlu00llcylup0llcyluyllqyqszq0lqyqsrll7qhlzmll7p8lqtll7p8lr8ll7p8llup07zhlluz07qhlluz07r0lszqgpq8lszqgpqyqsrlcpq8lqxq0llczllls8lc9lllsrlcylllsflcgluycplllqtl3dlllqnls9lllqnlsmlllqnlshluqszqgpqyqlllszzuqluqcplczllls8lllqllstq8lluql7zllluqs9lllqtl3alllqnls9lllqnlsnluqszqgplllqtl3alllqnls9lllqnlsmluqszqgpq8lluql7zllluqsrlc9szq07qvqluqcpq8lqxqgpqyqlll6pm3jc0w0dpj78zznpvxj057m22f2nk94gc3kus29jvxnefjjd4nklll6qehe6qve5g6r23z4txtrxjqhdg8npntzhw2w8yrkg7y50ksplt32lup0llaqvmuaqxv6ydp4g324n93nfqtk5rese43th98rjpmy0z28mgql4c4gpqyqsq00wsa2002kemp6v5g4avmmdc4edymhaj5vjzvnxuupgu00ufh83e8mt9q2autw93k0a55w5wf5mtdfdaxw9d3fk97dfqhtx8m2d32eqqqqqw3499peelczlllsrlczlllsrlczllls8lctlllsrlczllls8lllp8lstlllrhlshlllrmll7zllp0ll7qhlqmll7p8lqtll7p8lzllcpqyqszqgpqyqlllsrlczlutl7tuqlllsrlcgszq07qvqlllsrlcylllsflcylllsflc9lllsflllqtlsdlllqnls9lllqnl30luqszqgpluqszqgplllqtl30le0szqgplcpsrll7p8lluql7vhlqtll7qlllurl7pvqlllsrlctlllszqhllup07phlluz07qhlluz07z0lszqgpq8llup07phlluz07qhlluz07r0lszqgpqyqlllsrlctlllszq0lqkqgplcpsrlsrqyqlllsflllqxcgqwvaass7c74kdmgtgwq3v5kzcf7pdchnqjuw9yqd0agsgjr8tmua30nshgv7ddn8t3xehd0htnk5luqcpq8lsrll7q0lluellg96ufqk9maa268cn0r6xsre3fs33hcp384eu0uxj77w5fa0n8u008lsrq8lluellgyyddvdkw7jgeu9ugpwah0mk34v4un87qgnqaphe48qss0nmf637mlc2w3499pe4q8llu607qvqlllnelaqhyk2jzy6hxkmuzskhzpz5m6mwylj0h0akznfr3r7sw0e9n8ka2ycplll8ll6pp0j4c0pkvfpy06hd4gelhdvdp3798ghlx6m6eawkk5f4dcazw5cszq0lqyq5xlm42y5nv02th262u6tkmtmrq28nggx4mgvj35gewqav8wcn28jfgtphpthhwrs2pqys2s8zmwv6pur6s6vtyytar26hgp0tgcrc2xg0cxkqdfx3zyyckk769hp4p5dmvcfshc9a4j7feww6uvqc2mthvez7ttx" # noqa: E501
|
||||
},
|
||||
)
|
||||
with pytest.raises(ValueError, match="Old offer format is no longer supported"):
|
||||
await wallet_1_rpc.fetch(
|
||||
"take_offer",
|
||||
{
|
||||
"offer": "offer1qqqqqqsqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqx68z6sprqv0dvdkvr4rv8r8mwlw7mzuyht6gn74y8yx8ta952h2qqqqqqqqqqqqrls9lllq8ls9lllq8ls9l67lllsflczlllsflllqnlstlllqnll7zllxnlstq8lluz07zllszqgpq8lluz0llczlutl7tuqlllsfl6llllsflllqtljalllqnls9lllqnl30luqszqgplllqnll7qhl9tll7p8lqtll7p8lsgp8llllqnlcyptllllsfluzpdlllqyqszqgpq8lluz0lqdllllsfluzq9llllcyl7pq9lllluz0lqs9llll7p8lsg9llluqszqgpqyqszqgpqyqszq0llcylllsrlllllln63hlqtlnx08lluzqrlcpl7qukqhlllljplczllls8lc9lllsrlczlue0llcylup0llcyluxlllcylllshlmulllshle5lujgplllp0lhelllp0lhelllp0lnflevsrlsnq8llu9l7l8lp0ll7zllxnlcpqyqszq0lqyqszqgplllqy9cplcpsrll7qhlluplllezlllsnlllphlstq8ly2q0llcflllsmlctsrlj9q8llu2l79llluqcrluqsrll7q0lp0lstlctlutcplllq8ls3qyqluqcplllqtll7qllp0ll7q0lqtll7qllluylllczluh0llcylup0llcylufllqyqszq0lqstn7q0llcplup074hlluz07qhlluz0llczluflllcyla0lllcylutlllcyluhlllcyl7qmllllqnlcyqtllllsflcml7qgpqyqszqgpq8lluz0lqsp0llcpqyqszq0llcpluygpq8lqxq0llcplup0llcrlutlllcplup0llcrllljpluph7q0llcpsgqhllllq8ls3qyqluqcplllq8ls3qyqluqcpq8lqxq07p8lluz07p0ly7q0llcylll3plctlatcplmhszq0llllqtll7qllqhll7q0lqtll7qllluylllczllls8lllp8l3rl6csrll7q2el7qgplcpsrll7qvp37q0llcplup07fhlluz07qhlluz07r0lluz07zllluz0llcyl7qmnluzq9ucpluqszqgpqyqlllsrlczlaa0llcylup0llcyllls9lllq0ll7z0lz8l43q8lluql7p8ltrll7p8llup07ahlluz07qhlluz07yllluz0720lluz0llctlu607kuqlllsfletl7qgpqyqszqgpleeszq0llcplup0llcrlllsnlc3laugplllq8ls9lllq0ll7g8llup0llcrlllsnlllqyslllcdlu5cpq8lluql7qhlluplllcflllselefl7q07dyqlawgplllq8lszq0lszq07qvql7qgplcpszq0llcpp8ll7q0lpzqgplcpsrll7qgfsrlsrqyqluqcplllqnll7qhlluplllcflugl7kyqlllszk0lszq07qvqlllsflllqtljdlllqnls9lllqnlsmlllqnlshlllqnl30luqszqgpqyql7qgpqyqszqgplcpsrll7q0lqnlcplllqnlcplchszqgplcpsrll7qhllupl7p0lluql7p8lp8ll7qhl2mll7p8lqtll7p8lphll7p8lp0lcpqyqszqgplllqy9cplcpsrlshlmulllshle5lu5gplllp0lhelllp0lhelllp0lnflevsrlstq8llu9l7l8llup07vhlluz07qhlluz07pllluz0llctlu607dyql7qgpqyqsrll7zllxnlcpqyqszq0llczllls8lllqllstq8lluql7zllluqs9lllqtljalllqnls9lllqnlsnluqszqgplllqtljalllqnls9lllqnlsmluqszqgpq8lluql7zllluqsrlc9szq07qvqlllsflllqnlnplllqnl4lluqszq0llczlal0llcylup0llcylllsflllqnljllc9srll7p8ltllcyqtlszq0llcyllls9lexlllsflczlllsflctlllsflc9lllsrluqszqgpqyqlllsflchlllsfluphlll7p8lsgqhllllqnll7qhl9tll7p8lqtll7p8lsgz0llllqnll7qhlwmll7p8lqtll7p8lp8ll7p8lsg90llllqnll7zllxnljmq8lluz0790lszqgpqyqszq0llcyl7ppdlllszqgpqyqsrll7p8lsgzlllllqnlcyzlll7qgpqyqszqgpqyqszqgplczlad0llcylup0llcyla0lllcylualllcyllls9lllq0l30lllq8lsnledllls9le2lllsflczlllsfle8lllsflllqtlhdlllqnls9lllqnljnlllqnl40lllqnll7zllxnlcrwvqlllsfl6el7qgpqyqszqgplllqnlcrdllszqgpqyqszq0lqyqluqcplllqnl30lllqnlstlllqnlcyqhllllsflllqnll7p8l0rll7p8llu807h8llup07thlluz07qhlluz0llcyluhlllcyl7pqzlllszqgpluqszqgpq8lszqgplllqnll7p8lyrll7p8llu9llqdllaw0llczluh0llcylup0llcylllsflc4lllsflllzrlcyqtllll3rluzqt0l72uql7pq9luql7qgpq8lszqgpqyql7qgpq8lzwqgpluqszqgpqyqszqgpq8lqxqgplllqnll7qdqx7l0xc8wskqn8d5at9dfqmwyt5q675phnkk4zh4e2x9tklqa9fa0llcylllsrgqn55h9a7c7aq9zfj2tx6aa5268xz2r2ds5emgu9yut5hhkp96rrmll7p8lluql7qhlluql7qhlptll7p8lqtll7p8lq0lcpqyqsrll7p8lluqlllen8mll7qhllupl7p0lluql7p8lluz07r8lluz0llczlu00llcylup0llcyluyllqyqszq0lqyqsrll7qhlzmll7p8lqtll7p8lr8ll7p8llup07zhlluz07qhlluz07r0lszqgpq8lszqgpqyqsrlcpq8lqxq0llczllls8lc9lllsrlcylllsflcgluycplllqtl3dlllqnls9lllqnlsmlllqnlshluqszqgpqyqlllszzuqluqcplczllls8lllqllstq8lluql7zllluqs9lllqtl3alllqnls9lllqnlsnluqszqgplllqtl3alllqnls9lllqnlsmluqszqgpq8lluql7zllluqsrlc9szq07qvqluqcpq8lqxqgpqyqlll6pm3jc0w0dpj78zznpvxj057m22f2nk94gc3kus29jvxnefjjd4nklll6qehe6qve5g6r23z4txtrxjqhdg8npntzhw2w8yrkg7y50ksplt32lup0llaqvmuaqxv6ydp4g324n93nfqtk5rese43th98rjpmy0z28mgql4c4gpqyqsq00wsa2002kemp6v5g4avmmdc4edymhaj5vjzvnxuupgu00ufh83e8mt9q2autw93k0a55w5wf5mtdfdaxw9d3fk97dfqhtx8m2d32eqqqqqw3499peelczlllsrlczlllsrlczllls8lctlllsrlczllls8lllp8lstlllrhlshlllrmll7zllp0ll7qhlqmll7p8lqtll7p8lzllcpqyqszqgpqyqlllsrlczlutl7tuqlllsrlcgszq07qvqlllsrlcylllsflcylllsflc9lllsflllqtlsdlllqnls9lllqnl30luqszqgpluqszqgplllqtl30le0szqgplcpsrll7p8lluql7vhlqtll7qlllurl7pvqlllsrlctlllszqhllup07phlluz07qhlluz07z0lszqgpq8llup07phlluz07qhlluz07r0lszqgpqyqlllsrlctlllszq0lqkqgplcpsrlsrqyqlllsflllqxcgqwvaass7c74kdmgtgwq3v5kzcf7pdchnqjuw9yqd0agsgjr8tmua30nshgv7ddn8t3xehd0htnk5luqcpq8lsrll7q0lluellg96ufqk9maa268cn0r6xsre3fs33hcp384eu0uxj77w5fa0n8u008lsrq8lluellgyyddvdkw7jgeu9ugpwah0mk34v4un87qgnqaphe48qss0nmf637mlc2w3499pe4q8llu607qvqlllnelaqhyk2jzy6hxkmuzskhzpz5m6mwylj0h0akznfr3r7sw0e9n8ka2ycplll8ll6pp0j4c0pkvfpy06hd4gelhdvdp3798ghlx6m6eawkk5f4dcazw5cszq0lqyq5xlm42y5nv02th262u6tkmtmrq28nggx4mgvj35gewqav8wcn28jfgtphpthhwrs2pqys2s8zmwv6pur6s6vtyytar26hgp0tgcrc2xg0cxkqdfx3zyyckk769hp4p5dmvcfshc9a4j7feww6uvqc2mthvez7ttx" # noqa: E501
|
||||
},
|
||||
)
|
||||
###
|
||||
|
||||
await wallet_1_rpc.create_offer_for_ids(
|
||||
{uint32(1): -5, cat_asset_id.hex(): 1},
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user