Building for interoperability: why we’re focusing on Upgrades Plugins

OpenZeppelin’s mission is to secure the open economy. We believe that smart contract upgrades are an important part of this mission.

For those who don’t know, a smart contract upgrade is an action that can arbitrarily change the code that runs in a contract on chain, while preserving its address, storage, and balance. Upgrades can be used as a safeguard for fixing an eventual vulnerability, and also as a means to iteratively develop a system by progressively adding new features.

We’ve been working on secure proxy-based upgrades for several years already, from early experiments in OpenZeppelin Labs, to the OpenZeppelin SDK (originally called ZeppelinOS!), consisting of OpenZeppelin CLI and Upgrades Library.

Up until mid this year, the CLI was the only comprehensive solution we provided to integrate contract upgrades into a project. The CLI, however, required the entire project to be built on it. This meant that projects who wanted to leverage upgrades needed to either ditch their toolchain, or build some really awkward patches to have both running side by side.

Since our goal is to foster security, in this case via facilitating upgrades, we set out to make upgrades more easy to adopt. Part of this effort included making proxies available directly from our popular Contracts library. And part of this effort, in the tooling front, included Upgrades Plugins for Truffle and Buidler.

Truffle is the most popular smart contract development framework at 25K downloads a week, and Buidler has been growing rapidly for the past year with a 6x growth, effectively surpassing the OpenZeppelin CLI. By integrating with them, smart contract developers can use upgrades with the tools they’re familiar with, and without having to migrate to a new framework.

Deploying an upgradeable contract is now as simple as upgrades.deployProxy(MyContract, [arg1, arg2])!

We have seen a good response from the community to the Upgrades plugins. Not only are they easier to use from existing and familiar toolchains, but we have used all our learnings from the OpenZeppelin SDK to build a clearer and easier-to-use interface from the ground up.

With this in mind, we’ve decided it’s best to focus our upgradeability efforts on the Upgrades Plugins exclusively, and have halted development on the OpenZeppelin CLI. This will allow us to focus on improving the security and upgrade patterns we provide, while building on the great work of projects fully dedicated to developer experience. We will continue to provide support for the CLI until the end of 2020. For those who are using the CLI currently and want to migrate to the Upgrades Plugins, we provide a command that makes it easy to migrate your project over, along with a guide that shows what the process is like. Additionally, we will be providing support for anyone migrating in the Community Forum.

$ npx migrate-oz-cli-project
✔ Successfully migrated .openzeppelin/rinkeby.json
✔ Migration data exported to openzeppelin-cli-export.json
✔ Deleting .openzeppelin/project.json

These were your project's compiler options:
{
  "compilerSettings": {
...

We’re excited for the features and security improvements that are coming for the Upgrades Plugins and we hope to see you building with them!

You will notice that we’ve also updated the Learn guides in our documentation with instructions on how to use Truffle or Buidler for developing smart contracts. Our Learn guides are written for developers who are new to the space, the tooling, and the concepts.

In case you’ve missed it, here’s a list of what we’ve released on the upgrades front recently!

7 Likes
Upgradeable ERC20 token
Verify with OpenZeppelin CLI
InitializableAdminUpgradeabilityProxy in solc 0.7?
Create BEP20 (Binance) Token with Truffle & ZOS
Error parsing @openzeppelin/upgrades/contracts/upgradeability/ProxyFactory.sol
Upgrading from older version of OpenZeppelin Contracts and OpenZeppelin CLI?
Create proxy results in Execution reverted
How to specify the gas price for the deploy command of the CLI?
How to initialize new version when upgrading?
Can’t find the AdminUpgradeabilityProxy.sol
Link to a Deployed Version of a Smart Contract
Upgrade to contracts-upgradeable 3.3 + with EIP712
✖ Compiling contracts with solc 0.8.11 (commit.d7f03943) Cannot read properties of undefined (reading 'slice')
OpenZeppelin CLI 2.8: Release Candidate
Invalid number of parameters for "undefined". Got 1 expected 2 while deploying ERC721 Token Contract
Verify AdminUpgradeabilityProxy on HECO testnet
Npx oz compilers
File import callback not supported on MacOS
Proxy Contracts Inheritance Hierarchy
Every call results in Error: VM execution error after upgrade
Governance for Smart Contract Upgrades
deployProxy() using `truffle migrate --reset` errors with requested contract was not found
Is it possible to customize AdminUpgradeabilityProxy?
Verify implementation contract
No AST nodes of type ContractDefinition with id 1027 found
Zos install fails
`oz call` Cannot read property 'message' of null
Proxy address for upgradeable contract
Invalid number of parameters for "undefined". Got 1 expected 2 while deploying ERC721 Token Contract
How to add OpenZeppelin compiler into truffle config as an external compiler?