mirror of
https://github.com/Chia-Network/chia-blockchain.git
synced 2024-09-20 16:08:51 +03:00
add maker nft1 offer test
This commit is contained in:
parent
1d284525de
commit
88688cac3a
@ -852,7 +852,7 @@ class NFTWallet:
|
||||
|
||||
return (unsigned_spend_bundle, chia_tx)
|
||||
|
||||
@classmethod
|
||||
# @classmethod
|
||||
async def make_nft1_offer( # type: ignore
|
||||
self,
|
||||
offer_dict: Dict[Optional[bytes32], int],
|
||||
@ -878,6 +878,26 @@ class NFTWallet:
|
||||
offered: bool = list(offer_dict.items())[0][1] < 0
|
||||
|
||||
if nft and offered:
|
||||
p2_ph = await self.wallet_state_manager.main_wallet.get_new_puzzlehash()
|
||||
offered_coins = await self.get_coins_to_offer(offered_asset_id, abs(offer_dict[offered_asset_id]))
|
||||
requested_asset = list(offer_dict.items())[1][0]
|
||||
requested_amount = list(offer_dict.items())[1][1]
|
||||
notarized_payments = Offer.notarize_payments(
|
||||
{requested_asset: [Payment(p2_ph, uint64(requested_amount), [p2_ph])]},
|
||||
list(offered_coins)
|
||||
)
|
||||
announcements = Offer.calculate_announcements(notarized_payments, driver_dict)
|
||||
txs = await self.generate_signed_transaction(
|
||||
[abs(offer_dict[offered_asset_id])],
|
||||
[Offer.ph()],
|
||||
fee=fee,
|
||||
coins=offered_coins,
|
||||
puzzle_announcements_to_consume=announcements,
|
||||
)
|
||||
transaction_bundles: List[Optional[SpendBundle]] = [tx.spend_bundle for tx in txs]
|
||||
total_spend_bundle = SpendBundle.aggregate(list(filter(lambda b: b is not None, transaction_bundles)))
|
||||
offer = Offer(notarized_payments, total_spend_bundle, driver_dict)
|
||||
|
||||
pass
|
||||
else:
|
||||
pass
|
||||
|
@ -9,6 +9,7 @@ from chia.types.blockchain_format.coin import Coin, coin_as_list
|
||||
from chia.types.blockchain_format.program import Program
|
||||
from chia.types.blockchain_format.sized_bytes import bytes32
|
||||
from chia.types.spend_bundle import SpendBundle
|
||||
from chia.util.byte_types import hexstr_to_bytes
|
||||
from chia.util.db_wrapper import DBWrapper
|
||||
from chia.util.hash import std_hash
|
||||
from chia.util.ints import uint32, uint64
|
||||
@ -665,10 +666,12 @@ class TradeManager:
|
||||
AssetType.OWNERSHIP.value,
|
||||
]
|
||||
)
|
||||
and isinstance(puzzle_info["transfer_program"], PuzzleInfo)
|
||||
and puzzle_info["transfer_program"].type() == AssetType.ROYALTY_TRANSFER_PROGRAM
|
||||
and puzzle_info.also().also().info["transfer_program"]["type"] == "royalty transfer program"
|
||||
):
|
||||
return await NFTWallet.make_nft1_offer(offer_dict, driver_dict, fee)
|
||||
|
||||
asset_id = bytes32(hexstr_to_bytes(puzzle_info.info["launcher_id"]))
|
||||
wallet = await self.wallet_state_manager.get_wallet_for_asset_id(asset_id.hex())
|
||||
return await wallet.make_nft1_offer(offer_dict, driver_dict, fee)
|
||||
return None
|
||||
|
||||
async def check_for_special_offer_taking(self, offer: Offer, fee: uint64) -> Optional[Offer]:
|
||||
|
164
tests/wallet/nft_wallet/test_nft_1_offers.py
Normal file
164
tests/wallet/nft_wallet/test_nft_1_offers.py
Normal file
@ -0,0 +1,164 @@
|
||||
import asyncio
|
||||
import logging
|
||||
from typing import Any
|
||||
from secrets import token_bytes
|
||||
import pytest
|
||||
from clvm_tools.binutils import disassemble
|
||||
|
||||
from chia.consensus.block_rewards import calculate_base_farmer_reward, calculate_pool_reward
|
||||
from chia.full_node.mempool_manager import MempoolManager
|
||||
from chia.rpc.wallet_rpc_api import WalletRpcApi
|
||||
from chia.simulator.full_node_simulator import FullNodeSimulator
|
||||
from chia.simulator.simulator_protocol import FarmNewBlockProtocol
|
||||
from chia.types.blockchain_format.program import Program
|
||||
from chia.types.blockchain_format.sized_bytes import bytes32
|
||||
from chia.types.peer_info import PeerInfo
|
||||
from chia.util.bech32m import encode_puzzle_hash
|
||||
from chia.util.byte_types import hexstr_to_bytes
|
||||
from chia.util.ints import uint16, uint32, uint64
|
||||
from chia.wallet.did_wallet.did_wallet import DIDWallet
|
||||
from chia.wallet.nft_wallet.nft_wallet import NFTWallet
|
||||
from chia.wallet.outer_puzzles import match_puzzle, create_asset_id
|
||||
from chia.wallet.puzzle_drivers import PuzzleInfo, Solver
|
||||
from chia.wallet.util.compute_memos import compute_memos
|
||||
from chia.wallet.util.wallet_types import WalletType
|
||||
from tests.time_out_assert import time_out_assert, time_out_assert_not_none
|
||||
|
||||
logging.getLogger("aiosqlite").setLevel(logging.INFO) # Too much logging on debug level
|
||||
|
||||
|
||||
async def tx_in_pool(mempool: MempoolManager, tx_id: bytes32) -> bool:
|
||||
tx = mempool.get_spendbundle(tx_id)
|
||||
if tx is None:
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"trusted",
|
||||
[True],
|
||||
)
|
||||
@pytest.mark.asyncio
|
||||
async def test_nft_offer_with_did_wallet(two_wallet_nodes: Any, trusted: Any) -> None:
|
||||
num_blocks = 2
|
||||
full_nodes, wallets = two_wallet_nodes
|
||||
full_node_api: FullNodeSimulator = full_nodes[0]
|
||||
full_node_server = full_node_api.server
|
||||
wallet_node_maker, server_0 = wallets[0]
|
||||
wallet_node_taker, server_1 = wallets[1]
|
||||
wallet_maker = wallet_node_maker.wallet_state_manager.main_wallet
|
||||
wallet_taker = wallet_node_taker.wallet_state_manager.main_wallet
|
||||
|
||||
ph_maker = await wallet_maker.get_new_puzzlehash()
|
||||
ph_taker = await wallet_taker.get_new_puzzlehash()
|
||||
# token_ph = bytes32(token_bytes())
|
||||
|
||||
if trusted:
|
||||
wallet_node_maker.config["trusted_peers"] = {
|
||||
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
||||
}
|
||||
wallet_node_taker.config["trusted_peers"] = {
|
||||
full_node_api.full_node.server.node_id.hex(): full_node_api.full_node.server.node_id.hex()
|
||||
}
|
||||
else:
|
||||
wallet_node_maker.config["trusted_peers"] = {}
|
||||
wallet_node_taker.config["trusted_peers"] = {}
|
||||
|
||||
await server_0.start_client(PeerInfo("localhost", uint16(full_node_server._port)), None)
|
||||
await server_1.start_client(PeerInfo("localhost", uint16(full_node_server._port)), None)
|
||||
|
||||
for _ in range(1, num_blocks):
|
||||
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_maker))
|
||||
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_taker))
|
||||
|
||||
funds = sum(
|
||||
[calculate_pool_reward(uint32(i)) + calculate_base_farmer_reward(uint32(i)) for i in range(1, num_blocks - 1)]
|
||||
)
|
||||
|
||||
await time_out_assert(10, wallet_maker.get_unconfirmed_balance, funds)
|
||||
await time_out_assert(10, wallet_maker.get_confirmed_balance, funds)
|
||||
for _ in range(1, num_blocks):
|
||||
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_maker))
|
||||
|
||||
for _ in range(1, num_blocks):
|
||||
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_maker))
|
||||
|
||||
did_wallet_maker: DIDWallet = await DIDWallet.create_new_did_wallet(
|
||||
wallet_node_maker.wallet_state_manager, wallet_maker, uint64(1)
|
||||
)
|
||||
spend_bundle_list = await wallet_node_maker.wallet_state_manager.tx_store.get_unconfirmed_for_wallet(
|
||||
wallet_maker.id()
|
||||
)
|
||||
|
||||
spend_bundle = spend_bundle_list[0].spend_bundle
|
||||
await time_out_assert_not_none(5, full_node_api.full_node.mempool_manager.get_spendbundle, spend_bundle.name())
|
||||
|
||||
for _ in range(1, num_blocks):
|
||||
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_maker))
|
||||
await time_out_assert(15, wallet_maker.get_pending_change_balance, 0)
|
||||
hex_did_id = did_wallet_maker.get_my_DID()
|
||||
did_id = bytes32.fromhex(hex_did_id)
|
||||
target_puzhash = ph_maker
|
||||
royalty_puzhash = ph_maker
|
||||
royalty_percentage = uint16(200)
|
||||
|
||||
nft_wallet_maker = await NFTWallet.create_new_nft_wallet(
|
||||
wallet_node_maker.wallet_state_manager, wallet_maker, name="NFT WALLET DID 1", did_id=did_id
|
||||
)
|
||||
metadata = Program.to(
|
||||
[
|
||||
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
||||
("h", "0xD4584AD463139FA8C0D9F68F4B59F185"),
|
||||
]
|
||||
)
|
||||
await time_out_assert(10, wallet_maker.get_unconfirmed_balance, 5999999999999)
|
||||
await time_out_assert(10, wallet_maker.get_confirmed_balance, 5999999999999)
|
||||
sb = await nft_wallet_maker.generate_new_nft(
|
||||
metadata,
|
||||
target_puzhash,
|
||||
royalty_puzhash,
|
||||
royalty_percentage,
|
||||
did_id,
|
||||
)
|
||||
assert sb
|
||||
# ensure hints are generated
|
||||
assert compute_memos(sb)
|
||||
await time_out_assert_not_none(5, full_node_api.full_node.mempool_manager.get_spendbundle, sb.name())
|
||||
|
||||
for i in range(1, num_blocks):
|
||||
await full_node_api.farm_new_transaction_block(FarmNewBlockProtocol(ph_maker))
|
||||
|
||||
await time_out_assert(10, len, 1, nft_wallet_maker.nft_wallet_info.my_nft_coins)
|
||||
|
||||
|
||||
# TAKER SETUP - NO DID
|
||||
nft_wallet_taker = await NFTWallet.create_new_nft_wallet(
|
||||
wallet_node_taker.wallet_state_manager, wallet_taker, name="NFT WALLET TAKER"
|
||||
)
|
||||
|
||||
# maker create offer: NFT for xch
|
||||
trade_manager_maker = wallet_maker.wallet_state_manager.trade_manager
|
||||
trade_manager_taker = wallet_taker.wallet_state_manager.trade_manager
|
||||
|
||||
coins_maker = nft_wallet_maker.nft_wallet_info.my_nft_coins
|
||||
assert len(coins_maker) == 1
|
||||
coins_taker = nft_wallet_taker.nft_wallet_info.my_nft_coins
|
||||
assert len(coins_taker) == 0
|
||||
|
||||
nft_to_offer = coins_maker[0]
|
||||
nft_to_offer_info: Optional[PuzzleInfo] = match_puzzle(nft_to_offer.full_puzzle)
|
||||
nft_to_offer_asset_id: bytes32 = create_asset_id(nft_to_offer_info) # type: ignore
|
||||
xch_requested = 1000
|
||||
maker_fee = uint64(433)
|
||||
driver_dict: Dict[bytes32, Optional[PuzzleInfo]] = {nft_to_offer_asset_id: nft_to_offer_info}
|
||||
|
||||
offer_did_nft_for_xch = {nft_to_offer_asset_id: -1, wallet_maker.id(): xch_requested}
|
||||
|
||||
success, trade_make, error = await trade_manager_maker.create_offer_for_ids(
|
||||
offer_did_nft_for_xch, driver_dict, fee=maker_fee
|
||||
)
|
||||
|
||||
await asyncio.sleep(1)
|
||||
assert success is True
|
||||
assert error is None
|
||||
assert trade_make is not None
|
Loading…
Reference in New Issue
Block a user