2020 was a weird year. COVID changed the dynamics of life around the world. Governments enforced lockdowns and business had to close. Stock markets crashed, only to bounce back spectacularly. Remote working became the norm, while travel completely shut down.
Much of 2020 was about figuring out how to live with these new dynamics. Working from home, eating in, learning to have fun without going out. When the weather was nice, meeting friends in the park was a good alternative, but in winter, that doesn't sound very appealing.
Despite everything going on in the world, I feel like my year was pretty good. I didn't travel as much as I would have liked, but with a beautiful house by the canals, I did get the unique experience of Amsterdam without any tourists.
Around March and April I had a bit more time on my hands due to COVID. So I used that extra time to catch up on a few posts that I still wanted to write. Most notably I finished my Year in Review for 2019 - about 3 months late.
Around that time I also revisited some old love2d gamedev projects, where I spent a lot of time debugging and automating the web build of my game. This led me to publish a guide on building love2d games for the browser so that others in the same situation hopefully will have an easier time.
While I had several articles in draft for a while, during the rest of the year the only other article I was able to finish was Unlimited ERC20 allowances considered harmful. This was an article that I wanted to write since the end of 2019 when I initially created revoke.cash, but it took me a long time of on-and-off writing to finish it.
So I didn't write a lot this year, but I am fine with that. There are plenty of other ways I am sharing my knowledge, such as conferences, open source code, or StackExchange. And in comparison writing a high quality article takes up much more time. So it is good to be selective with what I write and only publish something when it really adds to the conversation.
🏠 Staying Home
In my 2019 Year in Review I had a section dedicated to travelling as I had flown around the world twice that year. So I figured with much of the world in lockdown, it'd make sense to have a similar section titled Staying Home this time around.
My girlfriend and I returned to Amsterdam around the end of 2019. We had some trouble adjusting to the "regular" life back home, as well as the cold winter weather. But after a while we started settling in and we found a new rhythm here.
We were still renting our old student apartment, so we quickly had to start looking for a new home (student leases automatically end six months after graduation). The house search was challenging, but we ended up with a beautiful apartment on Amsterdam's innermost canal.
After visiting London in the final week of February I got sick, and shortly after my girlfriend got sick as well. Even though COVID-19 was gaining momentum, I wasn't able to get a test back then, so I'm not sure if I had COVID or just a regular flu, but to err on the safe side we decided to stay inside for several weeks.
By the time we got out of quarantine, the rest of the country had gone into it. Many stores, gyms and theatres closed and restaurants had to switch to delivery only. Somehow the months of lockdown flew by in an instant, while also lasting forever. Time can be funny like that.
By summer, most lockdowns were lifted, so we decided to take a much needed break in the beautiful Italian town of Carloforte (population 6000). This small holiday made us realise what we had been missing the past months so once back we planned another much larger trip to visit our friends in Curaçao for a month.
Being there brought us back to the nomad life that we lived in 2019 and made us realise that we don't want to stay in Amsterdam forever. We'll likely still be here for a little while longer, as we do have a lot of friends and family that we like having close. But the goal is to be on a plane again sooner rather than later.
Because of COVID-19, most in-person events I wanted to attend were cancelled or moved to the virtual space. I'm not a big fan of virtual events, but given the situation I decided to give them a try. And I still don't think they're a replacement for real in-person meetups. But I did have a pretty good time at the virtual events I attended.
Before the world went into lockdown, I was able to go to the ETHLondon hackathon. Over there I teamed up with my girlfriend and some of our friends for an intense weekend of hacking up Radical.domains.
Radical Domains is an innovative ownership model for ENS domains that is based on Harberger taxes. Under this system ENS names are always for sale at a price set by its owner, and the owner pays a percentage-based tax/rent over this price. This incentivises productive use of the domain name and disincentivises the hoarding or "squatting" of domains.
Since all in-person events were cancelled I decided to give virtual hackathons a try. I initially expected that I wouldn't enjoy it as much, but I ended up with a great team and we had a lot of fun implementing LiquiDeFi, a contract that pools user's funds to execute liquidations on popular DeFi platforms such as Aave.
We ended up being chosen as one of the ten winners (or finalists) of the hackathons. After the hackathon we made some attempts to continue on with the project, including applying to Gitcoin's KERNEL program. In the end we didn't end up having the resources to pursue this project.
The first hackathon I ever participated in was BCHDEVCON Amsterdam, organised by Eléonore Blanc back in 2018. So when she was organising the next iteration of the BCHDEVCON hackathon this September I knew that I could not miss it.
I teamed up with my UI/UX designer friend Jenny and together we built CashScript Playground, an online IDE for writing CashScript contracts, with a generated UI to immediately interact with the contracts. It was inspired by Ethereum's Remix IDE, but it is much more basic.
Because TruffleCon was moved to the virtual space, I thought about skipping it this year. But ultimately I decided that it would be nice to give a short talk about truffle-plugin-verify, since I hadn't done a public walk through of the plugin yet.
While there were some interesting talks at TruffleCon 2020, the talks are never the main reason to go to any conference. And it is always difficult to really connect with people in virtual events. I did enjoy it, but I also hope we'll see an in-person TruffleCon 2021.
In 2019 I visited my friend Jenny in New York, where she introduced me to the @stoopingnyc instagram account. This account posts pictures of furniture that NYC residents put outside so that others can pick it up and give it new life. People who spot something send it to the maintainers of this account and they post the best items.
I started looking for similar accounts in Amsterdam, but when I couldn't find any I decided to start @stoopingams in April of 2020. At first it was just friends and family submitting photos, but it quickly grew to 1000+ followers.
Meanwhile the @stoopingnyc account exploded to more than 100k followers, and news outlets even picked up on it. Several outlets also reached out to me for some segments, so in 2020 @stoopingams was featured in Bobblehaus, NBC's Today and The Wall Street Journal.
It has been really nice to see a kind of community developing around the account. There are people that regularly submit their finds and people share some amazing stories as well. Overall it has been a great way to get out of my software engineering bubble and get involved with something completely different.
As 2020 has come to an end it looks like cryptocurrency is heading into a new bull market. BTC is at a new all time high and we've seen DeFi coins like AAVE and LINK increase more than tenfold in the past year.
In 2020, Aave and Uniswap launched their v2, while other projects like Yearn and Ren had their mainnet launch this year as well. DeFi is expanding to other popular chains too with projects such as Atomic Odds on BTC and AnyHedge/Detoken on BCH.
Infrastructure development has also continued to flourish. Ethereum 2.0 launched its beacon chain and BTC is gearing up for its Taproot upgrade. Funding for open source projects has increased greatly. The latest Gitcoin Grants round raised more than a million USD for open source projects and FlipStarter raised a similar amount in 2020.
In 2019 I built CashScript, a smart contract language and SDK for Bitcoin Cash. Because of this, I was asked by General Protocols to join their team in developing AnyHedge, the first DeFi project on Bitcoin Cash. They raised funding in May of this year, and I joined them shortly after.
AnyHedge can be seen as a risk-trading contract. Two parties can enter a contract where one party locks in the USD value of their BCH, while the other party gets leveraged exposure to the price movement of their BCH.
The smart contracts for AnyHedge are written in CashScript, so as part of the work at General Protocols I maintain CashScript, as well as contribute to other fundamental libraries such as electrum-cash. Besides this I work on the open source AnyHedge library and other parts of the AnyHedge stack.
The AnyHedge library and contracts have been available for several months, but on 30 December 2020 we also launched our first integration into the non-custodial Detoken exchange. This allows regular users to use these contracts and get stability or leverage on their BCH.
One great thing about working on AnyHedge is that all of a sudden I was able to eat my own dog food with CashScript. By actually using CashScript for a non-trivial project myself, I discovered a lot of things that required improvement.
So over the course of 2020 I rolled out two major (and plenty minor) updates. Most importantly I removed the dependency on BITBOX, which has not been maintained for a while. Instead CashScript can now be used with a number of different libraries, while implementing adapters for other libraries is very easy.
Besides this I added support for
OP_REVERSEBYTES and bitwise operations. I also completely refactored the contract instantiation API and the transaction sending API. Finally I made a plethora of quality of life improvements and tweaks, bug fixes and compiler optimisations.
If you've read my previous year in review posts, you know that I am a big fan of the Truffle suite of Ethereum developer tools. TruffleCon 2018 was the first conference I ever spoke at, and I returned for TruffleCon 2019 and 2020. I wrote several libraries that integrate with Truffle, and use it in my own ETH projects as well.
So when Truffle reached out in December for some contracting work I was happy to accept the gig. In the coming months I'll be working with the Truffle team in a part time contracting setting to help with the Truffle+Filecoin integration.
This integration will allow developers to persist their dapp frontend on IPFS/Filecoin and spin up a local version of IPFS and the Filecoin blockchain for testing purposes. Part of the integration is an overhaul to the Truffle plugin system, something I am already quite familiar with through my work on truffle-plugin-verify.
While the initial release of truffle-plugin-verify was in 2019, this year brought some big improvements to the project. The most important update was v0.5.0, which was a complete overhaul of the plugin's functionality.
In earlier versions, the plugin flattened a contract's source file by concatenating all imported source files. The result was a huge source file that was difficult to navigate. So v0.5.0 uses so-called Standard Input JSON, in which the contents of all relevant files are stored in a structured JSON file. This results in Etherscan displaying all these files separately, making the verified code much easier to navigate.
The second important update is that besides Etherscan, the plugin now also supports source code verification for BscScan. BscScan is a block explorer similar to Etherscan, but for Binance Smart Chain (BSC) instead of Ethereum. So if you're writing smart contracts for BSC, you can use truffle-plugin-verify for source code verification.
Revoke.cash is a website that shows you a list of your outstanding ERC20 allowances, allowing you to re-evaluate them and revoke them if you no longer need them. I wrote an in-depth article that outlines the reasons why you'd want to do this.
Revoke.cash is also not a new project. But like truffle-plugin-verify, it did see some important updates in 2020. Notable changes are ENS support, token icons, a home-made logo, and design improvements.
Another notable update was integrating the Kleros T2CR, an on-chain curated registry of tokens. New tokens are added to this registry through a fully decentralised process. By using this registry, only registered tokens are displayed in revoke.cash's UI, while unregistered tokens are hidden behind a checkbox.
🐙 Open Source
When I reflected on my open source projects in 2019, one thing I noted is that I hadn't made any real contributions to other projects, while I had received many on my own projects. So I decided that I wanted to contribute to more projects in 2020. And I did.
It's always easier to think of important missing features or other pain points if you're an actual user of the project yourself. Which is why the contributions I made were all to libraries and tools that I use in my own work.
The Bitcoin Cash upgrade in May included a new opcode,
OP_REVERSEBYTES. Because I wanted to support this new functionality in CashScript, I needed underlying libraries to support it as well. So to expedite that process I raised PRs to bitcore-lib-cash and libauth adding support for the new opcode.
As part of my work with General Protocols, I have been working with the Electrum protocol a lot, so when Chris Troutner wanted to integrate Electrum functionality into his FullStack.cash offering, I was happy to help out and raise some PRs as well.
Earlier in the year I also wanted to get a bit more familiar with the Truffle codebase, so I picked up a few small issues and raised PRs for them. Turns out that was a good call, since it means I won't need to spend too much time getting familiar with Truffle's code for the upcoming Filecoin integration.
My own open source projects have also continued to gain popularity. Both truffle-assertions and truffle-plugin-verify passed the 100 star milestone on GitHub this year. My NPM packages now get a combined 25k+ monthly downloads, almost doubling last year's stats and especially truffle-plugin-verify has seen a big uptick in users.
Of course no open source project is ever a one-man job, so I want to thank everyone who contributed to these projects in 2020, whether that is by opening issues, raising PRs or maintaining underlying libraries.
For truffle-plugin-verify I want to particularly thank xzjcool for implementing BscScan verification into truffle-plugin-verify and the entire Etherscan team (but especially Enigmatic331) for being responsive and solving issues on the Etherscan side. I also want to thank chriseth for being available to help out with any Solidity compilation quirks that come up now and then.
For CashScript I want to thank Michael McLaughlin for custom UTXO selection, Andre Cabrera for browser support, and 2qx for regtest support. I also want to thank Dagur Valberg Johansson and Shomari Prince for their feedback and bug reports.
Overall I am happy with the direction that my open source projects are headed, and it is motivating to see usage rising across the board.
In 2020 I did a lot of work on my open source projects and I contributed to important open source libraries that I depend on as well. I joined General Protocols to work on the first iteration of DeFi apps on BCH. AnyHedge launched in the final days of 2020 and has seen almost $1M in volume in its first two weeks.
In the coming year I look forward to keep building on AnyHedge, my personal projects and other freelancing projects. I'm planning to go to EthCC in Paris in April, so I hope 2021 will see a resurgence of in-person events and travel as well.