@@ -178,7 +178,7 @@ def order_ft_inputs(ft_atomicals: AtomicalInputSummary, sort_by_fifo):
178
178
179
179
class AtomicalsTransferBlueprintBuilder :
180
180
'''Atomicals transfer blueprint builder for calculating outputs to color'''
181
- def __init__ (self , logger , atomicals_spent_at_inputs , operations_found_at_inputs , tx_hash , tx , get_atomicals_id_mint_info , sort_fifo ):
181
+ def __init__ (self , logger , minted_nft , atomicals_spent_at_inputs , operations_found_at_inputs , tx_hash , tx , get_atomicals_id_mint_info , sort_fifo ):
182
182
self .logger = logger
183
183
self .atomicals_spent_at_inputs = atomicals_spent_at_inputs
184
184
self .operations_found_at_inputs = operations_found_at_inputs
@@ -189,7 +189,7 @@ def __init__(self, logger, atomicals_spent_at_inputs, operations_found_at_inputs
189
189
nft_atomicals , ft_atomicals , atomical_ids_spent = AtomicalsTransferBlueprintBuilder .build_atomical_input_summaries_by_type (self .get_atomicals_id_mint_info , atomicals_spent_at_inputs )
190
190
self .nft_atomicals = nft_atomicals
191
191
self .ft_atomicals = ft_atomicals
192
- nft_output_blueprint , ft_output_blueprint = AtomicalsTransferBlueprintBuilder .calculate_output_blueprint (self .get_atomicals_id_mint_info , self .tx , self .nft_atomicals , self .ft_atomicals , self .atomicals_spent_at_inputs , self .operations_found_at_inputs , self .sort_fifo )
192
+ nft_output_blueprint , ft_output_blueprint = AtomicalsTransferBlueprintBuilder .calculate_output_blueprint (minted_nft , self .get_atomicals_id_mint_info , self .tx , self .nft_atomicals , self .ft_atomicals , self .atomicals_spent_at_inputs , self .operations_found_at_inputs , self .sort_fifo )
193
193
self .nft_output_blueprint = nft_output_blueprint
194
194
self .ft_output_blueprint = ft_output_blueprint
195
195
# if len(ft_atomicals) > 0 or len(nft_atomicals) > 0:
@@ -254,10 +254,14 @@ def build_nft_input_idx_to_atomical_map(cls, get_atomicals_id_mint_info, atomica
254
254
return input_idx_to_atomical_ids_map
255
255
256
256
@classmethod
257
- def calculate_nft_atomicals_regular (cls , nft_map , nft_atomicals , tx , operations_found_at_inputs , sort_fifo ):
257
+ def calculate_nft_atomicals_regular (cls , skip_first_output , nft_map , nft_atomicals , tx , operations_found_at_inputs , sort_fifo ):
258
258
# Use a simplified mapping of NFTs using FIFO to the outputs
259
259
if sort_fifo :
260
260
next_output_idx = 0
261
+ # Skip the first output, mainly in case another NFT was minted in the same tx and we want every other existing transferred
262
+ # NFT to be shifted along by one. Example is a parent realm NFT
263
+ if skip_first_output :
264
+ next_output_idx = 1
261
265
map_output_idxs_for_atomicals = {}
262
266
# Build a map of input ids to NFTs
263
267
for input_idx , atomicals_ids_map in nft_map .items ():
@@ -304,7 +308,7 @@ def calculate_nft_atomicals_splat(cls, nft_atomicals, tx):
304
308
return AtomicalNftOutputBlueprintAssignmentSummary (output_colored_map )
305
309
306
310
@classmethod
307
- def calculate_output_blueprint_nfts (cls , get_atomicals_id_mint_info , tx , nft_atomicals , atomicals_spent_at_inputs , operations_found_at_inputs , sort_fifo ):
311
+ def calculate_output_blueprint_nfts (cls , skip_first_output , get_atomicals_id_mint_info , tx , nft_atomicals , atomicals_spent_at_inputs , operations_found_at_inputs , sort_fifo ):
308
312
if not nft_atomicals or len (nft_atomicals ) == 0 :
309
313
return AtomicalNftOutputBlueprintAssignmentSummary ({})
310
314
should_splat_nft_atomicals = is_splat_operation (operations_found_at_inputs )
@@ -313,7 +317,7 @@ def calculate_output_blueprint_nfts(cls, get_atomicals_id_mint_info, tx, nft_ato
313
317
else :
314
318
# To sort by fifo for NFTs, we also need to calculate a mapping of the nfts to inputs first
315
319
nft_map = AtomicalsTransferBlueprintBuilder .build_nft_input_idx_to_atomical_map (get_atomicals_id_mint_info , atomicals_spent_at_inputs )
316
- return AtomicalsTransferBlueprintBuilder .calculate_nft_atomicals_regular (nft_map , nft_atomicals , tx , operations_found_at_inputs , sort_fifo )
320
+ return AtomicalsTransferBlueprintBuilder .calculate_nft_atomicals_regular (skip_first_output , nft_map , nft_atomicals , tx , operations_found_at_inputs , sort_fifo )
317
321
318
322
@classmethod
319
323
def calculate_output_blueprint_fts (cls , tx , ft_atomicals , operations_found_at_inputs , sort_fifo ):
@@ -393,8 +397,8 @@ def color_ft_atomicals_regular(cls, ft_atomicals, tx, sort_fifo):
393
397
return AtomicalFtOutputBlueprintAssignmentSummary (output_colored_map , ft_coloring_summary .fts_burned , ft_coloring_summary .cleanly_assigned , first_atomical_id )
394
398
395
399
@classmethod
396
- def calculate_output_blueprint (cls , get_atomicals_id_mint_info , tx , nft_atomicals , ft_atomicals , atomicals_spent_at_inputs , operations_found_at_inputs , sort_fifo ):
397
- nft_blueprint = AtomicalsTransferBlueprintBuilder .calculate_output_blueprint_nfts (get_atomicals_id_mint_info , tx , nft_atomicals , atomicals_spent_at_inputs , operations_found_at_inputs , sort_fifo )
400
+ def calculate_output_blueprint (cls , minted_nft , get_atomicals_id_mint_info , tx , nft_atomicals , ft_atomicals , atomicals_spent_at_inputs , operations_found_at_inputs , sort_fifo ):
401
+ nft_blueprint = AtomicalsTransferBlueprintBuilder .calculate_output_blueprint_nfts (minted_nft , get_atomicals_id_mint_info , tx , nft_atomicals , atomicals_spent_at_inputs , operations_found_at_inputs , sort_fifo )
398
402
ft_blueprint = AtomicalsTransferBlueprintBuilder .calculate_output_blueprint_fts (tx , ft_atomicals , operations_found_at_inputs , sort_fifo )
399
403
return nft_blueprint , ft_blueprint
400
404
0 commit comments