diff --git a/chia/wallet/puzzles/nft_ownership_transfer_program.clvm b/chia/wallet/puzzles/nft_ownership_transfer_program.clvm index 0db9cd82cb..ba676025be 100644 --- a/chia/wallet/puzzles/nft_ownership_transfer_program.clvm +++ b/chia/wallet/puzzles/nft_ownership_transfer_program.clvm @@ -1,9 +1,9 @@ (mod ( - ; NFT Singleton ID - NFT_ID ; SINGLETON_STRUCT is ((SINGLETON_MOD_HASH, (SINGLETON_LAUNCHER_ID, LAUNCHER_PUZZLE_HASH))) SINGLETON_STRUCT + ; CURRY_PARAMS are: (ROYALTY_ADDRESS TRADE_PRICE_PERCENTAGE SETTLEMENT_MOD_HASH CAT_MOD_HASH) + CURRY_PARAMS ; DID of the current owner CURRENT_OWNER ; Royalty program puzzle hash @@ -14,16 +14,17 @@ new_owner ; DID inner puzzle hash of the new owner new_did_puzhash - ; Royalty program puzzle reveal - royalty_prog_reveal - ; Royalty program solution - royalty_prog_solution + ; trade_prices_list is a list of (amount type) pairs + ; type 0 is standard chia + ; any other type is a bytes32 mod hash of a launcher + trade_prices_list ) (include condition_codes.clvm) (include curry-and-treehash.clinc) (include sha256tree.clib) (defconstant CHANGE_OWNERSHIP -22) + (defconstant TEN_THOUSAND 10000) ;; return the full puzzlehash for a singleton with the innerpuzzle curried in ; puzzle-hash-of-curried-function is imported from curry-and-treehash.clinc @@ -34,12 +35,47 @@ ) ) + ; Given a singleton ID, generate the singleton struct + (defun-inline get_singleton_struct (SINGLETON_STRUCT singleton_id) + (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 1 tail_hash) + (sha256 1 CAT_MOD_HASH) + ) + ) + + (defun round_down_to_even (value) + (if (logand value 1) (- value 1) value) + ) + + (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) + (if trade_prices_list + (c + (if (r (f trade_prices_list)) + (list ASSERT_PUZZLE_ANNOUNCEMENT (sha256 (cat_settlement_puzzle_hash CAT_MOD_HASH (f (r (f trade_prices_list))) SETTLEMENT_MOD_HASH) (sha256tree (c my_nft_id (list (list ROYALTY_ADDRESS (calculate_percentage (f (f trade_prices_list)) TRADE_PRICE_PERCENTAGE))))))) + (list CREATE_COIN ROYALTY_ADDRESS (round_down_to_even (calculate_percentage (f (f trade_prices_list)) TRADE_PRICE_PERCENTAGE))) + ) + (parse_trade_prices_list (list ROYALTY_ADDRESS TRADE_PRICE_PERCENTAGE SETTLEMENT_MOD_HASH CAT_MOD_HASH) (r trade_prices_list) my_nft_id) + ) + () + ) + ) + ; main (list (c (list CHANGE_OWNERSHIP new_owner) - (c (list ASSERT_PUZZLE_ANNOUNCEMENT (sha256 (calculate_full_puzzle_hash SINGLETON_STRUCT current_did_puzhash) (sha256tree royalty_prog_solution) new_owner)) - (c (list ASSERT_PUZZLE_ANNOUNCEMENT (sha256 (calculate_full_puzzle_hash (c (f SINGLETON_STRUCT) (c new_did (r (r SINGLETON_STRUCT)))) new_did_puzhash) (sha256tree royalty_prog_solution))) - (a royalty_prog_reveal royalty_prog_solution) + (c (list ASSERT_PUZZLE_ANNOUNCEMENT (sha256 (calculate_full_puzzle_hash (get_singleton_struct SINGLETON_STRUCT CURRENT_OWNER) current_did_puzhash) (f (r SINGLETON_STRUCT)) (sha256tree royalty_prog_solution) new_owner)) + (c (list ASSERT_PUZZLE_ANNOUNCEMENT (sha256 (calculate_full_puzzle_hash (get_singleton_struct SINGLETON_STRUCT new_owner) new_did_puzhash) (f (r SINGLETON_STRUCT)) (sha256tree royalty_prog_solution))) + (parse_trade_prices_list CURRY_PARAMS trade_prices_list (f (r SINGLETON_STRUCT))) ) ) ) diff --git a/chia/wallet/puzzles/nft_ownership_transfer_program.clvm.hex b/chia/wallet/puzzles/nft_ownership_transfer_program.clvm.hex index 6d7004f820..d495e4c935 100644 --- a/chia/wallet/puzzles/nft_ownership_transfer_program.clvm.hex +++ b/chia/wallet/puzzles/nft_ownership_transfer_program.clvm.hex @@ -1 +1 @@ -ff02ffff01ff04ffff04ffff04ff14ffff04ff81bfff808080ffff04ffff04ff10ffff04ffff0bffff02ff2effff04ff02ffff04ff13ffff04ff5fffff04ffff02ff3effff04ff02ffff04ff0bff80808080ff808080808080ffff02ff3effff04ff02ffff04ff8205ffff80808080ff81bf80ff808080ffff04ffff04ff10ffff04ffff0bffff02ff2effff04ff02ffff04ff13ffff04ff82017fffff04ffff02ff3effff04ff02ffff04ffff04ff13ffff04ffff01876e65775f646964ff3b8080ff80808080ff808080808080ffff02ff3effff04ff02ffff04ff8205ffff8080808080ff808080ffff02ff8202ffff8205ff80808080ff8080ffff04ffff01ffffff3f02ff81eaff0401ffff0102ffff02ffff03ff05ffff01ff02ff16ffff04ff02ffff04ff0dffff04ffff0bff1affff0bff3cff2c80ffff0bff1affff0bff1affff0bff3cff1280ff0980ffff0bff1aff0bffff0bff3cff8080808080ff8080808080ffff010b80ff0180ffff0bff1affff0bff3cff1880ffff0bff1affff0bff1affff0bff3cff1280ff0580ffff0bff1affff02ff16ffff04ff02ffff04ff07ffff04ffff0bff3cff3c80ff8080808080ffff0bff3cff8080808080ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ff09ff80808080ffff02ff3effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080 \ No newline at end of file +ff02ffff01ff04ffff04ffff04ff38ffff04ff81bfff808080ffff04ffff04ff10ffff04ffff0bffff02ff36ffff04ff02ffff04ff09ffff04ff5fffff04ffff02ff3effff04ff02ffff04ffff04ff09ffff04ff17ff1d8080ff80808080ff808080808080ff15ffff02ff3effff04ff02ffff01ff95726f79616c74795f70726f675f736f6c7574696f6e808080ff81bf80ff808080ffff04ffff04ff10ffff04ffff0bffff02ff36ffff04ff02ffff04ff09ffff04ff82017fffff04ffff02ff3effff04ff02ffff04ffff04ff09ffff04ff81bfff1d8080ff80808080ff808080808080ff15ffff02ff3effff04ff02ffff01ff95726f79616c74795f70726f675f736f6c7574696f6e80808080ff808080ffff02ff26ffff04ff02ffff04ff0bffff04ff8202ffffff04ff15ff808080808080808080ff8080ffff04ffff01ffffff3fff0281eaffff3304ff0101ffff822710ff02ff02ffff03ff05ffff01ff02ff3affff04ff02ffff04ff0dffff04ffff0bff2affff0bff2cff3480ffff0bff2affff0bff2affff0bff2cff3c80ff0980ffff0bff2aff0bffff0bff2cff8080808080ff8080808080ffff010b80ff0180ffffff02ffff03ff0bffff01ff04ffff02ffff03ff33ffff01ff04ff10ffff04ffff0bffff02ff36ffff04ff02ffff04ff5dffff04ff2dffff04ffff0bffff0101ff5380ffff04ffff0bffff0101ff5d80ff80808080808080ffff02ff3effff04ff02ffff04ffff04ff17ffff04ffff04ff09ffff04ffff05ffff14ffff12ff23ff1580ff128080ff808080ff808080ff8080808080ff808080ffff01ff04ff24ffff04ff09ffff04ffff02ff2effff04ff02ffff04ffff05ffff14ffff12ff23ff1580ff128080ff80808080ff8080808080ff0180ffff02ff26ffff04ff02ffff04ffff04ff09ffff04ff15ffff04ff2dffff04ff5dff8080808080ffff04ff1bffff04ff17ff80808080808080ff8080ff0180ff0bff2affff0bff2cff2880ffff0bff2affff0bff2affff0bff2cff3c80ff0580ffff0bff2affff02ff3affff04ff02ffff04ff07ffff04ffff0bff2cff2c80ff8080808080ffff0bff2cff8080808080ffff02ffff03ffff18ff05ffff010180ffff01ff11ff05ffff010180ffff010580ff0180ff02ffff03ffff07ff0580ffff01ff0bffff0102ffff02ff3effff04ff02ffff04ff09ff80808080ffff02ff3effff04ff02ffff04ff0dff8080808080ffff01ff0bffff0101ff058080ff0180ff018080 \ No newline at end of file diff --git a/chia/wallet/puzzles/nft_ownership_transfer_program.clvm.hex.sha256tree b/chia/wallet/puzzles/nft_ownership_transfer_program.clvm.hex.sha256tree new file mode 100644 index 0000000000..8c39f0f85a --- /dev/null +++ b/chia/wallet/puzzles/nft_ownership_transfer_program.clvm.hex.sha256tree @@ -0,0 +1 @@ +03557552e0bf8b200d8be8089f54786195ab8c07e3e07c39641f2f4f1fc2e48e diff --git a/chia/wallet/puzzles/nft_transfer_program.clvm b/chia/wallet/puzzles/nft_transfer_program.clvm index d71b1e4b25..3ce24b78bb 100644 --- a/chia/wallet/puzzles/nft_transfer_program.clvm +++ b/chia/wallet/puzzles/nft_transfer_program.clvm @@ -77,7 +77,7 @@ (parse_trade_prices_list CURRY_PARAMS trade_prices_list (f (r SINGLETON_STRUCT))) ) ) - ) + ) ; once we find 'u' we don't need to continue looping (defun add_url (METADATA new_url)