Addition


// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; contract Yul { function add(uint256 x, uint256 y) public pure returns (bytes32) { assembly { mstore(0x80, add(x, y)) return(0x80, 0x20) } } }

The add(a, b) Yul command takes in two numbers as arguments and returns their sum, a + b.

🚨 Additions in Yul are unchecked, meaning that, Yul wraps around numbers if they exceed the highest possible number to be stored in a slot.

// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; contract Yul { function add() public pure returns (bytes32) { assembly { let large := 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff mstore(0x80, add(large, 0x03)) return(0x80, 0x20) } } }

The above will return 0x0000000000000000000000000000000000000000000000000000000000000002 showing a wrap around.

To write a Yul addition code to check for overflows and prevent them, this will be the approach to use [6].

// SPDX-License-Identifier: GPL-3.0 pragma solidity ^0.8.0; contract Yul { function add(uint256 x, uint256 y) public pure returns (bytes32) { assembly { if lt(add(x, y), x) { revert(0x00, 0x00) } mstore(0x80, add(x, y)) return(0x80, 0x20) } } }