lines 1-3
Constants for the byte offsets we will read
.equ INSTRUCTION_DATA_LEN, 0x2868.equ INSTRUCTION_DATA, 0x2870.equ ACCT0_LAMPORTS, 0x0050Why INSTRUCTION_DATA_LEN = 0x2868 and INSTRUCTION_DATA = 0x2870? These are the standard offsets for any Shield guard that declares ONE account with no data. The per-account region for a zero-data account takes 0x2868 bytes (10,344 decimal). That includes the per-account header, alignment padding, and zero bytes of data. Whatever comes after that region is your ix metadata, so the length field lands at 0x2868 and the data starts 8 bytes later at 0x2870.
Compare to slippage's 0x2910/0x2918: slippage's account 0 is a real SPL Token account that holds 165 bytes of state, which pushes everything 168 bytes further along (165 rounded up to an 8-byte alignment boundary). Same fields, just shoved later because more sits in front of them. Compare to slot_deadline at 0x0008/0x0010: it declares zero accounts so nothing sits in front, and the offsets stay tiny.
Why ACCT0_LAMPORTS = 0x0050 (80 decimal)? The input region starts with an 8-byte u64 holding the account count. Right after that, the per-account header for account 0 is 8 more bytes (1-byte dup tag + 1-byte is_signer + 1-byte is_writable + 1-byte executable + 4 bytes of alignment padding), followed by the 32-byte pubkey and the 32-byte owner pubkey. Add them up: 8 + 8 + 32 + 32 = 80 bytes. The lamport balance is the next u64, so it sits at byte 80 (0x50). The runtime writes the live balance from chain state at instruction load time, so reading this offset gives us the up-to-date number.