mirror of
https://github.com/Chia-Network/chia-blockchain.git
synced 2026-09-05 02:24:21 -05:00
Merge pull request #11909 from Chia-Network/more_nft_clvm_fixes
More nft clvm fixes
This commit is contained in:
@@ -95,7 +95,7 @@ jobs:
|
||||
- name: Test wallet-nft_wallet code with pytest
|
||||
run: |
|
||||
. ./activate
|
||||
venv/bin/coverage run --rcfile=.coveragerc --module pytest --durations=10 -n 0 -m "not benchmark" tests/wallet/nft_wallet/test_nft_clvm.py tests/wallet/nft_wallet/test_nft_lifecycle.py tests/wallet/nft_wallet/test_nft_offers.py tests/wallet/nft_wallet/test_nft_puzzles.py tests/wallet/nft_wallet/test_nft_wallet.py
|
||||
venv/bin/coverage run --rcfile=.coveragerc --module pytest --durations=10 -n 0 -m "not benchmark" tests/wallet/nft_wallet/test_nft_lifecycle.py tests/wallet/nft_wallet/test_nft_offers.py tests/wallet/nft_wallet/test_nft_puzzles.py tests/wallet/nft_wallet/test_nft_wallet.py
|
||||
|
||||
- name: Process coverage data
|
||||
run: |
|
||||
|
||||
@@ -94,7 +94,7 @@ jobs:
|
||||
- name: Test wallet-nft_wallet code with pytest
|
||||
run: |
|
||||
. ./activate
|
||||
venv/bin/coverage run --rcfile=.coveragerc --module pytest --durations=10 -n 0 -m "not benchmark" tests/wallet/nft_wallet/test_nft_clvm.py tests/wallet/nft_wallet/test_nft_lifecycle.py tests/wallet/nft_wallet/test_nft_offers.py tests/wallet/nft_wallet/test_nft_puzzles.py tests/wallet/nft_wallet/test_nft_wallet.py
|
||||
venv/bin/coverage run --rcfile=.coveragerc --module pytest --durations=10 -n 0 -m "not benchmark" tests/wallet/nft_wallet/test_nft_lifecycle.py tests/wallet/nft_wallet/test_nft_offers.py tests/wallet/nft_wallet/test_nft_puzzles.py tests/wallet/nft_wallet/test_nft_wallet.py
|
||||
|
||||
- name: Process coverage data
|
||||
run: |
|
||||
|
||||
@@ -9,7 +9,6 @@ from chia.types.blockchain_format.sized_bytes import bytes32
|
||||
from chia.util.ints import uint16, uint64
|
||||
from chia.wallet.nft_wallet.nft_info import NFTCoinInfo, NFTInfo
|
||||
from chia.wallet.nft_wallet.uncurry_nft import UncurriedNFT
|
||||
from chia.wallet.puzzles.cat_loader import CAT_MOD
|
||||
from chia.wallet.puzzles.load_clvm import load_clvm
|
||||
from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import solution_for_conditions
|
||||
|
||||
@@ -20,7 +19,6 @@ NFT_STATE_LAYER_MOD = load_clvm("nft_state_layer.clvm")
|
||||
LAUNCHER_PUZZLE_HASH = LAUNCHER_PUZZLE.get_tree_hash()
|
||||
SINGLETON_MOD_HASH = SINGLETON_TOP_LAYER_MOD.get_tree_hash()
|
||||
NFT_STATE_LAYER_MOD_HASH = NFT_STATE_LAYER_MOD.get_tree_hash()
|
||||
OFFER_MOD = load_clvm("settlement_payments.clvm")
|
||||
NFT_METADATA_UPDATER = load_clvm("nft_metadata_updater_default.clvm")
|
||||
NFT_OWNERSHIP_LAYER = load_clvm("nft_ownership_layer.clvm")
|
||||
NFT_TRANSFER_PROGRAM_DEFAULT = load_clvm("nft_ownership_transfer_program_one_way_claim_with_royalties.clvm")
|
||||
@@ -213,8 +211,6 @@ def create_ownership_layer_puzzle(
|
||||
singleton_struct,
|
||||
royalty_puzzle_hash,
|
||||
percentage,
|
||||
OFFER_MOD.get_tree_hash(),
|
||||
CAT_MOD.get_tree_hash(),
|
||||
)
|
||||
nft_inner_puzzle = p2_puzzle
|
||||
|
||||
|
||||
@@ -148,7 +148,7 @@ class UncurriedNFT:
|
||||
log.debug("Parsing ownership layer")
|
||||
_, current_did, transfer_program, p2_puzzle = ol_args.as_iter()
|
||||
transfer_program_mod, transfer_program_args = transfer_program.uncurry()
|
||||
_, royalty_address_p, royalty_percentage, _, _ = transfer_program_args.as_iter()
|
||||
_, royalty_address_p, royalty_percentage = transfer_program_args.as_iter()
|
||||
royalty_percentage = uint16(royalty_percentage.as_int())
|
||||
royalty_address = royalty_address_p.atom
|
||||
current_did = current_did.atom
|
||||
|
||||
@@ -27,6 +27,15 @@
|
||||
)
|
||||
)
|
||||
|
||||
(defmacro and ARGS
|
||||
(if ARGS
|
||||
(qq (if (unquote (f ARGS))
|
||||
(unquote (c and (r ARGS)))
|
||||
()
|
||||
))
|
||||
1)
|
||||
)
|
||||
|
||||
(defun-inline nft_ownership_layer_puzzle_hash (NFT_OWNERSHIP_LAYER_MOD_HASH new_owner TRANSFER_PROGRAM inner_puzzle_hash)
|
||||
(puzzle-hash-of-curried-function NFT_OWNERSHIP_LAYER_MOD_HASH
|
||||
inner_puzzle_hash
|
||||
@@ -67,10 +76,10 @@
|
||||
)
|
||||
)
|
||||
(if (= (f (f conditions)) CREATE_PUZZLE_ANNOUNCEMENT)
|
||||
(assert (all
|
||||
(not (= (substr (f (r (f conditions))) 0 8) ANNOUNCEMENT_PREFIX))
|
||||
(assert (not (and
|
||||
(= 40 (strlen (f (r (f conditions)))))
|
||||
)
|
||||
(= (substr (f (r (f conditions))) 0 8) ANNOUNCEMENT_PREFIX) ; lazy eval
|
||||
))
|
||||
; then
|
||||
(c (f conditions) (wrap_odd_create_coins NFT_OWNERSHIP_LAYER_MOD_HASH TRANSFER_PROGRAM CURRENT_OWNER all_conditions (r conditions) odd_args tp_output))
|
||||
)
|
||||
@@ -78,14 +87,12 @@
|
||||
)
|
||||
)
|
||||
)
|
||||
(assert odd_args
|
||||
; then
|
||||
(construct_end_conditions NFT_OWNERSHIP_LAYER_MOD_HASH TRANSFER_PROGRAM odd_args
|
||||
(if tp_output
|
||||
tp_output
|
||||
(a TRANSFER_PROGRAM (list CURRENT_OWNER all_conditions ()))
|
||||
)
|
||||
)
|
||||
; odd_args is guaranteed to not be nil or else we'll have a path into atom error
|
||||
(construct_end_conditions NFT_OWNERSHIP_LAYER_MOD_HASH TRANSFER_PROGRAM odd_args
|
||||
(if tp_output
|
||||
tp_output
|
||||
(a TRANSFER_PROGRAM (list CURRENT_OWNER all_conditions ()))
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
@@ -102,7 +109,7 @@
|
||||
CURRENT_OWNER
|
||||
conditions
|
||||
conditions
|
||||
() () () () ()
|
||||
() ()
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
@@ -1 +1 @@
|
||||
ff02ffff01ff02ff26ffff04ff02ffff04ff05ffff04ff17ffff04ff0bffff04ffff02ff2fff5f80ff80808080808080ffff04ffff01ffffff88ad4cd55cf7ad6414ff0233ffff3e04ff81f601ffffff0102ffff02ffff03ff05ffff01ff02ff2affff04ff02ffff04ff0dffff04ffff0bff32ffff0bff3cff3480ffff0bff32ffff0bff32ffff0bff3cff2280ff0980ffff0bff32ff0bffff0bff3cff8080808080ff8080808080ffff010b80ff0180ff04ffff04ff38ffff04ffff02ff36ffff04ff02ffff04ff05ffff04ff27ffff04ffff02ff2effff04ff02ffff04ffff02ffff03ff81afffff0181afffff010b80ff0180ff80808080ffff04ffff0bff3cff4f80ffff04ffff0bff3cff0580ff8080808080808080ff378080ff82016f80ffffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff2fffff01ff80ff80ff80ff80ff808080808080808080ff0bff32ffff0bff3cff2880ffff0bff32ffff0bff32ffff0bff3cff2280ff0580ffff0bff32ffff02ff2affff04ff02ffff04ff07ffff04ffff0bff3cff3c80ff8080808080ffff0bff3cff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ffff03ff5fffff01ff02ffff03ffff09ff82011fff3880ffff01ff02ffff03ffff09ffff18ff82059f80ff3c80ffff01ff02ffff03ffff20ff81bf80ffff01ff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff82019fffff04ff82017fff80808080808080808080ffff01ff088080ff0180ffff01ff04ff819fffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ff82017fff808080808080808080808080ff0180ffff01ff02ffff03ffff09ff82011fff2c80ffff01ff02ffff03ffff20ff82017f80ffff01ff04ffff04ff24ffff04ffff0eff10ffff02ff2effff04ff02ffff04ff82019fff8080808080ff808080ffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ffff02ff0bffff04ff17ffff04ff2fffff04ff82019fff8080808080ff8080808080808080808080ffff01ff088080ff0180ffff01ff02ffff03ffff09ff82011fff2480ffff01ff02ffff03ffff22ffff20ffff09ffff0cff82029fff80ffff010880ff108080ffff09ffff0128ffff0dff82029f808080ffff01ff04ff819fffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ff82017fff8080808080808080808080ffff01ff088080ff0180ffff01ff04ff819fffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ff82017fff808080808080808080808080ff018080ff018080ff0180ffff01ff02ffff03ff81bfffff01ff02ff3affff04ff02ffff04ff05ffff04ff0bffff04ff81bfffff04ffff02ffff03ff82017fffff0182017fffff01ff02ff0bffff04ff17ffff04ff2fffff01ff808080808080ff0180ff80808080808080ffff01ff088080ff018080ff0180ff018080
|
||||
ff02ffff01ff02ff26ffff04ff02ffff04ff05ffff04ff17ffff04ff0bffff04ffff02ff2fff5f80ff80808080808080ffff04ffff01ffffff88ad4cd55cf7ad6414ff0233ffff3e04ff81f601ffffff0102ffff02ffff03ff05ffff01ff02ff2affff04ff02ffff04ff0dffff04ffff0bff32ffff0bff3cff3480ffff0bff32ffff0bff32ffff0bff3cff2280ff0980ffff0bff32ff0bffff0bff3cff8080808080ff8080808080ffff010b80ff0180ff04ffff04ff38ffff04ffff02ff36ffff04ff02ffff04ff05ffff04ff27ffff04ffff02ff2effff04ff02ffff04ffff02ffff03ff81afffff0181afffff010b80ff0180ff80808080ffff04ffff0bff3cff4f80ffff04ffff0bff3cff0580ff8080808080808080ff378080ff82016f80ffffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff2fffff01ff80ff808080808080808080ff0bff32ffff0bff3cff2880ffff0bff32ffff0bff32ffff0bff3cff2280ff0580ffff0bff32ffff02ff2affff04ff02ffff04ff07ffff04ffff0bff3cff3c80ff8080808080ffff0bff3cff8080808080ffff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff2effff04ff02ffff04ff09ff80808080ffff02ff2effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff02ffff03ff5fffff01ff02ffff03ffff09ff82011fff3880ffff01ff02ffff03ffff09ffff18ff82059f80ff3c80ffff01ff02ffff03ffff20ff81bf80ffff01ff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff82019fffff04ff82017fff80808080808080808080ffff01ff088080ff0180ffff01ff04ff819fffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ff82017fff808080808080808080808080ff0180ffff01ff02ffff03ffff09ff82011fff2c80ffff01ff02ffff03ffff20ff82017f80ffff01ff04ffff04ff24ffff04ffff0eff10ffff02ff2effff04ff02ffff04ff82019fff8080808080ff808080ffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ffff02ff0bffff04ff17ffff04ff2fffff04ff82019fff8080808080ff8080808080808080808080ffff01ff088080ff0180ffff01ff02ffff03ffff09ff82011fff2480ffff01ff02ffff03ffff20ffff02ffff03ffff09ffff0128ffff0dff82029f8080ffff01ff02ffff03ffff09ffff0cff82029fff80ffff010880ff1080ffff01ff0101ff8080ff0180ff8080ff018080ffff01ff04ff819fffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ff82017fff8080808080808080808080ffff01ff088080ff0180ffff01ff04ff819fffff02ff3effff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfffff04ff82017fff808080808080808080808080ff018080ff018080ff0180ffff01ff02ff3affff04ff02ffff04ff05ffff04ff0bffff04ff81bfffff04ffff02ffff03ff82017fffff0182017fffff01ff02ff0bffff04ff17ffff04ff2fffff01ff808080808080ff0180ff8080808080808080ff0180ff018080
|
||||
@@ -1 +1 @@
|
||||
dacf3308015a4dd77e45a3f79c8b3cea7ec637d05554894c3eb5f779b17f379b
|
||||
78b4462709594b0f380110b83dfb33708597638100f0c08367ee9a05ee16329f
|
||||
+5
-18
@@ -3,8 +3,6 @@
|
||||
SINGLETON_STRUCT
|
||||
ROYALTY_ADDRESS
|
||||
TRADE_PRICE_PERCENTAGE
|
||||
SETTLEMENT_MOD_HASH
|
||||
CAT_MOD_HASH
|
||||
Current_Owner ; Truth
|
||||
conditions ; Truth
|
||||
solution ; created from the NFT's inner puzzle - solution is (new_owner trade_prices_list new_did_inner_hash)
|
||||
@@ -39,33 +37,22 @@
|
||||
(c (f SINGLETON_STRUCT) (c singleton_id (r (r SINGLETON_STRUCT))))
|
||||
)
|
||||
|
||||
(defun-inline cat_settlement_puzzle_hash (CAT_MOD_HASH tail_hash SETTLEMENT_MOD_HASH)
|
||||
(puzzle-hash-of-curried-function CAT_MOD_HASH
|
||||
SETTLEMENT_MOD_HASH
|
||||
(sha256 ONE tail_hash)
|
||||
(sha256 ONE CAT_MOD_HASH)
|
||||
)
|
||||
)
|
||||
|
||||
(defun-inline calculate_percentage (amount percentage)
|
||||
(f (divmod (* amount percentage) TEN_THOUSAND))
|
||||
)
|
||||
|
||||
; Loop of the trade prices list and either assert a puzzle announcement or generate xch
|
||||
(defun parse_trade_prices_list (ROYALTY_ADDRESS TRADE_PRICE_PERCENTAGE SETTLEMENT_MOD_HASH CAT_MOD_HASH trade_prices_list my_nft_id)
|
||||
(defun parse_trade_prices_list (ROYALTY_ADDRESS TRADE_PRICE_PERCENTAGE trade_prices_list my_nft_id)
|
||||
(if trade_prices_list
|
||||
(c
|
||||
(list
|
||||
ASSERT_PUZZLE_ANNOUNCEMENT
|
||||
(sha256
|
||||
(if (r (f trade_prices_list))
|
||||
(cat_settlement_puzzle_hash CAT_MOD_HASH (f (r (f trade_prices_list))) SETTLEMENT_MOD_HASH)
|
||||
SETTLEMENT_MOD_HASH
|
||||
)
|
||||
(f (r (f trade_prices_list)))
|
||||
(sha256tree1 (c my_nft_id (list (list ROYALTY_ADDRESS (calculate_percentage (f (f trade_prices_list)) TRADE_PRICE_PERCENTAGE) (list ROYALTY_ADDRESS)))))
|
||||
)
|
||||
)
|
||||
(parse_trade_prices_list ROYALTY_ADDRESS TRADE_PRICE_PERCENTAGE SETTLEMENT_MOD_HASH CAT_MOD_HASH (r trade_prices_list) my_nft_id)
|
||||
(parse_trade_prices_list ROYALTY_ADDRESS TRADE_PRICE_PERCENTAGE (r trade_prices_list) my_nft_id)
|
||||
)
|
||||
()
|
||||
)
|
||||
@@ -87,9 +74,9 @@
|
||||
(f (r SINGLETON_STRUCT))
|
||||
)
|
||||
)
|
||||
(parse_trade_prices_list ROYALTY_ADDRESS TRADE_PRICE_PERCENTAGE SETTLEMENT_MOD_HASH CAT_MOD_HASH (f (r solution)) (f (r SINGLETON_STRUCT)))
|
||||
(parse_trade_prices_list ROYALTY_ADDRESS TRADE_PRICE_PERCENTAGE (f (r solution)) (f (r SINGLETON_STRUCT)))
|
||||
)
|
||||
(parse_trade_prices_list ROYALTY_ADDRESS TRADE_PRICE_PERCENTAGE SETTLEMENT_MOD_HASH CAT_MOD_HASH (f (r solution)) (f (r SINGLETON_STRUCT)))
|
||||
(parse_trade_prices_list ROYALTY_ADDRESS TRADE_PRICE_PERCENTAGE (f (r solution)) (f (r SINGLETON_STRUCT)))
|
||||
)
|
||||
)
|
||||
(list Current_Owner () ())
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
ff02ffff01ff02ffff03ff8202ffffff01ff04ff8204ffffff04ff80ffff04ffff02ffff03ffff22ff8204ffffff20ffff09ff8204ffff81bf808080ffff01ff04ffff04ff10ffff04ffff0bffff02ff2effff04ff02ffff04ff09ffff04ff8216ffffff04ffff02ff3effff04ff02ffff04ffff04ff09ffff04ff8204ffff1d8080ff80808080ff808080808080ff1580ff808080ffff02ff16ffff04ff02ffff04ff0bffff04ff17ffff04ff2fffff04ff5fffff04ff820affffff04ff15ff80808080808080808080ffff01ff02ff16ffff04ff02ffff04ff0bffff04ff17ffff04ff2fffff04ff5fffff04ff820affffff04ff15ff80808080808080808080ff0180ff80808080ffff01ff04ff81bfffff01ff80ff80808080ff0180ffff04ffff01ffffff3f02ff04ff0101ffff822710ff02ff02ffff03ff05ffff01ff02ff3affff04ff02ffff04ff0dffff04ffff0bff2affff0bff2cff1480ffff0bff2affff0bff2affff0bff2cff3c80ff0980ffff0bff2aff0bffff0bff2cff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ff5fffff01ff04ffff04ff10ffff04ffff0bffff02ffff03ff82019fffff01ff02ff2effff04ff02ffff04ff2fffff04ff17ffff04ffff0bff2cff82029f80ffff04ffff0bff2cff2f80ff80808080808080ffff011780ff0180ffff02ff3effff04ff02ffff04ffff04ff81bfffff04ffff04ff05ffff04ffff05ffff14ffff12ff82011fff0b80ff128080ffff04ffff04ff05ff8080ff80808080ff808080ff8080808080ff808080ffff02ff16ffff04ff02ffff04ff05ffff04ff0bffff04ff17ffff04ff2fffff04ff81dfffff04ff81bfff80808080808080808080ff8080ff0180ffff0bff2affff0bff2cff1880ffff0bff2affff0bff2affff0bff2cff3c80ff0580ffff0bff2affff02ff3affff04ff02ffff04ff07ffff04ffff0bff2cff2c80ff8080808080ffff0bff2cff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ff09ff80808080ffff02ff3effff04ff02ffff04ff0dff8080808080ffff01ff0bff2cff058080ff0180ff018080
|
||||
ff02ffff01ff02ffff03ff81bfffff01ff04ff82013fffff04ff80ffff04ffff02ffff03ffff22ff82013fffff20ffff09ff82013fff2f808080ffff01ff04ffff04ff10ffff04ffff0bffff02ff2effff04ff02ffff04ff09ffff04ff8205bfffff04ffff02ff3effff04ff02ffff04ffff04ff09ffff04ff82013fff1d8080ff80808080ff808080808080ff1580ff808080ffff02ff16ffff04ff02ffff04ff0bffff04ff17ffff04ff8202bfffff04ff15ff8080808080808080ffff01ff02ff16ffff04ff02ffff04ff0bffff04ff17ffff04ff8202bfffff04ff15ff8080808080808080ff0180ff80808080ffff01ff04ff2fffff01ff80ff80808080ff0180ffff04ffff01ffffff3f02ff04ff0101ffff822710ff02ff02ffff03ff05ffff01ff02ff3affff04ff02ffff04ff0dffff04ffff0bff2affff0bff2cff1480ffff0bff2affff0bff2affff0bff2cff3c80ff0980ffff0bff2aff0bffff0bff2cff8080808080ff8080808080ffff010b80ff0180ffff02ffff03ff17ffff01ff04ffff04ff10ffff04ffff0bff81a7ffff02ff3effff04ff02ffff04ffff04ff2fffff04ffff04ff05ffff04ffff05ffff14ffff12ff47ff0b80ff128080ffff04ffff04ff05ff8080ff80808080ff808080ff8080808080ff808080ffff02ff16ffff04ff02ffff04ff05ffff04ff0bffff04ff37ffff04ff2fff8080808080808080ff8080ff0180ffff0bff2affff0bff2cff1880ffff0bff2affff0bff2affff0bff2cff3c80ff0580ffff0bff2affff02ff3affff04ff02ffff04ff07ffff04ffff0bff2cff2c80ff8080808080ffff0bff2cff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ff09ff80808080ffff02ff3effff04ff02ffff04ff0dff8080808080ffff01ff0bff2cff058080ff0180ff018080
|
||||
+1
-1
@@ -1 +1 @@
|
||||
a1d8a6b55005270d3a27214d6ddb2762ec7d2814e67132c6b542fdd6874a6887
|
||||
b85ecd45b81ec12f11a738cff62aa8e7b6aab892265c9cc9dcb0ec384eb3a42a
|
||||
|
||||
@@ -1,292 +0,0 @@
|
||||
import pytest
|
||||
|
||||
from chia.types.announcement import Announcement
|
||||
from chia.types.blockchain_format.program import INFINITE_COST, Program
|
||||
from chia.wallet.puzzles.cat_loader import CAT_MOD
|
||||
from chia.wallet.puzzles.load_clvm import load_clvm
|
||||
from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import puzzle_for_pk, solution_for_conditions
|
||||
from chia.wallet.puzzles.puzzle_utils import make_create_coin_condition
|
||||
from tests.core.make_block_generator import int_to_public_key
|
||||
|
||||
SINGLETON_MOD = load_clvm("singleton_top_layer.clvm")
|
||||
LAUNCHER_PUZZLE = load_clvm("singleton_launcher.clvm")
|
||||
DID_MOD = load_clvm("did_innerpuz.clvm")
|
||||
NFT_STATE_LAYER_MOD = load_clvm("nft_state_layer.clvm")
|
||||
NFT_OWNERSHIP_LAYER = load_clvm("nft_ownership_layer.clvm")
|
||||
NFT_TRANSFER_PROGRAM = load_clvm("nft_ownership_transfer_program_one_way_claim_with_royalties.clvm")
|
||||
STANDARD_PUZZLE_MOD = load_clvm("p2_delegated_puzzle_or_hidden_puzzle.clvm")
|
||||
LAUNCHER_PUZZLE_HASH = LAUNCHER_PUZZLE.get_tree_hash()
|
||||
NFT_STATE_LAYER_MOD_HASH = NFT_STATE_LAYER_MOD.get_tree_hash()
|
||||
SINGLETON_MOD_HASH = SINGLETON_MOD.get_tree_hash()
|
||||
OFFER_MOD = load_clvm("settlement_payments.clvm")
|
||||
|
||||
LAUNCHER_ID = Program.to(b"launcher-id").get_tree_hash()
|
||||
NFT_METADATA_UPDATER_DEFAULT = load_clvm("nft_metadata_updater_default.clvm")
|
||||
NFT_METADATA_UPDATER_UPDATEABLE = load_clvm("nft_metadata_updater_updateable.clvm")
|
||||
|
||||
|
||||
@pytest.mark.skip
|
||||
def test_new_nft_state_layer() -> None:
|
||||
pubkey = int_to_public_key(1)
|
||||
innerpuz = puzzle_for_pk(pubkey)
|
||||
my_amount = 1
|
||||
destination: Program = puzzle_for_pk(int_to_public_key(2))
|
||||
condition_list = [make_create_coin_condition(destination.get_tree_hash(), my_amount, [])]
|
||||
metadata = [
|
||||
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
||||
("h", 0xD4584AD463139FA8C0D9F68F4B59F185),
|
||||
]
|
||||
solution = Program.to(
|
||||
[
|
||||
NFT_STATE_LAYER_MOD_HASH,
|
||||
metadata,
|
||||
NFT_METADATA_UPDATER_DEFAULT.get_tree_hash(),
|
||||
innerpuz,
|
||||
# below here is the solution
|
||||
solution_for_conditions(condition_list),
|
||||
my_amount,
|
||||
]
|
||||
)
|
||||
|
||||
cost, res = NFT_STATE_LAYER_MOD.run_with_cost(INFINITE_COST, solution)
|
||||
assert res.first().first().as_int() == 73
|
||||
assert res.first().rest().first().as_int() == 1
|
||||
assert res.rest().rest().first().first().as_int() == 51
|
||||
assert (
|
||||
res.rest().rest().first().rest().first().as_atom()
|
||||
== NFT_STATE_LAYER_MOD.curry(
|
||||
NFT_STATE_LAYER_MOD_HASH, metadata, NFT_METADATA_UPDATER_DEFAULT.get_tree_hash(), destination
|
||||
).get_tree_hash()
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.skip
|
||||
def test_update_metadata() -> None:
|
||||
pubkey = int_to_public_key(1)
|
||||
innerpuz = puzzle_for_pk(pubkey)
|
||||
my_amount = 1
|
||||
destination: Program = puzzle_for_pk(int_to_public_key(2))
|
||||
condition_list = [make_create_coin_condition(destination.get_tree_hash(), my_amount, [])]
|
||||
condition_list.append([-24, NFT_METADATA_UPDATER_DEFAULT, ("mu", "https://url2")])
|
||||
|
||||
metadata = [
|
||||
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
||||
("h", 0xD4584AD463139FA8C0D9F68F4B59F185),
|
||||
("mu", []),
|
||||
("mh", 0xD4584AD463139FA8C0D9F68F4B59F185),
|
||||
("lu", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
||||
("lh", 0xD4584AD463139FA8C0D9F68F4B59F185),
|
||||
]
|
||||
|
||||
solution = Program.to(
|
||||
[
|
||||
NFT_STATE_LAYER_MOD_HASH,
|
||||
metadata,
|
||||
NFT_METADATA_UPDATER_DEFAULT.get_tree_hash(),
|
||||
innerpuz,
|
||||
# below here is the solution
|
||||
solution_for_conditions(condition_list),
|
||||
my_amount,
|
||||
0,
|
||||
]
|
||||
)
|
||||
|
||||
metadata = [
|
||||
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
||||
("h", 0xD4584AD463139FA8C0D9F68F4B59F185),
|
||||
("mu", ["https://url2"]),
|
||||
("mh", 0xD4584AD463139FA8C0D9F68F4B59F185),
|
||||
("lu", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
||||
("lh", 0xD4584AD463139FA8C0D9F68F4B59F185),
|
||||
]
|
||||
cost, res = NFT_STATE_LAYER_MOD.run_with_cost(INFINITE_COST, solution)
|
||||
assert len(res.as_python()) == 3 # check that the negative conditions have been filtered out
|
||||
assert res.first().first().as_int() == 73
|
||||
assert res.first().rest().first().as_int() == 1
|
||||
assert res.rest().rest().first().first().as_int() == 51
|
||||
assert (
|
||||
res.rest().rest().first().rest().first().as_atom()
|
||||
== NFT_STATE_LAYER_MOD.curry(
|
||||
NFT_STATE_LAYER_MOD_HASH, metadata, NFT_METADATA_UPDATER_DEFAULT.get_tree_hash(), destination
|
||||
).get_tree_hash()
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.skip
|
||||
def test_transfer_program() -> None:
|
||||
pubkey = int_to_public_key(1)
|
||||
innerpuz = puzzle_for_pk(pubkey)
|
||||
current_owner = Program.to("current_owner").get_tree_hash()
|
||||
new_owner = Program.to("new_owner").get_tree_hash()
|
||||
new_inner = Program.to("new_owner_inner").get_tree_hash()
|
||||
new_pk = int_to_public_key(2)
|
||||
nft_id = Program.to("nft").get_tree_hash()
|
||||
SINGLETON_STRUCT = Program.to((SINGLETON_MOD_HASH, (nft_id, LAUNCHER_PUZZLE_HASH)))
|
||||
curried_tp = NFT_TRANSFER_PROGRAM.curry(
|
||||
STANDARD_PUZZLE_MOD.get_tree_hash(),
|
||||
SINGLETON_STRUCT,
|
||||
innerpuz.get_tree_hash(),
|
||||
2000, # percentage with 2 decimal points 0 - 10000
|
||||
OFFER_MOD.get_tree_hash(),
|
||||
CAT_MOD.get_tree_hash(),
|
||||
)
|
||||
# Current_Owner
|
||||
# conditions
|
||||
# (
|
||||
# new_owner
|
||||
# trade_prices_list
|
||||
# (new_did_inner_hash) ; this is the opaque transfer_program_solution
|
||||
# )
|
||||
|
||||
# (CREATE_COIN p2dohp odd_number)
|
||||
# (NEW_OWNER_CONDITION new_owner trade_prices_list new_pk transfer_program_solution)
|
||||
trade_prices_list = [[200]]
|
||||
conditions = Program.to(
|
||||
[
|
||||
[51, STANDARD_PUZZLE_MOD.curry(new_pk).get_tree_hash(), 1],
|
||||
[-10, new_owner, trade_prices_list, new_pk, [new_inner]],
|
||||
]
|
||||
)
|
||||
solution = Program.to([current_owner, conditions, [new_owner, trade_prices_list, new_pk, [new_inner]]])
|
||||
cost, res = curried_tp.run_with_cost(INFINITE_COST, solution)
|
||||
assert res.first().as_atom() == new_owner
|
||||
assert res.rest().first().as_int() == 0
|
||||
conditions = res.rest().rest().first()
|
||||
assert conditions.first().first().as_int() == 51
|
||||
assert conditions.first().rest().rest().first().as_int() == 1
|
||||
assert conditions.rest().rest().first().first().as_int() == 63
|
||||
SINGLETON_STRUCT = Program.to((SINGLETON_MOD_HASH, (new_owner, LAUNCHER_PUZZLE_HASH)))
|
||||
new_owner_coin_puzhash = SINGLETON_MOD.curry(SINGLETON_STRUCT, "new_owner_inner").get_tree_hash()
|
||||
assert (
|
||||
conditions.rest().rest().first().rest().first().as_atom() == Announcement(new_owner_coin_puzhash, nft_id).name()
|
||||
)
|
||||
assert conditions.rest().rest().rest().first().first().as_int() == 51
|
||||
assert conditions.rest().rest().rest().first().rest().rest().first().as_int() == 40
|
||||
|
||||
|
||||
@pytest.mark.skip
|
||||
def test_ownership_layer() -> None:
|
||||
pubkey = int_to_public_key(1)
|
||||
innerpuz = puzzle_for_pk(pubkey)
|
||||
destination = int_to_public_key(2)
|
||||
new_did = Program.to("test").get_tree_hash()
|
||||
new_did_inner_hash = Program.to("fake").get_tree_hash()
|
||||
old_did = Program.to("test_2").get_tree_hash()
|
||||
nft_id = Program.to("nft_id").get_tree_hash()
|
||||
trade_prices_list = [[200]]
|
||||
SINGLETON_STRUCT = Program.to((SINGLETON_MOD_HASH, (nft_id, LAUNCHER_PUZZLE_HASH)))
|
||||
curried_tp = NFT_TRANSFER_PROGRAM.curry(
|
||||
STANDARD_PUZZLE_MOD.get_tree_hash(),
|
||||
SINGLETON_STRUCT,
|
||||
innerpuz.get_tree_hash(),
|
||||
2000, # percentage with 2 decimal points 0 - 10000
|
||||
OFFER_MOD.get_tree_hash(),
|
||||
CAT_MOD.get_tree_hash(),
|
||||
)
|
||||
curried_inner = STANDARD_PUZZLE_MOD.curry(pubkey)
|
||||
|
||||
curried_ownership_layer = NFT_OWNERSHIP_LAYER.curry(
|
||||
NFT_OWNERSHIP_LAYER.get_tree_hash(),
|
||||
old_did,
|
||||
curried_tp,
|
||||
curried_inner,
|
||||
)
|
||||
condition_list = [
|
||||
[
|
||||
51,
|
||||
STANDARD_PUZZLE_MOD.curry(destination).get_tree_hash(),
|
||||
1,
|
||||
[STANDARD_PUZZLE_MOD.curry(destination).get_tree_hash()],
|
||||
],
|
||||
[-10, new_did, trade_prices_list, destination, [new_did_inner_hash]],
|
||||
]
|
||||
solution = Program.to([solution_for_conditions(condition_list)])
|
||||
cost, res = curried_ownership_layer.run_with_cost(INFINITE_COST, solution)
|
||||
assert res.first().first().as_int() == 51
|
||||
assert res.first().rest().rest().first().as_int() == 1
|
||||
curried_inner = STANDARD_PUZZLE_MOD.curry(destination)
|
||||
curried_ownership_layer = NFT_OWNERSHIP_LAYER.curry(
|
||||
NFT_OWNERSHIP_LAYER.get_tree_hash(),
|
||||
new_did,
|
||||
curried_tp,
|
||||
curried_inner,
|
||||
)
|
||||
assert res.first().rest().first().as_atom() == curried_ownership_layer.get_tree_hash()
|
||||
assert res.first().rest().rest().rest().first().first().as_atom() == curried_inner.get_tree_hash()
|
||||
assert res.rest().rest().rest().first().first().as_int() == 51
|
||||
assert res.rest().rest().rest().first().rest().rest().first().as_int() == 40
|
||||
|
||||
|
||||
@pytest.mark.skip
|
||||
def test_full_stack() -> None:
|
||||
pubkey = int_to_public_key(1)
|
||||
innerpuz = puzzle_for_pk(pubkey)
|
||||
my_amount = 1
|
||||
destination = int_to_public_key(2)
|
||||
new_did = Program.to("test").get_tree_hash()
|
||||
new_did_inner_hash = Program.to("fake").get_tree_hash()
|
||||
old_did = Program.to("test_2").get_tree_hash()
|
||||
nft_id = Program.to("nft_id").get_tree_hash()
|
||||
trade_prices_list = [[200]]
|
||||
SINGLETON_STRUCT = Program.to((SINGLETON_MOD_HASH, (nft_id, LAUNCHER_PUZZLE_HASH)))
|
||||
curried_tp = NFT_TRANSFER_PROGRAM.curry(
|
||||
STANDARD_PUZZLE_MOD.get_tree_hash(),
|
||||
SINGLETON_STRUCT,
|
||||
innerpuz.get_tree_hash(),
|
||||
2000, # percentage with 2 decimal points 0 - 10000
|
||||
OFFER_MOD.get_tree_hash(),
|
||||
CAT_MOD.get_tree_hash(),
|
||||
)
|
||||
curried_inner = STANDARD_PUZZLE_MOD.curry(pubkey)
|
||||
|
||||
curried_ownership_layer = NFT_OWNERSHIP_LAYER.curry(
|
||||
NFT_OWNERSHIP_LAYER.get_tree_hash(),
|
||||
old_did,
|
||||
curried_tp,
|
||||
curried_inner,
|
||||
)
|
||||
|
||||
metadata = [
|
||||
("u", ["https://www.chia.net/img/branding/chia-logo.svg"]),
|
||||
("h", 0xD4584AD463139FA8C0D9F68F4B59F185),
|
||||
]
|
||||
curried_state_layer = NFT_STATE_LAYER_MOD.curry(
|
||||
NFT_STATE_LAYER_MOD_HASH,
|
||||
metadata,
|
||||
NFT_METADATA_UPDATER_UPDATEABLE.get_tree_hash(),
|
||||
curried_ownership_layer,
|
||||
)
|
||||
|
||||
condition_list = [
|
||||
[
|
||||
51,
|
||||
STANDARD_PUZZLE_MOD.curry(destination).get_tree_hash(),
|
||||
1,
|
||||
[STANDARD_PUZZLE_MOD.curry(destination).get_tree_hash()],
|
||||
],
|
||||
[-10, new_did, trade_prices_list, destination, [new_did_inner_hash]],
|
||||
]
|
||||
solution = Program.to(
|
||||
[
|
||||
[solution_for_conditions(condition_list)],
|
||||
my_amount,
|
||||
]
|
||||
)
|
||||
cost, res = curried_state_layer.run_with_cost(INFINITE_COST, solution)
|
||||
assert res.rest().first().first().as_int() == 51
|
||||
assert res.rest().first().rest().rest().first().as_int() == 1
|
||||
curried_inner = STANDARD_PUZZLE_MOD.curry(destination)
|
||||
curried_ownership_layer = NFT_OWNERSHIP_LAYER.curry(
|
||||
NFT_OWNERSHIP_LAYER.get_tree_hash(),
|
||||
new_did,
|
||||
curried_tp,
|
||||
curried_inner,
|
||||
)
|
||||
curried_state_layer = NFT_STATE_LAYER_MOD.curry(
|
||||
NFT_STATE_LAYER_MOD_HASH,
|
||||
metadata,
|
||||
NFT_METADATA_UPDATER_UPDATEABLE.get_tree_hash(),
|
||||
curried_ownership_layer,
|
||||
)
|
||||
assert res.rest().first().rest().first().as_atom() == curried_state_layer.get_tree_hash()
|
||||
assert res.rest().first().rest().rest().rest().first().first().as_atom() == curried_inner.get_tree_hash()
|
||||
@@ -207,10 +207,24 @@ async def test_ownership_layer(setup_sim: Tuple[SpendSim, SimClient]) -> None:
|
||||
ownership_puzzle.get_tree_hash(),
|
||||
b"\xad\x4c\xd5\x5c\xf7\xad\x64\x14" + Program.to([TARGET_OWNER, TARGET_TP]).get_tree_hash(),
|
||||
)
|
||||
harmless_announcement = Announcement(
|
||||
ownership_puzzle.get_tree_hash(),
|
||||
b"oy",
|
||||
)
|
||||
update_everything_spend = CoinSpend(
|
||||
ownership_coin,
|
||||
ownership_puzzle,
|
||||
Program.to([[[51, ACS_PH, 1], [-10, TARGET_OWNER, TARGET_TP], [63, expected_announcement.name()]]]),
|
||||
Program.to(
|
||||
[
|
||||
[
|
||||
[51, ACS_PH, 1],
|
||||
[-10, TARGET_OWNER, TARGET_TP],
|
||||
[62, harmless_announcement.message], # create a harmless puzzle announcement
|
||||
[63, expected_announcement.name()],
|
||||
[63, harmless_announcement.name()],
|
||||
]
|
||||
]
|
||||
),
|
||||
)
|
||||
update_everything_bundle = SpendBundle([update_everything_spend], G2Element())
|
||||
result = await sim_client.push_tx(update_everything_bundle)
|
||||
@@ -247,8 +261,6 @@ async def test_default_transfer_program(setup_sim: Tuple[SpendSim, SimClient]) -
|
||||
FAKE_SINGLETON_STRUCT,
|
||||
ROYALTY_ADDRESS,
|
||||
TRADE_PRICE_PERCENTAGE,
|
||||
ACS.get_tree_hash(),
|
||||
FAKE_CAT_MOD.get_tree_hash(),
|
||||
)
|
||||
ownership_puzzle: Program = construct_ownership_layer(
|
||||
None,
|
||||
@@ -291,7 +303,9 @@ async def test_default_transfer_program(setup_sim: Tuple[SpendSim, SimClient]) -
|
||||
ownership_spend = CoinSpend(
|
||||
ownership_coin,
|
||||
ownership_puzzle,
|
||||
Program.to([[[51, ACS_PH, 1], [-10, FAKE_LAUNCHER_ID, [[100], [100, FAKE_TAIL]], ACS_PH]]]),
|
||||
Program.to(
|
||||
[[[51, ACS_PH, 1], [-10, FAKE_LAUNCHER_ID, [[100, ACS_PH], [100, FAKE_CAT.get_tree_hash()]], ACS_PH]]]
|
||||
),
|
||||
)
|
||||
|
||||
did_announcement_spend = CoinSpend(
|
||||
|
||||
@@ -11,7 +11,6 @@ from chia.wallet.nft_wallet.nft_puzzles import (
|
||||
create_nft_layer_puzzle_with_curry_params,
|
||||
recurry_nft_puzzle,
|
||||
)
|
||||
from chia.wallet.puzzles.cat_loader import CAT_MOD
|
||||
from chia.wallet.puzzles.load_clvm import load_clvm
|
||||
from chia.wallet.puzzles.p2_delegated_puzzle_or_hidden_puzzle import puzzle_for_pk, solution_for_conditions
|
||||
from tests.core.make_block_generator import int_to_public_key
|
||||
@@ -37,7 +36,7 @@ def make_a_new_solution() -> Tuple[Program, Program]:
|
||||
puzhash = p2_puzzle.get_tree_hash()
|
||||
new_did = Program.to("test").get_tree_hash()
|
||||
new_did_inner_hash = Program.to("fake").get_tree_hash()
|
||||
trade_prices_list = [[200]]
|
||||
trade_prices_list = [[200, OFFER_MOD.get_tree_hash()]]
|
||||
|
||||
condition_list = [
|
||||
[
|
||||
@@ -66,8 +65,6 @@ def make_a_new_ownership_layer_puzzle() -> Tuple[Program, Program]:
|
||||
SINGLETON_STRUCT,
|
||||
innerpuz.get_tree_hash(),
|
||||
2000,
|
||||
OFFER_MOD.get_tree_hash(),
|
||||
CAT_MOD.get_tree_hash(),
|
||||
)
|
||||
curried_inner = innerpuz
|
||||
curried_ownership_layer = construct_ownership_layer(old_did, curried_tp, curried_inner)
|
||||
|
||||
Reference in New Issue
Block a user