Skip to content
Until Then

Until Then

On-Chain Gifts for Future Moments

Created on 23rd June 2025

•

Until Then

Until Then

On-Chain Gifts for Future Moments

The problem Until Then solves

Inspiration

This project was inspired by Violet Evergarden's episode "A Loved One Will Always Watch Over You," where a sickly mother hires Violet, a writer, to write 50 intimate letters to her daughter. The letters are sent on the daughter's birthday after the mother passes away. For 50 years, the daughter receives memorable letters from her deceased mother.

With this project, I wanted to implement a similar idea but using a decentralized solution. In the anime, the letters were sent by a postal company that could lose the letters or go out of business.

Features

Until Then offers the following features:

  • A user can send a gift with an optional letter together with money. The sender chooses a release date.
  • The sender can choose to yield the money in AAVE with ETH or LINK so the gift amount can potentially grow while locked.
  • A receiver can only claim the gift on the release date.
  • After the gift is claimed, the receiver gets the money and can decrypt the letter content.
  • Every week, there is a $100 giveaway for users who claim a gift.
  • The first 100 users receive an airdrop of UNTIL tokens on Avalanche.

Challenges I ran into

Managing all the Chainlink services was quite challenging. Each service has its own gas requirements and setup process. Sometimes, fixing a small bug meant I had to redeploy everything from scratch. I tried to automate the deployment as much as possible, but some manual steps were still necessary.

For example, with Log-based Upkeeps, I couldn't find an easy way to update the contract without deleting and recreating the Upkeep.

The CCIP integration with Avalanche was also tricky to test from Sepolia, as each transaction took around 23 minutes to complete.

It was a bit challenging to get the Chainlink Function working. My initial approach was to use the Pinata SDK, but I later realized it wasn't supported. It also took some time to figure out the correct way to update the source in the contract using the JavaScript codebase. I eventually managed it by creating a few utility scripts.

Tracks Applied (3)

Onchain Finance

When the sender creates the gift, they can choose to yield the tokens. This makes sense if the gift will be redeemed in ...Read More

Cross-Chain Solutions

Chainlink Function: Since everything is public on Ethereum, the letter content is stored in Pinata's private IPFS. This...Read More

Avalanche Track

A log-based Upkeep listens to the GiftClaimed event. When triggered, using Chainlink CCIP, a message is sent to a Receiv...Read More
Avalanche

Avalanche

Discussion

Builders also viewed

See more projects on Devfolio