@@ -67,25 +67,26 @@ class OperationData:
6767 def _merge_bigmapdiffs (self , storage_dict : Dict [str , Any ], bigmap_name : str , array : bool ) -> None :
6868 if self .diffs is None :
6969 raise Exception ('`bigmaps` field missing' )
70+ _logger .debug (bigmap_name )
7071 bigmapdiffs = [bm for bm in self .diffs if bm ['path' ] == bigmap_name ]
72+ bigmap_key = bigmap_name .split ('.' )[- 1 ]
7173 for diff in bigmapdiffs :
7274 _logger .debug ('Applying bigmapdiff: %s' , diff )
7375 if diff ['action' ] in ('add_key' , 'update_key' ):
7476 key = diff ['content' ]['key' ]
7577 if array is True :
76- storage_dict [bigmap_name ].append ({'key' : key , 'value' : diff ['content' ]['value' ]})
78+ storage_dict [bigmap_key ].append ({'key' : key , 'value' : diff ['content' ]['value' ]})
7779 else :
78- storage_dict [bigmap_name ][key ] = diff ['content' ]['value' ]
80+ storage_dict [bigmap_key ][key ] = diff ['content' ]['value' ]
7981
80- def get_merged_storage (self , storage_type : Type [StorageType ]) -> StorageType :
81- if self .storage is None :
82- raise Exception ('`storage` field missing' )
83-
84- storage = deepcopy (self .storage )
85- _logger .debug ('Merging storage' )
86- _logger .debug ('Before: %s' , storage )
82+ def _process_storage (self , storage_type : Type [StorageType ], storage : Dict , prefix : str = None ):
8783 for key , field in storage_type .__fields__ .items ():
8884
85+ bigmap_name = key if prefix is None else '.' .join ([prefix , key ])
86+
87+ if key == '__root__' :
88+ continue
89+
8990 if field .alias :
9091 key = field .alias
9192
@@ -95,11 +96,26 @@ def get_merged_storage(self, storage_type: Type[StorageType]) -> StorageType:
9596 if hasattr (field .type_ , '__fields__' ) and 'key' in field .type_ .__fields__ and 'value' in field .type_ .__fields__ :
9697 storage [key ] = []
9798 if self .diffs :
98- self ._merge_bigmapdiffs (storage , key , array = True )
99+ self ._merge_bigmapdiffs (storage , bigmap_name , array = True )
99100 else :
100101 storage [key ] = {}
101102 if self .diffs :
102- self ._merge_bigmapdiffs (storage , key , array = False )
103+ self ._merge_bigmapdiffs (storage , bigmap_name , array = False )
104+ elif hasattr (field .type_ , '__fields__' ) and isinstance (storage [key ], dict ):
105+ storage [key ] = self ._process_storage (field .type_ , storage [key ], bigmap_name )
106+
107+ return storage
108+
109+ def get_merged_storage (self , storage_type : Type [StorageType ]) -> StorageType :
110+ if self .storage is None :
111+ raise Exception ('`storage` field missing' )
112+
113+ storage = deepcopy (self .storage )
114+ _logger .debug ('Merging storage' )
115+ _logger .debug ('Before: %s' , storage )
116+ _logger .debug ('Diffs: %s' , self .diffs )
117+
118+ storage = self ._process_storage (storage_type , storage , None )
103119
104120 _logger .debug ('After: %s' , storage )
105121
0 commit comments