Skip to content
This repository has been archived by the owner on Feb 26, 2024. It is now read-only.

Releases: trufflesuite/ganache

v7.3.0

09 Jun 22:19
9416c03
Compare
Choose a tag to compare

 Highlights   New Features   Fixes   Miscellaneous   Changelog   Known Issues   Future Plans 


This is our third feature release since Ganache v7.0.0 launched almost 5 months ago! In this release we introduce not one, but two new features, fix four bugs, perform two chores, and introduce one huge performance improvement!

If you have some time, we encourage you to browse our issues to find anything you'd like implemented/fixed sooner and give them a +1; we'll use this community feedback to help prioritize what we work on! Or better yet, open a new issue, open a PR to fix an existing issue, or apply to join our team (we're hiring!) if you really want to get involved.

Speaking of the awesome community of Ganache users, we'd like to extend our gratitude to all issue openers (@gorbak25, @benjamincburns) and contributors (@robmcl4, @AuHau, @jeffsmale90, @tenthirtyone, @MicaiahReid) who were a part of this release!

All in all, we've changed 154 files across 10 merged pull requests, tallying 4788 additions and 4251 deletions, since our last release.


Highlights

The most noteworthy change in this release is likely the new TypeScript namespace for all RPC method parameters and return types. Check out the details below for more information!

Also worth mentioning is the new --miner.timestampIncrement option. When used in combination with the existing --chain.time option it introduces a new way of ensuring deterministic block timestamps that was previously very cumbersome and tedious to accomplish. Details below.

back to top


New Features


feat: create arm64 architecture docker build at release (#3037)

We now publish a Docker build for ARM v8 (ARM64) with every new ganache release, in addition to our AMD64 build. Now when you run docker run --publish 8545:8545 trufflesuite/ganache:latest on your M1 Mac (and other ARM64-based systems) you'll run a container built specifically for your processor's architecture.

back to new features

feat: add miner.timestampIncrement option (#3131)

We've been told that you all want us to have more meme content in our release notes. This is the best I could do this time (sorry, not sorry):

By default ganache uses the system clock time for automatically mined blocks. This behavior is convenient, but results in nondeterminism, invalid block timestamps1, and can cause issues with relative block timestamp dependent contracts and tests. There were workarounds for all of these issues (by manually mining via evm_mine({ timestamp })) but a built in solution was clearly necessary.

Ganache now enables the use of a new --miner.timestampIncrement option which can be used to set the amount of seconds between consecutive blocks, regardless of how much system time has passed. The default value, "clock", retains the previous default behavior of using the system time for each block.

The following example will start ganache instructing it to increment each new block's timestamp forward by 60 seconds from the initial starting time of 499162860000 (October 26 1985, as a Unix timestamp with millisecond precision):

$ ganache --time 499162860000 --miner.timestampIncrement=60

back to new features

back to top


Fixes


fix: eth_getTransactionByBlockNumberAndIndex and eth_getTransactionByBlockHashAndIndex to respect non-zero transaction index (#3118)

Both eth_getTransactionByBlockNumberAndIndex and eth_getTransactionByBlockHashAndIndex accept an index parameter to indicate the which transaction within the block to return.

Previous to this fix, both functions would return the 0th (first) transaction within the block, regardless of the value passed.

back to fixes

fix: add new Ethereum types namespace to fix types (#2527)

We fixed our Ethereum RPC types and put them in a new namespace: Ethereum! Use it as follows:

import Ganache, {ProviderOptions, Ethereum} from "ganache";

async function getLatestBlock(): Promise<Ethereum.Block> {
  return await provider.request({method: "eth_getBlockByNumber", params: ["latest"]});
}
async function getAccounts(): Promise<string[]> {
  return await provider.request({method: "eth_accounts", params: []});
}
async function sendTransaction(transaction: Ethereum.Transaction): Promise<string> {
  return await provider.request({method: "eth_sendTransaction", params: [transaction]});
}

const options: ProviderOptions = {
  fork: { network: "mainnet" }
};
const provider = Ganache.provider(options);
const accounts  = await getAccounts();
const block = await getLatestBlock();
console.log(block.number); // string
const transaction: Ethereum.Transaction = { from: accounts[0], to: accounts[2], value: "0xffff" };
const hash = await sendTransaction(transaction);
console.log(hash); // string

If you find issues or can think of ways we can further improve our types please open a New Issue (you can view all existing type issues by filtering our issues by the typescript label).

fixes #2134

back to fixes

fix: save evm_mine blocks before returning (#3016)

Though it was rare, sometimes calling evm_mine would return before the mined block was actually saved. If you polled for the block that Ganache had claimed to mine directly after calling evm_mine, that block could not yet exist.

This change ensures that the block is saved before emitting the "newHeads" subscription message and before returning during an evm_mine. Fixes #3060.

Potential Side Effect

This change does have...

  1. The Ethereum Yellowpaper defines: $H_{\mathrm{s}} &gt; P(H){_\mathrm{H_s}}$ where $H{\mathrm{_s}}$ is the timestamp of block $H$ and $P(H)$ is the parent block. Or in other words: a block's timestamp must be greater than its parent block's timestamp.

Read more

v7.2.0

20 May 21:07
8b6ca47
Compare
Choose a tag to compare

 Highlights   New Features   Fixes   Miscellaneous   Changelog   Known Issues   Future Plans 


Not much in this release, as we just wrapped a huge hackathon here at ConsenSys. During the hackathon we got to actually use Ganache on our own project, which is actually not something we do very often, and in doing so found lots of new ways to improve the overall experience, so you can expect some really amazing changes in the weeks to come.

Thanks to @adjisb, @RiccardoBiosas, and @davidmurdoch for their contributions to this release!

We've changed 41 files across 5 merged pull requests, tallying 714 additions and 780 deletions, since our last release.


Highlights

This release brings official Node v18 support to Ganache. Ganache was already working fine in Node v18, but because our tests harnesses were failing in CI we couldn't yet claim full support. Now we can!

back to top


New Features

feat: add __experimental_info export to core (#2529)

This is an internal and private feature for Truffle. Truffle needed a way to programmatically get the list of chains Ganache fully supports in order to enable the dry-run feature for those chains.

This introduces a new experimental and private (this will likely change in a future release!) __experimental_info export:

Readonly<{
  version: string,
  fork: Readonly<{
    /**
     * Chains Ganache is known to be compatible with. Operations performed
     * locally at historic block numbers will use the Ethereum Virtual Machine
     * OPCODEs, gas prices, and EIPs that were active at the time the historic
     * block originally took place.
     */
    knownChainIds: number[],
  }>
}>

back to top


Fixes

fix: enforce eip-2 imposed limits and secp256k1 upper bound for private keys (#2944)

Sending transactions from an impersonated account with a "large" account number, like fffffffffffffffffffffffffffffffffffffffe, would result in the error "The nonce generation function failed, or the private key was invalid" due to the way we fake transaction signing in ganache. Previously we would take the account number plus the first 12 bytes of the account number, fffffffffffffffffffffffffffffffffffffffe + ffffffffffffffffffffffff, and would use that as a fake private key. This results in an invalid key, as secp256k1, the elliptic curve used in Ethereum cryptography, has an effective maximum private key value of 0xfffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140n (AKA secp256k1_n - 1, or the total number of non-trivial points on the curve). This fixes #2586.

While implementing this fix it was discovered that we were not rejecting transactions with too-high s-values; i.e., s-values that are greater than (secp256k1_n - 1) / 2. This restriction was added way back in Ethereum's first hardfork, homestead, as part of EIP-2 in order to remove the possibility of "malleable" transactions. While somewhat unrelated to the core reason for this fix, it has been added as part of this PR. This fixes #2600.

back to top


Miscellaneous


chore: support node 18 (#2988)

Ganache now supports and is tested on Node versions 12.0.0, 12.x, 14.x, 16.x, and 18.x on operating systems Windows 2019, Ubuntu 18.04, Ubuntu 20.04, and macOS 11, with the exception of Node v18 on Ubuntu 18.04, as Ubuntu 18.04 is not supported by Node v18.

Happy upgrading!

back to miscellaneous

docs: add documentation of eth_call overrides (#3007)

This PR adds some documentation of the eth_call overrides object to or RPC method docs, fixing #3002.

back to miscellaneous

chore: update @ethereumjs/vm to v5.9.0, add support for sepolia (#2528)

We've updated @ethereumjs/vm to v5.9.0 and added support for forking the new "sepolia" test network.

back to miscellaneous

back to top


Changelog

back to top


Known Issues

Top Priority:

  • Unable to install Ganache (npm) on MacOS 10.15.7 (#2445)
  • Ganache v7.0.0 - typings are broken (#2134)
  • Add option to set fork block's timestamp to the time the actual block was mined (#2122)
  • get forking working in the browser (#1245)

Coming Soon™:

  • debug_traceTransaction may crash on Node.js v12 (#2106)
  • evm_mine and miner_start don't respect --mode.instamine=eager (#2029)
  • evm_setAccountNonce is race-conditiony (#1646)
  • Add eth_feeHistory RPC endpoint (#1470)
  • @ganache/filecoin@alpha doesn't work with ganache@alpha (#1150)
  • sort executable/pending transactions that have the same price by the time at which the transaction was submitted (#1104)
  • Add eth_createAccessList RPC method (#1056)
  • Launching ganache with fork is throwing revert errors when communicating with 3rd party contracts (#956)
  • Build...
Read more

v7.1.0

28 Apr 17:43
b7db4f3
Compare
Choose a tag to compare

 Highlights   New Features   Miscellaneous   Changelog   Known Issues   Future Plans 


Here comes our first feature release since Ganache v7.0.0! We've worked through a good chunk of the bugs that have been discovered since the release, so we look forward to starting to add some new features! Don't worry, we're still working through bugs as well. Feel free to give any issues that you'd like to see implemented sooner a 👍 and we'll use this community feedback to help prioritize what we work! Or better yet, open a new issue, open a PR to fix an existing issue, or apply to join our team (we're hiring!) if you really want to get involved.

Speaking of the awesome community of Ganache users, we'd like to extend our gratitude to all issue openers (@fabioberger, @szgyuszi1) and contributors (@domob1812, @dekz, @jeffsmale90, @gnidan) who were a part of this release!

We've changed 9 files across 7 merged pull requests, tallying 1235 additions and 188 deletions, since our last release.


Highlights

VM Overrides During eth_call

Ganache now has support for overriding the contract code and storage and the account balance and nonce for simulations with eth_call. This feature is similarly supported by geth.

The eth_call RPC method now accepts a third override parameter which is a map from an address to the desired state of that address. The state object has the following keys, all of which are optional:

balance: QUANTITY - The balance to set for the account before executing the call.
nonce: QUANTITY - The nonce to set for the account before executing the call.
code: DATA - The EVM bytecode to set for the account before executing the call.
state*: OBJECT - Key-value mapping of storage slot to value that will clear all slots and then override individual slots in the account storage before executing the call.
stateDiff*: OBJECT - Key-value mapping of storage slot to value that will override individual slots in the account storage before executing the call.
*Note - state and stateDiff fields are mutually exclusive.

So, an example override object using all fields overriding multiple addresses could look like the following:

const overrides = {
  "0xd9c9cd5f6779558b6e0ed4e6acf6b1947e7fa1f3": { 
    "nonce": "0xa", 
    "balance": "0xffff", 
    "state": { 
      "0000000000000000000000000000000000000000000000000000000000000001": "0xbaddad42baddad42baddad42baddad42baddad42baddad42baddad42baddad42"
    } 
  },
  "0xebe8efa441b9302a0d7eaecc277c09d20d684540": { 
    "code": "0x123456", 
    "stateDiff": {
      "0000000000000000000000000000000000000000000000000000000000000002": "0xbaddad42baddad42baddad42baddad42baddad42baddad42baddad42baddad42"
    } 
  }
};
const transaction = { ... };
const result = await provider.request({ method: "eth_call", params: [ transaction, "latest", overrides ] });

Like all state changes made with eth_call, the changes are ephemeral and only last for that specific run of eth_call. Happy transaction simulating!

back to top


New Features


perf: improve performance of the persistent cache used in forking (#2811)

We've found some small adjustments that could be made to our persistent cache to slightly improve forking performance. Even more forking performance improvements are in the works now, too!

back to new features

feat: allow balance, code, nonce, and state overrides in eth_call (#2565)

This feature was demonstrated in our highlights above. We'd like to give a huge thank you to @domob1812 and @dekz for their initial contributions to this one, you both were a huge help.

The PR introducing this feature uses @dekz's #905 as a starting point, and fixes #554 and #2934.

back to new features

back to top


Miscellaneous


chore: remove outdated warning about EIP-1193 fork providers (#2856)

This PR removes the warning described in #2558 about non-EIP-1193 providers, since Web3.js appears to be sticking with this kind of provider for the foreseeable future.

back to miscellaneous

ci: automated release improvements (#2892)

This change updates the release automation process in a few ways:

  1. Adds a vX.x.x git tag to each release, in addition to the ganache@X.x.x tag that already was automatically added - Fixes #2279.
  2. After a successful "latest" release (into master), merges master back into develop to keep their commit history in sync.
  3. Signs all automation commits from @TrufBot - Fixes #2882.

back to miscellaneous

chore: wrap comment at 80 chars (#2987)

Just some cleanup - nothing to see here 😄

back to miscellaneous

ci: fix release tagging (#2979)

Our initial attempt at this v7.1.0 release did pan out as expected because our automated release process didn't correctly handle minor version changes. This led to the accidental creation of v7.0.5 😅

This PR updates our automated release process to parse through a release's commits, detect feature commits, and set the new release version accordingly (and hey! It looks like it works! Way to go @davidmurdoch).

back to miscellaneous

back to top


Changelog

Read more

v7.0.5

28 Apr 17:43
v7.0.5
3acc35e
Compare
Choose a tag to compare

This version should have been v7.1.0 and has been re-released as such. Release notes are here: https://github.com/trufflesuite/ganache/releases/tag/v7.1.0

v7.0.4

05 Apr 23:32
Compare
Choose a tag to compare

 Highlights   Fixes   Miscellaneous   Changelog   Known Issues   Future Plans 


We've got a few more fixes in this release! But much more importantly we'd like to welcome @jeffsmale90 to the Ganache team! He has hit the ground running and is responsible for three out of five bug fixes today. Welcome to the team, Jeff! We'd also like to thank our issue openers (@PeterYinusa, @robsmith11), PR contributors (@MatthieuScarset), and technical consultants (@cds-amal). Thank you for being a part of this community!

We've changed 26 files across 8 merged pull requests, tallying 584 additions and 150 deletions, since our last release.


Highlights

Disable Rage Quit; Fix Regular Shutdown

Ganache v7 was released with a lovely feature that prevented Ganache from shutting down when some applications (including MetaMask) connect to Ganache and regularly poll for data. This feature was shipped to provide our users with some much needed practice expressing negative emotions as they repeatedly attempt to shut down Ganache, and Ganache says that it recognizes the shutdown signal but fails to shutdown.

Giant panda destroying computer in a fit of rage.

We are, of course, kidding. This issue had multiple causes which are now fixed in this release. Ganache now facilitates graceful shutdown in cases where persistent HTTP connections previously held Ganache open. Thank you all for your patience in waiting for a fix on this issue. 🙏

back to top


Fixes


fix: use host param when passed in server.listen (#2397)

Ganache previously ignored the --host parameter and would always bind to host 127.0.0.1. It now binds to the given host as expected.

back to fixes

fix: correctly pad / truncate in JSON-RPC types, add tests to ethereum-address and json-rpc-data (#2716)

The internal Address class previously wasn't properly padding compressed addresses. This would cause some RPC methods, like evm_addAccount, to add invalid Ethereum addresses. The class will now pad addresses to the correct length, allowing this behavior:

const address = new Address("0x1");
console.log(address.toString()) // 0x0000000000000000000000000000000000000001

which will in turn allow:

const address = "0x1";
const passphrase = "passphrase"
const result = await provider.send("evm_addAccount", [address, passphrase] );

back to fixes

fix: parse port to number type if provided in as string (#2610)

Ganache now allows the port number passed via ganache --port to be a string or a number. This allows the use case where the port is passed directly from args without parsing.

back to fixes

fix: close http connections after http-server.close() has been called (#2667)

As stated in our highlights, Ganache now facilitates graceful shutdown in cases where persistent HTTP connections previously held Ganache open. In the worst case where no requests are received over the persistent connection, Ganache will timeout after 10 seconds.

back to fixes

fix: update @trufflesuite/uws-js-unofficial dependency to silence node12 warnings (#2807)

If you've been using Ganache with nodejs 12, you've probably been bothered by the annoying error stating:

This version of µWS is not compatible with your Node.js build:

Error: node-loader:
Error: Module did not self-register: '/home/workspace/.nvm/versions/node/v12.22.1/lib/node_modules/ganache/dist/node/3wHsIyFE.node'.
Falling back to a NodeJS implementation; performance may be degraded.

This change silences the warning to give you the uncluttered CLI you deserve.

back to fixes

back to top


Miscellaneous


ci: fix test timeouts (#2503)

Tests that used to pass in CI started failing in GitHub Actions due to timeouts. We verified there were no performance regressions on our part, and that these timeouts were caused by GitHub Action runners becoming slower over time. We bumped the test timeout default value to 5 seconds.

back to miscellaneous

refactor: rearrange miner for easier readability (#2514)

We noticed some duplicate branches in a method and simplified it. There's nothing interesting to see here... 🙂

back to miscellaneous

docs: fix example in README (#2789)

The README.md example showing programmatic usage had a bug causing it to fail. The example now works as intended. Thanks again for pointing this out, @MatthieuScarset!

back to miscellaneous

back to top


Changelog

back to top


Known Issues

Top Priority:

  • A rejected transaction should possibly be added back...
Read more

v7.0.3

02 Mar 15:58
Compare
Choose a tag to compare

 New Features   Fixes   Changelog   Known Issues   Future Plans 


We have three new RPC methods and two bug fixes in this release! Thank you to our issue reporter (@robmcl4) and contributors (@rmeissner and @anticlimactic) on this release, we really appreciate it!

We've changed 11 files across 5 merged pull requests, tallying 2874 additions and 24 deletions, since our last release.


New Features

feat: add methods to modify account (#2337)

This PR adds the evm_setAccountBalance, evm_setAccountCode, and evm_setAccountStorageAt RPC methods. Just as their names suggest, these methods let you set the balance, code, and storage (at a specified slot) for an account.

evm_setAccountBalance:

const balance = "0x3e8";
const [address] = await provider.request({ method: "eth_accounts", params: [] });
const result = await provider.send("evm_setAccountBalance", [address, balance] );
console.log(result);

evm_setAccountCode:

const data = "0xbaddad42";
const [address] = await provider.request({ method: "eth_accounts", params: [] });
const result = await provider.send("evm_setAccountCode", [address, data] );
console.log(result);

evm_setAccountStorageAt:

const slot = "0x0000000000000000000000000000000000000000000000000000000000000005";
const data = "0xbaddad42";
const [address] = await provider.request({ method: "eth_accounts", params: [] });
const result = await provider.send("evm_setAccountStorageAt", [address, slot, data] );
console.log(result);

Thanks again to @rmeissner for his awesome work on this PR!

back to top


Fixes


fix: serialize eth_subscribe log data (#2331)

A previous PR (#2331) fixed how we emit logs on eth_subscribe for EIP-1193 "message" event types, but unintentionally broke those messages for the legacy "data" event types. For those of you still using the legacy event types (cough cough Truffle), this fix should get those events working again.

back to fixes

fix: allow hex string for coinbase option in cli (#2405)

The miner.coinbase option allows you to specify the address to which mining rewards will go as a either a string representing the hex-encoded address or a number representing the index of the account returned by eth_accounts. However, a hex address sent with this option was incorrectly interpreted as a (verrrrrry large) number, causing a startup error. This fix correctly parses the argument so that the option can be used as expected.

back to fixes

back to top


Changelog

back to top


Known Issues

Top Priority:

  • Shutting down the Ganache Server v7.0.0 (#2185)
  • A rejected transaction should possibly be added back into the pool (#2176)
  • Ganache v7.0.0 - typings are broken (#2134)
  • Ganache's provider type is not compatible with Web3 (#2125)
  • ganache forking is not working as expected (#2122)
  • Node.js v12 outputs a µWS warning in the console (#2095)
  • evm_mine and miner_start don't respect --mode.instamine=eager (#2029)

Coming Soon™:

  • debug_traceTransaction may crash on Node.js v12 (#2106)
  • evm_setAccountNonce is race-conditiony (#1646)
  • Add eth_feeHistory RPC endpoint (#1470)
  • @ganache/filecoin@alpha doesn't work with ganache@alpha (#1150)
  • sort executable/pending transactions that have the same price by the time at which the transaction was submitted (#1104)
  • Add eth_createAccessList RPC method (#1056)
  • --db Option Requires Same Mnemonic and Network ID (#1030)
  • Launching ganache with fork is throwing revert errors when communicating with 3rd party contracts (#956)
  • Build a real pending block! (#772)
  • Add an upper limit to # of accounts that can be generated by ganache (#736)
  • Incorrect gas cost for SSTORE opcode when using fork feature (#625)
  • Cannot get state root with uncommitted checkpoints error when starting ganache forking with infura RPC endpoint (#618)
  • System Error when sending batch request with 1 not valid item (#402)

back to top


Future Plans

  • Reduce Bundle Size (#2096)
  • Add a way to create or modify arbitrary accounts and storage (#1889)
  • Switch to esbuild to make build times faster/reasonable (#1555)
  • Accept a genesis.json file (#1042)
  • Add flag for starting ganache in detached mode (#1001)
  • Add personal_ecRecover and personal_sign (#995)
  • Support for EIP 1898- Add blockHash to JSON-RPC methods which accept a default block parameter (#973)
  • Opt-in tracking (#945)
  • Mine txs in same block with provided sorting (#899)
  • Add eip-155 support (#880)
  • Add support for debug_accountAt RPC method as implemented by Turbo-Geth (#813)
  • Support IPC endpoint...
Read more

v7.0.2

03 Feb 20:59
Compare
Choose a tag to compare

 Fixes   Changelog   Known Issues   Future Plans 


Two more fixes are ready in this release! Thank you to our issue reporters for these bringing these to our attention (@Ruj89 and @davidmurdoch). It means a lot to us that you use Ganache and want to be a part of making it even better.

In this release we've changed 3 files across 2 merged pull requests, tallying 151 additions and 46 deletions.

Last call for T-shirts

If you helped contribute to Ganache v7 in any way, we tagged you in our v7 release notes to let you know you're eligible to receive a limited edition Ganache T-shirt. We've had many of you claim the goods and want to get these bad boys made, but we want to be sure all of our contributors have had the chance to claim them first. If you're on the list¹ and you're interested, email us at ganache@trufflesuite.com by Thursday, February 10th to claim.


Fixes


Fix how we return logs from eth_subscribe (#2268)

In an oversight on our end, we unintentionally had a breaking change between Ganache v6 and v7 in which we started aggregating event logs and emitting them once for every transaction that triggered them. Ganache v6 was inline with Geth's logging, which emits separately for each event.

With this release we've fixed this behavior to once again be inline with Geth. When using eth_subscribe to subscribe to logs, you can expect each emitted contract event to emit a separate log with the following structure:

{
  type: "eth_subscription",
  data: {
    result: {
        address: address,
        blockHash: blockHash,
        blockNumber: blockNumber,
        data: data,
        logIndex: logIndex,
        removed: removed,
        topics: topics,
        transactionHash: transactionHash,
        transactionIndex: transactionIndex
    },
    subscription: subscriptionId
  }
}

back to fixes

Fix type compatibility with Web3 (#2272) (#4743 in ChainSafe/web3.js)

After the initial release of Ganache v7 we found that our provider type wasn't playing nice with Web3's provider type. After a little digging, we found that both repos had bugs. Our side of the fix is available in this new release, and we've opened a PR in the web3.js repo to fix it on their end. This should be merged in their coming 1.7.1 release. Shout out to the ChainSafe team for getting this merged and for all of the sweet stuff they make.

back to fixes

back to top


Changelog

back to changelog

back to top


Known Issues

Top Priority Issues:

  • evm_mine and miner_start don't respect --mode.instamine=eager (#2029)
  • Ganache forking is not working as expected (#2122)
  • Ganache v7.0.0 - typings are broken (#2134)
  • A rejected transaction should possibly be added back into the pool (#2176)
  • Shutting down the Ganache Server v7.0.2 (#2185)
  • Node.js v12 outputs a µWS warning in the console (#2095)
  • Simulating transactions on Ganache v7 fork throws insufficient funds error (#2162)
  • Ganache's provider type is not compatible with Web3 (#2125)
  • Websocket logs subscription not supported by Geth Client (#2206)

Coming Soon™:

  • evm_setAccountNonce is race-conditiony (#1646)
  • --miner.callGasLimit implementation is wrong (#1645)
  • We don't return a proper pending block (#772)
  • Forking doesn't work in the browser (#1245)
  • Uncles aren't fully supported when forking (#786)
  • Forking may fail in weird and unexpected ways. We need to "error better" here (#615)
  • Node.js v12 doesn't handle memory as well as 14+ and may crash computing very large debug_traceTransaction results (#2106)
  • Our bundle size is larger than ideal (#2096)

back to top


Future Plans

  • Update the eth_maxPriorityFeePerGas RPC method to return as Geth does, eth_gasPrice - baseFeePerGas (#2097)
  • Add support for the eth_feeHistory RPC method (#1470)
  • Support for enabling eligible draft EIPs before they are finalized or considered for inclusion in a hard fork (#1507)
  • New hard fork support well in advance of the hard fork launch (#2099)
  • Add an eth_createAccessList method (#1056)
  • Track test performance metrics over time (#2105)
  • Track real world Ganache usage (opt-in and anonymized) to better tune performance and drive bug fixes and feature development (#2100)
  • Track test coverage (#2101)
  • evm_mine will return the new blocks instead of just 0x0 (#536)
  • Add new evm_setCode and evm_setStorageAt RPC methods (#649)
  • Make evm_snapshot ids globally unique (unpredictable instead of a counter) (#655)
  • Support eth_getRawTransactionByHash RPC method (#135)
  • Support debug_accountAt RPC method (#813)
  • Allow "mining" to be disabled on start up (#248)
  • Set CLI options via config file, package.json, or ENV vars (#2102)
  • Create a CLI interactive/REPL mode (#2103)
  • Enable a CLI daemon mode (#2104)
  • "Flavor" Plugins: We're building support for Layer 2 plugins into Ganache so we can start up and manage other chains. e.g., The ganache filecoin command will look for the @ganache/filecoin package and start up a Filecoin and IPFS server.
  • Multi-chain configurations: you'll be able to start up your project...
Read more

v7.0.1

26 Jan 23:09
v7.0.1
Compare
Choose a tag to compare

 Fixes   Changelog   Known Issues   Future Plans 

Since the release of Ganache v7, we've seen exiting increase in engagement and downloads and an uptick in repo star gazers. Welcome to our new users following along!

Thank you to all of those who have opened issues (@teknoxic, @PeterYinusa, @NikZak, @haseebrabbani, @gorbak25, @fabianorodrigo), you are a huge help and you keep us humble 😅. We've got two fixes out for you today!

We've changed 13 files across 3 merged pull requests, tallying 247 additions and 86 deletions, since our last release.


Fixes


Restructure Errors on eth_call (#2186)

Before this change, errors from eth_call were formatted in our "non-standard" vmErrorsOnRPCResponse format, which uses the error's data property to store some extra helpful information (program counter, hash, etc.):

{
   "error": {
     "message": "...",
     "code": ...
     "data": {
          ... bunch of props, like `hash` and `programCounter`...
         "result": "<raw revert hex string>" <---- this moves (See below)
     }
   }
}

The problem with this approach is that it differs from how a real node handles these errors, causing our users to have to handle eth_call errors differently when using Ganache. Now, the error's data property only contains the raw revert hex string, which should more closely match real node's error handling:

{
   "error": {
     "message": "...", // <- we'll change the message
     "code": ...
     "data": "<raw revert hex string>"  <---- new home
   }
}

Our hope is that this will allow users to remove any conditionals handling errors differently between Ganache and real Ethereum nodes.

back to fixes

Keep an index to latest block in the persisted database (#2196)

Ganache wasn't saving a pointer to the "latest" block correctly, so when a persisted database (the dbPath flag) was restarted after block 255 (2^⁸-1) the "latest" block would always be set to block 255 (this pattern would occur again once blocks reached 2¹⁶ - 1, 2²⁴ - 1, 2³² - 1 and so on). Ganache now tracks the index correctly.

back to fixes

back to top


Changelog

back to changelog

back to top


Known Issues

Top Priority Issues:

  • evm_mine and miner_start don't respect --mode.instamine=eager (#2029)
  • Ganache forking is not working as expected (#2122)
  • Ganache's provider type is not compatible with Web3 (#2125)
  • Ganache v7.0.1 - typings are broken (#2134)
  • Simulating transactions on Ganache v7 fork throws insufficient funds error (#2162)
  • A rejected transaction should possibly be added back into the pool (#2176)
  • Shutting down the Ganache Server v7.0.1 (#2185)
  • Node.js v12 outputs a µWS warning in the console (#2095)

Coming Soon™:

  • evm_setAccountNonce is race-conditiony (#1646)
  • --miner.callGasLimit implementation is wrong (#1645)
  • We don't return a proper pending block (#772)
  • Forking doesn't work in the browser (#1245)
  • Uncles aren't fully supported when forking (#786)
  • Forking may fail in weird and unexpected ways. We need to "error better" here (#615)
  • Node.js v12 doesn't handle memory as well as 14+ and may crash computing very large debug_traceTransaction results (#2106)
  • Our bundle size is larger than ideal (#2096)

back to top


Future Plans

  • Update the eth_maxPriorityFeePerGas RPC method to return as Geth does, eth_gasPrice - baseFeePerGas (#2097)
  • Add support for the eth_feeHistory RPC method (#1470)
  • Support for enabling eligible draft EIPs before they are finalized or considered for inclusion in a hard fork (#1507)
  • New hard fork support well in advance of the hard fork launch (#2099)
  • Add an eth_createAccessList method (#1056)
  • Track test performance metrics over time (#2105)
  • Track real world Ganache usage (opt-in and anonymized) to better tune performance and drive bug fixes and feature development (#2100)
  • Track test coverage (#2101)
  • evm_mine will return the new blocks instead of just 0x0 (#536)
  • Add new evm_setCode and evm_setStorageAt RPC methods (#649)
  • Make evm_snapshot ids globally unique (unpredictable instead of a counter) (#655)
  • Support eth_getRawTransactionByHash RPC method (#135)
  • Support debug_accountAt RPC method (#813)
  • Allow "mining" to be disabled on start up (#248)
  • Set CLI options via config file, package.json, or ENV vars (#2102)
  • Create a CLI interactive/REPL mode (#2103)
  • Enable a CLI daemon mode (#2104)
  • "Flavor" Plugins: We're building support for Layer 2 plugins into Ganache so we can start up and manage other chains. e.g., The ganache filecoin command will look for the @ganache/filecoin package and start up a Filecoin and IPFS server.
  • Multi-chain configurations: you'll be able to start up your project's entire blockchain "ecosystem" from a single ganache command: e.g., ganache --flavor ethereum --flavor filecoin --flavor optimism.
    • this is where defining your CLI options via JSON config will come in very handy!
  • We've laid the groundwork for additional performance improvements. We expect to see an additional 2-5x speed up for typical testing work loads in the near future.

Open new issues (or join our team) to influence what we gets implemented and prioritized.

Read more

v7.0.0

20 Jan 16:04
v7.0.0
Compare
Choose a tag to compare

 Highlights   Upgrade Guide and Breaking Changes   New Features   Changelog   Known Issues   Future Plans 


It's here, it's finally here! The much anticipated (well, at least by us!) Ganache v7 release has now been shipped! This release has been years in the making and we're really proud of the work we've done. We hope you love it as much as we do. If you do, or if you want to keep up with all things Ganache, be sure to give this repository a ⭐ star ⭐.


Thank you to everyone who has been a part of making this release happen — contributors, mentors, reviewers, issue reporters, and community participators have all been instrumental in making Ganache v7. We are immensely thankful to you all:

@davidmurdoch @MicaiahReid @gnidan @eggplantzzz @kevinweaver @cds-amal @haltman-at @kevinbluer @seesemichaelj @tcoulter @nicholasjpaterno @eshaben @CruzMolina @honestbonsai @domob1812 @moda20 @0xGorilla @fedgiac @FFdhorkin @NicsTr @convexman @rainwater11 @aliveli186 @winksaville @anvacaru @nepoche @gas1cent @Fatorin @0xng @wilwade @MatthiasLohr @alexhultman

As a token of our appreciation to our early contributors, we want to send you something real and tangible (sorry, no NFTs at this time 😔). Email ganache@trufflesuite.com and we'll verify your identity to get it sent out to you (you'll just need to cover shipping if you're outside the United States). We want to keep it a little on the down-low to keep people from being jealous, but what we can tell you is that it's exclusive, brown, soft, wearable, with two arm holes (it's a t-shirt).


This is a huge release, so these release notes don't cover everything that's changed. For those gluttons for detail among us that want the comprehensive list, check out the notes from our alpha, beta, and rc releases:

Release Release Date
Ganache@7.0.0-alpha.0 2021/08/26
Ganache@7.0.0-alpha.1 2021/09/21
Ganache@7.0.0-alpha.2 2021/11/12
Ganache@7.0.0-beta.0 2021/11/19
Ganache@7.0.0-beta.1 2021/11/24
Ganache@7.0.0-beta.2 2021/12/20
Ganache@7.0.0-rc.0 2022/01/12

For everyone else, we think these notes do a pretty great job of covering the features and changes that you'll care most about.


Highlights

Forking Got an Upgrade

Ganache's ancestor, Test RPC, was the first tool to introduce forking back in 2016. Ganache 7 takes forking to a new level.

Zero-Config Mainnet Forking

Truffle has partnered with Infura to provide free archive node access to Ganache users. Simply run ganache --fork and BOOM, you've forked mainnet at the latest block.

ganache --fork

But it doesn't stop there. Use ganache --fork NETWORK to fork the Ropsten, Kovan, Rinkeby and Görli networks.

SPPPPEEEEEEED

We've introduced two new caching layers that can reduce the run time of complex forking requests, like debug_traceTransaction, by over 30x!

In-memory LRU cache

The first caching layer is an in-memory LRU cache. This cache will store previous forking request results in memory so successive calls during the same Ganache session don't have to make the expensive network request to fetch the data again.

Persistent cache

The second caching layer is the more interesting cache and utilizes @truffle/db's network algorithm to efficiently store and retrieve requests and their responses to a persistent disk-backed database.

What this enables is for Ganache to differentiate blockchain networks based not on their chainId or networkId, but the contents of historical blocks.

You can always delete this persistent cache by running Ganache with the --fork.deleteCache flag. To disable both caches use the --fork.disableCache flag.

back to highlights

Ganache is Now Ganache

Before, the Ganache UI application was just Ganache, which used ganache-core, which was also used by ganache-cli. Confused? So were we. Which is why we thought a rename was in order.

Previously, ganache-core was the core code that powered the Ganache UI and Ganache CLI applications and allowed for programmatic use of Ganache. ganache-cli was a separate application that had to be installed to use Ganache in the command line.

We've now merged ganache-core and ganache-cli into just ganache. This one tool gives you access to Ganache as a command line application, for programmatic use in Node, or for use in the browser.

Note: In case you just love typing "-cli", we've left ganache-cli as an alias to ganache, so you can continue using the ganache-cli command in your npm scripts and in your terminal.

back to highlights

Use Ganache in the Browser

Why? We don't really know!

slack-conversation-release

But we're pretty sure you, our loyal and talented users, will make something great out of it. To use this feature, add the following script to your HTML:

<script src="https://cdn.jsdelivr.net/npm/ganache@{VERSION}/dist/web/ganache.min.js"></script>

NOTE: The {VERSION} in the above path needs to be replaced with a version number or tag that is listed in npm.

From there, Ganache is available in your browser for use:

const options = {};
const provider = Ganache.provider(options);

NOTE: Currently forking does not work in the browser, but we plan to add support in the future.

back to highlights

Huge Transaction Traces

If you've got transactions, we can trace 'em.™ Ganache can now run debug_traceTransaction on Ethereum's largest and most complex transactions, even those constrained by Node's runtime limitations!

We're proud of this one and will likely have a blog post coming soon to show off our JS-fu and explain how. For now, our past release notes go into some detail on this feature.

back to highlights

back to top


<img alt="Upgrade Guide and Breaking Changes" width="auto" src="https://raw.githubusercontent.com/trufflesuite/ganache/release-notes-assets/title-images/upgrade-guide-and-...

Read more

v7.0.0-rc.0

12 Jan 23:16
Compare
Choose a tag to compare
v7.0.0-rc.0 Pre-release
Pre-release

 New Features   Fixes   Miscellaneous   Known Issues   Future Plans 


This release is the first "Release Candidate" (rc) release of the new and improved Ganache v7.0.0. You'll definitely want to catch up on the previous changes from the beta releases, if you haven't already, before reading on!

Thanks to everyone who tried out our previous alpha and beta releases and provided feedback! You have been immensely helpful!

Special thanks to @domob1812, @gas1cent, and @MicaiahReid for your contributions to this release, and to @Fatorin and @0xng for reporting issues.

To install globally run:

npm uninstall ganache-cli --global
npm install ganache@rc --global


Highlights

We've changed 45 files across 12 merged pull requests, tallying 1003 additions and 383 deletions, since our last release.

This is an official release candidate for Ganache 7! 🎉 This release contains two new features and a few bug fixes. If you do find any issues on this release, please report them! We'd much rather get them fixed before a stable release.

back to top


New Features


feat: add txpool_content RPC method. (#1539)

The new txpool_content RPC method returns the current contents of the transaction pool. The contents of the transaction pool are grouped into "pending" and "queued" transactions. "Pending" transactions are those that are immediately executable in the transaction pool, meaning that the transaction's nonce is equal to the sender account's next nonce. A "queued" transaction is one with a future nonce that is not immediately executable. Each of the groups of "pending" and "queued" transactions is grouped by the transaction's origin (aka sender), and a group of transactions from one origin are grouped by the origin's nonce.

Here is an example response:

{
  "pending" : {
    "0x8e89f513c2ed8eb9d915196199615e590028b727" : {
      "0" : { /* eth_getTransactionByHash */ }
    }
  },
  "queued" : {
    "0x8e89f513c2ed8eb9d915196199615e590028b727" : {
      "2" : { ... },
      "3" : { ... },
    }
  }
}

back to new features

feat: replace legacyInstamine option with instamine=eager|strict (#2013, #2043)

This feature doubles as both an unbreaking change to Ganache v6.x.x and a breaking change for alpha and beta pre-releases of Ganache v7.0.0.

Ganache v6's instamine behavior would include a submitted transaction in a block before returning the transaction hash. This allows the caller to immediately follow a call to eth_sendTransaction with a successful call to eth_getTransactionReceipt. This behavior will never occur against a real node, as it takes time for a transaction to be included in a block. This is very convenient for testing but resulted in a bit of confusion for new Ethereum developers into how eth_sendTransaction (and related RPC methods) worked.

Previously, pre-releases of Ganache v7.0.0 "fixed" this confusion by defaulting to a new strict instamine mode that more accurately recreated the behavior of a real node: it would return the transaction hash to the caller before the transaction was included in a block. This would result in calls to eth_getTransactionReceipt to sometimes return null, depending on timing, when they used to always return the receipt. This is normal real-world behavior, but because the Ethereum JavaScript Provider spec doesn't yet afford an easy and convenient way of detecting transaction changes we found this behavior to be too cumbersome to be a new default, compared to the v6 default (which we called --legacyInstamine in the v7 pre-releases).

This release reverts the previous decision to default to a strict instamine mode, and instead defaults to the v6 way, and is now referred to as "eager" instamine mode (instead of --legacyInstamine).

We still encourage users to use the new strict mode, which can be opted into by setting the --instamine flag/option to "strict":

ganache --instamine strict

or

const provider = ganache.provider({
  miner: {
    instamine: "strict"
  }
});

To upgrade from other pre-release versions of Ganache v7:

If you set --legacyInstamine flag:

Just remove the flag, as this behavior is the new default (now called "eager" instamine mode)

If you used the default (you didn't set the --legacyInstamine) flag:

The new default mode should work in nearly all instances that strict mode works, so you likely don't need to do anything. But if you do want to continue to use
"strict" mode you will need to add the "strict" instamine mode flag:

ganache --instamine strict

or

const provider = ganache.provider({
  miner: {
    instamine: "strict"
  }
});

back to new features

back to top


Fixes


fix: fix typo in evm_setTime docs (#1861)

This is will result in an invalid state -> This will result in an invalid state

back to fixes

fix: update gas limit to 30M (#1973)

Ethereum's average block gas limit has been around 30,000,000, so we are updating Ganache's default to match.

As a reminder, we regularly update Ganache defaults to match that of mainnet without a breaking-change release.

back to fixes

fix: include impersonated accounts in eth_accounts (#1990)

Accounts added via the --unlock flag were not being returned in calls to eth_accounts and personal_listAccounts. This PR fixes this issue.

back to fixes

fix: eth_call should use the same baseFee as given block num (#1980)

Previously, whenever eth_call was used to execute a message call the baseFeePerGas used to run the transaction was incorrect. This would cause the BASEFEE opcode to be incorrect, which could result in invalid results for contracts that use this opcode. The fee was also used to calculate the transaction's gas cost, which can also affect the way the transaction is run within the EVM. Now, the blockNumber passed in when calling eth_call is used to fetch that block's baseFeePerGas, which is in turn used to calculate the transaction's cost.

back to fixes

fix: update leveldb-related packages (#1989)

Updated leveldb and related packages to the latest versions. This fix should bring native compatibility to more systems.

Read more