Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 185
0.00% covered (danger)
0.00%
0 / 5
CRAP
0.00% covered (danger)
0.00%
0 / 1
SnsInstruction
0.00% covered (danger)
0.00%
0 / 185
0.00% covered (danger)
0.00%
0 / 5
182
0.00% covered (danger)
0.00%
0 / 1
 createInstruction
0.00% covered (danger)
0.00%
0 / 63
0.00% covered (danger)
0.00%
0 / 1
20
 updateInstruction
0.00% covered (danger)
0.00%
0 / 24
0.00% covered (danger)
0.00%
0 / 1
2
 transferInstruction
0.00% covered (danger)
0.00%
0 / 40
0.00% covered (danger)
0.00%
0 / 1
42
 reallocInstruction
0.00% covered (danger)
0.00%
0 / 32
0.00% covered (danger)
0.00%
0 / 1
2
 deleteInstruction
0.00% covered (danger)
0.00%
0 / 26
0.00% covered (danger)
0.00%
0 / 1
2
1<?php
2
3namespace Attestto\SolanaPhpSdk\Programs\SNS;
4
5use Attestto\SolanaPhpSdk\PublicKey;
6use Attestto\SolanaPhpSdk\SystemProgram;
7use Attestto\SolanaPhpSdk\TransactionInstruction;
8use Attestto\SolanaPhpSdk\Interfaces\AccountKeyInterface;
9
10class SnsInstruction {
11
12
13    use Attestto\SolanaPhpSdk\Buffer;
14    use Attestto\SolanaPhpSdk\Numberu32;
15    use Attestto\SolanaPhpSdk\Numberu64;
16    use Attestto\SolanaPhpSdk\PublicKey;
17    use Attestto\SolanaPhpSdk\TransactionInstruction;
18
19    /**
20     * Creates a transaction instruction.
21     *
22     * @param PublicKey $nameProgramId The public key of the name program.
23     * @param PublicKey $systemProgramId The public key of the system program.
24     * @param PublicKey $nameKey The public key of the name.
25     * @param PublicKey $nameOwnerKey The public key of the name owner.
26     * @param PublicKey $payerKey The public key of the payer.
27     * @param Buffer $hashed_name The hashed name.
28     * @param Numberu64 $lamports The amount of lamports.
29     * @param Numberu32 $space The amount of space.
30     * @param PublicKey|null $nameClassKey The public key of the name class.
31     * @param PublicKey|null $nameParent The public key of the name parent.
32     * @param PublicKey|null $nameParentOwner The public key of the name parent owner.
33     * @return TransactionInstruction The created transaction instruction.
34     */
35    function createInstruction(
36        PublicKey $nameProgramId,
37        PublicKey $systemProgramId,
38        PublicKey $nameKey,
39        PublicKey $nameOwnerKey,
40        PublicKey $payerKey,
41        Buffer $hashed_name,
42        Numberu64 $lamports,
43        Numberu32 $space,
44        ?PublicKey $nameClassKey = null,
45        ?PublicKey $nameParent = null,
46        ?PublicKey $nameParentOwner = null
47    ): TransactionInstruction {
48        $buffers = [
49            Buffer::fromArray([0]),
50            (new Numberu32($hashed_name->length))->toBuffer(),
51            $hashed_name,
52            $lamports->toBuffer(),
53            $space->toBuffer()
54        ];
55
56        $data = Buffer::concat($buffers);
57
58        $keys = [
59            [
60                'pubkey' => $systemProgramId,
61                'isSigner' => false,
62                'isWritable' => false
63            ],
64            [
65                'pubkey' => $payerKey,
66                'isSigner' => true,
67                'isWritable' => true
68            ],
69            [
70                'pubkey' => $nameKey,
71                'isSigner' => false,
72                'isWritable' => true
73            ],
74            [
75                'pubkey' => $nameOwnerKey,
76                'isSigner' => false,
77                'isWritable' => false
78            ]
79        ];
80
81        if ($nameClassKey) {
82            $keys[] = [
83                'pubkey' => $nameClassKey,
84                'isSigner' => true,
85                'isWritable' => false
86            ];
87        } else {
88            $keys[] = [
89                'pubkey' => new PublicKey(Buffer::alloc(32)),
90                'isSigner' => false,
91                'isWritable' => false
92            ];
93        }
94
95        if ($nameParent) {
96            $keys[] = [
97                'pubkey' => $nameParent,
98                'isSigner' => false,
99                'isWritable' => false
100            ];
101        } else {
102            $keys[] = [
103                'pubkey' => new PublicKey(Buffer::alloc(32)),
104                'isSigner' => false,
105                'isWritable' => false
106            ];
107        }
108
109        if ($nameParentOwner) {
110            $keys[] = [
111                'pubkey' => $nameParentOwner,
112                'isSigner' => true,
113                'isWritable' => false
114            ];
115        }
116
117        return new TransactionInstruction([
118            'keys' => $keys,
119            'programId' => $nameProgramId,
120            'data' => $data
121        ]);
122    }
123
124
125    /**
126     * Updates an instruction.
127     *
128     * @param PublicKey $nameProgramId The public key of the name program.
129     * @param PublicKey $nameAccountKey The public key of the name account.
130     * @param Numberu32 $offset The offset.
131     * @param Buffer $input_data The input data.
132     * @param PublicKey $nameUpdateSigner The public key of the name update signer.
133     * @return TransactionInstruction The created transaction instruction.
134     */
135    function updateInstruction(
136        PublicKey $nameProgramId,
137        PublicKey $nameAccountKey,
138        Numberu32 $offset,
139        Buffer $input_data,
140        PublicKey $nameUpdateSigner
141    ): TransactionInstruction {
142        $buffers = [
143            Buffer::fromArray([1]),
144            $offset->toBuffer(),
145            (new Numberu32($input_data->length))->toBuffer(),
146            $input_data
147        ];
148
149        $data = Buffer::concat($buffers);
150        $keys = [
151            [
152                'pubkey' => $nameAccountKey,
153                'isSigner' => false,
154                'isWritable' => true
155            ],
156            [
157                'pubkey' => $nameUpdateSigner,
158                'isSigner' => true,
159                'isWritable' => false
160            ]
161        ];
162
163        return new TransactionInstruction([
164            'keys' => $keys,
165            'programId' => $nameProgramId,
166            'data' => $data
167        ]);
168    }
169
170
171    /**
172     * Creates a transfer instruction.
173     *
174     * @param PublicKey $nameProgramId The public key of the name program.
175     * @param PublicKey $nameAccountKey The public key of the name account.
176     * @param PublicKey $newOwnerKey The public key of the new owner.
177     * @param PublicKey $currentNameOwnerKey The public key of the current name owner.
178     * @param PublicKey|null $nameClassKey The public key of the name class.
179     * @param PublicKey|null $nameParent The public key of the name parent.
180     * @param PublicKey|null $parentOwner The public key of the parent owner.
181     * @return TransactionInstruction The created transaction instruction.
182     */
183    function transferInstruction(
184        PublicKey $nameProgramId,
185        PublicKey $nameAccountKey,
186        PublicKey $newOwnerKey,
187        PublicKey $currentNameOwnerKey,
188        ?PublicKey $nameClassKey = null,
189        ?PublicKey $nameParent = null,
190        ?PublicKey $parentOwner = null
191    ): TransactionInstruction {
192        $buffers = [
193            Buffer::fromArray([2]),
194            $newOwnerKey->toBuffer()
195        ];
196
197        $data = Buffer::concat($buffers);
198        $keys = [
199            [
200                'pubkey' => $nameAccountKey,
201                'isSigner' => false,
202                'isWritable' => true
203            ],
204            [
205                'pubkey' => $parentOwner ? $parentOwner : $currentNameOwnerKey,
206                'isSigner' => true,
207                'isWritable' => false
208            ]
209        ];
210
211        if ($nameClassKey) {
212            $keys[] = [
213                'pubkey' => $nameClassKey,
214                'isSigner' => true,
215                'isWritable' => false
216            ];
217        }
218
219        if ($parentOwner && $nameParent) {
220            if (!$nameClassKey) {
221                $keys[] = [
222                    'pubkey' => new PublicKey(Buffer::alloc(32)),
223                    'isSigner' => false,
224                    'isWritable' => false
225                ];
226            }
227            $keys[] = [
228                'pubkey' => $nameParent,
229                'isSigner' => false,
230                'isWritable' => false
231            ];
232        }
233
234        return new TransactionInstruction([
235            'keys' => $keys,
236            'programId' => $nameProgramId,
237            'data' => $data
238        ]);
239    }
240
241
242    /**
243     * Creates a realloc instruction.
244     *
245     * @param PublicKey $nameProgramId The public key of the name program.
246     * @param PublicKey $systemProgramId The public key of the system program.
247     * @param PublicKey $payerKey The public key of the payer.
248     * @param PublicKey $nameAccountKey The public key of the name account.
249     * @param PublicKey $nameOwnerKey The public key of the name owner.
250     * @param Numberu32 $space The amount of space.
251     * @return TransactionInstruction The created transaction instruction.
252     */
253    function reallocInstruction(
254        PublicKey $nameProgramId,
255        PublicKey $systemProgramId,
256        PublicKey $payerKey,
257        PublicKey $nameAccountKey,
258        PublicKey $nameOwnerKey,
259        Numberu32 $space
260    ): TransactionInstruction {
261        $buffers = [
262            Buffer::fromArray([4]),
263            $space->toBuffer()
264        ];
265
266        $data = Buffer::concat($buffers);
267        $keys = [
268            [
269                'pubkey' => $systemProgramId,
270                'isSigner' => false,
271                'isWritable' => false
272            ],
273            [
274                'pubkey' => $payerKey,
275                'isSigner' => true,
276                'isWritable' => true
277            ],
278            [
279                'pubkey' => $nameAccountKey,
280                'isSigner' => false,
281                'isWritable' => true
282            ],
283            [
284                'pubkey' => $nameOwnerKey,
285                'isSigner' => true,
286                'isWritable' => false
287            ]
288        ];
289
290        return new TransactionInstruction([
291            'keys' => $keys,
292            'programId' => $nameProgramId,
293            'data' => $data
294        ]);
295    }
296
297    /**
298     * Creates a delete instruction.
299     *
300     * @param PublicKey $nameProgramId The public key of the name program.
301     * @param PublicKey $nameAccountKey The public key of the name account.
302     * @param PublicKey $refundTargetKey The public key of the refund target.
303     * @param PublicKey $nameOwnerKey The public key of the name owner.
304     * @return TransactionInstruction The created transaction instruction.
305     */
306    function deleteInstruction(
307        PublicKey $nameProgramId,
308        PublicKey $nameAccountKey,
309        PublicKey $refundTargetKey,
310        PublicKey $nameOwnerKey
311    ): TransactionInstruction {
312        $buffers = [
313            Buffer::fromArray([3])
314        ];
315
316        $data = Buffer::concat($buffers);
317        $keys = [
318            [
319                'pubkey' => $nameAccountKey,
320                'isSigner' => false,
321                'isWritable' => true
322            ],
323            [
324                'pubkey' => $nameOwnerKey,
325                'isSigner' => true,
326                'isWritable' => false
327            ],
328            [
329                'pubkey' => $refundTargetKey,
330                'isSigner' => false,
331                'isWritable' => true
332            ]
333        ];
334
335        return new TransactionInstruction([
336            'keys' => $keys,
337            'programId' => $nameProgramId,
338            'data' => $data
339        ]);
340    }
341
342
343}