xpring
The Xpring SDK for Python.
Install
pip install xpring[py]
API
Wallet
Construct
You can construct a Wallet from its seed. If you do not have your own wallet yet, you can generate one with some free XRP on the testnet.
import xpring
seed = 'sEdSKaCy2JT7JaM7v95H9SxkhP9wS2r'
wallet = xpring.Wallet.from_seed(seed)
print(wallet.private_key.hex())
# b4c4e046826bd26190d09715fc31f4e6a728204eadd112905b08b14b7f15c4f3
print(wallet.public_key.hex())
# ed01fa53fa5a7e77798f882ece20b1abc00bb358a9e55a202d0d0676bd0ce37a63
print(wallet.account_id.hex())
# d28b177e48d9a8d057e70f7e464b498367281b98
print(wallet.address)
# rLUEXYuLiQptky37CqLcm9USQpPiz5rkpD
Sign / Verify
A Wallet can sign and verify arbitrary bytes, but you’ll generally want to leave these low-level responsibilities to the Client.
message = bytes.fromhex('DEADBEEF')
signature = wallet.sign(message)
wallet.verify(message, signature)
# True
Client
Client is the gateway to the XRP Ledger. It is constructed with the URL of the gRPC service of a rippled server. If you are running the server yourself, you need to configure the [port_grpc] stanza in your configuration file. In the example configuration file, it is commented out.
# url = 'main.xrp.xpring.io:50051' # Mainnet
url = 'test.xrp.xpring.io:50051' # Testnet
client = xpring.Client.from_url(url)
Account
>>> client.get_account(wallet.address)
account_data {
account {
value {
address: "rDuKotkyx18D5WqWCA4mVhRWK2YLqDFKaY"
}
}
balance {
value {
xrp_amount {
drops: 999999820
}
}
}
sequence: {
value: 10
}
flags {
}
owner_count {
}
previous_transaction_id {
value: b"..."
}
previous_transaction_ledger_sequence {
value: 4845872
}
}
ledger_index: 4869818
Fee
>>> client.get_fee()
current_ledger_size: 6
fee {
base_fee {
drops: 10
}
median_fee {
drops: 5000
}
minimum_fee {
drops: 10
}
open_ledger_fee {
drops: 10
}
}
expected_ledger_size: 25
ledger_current_index: 4869844
levels {
median_level: 128000
minimum_level: 256
open_ledger_level: 256
reference_level: 256
}
max_queue_size: 2000
Submit
>>> unsigned_transaction = {
... 'Account': 'rDuKotkyx18D5WqWCA4mVhRWK2YLqDFKaY',
... 'Amount': '10',
... 'Destination': 'rNJDvXkaBRwJYdeEcx9pchE2SecMkH3FLz',
... 'Fee': '10',
... 'Flags': 0x80000000,
... 'Sequence': 9,
... 'TransactionType': 'Payment'
... }
>>> signed_transaction = wallet.sign_transaction(unsigned_transaction)
>>> client.submit(signed_transaction)
engine_result {
result_type: RESULT_TYPE_TES
result: "tesSUCCESS"
}
engine_result_message: "The transaction was applied. Only final in a validated ledger."
hash: b"..."
>>> client.submit(signed_transaction)
engine_result {
result_type: RESULT_TYPE_TEF
result: "tefPAST_SEQ"
}
engine_result_code: -190
engine_result_message: "This sequence number has already passed."
hash: b"..."
Transaction
>>> txid = bytes.fromhex(signed_transaction['hash'])
>>> client.get_transaction(txid)
transaction {
account {
value {
address: "rDuKotkyx18D5WqWCA4mVhRWK2YLqDFKaY"
}
}
fee {
drops: 10
}
sequence {
value: 10
}
payment {
amount {
value {
xrp_amount {
drops: 10
}
}
}
destination {
value {
address: "rNJDvXkaBRwJYdeEcx9pchE2SecMkH3FLz"
}
}
}
signing_public_key {
value: b"..."
}
transaction_signature {
value: b"..."
}
flags {
value: 2147483648
}
}
ledger_index: 5124377
hash: b"..."
validated: true
meta {
transaction_index: 1
transaction_result {
result_type: RESULT_TYPE_TES
result: "tesSUCCESS"
}
affected_nodes {
ledger_entry_type: LEDGER_ENTRY_TYPE_ACCOUNT_ROOT
ledger_index: b"..."
modified_node {
final_fields {
account_root {
account {
value {
address: "rNJDvXkaBRwJYdeEcx9pchE2SecMkH3FLz"
}
}
balance {
value {
xrp_amount {
drops: 1000000100
}
}
}
sequence {
value: 1
}
flags {
}
owner_count {
}
}
}
previous_fields {
account_root {
balance {
value {
xrp_amount {
drops: 1000000090
}
}
}
}
}
previous_transaction_id {
value: b"..."
}
previous_transaction_ledger_sequence {
value: 4845872
}
}
}
affected_nodes {
ledger_entry_type: LEDGER_ENTRY_TYPE_ACCOUNT_ROOT
ledger_index: b"..."
modified_node {
final_fields {
account_root {
account {
value {
address: "rDuKotkyx18D5WqWCA4mVhRWK2YLqDFKaY"
}
}
balance {
value {
xrp_amount {
drops: 999999800
}
}
}
sequence {
value: 11
}
flags {
}
owner_count {
}
}
}
previous_fields {
account_root {
balance {
value {
xrp_amount {
drops: 999999820
}
}
}
sequence {
value: 10
}
}
}
previous_transaction_id {
value: b"..."
}
previous_transaction_ledger_sequence {
value: 4845872
}
}
}
delivered_amount {
value {
xrp_amount {
drops: 10
}
}
}
}
date {
value: 636581642
}
Metadata
Release files for xpring 0.6.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| xpring-0.6.3.tar.gz | 90.0 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| xpring-0.6.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 204.9 kB
Release files / xpring-0.6.3.tar.gz
| Download URL | xpring-0.6.3.tar.gz |
|---|---|
| Size | 90.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9ded407c7638f21199c5c0003a82b0789d28919ddf21ee5838bca2aba561cd8b
|
|
BLAKE2b-256 checksum How to use checksums |
1021f2a6c178f1cb282fe592e4f2893082a75d3e0c07a83ba7f5eb435dfc9407
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.1.13 CPython/3.9.6+ Linux/5.13.0-30-generic
|
Release files / xpring-0.6.3-py3-none-any.whl
| Download URL | xpring-0.6.3-py3-none-any.whl |
|---|---|
| Size | 114.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
31a525d4701b250105a5c4f61d9942057c20ec1d586dcc8b4be6ccdcf1b4753b
|
|
BLAKE2b-256 checksum How to use checksums |
d007e4811c05b655c4fd246873f2734d4bc97a76148674a9ad01a5a10f6e6483
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/1.1.13 CPython/3.9.6+ Linux/5.13.0-30-generic
|
Security for xpring 0.6.3
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.