Skip to main content

The Xpring SDK for Python.

Build status: Linux and OSX Build status: Windows Documentation status Latest PyPI version Python versions supported

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
}

Develop

Dependencies

The protocol buffers and definitions file are in submodules:

git submodule update --init

Use Poetry to install dependencies, build the protocol buffers, and copy the definitions file:

poetry install --extras py
poetry run invoke prebuild

Tasks

There are several Invoke tasks:

poetry run invoke ${task}
  • test: Pytest with coverage and doctests.

  • lint: Mypy, Pylint, and Pydocstyle.

  • serve: Serve the docs locally and rebuild them on file changes.

Metadata

Release files for xpring 0.5.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for xpring 0.5.0
File Size Uploaded
xpring-0.5.0.tar.gz 74.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for xpring 0.5.0
File Interpreter ABI Platform
xpring-0.5.0-py3-none-any.whl Python 3 none any Details

Total release size: 165.8 kB

Release files / xpring-0.5.0.tar.gz

Download URL xpring-0.5.0.tar.gz
Size 74.1 kB
Tags Source
SHA-256 checksum
How to use checksums
676b17e310e54a7fe665c2dbb27f3372a4c637f5653d47cdcb1fbdbc2220a168
BLAKE2b-256 checksum
How to use checksums
65827b9112d4aba4464c1dcd8b378eaf94259176b7295c810df25436d617c293
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.0.3 CPython/3.7.5 Linux/5.3.0-46-generic

Release files / xpring-0.5.0-py3-none-any.whl

Download URL xpring-0.5.0-py3-none-any.whl
Size 91.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2c06c1a32459562e89050b00a5386660ce2b449356d4cb6532b694f2021d0b19
BLAKE2b-256 checksum
How to use checksums
3c89232a399e58d7805262fae885b6e3388a84b0477d610610dac8d1240ee232
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.0.3 CPython/3.7.5 Linux/5.3.0-46-generic

Release history Release notifications | RSS feed

0.6.3

2 release files

0.6.2

2 release files

0.6.1

2 release files

0.6.0

2 release files

0.5.2

2 release files

0.5.1

2 release files

This release

0.5.0 This release

2 release files

0.4.3

2 release files

0.4.2

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page