Documentation/Build on Signet/To Ethereum
On-chain Orders in Solidity
Build smart contracts that create and interact with Signet Orders
Build smart contracts that create, fill, or interact with Signet Orders. These examples demonstrate practical patterns for capturing MEV, automating exits, and creating novel cross-chain primitives.
Setup
Solidity (Source): Install the Signet Orders contracts
forge install https://github.com/init4tech/zenithSolidity (ABI): Download the Orders ABIs
# For orders created on Signet (rollup)
curl -O https://signet.sh/docs/abis/RollupOrders.abi.json
# For orders filled on Ethereum (host)
curl -O https://signet.sh/docs/abis/HostOrders.abi.jsonExamples: View example contracts at signet-sol
The example repository demonstrates practical patterns for:
- Flash loans
- Quick exits with fees
- Payment gating
- MEV capture
Study these examples to understand how to build with Signet Orders.
Example Contracts
All examples use the Signet Orders system to enable cross-chain, instant, atomic, and composable operations.
SignetStd.sol - System Configuration
Auto-configure Signet system parameters based on chain ID. Use this as a base for contracts that need to interact with Signet.
When to use:
- You’re building a contract that creates or interacts with Orders
- You need to reference Signet system contracts
- You want chain-agnostic Signet integration
import {SignetStd} from "./SignetStd.sol";
contract YourContract is SignetStd {
function createOrder() external {
// Automatically has access to:
// - rollupOrders: The Orders contract address
// - permit2: The Permit2 contract address
// - Other Signet system parameters
}
}Source: Signet.sol
Flash.sol - Cross-Chain Flash Loans
Flash borrow any asset by using an Order where the Output becomes the Input to its own Order.
When to use:
- You need temporary liquidity for a transaction
- You want to perform cross-chain arbitrage
- You need to borrow assets without upfront collateral
How it works:
- Request a flash loan of X tokens
- Searchers provide the tokens (knowing they’ll be repaid)
- Your contract executes logic with the borrowed assets
- The Order output repays the input, completing the cycle
// Example: Flash borrow WETH for arbitrage
flashBorrow(wethAddress, amount, arbitrageCalldata);Source: Flash.sol
GetOut.sol - Quick Exit with Fee
Exit Signet by offering searchers a 50 basis point fee. The simplest way to move assets from Signet to Ethereum.
When to use:
- You want a one-line function to exit Signet
- You’re willing to pay a small fee for immediate exit
- You’re building a UI that needs a simple exit mechanism
// Exit Signet with a 50bps fee
getOut(tokenAddress, amount, recipient);How it works:
- Your contract locks tokens on Signet
- Creates an Order offering 99.5% of tokens on Ethereum
- Searchers fill the order for the 0.5% profit
- You receive tokens on Ethereum instantly
Source: GetOut.sol
PayMe.sol - Payment Gating
Gate contract execution behind a payment using an Order with no inputs. The calling contract doesn’t need to manage cash flow–any third party can fill the payment order.
When to use:
- You want users to pay for contract execution
- You don’t want your contract to handle payment logic
- You want to allow third-party payment (gasless transactions)
How it works:
- Your contract creates an Order with only outputs (payment required)
- Contract execution is invalid unless someone fills the Order
- Unlike
msg.valuechecks, the payer can be anyone - Greatly simplifies payment logic
function executeWithPayment() external {
// Create payment order
payMe(usdcAddress, 10e6); // Require 10 USDC payment
// Your contract logic here
// Only executes if payment Order is filled
}Source: PayMe.sol
PayYou.sol - MEV Capture and Bounties
Generate MEV by offering an Order with no outputs. This creates a bounty for calling your contract, functioning as an incentivized scheduling system.
When to use:
- You want to incentivize someone to call your contract
- You’re creating an automated system that needs execution
- You want to capture MEV produced by your protocol
How it works:
- Your contract creates an Order with only inputs (no outputs required)
- Searchers compete to call your contract to claim the bounty
- Functions as an incentivized scheduling/execution system
function executeAndPay() external {
// Your contract logic that generates value
performArbitrage();
// Pay searchers for executing
payYou(wethAddress, 0.01 ether); // Offer 0.01 ETH bounty
}Use cases:
- Liquidation systems
- Automated rebalancing
- Scheduled maintenance
- MEV extraction from your protocol
Source: PayYou.sol