Oasis Engineering Update | May 2025
Check out the latest news and updates from the Oasis engineering team.

From conferences, to an offsite, to the coming full launch of Runtime Offchain Logic (ROFL), the last few months have been extremely busy for the Oasis engineering team. This review is a catchup of all the action from May and April. Dive in for all the highlights, the most notable project updates, critical technical fixes, and new enhancements that pushed the network forward the last few months.
Wallet and CLI Updates
The ROSE Wallet team implemented a number of convenience features and fixes this month. The allowance transaction now shows the beneficiary account (#2156). Instructions for importing the Ethereum private key were added inside a dropdown (#2171). The CSS color scheme now matches the grommet dark theme (#2170). There was some cleanup work done around the wallet, it now relies solely on the Oasis Nexus and a direct connection to the Oasis node via the GRPC proxy (#2178).
All end-to-end tests were also migrated from Cypress to Playwright, with multiple pages and modal dialogs (#2161, #2166, #2169). Also, a test for the Consensus transaction fee was added (#2165). The new v2.3.0 was released on May 19 and is already deployed at wallet.oasis.io. In total, 19 pull requests were merged in April and May.
Next, the Oasis CLI team continued to offer first-class tooling for creating, building, deploying, and managing Oasis ROFL apps. Developers can now seamlessly deploy their ROFL apps to the ROFL marketplace (#422). This is the first blockchain protocol for renting TDX-capable machines and deploying apps on one side and having node operators lending out their hardware on the other side!
For first-time ROFL developers, a default Oasis-managed Testnet provider address is hardcoded together with an OCI repository to host your ROFL app bundles (#447, #442). This ROFL node provider offers renting a one-hour machine for 10 TEST tokens. The tokens can be easily obtained on the Oasis Testnet Faucet page.
The “oasis rofl machine” subcommands “terminate” and “cancel” were renamed to “stop” and “remove,” respectively, to better reflect traditional Docker/Cloud terminology (#437). ROFL apps can now contain multiple enclave IDs on-chain to support upgrades with no downtime (#448). When initializing a new ROFL app, the git repository is also initialized (#475). The network name is now shown when examining the node status if it matches the standard Mainnet/Testnet chain separation context (#424).
Five new Oasis CLI releases were made:
- v0.13.0 released on April 22.
- v0.13.1 released on May 6.
- v0.13.2 released on May 7.
- v0.13.3 released on May 8.
- v0.13.4 released on May 10.
Additionally, half a dozen bugs were fixed, and bumps of the new Oasis Core, oasis-boot, and rofl-containers were made, resulting in 30 pull requests merged over the last two months!
Network Updates
April and May were lively months in terms of network upgrades.
Following the Oasis Core 25.1 release on March 31, it was finally proposed on Testnet on April 1 and on Mainnet on April 10. Check out the March engineering report to learn about the new marketplace and automatic upgrade features. Additionally, Sapphire 0.10.1-testnet and Cipher 3.3.1-testnet were proposed on April 11 on Testnet.
The new Oasis Core 25.2 release was made in April, then tested during the EthDam 2025 conference and hackathon, and subsequently proposed on Mainnet on May 20. Next, the new Oasis Core 25.3 was proposed on Testnet on May 21 and was deployed on Mainnet the following day. Finally, Sapphire 0.10.3 and Cipher 3.3.3 were proposed on May 8 on Mainnet.
Mainnet highlights
In April and May, the number of daily transactions on Sapphire Mainnet ranged from 12,000 to 30,000, with spikes of 103k, 117k, 122k, and 104k transactions on April 10 and 24 and May 16 and 23. April’s daily average was 25k transactions, and May’s average was 31k transactions.
Emerald Mainnet was calm in the 3k-4k range. No outstanding traffic was recorded. April’s average was 3,463 transactions per day, and May’s was 3,730 transactions.
As of April 30 and May 31, the Mainnet nodes were well decentralized:
- 117 (116) validator nodes in April, 114 in May
- 6 (6) key manager nodes in April, 6 in May
- 41 (41) Cipher compute nodes in April, 40 in May
- 57 (57) Emerald compute nodes in April, 55 in May
- 35 (35) Sapphire compute nodes in April, 34 in May
One major, roughly 4-hour outage was encountered on May 29 of the Oasis services that require Trusted Execution Environments such as Sapphire and Cipher ParaTimes. Due to a rare bug in the Rust CBOR decoder library, the key manager committee election during the epoch transition was unsuccessful.
As a result, no per-contract secret keys were provided to Sapphire nodes anymore until the bug was fixed and the committee was reelected. Once the Oasis nodes running the key manager committee were upgraded, TEE ParaTimes started to operate normally again.
No other major outages were reported for Oasis Foundation-provided services in April and May. You can check out the details on the Mainnet status page.
Testnet highlights
The number of daily transactions in April and May on Sapphire Testnet was in the 10k-20k range, with an increase to 40k transactions during the EthDam hackathon May 9-11. The monthly averages in April and May were 12,041 and 18,773 transactions, respectively.
Emerald Testnet was dormant for these months, with a daily transaction count in the 3k range, experiencing a spike on May 25 of 5,619 transactions.
As of April 30 and May 31, the Mainnet nodes were well decentralized (March figures in parenthesis):
- 44 (44) validator nodes in April, 46 in May
- 8 (7) key manager nodes in April, 7 in May
- 18 (17) Cipher compute nodes in April, 18 in May
- 28 (29) Emerald compute nodes in April, 28 in May
- 16 (18) Sapphire compute nodes in April, 17 in May
- 4 (4) Pontus-X compute nodes in April, 3 in May
No major outages were reported for Oasis Foundation-provided services during this time. You can check out the details on the Testnet status page.
Nexus and Explorer
Nexus
The Nexus team primarily focused on implementing the ROFL marketplace, optimizing speed, and adding other convenient features. Currently, only the tokens that follow the ERC-20 standard are indexed, which includes implementing both the interface and the behavior, such as emitting events. Now, tokens that don’t emit events are also correctly indexed (for example, the bitUSD token) (#986, #981). Both new and historic transactions are indexed this way. On the other hand, some contracts are recognized as candidates based on the log-emitting addresses (#1027). Support for EIP-1559 transactions was added (#1023).
A new endpoint for fetching a specific ROFL replica has been added—sometimes referred to as an “ROFL instance” (#982). A new analyzer module for the ROFL marketplace was added (#987, #998, #1009). Filtering by ROFL app names or EVM token names is now possible (#1026, #1007, #997, #466).
Speed optimizations and new indexes were implemented for “related” transactions associated with a ParaTime account (#969, #967, #1012). Queries for filter combinations that aren’t indexed are now prohibited to avoid extra server load (#971). Another backend optimization worth mentioning is a periodic call to VACUUM ANALYZE on a materialized view in PostgreSQL, which saves roughly 400GB of database storage (#1029).
On consensus, each Oasis node running the validator code has an address. These accounts are now correctly associated with the actual validator and their entity (#1003, #1006). Additionally, only the node and entity addresses were previously indexed. While this is enough to uniquely identify a node and send tokens to it, it is not enough to verify their signature. In this case, you need the corresponding public key (also called a “preimage”). Node and Entity address preimages on consensus are now indexed as well and associated with their address (#1001, #1011).
An interesting change was also made on the CI front. The test artifacts grew so much that storing them on git LFS became too expensive. So they were moved over to the Amazon S3 bucket now (#957).
The Nexus team followed the “release early, release often” principle, making 11 new releases and deployments to nexus.oasis.io available to the Oasis Explorer and other indexer users! Apart from the described features and the releases, several smaller bugs were fixed, resulting in 63 merged pull requests in April and May!
Explorer
The Explorer team introduced a brand-new user interface for ROFLs, improved token-related pages, and added a few other convenient features.
A new ROFL app page was added, including its metadata, transactions, policy, and replicas (#1777, #1934, #1840, #1841, #1842, #1848, #1851, #1853, #1861, #1863, #1891, #1894, #1935, #1960, #1962) and a new ROFL replica page (#1895). The ROFL apps are now searchable (#1859, #1973).
Token icons and origins are now fetched from the indexed metadata and shown (#1909, #1945). The transaction details page now shows the first 10 ERC-20 transfers in the info card (#1939). The token page layout while loading was polished (#1926). The token amounts in transaction events are now properly formatted based on the actual token (#1845, #1884, #1885, #1927, #1902). Contracts that are also tokens have been removed from search results (#1948). The “amount_change” in allowance transactions is now prefixed by “+” or “-” (#1855). Undelegate transactions now contain the number of shares in the list of transactions instead of zero (#1892). NFT description is now shown on the NFT page (#1868, #1900).
Partially verified smart contracts are now distinguished from fully verified ones (#1888). The smart contract source code is now displayed inside the Explorer (#1890). Further, a Monaco Editor for contract source code syntax highlighting was integrated (#1979).
Mobile users will be pleased that the new adaptive horizontal trimmer has been merged, which correctly displays the transaction and account addresses even when the cards are stacked vertically (#1963, #1970, #1998, #2000).
The team released four new Explorer versions in April and May. The latest one is already deployed at explorer.oasis.io. In total, 89 pull requests were merged.
Developer Platform and Paratime Updates
The Oasis SDK team merged a series of ROFL Marketplace bug fixes and improvements. A new ROFL scheduler was introduced (#2179). This is a ROFL app that schedules other ROFLs on your node based on the selected ROFL provider. It also listens to any machine-related transactions onchain, such as stopping or restarting the ROFL replica.
When the ROFL machine expiration is due, it takes care of shutting down the ROFL app and cleaning the storage. A CBOR serialization issue was fixed in the ROFL marketplace when updating ROFL (#2191). Also, a bug was fixed during the storage resize of the existing ROFL instance (#2214). Support for transferring ROFL instances from one node to another was added (#2221).
Another important feature has been added to the confidential runtimes EVM module. A few standardized magic storage slots can now be queried with the “eth_getStorageAt()” call despite the confidential contract state (#2215). An example of this is the EIP-1967 slots, which contain the admin account and the proxy contract address for upgrades. This will enable easier indexing of such contracts and support for standardized upgrades (see our docs) used, for example, by the Hyperlane smart contracts.
The Delegate events now include the number of shares and the epoch for easier indexing (#2226). Also, a new “SharesToTokens” method was added for easier conversion between the delegated shares and actual tokens (#2198).
The team made a series of Oasis SDK-related releases:
- TypeScript and Web client v1.2.0 were released on May 13.
- Go client v0.13.1 released on April 2, v0.13.2 released on April 10, v0.14.0 released on April 28, v0.4.0 was released on April 2, and v0.15.0 released on May 28.
- ROFL containers v0.5.0 released on April 28, v0.5.1 released on May 16
- ROFL dev Docker image v0.1.0 released on April 17.
- ROFL scheduler v0.1.0 released on May 8, v0.1.1 released on May 16, v0.1.2 released on May 21
- Runtime SDK: v0.13.1 released on April 2, v0.13.2 released on April 10, v0.13.3 released on April 11, v0.14.0 released on April 28, v0.14.1 released on May 11.
- Contract SDK v0.4.1 released on May 11.
The Oasis Core and rust toolchain dependencies were also bumped to their latest versions. In total, 27 pull requests were merged in April and May.
The Sapphire team gradually improved the confidential tooling and fixed a number of bugs. The Python client was bumped to use web3.py v7.x (#540) and made a corresponding new oasis-sapphire-py v0.4.0 release on April 8.
The WAGMI wrapper now supports multi-wallet providers as defined in EIP-6963 (#550, #577). Dappwright e2e tests were extended to include wallet account switching as well (#569). A new @oasisprotocol/sapphire-wagmi-v2 v2.1.0 release was made incorporating EIP-6963 on May 9.
In a general sapphire-paratime package, throwing error on “eth_chainId” request when a non-Sapphire chain is currently selected was fixed (#584). For a more convenient developer experience, a pre-populated list of Sapphire networks is now part of the sapphire-paratime wrapper compatible with “wallet_addEthereumChain” (#555). A new @oasisprotocol/sapphire-paratime v2.2.0 release was made on May 22 featuring the described changes.
An important update was being made to our Sapphire CI workflows for Typescript-based packages. Those were updated to use corepack and install dependencies with frozen lockfile (#576). This prevents any potential supply chain vulnerabilities during future deployments.
Finally, Foundry users will be happy to know that Soldeer—a native package manager and repository for Foundry—is now fully supported. Any new version of the @oasisprotocol/sapphire-contracts package on npmjs.com will automatically trigger uploading it to Soldeer as @oasisprotocol-sapphire-contracts (#566).
Three new Testnet and one Mainnet version of the Sapphire ParaTime were released in April and May. The releases were based on the new versions of Oasis Runtime SDK that brought ROFL marketplace components into production:
- v0.10.1-testnet released on April 10.
- v0.10.2-testnet released on April 13.
- v0.10.3-testnet released on April 30.
- v0.10.3 released on May 6.
Similar to Sapphire, the Cipher ParaTime was updated and is based on the recent Runtime SDK with support for ROFL:
- v3.3.1-testnet released on April 10.
- v3.3.2-testnet released on April 13.
- v3.3.3-testnet released on April 30.
- v3.3.3 released on May 6.
The Key manager ParaTime was also updated and is now based on the recent Oasis Core 25.2 codebase (#18). Two new releases were made:
- v0.6.0 released on May 28.
- v0.6.0-testnet released on May 5.
The Oasis Web3 Gateway team made a v5.2.0 maintenance release on May 20, updating the Oasis Core, Emerald, and Sapphire codebase. The Sapphire and Emerald Localnet docker images were also bumped to include the recent changes.
Documentation:
- A new ParaTime Observer node chapter was added under the Run your node part as a special kind of a ParaTime client node running on a TEE capable hardware (#1190)
- A new ROFL quickstart chapter was added that guides you through building a fully confidential Telegram bot in Python using the latest Oasis ROFL tooling (#1198)
- ROFL features has a new section about how to set up persistent volumes (#2210).
- Sapphire contracts API: The “contextOrHash” parameter was fully documented, as well as providing code examples for Sapphire.sign() and Sapphire.verify() (#574)
The Oasis Playground features two new voting dApp projects: dapp-votee and dapp-blockvote (#115). The CI now automatically deploys the recent version publicly (#119). Also, a number of smaller bugs were fixed, resulting in 8 pull requests merged in April and May.
Core Platform Updates
The Core team continued its excellent work in ensuring the Oasis network runs smoothly. The following notable new features were introduced:
- A new "GetLatestHeight" consensus method was added to retrieve the height of the latest block (#6144) and "GetBlockResults" (#6180), which are needed by the planned stateless client node to serve events.
- Support for a component managing other bundles was added (#6119). This opened the door to building the ROFL scheduler app.
- CometBFT consensus updates:
- Apps were decoupled from client services (#6148). This is useful for planned stateless nodes (e.g., light ROFL nodes), as they can create their own querier with a verified trust root and use read-syncer to fetch state data from a remote node.
- The service client and the backend were simplified (#6137, #6152). The "DeliverCommand" was removed from the consensus service client, making the API clean and limited only to two methods, i.e., "DeliverBlock" and "DeliverEvents." As a result, anyone with access to blocks and events can now run the service client.
- Immutable state was revamped (#6141). These changes unify constructors for both immutable and mutable states, allowing us to query the state using a remote tree.
- To initialize the CometBFT light client, a valid, trusted light block is required. However, if no peers are available at startup or if the available peers do not have the requested light block, initialization fails. This causes consensus state synchronization from a checkpoint to fail, and the node must be restarted. To address this issue, we implemented lazy initialization (#6163) for the client. If initialization fails initially, the system will retry initialization on subsequent requests.
- The pruner was updated (#6183) to begin pruning only when at least one block is available in the database, preventing it from attempting to remove all versions starting from 0, which previously led to cluttered logs.
- Consensus updates:
- The peer registry is now optional (#6202). These changes allow us to create the P2P service without relying on consensus. The service can now be instantiated upfront and shared with other components immediately. Previously, the light client could only be initialized lazily after the P2P service was registered, which was not suitable for a planned stateless client node.
- The method "GetSignerNonce" was deprecated (#6207) and will be removed in the future, as it does not belong in the core consensus backend. Callers should retrieve the nonce via the account query in the staking backend instead.
- New "Log manager" (#6197). Components can access logs of the bundles they deployed via the API as long as they have the proper "log_view" permissions. This is especially useful for ROFL components, allowing their admins to safely retrieve the corresponding logs.
- Runtime: Add configurable CID pool (#6159). This enables the running of multiple TDX-enabled Oasis nodes (e.g., inside Docker containers) that share the same TEE hardware.
The team made two releases:
In total, 44 pull requests were merged in April and May.
What’s Next?!
That wraps it up for now. There are big things in process for the remainder of this summer so be sure to revisit the Oasis blog for more updates at the end of this month. Meanwhile, chat more with the Oasis team by joining the Oasis Discord or the Oasis Forum. Also, check out this post to learn some of the latest on ROFL.