Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
64.10% covered (warning)
64.10%
25 / 39
72.73% covered (warning)
72.73%
8 / 11
CRAP
0.00% covered (danger)
0.00%
0 / 1
Connection
64.10% covered (warning)
64.10%
25 / 39
72.73% covered (warning)
72.73%
8 / 11
25.41
0.00% covered (danger)
0.00%
0 / 1
 getAccountInfo
100.00% covered (success)
100.00%
4 / 4
100.00% covered (success)
100.00%
1 / 1
2
 getBalance
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getConfirmedTransaction
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getTransaction
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getRecentBlockhash
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 getLatestBlockhash
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 sendTransaction
100.00% covered (success)
100.00%
9 / 9
100.00% covered (success)
100.00%
1 / 1
3
 simulateTransaction
85.71% covered (warning)
85.71%
6 / 7
0.00% covered (danger)
0.00%
0 / 1
2.01
 requestAirdrop
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getProgramAccounts
0.00% covered (danger)
0.00%
0 / 12
0.00% covered (danger)
0.00%
0 / 1
2
 getMinimumBalanceForRentExemption
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
1<?php
2
3namespace Attestto\SolanaPhpSdk;
4
5use Attestto\SolanaPhpSdk\Exceptions\AccountNotFoundException;
6use Attestto\SolanaPhpSdk\Exceptions\GenericException;
7use Attestto\SolanaPhpSdk\Exceptions\InvalidIdResponseException;
8use Attestto\SolanaPhpSdk\Exceptions\MethodNotFoundException;
9use Attestto\SolanaPhpSdk\Util\Commitment;
10use Illuminate\Http\Client\Response;
11use Psr\Http\Client\ClientExceptionInterface;
12use SodiumException;
13
14/**
15 * Class Connection
16 * @package Attestto\SolanaPhpSdk
17 * https://solana-labs.github.io/solana-web3.js/v1.x/classes/Connection.html
18 */
19class Connection extends Program
20{
21    /**
22     * @param string $pubKey
23     * @return array
24     */
25    public function getAccountInfo(string $pubKey): array
26    {
27        $accountResponse = $this->client->call('getAccountInfo', [$pubKey, ["encoding" => "base64"]])['value'];
28
29        if (! $accountResponse) {
30            throw new AccountNotFoundException("API Error: Account {$pubKey} not found.");
31        }
32
33        return $accountResponse;
34    }
35
36    /**
37     * @param string $pubKey
38     * @return float
39     */
40    public function getBalance(string $pubKey): float
41    {
42        return $this->client->call('getBalance', [$pubKey])['value'];
43    }
44
45    /**
46     * @param string $transactionSignature
47     * @return array|null
48     */
49    public function getConfirmedTransaction(string $transactionSignature): array|null
50    {
51        return $this->client->call('getConfirmedTransaction', [$transactionSignature]);
52    }
53
54    /**
55     * NEW: This method is only available in solana-core v1.7 or newer. Please use getConfirmedTransaction for solana-core v1.6
56     *
57     * @param string $transactionSignature
58     * @return array|null
59     */
60    public function getTransaction(string $transactionSignature): array|null
61    {
62        return $this->client->call('getTransaction', [$transactionSignature]);
63    }
64
65    /**
66     * @param Commitment|null $commitment
67     * @return array
68     * @throws Exceptions\GenericException|Exceptions\MethodNotFoundException|Exceptions\InvalidIdResponseException
69     * Deprecated: Use getLatestBlockhash instead
70     */
71    public function getRecentBlockhash(?Commitment $commitment = null): array
72    {
73        return $this->client->call('getLatestBlockhash', array_filter([$commitment]))['value'];
74    }
75
76    /**
77     * @param string|null $commitment
78     * @return array
79     * @throws Exceptions\GenericException|Exceptions\MethodNotFoundException|Exceptions\InvalidIdResponseException|\Psr\Http\Client\ClientExceptionInterface
80     */
81    public function getLatestBlockhash(?Commitment $commitment = null): array
82    {
83        return $this->client->call('getLatestBlockhash', array_filter([$commitment]))['value'];
84    }
85
86    /**
87     * @param Transaction $transaction
88     * @param Keypair[] $signers
89     * @param array $params
90
91     * @throws GenericException
92     * @throws InvalidIdResponseException
93     * @throws MethodNotFoundException
94     * @throws ClientExceptionInterface
95     * @throws SodiumException
96     * TODO Add Support for Versioned TXns
97     */
98    public function sendTransaction(Transaction $transaction, array $signers, array $params = [])
99    {
100        if (! $transaction->recentBlockhash) {
101            $transaction->recentBlockhash = $this->getLatestBlockhash()['blockhash'];
102        }
103        $transaction->sign(...$signers);
104
105        $rawBinaryString = $transaction->serialize(false);
106
107        $hashString = sodium_bin2base64($rawBinaryString, SODIUM_BASE64_VARIANT_ORIGINAL);
108
109        $send_params = ['encoding' => 'base64', 'preflightCommitment' => 'confirmed'];
110
111        foreach ($params as $k=>$v)
112            $send_params[$k] = $v;
113
114        return $this->client->call('sendTransaction', [$hashString, $send_params]);
115    }
116
117    /**
118     * @param Transaction $transaction
119     * @param Keypair[] $signers
120     * @param array $params
121     * @return array|Response
122     * @throws Exceptions\GenericException
123     * @throws Exceptions\InvalidIdResponseException
124     * @throws Exceptions\MethodNotFoundException
125     */
126    public function simulateTransaction(Transaction $transaction, array $signers, array $params = [])
127    {
128        $transaction->sign(...$signers);
129
130        $rawBinaryString = $transaction->serialize(false);
131
132        $hashString = sodium_bin2base64($rawBinaryString, SODIUM_BASE64_VARIANT_ORIGINAL);
133
134        $send_params = ['encoding' => 'base64', 'commitment' => 'confirmed', 'sigVerify'=>true];
135
136        foreach ($params as $k=>$v)
137            $send_params[$k] = $v;
138
139        return $this->client->call('simulateTransaction', [$hashString, $send_params]);
140    }
141
142    /**
143     * @param string $pubKey
144     * @param array $params
145     * @return string
146     */
147    public function requestAirdrop(array $params = []): string
148    {
149        return $response = $this->client->call('requestAirdrop', $params );
150
151    }
152    // https://solana.com/docs/rpc/http/getprogramaccounts
153    // https://sns.guide/domain-name/all-domains.html
154    public function getProgramAccounts(string $programIdBs58, $dataSlice, $filters)
155    {
156        $params = [
157                $programIdBs58,
158                [
159                    'dataSlice' => $dataSlice,
160                    'filters' => $filters,
161                    'dataSize' => 108, // 'dataSize' => 108
162                    'encoding' => 'base64',
163                    'page' => 1,
164                    'limit' => 1000
165
166                ],
167
168
169        ];
170        return $this->client->call('getProgramAccounts', $params );
171        //return $this->client->call('getAssetsByOwner', $params );
172
173    }
174
175    public function getMinimumBalanceForRentExemption(int $space = 1024){
176        return $this->client->call('getMinimumBalanceForRentExemption', [$space] );
177    }
178
179}