Source code for stellar_sdk.scval

from typing import Dict, List, Optional, Sequence, Tuple, Union

from . import xdr as stellar_xdr
from .address import Address

__all__ = [
    "to_address",
    "from_address",
    "to_bool",
    "from_bool",
    "to_void",
    "from_void",
    "to_bytes",
    "from_bytes",
    "to_duration",
    "from_duration",
    "to_int32",
    "from_int32",
    "to_int64",
    "from_int64",
    "to_int128",
    "from_int128",
    "to_int256",
    "from_int256",
    "to_map",
    "from_map",
    "to_string",
    "from_string",
    "to_symbol",
    "from_symbol",
    "to_timepoint",
    "from_timepoint",
    "to_uint32",
    "from_uint32",
    "to_uint64",
    "from_uint64",
    "to_uint128",
    "from_uint128",
    "to_uint256",
    "from_uint256",
    "to_vec",
    "from_vec",
    "to_enum",
    "from_enum",
    "to_struct",
    "from_struct",
    "to_tuple_struct",
    "from_tuple_struct",
]


[docs] def to_address(data: Union[Address, str]) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from an :class:`stellar_sdk.address.Address` object. :param data: The :class:`stellar_sdk.address.Address` object to convert. :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_ADDRESS`. """ if isinstance(data, str): data = Address(data) return stellar_xdr.SCVal( stellar_xdr.SCValType.SCV_ADDRESS, address=data.to_xdr_sc_address() )
[docs] def from_address(sc_val: stellar_xdr.SCVal) -> Address: """Creates an :class:`stellar_sdk.address.Address` object from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: An :class:`stellar_sdk.address.Address` object. :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_ADDRESS`. """ if sc_val.type != stellar_xdr.SCValType.SCV_ADDRESS: raise ValueError(f"Invalid sc_val type, must be SCV_ADDRESS, got {sc_val.type}") assert sc_val.address is not None return Address.from_xdr_sc_address(sc_val.address)
[docs] def to_bool(data: bool) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from a bool value. :param data: The bool value to convert. :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_BOOL`. """ return stellar_xdr.SCVal(stellar_xdr.SCValType.SCV_BOOL, b=data)
[docs] def from_bool(sc_val: stellar_xdr.SCVal) -> bool: """Creates a bool value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: A bool value. :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_BOOL`. """ if sc_val.type != stellar_xdr.SCValType.SCV_BOOL: raise ValueError(f"Invalid sc_val type, must be SCV_BOOL, got {sc_val.type}") assert sc_val.b is not None return sc_val.b
def to_void() -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object of type :class:`stellar_sdk.xdr.SCValType.SCV_VOID`. :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object of type :class:`stellar_sdk.xdr.SCValType.SCV_VOID`. """ return stellar_xdr.SCVal(stellar_xdr.SCValType.SCV_VOID) def from_void(sc_val: stellar_xdr.SCVal) -> None: """Creates a None value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: None. :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_VOID`. """ if sc_val.type != stellar_xdr.SCValType.SCV_VOID: raise ValueError(f"Invalid sc_val type, must be SCV_VOID, got {sc_val.type}") return None
[docs] def to_bytes(data: bytes) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from a bytes value. :param data: The bytes value to convert. :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_BYTES`. """ return stellar_xdr.SCVal( stellar_xdr.SCValType.SCV_BYTES, bytes=stellar_xdr.SCBytes(data) )
[docs] def from_bytes(sc_val: stellar_xdr.SCVal) -> bytes: """Creates a bytes value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: A bytes value. :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_BYTES`. """ if sc_val.type != stellar_xdr.SCValType.SCV_BYTES: raise ValueError(f"Invalid sc_val type, must be SCV_BYTES, got {sc_val.type}") assert sc_val.bytes is not None return bytes(sc_val.bytes.sc_bytes)
[docs] def to_duration(data: int) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from an int value. :param data: The duration. (uint64) :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_DURATION`. :raises: :exc:`ValueError` if ``value`` is out of uint64 range. """ if data < 0 or data > 2**64 - 1: raise ValueError("Invalid data, must be between 0 and 2**64 - 1.") duration = stellar_xdr.Duration(stellar_xdr.Uint64(data)) return stellar_xdr.SCVal(stellar_xdr.SCValType.SCV_DURATION, duration=duration)
[docs] def from_duration(sc_val: stellar_xdr.SCVal) -> int: """Creates an int value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: The duration. (uint64) :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_DURATION`. """ if sc_val.type != stellar_xdr.SCValType.SCV_DURATION: raise ValueError( f"Invalid sc_val type, must be SCV_DURATION, got {sc_val.type}" ) assert sc_val.duration is not None return sc_val.duration.duration.uint64
[docs] def to_int32(data: int) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from an int value. :param data: The int to convert. (int32) :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_I32`. :raises: :exc:`ValueError` if ``value`` is out of int32 range. """ if data < -(2**31) or data > 2**31 - 1: raise ValueError("Invalid data, must be between -(2**31) and 2**31 - 1.") return stellar_xdr.SCVal(stellar_xdr.SCValType.SCV_I32, i32=stellar_xdr.Int32(data))
[docs] def from_int32(sc_val: stellar_xdr.SCVal) -> int: """Creates an int value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: An int value. (int32) :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_I32`. """ if sc_val.type != stellar_xdr.SCValType.SCV_I32: raise ValueError(f"Invalid sc_val type, must be SCV_I32, got {sc_val.type}") assert sc_val.i32 is not None return sc_val.i32.int32
[docs] def to_int64(data: int) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from an int value. :param data: The int to convert. (int64) :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_I64`. :raises: :exc:`ValueError` if ``value`` is out of int64 range. """ if data < -(2**63) or data > 2**63 - 1: raise ValueError("Invalid data, must be between -(2**63) and 2**63 - 1.") return stellar_xdr.SCVal(stellar_xdr.SCValType.SCV_I64, i64=stellar_xdr.Int64(data))
[docs] def from_int64(sc_val: stellar_xdr.SCVal) -> int: """Creates an int value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: An int value. (int64) :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_I64`. """ if sc_val.type != stellar_xdr.SCValType.SCV_I64: raise ValueError(f"Invalid sc_val type, must be SCV_I64, got {sc_val.type}") assert sc_val.i64 is not None return sc_val.i64.int64
[docs] def to_int128(data: int) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from an int value. :param data: The int to convert. (int128) :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_I128`. :raises: :exc:`ValueError` if ``value`` is out of int128 range. """ if data < -(2**127) or data > 2**127 - 1: raise ValueError("Invalid data, must be between -(2**127) and 2**127 - 1.") value_bytes = data.to_bytes(16, "big", signed=True) i128 = stellar_xdr.Int128Parts( hi=stellar_xdr.Int64(int.from_bytes(value_bytes[0:8], "big", signed=True)), lo=stellar_xdr.Uint64(int.from_bytes(value_bytes[8:16], "big", signed=False)), ) return stellar_xdr.SCVal(stellar_xdr.SCValType.SCV_I128, i128=i128)
[docs] def from_int128(sc_val: stellar_xdr.SCVal) -> int: """Creates an int value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: An int value. (int128) :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_I128`. """ if sc_val.type != stellar_xdr.SCValType.SCV_I128: raise ValueError(f"Invalid sc_val type, must be SCV_I128, got {sc_val.type}") assert sc_val.i128 is not None value_bytes = sc_val.i128.hi.int64.to_bytes( 8, "big", signed=True ) + sc_val.i128.lo.uint64.to_bytes(8, "big", signed=False) return int.from_bytes(value_bytes, "big", signed=True)
[docs] def to_int256(data: int) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from an int value. :param data: The int to convert. (int256) :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_I256`. :raises: :exc:`ValueError` if ``value`` is out of int256 range. """ if data < -(2**255) or data > 2**255 - 1: raise ValueError("Invalid data, must be between -(2**255) and 2**255 - 1.") value_bytes = data.to_bytes(32, "big", signed=True) hi_hi, hi_lo, lo_hi, lo_lo = ( int.from_bytes(value_bytes[0:8], "big", signed=True), int.from_bytes(value_bytes[8:16], "big", signed=False), int.from_bytes(value_bytes[16:24], "big", signed=False), int.from_bytes(value_bytes[24:32], "big", signed=False), ) i256 = stellar_xdr.Int256Parts( hi_hi=stellar_xdr.Int64(hi_hi), hi_lo=stellar_xdr.Uint64(hi_lo), lo_hi=stellar_xdr.Uint64(lo_hi), lo_lo=stellar_xdr.Uint64(lo_lo), ) return stellar_xdr.SCVal(stellar_xdr.SCValType.SCV_I256, i256=i256)
[docs] def from_int256(sc_val: stellar_xdr.SCVal) -> int: """Creates an int value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: An int value. (int256) :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_I256`. """ if sc_val.type != stellar_xdr.SCValType.SCV_I256: raise ValueError(f"Invalid sc_val type, must be SCV_I256, got {sc_val.type}") assert sc_val.i256 is not None value_bytes = ( sc_val.i256.hi_hi.int64.to_bytes(8, "big", signed=True) + sc_val.i256.hi_lo.uint64.to_bytes(8, "big", signed=False) + sc_val.i256.lo_hi.uint64.to_bytes(8, "big", signed=False) + sc_val.i256.lo_lo.uint64.to_bytes(8, "big", signed=False) ) return int.from_bytes(value_bytes, "big", signed=True)
[docs] def to_map(data: Dict[stellar_xdr.SCVal, stellar_xdr.SCVal]) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from an OrderedDict value. :param data: The dict value to convert. :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_MAP`. """ return stellar_xdr.SCVal( stellar_xdr.SCValType.SCV_MAP, map=stellar_xdr.SCMap( sc_map=[ stellar_xdr.SCMapEntry(key=key, val=value) for key, value in data.items() ] ), )
[docs] def from_map(sc_val: stellar_xdr.SCVal) -> Dict[stellar_xdr.SCVal, stellar_xdr.SCVal]: """Creates a dict value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: The map value. :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_MAP`. """ if sc_val.type != stellar_xdr.SCValType.SCV_MAP: raise ValueError(f"Invalid sc_val type, must be SCV_MAP, got {sc_val.type}") assert sc_val.map is not None return dict([(entry.key, entry.val) for entry in sc_val.map.sc_map])
[docs] def to_string(data: Union[str, bytes]) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from a string value. :param data: The string value to convert. :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_STRING`. """ if isinstance(data, str): data = data.encode("utf-8") return stellar_xdr.SCVal( stellar_xdr.SCValType.SCV_STRING, str=stellar_xdr.SCString(data) )
[docs] def from_string(sc_val: stellar_xdr.SCVal) -> bytes: """Creates a string value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: A string value in bytes. :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_STRING`. """ if sc_val.type != stellar_xdr.SCValType.SCV_STRING: raise ValueError(f"Invalid sc_val type, must be SCV_STRING, got {sc_val.type}") assert sc_val.str is not None return sc_val.str.sc_string
[docs] def to_symbol(data: str) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from a symbol value. :param data: The symbol value to convert. :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_SYMBOL`. """ return stellar_xdr.SCVal( stellar_xdr.SCValType.SCV_SYMBOL, sym=stellar_xdr.SCSymbol(data.encode("utf-8")) )
[docs] def from_symbol(sc_val: stellar_xdr.SCVal) -> str: """Creates a symbol value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: A symbol value. :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_SYMBOL`. """ if sc_val.type != stellar_xdr.SCValType.SCV_SYMBOL: raise ValueError(f"Invalid sc_val type, must be SCV_SYMBOL, got {sc_val.type}") assert sc_val.sym is not None return sc_val.sym.sc_symbol.decode("utf-8")
[docs] def to_timepoint(data: int) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from an int value. :param data: The time point. (uint64) :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_TIME_POINT`. :raises: :exc:`ValueError` if ``value`` is out of uint64 range. """ if data < 0 or data > 2**64 - 1: raise ValueError("Invalid data, must be between 0 and 2**64 - 1.") time_point = stellar_xdr.TimePoint(stellar_xdr.Uint64(data)) return stellar_xdr.SCVal(stellar_xdr.SCValType.SCV_TIMEPOINT, timepoint=time_point)
[docs] def from_timepoint(sc_val: stellar_xdr.SCVal) -> int: """Creates an int value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: The time point. (uint64) :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_TIMEPOINT`. """ if sc_val.type != stellar_xdr.SCValType.SCV_TIMEPOINT: raise ValueError( f"Invalid sc_val type, must be SCV_TIMEPOINT, got {sc_val.type}" ) assert sc_val.timepoint is not None return sc_val.timepoint.time_point.uint64
[docs] def to_uint32(data: int) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from an int value. :param data: The int to convert. (uint32) :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_U32`. :raises: :exc:`ValueError` if ``value`` is out of uint32 range. """ if data < 0 or data > 2**32 - 1: raise ValueError("Invalid data, must be between 0 and 2**32 - 1.") return stellar_xdr.SCVal( stellar_xdr.SCValType.SCV_U32, u32=stellar_xdr.Uint32(data) )
[docs] def from_uint32(sc_val: stellar_xdr.SCVal) -> int: """Creates an int value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: An int value. (uint32) :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_U32`. """ if sc_val.type != stellar_xdr.SCValType.SCV_U32: raise ValueError(f"Invalid sc_val type, must be SCV_U32, got {sc_val.type}") assert sc_val.u32 is not None return sc_val.u32.uint32
[docs] def to_uint64(data: int) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from an int value. :param data: The int to convert. (uint64) :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_U64`. :raises: :exc:`ValueError` if ``value`` is out of uint64 range. """ if data < 0 or data > 2**64 - 1: raise ValueError("Invalid data, must be between 0 and 2**64 - 1.") return stellar_xdr.SCVal( stellar_xdr.SCValType.SCV_U64, u64=stellar_xdr.Uint64(data) )
[docs] def from_uint64(sc_val: stellar_xdr.SCVal) -> int: """Creates an int value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: An int value. (uint64) :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_U64`. """ if sc_val.type != stellar_xdr.SCValType.SCV_U64: raise ValueError(f"Invalid sc_val type, must be SCV_U64, got {sc_val.type}") assert sc_val.u64 is not None return sc_val.u64.uint64
[docs] def to_uint128(data: int) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from an int value. :param data: The int to convert. (uint128) :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_U128`. :raises: :exc:`ValueError` if ``value`` is out of uint128 range. """ if data < 0 or data > 2**128 - 1: raise ValueError("Invalid data, must be between 0 and 2**128 - 1.") value_bytes = data.to_bytes(16, "big", signed=False) u128 = stellar_xdr.UInt128Parts( hi=stellar_xdr.Uint64(int.from_bytes(value_bytes[0:8], "big", signed=False)), lo=stellar_xdr.Uint64(int.from_bytes(value_bytes[8:16], "big", signed=False)), ) return stellar_xdr.SCVal(stellar_xdr.SCValType.SCV_U128, u128=u128)
[docs] def from_uint128(sc_val: stellar_xdr.SCVal) -> int: """Creates an int value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: An int value. (uint128) :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_U128`. """ if sc_val.type != stellar_xdr.SCValType.SCV_U128: raise ValueError(f"Invalid sc_val type, must be SCV_U128, got {sc_val.type}") assert sc_val.u128 is not None value_bytes = sc_val.u128.hi.uint64.to_bytes( 8, "big", signed=False ) + sc_val.u128.lo.uint64.to_bytes(8, "big", signed=False) return int.from_bytes(value_bytes, "big", signed=False)
[docs] def to_uint256(data: int) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from an int value. :param data: The int to convert. (uint256) :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_U256`. :raises: :exc:`ValueError` if ``value`` is out of uint256 range. """ if data < 0 or data > 2**256 - 1: raise ValueError("Invalid data, must be between 0 and 2**256 - 1.") value_bytes = data.to_bytes(32, "big", signed=False) hi_hi, hi_lo, lo_hi, lo_lo = ( int.from_bytes(value_bytes[0:8], "big", signed=False), int.from_bytes(value_bytes[8:16], "big", signed=False), int.from_bytes(value_bytes[16:24], "big", signed=False), int.from_bytes(value_bytes[24:32], "big", signed=False), ) u256 = stellar_xdr.UInt256Parts( hi_hi=stellar_xdr.Uint64(hi_hi), hi_lo=stellar_xdr.Uint64(hi_lo), lo_hi=stellar_xdr.Uint64(lo_hi), lo_lo=stellar_xdr.Uint64(lo_lo), ) return stellar_xdr.SCVal(stellar_xdr.SCValType.SCV_U256, u256=u256)
[docs] def from_uint256(sc_val: stellar_xdr.SCVal) -> int: """Creates an int value from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: The value. (uint256) :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_U256`. """ if sc_val.type != stellar_xdr.SCValType.SCV_U256: raise ValueError(f"Invalid sc_val type, must be SCV_U256, got {sc_val.type}") assert sc_val.u256 is not None value_bytes = ( sc_val.u256.hi_hi.uint64.to_bytes(8, "big", signed=False) + sc_val.u256.hi_lo.uint64.to_bytes(8, "big", signed=False) + sc_val.u256.lo_hi.uint64.to_bytes(8, "big", signed=False) + sc_val.u256.lo_lo.uint64.to_bytes(8, "big", signed=False) ) return int.from_bytes(value_bytes, "big", signed=False)
[docs] def to_vec(data: Sequence[stellar_xdr.SCVal]) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object from a list of :class:`stellar_sdk.xdr.SCVal` XDR objects. :param data: The list of :class:`stellar_sdk.xdr.SCVal` XDR objects. :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object with type :class:`stellar_sdk.xdr.SCValType.SCV_VEC`. """ return stellar_xdr.SCVal( stellar_xdr.SCValType.SCV_VEC, vec=stellar_xdr.SCVec(list(data)) )
[docs] def from_vec(sc_val: stellar_xdr.SCVal) -> List[stellar_xdr.SCVal]: """Creates a list of :class:`stellar_sdk.xdr.SCVal` XDR objects from a :class:`stellar_sdk.xdr.SCVal` XDR object. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: The list of :class:`stellar_sdk.xdr.SCVal` XDR objects. :raises: :exc:`ValueError` if ``sc_val`` is not of type :class:`stellar_sdk.xdr.SCValType.SCV_VEC`. """ if sc_val.type != stellar_xdr.SCValType.SCV_VEC: raise ValueError(f"Invalid sc_val type, must be VEC, got {sc_val.type}") assert sc_val.vec is not None return sc_val.vec.sc_vec
[docs] def to_enum(key: str, data: Optional[stellar_xdr.SCVal]) -> stellar_xdr.SCVal: """Creates a :class:`stellar_sdk.xdr.SCVal` XDR object corresponding to the Enum in the Rust SDK. .. warning:: Please note that this API is experimental and may be removed at any time. I recommend using the :meth:`from_vec` to implement it. :param key: The key of the Enum. :param data: The data of the Enum. :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object. """ scv = [to_symbol(key)] if data is not None: scv.append(data) return to_vec(scv)
[docs] def from_enum(sc_val: stellar_xdr.SCVal) -> Tuple[str, Optional[stellar_xdr.SCVal]]: """Creates a tuple corresponding to the Enum in the Rust SDK. .. warning:: Please note that this API is experimental and may be removed at any time. I recommend using the :meth:`from_vec` and :meth:`from_symbol` to implement it. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: A tuple corresponding to the Enum in the Rust SDK. """ vec = from_vec(sc_val) if len(vec) < 1 or len(vec) > 2: raise ValueError( f"Invalid sc_val, can not parse enum, sc_val: {sc_val.to_xdr()}" ) key = from_symbol(vec[0]) value = None if len(vec) == 2: value = vec[1] return key, value
[docs] def to_tuple_struct(data: Sequence[stellar_xdr.SCVal]) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object corresponding to the Tuple Struct in the Rust SDK. .. warning:: Please note that this API is experimental and may be removed at any time. I recommend using the :meth:`to_vec` to implement it. :param data: The fields of the Tuple Struct. :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object. """ return to_vec(list(data))
[docs] def from_tuple_struct(sc_val: stellar_xdr.SCVal) -> List[stellar_xdr.SCVal]: """Creates a list corresponding to the Tuple Struct in the Rust SDK. .. warning:: Please note that this API is experimental and may be removed at any time. I recommend using the :meth:`from_vec` to implement it. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: A list corresponding to the Tuple Struct in the Rust SDK. """ return from_vec(sc_val)
[docs] def to_struct(data: Dict[str, stellar_xdr.SCVal]) -> stellar_xdr.SCVal: """Creates a new :class:`stellar_sdk.xdr.SCVal` XDR object corresponding to the Struct in the Rust SDK. .. warning:: Please note that this API is experimental and may be removed at any time. I recommend using the :meth:`to_map` and :meth:`to_symbol` to implement it. :param data: The dict value to convert. :return: A new :class:`stellar_sdk.xdr.SCVal` XDR object. """ # sort the dict by key to ensure the order of the fields. # see https://github.com/stellar/stellar-protocol/blob/master/core/cap-0046-01.md#validity sorted_data = dict(sorted(data.items())) v = dict() for key, val in sorted_data.items(): v[to_symbol(key)] = val return to_map(v)
[docs] def from_struct(sc_val: stellar_xdr.SCVal) -> Dict[str, stellar_xdr.SCVal]: """Creates a dict corresponding to the Struct in the Rust SDK. .. warning:: Please note that this API is experimental and may be removed at any time. I recommend using the :meth:`from_map` and :meth:`from_symbol` to implement it. :param sc_val: The :class:`stellar_sdk.xdr.SCVal` XDR object to convert. :return: A dict corresponding to the Struct in the Rust SDK. """ v = from_map(sc_val) return dict([(from_symbol(key), val) for key, val in v.items()])