mirror of
https://github.com/Chia-Network/chia-blockchain.git
synced 2024-09-20 16:08:51 +03:00
Add a test for multiple singleton dependencies
This commit is contained in:
parent
8538610cf4
commit
46f144b947
@ -75,6 +75,6 @@ def create_graftroot_offer_puz(
|
||||
return GRAFTROOT_DL_OFFERS.curry(
|
||||
inner_puzzle,
|
||||
[launcher_to_struct(launcher) for launcher in launcher_ids],
|
||||
[NFT_STATE_LAYER_MOD.get_tree_hash()],
|
||||
[NFT_STATE_LAYER_MOD.get_tree_hash()]*len(launcher_ids),
|
||||
values_to_prove,
|
||||
)
|
||||
|
@ -254,3 +254,163 @@ async def test_dl_offer_cancellation(wallets_prefarm: Any, trusted: bool) -> Non
|
||||
await time_out_assert(15, get_trade_and_status, TradeStatus.PENDING_CANCEL, trade_manager, offer)
|
||||
await full_node_api.process_transaction_records(records=cancellation_txs)
|
||||
await time_out_assert(15, get_trade_and_status, TradeStatus.CANCELLED, trade_manager, offer)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"trusted",
|
||||
[True, False],
|
||||
)
|
||||
@pytest.mark.asyncio
|
||||
async def test_multiple_dl_offers(wallets_prefarm: Any, trusted: bool) -> None:
|
||||
wallet_node_maker, wallet_node_taker, full_node_api = wallets_prefarm
|
||||
assert wallet_node_maker.wallet_state_manager is not None
|
||||
assert wallet_node_taker.wallet_state_manager is not None
|
||||
wsm_maker = wallet_node_maker.wallet_state_manager
|
||||
wsm_taker = wallet_node_taker.wallet_state_manager
|
||||
|
||||
wallet_maker = wsm_maker.main_wallet
|
||||
wallet_taker = wsm_taker.main_wallet
|
||||
|
||||
funds = 20000000000000
|
||||
|
||||
await time_out_assert(10, wallet_maker.get_unconfirmed_balance, funds)
|
||||
await time_out_assert(10, wallet_taker.get_confirmed_balance, funds)
|
||||
|
||||
async with wsm_maker.lock:
|
||||
dl_wallet_maker = await DataLayerWallet.create_new_dl_wallet(wsm_maker, wallet_maker)
|
||||
async with wsm_taker.lock:
|
||||
dl_wallet_taker = await DataLayerWallet.create_new_dl_wallet(wsm_taker, wallet_taker)
|
||||
|
||||
MAKER_ROWS = [bytes32([i] * 32) for i in range(0, 10)]
|
||||
TAKER_ROWS = [bytes32([i] * 32) for i in range(10, 20)]
|
||||
maker_root, _ = build_merkle_tree(MAKER_ROWS)
|
||||
taker_root, _ = build_merkle_tree(TAKER_ROWS)
|
||||
|
||||
dl_record, std_record, launcher_id_maker_1 = await dl_wallet_maker.generate_new_reporter(
|
||||
maker_root, fee=uint64(1999999999999)
|
||||
)
|
||||
assert await dl_wallet_maker.get_latest_singleton(launcher_id_maker_1) is not None
|
||||
await wsm_maker.add_pending_transaction(dl_record)
|
||||
await wsm_maker.add_pending_transaction(std_record)
|
||||
await full_node_api.process_transaction_records(records=[dl_record, std_record])
|
||||
await time_out_assert(15, is_singleton_confirmed_and_root, True, dl_wallet_maker, launcher_id_maker_1, maker_root)
|
||||
dl_record, std_record, launcher_id_maker_2 = await dl_wallet_maker.generate_new_reporter(
|
||||
maker_root, fee=uint64(1999999999999)
|
||||
)
|
||||
assert await dl_wallet_maker.get_latest_singleton(launcher_id_maker_2) is not None
|
||||
await wsm_maker.add_pending_transaction(dl_record)
|
||||
await wsm_maker.add_pending_transaction(std_record)
|
||||
await full_node_api.process_transaction_records(records=[dl_record, std_record])
|
||||
await time_out_assert(15, is_singleton_confirmed_and_root, True, dl_wallet_maker, launcher_id_maker_2, maker_root)
|
||||
|
||||
dl_record, std_record, launcher_id_taker_1 = await dl_wallet_taker.generate_new_reporter(
|
||||
taker_root, fee=uint64(1999999999999)
|
||||
)
|
||||
assert await dl_wallet_taker.get_latest_singleton(launcher_id_taker_1) is not None
|
||||
await wsm_taker.add_pending_transaction(dl_record)
|
||||
await wsm_taker.add_pending_transaction(std_record)
|
||||
await full_node_api.process_transaction_records(records=[dl_record, std_record])
|
||||
await time_out_assert(15, is_singleton_confirmed_and_root, True, dl_wallet_taker, launcher_id_taker_1, taker_root)
|
||||
dl_record, std_record, launcher_id_taker_2 = await dl_wallet_taker.generate_new_reporter(
|
||||
taker_root, fee=uint64(1999999999999)
|
||||
)
|
||||
assert await dl_wallet_taker.get_latest_singleton(launcher_id_taker_2) is not None
|
||||
await wsm_taker.add_pending_transaction(dl_record)
|
||||
await wsm_taker.add_pending_transaction(std_record)
|
||||
await full_node_api.process_transaction_records(records=[dl_record, std_record])
|
||||
await time_out_assert(15, is_singleton_confirmed_and_root, True, dl_wallet_taker, launcher_id_taker_2, taker_root)
|
||||
|
||||
await dl_wallet_maker.track_new_launcher_id(launcher_id_taker_1)
|
||||
await dl_wallet_maker.track_new_launcher_id(launcher_id_taker_2)
|
||||
await dl_wallet_taker.track_new_launcher_id(launcher_id_maker_1)
|
||||
await dl_wallet_taker.track_new_launcher_id(launcher_id_maker_2)
|
||||
await time_out_assert(15, is_singleton_confirmed_and_root, True, dl_wallet_maker, launcher_id_taker_1, taker_root)
|
||||
await time_out_assert(15, is_singleton_confirmed_and_root, True, dl_wallet_maker, launcher_id_taker_2, taker_root)
|
||||
await time_out_assert(15, is_singleton_confirmed_and_root, True, dl_wallet_taker, launcher_id_maker_1, maker_root)
|
||||
await time_out_assert(15, is_singleton_confirmed_and_root, True, dl_wallet_taker, launcher_id_maker_2, maker_root)
|
||||
|
||||
trade_manager_maker = wsm_maker.trade_manager
|
||||
trade_manager_taker = wsm_taker.trade_manager
|
||||
|
||||
maker_addition = bytes32([101] * 32)
|
||||
taker_addition = bytes32([202] * 32)
|
||||
MAKER_ROWS.append(maker_addition)
|
||||
TAKER_ROWS.append(taker_addition)
|
||||
maker_root, maker_proofs = build_merkle_tree(MAKER_ROWS)
|
||||
taker_root, taker_proofs = build_merkle_tree(TAKER_ROWS)
|
||||
|
||||
success, offer_maker, error = await trade_manager_maker.create_offer_for_ids(
|
||||
{launcher_id_maker_1: -1, launcher_id_taker_1: 1, launcher_id_maker_2: -1, launcher_id_taker_2: 1},
|
||||
solver=Solver(
|
||||
{
|
||||
launcher_id_maker_1.hex(): {
|
||||
"new_root": "0x" + maker_root.hex(),
|
||||
"dependencies": {
|
||||
launcher_id_taker_1.hex(): ["0x" + taker_addition.hex(), "0x" + taker_addition.hex()],
|
||||
},
|
||||
},
|
||||
launcher_id_maker_2.hex(): {
|
||||
"new_root": "0x" + maker_root.hex(),
|
||||
"dependencies": {
|
||||
launcher_id_taker_1.hex(): ["0x" + taker_addition.hex()],
|
||||
launcher_id_taker_2.hex(): ["0x" + taker_addition.hex()],
|
||||
},
|
||||
},
|
||||
}
|
||||
),
|
||||
fee=uint64(2000000000000),
|
||||
)
|
||||
assert error is None
|
||||
assert success is True
|
||||
assert offer_maker is not None
|
||||
|
||||
maker_proof: Tuple[int, List[bytes32]] = maker_proofs[maker_addition]
|
||||
taker_proof: Tuple[int, List[bytes32]] = taker_proofs[taker_addition]
|
||||
success, offer_taker, error = await trade_manager_taker.respond_to_offer(
|
||||
Offer.from_bytes(offer_maker.offer),
|
||||
solver=Solver(
|
||||
{
|
||||
launcher_id_taker_1.hex(): {
|
||||
"new_root": "0x" + taker_root.hex(),
|
||||
"dependencies": {
|
||||
launcher_id_maker_1.hex(): ["0x" + maker_addition.hex(), "0x" + maker_addition.hex()],
|
||||
},
|
||||
},
|
||||
launcher_id_taker_2.hex(): {
|
||||
"new_root": "0x" + taker_root.hex(),
|
||||
"dependencies": {
|
||||
launcher_id_maker_1.hex(): ["0x" + maker_addition.hex()],
|
||||
launcher_id_maker_2.hex(): ["0x" + maker_addition.hex()],
|
||||
},
|
||||
},
|
||||
"proofs_of_inclusion": {
|
||||
maker_root.hex(): [str(maker_proof[0]), ["0x" + sibling.hex() for sibling in maker_proof[1]]],
|
||||
taker_root.hex(): [str(taker_proof[0]), ["0x" + sibling.hex() for sibling in taker_proof[1]]],
|
||||
},
|
||||
}
|
||||
),
|
||||
fee=uint64(2000000000000),
|
||||
)
|
||||
assert error is None
|
||||
assert success is True
|
||||
assert offer_taker is not None
|
||||
|
||||
await time_out_assert(15, wallet_maker.get_unconfirmed_balance, funds - 4000000000000)
|
||||
await time_out_assert(15, wallet_taker.get_unconfirmed_balance, funds - 6000000000000)
|
||||
|
||||
# Let's hack a way to await this offer's confirmation
|
||||
offer_record = dataclasses.replace(dl_record, spend_bundle=Offer.from_bytes(offer_taker.offer).bundle)
|
||||
await full_node_api.process_transaction_records(records=[offer_record])
|
||||
|
||||
await time_out_assert(15, wallet_maker.get_confirmed_balance, funds - 6000000000000)
|
||||
await time_out_assert(15, wallet_maker.get_unconfirmed_balance, funds - 6000000000000)
|
||||
await time_out_assert(15, wallet_taker.get_confirmed_balance, funds - 6000000000000)
|
||||
await time_out_assert(15, wallet_taker.get_unconfirmed_balance, funds - 6000000000000)
|
||||
|
||||
await time_out_assert(15, is_singleton_confirmed_and_root, True, dl_wallet_maker, launcher_id_taker_1, taker_root)
|
||||
await time_out_assert(15, is_singleton_confirmed_and_root, True, dl_wallet_maker, launcher_id_taker_2, taker_root)
|
||||
await time_out_assert(15, is_singleton_confirmed_and_root, True, dl_wallet_taker, launcher_id_maker_1, maker_root)
|
||||
await time_out_assert(15, is_singleton_confirmed_and_root, True, dl_wallet_taker, launcher_id_maker_2, maker_root)
|
||||
|
||||
await time_out_assert(15, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_maker, offer_maker)
|
||||
await time_out_assert(15, get_trade_and_status, TradeStatus.CONFIRMED, trade_manager_taker, offer_taker)
|
Loading…
Reference in New Issue
Block a user