Source code for stellar_sdk.operation.path_payment_strict_receive

from decimal import Decimal
from typing import List, Union

from .operation import Operation
from ..asset import Asset
from ..keypair import Keypair
from ..xdr import Xdr
from ..strkey import StrKey
from .utils import check_ed25519_public_key, check_amount


[docs]class PathPaymentStrictReceive(Operation): """The :class:`PathPaymentStrictReceive` object, which represents a PathPaymentStrictReceive operation on Stellar's network. Sends an amount in a specific asset to a destination account through a path of offers. This allows the asset sent (e.g. 450 XLM) to be different from the asset received (e.g. 6 BTC). Threshold: Medium :param destination: The destination account to send to. :param send_asset: The asset to pay with. :param send_max: The maximum amount of send_asset to send. :param dest_asset: The asset the destination will receive. :param dest_amount: The amount the destination receives. :param path: A list of Asset objects to use as the path. :param source: The source account for the payment. Defaults to the transaction's source account. """ def __init__( self, destination: str, send_asset: Asset, send_max: Union[str, Decimal], dest_asset: Asset, dest_amount: Union[str, Decimal], path: List[Asset], source: str = None, ) -> None: super().__init__(source) check_ed25519_public_key(destination) check_amount(send_max) check_amount(dest_amount) self.destination: str = destination self.send_asset: Asset = send_asset self.send_max: Union[str, Decimal] = send_max self.dest_asset: Asset = dest_asset self.dest_amount: Union[str, Decimal] = dest_amount self.path: List[Asset] = path # a list of paths/assets @classmethod def type_code(cls) -> int: return Xdr.const.PATH_PAYMENT_STRICT_RECEIVE def _to_operation_body(self) -> Xdr.nullclass: destination = Keypair.from_public_key(self.destination).xdr_account_id() send_asset = self.send_asset.to_xdr_object() dest_asset = self.dest_asset.to_xdr_object() path = [asset.to_xdr_object() for asset in self.path] path_payment_strict_receive_op = Xdr.types.PathPaymentStrictReceiveOp( send_asset, Operation.to_xdr_amount(self.send_max), destination, dest_asset, Operation.to_xdr_amount(self.dest_amount), path, ) body = Xdr.nullclass() body.type = Xdr.const.PATH_PAYMENT_STRICT_RECEIVE body.pathPaymentStrictReceiveOp = path_payment_strict_receive_op return body
[docs] @classmethod def from_xdr_object( cls, operation_xdr_object: Xdr.types.Operation ) -> "PathPaymentStrictReceive": """Creates a :class:`PathPaymentStrictReceive` object from an XDR Operation object. """ source = Operation.get_source_from_xdr_obj(operation_xdr_object) destination = StrKey.encode_ed25519_public_key( operation_xdr_object.body.pathPaymentStrictReceiveOp.destination.ed25519 ) send_asset = Asset.from_xdr_object( operation_xdr_object.body.pathPaymentStrictReceiveOp.sendAsset ) dest_asset = Asset.from_xdr_object( operation_xdr_object.body.pathPaymentStrictReceiveOp.destAsset ) send_max = Operation.from_xdr_amount( operation_xdr_object.body.pathPaymentStrictReceiveOp.sendMax ) dest_amount = Operation.from_xdr_amount( operation_xdr_object.body.pathPaymentStrictReceiveOp.destAmount ) path = [] if operation_xdr_object.body.pathPaymentStrictReceiveOp.path: for x in operation_xdr_object.body.pathPaymentStrictReceiveOp.path: path.append(Asset.from_xdr_object(x)) return cls( source=source, destination=destination, send_asset=send_asset, send_max=send_max, dest_asset=dest_asset, dest_amount=dest_amount, path=path, )