<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Bonadocs Engineering]]></title><description><![CDATA[Bonadocs Engineering]]></description><link>https://blog.bonadocs.com</link><generator>RSS for Node</generator><lastBuildDate>Sat, 23 May 2026 02:49:16 GMT</lastBuildDate><atom:link href="https://blog.bonadocs.com/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Distributed User Interfaces]]></title><description><![CDATA[Interoperability is a core ethos of web3, both in terms of engineering and usage. On the contract engineering end, contracts are seen as the epitome of interoperability; however, the app layer is equally, if not more critical because that’s how the u...]]></description><link>https://blog.bonadocs.com/distributed-user-interfaces</link><guid isPermaLink="true">https://blog.bonadocs.com/distributed-user-interfaces</guid><category><![CDATA[Web Development]]></category><category><![CDATA[Web3]]></category><dc:creator><![CDATA[Bonadocs Engineering]]></dc:creator><pubDate>Fri, 01 Aug 2025 05:25:34 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1754025836597/14e25fd7-b3a5-4540-9b6d-17d9d30fe793.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Interoperability is a core ethos of web3, both in terms of engineering and usage. On the contract engineering end, contracts are seen as the epitome of interoperability; however, the app layer is equally, if not more critical because that’s how the user interacts with the protocol. </p>
<p>The app layer is a particularly interesting concept because it serves as the entry point for introducing the protocol's functionality to an end user. It bridges the gap between the technical intricacies of smart contracts and the user’s ability to interact seamlessly with decentralised systems. By focusing on intuitive design and accessibility, the app layer ensures that the usefulness of web3 is not limited to developers but extends to actual users.</p>
<p>Contracts are inherently permissionless and can be integrated by any third-party app or client-side, making it easy to circumvent extra transaction fees on major apps and wallets. Third-party apps can help protect users, especially from a security angle. For instance, users can still withdraw funds in cases where the main protocol app gets hacked or attacked. </p>
<p>For example, Safe went through a Bybit exploit earlier in 2025 and recommended alternative interfaces for Safe wallet users to access their funds while the main app was restricted.</p>
<p><a target="_blank" href="https://x.com/safe/status/1893012725602885911">https://x.com/safe/status/1893012725602885911</a>  </p>
<p>The goal of distributed UIs is to simply ensure that we have multiple frontends that allows users access the functionality of the same protocol. This has to be done in a way that’s censorship-resistance by builders’ that are incentivised to create apps on top of the existing protocol. </p>
<p>In June, the EF released a new treasury policy that prioritises core defipunk characteristics, particularly extending decentralisation to the applications. The idea is to ensure permissionless  access to smart contract interactions and functionality without KYC.</p>
<p><a target="_blank" href="https://blog.ethereum.org/2025/06/04/ef-treasury-policy">https://blog.ethereum.org/2025/06/04/ef-treasury-policy</a>  </p>
<p><img src="https://paper-attachments.dropboxusercontent.com/s_E98B62AFB938EDAB17EB2082BF29EC0566309AC51F740EC48297F25229934689_1753879412269_Screenshot+2025-07-30+at+13.42.05.png" alt /></p>
<p>This article would touch on the <code>Distributed UIs</code> section above and how protocols can realistically work on making this possible.</p>
<h2 id="heading-how-can-protocols-enable-their-own-distributed-uis">How can Protocols Enable their own Distributed UIs</h2>
<p>For the most part, protocols have been enabling distributed interfaces by funding startups and projects leveraging their protocols through the following methods:   </p>
<ul>
<li><p><strong>Running accelerator/incubators for startups:</strong> </p>
<p>  A sustainable way for protocols or networks to support external applications is to set up a proper accelerator system where selected startups build on the protocol. </p>
<p>  Usually, this arrangement takes the form of VC investments where the protocol takes equity from the startups in exchange for funding. A good example of this is <a target="_blank" href="https://www.blizzard.fund/">the Blizzard Fund by Avalanche</a>.</p>
</li>
</ul>
<ul>
<li><p><strong>Giving grants to specifically build the UI and deploy on IPFS</strong></p>
<p>  Offering one-off grants to small engineering teams to just rebuild the existing protocol application and host it on IPFS. The engineering team simply applies with a proposal covering milestones, cost, and deliverables. Then, the selection team evaluates their proposal, team experience, capability, etc, and chooses the best teams to execute the project.</p>
</li>
</ul>
<ul>
<li><p><strong>Giving grants to third-party startups</strong></p>
<p>  Grants to third-party startups are the combination of <strong>(1)</strong> and <strong>(2)</strong> above. The protocol creates a grant program that targets existing startups that are leveraging their contracts and offers them one-off grants without equity requirements. Both parties agree on the deliverables, and the funds are paid based on milestones. This acts as one-off support to the startups.</p>
</li>
</ul>
<ul>
<li><p><strong>Building and maintaining it yourself as part of your CI/CD pipeline</strong></p>
<p>  This is the least reliable method. The internal engineering team of the protocol simply includes IPFS deployment for their apps. So, once the actual app deployment is done, there’s a backup IPFS deployment that’s added to the pipeline by default. The downside to this is that if there’s an exploitable bug on the main protocol app, it’ll also reflect on the IPFS version. Although it’ll still protect you in terms of centralised hosting services taking down your app for whatever reason.</p>
</li>
</ul>
<h2 id="heading-centralised-vs-decentralised-hosting">Centralised vs Decentralised Hosting</h2>
<p>Application deployment in web3 today is usually done on centralised services like Digital Ocean, Vercel, AWS, Netlify, etc. Protocols rely on them even though they aren’t censorship-resistant because there’s the ease of use, established ecosystems, support, and less setup required to make it work.</p>
<p>As we continue to grow the web3 ecosystem, we need to grow reliable tooling and advocacy for decentralized hosting of applications. IPFS offers a way to set up hosting as shown below, but it’s still wonky and requires multiple moving parts to make it work. We still need an out-of-the-box tooling like Vercel to enable the adoption of decentralised hosting. We believe this will need to be funded by the ecosystem due to the complexity required to set up such a service for a niche market.</p>
<p><strong>Tutorial on IPFS hosting:</strong> <a target="_blank" href="https://youtu.be/ZRrPBqqFKFU">https://youtu.be/ZRrPBqqFKFU</a></p>
<p><strong>IPFS hosting docs:</strong> <a target="_blank" href="https://docs.ipfs.tech/how-to/websites-on-ipfs/custom-domains/#cid-signaling-with-dnslink">https://docs.ipfs.tech/how-to/websites-on-ipfs/custom-domains/#cid-signaling-with-dnslink</a></p>
<h2 id="heading-transparent-contract-interaction">Transparent Contract Interaction</h2>
<p>Bare bones contract interaction not only creates a form distributed UI but enables transparency in a way that the user can not only interact with the contract but can see the live frontend code and contract ABI that they’re interacting with. There’s the point of interacting with contracts on a trusted platform like Etherscan, but that’s not practical for real-life actions done by users. A better option would be to use a smart playground like <a target="_blank" href="https://bonadocs.com/">Bonadocs</a>. </p>
<p><img src="https://paper-attachments.dropboxusercontent.com/s_E98B62AFB938EDAB17EB2082BF29EC0566309AC51F740EC48297F25229934689_1754023106601_Screenshot+2025-08-01+at+05.38.02.png" alt /></p>
<p><img src="https://paper-attachments.dropboxusercontent.com/s_E98B62AFB938EDAB17EB2082BF29EC0566309AC51F740EC48297F25229934689_1754023106643_Screenshot+2025-08-01+at+05.38.09.png" alt /></p>
<p>It allows developers to import their contracts and set up interactions for each contract method and user actions using <a target="_blank" href="https://docs.ethers.org/v5/">ethers</a> and <a target="_blank" href="https://viem.sh/docs/getting-started">viem</a>.  This means users can read and see the ABI, view/edit the frontend code, before interacting with it.</p>
<p><strong>Sample playground:</strong> <a target="_blank" href="https://playground.bonadocs.com/contracts?public=49-101">https://playground.bonadocs.com/contracts?public=49-101</a></p>
<p><strong>Try it out here:</strong> <a target="_blank" href="http://docs.bonadocs.com/">http://docs.bonadocs.com/</a></p>
<h2 id="heading-conclusion">Conclusion</h2>
<p>Distributed UIs are still a niche phenomenon even for the established protocols in the space. To make it the default process, protocols need to ensure that we have the right tooling that abstracts complexities and mirrors the ease and reliability of centralised hosting services.</p>
]]></content:encoded></item><item><title><![CDATA[Testnets vs Simulation Engines]]></title><description><![CDATA[Building decentralised applications requires new technologies to enable easy development. Today, frontend integrations require a combination of smart contracts and backend APIs to perform on-chain/off-chain actions, retrieve on-chain data, index the ...]]></description><link>https://blog.bonadocs.com/testnets-vs-simulation-engines</link><guid isPermaLink="true">https://blog.bonadocs.com/testnets-vs-simulation-engines</guid><dc:creator><![CDATA[Bonadocs Engineering]]></dc:creator><pubDate>Fri, 18 Jul 2025 11:32:29 GMT</pubDate><enclosure url="https://cdn.hashnode.com/res/hashnode/image/upload/v1752847331501/61d4ddda-c162-4405-ba0d-fc5b872d52d1.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Building decentralised applications requires new technologies to enable easy development. Today, frontend integrations require a combination of smart contracts and backend APIs to perform on-chain/off-chain actions, retrieve on-chain data, index the data, store, and manipulate the data in our database.</p>
<p>The technology to be used depends on the project's needs; for some, more stringent on-chain interactions and immutable storage using IPFS are required. For other use-cases like crypto ramps, they require KYC, contracts to perform the ramping, indexers to retrieve transaction data, and store transaction history offline.</p>
<p>To separate the development environment from production. We have two separate deployments (production and staging) for the different project components: frontend, backend, and smart contracts.</p>
<p>In this article, we’re focusing on smart contracts. Before mainnet (read production) deployment, we require a development chain. We have two options:</p>
<ul>
<li><p>Testnets</p>
</li>
<li><p>Simulation engines (Forked chains)</p>
</li>
</ul>
<h1 id="heading-testnets">Testnets</h1>
<p>For as long as I can remember, we’ve had to use testnets to interact with smart contracts in development. This acts as a staging environment that mirrors the mainnet, where we deploy contracts and interact with them on the app. It allows developers to experiment and build stuff in a zero-risk environment without having to pay gas fees and use tokens that have real-life value.</p>
<p>Testing transactions directly on a mainnet is expensive, unrealistic, and irreversible, so developers need an environment where they can reasonably work without these outsized risks. Interactions on a testnet allow you to investigate any error, patch it, monitor edge cases, audit your contracts, as well as educate developers on how the project works, all without mainnet risks.</p>
<h2 id="heading-testnet-setup-for-your-project">Testnet setup For Your Project</h2>
<p>Selecting the right testnet is usually tied to the mainnet of the chain where you want to deploy. Technically, if your app is going to live on <a target="_blank" href="https://basescan.org/">Base</a>, there’s a good chance you want to deploy on <a target="_blank" href="https://sepolia.basescan.org/">Base Sepolia</a> while developing.</p>
<p>You have to go to <a target="_blank" href="https://chainlist.org/chain/84532">Chainlist</a> and search for Base Sepolia. There, you can select one of the available RPC URLs.</p>
<p><img src="https://paper-attachments.dropboxusercontent.com/s_D77C12A2F88F7CFAB161E2185BBDED3A10FCB7DA6C552BB9E2453DE8D3158F1E_1752642221355_Screenshot+2025-07-16+at+06.03.25.png" alt /></p>
<p>For the faucets, certain protocols or dev tools like Alchemy create faucet providers that can be used for different testnets. In this case, we’re using <a target="_blank" href="https://faucets.chain.link/base-sepolia">Chainlink’s faucet</a>.</p>
<p><img src="https://paper-attachments.dropboxusercontent.com/s_D77C12A2F88F7CFAB161E2185BBDED3A10FCB7DA6C552BB9E2453DE8D3158F1E_1752642690615_Screenshot+2025-07-16+at+05.13.44.png" alt /></p>
<p>We can select different token faucets to use, and each token faucet has different conditions to access the tokens. For instance, this requires that the connected account has at least 1 LINK token on the Ethereum mainnet.  Other faucet providers also have different conditions that can make the experience wonky.  Once you can get past sourcing your necessary tokens, go ahead and use them with your app.</p>
<h1 id="heading-simulation-engines">Simulation engines</h1>
<p>Simulation engines simply fork the mainnet chain to a custom chain. This forked chain can either be stuck at a certain block number or continuously sync with the latest block number on the mainnet. The provided custom chain has all the core dev features that you need, including RPC URLs, faucets, explorers, etc.</p>
<h2 id="heading-simulation-engine-setup-for-your-project">Simulation Engine Setup For Your Project</h2>
<p>To setup your simulation engine, you’d have choose a reliable provider. The ones we’d touch on in this article include:</p>
<ol>
<li><p>Tenderly Virtual Testnet</p>
</li>
<li><p>Buildbear</p>
</li>
</ol>
<p>We’ll focus on exploring both BuildBear and Tenderly virtual testnets individually. After which, we’ll compare both, look at tradeoffs, and how to choose the best platform for your app.</p>
<h2 id="heading-buildbear">Buildbear</h2>
<p><a target="_blank" href="https://www.buildbear.io/">Buildbear</a> provides a <a target="_blank" href="https://www.buildbear.io/phoenix-engine">sandbox</a> environment that’s synonymous to a chain that’s forked from mainnet.  Similarly, it offers features to ease application development and test different edge cases. Developers would create their sandbox and add the network to their wallet. The features includes:</p>
<p><img src="https://paper-attachments.dropboxusercontent.com/s_D77C12A2F88F7CFAB161E2185BBDED3A10FCB7DA6C552BB9E2453DE8D3158F1E_1752758023168_Screenshot+2025-07-17+at+14.11.21.png" alt /></p>
<ol>
<li><strong>Explorer:</strong> They provide an explorer for your forked network where you can view transaction details and on-chain interactions.</li>
</ol>
<p><img src="https://paper-attachments.dropboxusercontent.com/s_D77C12A2F88F7CFAB161E2185BBDED3A10FCB7DA6C552BB9E2453DE8D3158F1E_1752758184694_Screenshot+2025-07-17+at+14.14.31.png" alt /></p>
<ol start="2">
<li><p><a target="_blank" href="https://www.buildbear.io/docs/plugins/blockscout-f2db6af75244"><strong>Plugins:</strong></a> This is a repository of external plugins that can be plugged into buildbear. For example, you can use the Blockscout plugin to enable a better block explorer than the native explorer. One thing to note is that it’s a paid feature under Buildbear.</p>
</li>
<li><p><strong>RPC URL</strong>: They provide a RPC that you’ll use for interactions in our staging app.</p>
</li>
</ol>
<pre><code class="lang-javascript"><span class="hljs-comment">// Using ethers to interact with the forked network</span>

<span class="hljs-keyword">const</span> provider = <span class="hljs-keyword">new</span> ethers.JsonRpcProvider(BUILDBEAR_RPC_URL);

<span class="hljs-keyword">const</span> signer = Wallet.fromPhrase(Mnemonic.fromEntropy(ethers.randomBytes(<span class="hljs-number">24</span>)).phrase, provider);
</code></pre>
<ol start="3">
<li><strong>Faucets:</strong> The faucet feature allows you to get both native tokens and other ERC20 tokens. It’s a dedicated faucet for just your forked network. Tokens include stablecoins, BNB, MATIC, LINK, etc.</li>
</ol>
<p><img src="https://paper-attachments.dropboxusercontent.com/s_D77C12A2F88F7CFAB161E2185BBDED3A10FCB7DA6C552BB9E2453DE8D3158F1E_1752759669581_Screenshot+2025-07-17+at+14.40.54.png" alt /></p>
<ol start="5">
<li><strong>One Click Deploy:</strong> This allows you to deploy pre-built and audited OpenZeppelin contracts. This includes different standard contracts such as auction, ERC20 contracts, NFTs, and reward contracts.</li>
</ol>
<p><img src="https://paper-attachments.dropboxusercontent.com/s_D77C12A2F88F7CFAB161E2185BBDED3A10FCB7DA6C552BB9E2453DE8D3158F1E_1752762082977_Screenshot+2025-07-17+at+15.21.10.png" alt /></p>
<ol start="6">
<li><p><strong>Verify Contracts:</strong> You can deploy and verify contracts on the forked network. You can verify this using foundry, hardhat, sourcify, and etherscan.</p>
</li>
<li><p><a target="_blank" href="https://www.buildbear.io/docs/plugins/timeAdvancement-c8d63ad69599">Time advancement</a>: This allows you to set the time of your forked network and test your protocol under certain time conditions. The only downside is that you can’t reset the advanced time once you’ve set it.</p>
</li>
<li><p><strong>CI/CD:</strong> The CI/CD feature allows you to connect your GitHub, add Buildbear to your CI/CD pipeline, and enable the necessary workflow.</p>
</li>
</ol>
<p><img src="https://paper-attachments.dropboxusercontent.com/s_D77C12A2F88F7CFAB161E2185BBDED3A10FCB7DA6C552BB9E2453DE8D3158F1E_1752761252855_Screenshot+2025-07-17+at+15.05.25.png" alt /></p>
<h2 id="heading-tenderly-virtual-testnet">Tenderly Virtual Testnet</h2>
<p><a target="_blank" href="https://docs.tenderly.co/virtual-testnets">Tenderly</a> offers an extensive array of features to simplify development of simple and complex app features. These includes:</p>
<ol>
<li><strong>Faucets</strong>: They provide a dedicated faucet that has no conditions. The faucet works not only for the native currency, but also for different tokens that are mostly used in transactions. Including stablecoins, WBTC, WETH, etc. Plus, you can deploy your own ERC 20 tokens and just fund them using the token’s contract address.</li>
</ol>
<p><img src="https://paper-attachments.dropboxusercontent.com/s_D77C12A2F88F7CFAB161E2185BBDED3A10FCB7DA6C552BB9E2453DE8D3158F1E_1752752986916_Screenshot+2025-07-17+at+07.46.26.png" alt /></p>
<ol start="2">
<li><strong>Public/Admin RPCs</strong>:</li>
</ol>
<p>They provide two different RPCs: Public and Admin RPCs.</p>
<p><img src="https://paper-attachments.dropboxusercontent.com/s_D77C12A2F88F7CFAB161E2185BBDED3A10FCB7DA6C552BB9E2453DE8D3158F1E_1752752956264_Screenshot+2025-07-17+at+01.11.25.png" alt /></p>
<p>The <strong>public RPC</strong> functions act like a standard node provider RPC, supporting <a target="_blank" href="https://docs.metamask.io/services/reference/ethereum/json-rpc-methods/">all standard RPC methods</a> along with custom Tenderly methods for tracing and simulating transactions.</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> provider = <span class="hljs-keyword">new</span> ethers.JsonRpcProvider(TENDERLY_PUBLIC_RPC_URL);

<span class="hljs-keyword">const</span> signer = Wallet.fromPhrase(Mnemonic.fromEntropy(ethers.randomBytes(<span class="hljs-number">24</span>)).phrase, provider);

<span class="hljs-keyword">const</span> result = <span class="hljs-keyword">await</span> provider.send(

    <span class="hljs-string">"tenderly_suggestGasFee"</span>,
    Ï
    [] <span class="hljs-comment">// No parameters needed for this specific method</span>

);This is the RPC you’ll use to integrate into your dapp’s UI or backend when you’re ready to demo your dapp externally.
</code></pre>
<ul>
<li><a target="_blank" href="https://docs.tenderly.co/virtual-testnets/admin-rpc">Admin RPC URLs</a> even allows you to perform even more complex edge cases. For example, evm_increaseTime is an admin method that allows you to fast-forward time on the blockchain. After which, we can mine a new block with evm_mine, and trigger a time-based operation (like interacting with a vault unlock contract) that should be in the future.</li>
</ul>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> provider = <span class="hljs-keyword">new</span> ethers.JsonRpcProvider(TENDERLY_ADMIN_RPC_URL);

<span class="hljs-keyword">const</span> signer = Wallet.fromPhrase(
    Mnemonic.fromEntropy(ethers.randomBytes(<span class="hljs-number">24</span>)).phrase,
    provider,
);

<span class="hljs-comment">// 3. Use evm_increaseTime to fast-forward time</span>
<span class="hljs-keyword">const</span> sevenDaysInSeconds = <span class="hljs-number">7</span> * <span class="hljs-number">24</span> * <span class="hljs-number">60</span> * <span class="hljs-number">60</span>;
<span class="hljs-built_in">console</span>.log(
    <span class="hljs-string">`\nFast-forwarding time by <span class="hljs-subst">${sevenDaysInSeconds}</span> seconds (7 days)...`</span>,
);

<span class="hljs-keyword">await</span> provider.send(<span class="hljs-string">"evm_increaseTime"</span>, [sevenDaysInSeconds]);

<span class="hljs-comment">// Note: After increasing time, you must mine a new block for the timestamp change to take effect.</span>
<span class="hljs-keyword">await</span> provider.send(<span class="hljs-string">"evm_mine"</span>, []);

<span class="hljs-comment">// call required method</span>
In <span class="hljs-built_in">this</span> <span class="hljs-keyword">case</span>, one can update time <span class="hljs-keyword">as</span> many times <span class="hljs-keyword">as</span> necessary.
</code></pre>
<ol start="3">
<li><p><a target="_blank" href="https://docs.tenderly.co/virtual-testnets/testnet-explorer"><strong>Explorer</strong></a>:</p>
<p> The explorer allows you to view your blockchain transactions and manipulate the blockchain state. Interestingly, they allow you to have public and private explorers. The private explorer allows you to view the different features:</p>
<ul>
<li><p><strong>Explorer</strong>: Overview of all the transactions executed on your Virtual TestNet, similar to any block explorer</p>
</li>
<li><p><strong>Contracts</strong>: Explorer for contracts you’re monitoring (watched contracts) and contracts deployed on the Virtual TestNet (virtual contracts)</p>
</li>
<li><p><strong>JSON-RPC calls</strong>: Explorer for all the RPC methods executed on your Virtual TestNet</p>
</li>
<li><p><strong>Wallets</strong>: Explorer for the wallets you’re monitoring (watched wallet) on your Virtual TestNet</p>
</li>
</ul>
</li>
</ol>
<p>    For the public explorer, we can select the level of visibility for smart contracts deployed on our testnet:</p>
<ul>
<li><p><strong>None</strong>: No access is provided to any virtual contracts; only publicly verified contracts on the parent network are visible.</p>
</li>
<li><p><strong>ABI-only</strong>: Only the ABI of your contracts is accessible, but not the source code.</p>
</li>
<li><p><strong>Full</strong>: Allows complete visibility of all virtual contracts deployed on your TestNet through the public explorer.</p>
</li>
</ul>
<ol start="4">
<li><a target="_blank" href="https://docs.tenderly.co/virtual-testnets/state-sync"><strong>State Sync on Virtual TestNets:</strong></a> This is a feature that allows you to sync with the mainnet, meaning the network state syncs live with what’s live on the mainnet.</li>
</ol>
<p><img src="https://paper-attachments.dropboxusercontent.com/s_D77C12A2F88F7CFAB161E2185BBDED3A10FCB7DA6C552BB9E2453DE8D3158F1E_1752753104862_Screenshot+2025-07-17+at+12.50.16.png" alt /></p>
<h2 id="heading-zimulatoor">Zimulatoor</h2>
<p><a target="_blank" href="https://www.npmjs.com/package/@bonadocs/zimulatoor">Zimulatoor</a> is a simulation engine from <a target="_blank" href="https://bonadocs.com/">Bonadocs</a>. It creates a SimulationProvider that allows devs to create simulated signers for any address, which is used to initialise the contracts and make queries. This simulated provider works for any account and doesn't require you to bring in the private key. It’s only available and built into <a target="_blank" href="https://docs.bonadocs.com/docs/guides/Playground/Contracts/Action">actions in the Bonadocs contract playground</a>:</p>
<pre><code class="lang-javascript"><span class="hljs-keyword">const</span> { Contract, formatUnits, parseUnits, BigNumber, ZeroAddress } = ethers;

<span class="hljs-keyword">const</span> { <span class="hljs-attr">address</span>: sablierV2LockupLinearAddress, <span class="hljs-attr">abi</span>: sablierV2LockupLinearAbi } =
    bonadocs.contracts.SablierV2LockupLinear;

<span class="hljs-keyword">const</span> { SimulationProvider } = zimulatoor;

<span class="hljs-keyword">const</span> chainId = <span class="hljs-number">1</span>;

<span class="hljs-keyword">const</span> provider = <span class="hljs-keyword">new</span> SimulationProvider(chainId);

<span class="hljs-keyword">const</span> wealthyAddress = <span class="hljs-string">"0x1eED63EfBA5f81D95bfe37d82C8E736b974F477b"</span>;

<span class="hljs-keyword">const</span> wealthySigner = <span class="hljs-keyword">await</span> provider.getImpersonatedSigner(wealthyAddress);

<span class="hljs-keyword">const</span> sablier = <span class="hljs-keyword">new</span> Contract(
    sablierV2LockupLinearAddress,

    sablierV2LockupLinearAbi,

    wealthySigner,
);
</code></pre>
<p>It doesn’t require a faucet as long as the wallet you’re using to perform is funded on the mainnet. It also does not have an explorer, and the provider can be obtained without the need for an RPC, just SimulationProvider that you destructure from the in-built zimulatoor variable.</p>
<p>Note: This simulation engine is <strong>experimental</strong> and isn’t ready for prod use.</p>
<h2 id="heading-comparison-between-our-different-chain-environments">Comparison Between Our Different Chain Environments</h2>
<div class="hn-table">
<table>
<thead>
<tr>
<td><strong>Features</strong></td><td><strong>Testnets</strong></td><td><strong>Tenderly Virtual Testnets</strong></td><td><strong>Buildbear</strong></td><td><strong>Zimulatoor</strong></td></tr>
</thead>
<tbody>
<tr>
<td>Faucets</td><td>Faucets with conditions</td><td>Dedicated faucets</td><td>Dedicated faucets</td><td>No faucets</td></tr>
<tr>
<td>Explorer</td><td>Public explorer</td><td>In-built explorer</td><td>In-built explorer</td><td>No explorer</td></tr>
<tr>
<td>Advanced edge case testing</td><td>No tooling for edge case testing.</td><td>Extensive tooling for edge case tooling.</td><td>Extensive tooling for edge case tooling.</td><td>No tooling for edge case tooling.</td></tr>
<tr>
<td>RPC URL</td><td>Public RPC URL</td><td>Dedicated RPC URL</td><td>Dedicated RPC URL</td><td>Built-in RPC URL</td></tr>
<tr>
<td>Sync with parent chain</td><td>Does not sync with parent chain</td><td>Syncs with parent chain</td><td>Does not sync with parent chain</td><td>Syncs with parent chain</td></tr>
<tr>
<td>Time advancement</td><td>Cannot advance time</td><td>It can advance time and revert</td><td>It can advance time and not revert.</td><td>Cannot advance time</td></tr>
</tbody>
</table>
</div><h1 id="heading-conclusion">Conclusion</h1>
<p>The right development environment to use for your application is dependent on the level of complexity that your app requires. A simple use case with no stress test can be handled with a regular testnet and Zimulatoor. At the same time, a more complex app with many edge cases and stress tests should use advanced simulation engines like Buildbear and Tenderly virtual testnet.</p>
]]></content:encoded></item></channel></rss>