plotlink-ows 0.1.13
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/LICENSE +21 -0
- package/README.md +151 -0
- package/app/db.ts +8 -0
- package/app/lib/llm-client.ts +265 -0
- package/app/lib/paths.ts +11 -0
- package/app/lib/publish.ts +204 -0
- package/app/lib/writer-prompt.ts +44 -0
- package/app/node_modules/.prisma/local-client/client.d.ts +1 -0
- package/app/node_modules/.prisma/local-client/client.js +5 -0
- package/app/node_modules/.prisma/local-client/default.d.ts +1 -0
- package/app/node_modules/.prisma/local-client/default.js +5 -0
- package/app/node_modules/.prisma/local-client/edge.d.ts +1 -0
- package/app/node_modules/.prisma/local-client/edge.js +184 -0
- package/app/node_modules/.prisma/local-client/index-browser.js +173 -0
- package/app/node_modules/.prisma/local-client/index.d.ts +3304 -0
- package/app/node_modules/.prisma/local-client/index.js +207 -0
- package/app/node_modules/.prisma/local-client/libquery_engine-darwin-arm64.dylib.node +0 -0
- package/app/node_modules/.prisma/local-client/package.json +183 -0
- package/app/node_modules/.prisma/local-client/query_engine_bg.js +2 -0
- package/app/node_modules/.prisma/local-client/query_engine_bg.wasm +0 -0
- package/app/node_modules/.prisma/local-client/runtime/edge-esm.js +35 -0
- package/app/node_modules/.prisma/local-client/runtime/edge.js +35 -0
- package/app/node_modules/.prisma/local-client/runtime/index-browser.d.ts +370 -0
- package/app/node_modules/.prisma/local-client/runtime/index-browser.js +17 -0
- package/app/node_modules/.prisma/local-client/runtime/library.d.ts +3982 -0
- package/app/node_modules/.prisma/local-client/runtime/library.js +147 -0
- package/app/node_modules/.prisma/local-client/runtime/react-native.js +84 -0
- package/app/node_modules/.prisma/local-client/runtime/wasm-compiler-edge.js +85 -0
- package/app/node_modules/.prisma/local-client/runtime/wasm-engine-edge.js +38 -0
- package/app/node_modules/.prisma/local-client/schema.prisma +21 -0
- package/app/node_modules/.prisma/local-client/wasm-edge-light-loader.mjs +5 -0
- package/app/node_modules/.prisma/local-client/wasm-worker-loader.mjs +5 -0
- package/app/node_modules/.prisma/local-client/wasm.d.ts +1 -0
- package/app/node_modules/.prisma/local-client/wasm.js +191 -0
- package/app/prisma/schema.prisma +57 -0
- package/app/routes/auth.ts +173 -0
- package/app/routes/chat.ts +135 -0
- package/app/routes/config.ts +210 -0
- package/app/routes/dashboard.ts +186 -0
- package/app/routes/oauth.ts +150 -0
- package/app/routes/publish.ts +112 -0
- package/app/routes/wallet.ts +99 -0
- package/app/server.ts +154 -0
- package/app/vite.config.ts +19 -0
- package/app/web/App.tsx +102 -0
- package/app/web/components/Chat.tsx +272 -0
- package/app/web/components/Dashboard.tsx +222 -0
- package/app/web/components/LLMSetup.tsx +291 -0
- package/app/web/components/Layout.tsx +235 -0
- package/app/web/components/Login.tsx +62 -0
- package/app/web/components/Publish.tsx +245 -0
- package/app/web/components/Settings.tsx +175 -0
- package/app/web/components/Setup.tsx +84 -0
- package/app/web/components/WalletCard.tsx +117 -0
- package/app/web/dist/assets/index-C9kXlYO_.css +2 -0
- package/app/web/dist/assets/index-CJiiaLHs.js +9 -0
- package/app/web/dist/index.html +16 -0
- package/app/web/index.html +15 -0
- package/app/web/main.tsx +10 -0
- package/app/web/plotlink-logo.svg +5 -0
- package/app/web/styles.css +51 -0
- package/bin/plotlink-ows.js +394 -0
- package/lib/ows/index.ts +3 -0
- package/lib/ows/policy.ts +68 -0
- package/lib/ows/types.ts +14 -0
- package/lib/ows/wallet.ts +70 -0
- package/package.json +79 -0
- package/packages/cli/node_modules/commander/LICENSE +22 -0
- package/packages/cli/node_modules/commander/Readme.md +1149 -0
- package/packages/cli/node_modules/commander/esm.mjs +16 -0
- package/packages/cli/node_modules/commander/index.js +24 -0
- package/packages/cli/node_modules/commander/lib/argument.js +149 -0
- package/packages/cli/node_modules/commander/lib/command.js +2662 -0
- package/packages/cli/node_modules/commander/lib/error.js +39 -0
- package/packages/cli/node_modules/commander/lib/help.js +709 -0
- package/packages/cli/node_modules/commander/lib/option.js +367 -0
- package/packages/cli/node_modules/commander/lib/suggestSimilar.js +101 -0
- package/packages/cli/node_modules/commander/package-support.json +16 -0
- package/packages/cli/node_modules/commander/package.json +82 -0
- package/packages/cli/node_modules/commander/typings/esm.d.mts +3 -0
- package/packages/cli/node_modules/commander/typings/index.d.ts +1045 -0
- package/packages/cli/node_modules/resolve-from/index.d.ts +31 -0
- package/packages/cli/node_modules/resolve-from/index.js +47 -0
- package/packages/cli/node_modules/resolve-from/license +9 -0
- package/packages/cli/node_modules/resolve-from/package.json +36 -0
- package/packages/cli/node_modules/resolve-from/readme.md +72 -0
- package/packages/cli/node_modules/tsup/LICENSE +21 -0
- package/packages/cli/node_modules/tsup/README.md +75 -0
- package/packages/cli/node_modules/tsup/assets/cjs_shims.js +13 -0
- package/packages/cli/node_modules/tsup/assets/esm_shims.js +9 -0
- package/packages/cli/node_modules/tsup/assets/package.json +3 -0
- package/packages/cli/node_modules/tsup/dist/chunk-DI5BO6XE.js +153 -0
- package/packages/cli/node_modules/tsup/dist/chunk-JZ25TPTY.js +42 -0
- package/packages/cli/node_modules/tsup/dist/chunk-PEEXUWMS.js +6 -0
- package/packages/cli/node_modules/tsup/dist/chunk-TWFEYLU4.js +352 -0
- package/packages/cli/node_modules/tsup/dist/chunk-VGC3FXLU.js +203 -0
- package/packages/cli/node_modules/tsup/dist/cli-default.js +12 -0
- package/packages/cli/node_modules/tsup/dist/cli-main.js +8 -0
- package/packages/cli/node_modules/tsup/dist/cli-node.js +14 -0
- package/packages/cli/node_modules/tsup/dist/index.d.ts +511 -0
- package/packages/cli/node_modules/tsup/dist/index.js +1711 -0
- package/packages/cli/node_modules/tsup/dist/rollup.js +6949 -0
- package/packages/cli/node_modules/tsup/package.json +99 -0
- package/packages/cli/node_modules/tsup/schema.json +362 -0
- package/packages/cli/package.json +35 -0
- package/packages/cli/src/commands/agent-register.ts +77 -0
- package/packages/cli/src/commands/chain.ts +29 -0
- package/packages/cli/src/commands/claim.ts +70 -0
- package/packages/cli/src/commands/create.ts +34 -0
- package/packages/cli/src/commands/status.ts +201 -0
- package/packages/cli/src/config.ts +103 -0
- package/packages/cli/src/index.ts +21 -0
- package/packages/cli/src/sdk/abi.ts +222 -0
- package/packages/cli/src/sdk/client.ts +713 -0
- package/packages/cli/src/sdk/constants.ts +56 -0
- package/packages/cli/src/sdk/index.ts +46 -0
- package/packages/cli/src/sdk/ipfs.ts +88 -0
- package/packages/cli/src/sdk.ts +36 -0
- package/packages/cli/tsconfig.json +20 -0
- package/packages/cli/tsup.config.ts +14 -0
- package/public/.well-known/farcaster.json +38 -0
- package/public/basescan-icon.svg +4 -0
- package/public/embed-image.png +0 -0
- package/public/favicon.png +0 -0
- package/public/hunt-token.svg +11 -0
- package/public/icon-192.png +0 -0
- package/public/icon.png +0 -0
- package/public/manifest.json +26 -0
- package/public/mc-icon-light.svg +12 -0
- package/public/og-image.png +0 -0
- package/public/plotlink-logo-symbol.svg +5 -0
- package/public/plotlink-logo.svg +5 -0
- package/public/screenshot-1.png +0 -0
- package/public/screenshot-2.png +0 -0
- package/public/screenshot-3.png +0 -0
- package/public/splash.png +0 -0
- package/public/wide-banner.png +0 -0
- package/scripts/backfill-trade-prices.ts +97 -0
- package/scripts/backfill-usd-rates.ts +220 -0
- package/scripts/e2e-verify.ts +1100 -0
- package/scripts/ows-smoke-test.ts +37 -0
- package/scripts/score-users.mjs +203 -0
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
#!/usr/bin/env npx tsx
|
|
2
|
+
/**
|
|
3
|
+
* Backfill trade_history.reserve_usd_rate with PLOT/USD rates.
|
|
4
|
+
*
|
|
5
|
+
* Strategy (tiered):
|
|
6
|
+
* 1. Try exact historical read: priceForNextMint(PLOT_TOKEN) at trade block × HUNT/USD.
|
|
7
|
+
* Some public RPCs (mainnet.base.org, base.drpc.org) support historical state.
|
|
8
|
+
* 2. Fallback: current PLOT/HUNT ratio × historical daily HUNT/USD from CoinGecko.
|
|
9
|
+
* Marked as 'backfill_approx' — PLOT/HUNT ratio shifts with bonding curve supply,
|
|
10
|
+
* so this is directionally correct but not precise for older trades.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* npx tsx scripts/backfill-usd-rates.ts
|
|
14
|
+
*
|
|
15
|
+
* Requires: NEXT_PUBLIC_SUPABASE_URL, SUPABASE_SERVICE_ROLE_KEY
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { createClient } from "@supabase/supabase-js";
|
|
19
|
+
import { createPublicClient, formatEther, http, type PublicClient } from "viem";
|
|
20
|
+
import { base } from "viem/chains";
|
|
21
|
+
import {
|
|
22
|
+
MCV2_BOND,
|
|
23
|
+
PLOT_TOKEN,
|
|
24
|
+
HUNT,
|
|
25
|
+
USDC,
|
|
26
|
+
ONEINCH_SPOT_PRICE_AGGREGATOR,
|
|
27
|
+
} from "../lib/contracts/constants";
|
|
28
|
+
import { priceForNextMintFunction, spotPriceAbi } from "../lib/contracts/abi";
|
|
29
|
+
|
|
30
|
+
const SUPABASE_URL = process.env.NEXT_PUBLIC_SUPABASE_URL || "";
|
|
31
|
+
const SUPABASE_KEY = process.env.SUPABASE_SERVICE_ROLE_KEY || "";
|
|
32
|
+
|
|
33
|
+
if (!SUPABASE_URL || !SUPABASE_KEY) {
|
|
34
|
+
console.error("Missing NEXT_PUBLIC_SUPABASE_URL or SUPABASE_SERVICE_ROLE_KEY");
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const supabase = createClient(SUPABASE_URL, SUPABASE_KEY, {
|
|
39
|
+
auth: { autoRefreshToken: false, persistSession: false },
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// RPCs known to support historical state reads on Base
|
|
43
|
+
const ARCHIVE_RPCS = [
|
|
44
|
+
"https://mainnet.base.org",
|
|
45
|
+
"https://base.drpc.org",
|
|
46
|
+
];
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Try to read PLOT/USD at a historical block using archive-capable RPCs.
|
|
50
|
+
* Returns { rate, source: 'backfill_exact' } or null if all RPCs fail.
|
|
51
|
+
*/
|
|
52
|
+
async function getExactHistoricalRate(blockNumber: bigint): Promise<number | null> {
|
|
53
|
+
for (const rpcUrl of ARCHIVE_RPCS) {
|
|
54
|
+
try {
|
|
55
|
+
const client = createPublicClient({
|
|
56
|
+
chain: base,
|
|
57
|
+
transport: http(rpcUrl, { timeout: 5_000, retryCount: 0 }),
|
|
58
|
+
}) as PublicClient;
|
|
59
|
+
|
|
60
|
+
const [plotInHuntWei, huntUsdRate] = await Promise.all([
|
|
61
|
+
client.readContract({
|
|
62
|
+
address: MCV2_BOND,
|
|
63
|
+
abi: [priceForNextMintFunction],
|
|
64
|
+
functionName: "priceForNextMint",
|
|
65
|
+
args: [PLOT_TOKEN],
|
|
66
|
+
blockNumber,
|
|
67
|
+
}),
|
|
68
|
+
client.readContract({
|
|
69
|
+
address: ONEINCH_SPOT_PRICE_AGGREGATOR,
|
|
70
|
+
abi: spotPriceAbi,
|
|
71
|
+
functionName: "getRate",
|
|
72
|
+
args: [HUNT, USDC, false],
|
|
73
|
+
blockNumber,
|
|
74
|
+
}),
|
|
75
|
+
]);
|
|
76
|
+
|
|
77
|
+
const plotInHunt = Number(formatEther(BigInt(plotInHuntWei)));
|
|
78
|
+
const huntUsd = Number(huntUsdRate) / 1_000_000;
|
|
79
|
+
return plotInHunt * huntUsd;
|
|
80
|
+
} catch {
|
|
81
|
+
// Try next RPC
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Approximate fallback: use current PLOT/HUNT ratio × historical HUNT/USD at
|
|
90
|
+
* the given block. This is more accurate than a single global rate because
|
|
91
|
+
* HUNT/USD varies over time, even though PLOT/HUNT is only current-state.
|
|
92
|
+
*
|
|
93
|
+
* Returns null if the historical HUNT/USD read fails.
|
|
94
|
+
*/
|
|
95
|
+
async function getApproxHistoricalRate(blockNumber: bigint): Promise<number | null> {
|
|
96
|
+
for (const rpcUrl of ARCHIVE_RPCS) {
|
|
97
|
+
try {
|
|
98
|
+
const client = createPublicClient({
|
|
99
|
+
chain: base,
|
|
100
|
+
transport: http(rpcUrl, { timeout: 5_000, retryCount: 0 }),
|
|
101
|
+
}) as PublicClient;
|
|
102
|
+
|
|
103
|
+
// Current PLOT/HUNT (cannot read historically without archive for bonding curve)
|
|
104
|
+
const plotInHuntWei = await client.readContract({
|
|
105
|
+
address: MCV2_BOND,
|
|
106
|
+
abi: [priceForNextMintFunction],
|
|
107
|
+
functionName: "priceForNextMint",
|
|
108
|
+
args: [PLOT_TOKEN],
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
// Historical HUNT/USD at the trade's block
|
|
112
|
+
const huntUsdRate = await client.readContract({
|
|
113
|
+
address: ONEINCH_SPOT_PRICE_AGGREGATOR,
|
|
114
|
+
abi: spotPriceAbi,
|
|
115
|
+
functionName: "getRate",
|
|
116
|
+
args: [HUNT, USDC, false],
|
|
117
|
+
blockNumber,
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
const plotInHunt = Number(formatEther(BigInt(plotInHuntWei)));
|
|
121
|
+
const huntUsd = Number(huntUsdRate) / 1_000_000;
|
|
122
|
+
return plotInHunt * huntUsd;
|
|
123
|
+
} catch {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
async function main() {
|
|
131
|
+
console.log("=== Backfill USD Rates ===");
|
|
132
|
+
|
|
133
|
+
// Fetch trades missing reserve_usd_rate
|
|
134
|
+
const { data: trades, error: fetchError } = await supabase
|
|
135
|
+
.from("trade_history")
|
|
136
|
+
.select("id, block_number, block_timestamp")
|
|
137
|
+
.is("reserve_usd_rate", null)
|
|
138
|
+
.order("block_number", { ascending: true });
|
|
139
|
+
|
|
140
|
+
if (fetchError) {
|
|
141
|
+
console.error("Failed to fetch trades:", fetchError.message);
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (!trades || trades.length === 0) {
|
|
146
|
+
console.log("No trades need USD rate backfill.");
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
console.log(`Found ${trades.length} trades missing USD rates.`);
|
|
151
|
+
|
|
152
|
+
let exact = 0;
|
|
153
|
+
let approx = 0;
|
|
154
|
+
let failed = 0;
|
|
155
|
+
|
|
156
|
+
// Group trades by block to minimize RPC calls
|
|
157
|
+
const blockGroups = new Map<number, typeof trades>();
|
|
158
|
+
for (const trade of trades) {
|
|
159
|
+
const group = blockGroups.get(trade.block_number) || [];
|
|
160
|
+
group.push(trade);
|
|
161
|
+
blockGroups.set(trade.block_number, group);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
console.log(`Trades span ${blockGroups.size} unique blocks.`);
|
|
165
|
+
|
|
166
|
+
for (const [blockNumber, blockTrades] of blockGroups) {
|
|
167
|
+
// Try exact historical rate (both PLOT/HUNT and HUNT/USD at historical block)
|
|
168
|
+
const exactRate = await getExactHistoricalRate(BigInt(blockNumber));
|
|
169
|
+
|
|
170
|
+
// Fallback: current PLOT/HUNT × historical HUNT/USD at this block
|
|
171
|
+
const approxRate = exactRate === null
|
|
172
|
+
? await getApproxHistoricalRate(BigInt(blockNumber))
|
|
173
|
+
: null;
|
|
174
|
+
|
|
175
|
+
const rate = exactRate ?? approxRate;
|
|
176
|
+
const source = exactRate !== null ? "backfill_exact" : "backfill_approx";
|
|
177
|
+
|
|
178
|
+
if (rate === null) {
|
|
179
|
+
console.error(` [SKIP] block=${blockNumber}: no rate available`);
|
|
180
|
+
failed += blockTrades.length;
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// Update all trades in this block
|
|
185
|
+
const ids = blockTrades.map((t) => t.id);
|
|
186
|
+
const { error: updateError } = await supabase
|
|
187
|
+
.from("trade_history")
|
|
188
|
+
.update({ reserve_usd_rate: rate, rate_source: source })
|
|
189
|
+
.in("id", ids);
|
|
190
|
+
|
|
191
|
+
if (updateError) {
|
|
192
|
+
console.error(` [FAIL] block=${blockNumber}: ${updateError.message}`);
|
|
193
|
+
failed += blockTrades.length;
|
|
194
|
+
} else {
|
|
195
|
+
if (source === "backfill_exact") {
|
|
196
|
+
exact += blockTrades.length;
|
|
197
|
+
} else {
|
|
198
|
+
approx += blockTrades.length;
|
|
199
|
+
}
|
|
200
|
+
if (blockGroups.size <= 50 || exact + approx <= 10) {
|
|
201
|
+
console.log(` [${source.toUpperCase()}] block=${blockNumber} rate=$${rate.toFixed(8)} (${blockTrades.length} trades)`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Delay between blocks to avoid RPC rate limits
|
|
206
|
+
await new Promise((r) => setTimeout(r, 300));
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
console.log("");
|
|
210
|
+
console.log("=== Backfill complete ===");
|
|
211
|
+
console.log(` Exact: ${exact}`);
|
|
212
|
+
console.log(` Approximate: ${approx}`);
|
|
213
|
+
console.log(` Failed: ${failed}`);
|
|
214
|
+
console.log(` Total: ${trades.length}`);
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
main().catch((err) => {
|
|
218
|
+
console.error("Fatal error:", err);
|
|
219
|
+
process.exit(2);
|
|
220
|
+
});
|