Coinbase Logo

How MakerDAO doubled its users in a single weekend using Learning Rewards

By Kenzan Boo

Engineering

, January 10, 2020

, 7 min read time

1*ZED3iqSDB2dhimzwSAzDXw

This blog was updated as of August 1, 2022 in order to reflect our rebrand from Coinbase Earn to Learning Rewards.

On July 26, 2019, Learning Rewards launched the Dai Advanced Task. In a few days, users created more CDPs (Collateralized Debt Positions) than ever existed. In the previous 11 months, about 9,000 CDPs were created on the blockchain with MakerDAO. We chose to launch on a Friday. On the weekend after the Dai Advanced Task began, over 10,000 CDPs were created.

In this blog, we explore how one of the biggest decentralized finance apps used Learning Rewards to help grow its network so quickly. We’ll dive into some of the engineering and product challenges along the way and how we solved them.

0*FdEbQNNftPUG6cEJ

Learning Rewards is a platform that connects the community of users with foundations like MakerDAO. The product allows users to earn cryptocurrencies while learning about them by watching educational videos and doing tasks. It’s a way to help educate crypto purchasers so that they are not just buying a ticker, but also understanding the foundations and networks behind the token.

Learning Rewards creates a value for the foundations as well. Foundations want to distribute tokens to its new users. Most new token projects dedicate a major portion of their tokens to initial distribution to circulate among the community. Learning Rewards is able to help them expand user participation. The more people that use it, the greater the network effect, and the more meaningful the token becomes.

0*b5EhUQ7jL4lq2tOH

https://defipulse.com/

MakerDAO is one of the most popular decentralized apps in the crypto community. It allows users to use ETH as collateral and create CDP’s in a stablecoin called DAI. DAI is made stable with the help of smart contracts on the Ethereum network, keeping it very closely pegged to the US Dollar.

0* s8x4x-zA8a7TbPi

https://makerscan.io/

The effects of the Learning Rewards campaign have been lasting, even months after the first launch weekend. It’s shown sustained growth for the network far past the initial new user effect. While the lesson has introduced many new people to engaging in blockchain debt positions, it has not yet significantly changed the value of the total debt positions.

Below we’ll go through a few quick screenshots showing a run-through of the task.

0*HPSTqUzM2gb7brsD

Intro to the task telling users what they’re about to do.

0*m84HFrEWofb6q6Up

We guide them through downloading the wallet app. Text to Download if they’re on a computer. The remainder of the task needs to be done using the Coinbase Wallet dApp browser.

0*Hpu32mp0IV0qGvr2

Connect Coinbase wallet.

0*JJXIlmblnDAp2S0t

We send the user test funds for the tutorial.

0*d9nUhNfJbc9sR Sl

Walk them through the steps on Maker.

0* dJsYSieiL278 dq

Payout immediately.

Challenges

Current challenges with using decentralized finance apps:

  1. Fear of loss

  2. Difficult to use

Users of decentralized finance have a fear of losing their initial deposits if they type in the wrong receiving address. Furthermore, many of the current user interfaces are notoriously difficult to use since they’re intended for engineers with technical experience and not consumers.

Fear of loss

0*5N17NAc9-qskCLBb

Problem: Users’ fear of losing their funds.

As part of the tutorial, a very small amount of ETH was needed as collateral and to pay the network fee.

Solution: Provide the funds needed to complete the lesson.

We supplied collateral by building a backend Ruby controller which directly deposits the necessary ETH into the user’s linked wallet. By giving the user the ETH, the user would not lose their own money. Consequently, if they were not able to complete the tutorial, this would lessen any frustration. The below controller snippet highlights how we sent that allowance to the user’s wallet.

class
V1::DaiSendEthController < V1::BaseController
 ETH_ALLOWANCE_AMOUNT = (ENV[ETH_ALLOWANCE_AMOUNT]).to_f
 def
dai_send_eth
   begin
     allowance =
DaiEthAllowance
.
create!
(
       user_id: current_user.id,
       wallet_address: wallet_address.downcase,
       eth_allowance_amount: ETH_ALLOWANCE_AMOUNT,
       …
    )
    rescue
ActiveRecord
::RecordNotUnique
    Scrolls
.
log
(
      message: “User #{cb_user_uuid} already has an Eth allowance associated”
    )
    return head :ok
   end
SendEthAllowanceJob
.
perform_async
(allowance.id)
head :ok
end
end

Difficult to Use

0*PH8l3-8kQ19riqSs

Problem: Volatile gas prices (network fees).

Gas is a way for Ethereum to self-balance and make sure the network is always available. During high demand times, the cost to do computing on the Ethereum network is raised to incentivize more people to contribute computing power. Most of the time, it costs a few cents to open a Collateralized Debt Position on Maker. However, at rare times of high network use, the cost to create a CDP can go up to $10, which is a lot more than the tutorial funds we provide.

Solution: We check the ETH network for our users.

0*vCP1a8vpVOxFhpRG

As part of the Dai Advanced task, we monitor ETH gas prices for our users through an internal backend system we built with our crypto team. The CheckEthGasPrice class below monitors both internal parity price and external Eth Gas Station prices to make sure that the gas prices are within the normal bounds. If we determine that the current gas conditions are too high, we ask the user to come back at a later time to complete the task. We want the user to be able to experience the full flow in the first pass and not have to come back later after they’re halfway through the tutorial. This also helps the Coinbase support staff reduce the number of support tickets coming in.

class
CheckEthGasPriceJob < ApplicationJob
DISABLE_THRESHOLD =
ENV
.
fetch
(ETH_GAS_COST_THRESHOLD).to_f
def
perform
  gas_station_prices =
GasStationApi
.prices
  coinbase_parity_price =
Ethereum
::
CoinbaseParityNode
.new.gas_price_gwei
  eth_gas_station_price = gas_station_prices[‘average’]
  task_status =
DaiTaskEnabled
.first
  …
  if coinbase_parity_price > DISABLE_THRESHOLD
    Scrolls
.
log
(
     message: “Gas prices is too high, task disabled”,
    )
    task_status.
update
(enabled: false) if task_status.enabled
   else
     Scrolls
.
log
(
        message: “Gas prices is acceptable, task enabled”,
     )
     task_status.
update
(enabled: true) if !task_status.enabled
   end
 end
end

Problem: The Maker UI was not designed for mobile, making it difficult to use.

When we started on this endeavor with the Maker foundation, we were tasked with designing the whole flow end to end to make it easy to use. Upon attempting to create a CDP on the Maker site, it was clear that the page was designed to work well on desktop; however, we anticipated many of our users to go through Learning Rewards on mobile. A lot of the modals were cut off or other content not visible on a mobile device.

0*JyF6eKET8jtrIZb5

Solution: We worked closely with the Maker team to revise the Maker app to be mobile-friendly. In the screenshot above, the top set shows the UI before the updates made and bottom shows after. By working with the Maker team, we were able to iterate and improve on the UI to create a seamless experience for our users. The end result was an easy to use flow for our many mobile users.

Problem: Determining whether a user has successfully created a CDP.

To reward the user for completing the task, we need to first figure out when they’ve completed making a CDP.

module
EtherscanApi::CdpCrawler
 DAI_TOKEN_CONTRACT =0x8…’.freeze
 EVENT_SUBSCRIPTIONS = [
   {
      name: ‘dai mint event’,
      event: ‘mint’,
      contract: DAI_TOKEN_CONTRACT,
      topic0:0x0…’,
# mint event
      parser: ‘parse_mint’,
      default_begin_block: 7_491_270
# starting from block when campaign launched
   },
   {
      name: ‘dai transfer event, Maker proxy’,
      …
    },
    {
      name: ‘dai transfer event, Instadapp’,
      …
     },
     …
 ].freeze
end

Solution: Create a crawler that subscribes to all DAI events.

We built a crawler specifically to monitor DAI minting events from particular proxy contracts used by the most popular dApp. When our system sees a DAI mint event, we then try to connect that to our user’s originating wallet address in order to mark the lesson as complete. After that, we reward the user in DAI to their Coinbase wallet.

Conclusion

The DAI Advanced lesson has been a huge success for token development teams and for our community of users. By completing this task, many users directly engaged with a blockchain for the first time.

The DAI advanced lesson campaign has now concluded, however we’ll be working on many more community campaigns like this in the future. If you’d like to help build out the future of the crypto community, come join us.

Check out Learning Rewards here: https://www.coinbase.com/learning-rewards

Special thanks to John Granata, Alex Cusack and Max Schorer for working on Learning Rewards and editing this blog.

Coinbase logo