def test_multi_encode(self): as_multi = RuntimeConfiguration().create_scale_object("Call", metadata=self.metadata_decoder) as_multi.encode( { "call_module": "Multisig", "call_function": "as_multi", "call_args": { "call": { "call_module": "Balances", "call_function": "transfer", "call_args": { "dest": "CofvaLbP3m8PLeNRQmLVPWmTT7jGgAXTwyT69k2wkfPxJ9V", "value": 10000000000000 }, }, "maybe_timepoint": {"height": 3012294, "index": 3}, "other_signatories": sorted(['D2bHQwFcQj11SvtkjULEdKhK4WAeP6MThXgosMHjW9DrmbE', 'CofvaLbP3m8PLeNRQmLVPWmTT7jGgAXTwyT69k2wkfPxJ9V']), "threshold": 2, "store_call": True, "max_weight": 10, }, } ) self.assertEqual(str(as_multi.data), "0x1f010200080a2ee2acc37fa96e818e2817afc104ce55770bcccb7333bbf8481d5bc3c6fa4614097421065c7bb0efc6770ffc5d604654159d45910cc7a3cb602be16acc552801c6f62d0003000000a80400000a2ee2acc37fa96e818e2817afc104ce55770bcccb7333bbf8481d5bc3c6fa460b00a0724e1809010a00000000000000")
def test_compact_u32_2bytes(self): obj = RuntimeConfiguration().create_scale_object('Compact<u32>', ScaleBytes("0x18")) obj.decode() obj = RuntimeConfiguration().create_scale_object('Compact<u32>') obj.encode(6000) self.assertEqual(str(obj.data), "0xc15d")
def test_bounded_vec_encode(self): obj = RuntimeConfiguration().create_scale_object('BoundedVec<Hash, maxproposals>') value = obj.encode(['0xe1781813275653a970b4260298b3858b36d38e072256dad674f7c786a0cae236']) self.assertEqual(str(value), '0x04e1781813275653a970b4260298b3858b36d38e072256dad674f7c786a0cae236') obj = RuntimeConfiguration().create_scale_object('BoundedVec<Option<RegistrarInfo<BalanceOf, AccountId>>,5>') self.assertEqual(obj.sub_type, 'Option<RegistrarInfo<BalanceOf, AccountId>>') value = obj.encode([None, None]) self.assertEqual(str(value), '0x080000')
def test_era_methods(self): obj = RuntimeConfiguration().create_scale_object('Era') obj.encode('00') self.assertTrue(obj.is_immortal()) self.assertEqual(obj.birth(1400), 0) self.assertEqual(obj.death(1400), 2**64 - 1) obj = RuntimeConfiguration().create_scale_object('Era') obj.encode((256, 120)) self.assertFalse(obj.is_immortal()) self.assertEqual(obj.birth(1400), 1400) self.assertEqual(obj.birth(1410), 1400) self.assertEqual(obj.birth(1399), 1144) self.assertEqual(obj.death(1400), 1656)
def ss58_encode_account_index(account_index: int, ss58_format: int = 42) -> str: """ Encodes an AccountIndex to an Substrate address according to provided address_type Parameters ---------- account_index ss58_format Returns ------- """ if 0 <= account_index <= 2**8 - 1: account_idx_encoder = RuntimeConfiguration().create_scale_object('u8') elif 2**8 <= account_index <= 2**16 - 1: account_idx_encoder = RuntimeConfiguration().create_scale_object('u16') elif 2**16 <= account_index <= 2**32 - 1: account_idx_encoder = RuntimeConfiguration().create_scale_object('u32') elif 2**32 <= account_index <= 2**64 - 1: account_idx_encoder = RuntimeConfiguration().create_scale_object('u64') else: raise ValueError("Value too large for an account index") return ss58_encode( account_idx_encoder.encode(account_index).data, ss58_format)
def test_bytes_encode_list_of_u8(self): value = [84, 104, 105, 115, 32, 105, 115, 32, 97, 32, 116, 101, 115, 116] obj = RuntimeConfiguration().create_scale_object('Bytes') data = obj.encode(value) self.assertEqual("0x385468697320697320612074657374", data.to_hex())
def test_opaque_call(self): opaque_call_obj = RuntimeConfiguration().create_scale_object( 'OpaqueCall', metadata=self.metadata_decoder) call_value = { 'call_module': 'System', 'call_function': 'remark', 'call_args': { '_remark': '0x0123456789' } } scale_data = opaque_call_obj.encode(call_value) self.assertEqual(str(scale_data), '0x200001140123456789') opaque_call_obj = RuntimeConfiguration().create_scale_object( 'OpaqueCall', data=scale_data, metadata=self.metadata_decoder) value = opaque_call_obj.decode() self.assertEqual(value['call_function'], 'remark') self.assertEqual(value['call_module'], 'System') self.assertEqual(value['call_args'][0]['value'], '0x0123456789') self.assertEqual(value['call_args'][0]['name'], '_remark')
def test_bytes_encode_bytearray(self): value = bytearray(b'This is a test') obj = RuntimeConfiguration().create_scale_object('Bytes') data = obj.encode(value) self.assertEqual("0x385468697320697320612074657374", data.to_hex())
def test_hashmap_encode(self): obj = RuntimeConfiguration().create_scale_object( 'HashMap<Vec<u8>, u32>') data = obj.encode([('1', 2), ('23', 24), ('28', 30), ('45', 80)]) self.assertEqual( data.to_hex(), '0x10043102000000083233180000000832381e00000008343550000000')
def test_string_multibyte_chars(self): obj = RuntimeConfiguration().create_scale_object('String') data = obj.encode('µ') self.assertEqual('0x08c2b5', data.to_hex()) obj.decode() self.assertEqual(str(obj), "µ")
def test_string(self): obj = RuntimeConfiguration().create_scale_object('String', ScaleBytes("0x1054657374")) obj.decode() self.assertEqual(str(obj), "Test") data = obj.encode("Test") self.assertEqual("0x1054657374", data.to_hex())
def test_accountid_encode_decode(self): value = '0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409' obj = RuntimeConfiguration().create_scale_object('AccountId') data = obj.encode(value) obj_check = RuntimeConfiguration().create_scale_object('AccountId', data) self.assertEqual(obj_check.decode(), value)
def test_option_bytes_encode_decode(self): value = "Test" obj = RuntimeConfiguration().create_scale_object('Option<Bytes>') data = obj.encode(value) obj_check = RuntimeConfiguration().create_scale_object('Option<Bytes>', data) self.assertEqual(obj_check.decode(), value)
def test_hexbytes_encode_decode(self): value = '0x5468697320697320612074657374' obj = RuntimeConfiguration().create_scale_object('HexBytes') data = obj.encode(value) obj_check = RuntimeConfiguration().create_scale_object('HexBytes', data) self.assertEqual(obj_check.decode(), value)
def test_bytes_encode_decode(self): value = 'This is a test' obj = RuntimeConfiguration().create_scale_object('Bytes') data = obj.encode(value) obj_check = RuntimeConfiguration().create_scale_object('Bytes', data) self.assertEqual(obj_check.decode(), value)
def test_vec_string_encode_decode(self): value = ['test', 'vec'] obj = RuntimeConfiguration().create_scale_object('Vec<Bytes>') data = obj.encode(value) obj = RuntimeConfiguration().create_scale_object('Vec<Bytes>', data) self.assertEqual(obj.decode(), value)
def test_multiaddress_ss58_index_as_str(self): obj = RuntimeConfiguration().create_scale_object('MultiAddress') ss58_address = "F7Hs" index_id = ss58_decode_account_index(ss58_address) data = obj.encode(ss58_address) decode_obj = RuntimeConfiguration().create_scale_object('MultiAddress', data=data) self.assertEqual(decode_obj.decode(), index_id)
def test_compact_u32_encode_decode(self): value = 2000001 obj = RuntimeConfiguration().create_scale_object('Compact<u32>') data = obj.encode(value) obj = CompactU32(data) self.assertEqual(obj.decode(), value)
def test_multiaddress_ss58_address_as_str(self): obj = RuntimeConfiguration().create_scale_object('Multiaddress') ss58_address = "CdVuGwX71W4oRbXHsLuLQxNPns23rnSSiZwZPN4etWf6XYo" public_key = ss58_decode(ss58_address) data = obj.encode(ss58_address) decode_obj = RuntimeConfiguration().create_scale_object('MultiAddress', data=data) self.assertEqual(decode_obj.decode(), f'0x{public_key}')
def test_enum_encode_decode(self): value = {'Staked': None} obj = RuntimeConfiguration().create_scale_object('RewardDestination') data = obj.encode(value) obj_check = RuntimeConfiguration().create_scale_object('RewardDestination', data) self.assertEqual(obj_check.decode(), 'Staked')
def test_enum_with_specified_index_number(self): RuntimeConfiguration().update_type_registry(load_type_registry_preset("test")) obj = RuntimeConfiguration().create_scale_object('EnumSpecifiedIndex') data = obj.encode("KSM") self.assertEqual("0x82", data.to_hex()) obj = RuntimeConfiguration().create_scale_object('EnumSpecifiedIndex', data=ScaleBytes("0x80")) self.assertEqual("KAR", obj.decode())
def test_data_encode_decode(self): value = {"Raw": "Test"} obj = RuntimeConfiguration().create_scale_object('Data') scale_data = obj.encode(value) obj = RuntimeConfiguration().create_scale_object('Data', scale_data) obj.decode() self.assertEqual(obj.value, value)
def test_enum_type_mapping_empty_value_encode_decode(self): RuntimeConfiguration().update_type_registry(load_type_registry_preset("test")) value = "Error" obj = RuntimeConfiguration().create_scale_object('EnumWithoutBaseClass') data = obj.encode(value) obj_check = RuntimeConfiguration().create_scale_object('EnumWithoutBaseClass', data) self.assertEqual(obj_check.decode(), value)
def test_enum_type_mapping_encode_decode(self): RuntimeConfiguration().update_type_registry(load_type_registry_preset("test")) value = {"AuthoritiesChange": ["0x586cb27c291c813ce74e86a60dad270609abf2fc8bee107e44a80ac00225c409"]} obj = RuntimeConfiguration().create_scale_object('DigestItem') data = obj.encode(value) obj_check = RuntimeConfiguration().create_scale_object('DigestItem', data) self.assertEqual(obj_check.decode(), value)
def test_compact_balance_encode_decode(self): scale_data = ScaleBytes('0x070010a5d4e8') value = 1000000000000 obj = RuntimeConfiguration().create_scale_object('Compact<Balance>') data = obj.encode(value) self.assertEqual(str(scale_data), str(data)) obj_check = RuntimeConfiguration().create_scale_object('Compact<Balance>', data) self.assertEqual(obj_check.decode(), value)
def test_multiaddress_ss58_address_as_str_runtime_config(self): runtime_config = RuntimeConfigurationObject(ss58_format=2) runtime_config.update_type_registry(load_type_registry_preset("default")) obj = RuntimeConfiguration().create_scale_object('Multiaddress', runtime_config=runtime_config) ss58_address = "CdVuGwX71W4oRbXHsLuLQxNPns23rnSSiZwZPN4etWf6XYo" data = obj.encode(ss58_address) decode_obj = RuntimeConfiguration().create_scale_object('MultiAddress', data=data, runtime_config=runtime_config) self.assertEqual(decode_obj.decode(), ss58_address)
def test_era_mortal_encode_dict(self): obj = RuntimeConfiguration().create_scale_object('Era') obj.encode({'period': 32768, 'phase': 20000}) self.assertEqual(str(obj.data), '0x4e9c') obj = RuntimeConfiguration().create_scale_object('Era') obj.encode({'period': 32768, 'current': (32768 * 3) + 20000}) self.assertEqual(str(obj.data), '0x4e9c') obj = RuntimeConfiguration().create_scale_object('Era') obj.encode({'period': 200, 'current': 1400}) obj2 = RuntimeConfiguration().create_scale_object('Era') obj2.encode((256, 120)) self.assertEqual(str(obj.data), str(obj2.data))
def test_set_encode_decode(self): RuntimeConfiguration().update_type_registry(load_type_registry_preset("test")) value = ['Display', 'Legal', 'Email', 'Twitter'] obj = RuntimeConfiguration().create_scale_object('IdentityFields') scale_data = obj.encode(value) obj = RuntimeConfiguration().create_scale_object('IdentityFields', scale_data) obj.decode() self.assertEqual(obj.value, value)
def test_struct_encode_decode(self): value = {'unstake_threshold': 3, 'validator_payment': 0} scale_data = ScaleBytes("0x0c00") obj = RuntimeConfiguration().create_scale_object('ValidatorPrefsTo145') data = obj.encode(value) self.assertEqual(str(scale_data), str(data)) obj_check = RuntimeConfiguration().create_scale_object('ValidatorPrefsTo145', data) self.assertEqual(obj_check.decode(), value)
def test_vec_accountid_encode_decode(self): value = [ '0x0034d9d2dcdcd79451d95fd019a056d47dfa9926d762b94e63f06391b1545aee', '0x2ce1929ab903f695bdeeeb79a588774d71468362129136f1b7f7b31a32958f98', '0x88c47944e4aaf9d53a9627400f9a948bb5f355bda38702dbdeda0c5d34553128', ] obj = RuntimeConfiguration().create_scale_object('Vec<AccountId>') data = obj.encode(value) obj = RuntimeConfiguration().create_scale_object('Vec<AccountId>', data) self.assertEqual(obj.decode(), value)