Solidity
💡
N1 is currently in closed early access and only available to select developers. These docs are meant to provide insight into what developing on N1 feels like. If you are interested in developing an app on N1, sign up to the Early Access Program ↗ (opens in a new tab).
N1 provides a Solidity interface for interacting with the N1 precompile for sending and receiving messages to and from the rest of the network. This is used to asynchronously compose with other programs. we offer a normal Ethereum RPC interface.
interface IMessageSender {
function send(bytes memory message, address dest) external;
}
interface IMessageReceiver {
function onRecv(bytes memory message, address sender) external;
}
contract MyProgram is IMessageReceiver {
// Set this to the address of the IMessage contract precompile.
address public constant MESSAGE_ADDRESS = address(0);
function sendExample() external {
IMessageSender(MESSAGE_ADDRESS).send("hi!", address(1));
}
function onRecv(bytes memory message, address sender) external override {
// Do something with the message.
}
}
For example, our Nord orderbook provides a Solidity interface for encoding and decoding messages, which can be used to implement applications such as trading bots.
import { IMessageReceiver, IMessageSender } from "./IMessageReceiver.sol";
import { INord } from "./INord.sol";
contract MyBot is IMessageReceiver {
// Set this to the address of the Nord contract.
address public constant NORD = 0x000000000000000000000000000000000000dead;
function execute(bytes memory action) external override {
IMessageSender(NORD).send(INord.encodePlaceOrder(0, 100, 100), address(this));
}
function onRecv(bytes memory message, address sender) external override {
if (sender == NORD) {
INord.Receipt memory receipt = INord.decodeReceipt(message);
if (receipt.kind == INord.ReceiptKind.OrderPlaced) {
// Do something with the receipt.
}
}
}
}