Cube is a Seamless Interoperable QR Payments Solution that aims to onboard millions of TradFi merchants onto the onchain economy.
Imagine a place where you can access Merchants Food / Goods / Services all onchain. That's where Cube breaks the ice in!
Following Jesse Pollak's vision of an Onchain Economy, Cube aims to be a part of the movement to bring users onchain, and stay onchain.
- Click on the
Sign Up
Button and create a Coinbase Smart Wallet. - Head to Thirdweb Faucet to get Base Sepolia ETH Funds (this is required for Basenames registration).
- Once you have Base Sepolia ETH in your Coinbase Smart Wallet, proceed to register for an account.
- Head to Circle Faucet to get Base Sepolia USDC Funds (this is required to transact on Cube).
- Once you have Base Sepolia USDC in your Coinbase Smart Wallet, you are ready to Scan & Pay! Scan the following QR Code and enter the amount in SGD that you would like to pay.
-
🧢 Basenames: Users can personalize their identity with unique custom basenames.
-
🏘️ Paymaster: Gas and other on-chain operations are abstracted from the user.
-
😌 Onchainkit: User Experience streamlined and 10x because of Onchainkit SDK.
-
💳 ERC4626: Aave USDC Vault Strategy Valt on Base for merchants to generate onchain yield.
-
⛴️ Merchant Registry: Registry of onchain merchants to provide food / good / services onchain.
- Frontend Stack: NextJS, Typescript, Wagmi, Viem
- Backend Stack: Supabase, PostgreSQL, DrizzleORM
- Smart Contracts: Foundry, Solidity
- Basenames cannot be completely gasless for the user due to
_validatePayment
function inRegistrarController.sol
/// @notice Enables a caller to register a name.
///
/// @dev Validates the registration details via the `validRegistration` modifier.
/// This `payable` method must receive appropriate `msg.value` to pass `_validatePayment()`.
///
/// @param request The `RegisterRequest` struct containing the details for the registration.
function register(RegisterRequest calldata request) public payable validRegistration(request) {
uint256 price = registerPrice(request.name, request.duration);
_validatePayment(price);
_register(request);
_refundExcessEth(price);
}
- Coinbase Smart Wallet bug (using wagmi hooks will always default to Ethereum mainnet despite setting ChainId). Video Link
const hash = await writeContracts(wagmiConfig, {
contracts: [
{
address: BASE_SEPOLIA_REGISTRAR_CONTROLLER_ADDRESS,
abi: RegistrarControllerAbi,
functionName: "register",
args: [
{
name: registrationArgs.name,
owner: registrationArgs.owner,
duration: registrationArgs.duration,
resolver: registrationArgs.resolver,
data: registrationArgs.data,
reverseRecord: registrationArgs.reverseRecord,
},
],
},
],
capabilities: {
paymasterService: {
chainId: BASE_SEPOLIA_CHAIN_ID,
url: process.env
.NEXT_PUBLIC_CDP_PAYMASTER_AND_BUNDLER_ENDPOINT as string,
},
},
chainId: BASE_SEPOLIA_CHAIN_ID,
});
- Stablecoins Price Feeds for more accurate conversions.
- Integrate more stablecoins into Cube (EURC).
- More ERC4626 Choices (Aave + Morpho).
- Integrate RIP-7755 by Onchainkit
- Frontend + Backend Repository - NextJS + Typescript Frontend <> Supabase + DrizzleORM Backend
- Smart Contracts - Foundry + Solidity