From 01a275cbc5ec3fa3b1c740579b5120535c04b27a Mon Sep 17 00:00:00 2001 From: Chen Hui Jing Date: Fri, 23 Jan 2026 08:12:18 +0000 Subject: [PATCH] chore: housekeeping updates --- .env.example | 2 +- README.md | 116 +++++++++++++++++++++++++-------------- app/dashboard/layout.tsx | 2 +- app/layout.tsx | 4 +- app/page.tsx | 2 +- package.json | 16 +----- public/screenshot.png | Bin 0 -> 29524 bytes 7 files changed, 83 insertions(+), 59 deletions(-) create mode 100644 public/screenshot.png diff --git a/.env.example b/.env.example index 9983ad0..f5eef2c 100644 --- a/.env.example +++ b/.env.example @@ -7,7 +7,7 @@ SUPABASE_SERVICE_ROLE_KEY= CIRCLE_API_KEY= CIRCLE_ENTITY_SECRET= CIRCLE_BLOCKCHAIN=ARC-TESTNET -CIRCLE_USDC_TOKEN_ID= +CIRCLE_USDC_TOKEN_ID=15dc2b5d-0994-58b0-bf8c-3a0501148ee8 # Misc ADMIN_EMAIL=admin@admin.com diff --git a/README.md b/README.md index 8c53397..a2a1ea4 100644 --- a/README.md +++ b/README.md @@ -1,85 +1,119 @@ # Arc Commerce -This project demonstrates how to integrate USDC as a payment method for purchasing credits on Arc. +Integrate USDC as a payment method for purchasing credits on Arc. This sample application uses Next.js, Supabase, and Circle Developer Controlled Wallets to demonstrate a credit purchase flow with USDC payments on Arc testnet. -## Table of Contents +User dashboard for credit purchase -- [Clone and Run Locally](#clone-and-run-locally) -- [Environment Variables](#environment-variables) +## Prerequisites -## Clone and Run Locally +- Node.js 20.x or newer +- npm (automatically installed when Node.js is installed) +- Docker (for running Supabase locally) +- [ngrok](https://ngrok.com/) (for local webhook testing) +- Circle Developer Controlled Wallets [API key](https://console.circle.com/signin) and [Entity Secret](https://developers.circle.com/wallets/dev-controlled/register-entity-secret) -1. **Clone and install dependencies:** +## Getting Started + +1. Clone the repository and install dependencies: ```bash git clone git@github.com:circlefin/arc-commerce.git - cd top-up + cd arc-commerce npm install ``` -2. **Set up environment variables:** +2. Create a `.env.local` file in the project root: ```bash cp .env.example .env.local ``` - Then edit `.env.local` and fill in all required values (see [Environment Variables](#environment-variables) section below). + Required variables: + + ```bash + # Supabase + NEXT_PUBLIC_SUPABASE_URL=your_supabase_url + NEXT_PUBLIC_SUPABASE_PUBLISHABLE_OR_ANON_KEY=your_anon_key + SUPABASE_SERVICE_ROLE_KEY=your_service_role_key + + # Circle + CIRCLE_API_KEY=your_circle_api_key + CIRCLE_ENTITY_SECRET=your_entity_secret + CIRCLE_BLOCKCHAIN=ARC-TESTNET + CIRCLE_USDC_TOKEN_ID=15dc2b5d-0994-58b0-bf8c-3a0501148ee8 + + # Misc + ADMIN_EMAIL=admin@admin.com + ``` -3. **Start Supabase locally** (requires Docker): +3. Start Supabase locally: ```bash npx supabase start npx supabase migration up ``` -4. **Start the development server:** +4. Start the development server: ```bash npm run dev ``` - The app will be available at [http://localhost:3000](http://localhost:3000/). The admin wallet will be automatically created on first startup. + The app will be available at `http://localhost:3000`. The admin wallet is automatically created on first startup. -5. **Set up Circle Webhooks:** +5. Set up Circle Webhooks (for local development): - In a separate terminal, start ngrok to expose your local server: + In a separate terminal, expose your local server: ```bash ngrok http 3000 ``` - Copy the HTTPS URL from ngrok (e.g., `https://your-ngrok-url.ngrok.io`) and add it to your Circle Console webhooks section: + Add the webhook endpoint in Circle Console: - Navigate to Circle Console → Webhooks - - Add a new webhook endpoint: `https://your-ngrok-url.ngrok.io/api/circle/webhook` - - Keep ngrok running while developing to receive webhook events + - Add endpoint: `https://your-ngrok-url.ngrok.io/api/circle/webhook` + - Keep ngrok running to receive webhook events + +## How It Works + +- Built with [Next.js](https://nextjs.org/) and [Supabase](https://supabase.com/) +- Uses [Circle Developer Controlled Wallets](https://developers.circle.com/wallets/dev-controlled) for USDC transactions +- Wallet operations handled server-side with `@circle-fin/developer-controlled-wallets` +- Webhook signature verification ensures secure transaction notifications +- Admin wallet automatically initialized on first run ## Environment Variables -Copy `.env.example` to `.env.local` and fill in the required values: +| Variable | Scope | Purpose | +| ------------------------------------- | ----------- | ------------------------------------------------------------------------ | +| `NEXT_PUBLIC_SUPABASE_URL` | Public | Supabase project URL | +| `NEXT_PUBLIC_SUPABASE_PUBLISHABLE_OR_ANON_KEY` | Public | Supabase anonymous/public key | +| `SUPABASE_SERVICE_ROLE_KEY` | Server-side | Service role for privileged database operations | +| `CIRCLE_API_KEY` | Server-side | Circle API key for webhook signature verification | +| `CIRCLE_ENTITY_SECRET` | Server-side | Circle entity secret for wallet operations | +| `CIRCLE_BLOCKCHAIN` | Server-side | Blockchain network identifier (e.g., "ARC-TESTNET") | +| `CIRCLE_USDC_TOKEN_ID` | Server-side | USDC token ID for the specified blockchain | +| `ADMIN_EMAIL` | Server-side | Email address that determines which user gets admin dashboard access | -```bash -# Supabase -NEXT_PUBLIC_SUPABASE_URL= -NEXT_PUBLIC_SUPABASE_PUBLISHABLE_OR_ANON_KEY= -SUPABASE_SERVICE_ROLE_KEY= +## Usage Notes -# Circle -CIRCLE_API_KEY= -CIRCLE_ENTITY_SECRET= -CIRCLE_BLOCKCHAIN=ARC-TESTNET -CIRCLE_USDC_TOKEN_ID= +- Designed for Arc testnet only +- Requires valid Circle API credentials and Supabase configuration +- Admin wallet must have sufficient USDC and gas fees +- ngrok (or similar) required for local webhook testing -# Misc -ADMIN_EMAIL=admin@admin.com -``` +## Scripts -| Variable | Scope | Purpose | -| ------------------------------------- | ----------- | ------------------------------------------------------------------------ | -| `NEXT_PUBLIC_SUPABASE_URL` | Public | Supabase project URL. | -| `NEXT_PUBLIC_SUPABASE_PUBLISHABLE_OR_ANON_KEY` | Public | Supabase anonymous/public key. | -| `SUPABASE_SERVICE_ROLE_KEY` | Server-side | Service role for privileged writes (e.g., transaction inserts). | -| `CIRCLE_API_KEY` | Server-side | Used to fetch Circle webhook public keys for signature verification. | -| `CIRCLE_ENTITY_SECRET` | Server-side | Circle entity secret for wallet operations. | -| `CIRCLE_BLOCKCHAIN` | Server-side | Blockchain network identifier (e.g., "ARC-TESTNET"). | -| `CIRCLE_USDC_TOKEN_ID` | Server-side | USDC token ID for the specified blockchain. | -| `ADMIN_EMAIL` | Server-side | Admin user email address. | \ No newline at end of file +- `npm run dev`: Start Next.js development server with auto-reload +- `npx supabase start`: Start local Supabase instance +- `npx supabase migration up`: Apply database migrations + +## Security & Usage Model + +This sample application: +- Assumes testnet usage only +- Handles secrets via environment variables +- Verifies webhook signatures for security +- Is not intended for production use without modification + +See `SECURITY.md` for vulnerability reporting guidelines. Please report issues privately via Circle's bug bounty program. \ No newline at end of file diff --git a/app/dashboard/layout.tsx b/app/dashboard/layout.tsx index 025524b..007fb03 100644 --- a/app/dashboard/layout.tsx +++ b/app/dashboard/layout.tsx @@ -36,7 +36,7 @@ export default function ProtectedLayout({
- top-up + arc-commerce
{/* The wallet buttons have been removed from here */} diff --git a/app/layout.tsx b/app/layout.tsx index 00d73b6..e5c3eff 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -29,8 +29,8 @@ const defaultUrl = process.env.VERCEL_URL export const metadata: Metadata = { metadataBase: new URL(defaultUrl), - title: "Next.js and Supabase Starter Kit", - description: "The fastest way to build apps with Next.js and Supabase", + title: "Arc Commerce", + description: "Platform credit purchases using USDC and Circle Wallets", }; export default function RootLayout({ diff --git a/app/page.tsx b/app/page.tsx index 635dc19..36f2c60 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -31,7 +31,7 @@ export default function Home() {
- top-up + arc-commerce
{!hasEnvVars ? : }
diff --git a/package.json b/package.json index 1518e8b..8d0b4ca 100644 --- a/package.json +++ b/package.json @@ -7,13 +7,8 @@ "lint": "next lint" }, "dependencies": { - "@circle-fin/bridge-kit": "^1.1.2", - "@circle-fin/developer-controlled-wallets": "^8.4.1", - "@circle-fin/modular-wallets-core": "^1.0.11", - "@hookform/resolvers": "^5.2.2", - "@metamask/delegation-toolkit": "^0.13.0", + "@circle-fin/developer-controlled-wallets": "^10.0.1", "@radix-ui/react-alert-dialog": "^1.1.15", - "@radix-ui/react-checkbox": "^1.3.1", "@radix-ui/react-dialog": "^1.1.15", "@radix-ui/react-dropdown-menu": "^2.1.16", "@radix-ui/react-label": "^2.1.7", @@ -27,10 +22,8 @@ "@supabase/supabase-js": "latest", "@tanstack/react-query": "^5.90.2", "@tanstack/react-table": "^8.21.3", - "axios": "^1.12.2", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "cmdk": "^1.1.1", "date-fns": "^4.1.0", "lucide-react": "^0.511.0", "next": "latest", @@ -38,12 +31,10 @@ "react": "^19.0.0", "react-day-picker": "^9.11.0", "react-dom": "^19.0.0", - "react-hook-form": "^7.63.0", "sonner": "^2.0.7", "tailwind-merge": "^3.3.0", - "viem": "^2.38.0", - "wagmi": "^2.17.5", - "zod": "^4.1.11" + "viem": "^2.44.4", + "wagmi": "^2.19.5" }, "devDependencies": { "@eslint/eslintrc": "^3", @@ -51,7 +42,6 @@ "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", - "baseline-browser-mapping": "^2.9.3", "eslint": "^9", "eslint-config-next": "15.3.1", "postcss": "^8", diff --git a/public/screenshot.png b/public/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..f418a1bae6020494e2562b57c90e17b8c366ed4e GIT binary patch literal 29524 zcmb?>Wl&wgvnOuBHMnbV2@<%tySux)UnEG7Ai*WT#Wh%PcXxMpce&Wz{NLLTTU&3x zZP!#y^-NEn>N%&oe>10}RFtIAP>4{VprFuXWhB&~pkM(|P%uA`VE>J@zjjLfW1dtL zG$bJq$ji$M0Rh1Wlp~ zqN0tB4Lm&Dp`oGD($ebc>iqot+}zx*uC9@hk;TQufq{X{%*>peoZ8yj_V)IPiHV+` zp4r)1baeEzw6x~tW&r_#+=rgskMrp0XiQ8@b8~Y50I;*OqoAPR;^LyLteljTwDEQl z9v-f*ufMgm)z;P)92`tWMz*%Lrm3m9y}iA@zMhqp<>%*TZ*N~xQo_y6y|A!QSXgLc zVj?OkYGh=juCC6&z_7Zy%FD~!*x2~z&mUD))vBs0c6N3mV&bW(smjXAjEoFjUETTl z`TqX??CfkD9GuqH)_{NjTU*<{zP`G;y4bilOG`^}aq-U1&W47DrlzLU)Ko`DM^;wW z`uciVS=qVQU1@1)NlD2EFr@ftfSH+jg}9YN97`Y(5fRsqkROeZ$jC^#Af<#32xtHzm15U@I@7rfDIS50Uaxq0c`d!{ zr*%UfAuoT{yO)k26FZRMO^9hOB%~{A{S?9ztzS6_nSR(TS!wrgO|>WwWe!zun1cXo zAVR;)zSlvFiUZH@AhY|B-c^WR7Nq51%&k67Efo^gpWlBzN9HGk6-9W&33r%pQ zOl{!V+O7WdscJO-0DNK^>0c1G5J++N@z~3TX5{?o`%PTU-qhlTSi4UG+gHd-A}P%fWkB}6rRR?k-<%0%8ILpKEL zHy77o3>0{n8aj+F(G)UN5o8Fs-ZNd!7QcQ#%fHw|`rp}e z#}3sNPuBm|29QyT$gu7p=Ipp%O(DXGV*X#PUkL4+*P)aB&|ok{Bxt6#wfO0=pN(Dw zQ{q#=GBNJfcTM#dY&cQwi$}cyZ=9^DU8e(%GI z1Yl$wjpaVoNkHU&40hKpcMugQAQ59GDmez}iPkI`G6pOyR(jio5WC@b6>06UEl`W< zQ(5wct|i{rPtiYTB#$mCO%0tH>*#zYd9n#vQ(enSFMnZ(OxY7Y~`RBflK1 z?gAf)=M7}+b~Kybp7@1vZViihbqc}>8jz*HM3Q%^iQdwE`+*;Ax^|!rz}I8z%++yt z0FNFV)@hP3{~YUa+iqQ70kbFF076A~GS9{I&x>Qfk64s)# z@mZ=ov=~s0QG{1LxZ?K}D_|VBadsywBJ4gkljJJ6q~9|AN*1XSgS9L$z2Q7(|0G$5 zJ@(wjo9l>=pYBHqTTdMy(ZcmfB1;#!xt&`9p}Keb7xV}L3b&)vOt-@x&fq=?u4`y_ zB4XFC(P`|fc#{1IA@$#Ggw{~IRmZ=p9#ZPFQ~b4aHDG=E;){fGLWJ&7fBpC(hL1S6 z7LHdxTzGMNgN(B)#ZodC{#TPkuY75&DD8FEEod{dy4v+ zeYT%31k$bQZPc%t{N=lBeP_x9(8p+#dYp73{>VNkcH(}`�{#Q-?_}Mh+}XUBBIL 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

8wRnaAidGU>odU8C#$T`76oPpdy%=%9&wS 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