Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
169 changes: 73 additions & 96 deletions chia/_tests/wallet/nft_wallet/test_nft_1_offers.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,10 @@

from chia._tests.environments.wallet import WalletStateTransition, WalletTestFramework
from chia._tests.util.time_out_assert import time_out_assert
from chia._tests.wallet.cat_wallet.test_cat_wallet import mint_cat
from chia.types.blockchain_format.program import Program
from chia.wallet.cat_wallet.cat_wallet import CATWallet
from chia.wallet.cat_wallet.r_cat_wallet import RCATWallet
from chia.wallet.did_wallet.did_wallet import DIDWallet
from chia.wallet.nft_wallet.nft_wallet import NFTWallet
from chia.wallet.outer_puzzles import create_asset_id, match_puzzle
Expand Down Expand Up @@ -777,8 +779,11 @@ async def test_nft_offer_sell_did_to_did(wallet_environments: WalletTestFramewor
@pytest.mark.limit_consensus_modes
@pytest.mark.parametrize("wallet_environments", [{"num_environments": 2, "blocks_needed": [1, 1]}], indirect=True)
@pytest.mark.parametrize("zero_royalties", [True, False])
@pytest.mark.parametrize("wallet_type", [CATWallet, RCATWallet])
@pytest.mark.anyio
async def test_nft_offer_sell_nft_for_cat(wallet_environments: WalletTestFramework, zero_royalties: bool) -> None:
async def test_nft_offer_sell_nft_for_cat(
wallet_environments: WalletTestFramework, zero_royalties: bool, wallet_type: type[CATWallet]
) -> None:
env_maker = wallet_environments.environments[0]
env_taker = wallet_environments.environments[1]
wallet_maker = env_maker.xch_wallet
Expand Down Expand Up @@ -910,46 +915,24 @@ async def test_nft_offer_sell_nft_for_cat(wallet_environments: WalletTestFramewo

# Create new CAT and wallets for maker and taker
# Trade them between maker and taker to ensure multiple coins for each cat
cats_to_mint = 100000
cats_to_mint = uint64(100000)
cats_to_trade = uint64(10000)
async with wallet_maker.wallet_state_manager.new_action_scope(
wallet_environments.tx_config, push=True
) as action_scope:
cat_wallet_maker = await CATWallet.create_new_cat_wallet(
env_maker.wallet_state_manager,
wallet_maker,
{"identifier": "genesis_by_id"},
uint64(cats_to_mint),
action_scope,
)

await wallet_environments.process_pending_states(
[
WalletStateTransition(
pre_block_balance_updates={
"xch": {
"set_remainder": True,
},
"cat": {
"init": True,
"set_remainder": True,
},
},
post_block_balance_updates={
"xch": {
"set_remainder": True,
},
"cat": {
"set_remainder": True,
},
},
),
WalletStateTransition(),
]
cat_wallet_maker = await mint_cat(
wallet_environments,
env_maker,
"xch",
"cat",
cats_to_mint,
wallet_type,
"cat",
)

cat_wallet_taker: CATWallet = await CATWallet.get_or_create_wallet_for_cat(
env_taker.wallet_state_manager, wallet_taker, cat_wallet_maker.get_asset_id()
if wallet_type is RCATWallet:
extra_args: Any = (bytes32.zeros,)
else:
extra_args = tuple()
cat_wallet_taker: CATWallet = await wallet_type.get_or_create_wallet_for_cat(
env_taker.wallet_state_manager, wallet_taker, cat_wallet_maker.get_asset_id(), *extra_args
)

await env_taker.change_balances({"cat": {"init": True}})
Expand Down Expand Up @@ -1120,8 +1103,11 @@ async def test_nft_offer_sell_nft_for_cat(wallet_environments: WalletTestFramewo
@pytest.mark.limit_consensus_modes
@pytest.mark.parametrize("wallet_environments", [{"num_environments": 2, "blocks_needed": [1, 1]}], indirect=True)
@pytest.mark.parametrize("test_change", [True, False])
@pytest.mark.parametrize("wallet_type", [CATWallet, RCATWallet])
@pytest.mark.anyio
async def test_nft_offer_request_nft_for_cat(wallet_environments: WalletTestFramework, test_change: bool) -> None:
async def test_nft_offer_request_nft_for_cat(
wallet_environments: WalletTestFramework, test_change: bool, wallet_type: type[CATWallet]
) -> None:
env_maker = wallet_environments.environments[0]
env_taker = wallet_environments.environments[1]
wallet_maker = env_maker.xch_wallet
Expand Down Expand Up @@ -1255,46 +1241,24 @@ async def test_nft_offer_request_nft_for_cat(wallet_environments: WalletTestFram

# Create new CAT and wallets for maker and taker
# Trade them between maker and taker to ensure multiple coins for each cat
cats_to_mint = 100000
cats_to_mint = uint64(100000)
cats_to_trade = uint64(20000)
async with wallet_maker.wallet_state_manager.new_action_scope(
wallet_environments.tx_config, push=True
) as action_scope:
cat_wallet_maker = await CATWallet.create_new_cat_wallet(
env_maker.wallet_state_manager,
wallet_maker,
{"identifier": "genesis_by_id"},
uint64(cats_to_mint),
action_scope,
)

await wallet_environments.process_pending_states(
[
WalletStateTransition(
pre_block_balance_updates={
"xch": {
"set_remainder": True,
},
"cat": {
"init": True,
"set_remainder": True,
},
},
post_block_balance_updates={
"xch": {
"set_remainder": True,
},
"cat": {
"set_remainder": True,
},
},
),
WalletStateTransition(),
]
cat_wallet_maker = await mint_cat(
wallet_environments,
env_maker,
"xch",
"cat",
cats_to_mint,
wallet_type,
"cat",
)

await CATWallet.get_or_create_wallet_for_cat(
env_taker.wallet_state_manager, wallet_taker, cat_wallet_maker.get_asset_id()
if wallet_type is RCATWallet:
extra_args: Any = (bytes32.zeros,)
else:
extra_args = tuple()
await wallet_type.get_or_create_wallet_for_cat(
env_taker.wallet_state_manager, wallet_taker, cat_wallet_maker.get_asset_id(), *extra_args
)

await env_taker.change_balances({"cat": {"init": True}})
Expand Down Expand Up @@ -1690,8 +1654,11 @@ async def get_trade_and_status(trade_manager: Any, trade: Any) -> TradeStatus:
[{"num_environments": 2, "blocks_needed": [3, 3], "config_overrides": {"automatically_add_unknown_cats": True}}],
indirect=True,
)
@pytest.mark.parametrize("wallet_type", [CATWallet, RCATWallet])
@pytest.mark.anyio
async def test_complex_nft_offer(wallet_environments: WalletTestFramework, royalty_pts: tuple[int, int, int]) -> None:
async def test_complex_nft_offer(
wallet_environments: WalletTestFramework, royalty_pts: tuple[int, int, int], wallet_type: type[CATWallet]
) -> None:
"""
This test is going to create an offer where the maker offers 1 NFT and 1 CAT for 2 NFTs, an XCH and a CAT
"""
Expand Down Expand Up @@ -1729,20 +1696,24 @@ async def test_complex_nft_offer(wallet_environments: WalletTestFramework, royal
ph_taker = await action_scope.get_puzzle_hash(wallet_taker.wallet_state_manager)

CAT_AMOUNT = uint64(100000000)
async with wallet_maker.wallet_state_manager.new_action_scope(
wallet_environments.tx_config, push=True
) as action_scope:
cat_wallet_maker = await CATWallet.create_new_cat_wallet(
wsm_maker, wallet_maker, {"identifier": "genesis_by_id"}, CAT_AMOUNT, action_scope
)
async with wallet_taker.wallet_state_manager.new_action_scope(
wallet_environments.tx_config, push=True
) as action_scope:
cat_wallet_taker = await CATWallet.create_new_cat_wallet(
wsm_taker, wallet_taker, {"identifier": "genesis_by_id"}, CAT_AMOUNT, action_scope
)
await env_maker.change_balances({"cat_maker": {"init": True}})
await env_taker.change_balances({"cat_taker": {"init": True}})
cat_wallet_maker = await mint_cat(
wallet_environments,
env_maker,
"xch",
"cat_maker",
CAT_AMOUNT,
wallet_type,
"cat_maker",
)
cat_wallet_taker = await mint_cat(
wallet_environments,
env_taker,
"xch",
"cat_taker",
CAT_AMOUNT,
wallet_type,
"cat_taker",
)

# We'll need these later
basic_nft_wallet_maker = await NFTWallet.create_new_nft_wallet(wsm_maker, wallet_maker, name="NFT WALLET MAKER")
Expand Down Expand Up @@ -2025,6 +1996,11 @@ async def test_complex_nft_offer(wallet_environments: WalletTestFramework, royal
{
"type": "CAT",
"tail": "0x" + cat_wallet_taker.get_asset_id(),
**(
{}
if wallet_type is CATWallet
else {"also": {"type": "revocation layer", "hidden_puzzle_hash": "0x" + bytes32.zeros.hex()}}
),
}
),
}
Expand Down Expand Up @@ -2090,7 +2066,8 @@ async def test_complex_nft_offer(wallet_environments: WalletTestFramework, royal
+ taker_royalty_summary[nft_to_offer_asset_id_taker_2][0]["amount"]
)

xch_coins = int(XCH_REQUESTED / 1_750_000_000_000) + 2
# in the zero royalty case, exact change ends up being selected which complicates things a bit
xch_coins = int(XCH_REQUESTED / 1_750_000_000_000) + 2 - (1 if royalty_basis_pts_maker == 0 else 0)
fee_coins = int(FEE / 1_750_000_000_000) + 1 if FEE > 1_750_000_000_000 else 1
await wallet_environments.process_pending_states(
[
Expand Down Expand Up @@ -2151,7 +2128,7 @@ async def test_complex_nft_offer(wallet_environments: WalletTestFramework, royal
"unconfirmed_wallet_balance": -XCH_REQUESTED - maker_xch_royalties_expected - FEE,
"<=#spendable_balance": -XCH_REQUESTED - maker_xch_royalties_expected - FEE,
"<=#max_send_amount": -XCH_REQUESTED - maker_xch_royalties_expected - FEE,
">=#pending_change": 1,
">=#pending_change": 0,
"pending_coin_removal_count": xch_coins + fee_coins,
},
"cat_taker": {
Expand All @@ -2173,9 +2150,9 @@ async def test_complex_nft_offer(wallet_environments: WalletTestFramework, royal
post_block_balance_updates={
"xch": {
"confirmed_wallet_balance": -XCH_REQUESTED - maker_xch_royalties_expected - FEE,
">=#spendable_balance": 1,
">=#max_send_amount": 1,
"<=#pending_change": -1,
">=#spendable_balance": 0,
">=#max_send_amount": 0,
"<=#pending_change": 0,
"pending_coin_removal_count": -fee_coins - xch_coins,
# Parametrizations make unspent_coin_count too complicated
"set_remainder": True,
Expand Down
Loading
Loading