diff --git a/CHANGELOG.md b/CHANGELOG.md index 4971a88..c5816e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +## [1.5.8] - 11.Jul.2023. +- add SEP-24 support +- ## [1.5.7] - 10.Jul.2023. - make streaming indefinite - fix names in XdrSCSpec classes diff --git a/README.md b/README.md index 890ab7e..e57e093 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ The Soneso open source Stellar SDK for Flutter is build with Dart and provides A 1. Add the dependency to your pubspec.yaml file: ``` dependencies: - stellar_flutter_sdk: ^1.5.7 + stellar_flutter_sdk: ^1.5.8 ``` 2. Install it (command line or IDE): ``` @@ -273,32 +273,33 @@ print(response.memo); ## Documentation and Examples ### Examples -| Example | Description | Documentation | -| :--- | :--- | :--- | -| [Create a new account](documentation/sdk_examples/create_account.md)| A new account is created by another account. In the testnet we can also use Freindbot.|[Create account](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#create-account) | -| [Send native payment](documentation/sdk_examples/send_native_payment.md)| A sender sends 100 XLM (Stellar Lumens) native payment to a receiver. |[Payments](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#payment) | -| [Create trustline](documentation/sdk_examples/trustline.md) | An trustor account trusts an issuer account for a specific custom token. The issuer account can now send tokens to the trustor account. |[Assets & Trustlines](https://www.stellar.org/developers/guides/concepts/assets.html) and [Change trust](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#change-trust)| -| [Send tokens - non native payment](documentation/sdk_examples/send_non_native_payment.md) | Two accounts trust the same issuer account and custom token. They can now send this custom tokens to each other. | [Assets & Trustlines](https://www.stellar.org/developers/guides/concepts/assets.html) and [Change trust](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#change-trust) and [Payments](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#payment)| -| [Path payments](documentation/sdk_examples/path_payments.md) | Two accounts trust different custom tokens. The sender wants to send token "IOM" but the receiver wants to receive token "ECO".| [Path payment strict send](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#path-payment-strict-send) and [Path payment strict receive](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#path-payment-strict-receive)| -| [Merge accounts](documentation/sdk_examples/merge_account.md) | Merge one account into another. The first account is removed, the second receives the funds. | [Account merge](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#account-merge) | -| [Bump sequence number](documentation/sdk_examples/bump_sequence.md) | In this example we will bump the sequence number of an account to a higher number. | [Bump sequence number](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#bump-sequence) | -| [Manage data](documentation/sdk_examples/manage_data.md) | Sets, modifies, or deletes a data entry (name/value pair) that is attached to a particular account. | [Manage data](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#manage-data) | -| [Manage buy offer](documentation/sdk_examples/manage_buy_offer.md) | Creates, updates, or deletes an offer to buy one asset for another, otherwise known as a "bid" order on a traditional orderbook. | [Manage buy offer](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#manage-buy-offer) | -| [Manage sell offer](documentation/sdk_examples/manage_sell_offer.md) | Creates, updates, or deletes an offer to sell one asset for another, otherwise known as a "ask" order or “offer” on a traditional orderbook. | [Manage sell offer](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#manage-sell-offer) | -| [Create passive sell offer](documentation/sdk_examples/create_passive_sell_offer.md) | Creates, updates and deletes an offer to sell one asset for another, otherwise known as a "ask" order or “offer” on a traditional orderbook, _without taking a reverse offer of equal price_. | [Create passive sell offer](https://www.stellar.org/developers/learn/concepts/list-of-operations.html#create-passive-sell-offer) | -| [Change trust](documentation/sdk_examples/change_trust.md) | Creates, updates, and deletes a trustline. | [Change trust](https://www.stellar.org/developers/learn/concepts/list-of-operations.html#change-trust) and [Assets documentation](https://www.stellar.org/developers/learn/concepts/assets.html) | -| [Allow trust](documentation/sdk_examples/allow_trust.md) | Updates the authorized flag of an existing trustline. | [Allow trust](https://www.stellar.org/developers/learn/concepts/list-of-operations.html#allow-trust) and [Assets documentation](https://www.stellar.org/developers/learn/concepts/assets.html) | -| [Stream payments](documentation/sdk_examples/stream_payments.md) | Listens for payments received by a given account.| [Streaming](https://developers.stellar.org/api/introduction/streaming/) | -| [Fee bump transaction](documentation/sdk_examples/fee_bump.md) | Fee bump transactions allow an arbitrary account to pay the fee for a transaction.| [Fee bump transactions](https://github.com/stellar/stellar-protocol/blob/master/core/cap-0015.md)| -| [Muxed accounts](documentation/sdk_examples/muxed_account_payment.md) | In this example we will see how to use a muxed account in a payment operation.| [First-class multiplexed accounts](https://github.com/stellar/stellar-protocol/blob/master/core/cap-0027.md)| -| [SEP-0001: stellar.toml](documentation/sdk_examples/sep-0001-toml.md) | In this example you can find out how to obtain data about an organization’s Stellar integration.| [SEP-0001](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0001.md)| -| [SEP-0002: Federation](documentation/sdk_examples/sep-0002-federation.md) | This example shows how to resolve a stellar address, a stellar account id, a transaction id and a forward by using the federation protocol. | [SEP-0002](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0002.md)| -| [SEP-0005: Key derivation](documentation/sdk_examples/sep-0005-key-derivation.md) | In this examples you can see how to generate 12 or 24 words mnemonics for different languages using the Flutter SDK, how to generate key pairs from a mnemonic (with and without BIP 39 passphrase) and how to generate key pairs from a BIP 39 seed. | [SEP-0005](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0005.md)| -| [SEP-0006: Deposit and Withdrawal API](documentation/sdk_examples/sep-0006-transfer.md) | In this examples you can see how to use the sdk to communicate with anchors.| [SEP-0006](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0006.md)| -| [SEP-0007: URI Scheme to facilitate delegated signing](documentation/sdk_examples/sep-0007-urischeme.md) | In this examples you can see how to use the sdk to support SEP-0007 in your wallet.| [SEP-0007](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0007.md)| -| [SEP-0010: Stellar Web Authentication](documentation/sdk_examples/sep-0010-webauth.md) | This example shows how to authenticate with any web service which requires a Stellar account ownership verification. | [SEP-0010](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0010.md)| -| [SEP-0011: Txrep](documentation/sdk_examples/sep-0011-txrep.md) | This example shows how to to generate Txrep (human-readable low-level representation of Stellar transactions) from a transaction and how to create a transaction object from a Txrep string. | [SEP-0011](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0011.md)| -| [SEP-0012: KYC API](documentation/sdk_examples/sep-0012-kyc.md) | In this examples you can see how to use the sdk to send KYC data to anchors and other services. | [SEP-0012](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0012.md)| +| Example | Description | Documentation | +|:---------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|:-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [Create a new account](documentation/sdk_examples/create_account.md) | A new account is created by another account. In the testnet we can also use Freindbot. | [Create account](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#create-account) | +| [Send native payment](documentation/sdk_examples/send_native_payment.md) | A sender sends 100 XLM (Stellar Lumens) native payment to a receiver. | [Payments](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#payment) | +| [Create trustline](documentation/sdk_examples/trustline.md) | An trustor account trusts an issuer account for a specific custom token. The issuer account can now send tokens to the trustor account. | [Assets & Trustlines](https://www.stellar.org/developers/guides/concepts/assets.html) and [Change trust](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#change-trust) | +| [Send tokens - non native payment](documentation/sdk_examples/send_non_native_payment.md) | Two accounts trust the same issuer account and custom token. They can now send this custom tokens to each other. | [Assets & Trustlines](https://www.stellar.org/developers/guides/concepts/assets.html) and [Change trust](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#change-trust) and [Payments](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#payment) | +| [Path payments](documentation/sdk_examples/path_payments.md) | Two accounts trust different custom tokens. The sender wants to send token "IOM" but the receiver wants to receive token "ECO". | [Path payment strict send](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#path-payment-strict-send) and [Path payment strict receive](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#path-payment-strict-receive) | +| [Merge accounts](documentation/sdk_examples/merge_account.md) | Merge one account into another. The first account is removed, the second receives the funds. | [Account merge](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#account-merge) | +| [Bump sequence number](documentation/sdk_examples/bump_sequence.md) | In this example we will bump the sequence number of an account to a higher number. | [Bump sequence number](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#bump-sequence) | +| [Manage data](documentation/sdk_examples/manage_data.md) | Sets, modifies, or deletes a data entry (name/value pair) that is attached to a particular account. | [Manage data](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#manage-data) | +| [Manage buy offer](documentation/sdk_examples/manage_buy_offer.md) | Creates, updates, or deletes an offer to buy one asset for another, otherwise known as a "bid" order on a traditional orderbook. | [Manage buy offer](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#manage-buy-offer) | +| [Manage sell offer](documentation/sdk_examples/manage_sell_offer.md) | Creates, updates, or deletes an offer to sell one asset for another, otherwise known as a "ask" order or “offer” on a traditional orderbook. | [Manage sell offer](https://www.stellar.org/developers/guides/concepts/list-of-operations.html#manage-sell-offer) | +| [Create passive sell offer](documentation/sdk_examples/create_passive_sell_offer.md) | Creates, updates and deletes an offer to sell one asset for another, otherwise known as a "ask" order or “offer” on a traditional orderbook, _without taking a reverse offer of equal price_. | [Create passive sell offer](https://www.stellar.org/developers/learn/concepts/list-of-operations.html#create-passive-sell-offer) | +| [Change trust](documentation/sdk_examples/change_trust.md) | Creates, updates, and deletes a trustline. | [Change trust](https://www.stellar.org/developers/learn/concepts/list-of-operations.html#change-trust) and [Assets documentation](https://www.stellar.org/developers/learn/concepts/assets.html) | +| [Allow trust](documentation/sdk_examples/allow_trust.md) | Updates the authorized flag of an existing trustline. | [Allow trust](https://www.stellar.org/developers/learn/concepts/list-of-operations.html#allow-trust) and [Assets documentation](https://www.stellar.org/developers/learn/concepts/assets.html) | +| [Stream payments](documentation/sdk_examples/stream_payments.md) | Listens for payments received by a given account. | [Streaming](https://developers.stellar.org/api/introduction/streaming/) | +| [Fee bump transaction](documentation/sdk_examples/fee_bump.md) | Fee bump transactions allow an arbitrary account to pay the fee for a transaction. | [Fee bump transactions](https://github.com/stellar/stellar-protocol/blob/master/core/cap-0015.md) | +| [Muxed accounts](documentation/sdk_examples/muxed_account_payment.md) | In this example we will see how to use a muxed account in a payment operation. | [First-class multiplexed accounts](https://github.com/stellar/stellar-protocol/blob/master/core/cap-0027.md) | +| [SEP-0001: stellar.toml](documentation/sdk_examples/sep-0001-toml.md) | In this example you can find out how to obtain data about an organization’s Stellar integration. | [SEP-0001](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0001.md) | +| [SEP-0002: Federation](documentation/sdk_examples/sep-0002-federation.md) | This example shows how to resolve a stellar address, a stellar account id, a transaction id and a forward by using the federation protocol. | [SEP-0002](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0002.md) | +| [SEP-0005: Key derivation](documentation/sdk_examples/sep-0005-key-derivation.md) | In this examples you can see how to generate 12 or 24 words mnemonics for different languages using the Flutter SDK, how to generate key pairs from a mnemonic (with and without BIP 39 passphrase) and how to generate key pairs from a BIP 39 seed. | [SEP-0005](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0005.md) | +| [SEP-0006: Deposit and Withdrawal API](documentation/sdk_examples/sep-0006-transfer.md) | In this examples you can see how to use the sdk to communicate with anchors. | [SEP-0006](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0006.md) | +| [SEP-0007: URI Scheme to facilitate delegated signing](documentation/sdk_examples/sep-0007-urischeme.md) | In this examples you can see how to use the sdk to support SEP-0007 in your wallet. | [SEP-0007](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0007.md) | +| [SEP-0010: Stellar Web Authentication](documentation/sdk_examples/sep-0010-webauth.md) | This example shows how to authenticate with any web service which requires a Stellar account ownership verification. | [SEP-0010](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0010.md) | +| [SEP-0011: Txrep](documentation/sdk_examples/sep-0011-txrep.md) | This example shows how to to generate Txrep (human-readable low-level representation of Stellar transactions) from a transaction and how to create a transaction object from a Txrep string. | [SEP-0011](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0011.md) | +| [SEP-0012: KYC API](documentation/sdk_examples/sep-0012-kyc.md) | In this examples you can see how to use the sdk to send KYC data to anchors and other services. | [SEP-0012](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0012.md) | +| [SEP-0024: Hosted Deposit and Withdrawal](documentation/sdk_examples/sep-0024.md) | In this examples you can see how to interact with anchors in a standard way defined by SEP-0024 | [SEP-0024](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0024.md) | Additional examples can be found in the [tests](https://github.com/Soneso/stellar_flutter_sdk/blob/master/test/). @@ -316,7 +317,8 @@ You can find additional documentation including the API documentation in the [do - [SEP-0007: URI Scheme to facilitate delegated signing](documentation/sdk_examples/sep-0007-urischeme.md) - [SEP-0010 (Stellar Web Authentication)](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0010.md) - [SEP-0011 (Txrep)](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0011.md) -- [SEP-0012: KYC API](documentation/sdk_examples/sep-0012-kyc.md) +- [SEP-0012: KYC API](documentation/sdk_examples/sep-0012-kyc.md) +- [SEP-0024: Hosted Deposit and Withdrawal](documentation/sdk_examples/sep-0024.md) ## Soroban support diff --git a/documentation/sdk_api_doc.zip b/documentation/sdk_api_doc.zip index c4435c7..bbdc967 100644 Binary files a/documentation/sdk_api_doc.zip and b/documentation/sdk_api_doc.zip differ diff --git a/documentation/sdk_examples/sep-0024.md b/documentation/sdk_examples/sep-0024.md new file mode 100644 index 0000000..7e6a5aa --- /dev/null +++ b/documentation/sdk_examples/sep-0024.md @@ -0,0 +1,176 @@ + +# SEP-0024 - TransferServerSEP24Service + +Helps clients to interact with anchors in a standard way defined by [SEP-0024: Hosted Deposit and Withdrawal](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0024.md). + + + +## Create a TransferServerSEP24Service instance + +**By providing the domain hosting the stellar.toml file** + +```dart +final transferService = await TransferServerSEP24Service.fromDomain("place.domain.com"); +``` + +This will automatically load and parse the stellar.toml file. It will then create the TransferServerSEP24Service instance by using the transfer server url provided in the stellar.toml file. + +**Or by providing the service url** + +Alternatively one can create a TransferServerSEP24Service instance by providing the transfer server url directly via the constructor: + +```dart +final transferService = TransferServerSEP24Service("http://api.stellar-anchor.org/transfer"); +``` + +## Get Anchor Information + +First, let's get the information about the anchor's support for [SEP-24](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0024.md). This request doesn't require authentication, and will return generic info, such as supported currencies, and features supported by the anchor. You can get a full list of returned fields in the [SEP-24 specification](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0024.md#info). + +```dart +SEP24InfoResponse infoResponse = await transferService.info(); +``` + +## Fee + +If there is a fee and the fee schedule is not complex, the info response already contains the fee data for a given asset. + +```dart +double? feeFixed = infoResponse.depositAssets?["USDC"]?.feeFixed; +double? feePercent = infoResponse.depositAssets?["USDC"]?.feePercent; +double? feeMinimum = infoResponse.depositAssets?["USDC"]?.feeMinimum; +print("USDC fixed fee for deposit: $feeFixed"); +print("USDC percentage fee for deposit: $feePercent"); +print("USDC minimum fee for deposit: $feeMinimum"); +``` + +Otherwise, one can check if the fee endpoint of the anchor is enabled and if so, request the fee from there. + +```dart +bool feeEndpointEnabled = infoResponse.feeEndpointInfo?.enabled == true; +if (feeEndpointEnabled) { + SEP24FeeRequest feeRequest = SEP24FeeRequest(); + feeRequest.operation = "deposit"; + feeRequest.type = "SEPA"; + feeRequest.assetCode = "USD"; + feeRequest.amount = 2034.09; + feeRequest.jwt = jwtToken; + + SEP24FeeResponse feeResponse = await transferService.fee(feeRequest); + double? fee = feeResponse.fee; + print("fee : $fee"); +} +``` + +## Interactive Flows + +Before getting started, make sure you have connected to the anchor and received an authentication token, by using the SDKs [WebAuthService](https://github.com/Soneso/stellar_flutter_sdk/blob/master/documentation/sdk_examples/sep-0010-webauth.md). +We will use the jwt token in the examples below as the SEP-10 authentication token, obtained earlier. + +### Deposit +To initiate an operation, we need to know the asset code. + +```dart +SEP24DepositRequest request = new SEP24DepositRequest(); +request.assetCode = "USDC"; +request.jwt = jwtToken; + +SEP24InteractiveResponse response = await transferService.deposit(request); +``` + +As a result, you will get an interactive response from the anchor. +Open the received URL in an iframe and deposit the transaction ID for future reference: + +```dart +String url = response.url; +String id = response.id; +``` + +### Withdraw + +Similarly to the deposit flow, a basic withdrawal flow has the same method signature and response type: + +```dart +SEP24WithdrawRequest request = new SEP24WithdrawRequest(); +request.assetCode = "USDC"; +request.type = "bank_account"; +request.jwt = jwtToken; + +SEP24InteractiveResponse response = await transferService.withdraw(request); +``` + +As a result, you will get an interactive response from the anchor. +Open the received URL in an iframe and deposit the transaction ID for future reference: + +```dart +String url = response.url; +String id = response.id; +``` + +### Providing KYC Info +To improve the user experience, the SEP-24 standard supports passing user KYC to the anchor via [SEP-9](https://github.com/stellar/stellar-protocol/blob/master/ecosystem/sep-0009.md). +In turn, the anchor will pre-fill this information in the interactive popup. + +```dart +SEP24DepositRequest request = new SEP24DepositRequest(); +request.assetCode = "USDC"; +request.jwt = jwtToken; + +StandardKYCFields kycFields = StandardKYCFields(); +kycFields.naturalPersonKYCFields = NaturalPersonKYCFields(); +kycFields.naturalPersonKYCFields!.emailAddress = "mail@example.com"; +kycFields.naturalPersonKYCFields!.photoIdFront = await Util.readFile(path); + +request.kycFields = kycFields; + +SEP24InteractiveResponse response = await transferService.deposit(request); +``` + +### Changing Stellar Transfer Account + +By default, the Stellar transfer will be sent to the authenticated account (with a memo) that initiated the deposit. + +While in most cases it's acceptable, some wallets may split their accounts. To do so, pass additional account (and optionally a memo): + +```dart +SEP24DepositRequest request = new SEP24DepositRequest(); +request.assetCode = "USDC"; +request.account = "G..."; +request.memo = "my memo"; +request.memoType = "text"; +request.jwt = jwtToken; + + +SEP24InteractiveResponse response = await transferService.deposit(request); +``` +Similarly, for a withdrawal, the origin account of the Stellar transaction could be changed. + + +## Getting Transaction Info + +On the typical flow, the wallet would get transaction data to notify users about status updates. This is done via the SEP-24 GET /transaction and GET /transactions endpoint. + +```dart +SEP24TransactionsRequest request = SEP24TransactionsRequest(); +request.assetCode = "ETH"; +request.jwt = jwtToken; + +SEP24TransactionsResponse response = await transferService.transactions(request); +List transactions = response.transactions; +``` + +Single Transaction: + +```dart +SEP24TransactionRequest request = SEP24TransactionRequest(); +request.stellarTransactionId = "17a670bc424ff5ce3b386dbfaae9990b66a2a37b4fbe51547e8794962a3f9e6a"; +request.jwt = jwtToken; + +SEP24TransactionResponse response = await transferService.transaction(request); +SEP24Transaction transaction = response.transaction; +``` + +### Further readings + +For more info, see also the class documentation of [TransferServerSEP24Service](https://github.com/Soneso/stellar_flutter_sdk/blob/master/lib/src/sep/0024/sep24_service.dart) and the SDK's [SEP-24 test cases](https://github.com/Soneso/stellar_flutter_sdk/blob/master/test/sep0024_test.dart). + diff --git a/lib/src/stellar_sdk.dart b/lib/src/stellar_sdk.dart index a5b5db5..62d46eb 100644 --- a/lib/src/stellar_sdk.dart +++ b/lib/src/stellar_sdk.dart @@ -31,7 +31,7 @@ import 'requests/liquidity_pools_request_builder.dart'; /// Main class of the flutter stellar sdk. class StellarSDK { - static const versionNumber = "1.5.7"; + static const versionNumber = "1.5.8"; static final StellarSDK PUBLIC = StellarSDK("https://horizon.stellar.org"); static final StellarSDK TESTNET = StellarSDK("https://horizon-testnet.stellar.org"); diff --git a/pubspec.yaml b/pubspec.yaml index 97c9959..a69edd5 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -1,6 +1,6 @@ name: stellar_flutter_sdk description: A stellar blockchain sdk that query's horizon, build, signs and submits transactions to the stellar network. -version: 1.5.7 +version: 1.5.8 homepage: https://github.com/Soneso/stellar_flutter_sdk environment: