The Soneso open source Stellar SDK for PHP will provide APIs to build and sign transactions, connect and query Horizon.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Christian Rogobete 0cb255dc74 work on sep-006 support 2 days ago
Soneso work on sep-006 support 2 days ago
examples add sep-012 examples 3 days ago
.buildpath base 1 month ago
.gitignore base 1 month ago
.project base 1 month ago
LICENSE Initial commit 5 months ago
README.md prepare for release 3 days ago
composer.json add sep-0001 support 1 week ago
composer.lock sep-012 support & headers bugfixes 3 days ago
composer.phar base 1 month ago

README.md

Stellar SDK for PHP

PHP alpha0.4.0

The Soneso open source Stellar SDK for PHP will provide APIs to build and sign transactions, connect and query Horizon.

The SDK is currently in development. The core functionality is already implemented and can be used. Please be careful with it, it is an alpha version.

Development Roadmap

Okt 2021 – March 2022

Implementation of the Core Functionalty including SEP-029

April – August 2022

Implementation of SEP-001, SEP-002, SEP-023, SEP-005, SEP-010, SEP-007, SEP-009, SEP-006, SEP-012, SEP-011

Sept 2022 – Dec 2022

Maintenance and continuous improvement of the sdk

Installation


## Quick Start

### 1. Create a Stellar key pair

#### Random generation
```php
// create a completely new and unique pair of keys.
$keyPair = KeyPair::random();

print($keyPair->getAccountId());
// GCFXHS4GXL6BVUCXBWXGTITROWLVYXQKQLF4YH5O5JT3YZXCYPAFBJZB

print($keyPair->getSecretSeed());
// SAV76USXIJOBMEQXPANUOQM6F5LIOTLPDIDVRJBFFE2MDJXG24TAPUU7

2. Create an account

After the key pair generation, you have already got the address, but it is not activated until someone transfers at least 1 lumen into it.

2.1 Testnet

If you want to play in the Stellar test network, the SDK can ask Friendbot to create an account for you as shown below:

$funded = FriendBot::fundTestAccount($keyPair->getAccountId());
print ($funded ? "account funded" : "account not funded");

2.2 Public net

On the other hand, if you would like to create an account in the public net, you should buy some Stellar Lumens (XLM) from an exchange. When you withdraw the Lumens into your new account, the exchange will automatically create the account for you. However, if you want to create an account from another account of your own, you may run the following code:

/// Init sdk for public net
$sdk = StellarSDK::getPublicNetInstance();
 
/// Create a key pair for your existing account.
$keyA = KeyPair::fromSeed("SAPS66IJDXUSFDSDKIHR4LN6YPXIGCM5FBZ7GE66FDKFJRYJGFW7ZHYF");

/// Load the data of your account from the stellar network.
$accA = $sdk->requestAccount($keyA->getAccountId());

/// Create a keypair for a new account.
$keyB = KeyPair::random();

/// Create the operation builder.
$createAccBuilder = new CreateAccountOperationBuilder($keyB->getAccountId(), "3"); // send 3 XLM (lumen)

// Create the transaction.
$transaction = (new TransactionBuilder($accA))
    ->addOperation($createAccBuilder->build())
    ->build();

/// Sign the transaction with the key pair of your existing account.
$transaction->sign($keyA, Network::public());

/// Submit the transaction to the stellar network.
$response = $sdk->submitTransaction($transaction);

if ($response->isSuccessful()) {
    printf (PHP_EOL."account %s created", $keyB->getAccountId());
}

3. Check account

3.1 Basic info

After creating the account, we may check the basic information of the account.

$accountId = "GCQHNQR2VM5OPXSTWZSF7ISDLE5XZRF73LNU6EOZXFQG2IJFU4WB7VFY";

// Request the account data.
$account = $sdk->requestAccount($accountId);

// You can check the `balance`, `sequence`, `flags`, `signers`, `data` etc.
foreach ($account->getBalances() as $balance) {
    switch ($balance->getAssetType()) {
        case Asset::TYPE_NATIVE:
            printf (PHP_EOL."Balance: %s XLM", $balance->getBalance() );
            break;
        default:
            printf(PHP_EOL."Balance: %s %s Issuer: %s",
                $balance->getBalance(), $balance->getAssetCode(),
                $balance->getAssetIssuer());
    }
}

print(PHP_EOL."Sequence number: ".$account->getSequenceNumber());

foreach ($account->getSigners() as $signer) {
    print(PHP_EOL."Signer public key: ".$signer->getKey());
}

3.2 Check payments

You can check the payments connected to an account:

$accountId = $account->getAccountId();

$operationsPage = $sdk->payments()->forAccount($accountId)->order("desc")->execute();

foreach ($operationsPage->getOperations() as $payment) {
    if ($payment->isTransactionSuccessful()) {
        print(PHP_EOL."Transaction hash: ".$payment->getTransactionHash());
    }
}

You can use:limit, order, and cursor to customize the query. Get the most recent payments for accounts, ledgers and transactions.

Horizon has SSE support for push data. You can use it like this:

$accountId = "GCDBA6GFGEHAMVAMRL6R2733EXUENJ35EMYNA2LE7WWJPVANORVC4UNA";

$sdk->payments()->forAccount($accountId)->cursor("now")->stream(function(OperationResponse $response) {
    if ($response instanceof PaymentOperationResponse) {
        switch ($response->getAsset()->getType()) {
            case Asset::TYPE_NATIVE:
                printf("Payment of %s XLM from %s received.", $response->getAmount(), $response->getSourceAccount());
                break;
            default:
                printf("Payment of %s %s from %s received.", $response->getAmount(),  $response->getAsset()->getCode(), $response->getSourceAccount());
        }
        if (floatval($response->getAmount()) > 0.5) {
            exit;
        }
    }
});

see also stream payments example

3.3 Check others

Just like payments, you can check assets, transactions, effects, offers, operations, ledgers etc.

$sdk->assets()
$sdk->transactions()
$sdk->effects()
$sdk->offers()
$sdk->operations()
$sdk->orderBook()
$sdk->trades()
// add so on ...

4. Building and submitting transactions

Example “send native payment”:

$senderKeyPair = KeyPair::fromSeed("SA52PD5FN425CUONRMMX2CY5HB6I473A5OYNIVU67INROUZ6W4SPHXZB");
$destination = "GCRFFUKMUWWBRIA6ABRDFL5NKO6CKDB2IOX7MOS2TRLXNXQD255Z2MYG";

// Load sender account data from the stellar network.
$sender = $sdk->requestAccount($senderKeyPair->getAccountId());

// Build the transaction to send 100 XLM native payment from sender to destination
$paymentOperation = (new PaymentOperationBuilder($destination,Asset::native(), "100"))->build();
$transaction = (new TransactionBuilder($sender))->addOperation($paymentOperation)->build();

// Sign the transaction with the sender's key pair.
$transaction->sign($senderKeyPair, Network::testnet());

// Submit the transaction to the stellar network.
$response = $sdk->submitTransaction($transaction);
if ($response->isSuccessful()) {
    print(PHP_EOL."Payment sent");
}

Documentation and Examples

Examples

Example Description Documentation
Create a new account A new account is created by another account. In the testnet we can also use Freindbot. Create account
Send native payment A sender sends 100 XLM (Stellar Lumens) native payment to a receiver. Payments
Create trustline An trustor account trusts an issuer account for a specific custom token. The issuer account can now send tokens to the trustor account. Assets & Trustlines and Change trust
Send tokens - non native payment Two accounts trust the same issuer account and custom token. They can now send this custom tokens to each other. Assets & Trustlines and Change trust and Payments
Path payments Two accounts trust different custom tokens. The sender wants to send token “IOM” but the receiver wants to receive token “ECO”. Path payment strict send and Path payment strict receive
Merge accounts Merge one account into another. The first account is removed, the second receives the funds. Account merge
Bump sequence number In this example we will bump the sequence number of an account to a higher number. Bump sequence number
Manage data Sets, modifies, or deletes a data entry (name/value pair) that is attached to a particular account. Manage data
Manage buy offer Creates, updates, or deletes an offer to buy one asset for another, otherwise known as a “bid” order on a traditional orderbook. Manage buy offer
Manage sell offer Creates, updates, or deletes an offer to sell one asset for another, otherwise known as a “ask” order or “offer” on a traditional orderbook. Manage sell offer
Create passive sell offer Creates, updates and deletes an offer to sell one asset for another, otherwise known as a “ask” order or “offer” on a traditional orderbook, without taking a reverse offer of equal price. Create passive sell offer
Change trust Creates, updates, and deletes a trustline. Change trust and Assets documentation
Allow trust Updates the authorized flag of an existing trustline. Allow trust and Assets documentation
Fee bump transaction Fee bump transactions allow an arbitrary account to pay the fee for a transaction. Fee bump transactions
Muxed accounts In this example we will see how to use a muxed account in a payment operation. First-class multiplexed accounts
Stream payments Listens for payments received by a given account. Streaming
SEP-0001: stellar.toml In this example you can find out how to obtain data about an organization’s Stellar integration. SEP-0001
SEP-0002: Federation This example shows how to resolve a stellar address, a stellar account id, a transaction id and a forward by using the federation protocol. SEP-0002
SEP-0005: Key derivation In this examples you can see how to generate 12 or 24 words mnemonics for different languages using the PHP SDK, how to generate key pairs from a mnemonic (with and without BIP 39 passphrase) and how to generate key pairs from a BIP 39 seed. SEP-0005
SEP-0010: Stellar Web Authentication This example shows how to authenticate with any web service which requires a Stellar account ownership verification. SEP-0010
SEP-0012: KYC API In this examples you can see how to use the sdk to send KYC data to anchors and other services. SEP-0012

More examples can be found in the tests.