|
2 | 2 | entrypoint: |
3 | 3 | ldxdw r2, [r1 + 0] # get number of accounts |
4 | 4 | jne r2, 2, error # error if not 2 accounts |
| 5 | + |
5 | 6 | ldxb r2, [r1 + 8] # get first account |
6 | | - jne r2, 0xff, error # shouldn't be a duplicate, but check |
| 7 | + # can check this, but isn't necessary |
| 8 | + # jne r2, 0xff, error |
7 | 9 | ldxdw r2, [r1 + 8 + 8 + 32 + 32] # get source lamports |
8 | 10 | ldxdw r3, [r1 + 8 + 8 + 32 + 32 + 8] # get account data size |
9 | 11 | mov64 r4, r1 |
10 | 12 | add64 r4, 8 + 8 + 32 + 32 + 8 + 8 + 10240 + 8 # calculate end of account data |
11 | 13 | add64 r4, r3 |
12 | 14 | mov64 r5, r4 # check how much padding we need to add |
13 | | - and64 r5, 7 # clear high bits |
14 | | - jeq r5, 0, 1 # no low bits set, jump ahead |
| 15 | + and64 r5, -8 # clear low bits |
| 16 | + jeq r5, r4, 1 # no low bits set, jump ahead |
15 | 17 | add64 r4, 8 # add 8 for truncation if needed |
16 | 18 | and64 r4, -8 # clear low bits |
| 19 | + |
17 | 20 | ldxb r5, [r4 + 0] # get second account |
18 | 21 | jne r5, 0xff, error # we don't allow duplicates |
19 | 22 | ldxdw r5, [r4 + 8 + 32 + 32] # get destination lamports |
20 | | - sub64 r2, 5 # subtract lamports |
21 | | - add64 r5, 5 # add lamports |
| 23 | + ldxdw r6, [r4 + 8 + 32 + 32 + 8] # get account data size |
| 24 | + mov64 r7, r4 |
| 25 | + add64 r7, 8 + 32 + 32 + 8 + 8 + 10240 + 8 # calculate end of account data |
| 26 | + add64 r7, r6 |
| 27 | + mov64 r8, r7 # check how much padding we need to add |
| 28 | + and64 r8, -8 # clear low bits |
| 29 | + jeq r8, r7, 1 # no low bits set, jump ahead |
| 30 | + add64 r7, 8 # add 8 for truncation if low bits are set |
| 31 | + ldxdw r8, [r7 + 0] # get instruction data size |
| 32 | + jne r8, 0x08, error # need 8 bytes of instruction data |
| 33 | + ldxdw r8, [r7 + 8] # get instruction data as little-endian u64 |
| 34 | + |
| 35 | + sub64 r2, r8 # subtract lamports |
| 36 | + add64 r5, r8 # add lamports |
22 | 37 | stxdw [r1 + 8 + 8 + 32 + 32], r2 # write the new values back |
23 | 38 | stxdw [r4 + 8 + 32 + 32], r5 |
24 | 39 | exit |
|
0 commit comments