/// Probe: if newyork narrows the signextend BYTE-INDEX parameter to i64, a huge
/// index (>=31, which EVM treats as "leave value unchanged") truncated to a
/// small index would sign-extend from a low byte instead, changing the value.
/// `pp` is used as mload offset (case 0) to drive narrowing, and as the
/// signextend index (case 1). value 0x80 has bit 7 set, so signextend(0, 0x80)
/// = 0xff..ff80 while signextend(huge, 0x80) = 0x80.
object "SignextendIndexNarrow" {
code { let s := datasize("SignextendIndexNarrow_deployed") codecopy(0, dataoffset("SignextendIndexNarrow_deployed"), s) return(0, s) }
object "SignextendIndexNarrow_deployed" {
code {
let op := calldataload(0)
let p := calldataload(32)
let r0 := probe(op, p)
let r1 := probe(op, p)
let r2 := probe(op, p)
let r3 := probe(op, p)
mstore(0x200, r0) mstore(0x220, add(r1, add(r2, r3)))
return(0x200, 64)
function probe(opx, pp) -> r {
switch opx
case 0 { r := mload(pp) }
case 1 { r := signextend(pp, 0x80) }
case 2 { r := keccak256(pp, 32) }
default { r := pp }
}
}
}
}