@@ -577,19 +577,18 @@ async def run_get_method_local(self, address: typing.Union[Address, str],
577
577
578
578
# set libs
579
579
libs = []
580
- result_libs = {}
581
580
self ._find_libs (account .account .storage .state .state_init .code , libs )
582
581
libs = [i for i in libs if i .hex () not in self .libs ]
583
- libs = [ libs [ i : i + 16 ] for i in range ( 0 , len ( libs ), 16 )] # split libs into 16-element chunks
584
- for i in libs :
585
- result_libs |= await self . get_libraries ( i )
586
-
587
- def value_serializer (dest : Builder , src : Cell ):
588
- if src is not None :
589
- dest .store_uint (0 , 2 ).store_ref (src ).store_maybe_ref (None )
590
- hm = HashMap ( 256 , value_serializer = value_serializer )
591
- hm . map = self . libs
592
- if self .libs :
582
+ if libs :
583
+ self . libs |= await self . get_libraries ( libs )
584
+
585
+ if libs and self . libs :
586
+ def value_serializer (dest : Builder , src : Cell ):
587
+ if src is not None :
588
+ dest .store_uint (0 , 2 ).store_ref (src ).store_maybe_ref (None )
589
+
590
+ hm = HashMap ( 256 , value_serializer = value_serializer )
591
+ hm . map = self .libs
593
592
emulator .set_libraries (hm .serialize ())
594
593
595
594
# todo set prev blocks info
@@ -1029,11 +1028,7 @@ async def get_config_params(self, params: typing.List[int], blk: typing.Optional
1029
1028
state_proof = Cell .one_from_boc (result ['state_proof' ])
1030
1029
return self .unpack_config (blk , config_proof , state_proof )
1031
1030
1032
- async def get_libraries (self , library_list : typing .List [typing .Union [bytes , str ]]) -> typing .Dict [str , typing .Optional [Cell ]]:
1033
- """
1034
- :param library_list: list of library hashes in bytes or string hex form
1035
- :return: dict {library_hash_hex: library Cell or None if library not found}
1036
- """
1031
+ async def _get_libraries (self , library_list : typing .List [typing .Union [bytes , str ]]) -> typing .Dict [str , typing .Optional [Cell ]]:
1037
1032
if len (library_list ) > 16 :
1038
1033
raise LiteClientError ('maximum libraries num could be requested is 16' )
1039
1034
library_list = [lib .hex () if isinstance (lib , bytes ) else lib for lib in library_list ]
@@ -1054,6 +1049,17 @@ async def get_libraries(self, library_list: typing.List[typing.Union[bytes, str]
1054
1049
1055
1050
return result
1056
1051
1052
+ async def get_libraries (self , library_list : typing .List [typing .Union [bytes , str ]]) -> typing .Dict [str , typing .Optional [Cell ]]:
1053
+ """
1054
+ Get libraries from blockchain
1055
+
1056
+ :param library_list: list of library hashes in bytes or string hex form
1057
+ :return: dict {library_hash_hex: library Cell or None if library not found}
1058
+ """
1059
+ libs = [library_list [i :i + 16 ] for i in range (0 , len (library_list ), 16 )] # split libs into 16-element chunks
1060
+ result = await asyncio .gather (* [self ._get_libraries (lib ) for lib in libs ])
1061
+ return {k : v for d in result for k , v in d .items ()}
1062
+
1057
1063
async def get_out_msg_queue_sizes (self , wc : int = None , shard : int = None ):
1058
1064
"""
1059
1065
If wc and shard are not None, returns queue size for all children shards of the provided shard.
0 commit comments