create-0g-app 1.0.6 → 1.0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +219 -0
- package/dist/index.js +1 -2
- package/dist/index.js.map +1 -1
- package/dist/scaffold.js +27 -7
- package/dist/scaffold.js.map +1 -1
- package/package.json +1 -1
- package/templates/base/packages/web/app/globals.css +11 -10
- package/templates/base/packages/web/components/Navbar.module.css +13 -11
- package/templates/base/packages/web/components/Navbar.tsx +1 -1
- package/templates/compute/packages/web/components/ComputeSection.module.css +11 -9
- package/templates/compute/packages/web/components/ComputeSection.tsx +1 -1
- package/templates/contracts/packages/contracts/tsconfig.json +13 -0
- package/templates/contracts/packages/web/components/ContractsSection.module.css +11 -1
- package/templates/contracts/packages/web/components/ContractsSection.tsx +8 -6
- package/templates/inft/packages/web/components/INFTSection.module.css +52 -2
- package/templates/inft/packages/web/components/INFTSection.tsx +45 -1
- package/templates/storage/packages/web/components/StorageSection.module.css +52 -1
- package/templates/storage/packages/web/components/StorageSection.tsx +37 -1
package/README.md
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# create-0g-app
|
|
2
|
+
|
|
3
|
+
The fastest way to build on [0G](https://0g.ai). One command scaffolds a full-stack app pre-wired with working code for 0G Storage, Compute (AI inference), smart contracts, and INFTs.
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npx create-0g-app@latest
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## What gets generated
|
|
12
|
+
|
|
13
|
+
A monorepo with two workspaces:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
my-app/
|
|
17
|
+
├── packages/
|
|
18
|
+
│ ├── web/ # Next.js 15 frontend
|
|
19
|
+
│ │ ├── app/
|
|
20
|
+
│ │ │ ├── page.tsx # Main page (edit this)
|
|
21
|
+
│ │ │ ├── layout.tsx
|
|
22
|
+
│ │ │ └── api/ # Server-side API routes (storage, compute, INFT)
|
|
23
|
+
│ │ ├── components/ # Feature UI components
|
|
24
|
+
│ │ ├── lib/ # Client-side SDK helpers
|
|
25
|
+
│ │ └── .env.local # Your private keys + config (never committed)
|
|
26
|
+
│ └── contracts/ # Hardhat project (if contracts or INFT selected)
|
|
27
|
+
│ ├── contracts/ # Solidity source files
|
|
28
|
+
│ └── scripts/ # Deploy scripts
|
|
29
|
+
├── scripts/
|
|
30
|
+
│ └── patch-0g-sdk.js # Patches @0glabs/0g-ts-sdk ABI for current testnet
|
|
31
|
+
└── package.json # Root workspace scripts
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Quick Start
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
npx create-0g-app@latest my-app
|
|
40
|
+
cd my-app
|
|
41
|
+
|
|
42
|
+
# Add your private key to packages/web/.env.local
|
|
43
|
+
# Get testnet OG tokens at https://faucet.0g.ai
|
|
44
|
+
|
|
45
|
+
npm run dev # Start dev server at localhost:3000
|
|
46
|
+
npm run deploy # Deploy contracts to 0G Galileo testnet
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Features
|
|
52
|
+
|
|
53
|
+
### Contracts (Hardhat + 0G Galileo)
|
|
54
|
+
|
|
55
|
+
Scaffolds a Hardhat project targeting the 0G Galileo testnet (chain ID `16602`).
|
|
56
|
+
|
|
57
|
+
**Key files:**
|
|
58
|
+
- `packages/contracts/contracts/MyContract.sol` — your Solidity contract
|
|
59
|
+
- `packages/contracts/scripts/deploy.ts` — deploys and writes address to `.env.local`
|
|
60
|
+
- `packages/contracts/hardhat.config.ts` — pre-configured for 0G Galileo
|
|
61
|
+
|
|
62
|
+
**Commands:**
|
|
63
|
+
```bash
|
|
64
|
+
npm run deploy # compile + deploy to Galileo testnet
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**RPC:** `https://evmrpc-testnet.0g.ai`
|
|
68
|
+
|
|
69
|
+
**Explorer:** `https://chainscan-galileo.0g.ai`
|
|
70
|
+
|
|
71
|
+
**Docs:** https://docs.0g.ai/developer-hub/building-on-0g/contracts
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
### Storage (`@0glabs/0g-ts-sdk`)
|
|
76
|
+
|
|
77
|
+
Uploads and retrieves files from 0G decentralized storage. Files are split into chunks, Merkle-tree verified, and dispersed across storage nodes. The Merkle root (`rootHash`) is recorded on-chain as a permanent content address.
|
|
78
|
+
|
|
79
|
+
**Key files:**
|
|
80
|
+
- `packages/web/app/api/upload/route.ts` — server-side upload handler
|
|
81
|
+
- `packages/web/app/api/download/[rootHash]/route.ts` — server-side download handler
|
|
82
|
+
- `packages/web/lib/0g-storage.ts` — client helpers (`uploadFile`, `downloadFile`)
|
|
83
|
+
- `packages/web/components/StorageSection.tsx` — upload/download UI
|
|
84
|
+
|
|
85
|
+
**Key SDK calls:**
|
|
86
|
+
```ts
|
|
87
|
+
import { ZgFile, Indexer } from "@0glabs/0g-ts-sdk";
|
|
88
|
+
|
|
89
|
+
const zgFile = await ZgFile.fromFilePath(tmpPath);
|
|
90
|
+
const [tree, err] = await zgFile.merkleTree(); // build Merkle tree
|
|
91
|
+
const [tx, uploadErr] = await indexer.upload(zgFile, RPC_URL, signer as any);
|
|
92
|
+
// tx.rootHash = permanent content address
|
|
93
|
+
// tx.txHash = on-chain submission transaction
|
|
94
|
+
|
|
95
|
+
const dlErr = await indexer.download(rootHash, outPath, false); // retrieve by root hash
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
> **Note:** `scripts/patch-0g-sdk.js` patches the SDK's ABI to match the current testnet `FixedPriceFlow` contract. It runs automatically on `npm install` via `postinstall`.
|
|
99
|
+
|
|
100
|
+
**Docs:** https://docs.0g.ai/developer-hub/building-on-0g/storage/sdk
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
### Compute (`@0glabs/0g-serving-broker`)
|
|
105
|
+
|
|
106
|
+
Routes AI inference through the 0G compute network. Every query is cryptographically verified and paid for on-chain using OG tokens via a ledger/escrow system. The API is OpenAI-compatible.
|
|
107
|
+
|
|
108
|
+
**Key files:**
|
|
109
|
+
- `packages/web/app/api/compute/broker.ts` — broker singleton, ledger management
|
|
110
|
+
- `packages/web/app/api/compute/route.ts` — inference endpoint
|
|
111
|
+
- `packages/web/app/api/compute/setup/route.ts` — one-time provider setup
|
|
112
|
+
- `packages/web/components/ComputeSection.tsx` — chat UI
|
|
113
|
+
|
|
114
|
+
**Payment flow:**
|
|
115
|
+
1. `broker.ledger.addLedger(3)` — deposit 3 OG into on-chain escrow (one-time per wallet)
|
|
116
|
+
2. `broker.inference.acknowledgeProviderSigner(providerAddress)` — whitelist the provider
|
|
117
|
+
3. `broker.ledger.transferFund(providerAddress, "inference", 1_OG)` — fund provider sub-account
|
|
118
|
+
4. `broker.inference.getRequestHeaders(providerAddress, query)` — sign each request off-chain
|
|
119
|
+
5. HTTP call to provider's OpenAI-compatible endpoint
|
|
120
|
+
6. `broker.inference.processResponse(providerAddress, chatId, content)` — settle micropayment
|
|
121
|
+
|
|
122
|
+
**Key SDK calls:**
|
|
123
|
+
```ts
|
|
124
|
+
import { createZGComputeNetworkBroker } from "@0glabs/0g-serving-broker";
|
|
125
|
+
|
|
126
|
+
const broker = await createZGComputeNetworkBroker(signer);
|
|
127
|
+
const { endpoint, model } = await broker.inference.getServiceMetadata(providerAddress);
|
|
128
|
+
const headers = await broker.inference.getRequestHeaders(providerAddress, query);
|
|
129
|
+
// use with openai client: new OpenAI({ baseURL: endpoint }).chat.completions.create(...)
|
|
130
|
+
await broker.inference.processResponse(providerAddress, chatId, content);
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
**Env vars required:**
|
|
134
|
+
```
|
|
135
|
+
PRIVATE_KEY= # pays for inference (server-side only)
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
> **Important:** Run provider setup once per wallet. Each setup call transfers 1 OG to the provider sub-account.
|
|
139
|
+
|
|
140
|
+
**Docs:** https://docs.0g.ai/developer-hub/building-on-0g/compute-network/inference
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
### INFT — Intelligent NFTs (`@0glabs/0g-ts-sdk` + ERC-721)
|
|
145
|
+
|
|
146
|
+
Mints ERC-721 tokens whose metadata lives on 0G decentralized storage. The `storageRoot` (Merkle root of the metadata file) and `metadataHash` (keccak256 of the JSON) are recorded on-chain, making metadata verifiable and tamper-proof.
|
|
147
|
+
|
|
148
|
+
**Key files:**
|
|
149
|
+
- `packages/contracts/contracts/INFT.sol` — ERC-721 contract with `mint(to, storageRoot, metadataHash)`
|
|
150
|
+
- `packages/contracts/scripts/deployINFT.ts` — deploys and writes address to `.env.local`
|
|
151
|
+
- `packages/web/app/api/inft/mint/route.ts` — uploads metadata to 0G Storage then mints on-chain
|
|
152
|
+
- `packages/web/app/api/inft/token/route.ts` — fetches token owner + metadata from chain + storage
|
|
153
|
+
- `packages/web/lib/0g-inft.ts` — client helpers (`mintINFT`, `getToken`)
|
|
154
|
+
- `packages/web/components/INFTSection.tsx` — mint + lookup UI
|
|
155
|
+
|
|
156
|
+
**Mint flow:**
|
|
157
|
+
```ts
|
|
158
|
+
// 1. Build metadata JSON
|
|
159
|
+
const metadata = { name, description, createdAt: Date.now() };
|
|
160
|
+
|
|
161
|
+
// 2. Upload to 0G Storage → get storageRoot
|
|
162
|
+
const [tx] = await indexer.upload(zgFile, RPC_URL, signer as any);
|
|
163
|
+
const storageRoot = tx.rootHash;
|
|
164
|
+
|
|
165
|
+
// 3. Compute metadata hash for tamper detection
|
|
166
|
+
const metadataHash = ethers.keccak256(ethers.toUtf8Bytes(JSON.stringify(metadata)));
|
|
167
|
+
|
|
168
|
+
// 4. Mint on-chain — records ownership + both hashes permanently
|
|
169
|
+
await contract.mint(recipient, storageRoot, metadataHash);
|
|
170
|
+
|
|
171
|
+
// 5. Parse INFTMinted event for tokenId
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
**Env vars required:**
|
|
175
|
+
```
|
|
176
|
+
PRIVATE_KEY= # deploy + sign storage + pay gas
|
|
177
|
+
NEXT_PUBLIC_INFT_ADDRESS= # auto-populated after `npm run deploy`
|
|
178
|
+
STORAGE_INDEXER_RPC=https://indexer-storage-testnet-turbo.0g.ai
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Docs:** https://docs.0g.ai/developer-hub/building-on-0g/inft/integration
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## Environment Variables
|
|
186
|
+
|
|
187
|
+
All env vars live in `packages/web/.env.local` (copied from `.env.example` on scaffold).
|
|
188
|
+
|
|
189
|
+
| Variable | Required for | Description |
|
|
190
|
+
|---|---|---|
|
|
191
|
+
| `NEXT_PUBLIC_RPC_URL` | All | 0G Galileo EVM RPC |
|
|
192
|
+
| `NEXT_PUBLIC_CHAIN_ID` | All | `16602` (Galileo testnet) |
|
|
193
|
+
| `PRIVATE_KEY` | Contracts, Storage, Compute, INFT | Server-side signing key. Never exposed to browser. |
|
|
194
|
+
| `STORAGE_INDEXER_RPC` | Storage, INFT | 0G Storage indexer endpoint |
|
|
195
|
+
| `NEXT_PUBLIC_CONTRACT_ADDRESS` | Contracts | Auto-written by deploy script |
|
|
196
|
+
| `NEXT_PUBLIC_INFT_ADDRESS` | INFT | Auto-written by deploy script |
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
## Testnet Resources
|
|
201
|
+
|
|
202
|
+
| Resource | URL |
|
|
203
|
+
|---|---|
|
|
204
|
+
| Faucet (get OG tokens) | https://faucet.0g.ai |
|
|
205
|
+
| Explorer | https://chainscan-galileo.0g.ai |
|
|
206
|
+
| RPC | https://evmrpc-testnet.0g.ai |
|
|
207
|
+
| Storage Indexer | https://indexer-storage-testnet-turbo.0g.ai |
|
|
208
|
+
| 0G Docs | https://docs.0g.ai |
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## Stack
|
|
213
|
+
|
|
214
|
+
- **Frontend:** Next.js 15, React 19, TypeScript
|
|
215
|
+
- **Wallet:** wagmi 2 + viem (0G Galileo chain pre-configured)
|
|
216
|
+
- **Contracts:** Hardhat, Solidity, ethers v6
|
|
217
|
+
- **Storage:** `@0glabs/0g-ts-sdk`
|
|
218
|
+
- **Compute:** `@0glabs/0g-serving-broker`
|
|
219
|
+
- **INFT:** `@0glabs/0g-ts-sdk` + OpenZeppelin ERC-721
|
package/dist/index.js
CHANGED
|
@@ -138,8 +138,7 @@ async function main() {
|
|
|
138
138
|
needsPrivateKey ? ` ${picocolors_1.default.yellow("⚠")} Add your ${picocolors_1.default.bold("PRIVATE_KEY")} to ${picocolors_1.default.cyan(`${projectName}/packages/web/.env.local`)}` : "",
|
|
139
139
|
needsPrivateKey ? ` ${picocolors_1.default.dim("Get testnet OG at https://faucet.0g.ai")}` : "",
|
|
140
140
|
"",
|
|
141
|
-
contracts ? ` ${picocolors_1.default.cyan("npm run deploy")} ${picocolors_1.default.dim("→ deploy contract to Galileo testnet")}` : "",
|
|
142
|
-
inft ? ` ${picocolors_1.default.cyan("npm run deploy:inft")} ${picocolors_1.default.dim("→ deploy INFT contract to Galileo testnet")}` : "",
|
|
141
|
+
(contracts || inft) ? ` ${picocolors_1.default.cyan("npm run deploy")} ${picocolors_1.default.dim("→ deploy contract to Galileo testnet")}` : "",
|
|
143
142
|
` ${picocolors_1.default.cyan("npm run dev")} ${picocolors_1.default.dim("→ start local dev server")}`,
|
|
144
143
|
"",
|
|
145
144
|
` ${picocolors_1.default.dim("Docs: https://docs.0g.ai")}`,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/scaffold.js
CHANGED
|
@@ -98,12 +98,12 @@ function writeContractsPackageJson(targetDir, { inft }) {
|
|
|
98
98
|
}
|
|
99
99
|
function writeWebPackageJson(targetDir, { storage, compute, inft }) {
|
|
100
100
|
const deps = {
|
|
101
|
-
"@tanstack/react-query": "
|
|
102
|
-
next: "
|
|
103
|
-
react: "
|
|
104
|
-
"react-dom": "
|
|
105
|
-
viem: "
|
|
106
|
-
wagmi: "
|
|
101
|
+
"@tanstack/react-query": "5.62.0",
|
|
102
|
+
next: "15.1.7",
|
|
103
|
+
react: "19.0.0",
|
|
104
|
+
"react-dom": "19.0.0",
|
|
105
|
+
viem: "2.21.58",
|
|
106
|
+
wagmi: "2.13.4",
|
|
107
107
|
};
|
|
108
108
|
if (storage) {
|
|
109
109
|
deps["@0glabs/0g-ts-sdk"] = "^0.3.3";
|
|
@@ -181,6 +181,10 @@ function writePageTsx(targetDir, { contracts, storage, compute, inft }) {
|
|
|
181
181
|
? `
|
|
182
182
|
return (
|
|
183
183
|
<main className={styles.main}>
|
|
184
|
+
<div className={styles.hero}>
|
|
185
|
+
<h1 className={styles.heroTitle}>create-0g-app</h1>
|
|
186
|
+
<p className={styles.heroSubtitle}>The fastest way to build on 0G with one command</p>
|
|
187
|
+
</div>
|
|
184
188
|
${contracts ? "<ContractsSection />" : ""}
|
|
185
189
|
${storage ? "<StorageSection />" : ""}
|
|
186
190
|
${compute ? "<ComputeSection />" : ""}
|
|
@@ -221,7 +225,23 @@ function writePageCss(targetDir) {
|
|
|
221
225
|
.main {
|
|
222
226
|
max-width: 800px;
|
|
223
227
|
margin: 0 auto;
|
|
224
|
-
padding:
|
|
228
|
+
padding: 0 24px 80px;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
.hero {
|
|
232
|
+
text-align: center;
|
|
233
|
+
padding: 56px 0 40px;
|
|
234
|
+
}
|
|
235
|
+
.heroTitle {
|
|
236
|
+
font-size: 3rem;
|
|
237
|
+
font-weight: 800;
|
|
238
|
+
color: #1e1b4b;
|
|
239
|
+
letter-spacing: -0.04em;
|
|
240
|
+
margin-bottom: 12px;
|
|
241
|
+
}
|
|
242
|
+
.heroSubtitle {
|
|
243
|
+
font-size: 1.05rem;
|
|
244
|
+
color: #4b5563;
|
|
225
245
|
}
|
|
226
246
|
|
|
227
247
|
/* Landing (no features selected) */
|
package/dist/scaffold.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
2
2
|
|
|
3
3
|
:root {
|
|
4
|
-
--bg: #
|
|
5
|
-
--surface: #
|
|
6
|
-
--border: #
|
|
7
|
-
--accent: #
|
|
8
|
-
--accent-dim: rgba(
|
|
9
|
-
--text: #
|
|
10
|
-
--muted: #
|
|
11
|
-
--error: #
|
|
12
|
-
--success: #
|
|
4
|
+
--bg: #faf5ff;
|
|
5
|
+
--surface: #ffffff;
|
|
6
|
+
--border: #e9d5ff;
|
|
7
|
+
--accent: #9333ea;
|
|
8
|
+
--accent-dim: rgba(147, 51, 234, 0.08);
|
|
9
|
+
--text: #111827;
|
|
10
|
+
--muted: #4b5563;
|
|
11
|
+
--error: #ef4444;
|
|
12
|
+
--success: #10b981;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
body {
|
|
16
|
-
background:
|
|
16
|
+
background: linear-gradient(135deg, #f5f3ff 0%, #faf5ff 50%, #eef2ff 100%);
|
|
17
|
+
background-attachment: fixed;
|
|
17
18
|
color: var(--text);
|
|
18
19
|
font-family: var(--font-geist-sans), system-ui, sans-serif;
|
|
19
20
|
min-height: 100vh;
|
|
@@ -4,10 +4,12 @@
|
|
|
4
4
|
justify-content: space-between;
|
|
5
5
|
padding: 0 24px;
|
|
6
6
|
height: 56px;
|
|
7
|
-
border-bottom: 1px solid
|
|
7
|
+
border-bottom: 1px solid #f3e8ff;
|
|
8
8
|
position: sticky;
|
|
9
9
|
top: 0;
|
|
10
|
-
background:
|
|
10
|
+
background: rgba(255, 255, 255, 0.7);
|
|
11
|
+
backdrop-filter: blur(12px);
|
|
12
|
+
-webkit-backdrop-filter: blur(12px);
|
|
11
13
|
z-index: 10;
|
|
12
14
|
}
|
|
13
15
|
|
|
@@ -15,12 +17,12 @@
|
|
|
15
17
|
font-size: 1rem;
|
|
16
18
|
font-weight: 700;
|
|
17
19
|
letter-spacing: -0.03em;
|
|
18
|
-
color:
|
|
20
|
+
color: #111827;
|
|
19
21
|
text-decoration: none;
|
|
20
22
|
}
|
|
21
23
|
.logo:hover { text-decoration: none; }
|
|
22
24
|
|
|
23
|
-
.accent { color:
|
|
25
|
+
.accent { color: #9333ea; }
|
|
24
26
|
|
|
25
27
|
.right {
|
|
26
28
|
display: flex;
|
|
@@ -35,11 +37,11 @@
|
|
|
35
37
|
}
|
|
36
38
|
|
|
37
39
|
.btnPrimary {
|
|
38
|
-
background:
|
|
39
|
-
color: #
|
|
40
|
+
background: linear-gradient(135deg, #9333ea, #4f46e5);
|
|
41
|
+
color: #ffffff;
|
|
40
42
|
border: none;
|
|
41
43
|
padding: 7px 16px;
|
|
42
|
-
border-radius:
|
|
44
|
+
border-radius: 20px;
|
|
43
45
|
font-weight: 600;
|
|
44
46
|
cursor: pointer;
|
|
45
47
|
font-size: 0.85rem;
|
|
@@ -49,12 +51,12 @@
|
|
|
49
51
|
|
|
50
52
|
.btnSecondary {
|
|
51
53
|
background: transparent;
|
|
52
|
-
color:
|
|
53
|
-
border: 1px solid
|
|
54
|
+
color: #4b5563;
|
|
55
|
+
border: 1px solid #e9d5ff;
|
|
54
56
|
padding: 5px 12px;
|
|
55
57
|
border-radius: 8px;
|
|
56
58
|
font-size: 0.8rem;
|
|
57
59
|
cursor: pointer;
|
|
58
|
-
transition: border-color 0.15s;
|
|
60
|
+
transition: border-color 0.15s, color 0.15s;
|
|
59
61
|
}
|
|
60
|
-
.btnSecondary:hover { border-color:
|
|
62
|
+
.btnSecondary:hover { border-color: #9333ea; color: #9333ea; }
|
|
@@ -11,7 +11,7 @@ export function Navbar() {
|
|
|
11
11
|
return (
|
|
12
12
|
<nav className={styles.nav}>
|
|
13
13
|
<Link href="/" className={styles.logo}>
|
|
14
|
-
|
|
14
|
+
create-<span className={styles.accent}>0G</span>-app
|
|
15
15
|
</Link>
|
|
16
16
|
<div className={styles.right}>
|
|
17
17
|
{isConnected ? (
|
|
@@ -7,9 +7,11 @@
|
|
|
7
7
|
}
|
|
8
8
|
.section:last-child { border-bottom: none; }
|
|
9
9
|
|
|
10
|
-
.heading { font-size: 1.25rem; font-weight: 700; }
|
|
10
|
+
.heading { font-size: 1.25rem; font-weight: 700; border-left: 3px solid var(--accent); padding-left: 12px; }
|
|
11
11
|
.description { color: var(--muted); font-size: 0.9rem; margin-top: -8px; }
|
|
12
12
|
.hint { color: var(--muted); font-size: 0.85rem; }
|
|
13
|
+
.docsLink { font-size: 0.8rem; color: var(--muted); text-decoration: none; }
|
|
14
|
+
.docsLink:hover { color: var(--accent); }
|
|
13
15
|
|
|
14
16
|
/* Flow sections */
|
|
15
17
|
.flow {
|
|
@@ -33,7 +35,7 @@
|
|
|
33
35
|
user-select: none;
|
|
34
36
|
}
|
|
35
37
|
.flowHeading::-webkit-details-marker { display: none; }
|
|
36
|
-
.flowHeading::before { content: "
|
|
38
|
+
.flowHeading::before { content: "›"; font-size: 0.75rem; transition: transform 0.15s; }
|
|
37
39
|
details[open] > .flowHeading::before { transform: rotate(90deg); }
|
|
38
40
|
|
|
39
41
|
.flowList {
|
|
@@ -117,7 +119,7 @@ details[open] > .flowHeading::before { transform: rotate(90deg); }
|
|
|
117
119
|
user-select: none;
|
|
118
120
|
}
|
|
119
121
|
.setupSubtitle::-webkit-details-marker { display: none; }
|
|
120
|
-
.setupSubtitle::before { content: "
|
|
122
|
+
.setupSubtitle::before { content: "›"; font-size: 0.75rem; transition: transform 0.15s; }
|
|
121
123
|
details[open] > .setupSubtitle::before { transform: rotate(90deg); }
|
|
122
124
|
|
|
123
125
|
.setupSteps {
|
|
@@ -159,17 +161,17 @@ details[open] > .setupSubtitle::before { transform: rotate(90deg); }
|
|
|
159
161
|
}
|
|
160
162
|
|
|
161
163
|
.btnSetup {
|
|
162
|
-
background:
|
|
163
|
-
color:
|
|
164
|
-
border:
|
|
164
|
+
background: #1e1b4b;
|
|
165
|
+
color: #ffffff;
|
|
166
|
+
border: none;
|
|
165
167
|
padding: 8px 18px;
|
|
166
168
|
border-radius: 8px;
|
|
167
169
|
font-weight: 600;
|
|
168
170
|
font-size: 0.88rem;
|
|
169
171
|
cursor: pointer;
|
|
170
|
-
transition:
|
|
172
|
+
transition: background 0.15s;
|
|
171
173
|
}
|
|
172
|
-
.btnSetup:hover:not(:disabled) {
|
|
174
|
+
.btnSetup:hover:not(:disabled) { background: #312e81; }
|
|
173
175
|
.btnSetup:disabled { opacity: 0.4; cursor: not-allowed; }
|
|
174
176
|
|
|
175
177
|
.setupSuccess { font-size: 0.85rem; color: #065f46; }
|
|
@@ -237,7 +239,7 @@ details[open] > .setupSubtitle::before { transform: rotate(90deg); }
|
|
|
237
239
|
|
|
238
240
|
.btn {
|
|
239
241
|
background: var(--accent);
|
|
240
|
-
color: #
|
|
242
|
+
color: #fff;
|
|
241
243
|
border: none;
|
|
242
244
|
padding: 10px 20px;
|
|
243
245
|
border-radius: 8px;
|
|
@@ -78,7 +78,7 @@ export function ComputeSection() {
|
|
|
78
78
|
<h2 className={styles.heading}>Compute</h2>
|
|
79
79
|
<p className={styles.description}>
|
|
80
80
|
Just like making an OpenAI API call, except every query is cryptographically
|
|
81
|
-
verified and paid for onchain using 0G tokens.
|
|
81
|
+
verified and paid for onchain using 0G tokens. <a className={styles.docsLink} href="https://docs.0g.ai/developer-hub/building-on-0g/compute-network/inference" target="_blank" rel="noopener noreferrer">Docs ↗</a>
|
|
82
82
|
</p>
|
|
83
83
|
|
|
84
84
|
{/* Main Flow */}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "es2020",
|
|
4
|
+
"module": "commonjs",
|
|
5
|
+
"moduleResolution": "node",
|
|
6
|
+
"esModuleInterop": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"skipLibCheck": true,
|
|
9
|
+
"resolveJsonModule": true,
|
|
10
|
+
"outDir": "dist"
|
|
11
|
+
},
|
|
12
|
+
"include": ["hardhat.config.ts", "scripts/**/*.ts", "test/**/*.ts"]
|
|
13
|
+
}
|
|
@@ -7,7 +7,17 @@
|
|
|
7
7
|
}
|
|
8
8
|
.section:last-child { border-bottom: none; }
|
|
9
9
|
|
|
10
|
-
.heading { font-size: 1.25rem; font-weight: 700; }
|
|
10
|
+
.heading { font-size: 1.25rem; font-weight: 700; border-left: 3px solid var(--accent); padding-left: 12px; }
|
|
11
|
+
|
|
12
|
+
.card {
|
|
13
|
+
background: var(--surface);
|
|
14
|
+
border: 1px solid var(--border);
|
|
15
|
+
border-radius: 12px;
|
|
16
|
+
padding: 20px 24px;
|
|
17
|
+
display: flex;
|
|
18
|
+
flex-direction: column;
|
|
19
|
+
gap: 12px;
|
|
20
|
+
}
|
|
11
21
|
|
|
12
22
|
.line { color: var(--muted); font-size: 0.9rem; }
|
|
13
23
|
|
|
@@ -4,12 +4,14 @@ export function ContractsSection() {
|
|
|
4
4
|
return (
|
|
5
5
|
<section className={styles.section}>
|
|
6
6
|
<h2 className={styles.heading}>Contracts</h2>
|
|
7
|
-
<
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
<div className={styles.card}>
|
|
8
|
+
<p className={styles.line}>
|
|
9
|
+
Your contract lives at <code className={styles.code}>packages/contracts/contracts/MyContract.sol</code>
|
|
10
|
+
</p>
|
|
11
|
+
<p className={styles.line}>
|
|
12
|
+
To deploy to 0G Galileo testnet, run <code className={styles.code}>npm run deploy</code>
|
|
13
|
+
</p>
|
|
14
|
+
</div>
|
|
13
15
|
</section>
|
|
14
16
|
);
|
|
15
17
|
}
|
|
@@ -7,8 +7,58 @@
|
|
|
7
7
|
}
|
|
8
8
|
.section:last-child { border-bottom: none; }
|
|
9
9
|
|
|
10
|
-
.heading { font-size: 1.25rem; font-weight: 700; }
|
|
10
|
+
.heading { font-size: 1.25rem; font-weight: 700; border-left: 3px solid var(--accent); padding-left: 12px; }
|
|
11
11
|
.description { color: var(--muted); font-size: 0.9rem; margin-top: -8px; }
|
|
12
|
+
.docsLink { font-size: 0.8rem; color: var(--muted); text-decoration: none; }
|
|
13
|
+
.docsLink:hover { color: var(--accent); }
|
|
14
|
+
|
|
15
|
+
/* Flow sections */
|
|
16
|
+
.flow {
|
|
17
|
+
display: flex;
|
|
18
|
+
flex-direction: column;
|
|
19
|
+
gap: 8px;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.flowHeading {
|
|
23
|
+
font-size: 0.78rem;
|
|
24
|
+
font-weight: 700;
|
|
25
|
+
text-transform: uppercase;
|
|
26
|
+
letter-spacing: 0.07em;
|
|
27
|
+
color: var(--muted);
|
|
28
|
+
margin: 0;
|
|
29
|
+
cursor: pointer;
|
|
30
|
+
list-style: none;
|
|
31
|
+
display: flex;
|
|
32
|
+
align-items: center;
|
|
33
|
+
gap: 6px;
|
|
34
|
+
user-select: none;
|
|
35
|
+
}
|
|
36
|
+
.flowHeading::-webkit-details-marker { display: none; }
|
|
37
|
+
.flowHeading::before { content: "›"; font-size: 0.75rem; transition: transform 0.15s; }
|
|
38
|
+
details[open] > .flowHeading::before { transform: rotate(90deg); }
|
|
39
|
+
|
|
40
|
+
.flowList {
|
|
41
|
+
margin-top: 8px;
|
|
42
|
+
display: flex;
|
|
43
|
+
flex-direction: column;
|
|
44
|
+
gap: 6px;
|
|
45
|
+
padding-left: 20px;
|
|
46
|
+
margin: 0;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.flowList li {
|
|
50
|
+
font-size: 0.875rem;
|
|
51
|
+
line-height: 1.6;
|
|
52
|
+
color: var(--text);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.flowList code {
|
|
56
|
+
font-family: monospace;
|
|
57
|
+
font-size: 0.82rem;
|
|
58
|
+
background: var(--border);
|
|
59
|
+
padding: 1px 5px;
|
|
60
|
+
border-radius: 4px;
|
|
61
|
+
}
|
|
12
62
|
|
|
13
63
|
.card {
|
|
14
64
|
background: var(--surface);
|
|
@@ -70,7 +120,7 @@
|
|
|
70
120
|
.btn {
|
|
71
121
|
align-self: flex-start;
|
|
72
122
|
background: var(--accent);
|
|
73
|
-
color: #
|
|
123
|
+
color: #fff;
|
|
74
124
|
border: none;
|
|
75
125
|
padding: 10px 20px;
|
|
76
126
|
border-radius: 8px;
|
|
@@ -57,9 +57,53 @@ export function INFTSection() {
|
|
|
57
57
|
<section className={styles.section}>
|
|
58
58
|
<h2 className={styles.heading}>INFT</h2>
|
|
59
59
|
<p className={styles.description}>
|
|
60
|
-
Mint Intelligent NFTs — metadata stored on 0G Storage, ownership on 0G Chain.
|
|
60
|
+
Mint Intelligent NFTs — metadata stored on 0G Storage, ownership on 0G Chain. <a className={styles.docsLink} href="https://docs.0g.ai/developer-hub/building-on-0g/inft/integration" target="_blank" rel="noopener noreferrer">Docs ↗</a>
|
|
61
61
|
</p>
|
|
62
62
|
|
|
63
|
+
{/* Mint flow */}
|
|
64
|
+
<details className={styles.flow}>
|
|
65
|
+
<summary className={styles.flowHeading}>Mint flow</summary>
|
|
66
|
+
<ol className={styles.flowList}>
|
|
67
|
+
<li>
|
|
68
|
+
Build metadata JSON <code>{"{ name, description, createdAt }"}</code> on the server
|
|
69
|
+
</li>
|
|
70
|
+
<li>
|
|
71
|
+
<code>indexer.upload(zgFile, RPC_URL, signer)</code> — upload metadata to
|
|
72
|
+
0G Storage, returns <code>storageRoot</code> (Merkle root = content address)
|
|
73
|
+
</li>
|
|
74
|
+
<li>
|
|
75
|
+
<code>ethers.keccak256(metadataJSON)</code> — compute <code>metadataHash</code>{" "}
|
|
76
|
+
so anyone can verify the metadata hasn't been tampered with
|
|
77
|
+
</li>
|
|
78
|
+
<li>
|
|
79
|
+
<code>contract.mint(recipient, storageRoot, metadataHash)</code> — call{" "}
|
|
80
|
+
<code>INFT.sol</code> on-chain, recording ownership and both hashes permanently
|
|
81
|
+
</li>
|
|
82
|
+
<li>
|
|
83
|
+
Parse <code>INFTMinted</code> event log to extract the new <code>tokenId</code>
|
|
84
|
+
</li>
|
|
85
|
+
</ol>
|
|
86
|
+
</details>
|
|
87
|
+
|
|
88
|
+
{/* Lookup flow */}
|
|
89
|
+
<details className={styles.flow}>
|
|
90
|
+
<summary className={styles.flowHeading}>Lookup flow</summary>
|
|
91
|
+
<ol className={styles.flowList}>
|
|
92
|
+
<li>
|
|
93
|
+
Read <code>owner</code>, <code>storageRoot</code>, and <code>metadataHash</code>{" "}
|
|
94
|
+
from the contract on-chain by token ID
|
|
95
|
+
</li>
|
|
96
|
+
<li>
|
|
97
|
+
<code>indexer.download(storageRoot)</code> — fetch the metadata JSON from
|
|
98
|
+
0G Storage nodes using the Merkle root
|
|
99
|
+
</li>
|
|
100
|
+
<li>
|
|
101
|
+
Recompute <code>keccak256</code> of fetched JSON and compare to on-chain{" "}
|
|
102
|
+
<code>metadataHash</code> to verify integrity
|
|
103
|
+
</li>
|
|
104
|
+
</ol>
|
|
105
|
+
</details>
|
|
106
|
+
|
|
63
107
|
{/* ── Mint ── */}
|
|
64
108
|
<div className={styles.card}>
|
|
65
109
|
<h3 className={styles.cardTitle}>Mint an INFT</h3>
|
|
@@ -7,9 +7,59 @@
|
|
|
7
7
|
}
|
|
8
8
|
.section:last-child { border-bottom: none; }
|
|
9
9
|
|
|
10
|
-
.heading { font-size: 1.25rem; font-weight: 700; }
|
|
10
|
+
.heading { font-size: 1.25rem; font-weight: 700; border-left: 3px solid var(--accent); padding-left: 12px; }
|
|
11
11
|
.description { color: var(--muted); font-size: 0.9rem; margin-top: -8px; }
|
|
12
12
|
.hint { color: var(--muted); font-size: 0.9rem; }
|
|
13
|
+
.docsLink { font-size: 0.8rem; color: var(--muted); text-decoration: none; }
|
|
14
|
+
.docsLink:hover { color: var(--accent); }
|
|
15
|
+
|
|
16
|
+
/* Flow sections */
|
|
17
|
+
.flow {
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-direction: column;
|
|
20
|
+
gap: 8px;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.flowHeading {
|
|
24
|
+
font-size: 0.78rem;
|
|
25
|
+
font-weight: 700;
|
|
26
|
+
text-transform: uppercase;
|
|
27
|
+
letter-spacing: 0.07em;
|
|
28
|
+
color: var(--muted);
|
|
29
|
+
margin: 0;
|
|
30
|
+
cursor: pointer;
|
|
31
|
+
list-style: none;
|
|
32
|
+
display: flex;
|
|
33
|
+
align-items: center;
|
|
34
|
+
gap: 6px;
|
|
35
|
+
user-select: none;
|
|
36
|
+
}
|
|
37
|
+
.flowHeading::-webkit-details-marker { display: none; }
|
|
38
|
+
.flowHeading::before { content: "›"; font-size: 0.75rem; transition: transform 0.15s; }
|
|
39
|
+
details[open] > .flowHeading::before { transform: rotate(90deg); }
|
|
40
|
+
|
|
41
|
+
.flowList {
|
|
42
|
+
margin-top: 8px;
|
|
43
|
+
display: flex;
|
|
44
|
+
flex-direction: column;
|
|
45
|
+
gap: 6px;
|
|
46
|
+
padding-left: 20px;
|
|
47
|
+
margin: 0;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
.flowList li {
|
|
51
|
+
font-size: 0.875rem;
|
|
52
|
+
line-height: 1.6;
|
|
53
|
+
color: var(--text);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
.flowList code {
|
|
57
|
+
font-family: monospace;
|
|
58
|
+
font-size: 0.82rem;
|
|
59
|
+
background: var(--border);
|
|
60
|
+
padding: 1px 5px;
|
|
61
|
+
border-radius: 4px;
|
|
62
|
+
}
|
|
13
63
|
|
|
14
64
|
.dropzone {
|
|
15
65
|
border: 2px dashed var(--border);
|
|
@@ -23,6 +73,7 @@
|
|
|
23
73
|
align-items: center;
|
|
24
74
|
gap: 8px;
|
|
25
75
|
font-size: 0.9rem;
|
|
76
|
+
background: #ffffff;
|
|
26
77
|
}
|
|
27
78
|
.dropzone:hover, .over { border-color: var(--accent); background: var(--accent-dim); }
|
|
28
79
|
.icon { font-size: 1.5rem; color: var(--accent); }
|
|
@@ -30,7 +30,43 @@ export function StorageSection() {
|
|
|
30
30
|
return (
|
|
31
31
|
<section className={styles.section}>
|
|
32
32
|
<h2 className={styles.heading}>Storage</h2>
|
|
33
|
-
<p className={styles.description}>Upload files to 0G decentralized storage
|
|
33
|
+
<p className={styles.description}>Upload files to 0G decentralized storage. <a className={styles.docsLink} href="https://docs.0g.ai/developer-hub/building-on-0g/storage/sdk" target="_blank" rel="noopener noreferrer">Docs ↗</a></p>
|
|
34
|
+
|
|
35
|
+
{/* Upload flow */}
|
|
36
|
+
<details className={styles.flow}>
|
|
37
|
+
<summary className={styles.flowHeading}>Upload flow</summary>
|
|
38
|
+
<ol className={styles.flowList}>
|
|
39
|
+
<li>
|
|
40
|
+
<code>ZgFile.fromFilePath</code> — wraps the file into a 0G file object
|
|
41
|
+
</li>
|
|
42
|
+
<li>
|
|
43
|
+
<code>zgFile.merkleTree()</code> — builds a Merkle tree of the file's
|
|
44
|
+
chunks so the network can verify data integrity during retrieval
|
|
45
|
+
</li>
|
|
46
|
+
<li>
|
|
47
|
+
<code>indexer.upload(zgFile, RPC_URL, signer)</code> — disperses file chunks
|
|
48
|
+
across 0G storage nodes and records the Merkle root on-chain, paying gas
|
|
49
|
+
</li>
|
|
50
|
+
<li>
|
|
51
|
+
Returns <code>rootHash</code> (Merkle root = permanent content address)
|
|
52
|
+
and <code>txHash</code> (on-chain record)
|
|
53
|
+
</li>
|
|
54
|
+
</ol>
|
|
55
|
+
</details>
|
|
56
|
+
|
|
57
|
+
{/* Download flow */}
|
|
58
|
+
<details className={styles.flow}>
|
|
59
|
+
<summary className={styles.flowHeading}>Download flow</summary>
|
|
60
|
+
<ol className={styles.flowList}>
|
|
61
|
+
<li>
|
|
62
|
+
<code>indexer.download(rootHash, tmpPath)</code> — fetches file chunks
|
|
63
|
+
from storage nodes by Merkle root, verifying each chunk against the tree
|
|
64
|
+
</li>
|
|
65
|
+
<li>
|
|
66
|
+
File is streamed back to the browser as a binary download
|
|
67
|
+
</li>
|
|
68
|
+
</ol>
|
|
69
|
+
</details>
|
|
34
70
|
|
|
35
71
|
<div
|
|
36
72
|
className={`${styles.dropzone} ${uploadState.status === "uploading" ? styles.over : ""}`}
|