Smart Contract Overview¶
Sera's settlement layer is an open-source Ethereum contract system composed of a custody vault, the core orderbook, a smart order router, and a batching wrapper.
Contract Addresses¶
Ethereum Mainnet¶
| Contract | Address |
|---|---|
| Vault | 0xC7d4Fd2638e6630C8C61329878676b88A8A24D43 |
| Sera | 0xB5C50C5D5f038404F85970b7f5B7259C4AC0E198 |
| SeraSOR | 0xa7A0cf7cd6f043fCA23f29d8ae5aae6b46e11c18 |
| SeraBatcher | 0x1f4b366f4145A92978df4bEeb6BdE71bC652F034 |
Addresses can drift between deployments. Fetch live values from GET /config instead of hardcoding.
Source Code¶
All contracts are open source on GitHub and have been independently audited. Links below point to the audited revision.
| Contract | Source |
|---|---|
| Sera.sol | src/Sera.sol |
| SeraSOR.sol | src/SeraSOR.sol |
| SeraBatcher.sol | src/SeraBatcher.sol |
| Vault.sol | src/Vault.sol |
Architecture¶
flowchart TD
User["User / API"] --> Sera["Sera.sol<br/><i>Core settlement, signatures, withdrawals</i>"]
User --> SOR["SeraSOR.sol<br/><i>Multi-leg routed swaps</i>"]
SOR --> Sera
Batcher["SeraBatcher.sol<br/><i>Batch execution wrapper</i>"] --> Sera
Batcher --> SOR
Sera --> Vault["Vault.sol<br/><i>Custody and ledger balances</i>"] Contract Roles¶
Vault.TRADER_ROLEis granted to Sera so only the matching engine can move tracked balances.Sera.EXECUTOR_ROLEis granted to the off-chain executor, SeraSOR, and SeraBatcher.Sera.PAUSER_ROLEandDEFAULT_ADMIN_ROLEstay with protocol administration.- All admin roles are held by a Timelock contract, which is in turn owned by a multisig.
Sera.trustedRouteris set to the active SeraSOR deployment.
EIP-712 Domain¶
Orders, routed intents, and withdrawals are signed under the Sera domain:
const domain = {
name: 'Sera',
version: '1',
chainId: 1,
verifyingContract: '0xB5C50C5D5f038404F85970b7f5B7259C4AC0E198'
};
Contracts¶
Sera.sol¶
Core settlement contract for matching, deposits, replay protection, and withdrawals.
matchOrders()settles a signed maker/taker pair.depositFund()anddepositFundWithPermit()fund vault balances through Sera.executeInstantWithdrawDualSig()executes user-plus-executor withdrawals.emergencyWithdraw()preserves on-chain recovery if the API stack is unavailable.
SeraSOR.sol¶
Smart Order Router for one-shot multi-leg swaps.
executeIntent()consumes a signed routed intent.- Intermediate route balances stay transient inside the transaction instead of touching the vault.
SeraBatcher.sol¶
Executor wrapper for best-effort and atomic batching.
batchMatchOrders()continues on failure.batchMatchOrdersAtomic()reverts the whole batch on any failure.batchMatchMixed()combines atomic batches, individual matches, and routed intents.
View SeraBatcher.sol Reference →
Vault.sol¶
Custody and ledger contract.
deposit()andwithdraw()move ERC-20 balances in and out.transferLedger()settles matched trades without moving physical tokens.balanceOf()exposes per-user tracked balances.
Settlement Flow¶
sequenceDiagram
participant User
participant Sera as Sera.sol
participant Vault as Vault.sol
User->>Sera: depositFund(token, owner, amount)
Sera->>Vault: deposit(owner, token, amount)
Sera->>Vault: transferLedger(fromUser, toUser, token, amount)
Note over Vault: Matching updates ledger balances only
User->>Sera: executeInstantWithdrawDualSig(intent, userSig, executorSig)
Sera->>Vault: withdraw(user, token, amount, recipient)
Vault-->>User: ERC-20 transfer Security Features¶
- Non-custodial — every action requires the user's signature; the protocol cannot move funds without authorization.
- Emergency withdrawal — users can withdraw directly on-chain even if the API is down (subject to a ~24h delay).
- Reentrancy protection — sensitive functions use transient reentrancy guards.
- Pausable — admin emergency-pause mechanism.
- Role-based access control — separate executor, admin, and pauser roles.
Next Steps¶
-
Core settlement contract reference
-
Smart Order Router reference
-
Batch execution reference
-
Asset custody reference