sealed-precision-oracle 1.0.0

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.
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const hardhat_1 = require("hardhat");
4
+ async function main() {
5
+ const [deployer] = await hardhat_1.ethers.getSigners();
6
+ console.log("Deploying with account:", deployer.address);
7
+ const balance = await hardhat_1.ethers.provider.getBalance(deployer.address);
8
+ console.log("Account balance:", hardhat_1.ethers.formatEther(balance), "0G\n");
9
+ // 1. Deploy the DataVerifier (validates ECDSA signatures in transfer proofs)
10
+ console.log("Deploying OracleDataVerifier...");
11
+ const Verifier = await hardhat_1.ethers.getContractFactory("OracleDataVerifier");
12
+ const verifier = await Verifier.deploy();
13
+ await verifier.waitForDeployment();
14
+ const verifierAddress = await verifier.getAddress();
15
+ console.log("OracleDataVerifier deployed to:", verifierAddress);
16
+ // 2. Deploy the Oracle ID contract with verifier address
17
+ console.log("\nDeploying PrecisionOracleID...");
18
+ const PrecisionOracleID = await hardhat_1.ethers.getContractFactory("PrecisionOracleID");
19
+ const oracle = await PrecisionOracleID.deploy(verifierAddress);
20
+ await oracle.waitForDeployment();
21
+ const oracleAddress = await oracle.getAddress();
22
+ console.log("PrecisionOracleID deployed to:", oracleAddress);
23
+ // 3. Mint the first Oracle agent identity to the deployer
24
+ const mintTx = await oracle.mint(deployer.address);
25
+ await mintTx.wait();
26
+ console.log("Minted Oracle Agent Token #1 to:", deployer.address);
27
+ // 4. Summary
28
+ console.log("\n" + "=".repeat(50));
29
+ console.log(" DEPLOYMENT COMPLETE");
30
+ console.log("=".repeat(50));
31
+ console.log("\nContracts:");
32
+ console.log(" Verifier:", verifierAddress);
33
+ console.log(" Oracle: ", oracleAddress);
34
+ console.log("\nNetwork: 0G Galileo Testnet (Chain ID 16601)");
35
+ console.log("Explorer:", "https://chainscan-galileo.0g.ai/address/" + oracleAddress);
36
+ console.log("\nAdd to your .env:");
37
+ console.log(` ORACLE_CONTRACT_ADDRESS=${oracleAddress}`);
38
+ console.log("\nTo register a TEE signer (after discovering one via the oracle):");
39
+ console.log(" npx hardhat console --network og_galileo");
40
+ console.log(' > const oracle = await ethers.getContractAt("PrecisionOracleID", "' + oracleAddress + '")');
41
+ console.log(' > await oracle.registerTeeSigner("0xTEE_SIGNER_ADDRESS")');
42
+ }
43
+ main().catch((error) => {
44
+ console.error(error);
45
+ process.exitCode = 1;
46
+ });
47
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../scripts/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ import "dotenv/config";
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const hardhat_1 = require("hardhat");
4
+ require("dotenv/config");
5
+ async function main() {
6
+ const oracleAddress = "0xf25E765eF573c26d6314Fd83822564E7AF11C9Ac";
7
+ const teeSigner = "0x4C1b546f5Fc11A9c2428eaFEd1D951Aa13C17ee8";
8
+ console.log("Registering TEE Signer on Mainnet...");
9
+ const oracle = await hardhat_1.ethers.getContractAt("PrecisionOracleID", oracleAddress);
10
+ const tx = await oracle.registerTeeSigner(teeSigner);
11
+ console.log("Transaction hash:", tx.hash);
12
+ await tx.wait();
13
+ console.log("TEE Signer registered successfully!");
14
+ }
15
+ main().catch(console.error);
16
+ //# sourceMappingURL=registerTee.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registerTee.js","sourceRoot":"","sources":["../../scripts/registerTee.ts"],"names":[],"mappings":";;AAAA,qCAAiC;AACjC,yBAAuB;AAEvB,KAAK,UAAU,IAAI;IACf,MAAM,aAAa,GAAG,4CAA4C,CAAC;IACnE,MAAM,SAAS,GAAG,4CAA4C,CAAC;IAE/D,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,MAAM,gBAAM,CAAC,aAAa,CAAC,mBAAmB,EAAE,aAAa,CAAC,CAAC;IAE9E,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAE1C,MAAM,EAAE,CAAC,IAAI,EAAE,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;AACvD,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Multi-market real-time data fetcher.
3
+ * Supports: ETH gas, ETH price, BTC price, and arbitrary token prices.
4
+ * Uses public RPCs and free APIs — no API keys required.
5
+ */
6
+ export interface MarketData {
7
+ marketType: string;
8
+ dataPoints: Record<string, number | string | null>;
9
+ source: string;
10
+ fetchedAt: string;
11
+ }
12
+ export declare function fetchEthGasData(): Promise<MarketData>;
13
+ export declare function fetchCryptoPrice(symbol: string): Promise<MarketData>;
14
+ export declare function fetchMarketData(question: string): Promise<MarketData>;
15
+ export declare function formatMarketDataForPrompt(data: MarketData): string;
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ /**
3
+ * Multi-market real-time data fetcher.
4
+ * Supports: ETH gas, ETH price, BTC price, and arbitrary token prices.
5
+ * Uses public RPCs and free APIs — no API keys required.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.fetchEthGasData = fetchEthGasData;
9
+ exports.fetchCryptoPrice = fetchCryptoPrice;
10
+ exports.fetchMarketData = fetchMarketData;
11
+ exports.formatMarketDataForPrompt = formatMarketDataForPrompt;
12
+ // ─── Helpers ────────────────────────────────────────────────────────────────
13
+ async function jsonFetch(url, options) {
14
+ const res = await fetch(url, {
15
+ ...options,
16
+ signal: AbortSignal.timeout(10000),
17
+ headers: { "Content-Type": "application/json", ...options?.headers },
18
+ });
19
+ if (!res.ok)
20
+ throw new Error(`HTTP ${res.status} from ${url}`);
21
+ return res.json();
22
+ }
23
+ async function rpcCall(url, method, params = []) {
24
+ const data = await jsonFetch(url, {
25
+ method: "POST",
26
+ body: JSON.stringify({ jsonrpc: "2.0", method, params, id: 1 }),
27
+ });
28
+ if (data.error)
29
+ throw new Error(`RPC: ${data.error.message}`);
30
+ return data.result;
31
+ }
32
+ // ─── ETH Gas ────────────────────────────────────────────────────────────────
33
+ const ETH_RPCS = [
34
+ "https://eth.llamarpc.com",
35
+ "https://rpc.ankr.com/eth",
36
+ "https://ethereum-rpc.publicnode.com",
37
+ ];
38
+ async function fetchEthGasData() {
39
+ let lastError = null;
40
+ for (const rpc of ETH_RPCS) {
41
+ try {
42
+ const [gasPrice, blockHex] = await Promise.all([
43
+ rpcCall(rpc, "eth_gasPrice"),
44
+ rpcCall(rpc, "eth_blockNumber"),
45
+ ]);
46
+ const gasPriceGwei = Number(BigInt(gasPrice)) / 1e9;
47
+ const blockNumber = Number(BigInt(blockHex));
48
+ let baseFeeGwei = null;
49
+ try {
50
+ const block = await rpcCall(rpc, "eth_getBlockByNumber", ["latest", false]);
51
+ if (block?.baseFeePerGas) {
52
+ baseFeeGwei = Number(BigInt(block.baseFeePerGas)) / 1e9;
53
+ }
54
+ }
55
+ catch { }
56
+ return {
57
+ marketType: "eth_gas",
58
+ dataPoints: {
59
+ gas_price_gwei: Math.round(gasPriceGwei * 100) / 100,
60
+ base_fee_gwei: baseFeeGwei ? Math.round(baseFeeGwei * 100) / 100 : null,
61
+ block_number: blockNumber,
62
+ },
63
+ source: rpc,
64
+ fetchedAt: new Date().toISOString(),
65
+ };
66
+ }
67
+ catch (err) {
68
+ lastError = err;
69
+ continue;
70
+ }
71
+ }
72
+ throw new Error(`All ETH RPCs failed. Last: ${lastError?.message}`);
73
+ }
74
+ // ─── Crypto Prices (CoinGecko free API — no key) ───────────────────────────
75
+ const COINGECKO_IDS = {
76
+ btc: "bitcoin",
77
+ bitcoin: "bitcoin",
78
+ eth: "ethereum",
79
+ ethereum: "ethereum",
80
+ sol: "solana",
81
+ solana: "solana",
82
+ bnb: "binancecoin",
83
+ matic: "matic-network",
84
+ polygon: "matic-network",
85
+ avax: "avalanche-2",
86
+ dot: "polkadot",
87
+ link: "chainlink",
88
+ uni: "uniswap",
89
+ aave: "aave",
90
+ };
91
+ async function fetchCryptoPrice(symbol) {
92
+ const id = COINGECKO_IDS[symbol.toLowerCase()];
93
+ if (!id) {
94
+ throw new Error(`Unknown symbol "${symbol}". Supported: ${Object.keys(COINGECKO_IDS).join(", ")}`);
95
+ }
96
+ const data = await jsonFetch(`https://api.coingecko.com/api/v3/simple/price?ids=${id}&vs_currencies=usd&include_24hr_change=true&include_market_cap=true&include_24hr_vol=true`);
97
+ const coin = data[id];
98
+ if (!coin)
99
+ throw new Error(`No price data for ${id}`);
100
+ return {
101
+ marketType: "crypto_price",
102
+ dataPoints: {
103
+ symbol: symbol.toUpperCase(),
104
+ price_usd: coin.usd,
105
+ change_24h_pct: coin.usd_24h_change ? Math.round(coin.usd_24h_change * 100) / 100 : null,
106
+ market_cap_usd: coin.usd_market_cap || null,
107
+ volume_24h_usd: coin.usd_24h_vol || null,
108
+ },
109
+ source: "api.coingecko.com",
110
+ fetchedAt: new Date().toISOString(),
111
+ };
112
+ }
113
+ // ─── Auto-detect market type from question ─────────────────────────────────
114
+ async function fetchMarketData(question) {
115
+ const q = question.toLowerCase();
116
+ // Gas price questions
117
+ if (q.includes("gas") || q.includes("gwei")) {
118
+ return fetchEthGasData();
119
+ }
120
+ // Crypto price questions — detect the token
121
+ for (const [symbol, _id] of Object.entries(COINGECKO_IDS)) {
122
+ if (q.includes(symbol.toLowerCase())) {
123
+ return fetchCryptoPrice(symbol);
124
+ }
125
+ }
126
+ // Default: fetch both ETH gas and ETH price for general ETH questions
127
+ if (q.includes("eth")) {
128
+ return fetchEthGasData();
129
+ }
130
+ // Fallback: try BTC if price is mentioned
131
+ if (q.includes("price") || q.includes("exceed") || q.includes("above") || q.includes("below")) {
132
+ // Try to find any crypto mention
133
+ return fetchEthGasData(); // Default to ETH gas
134
+ }
135
+ return fetchEthGasData();
136
+ }
137
+ // ─── Format data for AI prompt ─────────────────────────────────────────────
138
+ function formatMarketDataForPrompt(data) {
139
+ const lines = [`Market type: ${data.marketType}`];
140
+ for (const [key, value] of Object.entries(data.dataPoints)) {
141
+ if (value !== null) {
142
+ lines.push(`${key}: ${value}`);
143
+ }
144
+ }
145
+ lines.push(`Source: ${data.source}`);
146
+ lines.push(`Fetched at: ${data.fetchedAt}`);
147
+ return lines.join("\n");
148
+ }
149
+ // ─── CLI ────────────────────────────────────────────────────────────────────
150
+ if (require.main === module) {
151
+ const query = process.argv[2] || "eth gas";
152
+ console.log(`Fetching data for: "${query}"\n`);
153
+ fetchMarketData(query)
154
+ .then((data) => console.log(JSON.stringify(data, null, 2)))
155
+ .catch((err) => {
156
+ console.error("Failed:", err.message);
157
+ process.exit(1);
158
+ });
159
+ }
160
+ //# sourceMappingURL=fetchMarketData.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetchMarketData.js","sourceRoot":"","sources":["../../src/fetchMarketData.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AAsCH,0CAqCC;AAqBD,4CA2BC;AAID,0CA2BC;AAID,8DAUC;AA/JD,+EAA+E;AAE/E,KAAK,UAAU,SAAS,CAAC,GAAW,EAAE,OAAqB;IACzD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAC3B,GAAG,OAAO;QACV,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAM,CAAC;QACnC,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE;KACrE,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC,CAAC;IAC/D,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;AACpB,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,MAAc,EAAE,SAAoB,EAAE;IACxE,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC;KAChE,CAAC,CAAC;IACH,IAAI,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,OAAO,IAAI,CAAC,MAAM,CAAC;AACrB,CAAC;AAED,+EAA+E;AAE/E,MAAM,QAAQ,GAAG;IACf,0BAA0B;IAC1B,0BAA0B;IAC1B,qCAAqC;CACtC,CAAC;AAEK,KAAK,UAAU,eAAe;IACnC,IAAI,SAAS,GAAiB,IAAI,CAAC;IAEnC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC7C,OAAO,CAAC,GAAG,EAAE,cAAc,CAAC;gBAC5B,OAAO,CAAC,GAAG,EAAE,iBAAiB,CAAC;aAChC,CAAC,CAAC;YAEH,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG,CAAC;YACpD,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAE7C,IAAI,WAAW,GAAkB,IAAI,CAAC;YACtC,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,sBAAsB,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;gBAC5E,IAAI,KAAK,EAAE,aAAa,EAAE,CAAC;oBACzB,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,GAAG,GAAG,CAAC;gBAC1D,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YAEV,OAAO;gBACL,UAAU,EAAE,SAAS;gBACrB,UAAU,EAAE;oBACV,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,GAAG,GAAG,CAAC,GAAG,GAAG;oBACpD,aAAa,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI;oBACvE,YAAY,EAAE,WAAW;iBAC1B;gBACD,MAAM,EAAE,GAAG;gBACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,SAAS,GAAG,GAAY,CAAC;YACzB,SAAS;QACX,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,8BAA8B,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;AACtE,CAAC;AAED,8EAA8E;AAE9E,MAAM,aAAa,GAA2B;IAC5C,GAAG,EAAE,SAAS;IACd,OAAO,EAAE,SAAS;IAClB,GAAG,EAAE,UAAU;IACf,QAAQ,EAAE,UAAU;IACpB,GAAG,EAAE,QAAQ;IACb,MAAM,EAAE,QAAQ;IAChB,GAAG,EAAE,aAAa;IAClB,KAAK,EAAE,eAAe;IACtB,OAAO,EAAE,eAAe;IACxB,IAAI,EAAE,aAAa;IACnB,GAAG,EAAE,UAAU;IACf,IAAI,EAAE,WAAW;IACjB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,MAAM;CACb,CAAC;AAEK,KAAK,UAAU,gBAAgB,CAAC,MAAc;IACnD,MAAM,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/C,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,KAAK,CACb,mBAAmB,MAAM,iBAAiB,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAClF,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,SAAS,CAC1B,qDAAqD,EAAE,2FAA2F,CACnJ,CAAC;IAEF,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IACtB,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC;IAEtD,OAAO;QACL,UAAU,EAAE,cAAc;QAC1B,UAAU,EAAE;YACV,MAAM,EAAE,MAAM,CAAC,WAAW,EAAE;YAC5B,SAAS,EAAE,IAAI,CAAC,GAAG;YACnB,cAAc,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI;YACxF,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI;YAC3C,cAAc,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI;SACzC;QACD,MAAM,EAAE,mBAAmB;QAC3B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC;AACJ,CAAC;AAED,8EAA8E;AAEvE,KAAK,UAAU,eAAe,CAAC,QAAgB;IACpD,MAAM,CAAC,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAEjC,sBAAsB;IACtB,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,OAAO,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,4CAA4C;IAC5C,KAAK,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1D,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;YACrC,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,eAAe,EAAE,CAAC;IAC3B,CAAC;IAED,0CAA0C;IAC1C,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9F,iCAAiC;QACjC,OAAO,eAAe,EAAE,CAAC,CAAC,qBAAqB;IACjD,CAAC;IAED,OAAO,eAAe,EAAE,CAAC;AAC3B,CAAC;AAED,8EAA8E;AAE9E,SAAgB,yBAAyB,CAAC,IAAgB;IACxD,MAAM,KAAK,GAAG,CAAC,gBAAgB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;IAClD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3D,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,+EAA+E;AAE/E,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,uBAAuB,KAAK,KAAK,CAAC,CAAC;IAE/C,eAAe,CAAC,KAAK,CAAC;SACnB,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;SAC1D,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;QACb,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1 @@
1
+ import "dotenv/config";
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const ethers_1 = require("ethers");
4
+ const uploadReceipt_1 = require("./uploadReceipt");
5
+ const fetchMarketData_1 = require("./fetchMarketData");
6
+ const teeInference_1 = require("./teeInference");
7
+ require("dotenv/config");
8
+ // ─── Configuration ──────────────────────────────────────────────────────────
9
+ const OG_RPC_URL = process.env.OG_RPC_URL || "https://evmrpc.0g.ai";
10
+ // Contract ABI (only the functions we need)
11
+ const ORACLE_ABI = [
12
+ "function recordResolution(uint256 tokenId, bytes32 storageRoot, string calldata signedText, bytes calldata teeSignature, address teeSigner) external",
13
+ "function resolutionCount(uint256 tokenId) external view returns (uint256)",
14
+ ];
15
+ // ─── Oracle Prompt ──────────────────────────────────────────────────────────
16
+ function buildSystemPrompt(marketData, dataHash) {
17
+ const dataBlock = (0, fetchMarketData_1.formatMarketDataForPrompt)(marketData);
18
+ return `You are the Sealed Precision Oracle, a tamper-proof AI judge for precision prediction markets.
19
+
20
+ REAL-TIME DATA PROVIDED (verified from live sources):
21
+ ${dataBlock}
22
+ Data integrity hash: ${dataHash}
23
+
24
+ Your role:
25
+ 1. Use the REAL DATA above (do NOT hallucinate values).
26
+ 2. Evaluate the market question against this data.
27
+ 3. Provide a clear YES or NO resolution.
28
+ 4. State your confidence level (0-100%).
29
+ 5. Explain your reasoning step by step, referencing the actual data.
30
+
31
+ Respond in this exact JSON format:
32
+ {
33
+ "market_question": "<the question>",
34
+ "resolution": "YES" or "NO",
35
+ "confidence": <0-100>,
36
+ "reasoning": "<step-by-step reasoning citing the real data>",
37
+ "data_integrity_hash": "${dataHash}",
38
+ "data_used": ${JSON.stringify(marketData.dataPoints)},
39
+ "timestamp": "<current UTC timestamp>"
40
+ }`;
41
+ }
42
+ // ─── Main ───────────────────────────────────────────────────────────────────
43
+ async function main() {
44
+ const marketQuestion = process.argv[2] ||
45
+ "Will the average Ethereum mainnet gas price exceed 50 gwei right now?";
46
+ const contractAddress = process.env.ORACLE_CONTRACT_ADDRESS;
47
+ const tokenId = parseInt(process.env.ORACLE_TOKEN_ID || "1", 10);
48
+ console.log("=== Sealed Precision Oracle v3.0 ===\n");
49
+ const PRIVATE_KEY = process.env.PRIVATE_KEY;
50
+ const REMOTE_API_URL = process.env.REMOTE_API_URL || "http://localhost:3001";
51
+ if (!PRIVATE_KEY) {
52
+ console.log("No PRIVATE_KEY found in .env. Attempting to use Managed API Bridge...");
53
+ try {
54
+ const response = await fetch(`${REMOTE_API_URL}/api/resolve`, {
55
+ method: "POST",
56
+ headers: { "Content-Type": "application/json" },
57
+ body: JSON.stringify({ marketQuestion }),
58
+ });
59
+ const result = await response.json();
60
+ if (!result.success)
61
+ throw new Error(result.error);
62
+ console.log(`AI Resolution:\n \`\`\`json\n${JSON.stringify({
63
+ market_question: marketQuestion,
64
+ resolution: result.resolution,
65
+ confidence: result.confidence,
66
+ reasoning: result.reasoning,
67
+ data_used: result.data_used.dataPoints,
68
+ timestamp: new Date().toISOString()
69
+ }, null, 2)}\n\`\`\``);
70
+ console.log("\n" + "=".repeat(56));
71
+ console.log(" SEALED PRECISION ORACLE — RESOLUTION COMPLETE (via API)");
72
+ console.log("=".repeat(56) + "\n");
73
+ console.log("Market Question:", marketQuestion);
74
+ console.log("TEE Attestation: VERIFIED (via Remote TEE Signer)");
75
+ console.log(" Signer: ", result.proofs.teeSigner);
76
+ console.log("\n0G Storage Root:", result.proofs.storageRoot);
77
+ if (result.proofs.onChainTx !== "0x") {
78
+ console.log("0G Chain TX: ", result.proofs.onChainTx);
79
+ console.log("Explorer: https://chainscan.0g.ai/tx/" + result.proofs.onChainTx);
80
+ }
81
+ return;
82
+ }
83
+ catch (err) {
84
+ console.error("Managed API fallback failed:", err.message);
85
+ console.log("Please set PRIVATE_KEY in .env to run locally.");
86
+ process.exit(1);
87
+ }
88
+ }
89
+ console.log("Contract Address:", contractAddress);
90
+ console.log("Market Question:", marketQuestion);
91
+ // ── Step 1: Fetch real market data ───────────────────────────────────
92
+ console.log("\n[1/5] Fetching real-time market data...\n");
93
+ const marketData = await (0, fetchMarketData_1.fetchMarketData)(marketQuestion);
94
+ console.log(" Type:", marketData.marketType);
95
+ for (const [k, v] of Object.entries(marketData.dataPoints)) {
96
+ if (v !== null)
97
+ console.log(` ${k}: ${v}`);
98
+ }
99
+ console.log(" Source:", marketData.source);
100
+ // Compute data integrity hash from data points only (excludes timestamp for stability)
101
+ const stableData = JSON.stringify(marketData.dataPoints);
102
+ const dataHash = ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(stableData));
103
+ console.log(" Data hash:", dataHash);
104
+ // ── Step 2: Run TEE-attested inference ──────────────────────────────
105
+ console.log("\n[2/5] Running TEE-attested inference (direct provider)...\n");
106
+ const systemPrompt = buildSystemPrompt(marketData, dataHash);
107
+ const userPrompt = `Resolve this market: ${marketQuestion}`;
108
+ let inferenceResult;
109
+ try {
110
+ inferenceResult = await (0, teeInference_1.teeInference)(systemPrompt, userPrompt);
111
+ }
112
+ catch (err) {
113
+ console.warn("\n ╔══════════════════════════════════════════════════════════╗");
114
+ console.warn(" ║ WARNING: FALLING BACK TO ROUTER API ║");
115
+ console.warn(" ║ No per-inference TEE attestation will be available. ║");
116
+ console.warn(" ║ The AI response will NOT be cryptographically signed. ║");
117
+ console.warn(" ╚══════════════════════════════════════════════════════════╝\n");
118
+ console.warn("[TEE] Reason:", err.message);
119
+ // Fallback to Router if no direct providers available
120
+ const { OpenAI } = await import("openai");
121
+ const client = new OpenAI({
122
+ baseURL: "https://router-api.0g.ai/v1",
123
+ apiKey: process.env.ZG_API_KEY || "not-needed-for-testnet",
124
+ });
125
+ const completion = await client.chat.completions.create({
126
+ model: "Qwen/Qwen2.5-7B-Instruct",
127
+ messages: [
128
+ { role: "system", content: systemPrompt },
129
+ { role: "user", content: userPrompt },
130
+ ],
131
+ temperature: 0.1,
132
+ max_tokens: 1024,
133
+ });
134
+ inferenceResult = {
135
+ content: completion.choices[0]?.message?.content || "",
136
+ chatId: completion.id || "unknown",
137
+ model: "Qwen/Qwen2.5-7B-Instruct",
138
+ providerAddress: "router-api (no direct provider)",
139
+ providerUrl: "https://router-api.0g.ai/v1",
140
+ attestation: null,
141
+ attestationNote: "FALLBACK: Used Router API. No per-inference TEE attestation available. " +
142
+ "Direct provider access failed: " + err.message,
143
+ };
144
+ }
145
+ if (!inferenceResult.content)
146
+ throw new Error("No response from inference");
147
+ console.log("\nAI Resolution:\n", inferenceResult.content);
148
+ // ── Step 3: Build receipt with cryptographic binding ────────────────
149
+ console.log("\n[3/5] Building tamper-evident receipt...\n");
150
+ // Hash the AI response for integrity binding
151
+ const responseHash = ethers_1.ethers.keccak256(ethers_1.ethers.toUtf8Bytes(inferenceResult.content));
152
+ const receipt = {
153
+ oracle: "Sealed Precision Oracle v3.0",
154
+ model: inferenceResult.model,
155
+ provider: {
156
+ address: inferenceResult.providerAddress,
157
+ url: inferenceResult.providerUrl,
158
+ },
159
+ tee_attestation: inferenceResult.attestation
160
+ ? {
161
+ verified: inferenceResult.attestation.verified,
162
+ signed_text: inferenceResult.attestation.signedText,
163
+ signature: inferenceResult.attestation.signature,
164
+ tee_signer: inferenceResult.attestation.teeSigner,
165
+ recovered_address: inferenceResult.attestation.recoveredAddress,
166
+ chat_id: inferenceResult.chatId,
167
+ note: inferenceResult.attestationNote,
168
+ }
169
+ : {
170
+ verified: false,
171
+ note: inferenceResult.attestationNote,
172
+ },
173
+ integrity: {
174
+ data_hash: dataHash,
175
+ response_hash: responseHash,
176
+ note: "data_hash = keccak256(market_data_json). response_hash = keccak256(ai_response). " +
177
+ "data_hash is embedded in the AI prompt so the TEE-signed response implicitly commits to the data.",
178
+ },
179
+ market_data: {
180
+ type: marketData.marketType,
181
+ data_points: marketData.dataPoints,
182
+ source: marketData.source,
183
+ fetched_at: marketData.fetchedAt,
184
+ },
185
+ market_question: marketQuestion,
186
+ ai_response: inferenceResult.content,
187
+ created_at: new Date().toISOString(),
188
+ };
189
+ // ── Step 4: Upload to 0G Storage ───────────────────────────────────
190
+ console.log("[4/5] Uploading receipt to 0G Storage...\n");
191
+ const receiptJSON = JSON.stringify(receipt, null, 2);
192
+ const { rootHash, txHash } = await (0, uploadReceipt_1.uploadReceipt)(receiptJSON);
193
+ // ── Step 5: Record on-chain with TEE signature ─────────────────────
194
+ let chainTxHash = null;
195
+ if (contractAddress) {
196
+ console.log("\n[5/5] Recording resolution on-chain...\n");
197
+ const privateKey = process.env.PRIVATE_KEY;
198
+ if (!privateKey)
199
+ throw new Error("PRIVATE_KEY required for on-chain recording");
200
+ const provider = new ethers_1.ethers.JsonRpcProvider(OG_RPC_URL);
201
+ const signer = new ethers_1.ethers.Wallet(privateKey, provider);
202
+ const contract = new ethers_1.ethers.Contract(contractAddress, ORACLE_ABI, signer);
203
+ // rootHash is 0x-prefixed hex — convert to bytes32
204
+ const rootHashBytes32 = ethers_1.ethers.zeroPadValue(rootHash, 32);
205
+ // Pass TEE signature and signer for on-chain verification
206
+ const signedText = inferenceResult.attestation?.signedText || "";
207
+ const teeSignature = inferenceResult.attestation?.signature
208
+ ? inferenceResult.attestation.signature
209
+ : "0x";
210
+ const teeSigner = inferenceResult.attestation?.teeSigner
211
+ ? inferenceResult.attestation.teeSigner
212
+ : ethers_1.ethers.ZeroAddress;
213
+ const tx = await contract.recordResolution(tokenId, rootHashBytes32, signedText, teeSignature, teeSigner);
214
+ const receiptTx = await tx.wait();
215
+ chainTxHash = receiptTx?.hash || tx.hash;
216
+ const count = await contract.resolutionCount(tokenId);
217
+ const chainId = (await provider.getNetwork()).chainId;
218
+ const explorerBase = chainId === 16661n
219
+ ? "https://chainscan.0g.ai/tx/"
220
+ : "https://chainscan-galileo.0g.ai/tx/";
221
+ console.log(" On-chain TX:", chainTxHash);
222
+ console.log(" Total resolutions for token", tokenId + ":", count.toString());
223
+ }
224
+ else {
225
+ console.log("\n[5/5] Skipped on-chain recording (ORACLE_CONTRACT_ADDRESS not set)");
226
+ console.log(" Set ORACLE_CONTRACT_ADDRESS in .env after deploying the contract.");
227
+ }
228
+ // ── Final Summary ────────────────────────────────────────────────────
229
+ console.log("\n" + "=".repeat(56));
230
+ console.log(" SEALED PRECISION ORACLE — RESOLUTION COMPLETE");
231
+ console.log("=".repeat(56) + "\n");
232
+ console.log("Market Question:", marketQuestion);
233
+ const dataPreview = Object.entries(marketData.dataPoints)
234
+ .filter(([_, v]) => v !== null)
235
+ .map(([k, v]) => `${k}=${v}`)
236
+ .join(", ");
237
+ console.log("Real Data: ", dataPreview);
238
+ console.log("Data Hash: ", dataHash.slice(0, 18) + "...");
239
+ console.log("Response Hash: ", responseHash.slice(0, 18) + "...");
240
+ if (inferenceResult.attestation?.verified) {
241
+ console.log("TEE Attestation: VERIFIED (per-inference signature)");
242
+ console.log(" Signer: ", inferenceResult.attestation.teeSigner);
243
+ }
244
+ else {
245
+ console.log("TEE Attestation:", inferenceResult.attestationNote.slice(0, 80));
246
+ }
247
+ console.log("\n0G Storage Root:", rootHash);
248
+ console.log("0G Storage TX: ", txHash);
249
+ if (chainTxHash) {
250
+ const chainId = (await new ethers_1.ethers.JsonRpcProvider(OG_RPC_URL).getNetwork()).chainId;
251
+ const explorerBase = chainId === 16661n ? "https://chainscan.0g.ai/tx/" : "https://chainscan-galileo.0g.ai/tx/";
252
+ console.log("0G Chain TX: ", chainTxHash);
253
+ console.log("Explorer: " + explorerBase + chainTxHash);
254
+ }
255
+ console.log("\nVerification: Download the receipt from 0G Storage using the root hash.");
256
+ console.log("The receipt contains the TEE signature — verify it against the on-chain TEE signer.");
257
+ console.log();
258
+ }
259
+ main().catch((err) => {
260
+ console.error("Oracle execution failed:", err);
261
+ process.exit(1);
262
+ });
263
+ //# sourceMappingURL=oracle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oracle.js","sourceRoot":"","sources":["../../src/oracle.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Direct TEE-attested inference via the 0G Compute SDK.
3
+ *
4
+ * Bypasses the Router API entirely. Instead:
5
+ * 1. Discovers providers on-chain from the InferenceServing contract
6
+ * 2. Calls inference directly to the provider's broker URL
7
+ * 3. Fetches the per-inference TEE signature from the provider
8
+ * 4. Verifies the signature against the on-chain TEE signer address
9
+ *
10
+ * This provides REAL per-inference attestation, not just metadata.
11
+ */
12
+ import "dotenv/config";
13
+ export interface TeeAttestation {
14
+ signedText: string;
15
+ signature: string;
16
+ teeSigner: string;
17
+ recoveredAddress: string;
18
+ verified: boolean;
19
+ }
20
+ export interface TeeInferenceResult {
21
+ content: string;
22
+ chatId: string;
23
+ model: string;
24
+ providerAddress: string;
25
+ providerUrl: string;
26
+ attestation: TeeAttestation | null;
27
+ attestationNote: string;
28
+ }
29
+ export interface ProviderInfo {
30
+ provider: string;
31
+ url: string;
32
+ model: string;
33
+ verifiability: string;
34
+ teeSignerAddress: string;
35
+ }
36
+ /**
37
+ * Discover TEE-attested providers for a given model from the on-chain registry.
38
+ */
39
+ export declare function discoverProviders(modelQuery?: string): Promise<ProviderInfo[]>;
40
+ /**
41
+ * Run inference directly on a TEE-attested provider and verify the response signature.
42
+ */
43
+ export declare function teeInference(systemPrompt: string, userPrompt: string, modelQuery?: string): Promise<TeeInferenceResult>;