XRPKit
XRPKit is a Swift SDK built for interacting with the XRP Ledger. XRPKit supports offline wallet creation, offline transaction creation/signing, and submitting transactions to the XRP ledger. XRPKit supports both the secp256k1 and ed25519 algorithms. XRPKit is available on iOS, macOS and Linux. WIP – use at your own risk.
Author
MitchLang009, [email protected]
License
XRPKit is available under the MIT license. See the LICENSE file for more info.
Installation
CocoaPods
XRPKit is available through CocoaPods. To install
it, simply add the following line to your Podfile:
pod 'XRPKit'
Swift Package Manager
You can use The Swift Package Manager to
install XRPKit
by adding it to your Package.swift
file:
// swift-tools-version:5.1
import PackageDescription
let package = Package(
name: "YOUR_PROJECT_NAME",
dependencies: [
.package(url: "https://github.com/MitchLang009/XRPKit.git", from: "0.3.0"),
]
)
Linux Compatibility
One of the goals of this library is to provide cross-platform support for Linux and support server-side
Swift, however some features may only be available in iOS/macOS due to a lack of Linux supported
libraries (ex. WebSockets). A test_linux.sh file is included that will run tests in a docker container. All
contributions must compile on Linux.
Wallets
Create a new wallet
import XRPKit
// create a completely new, randomly generated wallet
let wallet = XRPSeedWallet() // defaults to secp256k1
let wallet2 = XRPSeedWallet(type: .secp256k1)
let wallet3 = XRPSeedWallet(type: .ed25519)
Derive wallet from a seed
import XRPKit
// generate a wallet from an existing seed
let wallet = try! XRPSeedWallet(seed: "snsTnz4Wj8vFnWirNbp7tnhZyCqx9")
Derive wallet from a mnemonic (BIP32/39/44)
import XRPKit
let mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
let walletFromMnemonic = try! XRPMnemonicWallet(mnemonic: mnemonic)
Wallet properties
import XRPKit
let wallet = XRPSeedWallet()
print(wallet.address) // rJk1prBA4hzuK21VDK2vK2ep2PKGuFGnUD
print(wallet.seed) // snsTnz4Wj8vFnWirNbp7tnhZyCqx9
print(wallet.publicKey) // 02514FA7EF3E9F49C5D4C487330CC8882C0B4381BEC7AC61F1C1A81D5A62F1D3CF
print(wallet.privateKey) // 003FC03417669696AB4A406B494E6426092FD9A42C153E169A2B469316EA4E96B7
Validation
import XRPKit
// Address
let btc = "1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2"
let xrp = "rPdCDje24q4EckPNMQ2fmUAMDoGCCu3eGK"
XRPSeedWallet.validate(address: btc) // returns false
XRPSeedWallet.validate(address: xrp) // returns true
// Seed
let seed = "shrKftFK3ZkMPkq4xe5wGB8HaNSLf"
XRPSeedWallet.validate(seed: xrp) // returns false
XRPSeedWallet.validate(seed: seed) // returns true
Transactions
Sending XRP
import XRPKit
let wallet = try! XRPSeedWallet(seed: "shrKftFK3ZkMPkq4xe5wGB8HaNSLf")
let amount = try! XRPAmount(drops: 100000000)
let address = try! XRPAddress(rAddress: "rPdCDje24q4EckPNMQ2fmUAMDoGCCu3eGK")
_ = XRPPayment(from: wallet, to: address, amount: amount).send().map { (result) in
print(result)
}
Sending XRP with custom fields
import XRPKit
let wallet = try! XRPSeedWallet(seed: "shrKftFK3ZkMPkq4xe5wGB8HaNSLf")
let fields: [String:Any] = [
"TransactionType" : "Payment",
"Account" : wallet.address,
"Destination" : "rPdCDje24q4EckPNMQ2fmUAMDoGCCu3eGK",
"Amount" : "10000000",
"Flags" : 2147483648,
"LastLedgerSequence" : 951547,
"Fee" : "40",
"Sequence" : 11,
]
// create the transaction (offline)
let transaction = XRPRawTransaction(fields: fields)
// sign the transaction (offline)
let signedTransaction = try! transaction.sign(wallet: wallet)
// submit the transaction (online)
_ = signedTransaction.submit().map { (result) in
print(result)
}
Sending XRP with autofilled fields
import XRPKit
let wallet = try! XRPSeedWallet(seed: "shrKftFK3ZkMPkq4xe5wGB8HaNSLf")
// dictionary containing partial transaction fields
let partialFields: [String:Any] = [
"TransactionType" : "Payment",
"Destination" : "rPdCDje24q4EckPNMQ2fmUAMDoGCCu3eGK",
"Amount" : "100000000",
"Flags" : 2147483648,
]
// create the transaction from dictionary
let partialTransaction = XRPTransaction(wallet: wallet, fields: partialFields)
// autofills missing transaction fields (online)
// signs transaction (offline)
// submits transaction (online)
_ = partialTransaction.send().map { (txResult) in
print(txResult)
}
Transaction Result
// SUCCESS: {
// result = {
// "engine_result" = tesSUCCESS;
// "engine_result_code" = 0;
// "engine_result_message" = "The transaction was applied. Only final in a validated ledger.";
// status = success;
// "tx_blob" = 12000022800000002400000008201B000E83A6614000000005F5E100684000000000000028732102890EDF51199AEB1815324BA985C192D369B324AF6ABC1EBAD450E07EFBF5997E7446304402203765F06FB1D1D9FE942680A39C0925E95DC0AE18893268FDB5AF3CAFC5F6A87802201EFCE19E9C7ABBDD7C73F651A9AF6A323DDB4CE060A4CB63866512365830BEED81142B2DFB7FF7A2E9D8022144727A06141E4B3907248314F841A55DBAB1296D9A95F4CA8C05B721C1B0585C;
// "tx_json" = {
// Account = rhAK9w7X64AaZqSWEhajcq5vhGtxEcaUS7;
// Amount = 100000000;
// Destination = rPdCDje24q4EckPNMQ2fmUAMDoGCCu3eGK;
// Fee = 40;
// Flags = 2147483648;
// LastLedgerSequence = 951206;
// Sequence = 8;
// SigningPubKey = 02890EDF51199AEB1815324BA985C192D369B324AF6ABC1EBAD450E07EFBF5997E;
// TransactionType = Payment;
// TxnSignature = 304402203765F06FB1D1D9FE942680A39C0925E95DC0AE18893268FDB5AF3CAFC5F6A87802201EFCE19E9C7ABBDD7C73F651A9AF6A323DDB4CE060A4CB63866512365830BEED;
// hash = 4B709C7DFA8F8F396E4BB2CEACAFD61CA07000940736971AA788754267EE69AD;
// };
// };
// }
Ledger Info
Check balance
import XRPKit
_ = XRPLedger.getBalance(address: "rPdCDje24q4EckPNMQ2fmUAMDoGCCu3eGK").map { (amount) in
print(amount.prettyPrinted()) // 1,800.000000
}
WebSocket Support
WebSockets are only supported on Apple platforms through URLSessionWebSocketTask. On Linux XRPLedger.ws is unavailable. Support for Linux
will be possible with the availability of a WebSocket client library.
More functionality to come.
Example Command
import XRPKit
XRPLedger.ws.delegate = self // XRPWebSocketDelegate
XRPLedger.ws.connect(url: .xrpl_ws_Devnet)
let parameters: [String: Any] = [
"id" : "test",
"method" : "fee"
]
let data = try! JSONSerialization.data(withJSONObject: parameters, options: [])
XRPLedger.ws.send(data: data)
Transaction Stream Request
import XRPKit
XRPLedger.ws.delegate = self // XRPWebSocketDelegate
XRPLedger.ws.connect(url: .xrpl_ws_Devnet)
XRPLedger.ws.subscribe(account: "r34XnDB2zS11NZ1wKJzpU1mjWExGVugTaQ")
Responses/Streams and XRPWebSocketDelegate
import XRPKit
class MyClass: XRPWebSocketDelegate {
func onConnected(connection: XRPWebSocket) {
}
func onDisconnected(connection: XRPWebSocket, error: Error?) {
}
func onError(connection: XRPWebSocket, error: Error) {
}
func onResponse(connection: XRPWebSocket, response: XRPWebSocketResponse) {
}
func onStream(connection: XRPWebSocket, object: NSDictionary) {
}
}