CompilerError: Stack too deep when compiling inline assembly: Variable value0 is 3 slot(s) too deep inside the stack.
Error HH600: Compilation failed
Solidity를 코딩하다가 위와 같은 이유로 에러를 만났습니다.
이유는 아래 코드 때문인데요.
function hashOrder(Order memory order) public pure returns (bytes32 hash) {
return
keccak256(
abi.encode(
ORDER_TYPEHASH,
order.exchange,
order.maker,
order.taker,
order.saleSide,
order.saleKind,
order.target,
order.paymentToken,
keccak256(order.calldata_),
keccak256(order.replacementPattern),
order.basePrice,
order.endPrice,
order.listingTime,
order.expirationTime,
order.salt
)
);
}
abi.encode 내부에 parameters가 여러개가 포함되는데, 컴파일시 내부적으로 이 파라미터들이 Stack에 쌓이게 되는데 총 16개 이상 넘어 갈 수 없게 되어 있다고 합니다.
그래서 이러한 경우 abi.encodePacked를 이용하여 아래와 같이 쪼갤 수가 있습니다.
function hashOrder(Order memory order) public pure returns (bytes32 hash) {
return
keccak256(
abi.encodePacked(
abi.encode(
ORDER_TYPEHASH,
order.exchange,
order.maker,
order.taker,
order.saleSide,
order.saleKind,
order.target,
order.paymentToken,
keccak256(order.calldata_),
keccak256(order.replacementPattern)
),
abi.encode(
order.basePrice,
order.endPrice,
order.listingTime,
order.expirationTime,
order.salt
)
)
);
}
이것으로 위 Compiler Error은 해결 완료!!