NAC Usage: EVM to Michelson
Cross-interface calls go through the gateway contract of the caller's interface. This page describes how to initiate a cross-interface call from the EVM interface. For the opposite way, see Michelson to EVM.
The EVM-to-Michelson gateway is a precompile deployed at:
0xff00000000000000000000000000000000000007
callMichelson
Call a Michelson contract by providing:
| Parameter | Type | Description |
|---|---|---|
destination | string | The Michelson contract address (KT1… base58check) |
entrypoint | string | The target entrypoint name |
data | bytes | Michelson-encoded parameters |
A Michelson KT1… address is 22 bytes in base58check form and does not fit into a 20-byte EVM address type. The gateway therefore takes the destination as a string and parses it on the Michelson side.
interface INativeAtomicGateway {
function callMichelson(
string calldata destination,
string calldata entrypoint,
bytes calldata data
) external payable;
}
INativeAtomicGateway gateway = INativeAtomicGateway(
0xff00000000000000000000000000000000000007
);
gateway.callMichelson("KT1…", "default", michelsonParams);
The data parameter must be encoded in Michelson binary format. For simple types you can construct the payload inline: for example, passing a nat with value 42 encodes as hex"002a" (tag 0x00 = integer, value 0x2a = 42). Worked Solidity examples using this pattern are available in the solidity_examples/ directory of the Etherlink sources. For complex types, off-line tools such as Taquito's packData function can compute the encoding.
FA1.2 wrapper
For calling FA1.2 token contracts specifically, a convenience precompile is available at:
0xff00000000000000000000000000000000ffff09
This precompile provides approve and transfer methods that handle Michelson parameter encoding automatically, without requiring manual binary encoding.
Return value
In the case of a regular Michelson call (callMichelson), there is no return value.
callMichelsonView
To call a read-only Michelson view and receive the result, use callMichelsonView:
| Parameter | Type | Description |
|---|---|---|
destination | string | The Michelson contract address (KT1… base58check) |
viewName | string | The name of the on-chain view |
input | bytes | Micheline-encoded input to the view |
This entry point performs a read-only crossing (no value transfer, no state mutation) and must be invoked via staticcall. The gateway returns the view's Micheline response ABI-encoded as bytes.
interface INativeAtomicGateway {
function callMichelsonView(
string calldata destination,
string calldata viewName,
bytes calldata input
) external view returns (bytes memory);
}
INativeAtomicGateway gateway = INativeAtomicGateway(
0xff00000000000000000000000000000000000007
);
bytes memory michelineResult = gateway.callMichelsonView(
"KT1…", // destination
"myView", // view name
hex"030b" // Micheline Unit — adjust to match the view's input type
);
A complete worked example (using the low-level staticcall pattern) is available in crac_michelson_view_staticcall.sol.