/**
* Read immediate data from bytecode for PUSH operations
*/
function readImmediate(bytecode: Uint8Array, pc: number, size: number): bigint | null {
if (pc + 1 + size > bytecode.length) {
return null;
}
let result = 0n;
for (let i = 0; i < size; i++) {
result = (result << 8n) | BigInt(bytecode[pc + 1 + i]);
}
return result;
}
/**
* PUSH2 opcode (0x61) - Push 2 bytes onto stack
*
* Stack: [] => [value]
* Gas: 3 (GasFastestStep)
*/
export function handler_0x61_PUSH2(frame: FrameType): EvmError | null {
const gasErr = consumeGas(frame, FastestStep);
if (gasErr) return gasErr;
const value = readImmediate(frame.bytecode, frame.pc, 2);
if (value === null) {
return { type: "InvalidOpcode" };
}
const pushErr = pushStack(frame, value);
if (pushErr) return pushErr;
frame.pc += 3;
return null;
}