neo-devpack-solidity 0.22.0

Production-focused Solidity-to-NeoVM compilation system
Documentation
# Inline Assembly

Solidity defines an assembly language that can be used without Solidity. This assembly language can also be used as "inline assembly" inside Solidity source code. 

::: tip 💡 NeoVM Difference
In Ethereum, inline assembly gives you direct access to the EVM stack and opcodes (e.g., `sload`, `sstore`, `call`). **On NeoVM, the compiler lowers a limited Yul compatibility subset and warns on anything outside that subset** because the opcodes and stack architecture fundamentally differ. Treat assembly blocks as portability scaffolding, not as EVM-opcode-level access.
:::

## How Neo DevPack for Solidity Handles Inline Assembly

When the Neo DevPack for Solidity compiler encounters an `assembly { ... }` block, it parses
Yul syntax and lowers a documented compatibility subset to NeoVM IR. This is not
EVM opcode parity: unsupported Yul constructs fall back to a compatibility
warning and emit no assembly logic for that block.

The supported subset is meant for common library idioms, not arbitrary EVM
assembly. It includes:

- Yul locals and assignments (`let x := ...`, `x := ...`)
- Reads from Solidity locals and parameters
- `mstore`, `mload`, and `return` over a bounded scratch memory buffer
- `tstore` and `tload` transient storage helpers
- `returndatasize()` and guarded `returndatacopy(...)`
- Arithmetic, bitwise, shift, and comparison helpers such as `add`, `sub`,
  `mul`, `div`, `mod`, `and`, `or`, `xor`, `not`, `shl`, `shr`, `lt`, `gt`,
  `eq`, and `iszero`
- Simple `if`, `for`, `switch`, and nested block forms when every nested
  expression is also in the supported subset

Unsupported EVM-only operations such as `sload`, `sstore`, raw `call`, and
`create` do not map directly to NeoVM. Rewrite those paths with Solidity,
devpack libraries, or explicit Neo native-contract/syscall wrappers.

```solidity
function loadWord() public pure returns (uint256) {
    assembly {
        mstore(0, 42)
        return(0, 32)
    }
}
```

## NeoVM Alternatives

If your contract requires Neo-specific low-level operations, prefer Neo's native
intrinsics and Syscalls directly.

For example, to execute a cross-contract call with dynamic parameters or specific execution flags, use the `Syscalls` library rather than EVM's `call` opcode.

```solidity
import {Syscalls, CallFlags} from "@neo/Syscalls.sol";

function callAnotherContract(address target, string memory method) public {
    // Replaces the need for low-level assembly calls
    Syscalls.contractCall(target, method, CallFlags.All, new any[](0));
}
```

For advanced mathematics, cryptography, or memory manipulation, the Neo Devpack exposes a comprehensive suite of native libraries designed explicitly for the NeoVM environment.