From 1b601b3e0814ff5b25acf48319eea74b7a0a2171 Mon Sep 17 00:00:00 2001 From: matejcik Date: Tue, 20 Jul 2021 12:55:39 +0200 Subject: [PATCH] feat(common): strong typing for Stellar protobuf messages BREAKING CHANGE: StellarAssetType is renamed to StellarAsset. The name StellarAssetType is reused for the corresponding enum. Enums are introduced in several other places. Their values correspond to allowed values of (previously int) fields so this should not pose a compatibility problem. Many fields are now required. We believe that this should not pose a compatibility problem, because all known interfaces to Stellar signing actually accept Stellar XDR on input, whose required fields match the protobuf schema. --- common/protob/messages-stellar.proto | 114 +++++++----- core/src/all_modules.py | 6 + core/src/trezor/enums/StellarAssetType.py | 7 + core/src/trezor/enums/StellarMemoType.py | 9 + core/src/trezor/enums/StellarSignerType.py | 7 + core/src/trezor/enums/__init__.py | 17 ++ core/src/trezor/messages.py | 159 ++++++++-------- python/src/trezorlib/messages.py | 200 +++++++++++---------- 8 files changed, 306 insertions(+), 213 deletions(-) create mode 100644 core/src/trezor/enums/StellarAssetType.py create mode 100644 core/src/trezor/enums/StellarMemoType.py create mode 100644 core/src/trezor/enums/StellarSignerType.py diff --git a/common/protob/messages-stellar.proto b/common/protob/messages-stellar.proto index 8587b9e0b..7e84f80e7 100644 --- a/common/protob/messages-stellar.proto +++ b/common/protob/messages-stellar.proto @@ -5,14 +5,22 @@ package hw.trezor.messages.stellar; option java_package = "com.satoshilabs.trezor.lib.protobuf"; option java_outer_classname = "TrezorMessageStellar"; +// https://github.com/stellar/stellar-core/blob/02d26858069de7c0eefe065056fb0a19bf72ea56/src/xdr/Stellar-ledger-entries.x#L25-L31 +enum StellarAssetType { + NATIVE = 0; + ALPHANUM4 = 1; + ALPHANUM12 = 2; +} + /** * Describes a Stellar asset * @embed */ -message StellarAssetType { - required uint32 type = 1; // 0 = native asset (XLM), 1 = alphanum 4, 2 = alphanum 12 +message StellarAsset { + required StellarAssetType type = 1; optional string code = 2; // for non-native assets, string describing the code optional string issuer = 3; // issuing address + } /** @@ -39,18 +47,27 @@ message StellarAddress { * @next StellarTxOpRequest */ message StellarSignTx { - repeated uint32 address_n = 2; // BIP-32 path. For compatibility with other wallets, must be m/44'/148'/index' - optional string network_passphrase = 3; // passphrase for signing messages on the destination network - optional string source_account = 4; // source account address - optional uint32 fee = 5; // Fee (in stroops) for the transaction - optional uint64 sequence_number = 6; // transaction sequence number - optional uint32 timebounds_start = 8; // unix timestamp (client must truncate this to 32 bytes) - optional uint32 timebounds_end = 9; // unix timestamp (client must truncate this to 32 bytes) - optional uint32 memo_type = 10; // 0 = none, 1 = text, 2 = id, 3 = hash, 4 = return - optional string memo_text = 11; // up to 28 characters (4 bytes are for length) - optional uint64 memo_id = 12; // 8-byte uint64 - optional bytes memo_hash = 13; // 32 bytes representing a hash - optional uint32 num_operations = 14; // number of operations in this transaction + repeated uint32 address_n = 2; // BIP-32 path. For compatibility with other wallets, must be m/44'/148'/index' + required string network_passphrase = 3; // passphrase for signing messages on the destination network + required string source_account = 4; // source account address + required uint32 fee = 5; // Fee (in stroops) for the transaction + required uint64 sequence_number = 6; // transaction sequence number + optional uint32 timebounds_start = 8; // unix timestamp (client must truncate this to 32 bytes) + optional uint32 timebounds_end = 9; // unix timestamp (client must truncate this to 32 bytes) + required StellarMemoType memo_type = 10; // type of memo attached to the transaction + optional string memo_text = 11; // up to 28 characters (4 bytes are for length) + optional uint64 memo_id = 12; // 8-byte uint64 + optional bytes memo_hash = 13; // 32 bytes representing a hash + required uint32 num_operations = 14; // number of operations in this transaction + + // https://github.com/stellar/stellar-core/blob/02d26858069de7c0eefe065056fb0a19bf72ea56/src/xdr/Stellar-transaction.x#L506-L513 + enum StellarMemoType { + NONE = 0; + TEXT = 1; + ID = 2; + HASH = 3; + RETURN = 4; + } } /** @@ -77,9 +94,9 @@ message StellarTxOpRequest { */ message StellarPaymentOp { optional string source_account = 1; // (optional) source account address - optional string destination_account = 2; // destination account address - optional StellarAssetType asset = 3; // asset involved in the operation - optional sint64 amount = 4; // amount of the given asset to pay + required string destination_account = 2; // destination account address + required StellarAsset asset = 3; // asset involved in the operation + required sint64 amount = 4; // amount of the given asset to pay } /** @@ -89,8 +106,8 @@ message StellarPaymentOp { */ message StellarCreateAccountOp { optional string source_account = 1; // (optional) source account address - optional string new_account = 2; // account address to create - optional sint64 starting_balance = 3; // initial starting balance for the new account + required string new_account = 2; // account address to create + required sint64 starting_balance = 3; // initial starting balance for the new account } /** @@ -100,12 +117,12 @@ message StellarCreateAccountOp { */ message StellarPathPaymentOp { optional string source_account = 1; // (optional) source address - optional StellarAssetType send_asset = 2; - optional sint64 send_max = 3; - optional string destination_account = 4; - optional StellarAssetType destination_asset = 5; - optional sint64 destination_amount = 6; - repeated StellarAssetType paths = 7; + required StellarAsset send_asset = 2; + required sint64 send_max = 3; + required string destination_account = 4; + required StellarAsset destination_asset = 5; + required sint64 destination_amount = 6; + repeated StellarAsset paths = 7; } /** @@ -115,12 +132,12 @@ message StellarPathPaymentOp { */ message StellarManageOfferOp { optional string source_account = 1; // (optional) source account address - optional StellarAssetType selling_asset = 2; - optional StellarAssetType buying_asset = 3; - optional sint64 amount = 4; - optional uint32 price_n = 5; // Price numerator - optional uint32 price_d = 6; // Price denominator - optional uint64 offer_id = 7; // Offer ID for updating an existing offer + required StellarAsset selling_asset = 2; + required StellarAsset buying_asset = 3; + required sint64 amount = 4; + required uint32 price_n = 5; // Price numerator + required uint32 price_d = 6; // Price denominator + required uint64 offer_id = 7; // Offer ID for updating an existing offer } /** @@ -130,11 +147,11 @@ message StellarManageOfferOp { */ message StellarCreatePassiveOfferOp { optional string source_account = 1; // (optional) source account address - optional StellarAssetType selling_asset = 2; - optional StellarAssetType buying_asset = 3; - optional sint64 amount = 4; - optional uint32 price_n = 5; // Price numerator - optional uint32 price_d = 6; // Price denominator + required StellarAsset selling_asset = 2; + required StellarAsset buying_asset = 3; + required sint64 amount = 4; + required uint32 price_n = 5; // Price numerator + required uint32 price_d = 6; // Price denominator } /** @@ -152,9 +169,16 @@ message StellarSetOptionsOp { optional uint32 medium_threshold = 7; optional uint32 high_threshold = 8; optional string home_domain = 9; - optional uint32 signer_type = 10; + optional StellarSignerType signer_type = 10; optional bytes signer_key = 11; optional uint32 signer_weight = 12; + + // https://github.com/stellar/stellar-core/blob/02d26858069de7c0eefe065056fb0a19bf72ea56/src/xdr/Stellar-types.x#L32-L37 + enum StellarSignerType { + ACCOUNT = 0; + PRE_AUTH = 1; + HASH = 2; + } } /** @@ -164,8 +188,8 @@ message StellarSetOptionsOp { */ message StellarChangeTrustOp { optional string source_account = 1; // (optional) source account address - optional StellarAssetType asset = 2; - optional uint64 limit = 3; + required StellarAsset asset = 2; + required uint64 limit = 3; } /** @@ -175,10 +199,10 @@ message StellarChangeTrustOp { */ message StellarAllowTrustOp { optional string source_account = 1; // (optional) source account address - optional string trusted_account = 2; // The account being allowed to hold the asset - optional uint32 asset_type = 3; // 1 = 4-character, 2 = 12-character + required string trusted_account = 2; // The account being allowed to hold the asset + required StellarAssetType asset_type = 3; optional string asset_code = 4; // human-readable asset code - optional uint32 is_authorized = 5; + required bool is_authorized = 5; } /** @@ -188,7 +212,7 @@ message StellarAllowTrustOp { */ message StellarAccountMergeOp { optional string source_account = 1; // (optional) source account address - optional string destination_account = 2; // destination account address + required string destination_account = 2; // destination account address } /** @@ -198,7 +222,7 @@ message StellarAccountMergeOp { */ message StellarManageDataOp { optional string source_account = 1; // (optional) source account address - optional string key = 2; + required string key = 2; optional bytes value = 3; // 64 bytes of arbitrary data } @@ -209,7 +233,7 @@ message StellarManageDataOp { */ message StellarBumpSequenceOp { optional string source_account = 1; // (optional) source account address - optional uint64 bump_to = 2; // new sequence number + required uint64 bump_to = 2; // new sequence number } /** diff --git a/core/src/all_modules.py b/core/src/all_modules.py index c59b9b18c..3faf0f435 100644 --- a/core/src/all_modules.py +++ b/core/src/all_modules.py @@ -408,6 +408,12 @@ if utils.BITCOIN_ONLY: import trezor.enums.NEMMosaicLevy trezor.enums.NEMSupplyChangeType import trezor.enums.NEMSupplyChangeType + trezor.enums.StellarAssetType + import trezor.enums.StellarAssetType + trezor.enums.StellarMemoType + import trezor.enums.StellarMemoType + trezor.enums.StellarSignerType + import trezor.enums.StellarSignerType trezor.enums.TezosBallotType import trezor.enums.TezosBallotType trezor.enums.TezosContractType diff --git a/core/src/trezor/enums/StellarAssetType.py b/core/src/trezor/enums/StellarAssetType.py new file mode 100644 index 000000000..43a5d628c --- /dev/null +++ b/core/src/trezor/enums/StellarAssetType.py @@ -0,0 +1,7 @@ +# Automatically generated by pb2py +# fmt: off +# isort:skip_file + +NATIVE = 0 +ALPHANUM4 = 1 +ALPHANUM12 = 2 diff --git a/core/src/trezor/enums/StellarMemoType.py b/core/src/trezor/enums/StellarMemoType.py new file mode 100644 index 000000000..6057506e0 --- /dev/null +++ b/core/src/trezor/enums/StellarMemoType.py @@ -0,0 +1,9 @@ +# Automatically generated by pb2py +# fmt: off +# isort:skip_file + +NONE = 0 +TEXT = 1 +ID = 2 +HASH = 3 +RETURN = 4 diff --git a/core/src/trezor/enums/StellarSignerType.py b/core/src/trezor/enums/StellarSignerType.py new file mode 100644 index 000000000..440c7c834 --- /dev/null +++ b/core/src/trezor/enums/StellarSignerType.py @@ -0,0 +1,7 @@ +# Automatically generated by pb2py +# fmt: off +# isort:skip_file + +ACCOUNT = 0 +PRE_AUTH = 1 +HASH = 2 diff --git a/core/src/trezor/enums/__init__.py b/core/src/trezor/enums/__init__.py index 2f5b42ab0..5876771de 100644 --- a/core/src/trezor/enums/__init__.py +++ b/core/src/trezor/enums/__init__.py @@ -416,6 +416,23 @@ if TYPE_CHECKING: ImportanceTransfer_Activate = 1 ImportanceTransfer_Deactivate = 2 + class StellarAssetType(IntEnum): + NATIVE = 0 + ALPHANUM4 = 1 + ALPHANUM12 = 2 + + class StellarMemoType(IntEnum): + NONE = 0 + TEXT = 1 + ID = 2 + HASH = 3 + RETURN = 4 + + class StellarSignerType(IntEnum): + ACCOUNT = 0 + PRE_AUTH = 1 + HASH = 2 + class TezosContractType(IntEnum): Implicit = 0 Originated = 1 diff --git a/core/src/trezor/messages.py b/core/src/trezor/messages.py index a03830e4a..b0141717d 100644 --- a/core/src/trezor/messages.py +++ b/core/src/trezor/messages.py @@ -46,6 +46,9 @@ if TYPE_CHECKING: from trezor.enums import RequestType # noqa: F401 from trezor.enums import SafetyCheckLevel # noqa: F401 from trezor.enums import SdProtectOperationType # noqa: F401 + from trezor.enums import StellarAssetType # noqa: F401 + from trezor.enums import StellarMemoType # noqa: F401 + from trezor.enums import StellarSignerType # noqa: F401 from trezor.enums import TezosBallotType # noqa: F401 from trezor.enums import TezosContractType # noqa: F401 from trezor.enums import WordRequestType # noqa: F401 @@ -4428,22 +4431,22 @@ if TYPE_CHECKING: def is_type_of(cls, msg: protobuf.MessageType) -> TypeGuard["RipplePayment"]: return isinstance(msg, cls) - class StellarAssetType(protobuf.MessageType): - type: "int" + class StellarAsset(protobuf.MessageType): + type: "StellarAssetType" code: "str | None" issuer: "str | None" def __init__( self, *, - type: "int", + type: "StellarAssetType", code: "str | None" = None, issuer: "str | None" = None, ) -> None: pass @classmethod - def is_type_of(cls, msg: protobuf.MessageType) -> TypeGuard["StellarAssetType"]: + def is_type_of(cls, msg: protobuf.MessageType) -> TypeGuard["StellarAsset"]: return isinstance(msg, cls) class StellarGetAddress(protobuf.MessageType): @@ -4478,33 +4481,33 @@ if TYPE_CHECKING: class StellarSignTx(protobuf.MessageType): address_n: "list[int]" - network_passphrase: "str | None" - source_account: "str | None" - fee: "int | None" - sequence_number: "int | None" + network_passphrase: "str" + source_account: "str" + fee: "int" + sequence_number: "int" timebounds_start: "int | None" timebounds_end: "int | None" - memo_type: "int | None" + memo_type: "StellarMemoType" memo_text: "str | None" memo_id: "int | None" memo_hash: "bytes | None" - num_operations: "int | None" + num_operations: "int" def __init__( self, *, + network_passphrase: "str", + source_account: "str", + fee: "int", + sequence_number: "int", + memo_type: "StellarMemoType", + num_operations: "int", address_n: "list[int] | None" = None, - network_passphrase: "str | None" = None, - source_account: "str | None" = None, - fee: "int | None" = None, - sequence_number: "int | None" = None, timebounds_start: "int | None" = None, timebounds_end: "int | None" = None, - memo_type: "int | None" = None, memo_text: "str | None" = None, memo_id: "int | None" = None, memo_hash: "bytes | None" = None, - num_operations: "int | None" = None, ) -> None: pass @@ -4520,17 +4523,17 @@ if TYPE_CHECKING: class StellarPaymentOp(protobuf.MessageType): source_account: "str | None" - destination_account: "str | None" - asset: "StellarAssetType | None" - amount: "int | None" + destination_account: "str" + asset: "StellarAsset" + amount: "int" def __init__( self, *, + destination_account: "str", + asset: "StellarAsset", + amount: "int", source_account: "str | None" = None, - destination_account: "str | None" = None, - asset: "StellarAssetType | None" = None, - amount: "int | None" = None, ) -> None: pass @@ -4540,15 +4543,15 @@ if TYPE_CHECKING: class StellarCreateAccountOp(protobuf.MessageType): source_account: "str | None" - new_account: "str | None" - starting_balance: "int | None" + new_account: "str" + starting_balance: "int" def __init__( self, *, + new_account: "str", + starting_balance: "int", source_account: "str | None" = None, - new_account: "str | None" = None, - starting_balance: "int | None" = None, ) -> None: pass @@ -4558,23 +4561,23 @@ if TYPE_CHECKING: class StellarPathPaymentOp(protobuf.MessageType): source_account: "str | None" - send_asset: "StellarAssetType | None" - send_max: "int | None" - destination_account: "str | None" - destination_asset: "StellarAssetType | None" - destination_amount: "int | None" - paths: "list[StellarAssetType]" + send_asset: "StellarAsset" + send_max: "int" + destination_account: "str" + destination_asset: "StellarAsset" + destination_amount: "int" + paths: "list[StellarAsset]" def __init__( self, *, - paths: "list[StellarAssetType] | None" = None, + send_asset: "StellarAsset", + send_max: "int", + destination_account: "str", + destination_asset: "StellarAsset", + destination_amount: "int", + paths: "list[StellarAsset] | None" = None, source_account: "str | None" = None, - send_asset: "StellarAssetType | None" = None, - send_max: "int | None" = None, - destination_account: "str | None" = None, - destination_asset: "StellarAssetType | None" = None, - destination_amount: "int | None" = None, ) -> None: pass @@ -4584,23 +4587,23 @@ if TYPE_CHECKING: class StellarManageOfferOp(protobuf.MessageType): source_account: "str | None" - selling_asset: "StellarAssetType | None" - buying_asset: "StellarAssetType | None" - amount: "int | None" - price_n: "int | None" - price_d: "int | None" - offer_id: "int | None" + selling_asset: "StellarAsset" + buying_asset: "StellarAsset" + amount: "int" + price_n: "int" + price_d: "int" + offer_id: "int" def __init__( self, *, + selling_asset: "StellarAsset", + buying_asset: "StellarAsset", + amount: "int", + price_n: "int", + price_d: "int", + offer_id: "int", source_account: "str | None" = None, - selling_asset: "StellarAssetType | None" = None, - buying_asset: "StellarAssetType | None" = None, - amount: "int | None" = None, - price_n: "int | None" = None, - price_d: "int | None" = None, - offer_id: "int | None" = None, ) -> None: pass @@ -4610,21 +4613,21 @@ if TYPE_CHECKING: class StellarCreatePassiveOfferOp(protobuf.MessageType): source_account: "str | None" - selling_asset: "StellarAssetType | None" - buying_asset: "StellarAssetType | None" - amount: "int | None" - price_n: "int | None" - price_d: "int | None" + selling_asset: "StellarAsset" + buying_asset: "StellarAsset" + amount: "int" + price_n: "int" + price_d: "int" def __init__( self, *, + selling_asset: "StellarAsset", + buying_asset: "StellarAsset", + amount: "int", + price_n: "int", + price_d: "int", source_account: "str | None" = None, - selling_asset: "StellarAssetType | None" = None, - buying_asset: "StellarAssetType | None" = None, - amount: "int | None" = None, - price_n: "int | None" = None, - price_d: "int | None" = None, ) -> None: pass @@ -4642,7 +4645,7 @@ if TYPE_CHECKING: medium_threshold: "int | None" high_threshold: "int | None" home_domain: "str | None" - signer_type: "int | None" + signer_type: "StellarSignerType | None" signer_key: "bytes | None" signer_weight: "int | None" @@ -4658,7 +4661,7 @@ if TYPE_CHECKING: medium_threshold: "int | None" = None, high_threshold: "int | None" = None, home_domain: "str | None" = None, - signer_type: "int | None" = None, + signer_type: "StellarSignerType | None" = None, signer_key: "bytes | None" = None, signer_weight: "int | None" = None, ) -> None: @@ -4670,15 +4673,15 @@ if TYPE_CHECKING: class StellarChangeTrustOp(protobuf.MessageType): source_account: "str | None" - asset: "StellarAssetType | None" - limit: "int | None" + asset: "StellarAsset" + limit: "int" def __init__( self, *, + asset: "StellarAsset", + limit: "int", source_account: "str | None" = None, - asset: "StellarAssetType | None" = None, - limit: "int | None" = None, ) -> None: pass @@ -4688,19 +4691,19 @@ if TYPE_CHECKING: class StellarAllowTrustOp(protobuf.MessageType): source_account: "str | None" - trusted_account: "str | None" - asset_type: "int | None" + trusted_account: "str" + asset_type: "StellarAssetType" asset_code: "str | None" - is_authorized: "int | None" + is_authorized: "bool" def __init__( self, *, + trusted_account: "str", + asset_type: "StellarAssetType", + is_authorized: "bool", source_account: "str | None" = None, - trusted_account: "str | None" = None, - asset_type: "int | None" = None, asset_code: "str | None" = None, - is_authorized: "int | None" = None, ) -> None: pass @@ -4710,13 +4713,13 @@ if TYPE_CHECKING: class StellarAccountMergeOp(protobuf.MessageType): source_account: "str | None" - destination_account: "str | None" + destination_account: "str" def __init__( self, *, + destination_account: "str", source_account: "str | None" = None, - destination_account: "str | None" = None, ) -> None: pass @@ -4726,14 +4729,14 @@ if TYPE_CHECKING: class StellarManageDataOp(protobuf.MessageType): source_account: "str | None" - key: "str | None" + key: "str" value: "bytes | None" def __init__( self, *, + key: "str", source_account: "str | None" = None, - key: "str | None" = None, value: "bytes | None" = None, ) -> None: pass @@ -4744,13 +4747,13 @@ if TYPE_CHECKING: class StellarBumpSequenceOp(protobuf.MessageType): source_account: "str | None" - bump_to: "int | None" + bump_to: "int" def __init__( self, *, + bump_to: "int", source_account: "str | None" = None, - bump_to: "int | None" = None, ) -> None: pass diff --git a/python/src/trezorlib/messages.py b/python/src/trezorlib/messages.py index a550dec4c..6e6d106d0 100644 --- a/python/src/trezorlib/messages.py +++ b/python/src/trezorlib/messages.py @@ -446,6 +446,26 @@ class NEMImportanceTransferMode(IntEnum): ImportanceTransfer_Deactivate = 2 +class StellarAssetType(IntEnum): + NATIVE = 0 + ALPHANUM4 = 1 + ALPHANUM12 = 2 + + +class StellarMemoType(IntEnum): + NONE = 0 + TEXT = 1 + ID = 2 + HASH = 3 + RETURN = 4 + + +class StellarSignerType(IntEnum): + ACCOUNT = 0 + PRE_AUTH = 1 + HASH = 2 + + class TezosContractType(IntEnum): Implicit = 0 Originated = 1 @@ -5887,10 +5907,10 @@ class RipplePayment(protobuf.MessageType): self.destination_tag = destination_tag -class StellarAssetType(protobuf.MessageType): +class StellarAsset(protobuf.MessageType): MESSAGE_WIRE_TYPE = None FIELDS = { - 1: protobuf.Field("type", "uint32", repeated=False, required=True), + 1: protobuf.Field("type", "StellarAssetType", repeated=False, required=True), 2: protobuf.Field("code", "string", repeated=False, required=False), 3: protobuf.Field("issuer", "string", repeated=False, required=False), } @@ -5898,7 +5918,7 @@ class StellarAssetType(protobuf.MessageType): def __init__( self, *, - type: "int", + type: "StellarAssetType", code: Optional["str"] = None, issuer: Optional["str"] = None, ) -> None: @@ -5942,47 +5962,47 @@ class StellarSignTx(protobuf.MessageType): MESSAGE_WIRE_TYPE = 202 FIELDS = { 2: protobuf.Field("address_n", "uint32", repeated=True, required=False), - 3: protobuf.Field("network_passphrase", "string", repeated=False, required=False), - 4: protobuf.Field("source_account", "string", repeated=False, required=False), - 5: protobuf.Field("fee", "uint32", repeated=False, required=False), - 6: protobuf.Field("sequence_number", "uint64", repeated=False, required=False), + 3: protobuf.Field("network_passphrase", "string", repeated=False, required=True), + 4: protobuf.Field("source_account", "string", repeated=False, required=True), + 5: protobuf.Field("fee", "uint32", repeated=False, required=True), + 6: protobuf.Field("sequence_number", "uint64", repeated=False, required=True), 8: protobuf.Field("timebounds_start", "uint32", repeated=False, required=False), 9: protobuf.Field("timebounds_end", "uint32", repeated=False, required=False), - 10: protobuf.Field("memo_type", "uint32", repeated=False, required=False), + 10: protobuf.Field("memo_type", "StellarMemoType", repeated=False, required=True), 11: protobuf.Field("memo_text", "string", repeated=False, required=False), 12: protobuf.Field("memo_id", "uint64", repeated=False, required=False), 13: protobuf.Field("memo_hash", "bytes", repeated=False, required=False), - 14: protobuf.Field("num_operations", "uint32", repeated=False, required=False), + 14: protobuf.Field("num_operations", "uint32", repeated=False, required=True), } def __init__( self, *, + network_passphrase: "str", + source_account: "str", + fee: "int", + sequence_number: "int", + memo_type: "StellarMemoType", + num_operations: "int", address_n: Optional[List["int"]] = None, - network_passphrase: Optional["str"] = None, - source_account: Optional["str"] = None, - fee: Optional["int"] = None, - sequence_number: Optional["int"] = None, timebounds_start: Optional["int"] = None, timebounds_end: Optional["int"] = None, - memo_type: Optional["int"] = None, memo_text: Optional["str"] = None, memo_id: Optional["int"] = None, memo_hash: Optional["bytes"] = None, - num_operations: Optional["int"] = None, ) -> None: self.address_n = address_n if address_n is not None else [] self.network_passphrase = network_passphrase self.source_account = source_account self.fee = fee self.sequence_number = sequence_number + self.memo_type = memo_type + self.num_operations = num_operations self.timebounds_start = timebounds_start self.timebounds_end = timebounds_end - self.memo_type = memo_type self.memo_text = memo_text self.memo_id = memo_id self.memo_hash = memo_hash - self.num_operations = num_operations class StellarTxOpRequest(protobuf.MessageType): @@ -5993,136 +6013,136 @@ class StellarPaymentOp(protobuf.MessageType): MESSAGE_WIRE_TYPE = 211 FIELDS = { 1: protobuf.Field("source_account", "string", repeated=False, required=False), - 2: protobuf.Field("destination_account", "string", repeated=False, required=False), - 3: protobuf.Field("asset", "StellarAssetType", repeated=False, required=False), - 4: protobuf.Field("amount", "sint64", repeated=False, required=False), + 2: protobuf.Field("destination_account", "string", repeated=False, required=True), + 3: protobuf.Field("asset", "StellarAsset", repeated=False, required=True), + 4: protobuf.Field("amount", "sint64", repeated=False, required=True), } def __init__( self, *, + destination_account: "str", + asset: "StellarAsset", + amount: "int", source_account: Optional["str"] = None, - destination_account: Optional["str"] = None, - asset: Optional["StellarAssetType"] = None, - amount: Optional["int"] = None, ) -> None: - self.source_account = source_account self.destination_account = destination_account self.asset = asset self.amount = amount + self.source_account = source_account class StellarCreateAccountOp(protobuf.MessageType): MESSAGE_WIRE_TYPE = 210 FIELDS = { 1: protobuf.Field("source_account", "string", repeated=False, required=False), - 2: protobuf.Field("new_account", "string", repeated=False, required=False), - 3: protobuf.Field("starting_balance", "sint64", repeated=False, required=False), + 2: protobuf.Field("new_account", "string", repeated=False, required=True), + 3: protobuf.Field("starting_balance", "sint64", repeated=False, required=True), } def __init__( self, *, + new_account: "str", + starting_balance: "int", source_account: Optional["str"] = None, - new_account: Optional["str"] = None, - starting_balance: Optional["int"] = None, ) -> None: - self.source_account = source_account self.new_account = new_account self.starting_balance = starting_balance + self.source_account = source_account class StellarPathPaymentOp(protobuf.MessageType): MESSAGE_WIRE_TYPE = 212 FIELDS = { 1: protobuf.Field("source_account", "string", repeated=False, required=False), - 2: protobuf.Field("send_asset", "StellarAssetType", repeated=False, required=False), - 3: protobuf.Field("send_max", "sint64", repeated=False, required=False), - 4: protobuf.Field("destination_account", "string", repeated=False, required=False), - 5: protobuf.Field("destination_asset", "StellarAssetType", repeated=False, required=False), - 6: protobuf.Field("destination_amount", "sint64", repeated=False, required=False), - 7: protobuf.Field("paths", "StellarAssetType", repeated=True, required=False), + 2: protobuf.Field("send_asset", "StellarAsset", repeated=False, required=True), + 3: protobuf.Field("send_max", "sint64", repeated=False, required=True), + 4: protobuf.Field("destination_account", "string", repeated=False, required=True), + 5: protobuf.Field("destination_asset", "StellarAsset", repeated=False, required=True), + 6: protobuf.Field("destination_amount", "sint64", repeated=False, required=True), + 7: protobuf.Field("paths", "StellarAsset", repeated=True, required=False), } def __init__( self, *, - paths: Optional[List["StellarAssetType"]] = None, + send_asset: "StellarAsset", + send_max: "int", + destination_account: "str", + destination_asset: "StellarAsset", + destination_amount: "int", + paths: Optional[List["StellarAsset"]] = None, source_account: Optional["str"] = None, - send_asset: Optional["StellarAssetType"] = None, - send_max: Optional["int"] = None, - destination_account: Optional["str"] = None, - destination_asset: Optional["StellarAssetType"] = None, - destination_amount: Optional["int"] = None, ) -> None: self.paths = paths if paths is not None else [] - self.source_account = source_account self.send_asset = send_asset self.send_max = send_max self.destination_account = destination_account self.destination_asset = destination_asset self.destination_amount = destination_amount + self.source_account = source_account class StellarManageOfferOp(protobuf.MessageType): MESSAGE_WIRE_TYPE = 213 FIELDS = { 1: protobuf.Field("source_account", "string", repeated=False, required=False), - 2: protobuf.Field("selling_asset", "StellarAssetType", repeated=False, required=False), - 3: protobuf.Field("buying_asset", "StellarAssetType", repeated=False, required=False), - 4: protobuf.Field("amount", "sint64", repeated=False, required=False), - 5: protobuf.Field("price_n", "uint32", repeated=False, required=False), - 6: protobuf.Field("price_d", "uint32", repeated=False, required=False), - 7: protobuf.Field("offer_id", "uint64", repeated=False, required=False), + 2: protobuf.Field("selling_asset", "StellarAsset", repeated=False, required=True), + 3: protobuf.Field("buying_asset", "StellarAsset", repeated=False, required=True), + 4: protobuf.Field("amount", "sint64", repeated=False, required=True), + 5: protobuf.Field("price_n", "uint32", repeated=False, required=True), + 6: protobuf.Field("price_d", "uint32", repeated=False, required=True), + 7: protobuf.Field("offer_id", "uint64", repeated=False, required=True), } def __init__( self, *, + selling_asset: "StellarAsset", + buying_asset: "StellarAsset", + amount: "int", + price_n: "int", + price_d: "int", + offer_id: "int", source_account: Optional["str"] = None, - selling_asset: Optional["StellarAssetType"] = None, - buying_asset: Optional["StellarAssetType"] = None, - amount: Optional["int"] = None, - price_n: Optional["int"] = None, - price_d: Optional["int"] = None, - offer_id: Optional["int"] = None, ) -> None: - self.source_account = source_account self.selling_asset = selling_asset self.buying_asset = buying_asset self.amount = amount self.price_n = price_n self.price_d = price_d self.offer_id = offer_id + self.source_account = source_account class StellarCreatePassiveOfferOp(protobuf.MessageType): MESSAGE_WIRE_TYPE = 214 FIELDS = { 1: protobuf.Field("source_account", "string", repeated=False, required=False), - 2: protobuf.Field("selling_asset", "StellarAssetType", repeated=False, required=False), - 3: protobuf.Field("buying_asset", "StellarAssetType", repeated=False, required=False), - 4: protobuf.Field("amount", "sint64", repeated=False, required=False), - 5: protobuf.Field("price_n", "uint32", repeated=False, required=False), - 6: protobuf.Field("price_d", "uint32", repeated=False, required=False), + 2: protobuf.Field("selling_asset", "StellarAsset", repeated=False, required=True), + 3: protobuf.Field("buying_asset", "StellarAsset", repeated=False, required=True), + 4: protobuf.Field("amount", "sint64", repeated=False, required=True), + 5: protobuf.Field("price_n", "uint32", repeated=False, required=True), + 6: protobuf.Field("price_d", "uint32", repeated=False, required=True), } def __init__( self, *, + selling_asset: "StellarAsset", + buying_asset: "StellarAsset", + amount: "int", + price_n: "int", + price_d: "int", source_account: Optional["str"] = None, - selling_asset: Optional["StellarAssetType"] = None, - buying_asset: Optional["StellarAssetType"] = None, - amount: Optional["int"] = None, - price_n: Optional["int"] = None, - price_d: Optional["int"] = None, ) -> None: - self.source_account = source_account self.selling_asset = selling_asset self.buying_asset = buying_asset self.amount = amount self.price_n = price_n self.price_d = price_d + self.source_account = source_account class StellarSetOptionsOp(protobuf.MessageType): @@ -6137,7 +6157,7 @@ class StellarSetOptionsOp(protobuf.MessageType): 7: protobuf.Field("medium_threshold", "uint32", repeated=False, required=False), 8: protobuf.Field("high_threshold", "uint32", repeated=False, required=False), 9: protobuf.Field("home_domain", "string", repeated=False, required=False), - 10: protobuf.Field("signer_type", "uint32", repeated=False, required=False), + 10: protobuf.Field("signer_type", "StellarSignerType", repeated=False, required=False), 11: protobuf.Field("signer_key", "bytes", repeated=False, required=False), 12: protobuf.Field("signer_weight", "uint32", repeated=False, required=False), } @@ -6154,7 +6174,7 @@ class StellarSetOptionsOp(protobuf.MessageType): medium_threshold: Optional["int"] = None, high_threshold: Optional["int"] = None, home_domain: Optional["str"] = None, - signer_type: Optional["int"] = None, + signer_type: Optional["StellarSignerType"] = None, signer_key: Optional["bytes"] = None, signer_weight: Optional["int"] = None, ) -> None: @@ -6176,82 +6196,82 @@ class StellarChangeTrustOp(protobuf.MessageType): MESSAGE_WIRE_TYPE = 216 FIELDS = { 1: protobuf.Field("source_account", "string", repeated=False, required=False), - 2: protobuf.Field("asset", "StellarAssetType", repeated=False, required=False), - 3: protobuf.Field("limit", "uint64", repeated=False, required=False), + 2: protobuf.Field("asset", "StellarAsset", repeated=False, required=True), + 3: protobuf.Field("limit", "uint64", repeated=False, required=True), } def __init__( self, *, + asset: "StellarAsset", + limit: "int", source_account: Optional["str"] = None, - asset: Optional["StellarAssetType"] = None, - limit: Optional["int"] = None, ) -> None: - self.source_account = source_account self.asset = asset self.limit = limit + self.source_account = source_account class StellarAllowTrustOp(protobuf.MessageType): MESSAGE_WIRE_TYPE = 217 FIELDS = { 1: protobuf.Field("source_account", "string", repeated=False, required=False), - 2: protobuf.Field("trusted_account", "string", repeated=False, required=False), - 3: protobuf.Field("asset_type", "uint32", repeated=False, required=False), + 2: protobuf.Field("trusted_account", "string", repeated=False, required=True), + 3: protobuf.Field("asset_type", "StellarAssetType", repeated=False, required=True), 4: protobuf.Field("asset_code", "string", repeated=False, required=False), - 5: protobuf.Field("is_authorized", "uint32", repeated=False, required=False), + 5: protobuf.Field("is_authorized", "bool", repeated=False, required=True), } def __init__( self, *, + trusted_account: "str", + asset_type: "StellarAssetType", + is_authorized: "bool", source_account: Optional["str"] = None, - trusted_account: Optional["str"] = None, - asset_type: Optional["int"] = None, asset_code: Optional["str"] = None, - is_authorized: Optional["int"] = None, ) -> None: - self.source_account = source_account self.trusted_account = trusted_account self.asset_type = asset_type - self.asset_code = asset_code self.is_authorized = is_authorized + self.source_account = source_account + self.asset_code = asset_code class StellarAccountMergeOp(protobuf.MessageType): MESSAGE_WIRE_TYPE = 218 FIELDS = { 1: protobuf.Field("source_account", "string", repeated=False, required=False), - 2: protobuf.Field("destination_account", "string", repeated=False, required=False), + 2: protobuf.Field("destination_account", "string", repeated=False, required=True), } def __init__( self, *, + destination_account: "str", source_account: Optional["str"] = None, - destination_account: Optional["str"] = None, ) -> None: - self.source_account = source_account self.destination_account = destination_account + self.source_account = source_account class StellarManageDataOp(protobuf.MessageType): MESSAGE_WIRE_TYPE = 220 FIELDS = { 1: protobuf.Field("source_account", "string", repeated=False, required=False), - 2: protobuf.Field("key", "string", repeated=False, required=False), + 2: protobuf.Field("key", "string", repeated=False, required=True), 3: protobuf.Field("value", "bytes", repeated=False, required=False), } def __init__( self, *, + key: "str", source_account: Optional["str"] = None, - key: Optional["str"] = None, value: Optional["bytes"] = None, ) -> None: - self.source_account = source_account self.key = key + self.source_account = source_account self.value = value @@ -6259,17 +6279,17 @@ class StellarBumpSequenceOp(protobuf.MessageType): MESSAGE_WIRE_TYPE = 221 FIELDS = { 1: protobuf.Field("source_account", "string", repeated=False, required=False), - 2: protobuf.Field("bump_to", "uint64", repeated=False, required=False), + 2: protobuf.Field("bump_to", "uint64", repeated=False, required=True), } def __init__( self, *, + bump_to: "int", source_account: Optional["str"] = None, - bump_to: Optional["int"] = None, ) -> None: - self.source_account = source_account self.bump_to = bump_to + self.source_account = source_account class StellarSignedTx(protobuf.MessageType):