Skip to content

Commit 8bcc013

Browse files
ArdwinArdwin
authored andcommitted
Shift over NFT transfers when NFT minted
1 parent 1352665 commit 8bcc013

File tree

4 files changed

+59
-50
lines changed

4 files changed

+59
-50
lines changed

electrumx/lib/atomicals_blueprint_builder.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ def order_ft_inputs(ft_atomicals: AtomicalInputSummary, sort_by_fifo):
178178

179179
class AtomicalsTransferBlueprintBuilder:
180180
'''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):
182182
self.logger = logger
183183
self.atomicals_spent_at_inputs = atomicals_spent_at_inputs
184184
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
189189
nft_atomicals, ft_atomicals, atomical_ids_spent = AtomicalsTransferBlueprintBuilder.build_atomical_input_summaries_by_type(self.get_atomicals_id_mint_info, atomicals_spent_at_inputs)
190190
self.nft_atomicals = nft_atomicals
191191
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)
193193
self.nft_output_blueprint = nft_output_blueprint
194194
self.ft_output_blueprint = ft_output_blueprint
195195
# 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
254254
return input_idx_to_atomical_ids_map
255255

256256
@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):
258258
# Use a simplified mapping of NFTs using FIFO to the outputs
259259
if sort_fifo:
260260
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
261265
map_output_idxs_for_atomicals = {}
262266
# Build a map of input ids to NFTs
263267
for input_idx, atomicals_ids_map in nft_map.items():
@@ -304,7 +308,7 @@ def calculate_nft_atomicals_splat(cls, nft_atomicals, tx):
304308
return AtomicalNftOutputBlueprintAssignmentSummary(output_colored_map)
305309

306310
@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):
308312
if not nft_atomicals or len(nft_atomicals) == 0:
309313
return AtomicalNftOutputBlueprintAssignmentSummary({})
310314
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
313317
else:
314318
# To sort by fifo for NFTs, we also need to calculate a mapping of the nfts to inputs first
315319
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)
317321

318322
@classmethod
319323
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):
393397
return AtomicalFtOutputBlueprintAssignmentSummary(output_colored_map, ft_coloring_summary.fts_burned, ft_coloring_summary.cleanly_assigned, first_atomical_id)
394398

395399
@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)
398402
ft_blueprint = AtomicalsTransferBlueprintBuilder.calculate_output_blueprint_fts(tx, ft_atomicals, operations_found_at_inputs, sort_fifo)
399403
return nft_blueprint, ft_blueprint
400404

0 commit comments

Comments
 (0)