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.
Files changed (142) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +151 -0
  3. package/app/db.ts +8 -0
  4. package/app/lib/llm-client.ts +265 -0
  5. package/app/lib/paths.ts +11 -0
  6. package/app/lib/publish.ts +204 -0
  7. package/app/lib/writer-prompt.ts +44 -0
  8. package/app/node_modules/.prisma/local-client/client.d.ts +1 -0
  9. package/app/node_modules/.prisma/local-client/client.js +5 -0
  10. package/app/node_modules/.prisma/local-client/default.d.ts +1 -0
  11. package/app/node_modules/.prisma/local-client/default.js +5 -0
  12. package/app/node_modules/.prisma/local-client/edge.d.ts +1 -0
  13. package/app/node_modules/.prisma/local-client/edge.js +184 -0
  14. package/app/node_modules/.prisma/local-client/index-browser.js +173 -0
  15. package/app/node_modules/.prisma/local-client/index.d.ts +3304 -0
  16. package/app/node_modules/.prisma/local-client/index.js +207 -0
  17. package/app/node_modules/.prisma/local-client/libquery_engine-darwin-arm64.dylib.node +0 -0
  18. package/app/node_modules/.prisma/local-client/package.json +183 -0
  19. package/app/node_modules/.prisma/local-client/query_engine_bg.js +2 -0
  20. package/app/node_modules/.prisma/local-client/query_engine_bg.wasm +0 -0
  21. package/app/node_modules/.prisma/local-client/runtime/edge-esm.js +35 -0
  22. package/app/node_modules/.prisma/local-client/runtime/edge.js +35 -0
  23. package/app/node_modules/.prisma/local-client/runtime/index-browser.d.ts +370 -0
  24. package/app/node_modules/.prisma/local-client/runtime/index-browser.js +17 -0
  25. package/app/node_modules/.prisma/local-client/runtime/library.d.ts +3982 -0
  26. package/app/node_modules/.prisma/local-client/runtime/library.js +147 -0
  27. package/app/node_modules/.prisma/local-client/runtime/react-native.js +84 -0
  28. package/app/node_modules/.prisma/local-client/runtime/wasm-compiler-edge.js +85 -0
  29. package/app/node_modules/.prisma/local-client/runtime/wasm-engine-edge.js +38 -0
  30. package/app/node_modules/.prisma/local-client/schema.prisma +21 -0
  31. package/app/node_modules/.prisma/local-client/wasm-edge-light-loader.mjs +5 -0
  32. package/app/node_modules/.prisma/local-client/wasm-worker-loader.mjs +5 -0
  33. package/app/node_modules/.prisma/local-client/wasm.d.ts +1 -0
  34. package/app/node_modules/.prisma/local-client/wasm.js +191 -0
  35. package/app/prisma/schema.prisma +57 -0
  36. package/app/routes/auth.ts +173 -0
  37. package/app/routes/chat.ts +135 -0
  38. package/app/routes/config.ts +210 -0
  39. package/app/routes/dashboard.ts +186 -0
  40. package/app/routes/oauth.ts +150 -0
  41. package/app/routes/publish.ts +112 -0
  42. package/app/routes/wallet.ts +99 -0
  43. package/app/server.ts +154 -0
  44. package/app/vite.config.ts +19 -0
  45. package/app/web/App.tsx +102 -0
  46. package/app/web/components/Chat.tsx +272 -0
  47. package/app/web/components/Dashboard.tsx +222 -0
  48. package/app/web/components/LLMSetup.tsx +291 -0
  49. package/app/web/components/Layout.tsx +235 -0
  50. package/app/web/components/Login.tsx +62 -0
  51. package/app/web/components/Publish.tsx +245 -0
  52. package/app/web/components/Settings.tsx +175 -0
  53. package/app/web/components/Setup.tsx +84 -0
  54. package/app/web/components/WalletCard.tsx +117 -0
  55. package/app/web/dist/assets/index-C9kXlYO_.css +2 -0
  56. package/app/web/dist/assets/index-CJiiaLHs.js +9 -0
  57. package/app/web/dist/index.html +16 -0
  58. package/app/web/index.html +15 -0
  59. package/app/web/main.tsx +10 -0
  60. package/app/web/plotlink-logo.svg +5 -0
  61. package/app/web/styles.css +51 -0
  62. package/bin/plotlink-ows.js +394 -0
  63. package/lib/ows/index.ts +3 -0
  64. package/lib/ows/policy.ts +68 -0
  65. package/lib/ows/types.ts +14 -0
  66. package/lib/ows/wallet.ts +70 -0
  67. package/package.json +79 -0
  68. package/packages/cli/node_modules/commander/LICENSE +22 -0
  69. package/packages/cli/node_modules/commander/Readme.md +1149 -0
  70. package/packages/cli/node_modules/commander/esm.mjs +16 -0
  71. package/packages/cli/node_modules/commander/index.js +24 -0
  72. package/packages/cli/node_modules/commander/lib/argument.js +149 -0
  73. package/packages/cli/node_modules/commander/lib/command.js +2662 -0
  74. package/packages/cli/node_modules/commander/lib/error.js +39 -0
  75. package/packages/cli/node_modules/commander/lib/help.js +709 -0
  76. package/packages/cli/node_modules/commander/lib/option.js +367 -0
  77. package/packages/cli/node_modules/commander/lib/suggestSimilar.js +101 -0
  78. package/packages/cli/node_modules/commander/package-support.json +16 -0
  79. package/packages/cli/node_modules/commander/package.json +82 -0
  80. package/packages/cli/node_modules/commander/typings/esm.d.mts +3 -0
  81. package/packages/cli/node_modules/commander/typings/index.d.ts +1045 -0
  82. package/packages/cli/node_modules/resolve-from/index.d.ts +31 -0
  83. package/packages/cli/node_modules/resolve-from/index.js +47 -0
  84. package/packages/cli/node_modules/resolve-from/license +9 -0
  85. package/packages/cli/node_modules/resolve-from/package.json +36 -0
  86. package/packages/cli/node_modules/resolve-from/readme.md +72 -0
  87. package/packages/cli/node_modules/tsup/LICENSE +21 -0
  88. package/packages/cli/node_modules/tsup/README.md +75 -0
  89. package/packages/cli/node_modules/tsup/assets/cjs_shims.js +13 -0
  90. package/packages/cli/node_modules/tsup/assets/esm_shims.js +9 -0
  91. package/packages/cli/node_modules/tsup/assets/package.json +3 -0
  92. package/packages/cli/node_modules/tsup/dist/chunk-DI5BO6XE.js +153 -0
  93. package/packages/cli/node_modules/tsup/dist/chunk-JZ25TPTY.js +42 -0
  94. package/packages/cli/node_modules/tsup/dist/chunk-PEEXUWMS.js +6 -0
  95. package/packages/cli/node_modules/tsup/dist/chunk-TWFEYLU4.js +352 -0
  96. package/packages/cli/node_modules/tsup/dist/chunk-VGC3FXLU.js +203 -0
  97. package/packages/cli/node_modules/tsup/dist/cli-default.js +12 -0
  98. package/packages/cli/node_modules/tsup/dist/cli-main.js +8 -0
  99. package/packages/cli/node_modules/tsup/dist/cli-node.js +14 -0
  100. package/packages/cli/node_modules/tsup/dist/index.d.ts +511 -0
  101. package/packages/cli/node_modules/tsup/dist/index.js +1711 -0
  102. package/packages/cli/node_modules/tsup/dist/rollup.js +6949 -0
  103. package/packages/cli/node_modules/tsup/package.json +99 -0
  104. package/packages/cli/node_modules/tsup/schema.json +362 -0
  105. package/packages/cli/package.json +35 -0
  106. package/packages/cli/src/commands/agent-register.ts +77 -0
  107. package/packages/cli/src/commands/chain.ts +29 -0
  108. package/packages/cli/src/commands/claim.ts +70 -0
  109. package/packages/cli/src/commands/create.ts +34 -0
  110. package/packages/cli/src/commands/status.ts +201 -0
  111. package/packages/cli/src/config.ts +103 -0
  112. package/packages/cli/src/index.ts +21 -0
  113. package/packages/cli/src/sdk/abi.ts +222 -0
  114. package/packages/cli/src/sdk/client.ts +713 -0
  115. package/packages/cli/src/sdk/constants.ts +56 -0
  116. package/packages/cli/src/sdk/index.ts +46 -0
  117. package/packages/cli/src/sdk/ipfs.ts +88 -0
  118. package/packages/cli/src/sdk.ts +36 -0
  119. package/packages/cli/tsconfig.json +20 -0
  120. package/packages/cli/tsup.config.ts +14 -0
  121. package/public/.well-known/farcaster.json +38 -0
  122. package/public/basescan-icon.svg +4 -0
  123. package/public/embed-image.png +0 -0
  124. package/public/favicon.png +0 -0
  125. package/public/hunt-token.svg +11 -0
  126. package/public/icon-192.png +0 -0
  127. package/public/icon.png +0 -0
  128. package/public/manifest.json +26 -0
  129. package/public/mc-icon-light.svg +12 -0
  130. package/public/og-image.png +0 -0
  131. package/public/plotlink-logo-symbol.svg +5 -0
  132. package/public/plotlink-logo.svg +5 -0
  133. package/public/screenshot-1.png +0 -0
  134. package/public/screenshot-2.png +0 -0
  135. package/public/screenshot-3.png +0 -0
  136. package/public/splash.png +0 -0
  137. package/public/wide-banner.png +0 -0
  138. package/scripts/backfill-trade-prices.ts +97 -0
  139. package/scripts/backfill-usd-rates.ts +220 -0
  140. package/scripts/e2e-verify.ts +1100 -0
  141. package/scripts/ows-smoke-test.ts +37 -0
  142. 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
+ });