Skip to main content

No project description provided

Project description

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.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

xpring-0.5.2.tar.gz (74.0 kB view details)

Uploaded Source

Built Distribution

xpring-0.5.2-py3-none-any.whl (91.4 kB view details)

Uploaded Python 3

File details

Details for the file xpring-0.5.2.tar.gz.

File metadata

  • Download URL: xpring-0.5.2.tar.gz
  • Upload date:
  • Size: 74.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.10 CPython/3.8.8+ Linux/5.8.0-53-generic

File hashes

Hashes for xpring-0.5.2.tar.gz
Algorithm Hash digest
SHA256 607ac17073a3ec3a03b03c6449e9d852f416df715415f564949a7b354fafd00e
MD5 cbd6fd35f6e6b4aff0f4cc21484db4af
BLAKE2b-256 07776066b60e887f667bf720a5b4ee4d3af9778e25cfd98f5351e4aaba593ff8

See more details on using hashes here.

File details

Details for the file xpring-0.5.2-py3-none-any.whl.

File metadata

  • Download URL: xpring-0.5.2-py3-none-any.whl
  • Upload date:
  • Size: 91.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.0.10 CPython/3.8.8+ Linux/5.8.0-53-generic

File hashes

Hashes for xpring-0.5.2-py3-none-any.whl
Algorithm Hash digest
SHA256 bf5fc72c0cc0bfb5a66d7f2f569c058735193dbd85b1c6c2351fb3d816e45713
MD5 9a05ef939597b5989d3543ad06665f60
BLAKE2b-256 7b3fc946420841450ca8525e1b591f8479f2e621a47951181e31ec488583663c

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page