PHP SDK / Client Library to interact with the XRP Ledger. It offers all the functionality available in the JavaScript and Java Versions emphasizing robustness and code readability for those interested in looking under the hood and getting into the nitty-gritty of XRPL development.
- Managing keys & creating test credentials
- Submitting transactions to the XRP Ledger
- Sending requests to observe the ledger
- Creating and signing transactions (e.g. Payments) to modify the ledger state
- Parsing ledger data into more convenient formats
This library is installable via Composer:
composer require hardcastle/xrpl_php
This library requires PHP 8.1 or later as well as the PHP extension GMP.
These examples reproduce the functionality from the JavaScript quickstart examples:
php 1.get-accounts-send-xrp.php
php 2.create-trustline-send-currency.php
php 3.mint-nfts.php
These examples show how to use key features:
php examples/client.php
php examples/fundWallet.php
php examples/payment.php
php examples/token-create.php // IOU + Token + CBDC - Wallet Matrix with Trustlines
etc...
These examples can be used to explore XRPL core functionality:
php examples/internal/address-codec.php
php examples/internal/binary-codec.php
etc...
- In the project directory, start the project and open a shell:
docker-compose up -d
docker-compose exec -u 0 php bash
- In the container shell, install the composer dependencies:
composer install
You can run the tests with the following command:
./vendor/bin/phpunit tests
You can perform static code analysis with psalm with the following command:
./vendor/bin/psalm --config=psalm.xml
Issuing an Account Info request:
require __DIR__.'/../vendor/autoload.php';
use Hardcastle\XRPL_PHP\Client\JsonRpcClient;
use Hardcastle\XRPL_PHP\Models\Account\AccountObjectsRequest;
// Those will be purged from the Testnet in regular intervals, you can use fundWallet()
// to generate prefunded Wallets on the Testnet
$testnetAccountAddress = 'raKXrkYfbh4Uzqc481jTXbaKsWnW5XRMjp';
$client = new JsonRpcClient("https://s.altnet.rippletest.net:51234");
$request = new AccountObjectsRequest(
account: $testnetAccountAddress,
ledgerIndex: 'validated',
deletionBlockersOnly: true
);
// Using synchronous request
$response = $client->syncRequest($request);
$json = json_decode($response->getBody());
print_r($json);
// Using asynchronous request
// $response = $client->request($request)->wait();
// $json = json_decode($response->getBody());
// print_r($json);
// Use your own credentials here:
$testnetStandbyAccountSeed = 'sEdTcvQ9k4UUEHD9y947QiXEs93Fp2k';
$testnetStandbyAccountAddress = 'raJNboPDvjLrYZropPFrxvz2Qm7A9guEVd';
$standbyWallet = Wallet::fromSeed($testnetStandbyAccountSeed);
// Use your own credentials here:
$testnetOperationalAccountSeed = 'sEdVHf8rNEaRveJw4NdVKxm3iYWFuRb';
$testnetOperationalAccountAddress = 'rEQ3ik2kmAvajqpFweKgDghJFZQGpXxuRN';
$operationalWallet = Wallet::fromSeed($testnetStandbyAccountSeed);
$client = new JsonRpcClient("https://s.altnet.rippletest.net:51234");
$tx = [
"TransactionType" => "Payment",
"Account" => $testnetStandbyAccountAddress,
"Amount" => xrpToDrops("100"),
"Destination" => $testnetOperationalAccountAddress
];
$autofilledTx = $client->autofill($tx);
$signedTx = $standbyWallet->sign($autofilledTx);
$txResponse = $client->submitAndWait($signedTx['tx_blob']);
$result = $txResponse->getResult();
if ($result['meta']['TransactionResult'] === 'tecUNFUNDED_PAYMENT') {
print_r("Error: The sending account is unfunded! TxHash: {$result['hash']}" . PHP_EOL);
} else {
print_r("Token payment done! TxHash: {$result['hash']}" . PHP_EOL);
}