Sendly
Bridge Gifts Across Worlds
The problem Sendly solves
Sendly answers the problem of making gift-giving more personal and varied in today's digital age.
Traditional cash gifts can feel impersonal, while physical gift cards are limited by location and redemption options. Sendly solves this by offering a blockchain-based solution that allows users to send customizable digital gift cards to anyone, anywhere, and at any time.

It bridges the gap between Web2 and Web3, enabling seamless integration with both traditional online services (e.g., Amazon, Apple (in the long future haha but I hope)) and decentralized platforms (via the Base network).

This gives recipients to spend their gifts flexibly, while also introducing Web 2 users to Web 3 concepts, fostering curiosity and adoption.
Challenges I ran into
- High Gas Costs
Struggled with high gas fees during transactions.
Solution: Uploaded SVG/JSON to IPFS (or Pinata, Web3.Storage, etc.) and passed only a link (e.g., ipfs://...) to the contract.
Changes Made: SVG and metadata are now uploaded to IPFS via web3.storage. The contract now receives only a short metadata.json link instead of the full JSON/SVG.
Impact: Reduced minting gas costs by 5-10 times.
- Missing ERC721Enumerable Interface
Initially, the tokenOfOwnerByIndex method and the ERC721Enumerable interface were not implemented.
Solution: Had to create a new contract to include these features.
- Late Integration of Smart Wallet
Added the Smart Wallet feature late in development. Previously, I used Create React App (CRA), which has limited structure and poor support for modern Web3 packages, causing difficulties with Smart Wallet integration.
Solution: Implemented Coinbase Smart Wallet integration using the wagmi library with the coinbaseWallet connector from @wagmi/connectors.
Future Plan: Migrate from react-scripts to Vite or Next.js, which better support modern dependencies and avoid conflicts with TypeScript 5.x.
- Display Issues with Current NFTs in Wallet
After redeeming, I filtered the old giftCards array and called setGiftCards(updatedCards). However, React might not update the giftCards state in time before loadGiftCards calls setGiftCards(cards) with a new array, leading to desynchronization and display bugs.
Solution: This could be addressed by ensuring state updates are batched or using a loading state to prevent race conditions—specific implementation can be refined based on your code. Then I broke my head.
Tracks Applied (2)
Stablecoins
Consumer
Technologies used
Cheer Project
Cheering for a project means supporting a project you like with as little as 0.0025 ETH. Right now, you can Cheer using ETH on Arbitrum, Optimism and Base.
