Ethereum-driven Transactions
The Transactor Contract creates transactions on Signet from Ethereum.
Transactions made via the Transactor always execute on Signet at the end of
the current block, bypassing any possibility of builder censorship.
Consult the Pecorino Quickstart guide for contract addresses and RPC endpoints.
Setup
Solidity (ABI): Download the Transactor ABI from Transactor ABI
curl -O https://signet.sh/docs/abis/Transactor.abi.jsonSolidity (Source): The Transactor contract is open source
forge install https://github.com/init4tech/zenithRust: Alloy bindings are available via the signet-zenith crate
cargo add signet-zenithOverview
Transactor.sol exposes a basic EVM transaction as a single function:
1function transact(
2 address to,
3 bytes calldata data,
4 uint256 value,
5 uint256 gas,
6 uint256 maxFeePerGas
7) external payableCalling the transact function results in a system transaction being issued on
Signet from the address of the caller. This allows Ethereum contracts to
own assets on Signet, and to trigger contract execution on Signet from
Ethereum with native authentication.
The value argument is the amount of USD in wei to send on the rollup.
USD is the native asset of Signet. This amount will be attached to the Signet
transaction. The balance of originating address on Signet must be sufficient to
cover this value.
Transact events are executed at the end of the Signet block. Contract
creation via Transactor is not currently supported.
The Transactor emits a Transact event that can be monitored. The Signet node
listens for these events directly, so if the event fired, the transaction
was included in Signet (although it may revert or be dropped by the
Signet Orders system).
Code Examples
Solidity
1contract YourContract {
2 Transactor public transactor;
3
4 constructor(Transactor _transactor) {
5 transactor = _transactor;
6 }
7
8 // Execute a function on Signet from Ethereum
9 function executeOnSignet(
10 address signetTarget,
11 bytes calldata functionData
12 ) external {
13 transactor.transact(
14 signetTarget,
15 functionData,
16 0, // USD value on Signet
17 1_000_000, // gas limit on Signet
18 100 gwei // max fee per gas (in USD) on Signet
19 );
20 }
21
22 // Emergency action on Signet
23 function emergencyAction(address signetContract) external onlyOwner {
24 // Encode the emergency function call
25 bytes memory data = abi.encodeWithSignature("emergencyPause()");
26 executeOnSignet(signetContract, data);
27 }
28}Monitoring Transactor activity in JavaScript/TypeScript
Listen for Transactor events to track Host-driven transactions:
1import { ethers } from "ethers";
2
3const provider = new ethers.JsonRpcProvider("https://eth.llamarpc.com");
4const transactor = new ethers.Contract(
5 TRANSACTOR_ADDRESS,
6 TRANSACTOR_ABI, // Get ABI from contract source
7 provider
8);
9
10// Listen for Host-driven transactions
11// Event name and signature from Transactor.sol
12transactor.on("Transact", (...args) => {
13 console.log("Host-driven execution:", args);
14
15 // Decode the calldata if needed
16 const [from, to, data] = args; // Adjust based on actual event
17 console.log(`${from} Host-driven execution on ${to}`);
18});