diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..3cf8cec
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+node_modules
+.next
+dist
+.turbo
+*.log
+.env
+.env*.local
+pnpm-debug.log*
diff --git a/apps/admin/next-env.d.ts b/apps/admin/next-env.d.ts
new file mode 100644
index 0000000..40c3d68
--- /dev/null
+++ b/apps/admin/next-env.d.ts
@@ -0,0 +1,5 @@
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information.
diff --git a/apps/admin/package.json b/apps/admin/package.json
index ed1f7b9..a8a82f9 100644
--- a/apps/admin/package.json
+++ b/apps/admin/package.json
@@ -10,10 +10,23 @@
"dependencies": {
"@wtfx/types": "workspace:*",
"@wtfx/api-client": "workspace:*",
+ "@wtfx/contracts": "workspace:*",
"@wtfx/ui": "workspace:*",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"next": "^14.2.4",
- "ethers": "^6.13.0"
+ "ethers": "^6.13.0",
+ "lucide-react": "^0.395.0",
+ "clsx": "^2.1.1",
+ "tailwind-merge": "^2.3.0"
+ },
+ "devDependencies": {
+ "@types/node": "^20.14.2",
+ "@types/react": "^18.3.3",
+ "@types/react-dom": "^18.3.0",
+ "autoprefixer": "^10.4.19",
+ "postcss": "^8.4.38",
+ "tailwindcss": "^3.4.4",
+ "typescript": "^5.4.5"
}
-}
\ No newline at end of file
+}
diff --git a/apps/admin/postcss.config.js b/apps/admin/postcss.config.js
new file mode 100644
index 0000000..12a703d
--- /dev/null
+++ b/apps/admin/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/apps/admin/src/app/globals.css b/apps/admin/src/app/globals.css
new file mode 100644
index 0000000..3f67e58
--- /dev/null
+++ b/apps/admin/src/app/globals.css
@@ -0,0 +1,9 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+body {
+ background-color: #090A0F;
+ color: #F3F4F6;
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
+}
diff --git a/apps/admin/src/app/layout.tsx b/apps/admin/src/app/layout.tsx
new file mode 100644
index 0000000..e1abab3
--- /dev/null
+++ b/apps/admin/src/app/layout.tsx
@@ -0,0 +1,21 @@
+import type { Metadata } from 'next';
+import './globals.css';
+
+export const metadata: Metadata = {
+ title: 'WTFX Admin Console',
+ description: 'Protocol Governance, Contract Deployment & Market Risk Control',
+};
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ return (
+
+
+ {children}
+
+
+ );
+}
diff --git a/apps/admin/src/app/page.tsx b/apps/admin/src/app/page.tsx
new file mode 100644
index 0000000..5c191bd
--- /dev/null
+++ b/apps/admin/src/app/page.tsx
@@ -0,0 +1,32 @@
+'use client';
+
+import React, { useState } from 'react';
+import { Web3Provider } from '../context/Web3Context';
+import { AdminNavbar } from '../features/common/AdminNavbar';
+import { FaucetPanel } from '../features/faucet/FaucetPanel';
+import { MarketWizard } from '../features/wizard/MarketWizard';
+import { GovernancePanel } from '../features/governance/GovernancePanel';
+import { AdjudicationPanel } from '../features/adjudication/AdjudicationPanel';
+
+export default function AdminPage() {
+ const [activeTab, setActiveTab] = useState('faucet');
+
+ return (
+
+
+
+
+
+ {activeTab === 'faucet' && }
+ {activeTab === 'wizard' && }
+ {activeTab === 'governance' && }
+ {activeTab === 'adjudication' && }
+
+
+
+
+
+ );
+}
diff --git a/apps/admin/src/context/Web3Context.tsx b/apps/admin/src/context/Web3Context.tsx
new file mode 100644
index 0000000..8ab525a
--- /dev/null
+++ b/apps/admin/src/context/Web3Context.tsx
@@ -0,0 +1,157 @@
+import React, { createContext, useContext, useState, useEffect } from 'react';
+import { ethers } from 'ethers';
+import { DEPLOYMENTS, ABIS, ROBINHOOD_TESTNET_CHAIN } from '@wtfx/contracts';
+
+interface Web3ContextType {
+ account: string | null;
+ provider: ethers.BrowserProvider | null;
+ signer: ethers.Signer | null;
+ chainId: number | null;
+ isCorrectNetwork: boolean;
+ connectWallet: () => Promise;
+ switchNetwork: () => Promise;
+ getControllerContract: () => ethers.Contract | null;
+ getCollateralContract: () => ethers.Contract | null;
+}
+
+const Web3Context = createContext({
+ account: null,
+ provider: null,
+ signer: null,
+ chainId: null,
+ isCorrectNetwork: false,
+ connectWallet: async () => {},
+ switchNetwork: async () => {},
+ getControllerContract: () => null,
+ getCollateralContract: () => null,
+});
+
+export const Web3Provider: React.FC<{ children: React.ReactNode }> = ({ children }) => {
+ const [account, setAccount] = useState(null);
+ const [provider, setProvider] = useState(null);
+ const [signer, setSigner] = useState(null);
+ const [chainId, setChainId] = useState(null);
+
+ const isCorrectNetwork = chainId === ROBINHOOD_TESTNET_CHAIN.id;
+
+ const initProvider = async () => {
+ if (typeof window !== 'undefined' && (window as any).ethereum) {
+ const browserProvider = new ethers.BrowserProvider((window as any).ethereum);
+ setProvider(browserProvider);
+ try {
+ const network = await browserProvider.getNetwork();
+ setChainId(Number(network.chainId));
+ const accounts = await browserProvider.listAccounts();
+ if (accounts.length > 0) {
+ setAccount(accounts[0].address);
+ setSigner(await browserProvider.getSigner());
+ }
+ } catch (err) {
+ console.error('Error initializing web3 provider:', err);
+ }
+
+ (window as any).ethereum.on('accountsChanged', async (accs: string[]) => {
+ if (accs.length > 0) {
+ setAccount(accs[0]);
+ const currentSigner = await browserProvider.getSigner();
+ setSigner(currentSigner);
+ } else {
+ setAccount(null);
+ setSigner(null);
+ }
+ });
+
+ (window as any).ethereum.on('chainChanged', (cId: string) => {
+ setChainId(parseInt(cId, 16));
+ window.location.reload();
+ });
+ }
+ };
+
+ useEffect(() => {
+ initProvider();
+ }, []);
+
+ const connectWallet = async () => {
+ if (typeof window !== 'undefined' && (window as any).ethereum) {
+ try {
+ const browserProvider = new ethers.BrowserProvider((window as any).ethereum);
+ await browserProvider.send('eth_requestAccounts', []);
+ const currentSigner = await browserProvider.getSigner();
+ const address = await currentSigner.getAddress();
+ const network = await browserProvider.getNetwork();
+ setProvider(browserProvider);
+ setSigner(currentSigner);
+ setAccount(address);
+ setChainId(Number(network.chainId));
+ } catch (err) {
+ console.error('Failed to connect wallet:', err);
+ throw err;
+ }
+ } else {
+ alert('请安装 MetaMask 或其他 Web3 钱包!');
+ }
+ };
+
+ const switchNetwork = async () => {
+ if (typeof window !== 'undefined' && (window as any).ethereum) {
+ const hexChainId = '0x' + ROBINHOOD_TESTNET_CHAIN.id.toString(16);
+ try {
+ await (window as any).ethereum.request({
+ method: 'wallet_switchEthereumChain',
+ params: [{ chainId: hexChainId }],
+ });
+ } catch (switchError: any) {
+ if (switchError.code === 4902) {
+ try {
+ await (window as any).ethereum.request({
+ method: 'wallet_addEthereumChain',
+ params: [
+ {
+ chainId: hexChainId,
+ chainName: ROBINHOOD_TESTNET_CHAIN.name,
+ rpcUrls: ROBINHOOD_TESTNET_CHAIN.rpcUrls.default.http,
+ nativeCurrency: ROBINHOOD_TESTNET_CHAIN.nativeCurrency,
+ },
+ ],
+ });
+ } catch (addError) {
+ console.error('Failed to add network:', addError);
+ }
+ }
+ }
+ }
+ };
+
+ const getControllerContract = () => {
+ if (!provider) return null;
+ const address = DEPLOYMENTS.robinhoodTestnet.contracts.controllerProxy;
+ return new ethers.Contract(address, ABIS.WTFControllerV2, signer || provider);
+ };
+
+ const getCollateralContract = () => {
+ if (!provider) return null;
+ const address = DEPLOYMENTS.robinhoodTestnet.contracts.collateral;
+ return new ethers.Contract(address, ABIS.MockERC20, signer || provider);
+ };
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const useWeb3 = () => useContext(Web3Context);
diff --git a/apps/admin/src/features/adjudication/AdjudicationPanel.tsx b/apps/admin/src/features/adjudication/AdjudicationPanel.tsx
new file mode 100644
index 0000000..6297839
--- /dev/null
+++ b/apps/admin/src/features/adjudication/AdjudicationPanel.tsx
@@ -0,0 +1,241 @@
+import React, { useState } from 'react';
+import { useWeb3 } from '../../context/Web3Context';
+import { ethers } from 'ethers';
+import { Scale, CheckCircle2, AlertOctagon, PauseCircle, PlayCircle, RefreshCw, Loader2, Check, AlertCircle } from 'lucide-react';
+
+export const AdjudicationPanel: React.FC = () => {
+ const { account, signer, getControllerContract, isCorrectNetwork } = useWeb3();
+
+ const [questionId, setQuestionId] = useState('');
+ const [outcomeIndex, setOutcomeIndex] = useState(0);
+ const [marketAddress, setMarketAddress] = useState('');
+ const [loading, setLoading] = useState(false);
+ const [statusMsg, setStatusMsg] = useState<{ type: 'success' | 'error'; text: string } | null>(null);
+
+ const handleResolve = async () => {
+ if (!signer || !account) return;
+ try {
+ setLoading(true);
+ setStatusMsg(null);
+ const controller = getControllerContract();
+ if (!controller) throw new Error('Controller not found');
+
+ const qId = questionId.startsWith('0x') ? questionId : ethers.keccak256(ethers.toUtf8Bytes(questionId));
+ const tx = await controller.resolveOutcome(qId, outcomeIndex);
+ setStatusMsg({ type: 'success', text: `预言机初步裁决交易已广播: ${tx.hash.slice(0, 10)}...` });
+ await tx.wait();
+ setStatusMsg({ type: 'success', text: `🎉 市场问题 ${qId.slice(0, 8)}... 已由预言机成功提交胜出结果 Outcome #${outcomeIndex}!进入争议公示期。` });
+ } catch (err: any) {
+ setStatusMsg({ type: 'error', text: err.reason || err.message || '裁决失败' });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const handleFinalise = async () => {
+ if (!signer || !account) return;
+ try {
+ setLoading(true);
+ setStatusMsg(null);
+ const controller = getControllerContract();
+ if (!controller) throw new Error('Controller not found');
+
+ const qId = questionId.startsWith('0x') ? questionId : ethers.keccak256(ethers.toUtf8Bytes(questionId));
+ const tx = await controller.finaliseOutcome(qId);
+ setStatusMsg({ type: 'success', text: `最终结果敲定交易已广播: ${tx.hash.slice(0, 10)}...` });
+ await tx.wait();
+ setStatusMsg({ type: 'success', text: `🎉 市场问题 ${qId.slice(0, 8)}... 争议期结束,胜出结果已在链上永久生效,用户可兑现奖励!` });
+ } catch (err: any) {
+ setStatusMsg({ type: 'error', text: err.reason || err.message || '敲定失败' });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const handleOverrideFinalise = async () => {
+ if (!signer || !account) return;
+ try {
+ setLoading(true);
+ setStatusMsg(null);
+ const controller = getControllerContract();
+ if (!controller) throw new Error('Controller not found');
+
+ const qId = questionId.startsWith('0x') ? questionId : ethers.keccak256(ethers.toUtf8Bytes(questionId));
+ const tx = await controller.overrideFinalise(qId, outcomeIndex);
+ setStatusMsg({ type: 'success', text: `管理员一票否决/强制裁决交易已广播: ${tx.hash.slice(0, 10)}...` });
+ await tx.wait();
+ setStatusMsg({ type: 'success', text: `🛡️ 管理员已强制将市场问题 ${qId.slice(0, 8)}... 敲定为 Outcome #${outcomeIndex}!` });
+ } catch (err: any) {
+ setStatusMsg({ type: 'error', text: err.reason || err.message || '强制裁决失败' });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const handlePause = async () => {
+ if (!signer || !account) return;
+ try {
+ setLoading(true);
+ setStatusMsg(null);
+ const controller = getControllerContract();
+ if (!controller) throw new Error('Controller not found');
+
+ const tx = await controller.pause();
+ setStatusMsg({ type: 'success', text: `紧急熔断暂停交易已广播: ${tx.hash.slice(0, 10)}...` });
+ await tx.wait();
+ setStatusMsg({ type: 'success', text: `🚨 协议已进入全局紧急暂停 (PAUSED) 状态!` });
+ } catch (err: any) {
+ setStatusMsg({ type: 'error', text: err.reason || err.message || '暂停失败' });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const handleUnpause = async () => {
+ if (!signer || !account) return;
+ try {
+ setLoading(true);
+ setStatusMsg(null);
+ const controller = getControllerContract();
+ if (!controller) throw new Error('Controller not found');
+
+ const tx = await controller.unpause();
+ setStatusMsg({ type: 'success', text: `解除紧急暂停交易已广播: ${tx.hash.slice(0, 10)}...` });
+ await tx.wait();
+ setStatusMsg({ type: 'success', text: `✅ 协议已恢复正常运行!` });
+ } catch (err: any) {
+ setStatusMsg({ type: 'error', text: err.reason || err.message || '恢复失败' });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
市场风控与裁决中心 (Adjudication & Emergency)
+
+ 预言机初审、胜出结果终裁敲定、超管一票否决与全局熔断保护
+
+
+
+
+
+ {/* Question Outcome Adjudication */}
+
+
1. 市场结果裁决 (Outcome Resolution)
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Protocol Pause Control */}
+
+
+
+ 2. 协议紧急熔断控制 (Circuit Breaker)
+
+
+ 当链上异常或智能合约升级前夕,GUARDIAN_ROLE 与 ADMIN 可一键暂停全协议建盘与交易。
+
+
+
+
+
+
+
+
+
+ {/* Status Message */}
+ {statusMsg && (
+
+ {statusMsg.type === 'success' ? (
+
+ ) : (
+
+ )}
+
+
+ )}
+
+
+ );
+};
diff --git a/apps/admin/src/features/common/AdminNavbar.tsx b/apps/admin/src/features/common/AdminNavbar.tsx
new file mode 100644
index 0000000..ce1dd19
--- /dev/null
+++ b/apps/admin/src/features/common/AdminNavbar.tsx
@@ -0,0 +1,92 @@
+import React from 'react';
+import { useWeb3 } from '../../context/Web3Context';
+import { DEPLOYMENTS } from '@wtfx/contracts';
+import { Wallet, ShieldAlert, CheckCircle2 } from 'lucide-react';
+
+interface NavbarProps {
+ activeTab: string;
+ setActiveTab: (tab: string) => void;
+}
+
+export const AdminNavbar: React.FC = ({ activeTab, setActiveTab }) => {
+ const { account, isCorrectNetwork, connectWallet, switchNetwork } = useWeb3();
+
+ const navItems = [
+ { id: 'faucet', label: '🚰 WUSD 水龙头' },
+ { id: 'wizard', label: '🚀 创建市场向导' },
+ { id: 'governance', label: '⚙️ 协议参数治理' },
+ { id: 'adjudication', label: '⚖️ 市场风控与裁决' },
+ ];
+
+ return (
+
+
+
+
+
+ W
+
+
+ WTFX
+
+ ADMIN CONSOLE
+
+
+
+
+
+
+
+
+ {account ? (
+
+ {!isCorrectNetwork ? (
+
+ ) : (
+
+
+ Robinhood 46630
+
+ )}
+
+
+
+
+ {account.slice(0, 6)}...{account.slice(-4)}
+
+
+
+ ) : (
+
+ )}
+
+
+
+ );
+};
diff --git a/apps/admin/src/features/faucet/FaucetPanel.tsx b/apps/admin/src/features/faucet/FaucetPanel.tsx
new file mode 100644
index 0000000..3de82f3
--- /dev/null
+++ b/apps/admin/src/features/faucet/FaucetPanel.tsx
@@ -0,0 +1,198 @@
+import React, { useState, useEffect } from 'react';
+import { useWeb3 } from '../../context/Web3Context';
+import { DEPLOYMENTS } from '@wtfx/contracts';
+import { ethers } from 'ethers';
+import { Coins, ArrowUpRight, Check, AlertCircle, Loader2, Sparkles } from 'lucide-react';
+
+export const FaucetPanel: React.FC = () => {
+ const { account, signer, getCollateralContract, isCorrectNetwork } = useWeb3();
+ const [balance, setBalance] = useState('0');
+ const [loading, setLoading] = useState(false);
+ const [customAmount, setCustomAmount] = useState('100000000');
+ const [targetAddress, setTargetAddress] = useState('');
+ const [txHash, setTxHash] = useState(null);
+ const [statusMsg, setStatusMsg] = useState<{ type: 'success' | 'error'; text: string } | null>(null);
+
+ const collateralAddress = DEPLOYMENTS.robinhoodTestnet.contracts.collateral;
+
+ const fetchBalance = async () => {
+ if (!account) return;
+ try {
+ const contract = getCollateralContract();
+ if (contract) {
+ const bal = await contract.balanceOf(account);
+ setBalance(ethers.formatUnits(bal, 18));
+ }
+ } catch (err) {
+ console.error('Failed to fetch balance:', err);
+ }
+ };
+
+ useEffect(() => {
+ if (account) {
+ setTargetAddress(account);
+ fetchBalance();
+ }
+ }, [account]);
+
+ const handleMint = async (amountStr: string) => {
+ if (!signer || !account) {
+ setStatusMsg({ type: 'error', text: '请先连接管理员钱包!' });
+ return;
+ }
+ if (!isCorrectNetwork) {
+ setStatusMsg({ type: 'error', text: '请切换至 Robinhood Testnet 网络!' });
+ return;
+ }
+
+ try {
+ setLoading(true);
+ setStatusMsg(null);
+ setTxHash(null);
+
+ const contract = getCollateralContract();
+ if (!contract) throw new Error('Contract not initialized');
+
+ const recipient = targetAddress.trim() || account;
+ const amountWei = ethers.parseUnits(amountStr, 18);
+
+ const tx = await contract.mint(recipient, amountWei);
+ setStatusMsg({ type: 'success', text: `交易已广播,等待链上确认... Tx: ${tx.hash.slice(0, 10)}...` });
+ setTxHash(tx.hash);
+
+ await tx.wait();
+ setStatusMsg({ type: 'success', text: `🎉 成功铸造 ${Number(amountStr).toLocaleString()} WUSD 到地址 ${recipient}!` });
+ fetchBalance();
+ } catch (err: any) {
+ console.error('Mint error:', err);
+ setStatusMsg({ type: 'error', text: err.reason || err.message || '铸造失败,请检查交易状态' });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
WUSD 领水水龙头 (Testnet Faucet)
+
+ Mock ERC-20 结算通证地址: {collateralAddress}
+
+
+
+
+
+ 当前钱包余额
+
+ {Number(balance).toLocaleString(undefined, { maximumFractionDigits: 2 })} WUSD
+
+
+
+
+
+ {/* Quick Action */}
+
+
+
+
+
管理员一键领水 (100,000,000 WUSD)
+
+
+ 为做市、流动性注入、初始化预测市场底仓提供充足的 1 亿测试代币。
+
+
+
+
+
+ {/* Custom Mint Form */}
+
+
自定义铸造 (Custom Mint)
+
+
+
+
+
+
+
+
+ {/* Status Message */}
+ {statusMsg && (
+
+ {statusMsg.type === 'success' ? (
+
+ ) : (
+
+ )}
+
+
{statusMsg.text}
+ {txHash && (
+
+ Tx Hash: {txHash}
+
+ )}
+
+
+ )}
+
+
+
+ );
+};
diff --git a/apps/admin/src/features/governance/GovernancePanel.tsx b/apps/admin/src/features/governance/GovernancePanel.tsx
new file mode 100644
index 0000000..dde0fc7
--- /dev/null
+++ b/apps/admin/src/features/governance/GovernancePanel.tsx
@@ -0,0 +1,251 @@
+import React, { useState, useEffect } from 'react';
+import { useWeb3 } from '../../context/Web3Context';
+import { DEPLOYMENTS } from '@wtfx/contracts';
+import { ethers } from 'ethers';
+import { Sliders, ShieldCheck, Percent, Wallet, Check, AlertCircle, Loader2, RefreshCw } from 'lucide-react';
+
+export const GovernancePanel: React.FC = () => {
+ const { account, signer, getControllerContract, isCorrectNetwork } = useWeb3();
+
+ const [treasury, setTreasury] = useState('');
+ const [defaultFeeRate, setDefaultFeeRate] = useState('0.6');
+ const [creatorShare, setCreatorShare] = useState('50');
+ const [centralWallet, setCentralWallet] = useState('');
+ const [loading, setLoading] = useState(false);
+ const [statusMsg, setStatusMsg] = useState<{ type: 'success' | 'error'; text: string } | null>(null);
+
+ const fetchGovParams = async () => {
+ try {
+ const controller = getControllerContract();
+ if (!controller) return;
+
+ // In real scenario, read from getters or view functions
+ // We fill initialized defaults from deployment
+ setTreasury(DEPLOYMENTS.robinhoodTestnet.governance.treasury);
+ setCentralWallet(DEPLOYMENTS.robinhoodTestnet.governance.admin);
+ } catch (err) {
+ console.error('Fetch gov params error:', err);
+ }
+ };
+
+ useEffect(() => {
+ fetchGovParams();
+ }, [account]);
+
+ const handleUpdateTreasury = async () => {
+ if (!signer || !account) return;
+ try {
+ setLoading(true);
+ setStatusMsg(null);
+ const controller = getControllerContract();
+ if (!controller) throw new Error('Controller not found');
+
+ const tx = await controller.setTreasury(treasury.trim());
+ setStatusMsg({ type: 'success', text: `更新国库金库地址交易已广播: ${tx.hash.slice(0, 10)}...` });
+ await tx.wait();
+ setStatusMsg({ type: 'success', text: `🎉 协议国库金库地址已成功更新为: ${treasury}` });
+ } catch (err: any) {
+ setStatusMsg({ type: 'error', text: err.reason || err.message || '更新失败' });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const handleUpdateFeeRate = async () => {
+ if (!signer || !account) return;
+ try {
+ setLoading(true);
+ setStatusMsg(null);
+ const controller = getControllerContract();
+ if (!controller) throw new Error('Controller not found');
+
+ const rateWei = ethers.parseUnits((Number(defaultFeeRate) / 100).toString(), 18);
+ const tx = await controller.setFeeRateDefault(rateWei);
+ setStatusMsg({ type: 'success', text: `更新默认手续费交易已广播: ${tx.hash.slice(0, 10)}...` });
+ await tx.wait();
+ setStatusMsg({ type: 'success', text: `🎉 全局默认协议手续费率已成功更新为: ${defaultFeeRate}%` });
+ } catch (err: any) {
+ setStatusMsg({ type: 'error', text: err.reason || err.message || '更新失败' });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const handleUpdateCreatorShare = async () => {
+ if (!signer || !account) return;
+ try {
+ setLoading(true);
+ setStatusMsg(null);
+ const controller = getControllerContract();
+ if (!controller) throw new Error('Controller not found');
+
+ const shareWei = ethers.parseUnits((Number(creatorShare) / 100).toString(), 18);
+ const tx = await controller.setCreatorShare(shareWei);
+ setStatusMsg({ type: 'success', text: `更新建盘者手续费分成交易已广播: ${tx.hash.slice(0, 10)}...` });
+ await tx.wait();
+ setStatusMsg({ type: 'success', text: `🎉 建盘者手续费返佣分成比例已成功更新为: ${creatorShare}%` });
+ } catch (err: any) {
+ setStatusMsg({ type: 'error', text: err.reason || err.message || '更新失败' });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ const handleUpdateCentralWallet = async () => {
+ if (!signer || !account) return;
+ try {
+ setLoading(true);
+ setStatusMsg(null);
+ const controller = getControllerContract();
+ if (!controller) throw new Error('Controller not found');
+
+ const tx = await controller.setCentralWallet(centralWallet.trim());
+ setStatusMsg({ type: 'success', text: `更新中央安全提币钱包交易已广播: ${tx.hash.slice(0, 10)}...` });
+ await tx.wait();
+ setStatusMsg({ type: 'success', text: `🎉 中央安全提币钱包已成功更新为: ${centralWallet}` });
+ } catch (err: any) {
+ setStatusMsg({ type: 'error', text: err.reason || err.message || '更新失败' });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+
协议治理看板 (Protocol Governance)
+
+ WTFControllerV2 智能合约超管参数配置(仅 DEFAULT_ADMIN_ROLE / OPERATOR_ROLE 可执行)
+
+
+
+
+
+
+
+
+ {/* Treasury Setting */}
+
+
+
+ 协议国库金库 (Treasury Address)
+
+
用于接收协议留存手续费分润的冷钱包/金库合约。
+
setTreasury(e.target.value)}
+ className="w-full bg-slate-900 border border-slate-700 rounded-lg px-3 py-2 text-xs font-mono text-slate-200 focus:outline-none focus:border-cyan-500"
+ />
+
+
+
+ {/* Central Wallet */}
+
+
+
+ 中央安全提币钱包 (Central Wallet)
+
+
由超管授权以自动化划拨协议手续费的专用钱包。
+
setCentralWallet(e.target.value)}
+ className="w-full bg-slate-900 border border-slate-700 rounded-lg px-3 py-2 text-xs font-mono text-slate-200 focus:outline-none focus:border-cyan-500"
+ />
+
+
+
+ {/* Default Fee Rate */}
+
+
+
+
默认协议手续费率 (Fee Rate %)
+
+
新建市场默认费率(范围 [0.1%, 3.0%],默认 0.6%)。
+
setDefaultFeeRate(e.target.value)}
+ className="w-full bg-slate-900 border border-slate-700 rounded-lg px-3 py-2 text-xs font-mono text-slate-200 focus:outline-none focus:border-cyan-500"
+ />
+
+
+
+ {/* Creator Share */}
+
+
+
+
建盘者返佣分成比例 (Creator Share %)
+
+
交易产生的手续费中分给市场创建者的比例(默认 50%)。
+
setCreatorShare(e.target.value)}
+ className="w-full bg-slate-900 border border-slate-700 rounded-lg px-3 py-2 text-xs font-mono text-slate-200 focus:outline-none focus:border-cyan-500"
+ />
+
+
+
+
+ {/* Status Message */}
+ {statusMsg && (
+
+ {statusMsg.type === 'success' ? (
+
+ ) : (
+
+ )}
+
+
+ )}
+
+
+ );
+};
diff --git a/apps/admin/src/features/wizard/MarketWizard.tsx b/apps/admin/src/features/wizard/MarketWizard.tsx
new file mode 100644
index 0000000..9a6c847
--- /dev/null
+++ b/apps/admin/src/features/wizard/MarketWizard.tsx
@@ -0,0 +1,326 @@
+import React, { useState } from 'react';
+import { useWeb3 } from '../../context/Web3Context';
+import { DEPLOYMENTS } from '@wtfx/contracts';
+import { ethers } from 'ethers';
+import { PlusCircle, Trash2, Rocket, Check, AlertCircle, Loader2, Sparkles, HelpCircle } from 'lucide-react';
+
+export const MarketWizard: React.FC = () => {
+ const { account, signer, getControllerContract, getCollateralContract, isCorrectNetwork } = useWeb3();
+
+ const [question, setQuestion] = useState('');
+ const [description, setDescription] = useState('');
+ const [category, setCategory] = useState('Crypto');
+ const [endTime, setEndTime] = useState(
+ new Date(Date.now() + 7 * 24 * 3600 * 1000).toISOString().slice(0, 16)
+ );
+ const [outcomes, setOutcomes] = useState(['YES', 'NO']);
+ const [selectedTier, setSelectedTier] = useState(1);
+ const [seedAmount, setSeedAmount] = useState('1000');
+ const [loading, setLoading] = useState(false);
+ const [statusMsg, setStatusMsg] = useState<{ type: 'success' | 'error'; text: string } | null>(null);
+ const [deployedMarketAddress, setDeployedMarketAddress] = useState(null);
+
+ const addOutcome = () => {
+ if (outcomes.length < 8) {
+ setOutcomes([...outcomes, `OUTCOME ${outcomes.length + 1}`]);
+ }
+ };
+
+ const removeOutcome = (index: number) => {
+ if (outcomes.length > 2) {
+ setOutcomes(outcomes.filter((_, i) => i !== index));
+ }
+ };
+
+ const updateOutcome = (index: number, val: string) => {
+ const updated = [...outcomes];
+ updated[index] = val;
+ setOutcomes(updated);
+ };
+
+ const handleDeployMarket = async (e: React.FormEvent) => {
+ e.preventDefault();
+ if (!signer || !account) {
+ setStatusMsg({ type: 'error', text: '请先连接管理员钱包!' });
+ return;
+ }
+ if (!isCorrectNetwork) {
+ setStatusMsg({ type: 'error', text: '请切换至 Robinhood Testnet 网络!' });
+ return;
+ }
+
+ try {
+ setLoading(true);
+ setStatusMsg(null);
+ setDeployedMarketAddress(null);
+
+ const controller = getControllerContract();
+ const collateral = getCollateralContract();
+ if (!controller || !collateral) throw new Error('Contracts not loaded');
+
+ const controllerAddress = await controller.getAddress();
+ const seedWei = ethers.parseUnits(seedAmount || '0', 18);
+
+ // Step 1: Check and Approve Collateral if Seed > 0
+ if (seedWei > 0n) {
+ setStatusMsg({ type: 'success', text: '步骤 1/3: 正在授权底仓资金...' });
+ const allowance = await collateral.allowance(account, controllerAddress);
+ if (allowance < seedWei) {
+ const appTx = await collateral.approve(controllerAddress, ethers.MaxUint256);
+ await appTx.wait();
+ }
+ }
+
+ // Step 2: Prepare Question and Market Params
+ setStatusMsg({ type: 'success', text: '步骤 2/3: 正在广播建盘交易到链上...' });
+ const deadlineSec = Math.floor(new Date(endTime).getTime() / 1000);
+ const questionId = ethers.keccak256(
+ ethers.toUtf8Bytes(`${question}-${Date.now()}-${account}`)
+ );
+
+ const questionParams = {
+ questionId: questionId,
+ question: question,
+ ancillaryData: ethers.toUtf8Bytes(JSON.stringify({ description, category })),
+ rewardToken: DEPLOYMENTS.robinhoodTestnet.contracts.collateral,
+ reward: 0,
+ proposalBond: 0,
+ earlyResolutionBond: 0,
+ settlementResolutionBond: 0,
+ resolutionTime: deadlineSec,
+ numOutcomes: outcomes.length,
+ };
+
+ const marketParams = {
+ tier: selectedTier,
+ creator: account,
+ feeRate: ethers.parseUnits('0.006', 18), // 0.6% default
+ creatorShare: ethers.parseUnits('0.5', 18), // 50%
+ curve: DEPLOYMENTS.robinhoodTestnet.contracts.powerLDACurve,
+ collateral: DEPLOYMENTS.robinhoodTestnet.contracts.collateral,
+ };
+
+ // Step 3: Call deployMarket
+ const tx = await controller.deployMarket(
+ questionParams,
+ marketParams,
+ account, // Oracle address (admin acts as oracle)
+ seedWei
+ );
+
+ setStatusMsg({ type: 'success', text: `步骤 3/3: 交易已广播 (Tx: ${tx.hash.slice(0, 10)}...),等待区块确认...` });
+ const receipt = await tx.wait();
+
+ // Extract MarketDeployed event or address
+ setStatusMsg({
+ type: 'success',
+ text: `🎉 预测市场创建成功!交易哈希: ${receipt.hash}`,
+ });
+ } catch (err: any) {
+ console.error('Market deploy error:', err);
+ setStatusMsg({ type: 'error', text: err.reason || err.message || '建盘失败,请检查参数' });
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+
+ );
+};
diff --git a/apps/admin/tailwind.config.js b/apps/admin/tailwind.config.js
new file mode 100644
index 0000000..3afb208
--- /dev/null
+++ b/apps/admin/tailwind.config.js
@@ -0,0 +1,21 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+ content: [
+ './src/**/*.{js,ts,jsx,tsx,mdx}',
+ '../../packages/ui/src/**/*.{js,ts,jsx,tsx,mdx}'
+ ],
+ theme: {
+ extend: {
+ colors: {
+ background: '#090A0F',
+ card: '#12141F',
+ border: '#1F2438',
+ primary: '#3B82F6',
+ success: '#10B981',
+ danger: '#EF4444',
+ warning: '#F59E0B'
+ }
+ }
+ },
+ plugins: []
+};
diff --git a/apps/admin/tsconfig.json b/apps/admin/tsconfig.json
new file mode 100644
index 0000000..c541b13
--- /dev/null
+++ b/apps/admin/tsconfig.json
@@ -0,0 +1,35 @@
+{
+ "compilerOptions": {
+ "target": "ES2022",
+ "lib": [
+ "dom",
+ "dom.iterable",
+ "esnext"
+ ],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": false,
+ "noEmit": true,
+ "incremental": true,
+ "module": "esnext",
+ "esModuleInterop": true,
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ]
+ },
+ "include": [
+ "next-env.d.ts",
+ ".next/types/**/*.ts",
+ "**/*.ts",
+ "**/*.tsx"
+ ],
+ "exclude": [
+ "node_modules"
+ ]
+}
diff --git a/packages/contracts/package.json b/packages/contracts/package.json
new file mode 100644
index 0000000..0ec1a23
--- /dev/null
+++ b/packages/contracts/package.json
@@ -0,0 +1,6 @@
+{
+ "name": "@wtfx/contracts",
+ "version": "1.0.0",
+ "main": "./src/index.ts",
+ "types": "./src/index.ts"
+}
diff --git a/packages/contracts/src/abis/MockERC20.json b/packages/contracts/src/abis/MockERC20.json
new file mode 100644
index 0000000..7a01acf
--- /dev/null
+++ b/packages/contracts/src/abis/MockERC20.json
@@ -0,0 +1,263 @@
+[
+ {
+ "inputs": [
+ {
+ "internalType": "string",
+ "name": "name_",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "symbol_",
+ "type": "string"
+ },
+ {
+ "internalType": "uint8",
+ "name": "decimals_",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "mint",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "from",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "to",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+]
\ No newline at end of file
diff --git a/packages/contracts/src/abis/WTFControllerV2.json b/packages/contracts/src/abis/WTFControllerV2.json
new file mode 100644
index 0000000..de44b76
--- /dev/null
+++ b/packages/contracts/src/abis/WTFControllerV2.json
@@ -0,0 +1,3004 @@
+[
+ {
+ "inputs": [],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [],
+ "name": "AccessControlBadConfirmation",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint48",
+ "name": "schedule",
+ "type": "uint48"
+ }
+ ],
+ "name": "AccessControlEnforcedDefaultAdminDelay",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "AccessControlEnforcedDefaultAdminRules",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "defaultAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "AccessControlInvalidDefaultAdmin",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "neededRole",
+ "type": "bytes32"
+ }
+ ],
+ "name": "AccessControlUnauthorizedAccount",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FactoryCurveNotAllowed",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FactoryFeeRateExceedMaximumLimit",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FactoryInvalidCollateral",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FactoryInvalidCurve",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FactoryInvalidSeedAmount",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FactoryNativeTokenNotAllowed",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FactorySeedCallFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "FactorySeedCostMismatch",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "InvalidInitialization",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketResolved",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "NotInitializing",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ReentrancyGuardReentrantCall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "Registry6909MustBeRegisteredMarket",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryCollateralNotWhitelisted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryFeeRateTooHigh",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryFeeRateTooLow",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryInvalidCentralWallet",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryInvalidCreatorShare",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryInvalidCurve",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryInvalidDisputeWindow",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryInvalidTimestamp",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryInvalidTokenIdAsCollateral",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryInvalidTreasuryAddress",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryMarketDeploymentFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryMarketNotFound",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryOnlyCreator",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryPaused",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryQuestionNotFound",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistrySeedBelowMinimum",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "RegistryTokenIdNotCreatedForMarket",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "Safe6909TransferFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "SafeCastOverflow",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "bits",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "value",
+ "type": "uint256"
+ }
+ ],
+ "name": "SafeCastOverflowedUintDowncast",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "SafeERC20FailedOperation",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "indexOutcomeFromZero",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ }
+ ],
+ "name": "AddOutcome",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "update",
+ "type": "bytes"
+ }
+ ],
+ "name": "AncillaryDataUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "otBurned",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "payout",
+ "type": "uint256"
+ }
+ ],
+ "name": "ClaimPayout",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "collateral",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "isWhitelisted",
+ "type": "bool"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralSeedMin",
+ "type": "uint256"
+ }
+ ],
+ "name": "CollateralWhitelist",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "collateral",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "parentTokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "curve",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "timestampStart",
+ "type": "uint256"
+ }
+ ],
+ "name": "CreateNewMarket",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "title",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "ptr",
+ "type": "address"
+ }
+ ],
+ "name": "CreateNewQuestion",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "oracle",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "creator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "title",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "imageUri",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint96",
+ "name": "timestampEnd",
+ "type": "uint96"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "outcomeNames",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "outcomeImageUris",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "ancillaryData",
+ "type": "bytes"
+ }
+ ],
+ "name": "CreateNewQuestionV2",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "curve",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "isWhitelisted",
+ "type": "bool"
+ }
+ ],
+ "name": "CurveWhitelist",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "DefaultAdminDelayChangeCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint48",
+ "name": "newDelay",
+ "type": "uint48"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint48",
+ "name": "effectSchedule",
+ "type": "uint48"
+ }
+ ],
+ "name": "DefaultAdminDelayChangeScheduled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [],
+ "name": "DefaultAdminTransferCanceled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint48",
+ "name": "acceptSchedule",
+ "type": "uint48"
+ }
+ ],
+ "name": "DefaultAdminTransferScheduled",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "answerProposed",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "update",
+ "type": "bytes"
+ }
+ ],
+ "name": "DisputeAncillaryDataUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint128",
+ "name": "timestampPrev",
+ "type": "uint128"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint128",
+ "name": "timestampNext",
+ "type": "uint128"
+ }
+ ],
+ "name": "ExtendEnd",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "creator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "creatorShareAmount",
+ "type": "uint256"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "centralWallet",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "platformAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "FeeSplit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "answer",
+ "type": "uint256"
+ }
+ ],
+ "name": "Finalise",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalMarketCap",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalSupply",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "redeemValue",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "probs",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "GraduateMarket",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint64",
+ "name": "version",
+ "type": "uint64"
+ }
+ ],
+ "name": "Initialized",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "answer",
+ "type": "uint256"
+ }
+ ],
+ "name": "ManuallyFinalise",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "refundValue",
+ "type": "uint256"
+ }
+ ],
+ "name": "MarketRefunded",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "integrator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralFromUser",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToIntegrator",
+ "type": "uint256"
+ }
+ ],
+ "name": "MintIntegratorFee",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralFromUser",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "otToUser",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToTreasury",
+ "type": "uint256"
+ }
+ ],
+ "name": "MintSwap",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToPool",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "otToUser",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToTreasury",
+ "type": "uint256"
+ }
+ ],
+ "name": "MintSwapV2",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint96",
+ "name": "timestampPrev",
+ "type": "uint96"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint96",
+ "name": "timestampNext",
+ "type": "uint96"
+ }
+ ],
+ "name": "ModifyEnd",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "indexOutcomeFromZero",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "imageUri",
+ "type": "string"
+ }
+ ],
+ "name": "OutcomeImageUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "answerPrev",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "answerNext",
+ "type": "uint256"
+ }
+ ],
+ "name": "OverrideFinalise",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "Paused",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint96",
+ "name": "timestampFlagExpiry",
+ "type": "uint96"
+ }
+ ],
+ "name": "QuestionFlagged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "imageUri",
+ "type": "string"
+ }
+ ],
+ "name": "QuestionImageUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "QuestionUnflagged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "integrator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToUser",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToIntegrator",
+ "type": "uint256"
+ }
+ ],
+ "name": "RedeemIntegratorFee",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToUser",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "otToPool",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToTreasury",
+ "type": "uint256"
+ }
+ ],
+ "name": "RedeemSwap",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralFromPool",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "otToPool",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToTreasury",
+ "type": "uint256"
+ }
+ ],
+ "name": "RedeemSwapV2",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "answerPrev",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "answerNext",
+ "type": "uint256"
+ }
+ ],
+ "name": "Resolve",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "previousAdminRole",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "newAdminRole",
+ "type": "bytes32"
+ }
+ ],
+ "name": "RoleAdminChanged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "RoleGranted",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "RoleRevoked",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "centralWalletNew",
+ "type": "address"
+ }
+ ],
+ "name": "SetCentralWallet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint80",
+ "name": "creatorShareNew",
+ "type": "uint80"
+ }
+ ],
+ "name": "SetCreatorShare",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "disputeWindow",
+ "type": "uint256"
+ }
+ ],
+ "name": "SetDisputeWindow",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "feeRate",
+ "type": "uint256"
+ }
+ ],
+ "name": "SetFeeRate",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "thresholdMcap",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "thresholdMaxSupply",
+ "type": "uint256"
+ }
+ ],
+ "name": "SetGraduationThresholds",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "thresholdMcap",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "thresholdMaxSupply",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "disputeWindow",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "isCustom",
+ "type": "bool"
+ }
+ ],
+ "name": "SetMarketConfigOverride",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint8",
+ "name": "tierId",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "thresholdMcap",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "thresholdMaxSupply",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "disputeWindow",
+ "type": "uint256"
+ }
+ ],
+ "name": "SetMarketTier",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint8",
+ "name": "tierId",
+ "type": "uint8"
+ }
+ ],
+ "name": "SetMarketTierBinding",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint80",
+ "name": "feeRate",
+ "type": "uint80"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "isOverride",
+ "type": "bool"
+ }
+ ],
+ "name": "SetProtocolFeeOverride",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint80",
+ "name": "feeRateNew",
+ "type": "uint80"
+ }
+ ],
+ "name": "SetProtocolFeeRate",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ }
+ ],
+ "name": "SetTreasury",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "Unpaused",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "DEFAULT_ADMIN_ROLE",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "WTFMARKET_INIT_CODE_STORE",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "acceptDefaultAdminTransfer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "string[]",
+ "name": "names",
+ "type": "string[]"
+ },
+ {
+ "internalType": "string[]",
+ "name": "imageUris",
+ "type": "string[]"
+ }
+ ],
+ "name": "addOutcomes",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "answer",
+ "type": "uint256"
+ }
+ ],
+ "name": "adminSettle",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ }
+ ],
+ "name": "beginDefaultAdminTransfer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "cancelDefaultAdminTransfer",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint48",
+ "name": "newDelay",
+ "type": "uint48"
+ }
+ ],
+ "name": "changeDefaultAdminDelay",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "defaultAdmin",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "defaultAdminDelay",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "defaultAdminDelayIncreaseWait",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint96",
+ "name": "timestampEnd",
+ "type": "uint96"
+ },
+ {
+ "internalType": "string",
+ "name": "title",
+ "type": "string"
+ },
+ {
+ "internalType": "bytes",
+ "name": "ancillaryData",
+ "type": "bytes"
+ },
+ {
+ "internalType": "string",
+ "name": "imageUri",
+ "type": "string"
+ },
+ {
+ "internalType": "string[]",
+ "name": "outcomeNames",
+ "type": "string[]"
+ },
+ {
+ "internalType": "string[]",
+ "name": "outcomeImageUris",
+ "type": "string[]"
+ }
+ ],
+ "internalType": "struct QuestionParams",
+ "name": "paramsQuestion",
+ "type": "tuple"
+ },
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "parentTokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "collateral",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "curve",
+ "type": "address"
+ },
+ {
+ "internalType": "uint96",
+ "name": "timestampStart",
+ "type": "uint96"
+ },
+ {
+ "internalType": "uint80",
+ "name": "feeRate",
+ "type": "uint80"
+ },
+ {
+ "internalType": "uint8",
+ "name": "tierId",
+ "type": "uint8"
+ }
+ ],
+ "internalType": "struct MarketParams",
+ "name": "paramsMarket",
+ "type": "tuple"
+ },
+ {
+ "internalType": "address",
+ "name": "oracle",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "otSeed",
+ "type": "uint256"
+ }
+ ],
+ "name": "deployMarket",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "answer",
+ "type": "uint256"
+ }
+ ],
+ "name": "finaliseManually",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "answerChallenge",
+ "type": "uint256"
+ }
+ ],
+ "name": "finaliseOutcome",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "flag",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "getAncillaryUpdates",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "timestamp",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "update",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct AncillaryDataUpdate[]",
+ "name": "",
+ "type": "tuple[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "offset",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "limit",
+ "type": "uint256"
+ }
+ ],
+ "name": "getAncillaryUpdatesPaginated",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "timestamp",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "update",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct AncillaryDataUpdate[]",
+ "name": "",
+ "type": "tuple[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getCentralWallet",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ }
+ ],
+ "name": "getConfig",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "treasuryOut",
+ "type": "address"
+ },
+ {
+ "internalType": "uint80",
+ "name": "feeRate",
+ "type": "uint80"
+ },
+ {
+ "internalType": "uint256",
+ "name": "numOutcomes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint128",
+ "name": "timestampEnd",
+ "type": "uint128"
+ },
+ {
+ "internalType": "uint256",
+ "name": "answer",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "isFinalised_",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getCreator",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getCreatorShare",
+ "outputs": [
+ {
+ "internalType": "uint80",
+ "name": "",
+ "type": "uint80"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getDefaultFeeRate",
+ "outputs": [
+ {
+ "internalType": "uint80",
+ "name": "",
+ "type": "uint80"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getDisputeWindow",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ }
+ ],
+ "name": "getFeeRate",
+ "outputs": [
+ {
+ "internalType": "uint80",
+ "name": "",
+ "type": "uint80"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "getGraduationThresholds",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "thresholdMcap",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "thresholdMaxSupply",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ }
+ ],
+ "name": "getLatestAncillaryUpdate",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "uint256",
+ "name": "timestamp",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "update",
+ "type": "bytes"
+ }
+ ],
+ "internalType": "struct AncillaryDataUpdate",
+ "name": "",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ }
+ ],
+ "name": "getMarketConfig",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "thresholdMcap",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "thresholdMaxSupply",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "disputeWindow",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint8",
+ "name": "tierId",
+ "type": "uint8"
+ },
+ {
+ "internalType": "bool",
+ "name": "isCustom",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "tierId",
+ "type": "uint8"
+ }
+ ],
+ "name": "getMarketTier",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "thresholdMcap",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "thresholdMaxSupply",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "disputeWindow",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "isCustom",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getNumOutcomes",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getOutcomeAnswer",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getOutcomeEnd",
+ "outputs": [
+ {
+ "internalType": "uint128",
+ "name": "",
+ "type": "uint128"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getOutcomeNames",
+ "outputs": [
+ {
+ "internalType": "string[]",
+ "name": "",
+ "type": "string[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ }
+ ],
+ "name": "getRoleAdmin",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "grantRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "hasRole",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "admin_",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "treasury_",
+ "type": "address"
+ },
+ {
+ "internalType": "uint80",
+ "name": "feeRateDefault_",
+ "type": "uint80"
+ },
+ {
+ "internalType": "uint48",
+ "name": "adminTransferDelay_",
+ "type": "uint48"
+ }
+ ],
+ "name": "initialize",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "isAdmin",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "isClaimable",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "isFinalised",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ }
+ ],
+ "name": "isMarket",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ }
+ ],
+ "name": "isMarketClaimable",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ }
+ ],
+ "name": "isMarketWithinDisputeWindow",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "isPaused",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "isWithinDisputeWindow",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint128",
+ "name": "timestampEndNew",
+ "type": "uint128"
+ }
+ ],
+ "name": "modifyTimestampEnd",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "answer",
+ "type": "uint256"
+ }
+ ],
+ "name": "overrideFinalise",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "owner",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "pause",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "pendingDefaultAdmin",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "newAdmin",
+ "type": "address"
+ },
+ {
+ "internalType": "uint48",
+ "name": "schedule",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "pendingDefaultAdminDelay",
+ "outputs": [
+ {
+ "internalType": "uint48",
+ "name": "newDelay",
+ "type": "uint48"
+ },
+ {
+ "internalType": "uint48",
+ "name": "schedule",
+ "type": "uint48"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "bytes",
+ "name": "update",
+ "type": "bytes"
+ }
+ ],
+ "name": "postUpdate",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "collateral",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "parentTokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "curve",
+ "type": "address"
+ },
+ {
+ "internalType": "uint128",
+ "name": "timestampStart",
+ "type": "uint128"
+ }
+ ],
+ "name": "predictMarketAddress",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "renounceRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "answer",
+ "type": "uint256"
+ }
+ ],
+ "name": "resolveOutcome",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "role",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "revokeRole",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "rollbackDefaultAdminDelay",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "tokenIds",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "otAmounts",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "seedLiquidity",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "centralWalletNew",
+ "type": "address"
+ }
+ ],
+ "name": "setCentralWallet",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint80",
+ "name": "creatorShareNew",
+ "type": "uint80"
+ }
+ ],
+ "name": "setCreatorShare",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "disputeWindowNew",
+ "type": "uint256"
+ }
+ ],
+ "name": "setDisputeWindow",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint80",
+ "name": "feeRateNew",
+ "type": "uint80"
+ }
+ ],
+ "name": "setFeeRateDefault",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "internalType": "uint80",
+ "name": "feeRate",
+ "type": "uint80"
+ },
+ {
+ "internalType": "bool",
+ "name": "isOverride",
+ "type": "bool"
+ }
+ ],
+ "name": "setFeeRateOverride",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "thresholdMcapNew",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "thresholdMaxSupplyNew",
+ "type": "uint256"
+ }
+ ],
+ "name": "setGraduationThresholds",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "string",
+ "name": "imageUri",
+ "type": "string"
+ }
+ ],
+ "name": "setImageUri",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "thresholdMcap",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "thresholdMaxSupply",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "disputeWindow",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "isCustom",
+ "type": "bool"
+ }
+ ],
+ "name": "setMarketConfigOverride",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint8",
+ "name": "tierId",
+ "type": "uint8"
+ },
+ {
+ "internalType": "uint256",
+ "name": "thresholdMcap",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "thresholdMaxSupply",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "disputeWindow",
+ "type": "uint256"
+ }
+ ],
+ "name": "setMarketTier",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "internalType": "uint8",
+ "name": "tierId",
+ "type": "uint8"
+ }
+ ],
+ "name": "setMarketTierBinding",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "uint256",
+ "name": "indexOutcome",
+ "type": "uint256"
+ },
+ {
+ "internalType": "string",
+ "name": "imageUri",
+ "type": "string"
+ }
+ ],
+ "name": "setOutcomeImageUri",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "thresholdMcapNew",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "thresholdMaxSupplyNew",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "disputeWindowNew",
+ "type": "uint256"
+ }
+ ],
+ "name": "setThresholdsAndWindow",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "treasury_",
+ "type": "address"
+ }
+ ],
+ "name": "setTreasury",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "collateral",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "whitelist",
+ "type": "bool"
+ },
+ {
+ "internalType": "uint256",
+ "name": "collateralSeedMin",
+ "type": "uint256"
+ }
+ ],
+ "name": "setWhitelistedCollateral",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "curve",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "whitelist",
+ "type": "bool"
+ }
+ ],
+ "name": "setWhitelistedCurve",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "unflag",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "unpause",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "unresolveOutcome",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+]
\ No newline at end of file
diff --git a/packages/contracts/src/abis/WTFMarketV2.json b/packages/contracts/src/abis/WTFMarketV2.json
new file mode 100644
index 0000000..160d983
--- /dev/null
+++ b/packages/contracts/src/abis/WTFMarketV2.json
@@ -0,0 +1,2410 @@
+[
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "_registry",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_factory",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "_collateral",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "_parentTokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "_questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "_curve",
+ "type": "address"
+ },
+ {
+ "internalType": "uint128",
+ "name": "_timestampStart",
+ "type": "uint128"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "constructor"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "allowance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC6909InsufficientAllowance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "balance",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "needed",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "ERC6909InsufficientBalance",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "approver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidApprover",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidReceiver",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidSender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909InvalidSpender",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ }
+ ],
+ "name": "ERC6909SelfTransfer",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketAlreadyGraduated",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketAlreadyRefunded",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketArrayLengthsMismatch",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketClaimWindowNotPassed",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketEnded",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketGraduated",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketGraduationThresholdNotMet",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketInsufficientSeedCollateral",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "MarketInvalidTokenId",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketNoClaim",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketNoTokenIdsToSeed",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketNotFinalised",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketNotResolved",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketNotStarted",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketNotWhole",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketPaused",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketReceiverIsMarket",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketRefundWindowPassed",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketResolved",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketSwapAmountCannotBeZero",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "collateralDelta",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "otDelta",
+ "type": "uint256"
+ }
+ ],
+ "name": "MarketSwapPriceInvalidated",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketTooManyOutcomes",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "required",
+ "type": "address"
+ }
+ ],
+ "name": "MarketUnauthorizedAccess",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketZeroAddress",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketZeroCostBasis",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketZeroSumPrice",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "MarketZeroTotalSupply",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "ReentrancyGuardReentrantCall",
+ "type": "error"
+ },
+ {
+ "inputs": [],
+ "name": "Safe6909TransferFailed",
+ "type": "error"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "token",
+ "type": "address"
+ }
+ ],
+ "name": "SafeERC20FailedOperation",
+ "type": "error"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "indexOutcomeFromZero",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ }
+ ],
+ "name": "AddOutcome",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "update",
+ "type": "bytes"
+ }
+ ],
+ "name": "AncillaryDataUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Approval",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "otBurned",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "payout",
+ "type": "uint256"
+ }
+ ],
+ "name": "ClaimPayout",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "collateral",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "isWhitelisted",
+ "type": "bool"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralSeedMin",
+ "type": "uint256"
+ }
+ ],
+ "name": "CollateralWhitelist",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "collateral",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "parentTokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "curve",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "timestampStart",
+ "type": "uint256"
+ }
+ ],
+ "name": "CreateNewMarket",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "title",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "ptr",
+ "type": "address"
+ }
+ ],
+ "name": "CreateNewQuestion",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "oracle",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "creator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "title",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "imageUri",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint96",
+ "name": "timestampEnd",
+ "type": "uint96"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "outcomeNames",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "string[]",
+ "name": "outcomeImageUris",
+ "type": "string[]"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "ancillaryData",
+ "type": "bytes"
+ }
+ ],
+ "name": "CreateNewQuestionV2",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "curve",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "isWhitelisted",
+ "type": "bool"
+ }
+ ],
+ "name": "CurveWhitelist",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "answerProposed",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bytes",
+ "name": "update",
+ "type": "bytes"
+ }
+ ],
+ "name": "DisputeAncillaryDataUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "newName",
+ "type": "string"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "newSymbol",
+ "type": "string"
+ }
+ ],
+ "name": "ERC6909TokenUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint128",
+ "name": "timestampPrev",
+ "type": "uint128"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint128",
+ "name": "timestampNext",
+ "type": "uint128"
+ }
+ ],
+ "name": "ExtendEnd",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "creator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "creatorShareAmount",
+ "type": "uint256"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "centralWallet",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "platformAmount",
+ "type": "uint256"
+ }
+ ],
+ "name": "FeeSplit",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "answer",
+ "type": "uint256"
+ }
+ ],
+ "name": "Finalise",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalMarketCap",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "totalSupply",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "redeemValue",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256[]",
+ "name": "probs",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "GraduateMarket",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "answer",
+ "type": "uint256"
+ }
+ ],
+ "name": "ManuallyFinalise",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "refundValue",
+ "type": "uint256"
+ }
+ ],
+ "name": "MarketRefunded",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "integrator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralFromUser",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToIntegrator",
+ "type": "uint256"
+ }
+ ],
+ "name": "MintIntegratorFee",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralFromUser",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "otToUser",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToTreasury",
+ "type": "uint256"
+ }
+ ],
+ "name": "MintSwap",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToPool",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "otToUser",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToTreasury",
+ "type": "uint256"
+ }
+ ],
+ "name": "MintSwapV2",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint96",
+ "name": "timestampPrev",
+ "type": "uint96"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint96",
+ "name": "timestampNext",
+ "type": "uint96"
+ }
+ ],
+ "name": "ModifyEnd",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "OperatorSet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "indexOutcomeFromZero",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "imageUri",
+ "type": "string"
+ }
+ ],
+ "name": "OutcomeImageUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "answerPrev",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "answerNext",
+ "type": "uint256"
+ }
+ ],
+ "name": "OverrideFinalise",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "Paused",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint96",
+ "name": "timestampFlagExpiry",
+ "type": "uint96"
+ }
+ ],
+ "name": "QuestionFlagged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "string",
+ "name": "imageUri",
+ "type": "string"
+ }
+ ],
+ "name": "QuestionImageUpdated",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ }
+ ],
+ "name": "QuestionUnflagged",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "integrator",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToUser",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToIntegrator",
+ "type": "uint256"
+ }
+ ],
+ "name": "RedeemIntegratorFee",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToUser",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "otToPool",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToTreasury",
+ "type": "uint256"
+ }
+ ],
+ "name": "RedeemSwap",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralFromPool",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "otToPool",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "collateralToTreasury",
+ "type": "uint256"
+ }
+ ],
+ "name": "RedeemSwapV2",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "answerPrev",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "answerNext",
+ "type": "uint256"
+ }
+ ],
+ "name": "Resolve",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "centralWalletNew",
+ "type": "address"
+ }
+ ],
+ "name": "SetCentralWallet",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint80",
+ "name": "creatorShareNew",
+ "type": "uint80"
+ }
+ ],
+ "name": "SetCreatorShare",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "disputeWindow",
+ "type": "uint256"
+ }
+ ],
+ "name": "SetDisputeWindow",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "feeRate",
+ "type": "uint256"
+ }
+ ],
+ "name": "SetFeeRate",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "thresholdMcap",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "thresholdMaxSupply",
+ "type": "uint256"
+ }
+ ],
+ "name": "SetGraduationThresholds",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "thresholdMcap",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "thresholdMaxSupply",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "disputeWindow",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "isCustom",
+ "type": "bool"
+ }
+ ],
+ "name": "SetMarketConfigOverride",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "uint8",
+ "name": "tierId",
+ "type": "uint8"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "thresholdMcap",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "thresholdMaxSupply",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "disputeWindow",
+ "type": "uint256"
+ }
+ ],
+ "name": "SetMarketTier",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint8",
+ "name": "tierId",
+ "type": "uint8"
+ }
+ ],
+ "name": "SetMarketTierBinding",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint80",
+ "name": "feeRate",
+ "type": "uint80"
+ },
+ {
+ "indexed": false,
+ "internalType": "bool",
+ "name": "isOverride",
+ "type": "bool"
+ }
+ ],
+ "name": "SetProtocolFeeOverride",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "uint80",
+ "name": "feeRateNew",
+ "type": "uint80"
+ }
+ ],
+ "name": "SetProtocolFeeRate",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ }
+ ],
+ "name": "SetTreasury",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "caller",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "indexed": true,
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "indexed": false,
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "Transfer",
+ "type": "event"
+ },
+ {
+ "anonymous": false,
+ "inputs": [
+ {
+ "indexed": false,
+ "internalType": "address",
+ "name": "account",
+ "type": "address"
+ }
+ ],
+ "name": "Unpaused",
+ "type": "event"
+ },
+ {
+ "inputs": [],
+ "name": "_decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "_tokenMetadata",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "name",
+ "type": "string"
+ },
+ {
+ "internalType": "string",
+ "name": "symbol",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "allowance",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "approve",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "balanceOf",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "tokenIds",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "otToBurn",
+ "type": "uint256[]"
+ }
+ ],
+ "name": "claim",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "clobOpenPrices",
+ "outputs": [
+ {
+ "internalType": "uint256[]",
+ "name": "prices",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "collateral",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "collateralDecimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "decimals",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "curve",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "name": "decimals",
+ "outputs": [
+ {
+ "internalType": "uint8",
+ "name": "",
+ "type": "uint8"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "factory",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "forceGraduate",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "redeemValue_",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "graduate",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "redeemValue_",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "index",
+ "type": "uint256"
+ }
+ ],
+ "name": "graduationProbs",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "isGraduated",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "owner",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ }
+ ],
+ "name": "isOperator",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "isRefunded",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "marketCap",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "marketType",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "pure",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "otDeltaOut",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "dataSwap",
+ "type": "bytes"
+ }
+ ],
+ "name": "mintCollateralToExactOt",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "collateralIn",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "name",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "parentTokenId",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "questionId",
+ "outputs": [
+ {
+ "internalType": "bytes32",
+ "name": "",
+ "type": "bytes32"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "readMarketDeployParams",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "collateral",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "parentTokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes32",
+ "name": "questionId",
+ "type": "bytes32"
+ },
+ {
+ "internalType": "address",
+ "name": "curve",
+ "type": "address"
+ },
+ {
+ "internalType": "uint128",
+ "name": "timestampStart",
+ "type": "uint128"
+ }
+ ],
+ "internalType": "struct MarketDeployParams",
+ "name": "",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "readState",
+ "outputs": [
+ {
+ "components": [
+ {
+ "internalType": "address",
+ "name": "market",
+ "type": "address"
+ },
+ {
+ "internalType": "contract IWTFCurve",
+ "name": "curve",
+ "type": "address"
+ },
+ {
+ "internalType": "uint128",
+ "name": "timestampStart",
+ "type": "uint128"
+ },
+ {
+ "internalType": "uint256",
+ "name": "totalMarketCap",
+ "type": "uint256"
+ },
+ {
+ "internalType": "address",
+ "name": "treasury",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "numOutcomes",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint128",
+ "name": "timestampEnd",
+ "type": "uint128"
+ },
+ {
+ "internalType": "uint256",
+ "name": "answer",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bool",
+ "name": "isFinalised",
+ "type": "bool"
+ }
+ ],
+ "internalType": "struct MarketState",
+ "name": "market",
+ "type": "tuple"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "otDeltaIn",
+ "type": "uint256"
+ },
+ {
+ "internalType": "bytes",
+ "name": "dataSwap",
+ "type": "bytes"
+ }
+ ],
+ "name": "redeemExactOtToCollateral",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "collateralOut",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "redeemValue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "refund",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "refundValue",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "registry",
+ "outputs": [
+ {
+ "internalType": "address",
+ "name": "",
+ "type": "address"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256[]",
+ "name": "tokenIds",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "uint256[]",
+ "name": "otAmounts",
+ "type": "uint256[]"
+ },
+ {
+ "internalType": "bytes",
+ "name": "dataSwap",
+ "type": "bytes"
+ }
+ ],
+ "name": "seed",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "collateralSeed",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "spender",
+ "type": "address"
+ },
+ {
+ "internalType": "bool",
+ "name": "approved",
+ "type": "bool"
+ }
+ ],
+ "name": "setOperator",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "answerSim",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "otUserWinning",
+ "type": "uint256"
+ }
+ ],
+ "name": "simPayout",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "payout",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "skim",
+ "outputs": [],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "bytes4",
+ "name": "interfaceId",
+ "type": "bytes4"
+ }
+ ],
+ "name": "supportsInterface",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "tokenId",
+ "type": "uint256"
+ }
+ ],
+ "name": "symbol",
+ "outputs": [
+ {
+ "internalType": "string",
+ "name": "",
+ "type": "string"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "timestampStart",
+ "outputs": [
+ {
+ "internalType": "uint128",
+ "name": "",
+ "type": "uint128"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalMarketCap",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [],
+ "name": "totalSupplies",
+ "outputs": [
+ {
+ "internalType": "uint256[]",
+ "name": "supplies",
+ "type": "uint256[]"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ }
+ ],
+ "name": "totalSupply",
+ "outputs": [
+ {
+ "internalType": "uint256",
+ "name": "",
+ "type": "uint256"
+ }
+ ],
+ "stateMutability": "view",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transfer",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ },
+ {
+ "inputs": [
+ {
+ "internalType": "address",
+ "name": "sender",
+ "type": "address"
+ },
+ {
+ "internalType": "address",
+ "name": "receiver",
+ "type": "address"
+ },
+ {
+ "internalType": "uint256",
+ "name": "id",
+ "type": "uint256"
+ },
+ {
+ "internalType": "uint256",
+ "name": "amount",
+ "type": "uint256"
+ }
+ ],
+ "name": "transferFrom",
+ "outputs": [
+ {
+ "internalType": "bool",
+ "name": "",
+ "type": "bool"
+ }
+ ],
+ "stateMutability": "nonpayable",
+ "type": "function"
+ }
+]
\ No newline at end of file
diff --git a/packages/contracts/src/index.ts b/packages/contracts/src/index.ts
new file mode 100644
index 0000000..06a2a57
--- /dev/null
+++ b/packages/contracts/src/index.ts
@@ -0,0 +1,33 @@
+import WTFControllerV2Abi from './abis/WTFControllerV2.json';
+import MockERC20Abi from './abis/MockERC20.json';
+import WTFMarketV2Abi from './abis/WTFMarketV2.json';
+import robinhoodTestnetDeployment from './robinhoodTestnet.json';
+
+export const ABIS = {
+ WTFControllerV2: WTFControllerV2Abi,
+ MockERC20: MockERC20Abi,
+ WTFMarketV2: WTFMarketV2Abi
+};
+
+export const DEPLOYMENTS = {
+ robinhoodTestnet: robinhoodTestnetDeployment
+};
+
+export const ROBINHOOD_TESTNET_CHAIN = {
+ id: 46630,
+ name: 'Robinhood Chain Testnet',
+ network: 'robinhood-testnet',
+ nativeCurrency: {
+ name: 'ETH',
+ symbol: 'ETH',
+ decimals: 18
+ },
+ rpcUrls: {
+ default: {
+ http: ['https://rpc.testnet.chain.robinhood.com']
+ },
+ public: {
+ http: ['https://rpc.testnet.chain.robinhood.com']
+ }
+ }
+};
diff --git a/packages/contracts/src/robinhoodTestnet.json b/packages/contracts/src/robinhoodTestnet.json
new file mode 100644
index 0000000..6caa952
--- /dev/null
+++ b/packages/contracts/src/robinhoodTestnet.json
@@ -0,0 +1,18 @@
+{
+ "network": "robinhoodTestnet",
+ "chainId": "46630",
+ "timestamp": "2026-08-30T16:20:37.562Z",
+ "deployer": "0x6cddF384792C77219fc25C454Cfe264757842830",
+ "contracts": {
+ "collateral": "0xe776e957953EA69b7Eaa9d7d4098aBC076bDD5E7",
+ "powerLDACurve": "0xF0E189974c413506098AFB6Bc6Bf4C6715fBf7B1",
+ "controllerImplementation": "0x2Aeca49669e9E4E6CdCe46A1bc9bf136765A4f75",
+ "controllerProxy": "0xc0E24E152771C588B21AEB654b30B1cBAf381c1a"
+ },
+ "governance": {
+ "admin": "0x6cddF384792C77219fc25C454Cfe264757842830",
+ "treasury": "0x6cddF384792C77219fc25C454Cfe264757842830",
+ "defaultFeeRate": "6000000000000000",
+ "adminTransferDelay": 259200
+ }
+}
\ No newline at end of file
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..c8ca61b
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,1142 @@
+lockfileVersion: '9.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+importers:
+
+ .:
+ devDependencies:
+ typescript:
+ specifier: ^5.4.5
+ version: 5.9.3
+
+ apps/admin:
+ dependencies:
+ '@wtfx/api-client':
+ specifier: workspace:*
+ version: link:../../packages/api-client
+ '@wtfx/contracts':
+ specifier: workspace:*
+ version: link:../../packages/contracts
+ '@wtfx/types':
+ specifier: workspace:*
+ version: link:../../packages/types
+ '@wtfx/ui':
+ specifier: workspace:*
+ version: link:../../packages/ui
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
+ ethers:
+ specifier: ^6.13.0
+ version: 6.17.0
+ lucide-react:
+ specifier: ^0.395.0
+ version: 0.395.0(react@18.3.1)
+ next:
+ specifier: ^14.2.4
+ version: 14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react:
+ specifier: ^18.3.1
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.3.1
+ version: 18.3.1(react@18.3.1)
+ tailwind-merge:
+ specifier: ^2.3.0
+ version: 2.6.1
+ devDependencies:
+ '@types/node':
+ specifier: ^20.14.2
+ version: 20.19.43
+ '@types/react':
+ specifier: ^18.3.3
+ version: 18.3.31
+ '@types/react-dom':
+ specifier: ^18.3.0
+ version: 18.3.7(@types/react@18.3.31)
+ autoprefixer:
+ specifier: ^10.4.19
+ version: 10.5.4(postcss@8.5.26)
+ postcss:
+ specifier: ^8.4.38
+ version: 8.5.26
+ tailwindcss:
+ specifier: ^3.4.4
+ version: 3.4.19
+ typescript:
+ specifier: ^5.4.5
+ version: 5.9.3
+
+ apps/web:
+ dependencies:
+ '@wtfx/api-client':
+ specifier: workspace:*
+ version: link:../../packages/api-client
+ '@wtfx/types':
+ specifier: workspace:*
+ version: link:../../packages/types
+ '@wtfx/ui':
+ specifier: workspace:*
+ version: link:../../packages/ui
+ ethers:
+ specifier: ^6.13.0
+ version: 6.17.0
+ next:
+ specifier: ^14.2.4
+ version: 14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ react:
+ specifier: ^18.3.1
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.3.1
+ version: 18.3.1(react@18.3.1)
+
+ packages/api-client:
+ dependencies:
+ '@wtfx/types':
+ specifier: workspace:*
+ version: link:../types
+
+ packages/contracts: {}
+
+ packages/types: {}
+
+ packages/ui: {}
+
+packages:
+
+ '@adraffy/ens-normalize@1.11.1':
+ resolution: {integrity: sha512-nhCBV3quEgesuf7c7KYfperqSS14T8bYuvJ8PcLJp6znkZpFc0AuW4qBtr8eKVyPPe/8RSr7sglCWPU5eaxwKQ==}
+
+ '@alloc/quick-lru@5.2.0':
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+ engines: {node: '>=10'}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
+
+ '@jridgewell/resolve-uri@3.1.2':
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+
+ '@jridgewell/sourcemap-codec@1.6.0':
+ resolution: {integrity: sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
+
+ '@next/env@14.2.35':
+ resolution: {integrity: sha512-DuhvCtj4t9Gwrx80dmz2F4t/zKQ4ktN8WrMwOuVzkJfBilwAwGr6v16M5eI8yCuZ63H9TTuEU09Iu2HqkzFPVQ==}
+
+ '@next/swc-darwin-arm64@14.2.33':
+ resolution: {integrity: sha512-HqYnb6pxlsshoSTubdXKu15g3iivcbsMXg4bYpjL2iS/V6aQot+iyF4BUc2qA/J/n55YtvE4PHMKWBKGCF/+wA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@next/swc-darwin-x64@14.2.33':
+ resolution: {integrity: sha512-8HGBeAE5rX3jzKvF593XTTFg3gxeU4f+UWnswa6JPhzaR6+zblO5+fjltJWIZc4aUalqTclvN2QtTC37LxvZAA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@next/swc-linux-arm64-gnu@14.2.33':
+ resolution: {integrity: sha512-JXMBka6lNNmqbkvcTtaX8Gu5by9547bukHQvPoLe9VRBx1gHwzf5tdt4AaezW85HAB3pikcvyqBToRTDA4DeLw==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@next/swc-linux-arm64-musl@14.2.33':
+ resolution: {integrity: sha512-Bm+QulsAItD/x6Ih8wGIMfRJy4G73tu1HJsrccPW6AfqdZd0Sfm5Imhgkgq2+kly065rYMnCOxTBvmvFY1BKfg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@next/swc-linux-x64-gnu@14.2.33':
+ resolution: {integrity: sha512-FnFn+ZBgsVMbGDsTqo8zsnRzydvsGV8vfiWwUo1LD8FTmPTdV+otGSWKc4LJec0oSexFnCYVO4hX8P8qQKaSlg==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@next/swc-linux-x64-musl@14.2.33':
+ resolution: {integrity: sha512-345tsIWMzoXaQndUTDv1qypDRiebFxGYx9pYkhwY4hBRaOLt8UGfiWKr9FSSHs25dFIf8ZqIFaPdy5MljdoawA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@next/swc-win32-arm64-msvc@14.2.33':
+ resolution: {integrity: sha512-nscpt0G6UCTkrT2ppnJnFsYbPDQwmum4GNXYTeoTIdsmMydSKFz9Iny2jpaRupTb+Wl298+Rh82WKzt9LCcqSQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@next/swc-win32-ia32-msvc@14.2.33':
+ resolution: {integrity: sha512-pc9LpGNKhJ0dXQhZ5QMmYxtARwwmWLpeocFmVG5Z0DzWq5Uf0izcI8tLc+qOpqxO1PWqZ5A7J1blrUIKrIFc7Q==}
+ engines: {node: '>= 10'}
+ cpu: [ia32]
+ os: [win32]
+
+ '@next/swc-win32-x64-msvc@14.2.33':
+ resolution: {integrity: sha512-nOjfZMy8B94MdisuzZo9/57xuFVLHJaDj5e/xrduJp9CV2/HrfxTRH2fbyLe+K9QT41WBLUd4iXX3R7jBp0EUg==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@noble/curves@1.2.0':
+ resolution: {integrity: sha512-oYclrNgRaM9SsBUBVbb8M6DTV7ZHRTKugureoYEncY5c65HOmRzvSiTE3y5CYaPYJA/GVkrhXEoF0M3Ya9PMnw==}
+
+ '@noble/hashes@1.3.2':
+ resolution: {integrity: sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ==}
+ engines: {node: '>= 16'}
+
+ '@nodelib/fs.scandir@2.1.5':
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.stat@2.0.5':
+ resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+ engines: {node: '>= 8'}
+
+ '@nodelib/fs.walk@1.2.8':
+ resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+ engines: {node: '>= 8'}
+
+ '@swc/counter@0.1.3':
+ resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
+
+ '@swc/helpers@0.5.5':
+ resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==}
+
+ '@types/node@20.19.43':
+ resolution: {integrity: sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==}
+
+ '@types/node@22.7.5':
+ resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==}
+
+ '@types/prop-types@15.7.15':
+ resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==}
+
+ '@types/react-dom@18.3.7':
+ resolution: {integrity: sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==}
+ peerDependencies:
+ '@types/react': ^18.0.0
+
+ '@types/react@18.3.31':
+ resolution: {integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==}
+
+ aes-js@4.0.0-beta.5:
+ resolution: {integrity: sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==}
+
+ any-promise@1.3.0:
+ resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
+
+ anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+
+ arg@5.0.2:
+ resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
+
+ autoprefixer@10.5.4:
+ resolution: {integrity: sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+
+ baseline-browser-mapping@2.11.20:
+ resolution: {integrity: sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+
+ binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ braces@3.0.3:
+ resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
+ engines: {node: '>=8'}
+
+ browserslist@4.28.8:
+ resolution: {integrity: sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+
+ busboy@1.6.0:
+ resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
+ engines: {node: '>=10.16.0'}
+
+ camelcase-css@2.0.1:
+ resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
+ engines: {node: '>= 6'}
+
+ caniuse-lite@1.0.30001810:
+ resolution: {integrity: sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==}
+
+ chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.0'}
+
+ client-only@0.0.1:
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+
+ clsx@2.1.1:
+ resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
+ engines: {node: '>=6'}
+
+ commander@4.1.1:
+ resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+ engines: {node: '>= 6'}
+
+ cssesc@3.0.0:
+ resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+ engines: {node: '>=4'}
+ hasBin: true
+
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
+ didyoumean@1.2.2:
+ resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
+
+ dlv@1.1.3:
+ resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
+
+ electron-to-chromium@1.5.416:
+ resolution: {integrity: sha512-K6bvB2BjnNrugtIih6ewlbBI9DXa976jIdiIlRLHhBoEI9a4JaQjjHyF+A1IQI543aQYR4LnmOrT/K5fZj0aPA==}
+
+ es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
+ ethers@6.17.0:
+ resolution: {integrity: sha512-BpyrpIPJ3ydEVow8zGaz1DuPS7YU8DcWxuBnY9a0UA/lvAPwrMr+EPXsfrul628SRaekPNeIM4UFh/91GWZang==}
+ engines: {node: '>=14.0.0'}
+
+ fast-glob@3.3.3:
+ resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
+ engines: {node: '>=8.6.0'}
+
+ fastq@1.20.3:
+ resolution: {integrity: sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==}
+
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
+ fill-range@7.1.1:
+ resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
+ engines: {node: '>=8'}
+
+ fraction.js@5.3.4:
+ resolution: {integrity: sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==}
+
+ fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
+ function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+
+ glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+
+ glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+
+ graceful-fs@4.2.11:
+ resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+ hasown@2.0.4:
+ resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
+ engines: {node: '>= 0.4'}
+
+ is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+
+ is-core-module@2.16.2:
+ resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==}
+ engines: {node: '>= 0.4'}
+
+ is-extglob@2.1.1:
+ resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+ engines: {node: '>=0.10.0'}
+
+ is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+
+ is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ jiti@1.21.7:
+ resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
+ hasBin: true
+
+ js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+ lilconfig@3.1.3:
+ resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
+ engines: {node: '>=14'}
+
+ lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+ loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+
+ lucide-react@0.395.0:
+ resolution: {integrity: sha512-6hzdNH5723A4FLaYZWpK50iyZH8iS2Jq5zuPRRotOFkhu6kxxJiebVdJ72tCR5XkiIeYFOU5NUawFZOac+VeYw==}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0
+
+ merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ micromatch@4.0.8:
+ resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==}
+ engines: {node: '>=8.6'}
+
+ mz@2.7.0:
+ resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
+
+ nanoid@3.3.18:
+ resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ next@14.2.35:
+ resolution: {integrity: sha512-KhYd2Hjt/O1/1aZVX3dCwGXM1QmOV4eNM2UTacK5gipDdPN/oHHK/4oVGy7X8GMfPMsUTUEmGlsy0EY1YGAkig==}
+ engines: {node: '>=18.17.0'}
+ hasBin: true
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.41.2
+ react: ^18.2.0
+ react-dom: ^18.2.0
+ sass: ^1.3.0
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ '@playwright/test':
+ optional: true
+ sass:
+ optional: true
+
+ node-releases@2.0.54:
+ resolution: {integrity: sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==}
+ engines: {node: '>=18'}
+
+ normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+
+ object-hash@3.0.0:
+ resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
+ engines: {node: '>= 6'}
+
+ path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+ picocolors@1.1.1:
+ resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
+
+ picomatch@2.3.2:
+ resolution: {integrity: sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==}
+ engines: {node: '>=8.6'}
+
+ picomatch@4.0.7:
+ resolution: {integrity: sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==}
+ engines: {node: '>=12'}
+
+ pirates@4.0.7:
+ resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==}
+ engines: {node: '>= 6'}
+
+ postcss-import@15.1.0:
+ resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ postcss: ^8.0.0
+
+ postcss-js@4.1.0:
+ resolution: {integrity: sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==}
+ engines: {node: ^12 || ^14 || >= 16}
+ peerDependencies:
+ postcss: ^8.4.21
+
+ postcss-load-config@6.0.1:
+ resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==}
+ engines: {node: '>= 18'}
+ peerDependencies:
+ jiti: '>=1.21.0'
+ postcss: '>=8.0.9'
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ jiti:
+ optional: true
+ postcss:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ postcss-nested@6.2.0:
+ resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==}
+ engines: {node: '>=12.0'}
+ peerDependencies:
+ postcss: ^8.2.14
+
+ postcss-selector-parser@6.1.4:
+ resolution: {integrity: sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==}
+ engines: {node: '>=4'}
+
+ postcss-value-parser@4.2.0:
+ resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+
+ postcss@8.4.31:
+ resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ postcss@8.5.26:
+ resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==}
+ engines: {node: ^10 || ^12 || >=14}
+
+ queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ react-dom@18.3.1:
+ resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
+ peerDependencies:
+ react: ^18.3.1
+
+ react@18.3.1:
+ resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
+ engines: {node: '>=0.10.0'}
+
+ read-cache@1.0.2:
+ resolution: {integrity: sha512-/peqiBB/n07gQGLsWaHho3WfvUyRscw0gYTsEFMhrIe/nWLkYaf5SbKYjGYqtRV3aPwykJgF2VEMo1ac4bnsGA==}
+
+ readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+
+ resolve@1.22.12:
+ resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==}
+ engines: {node: '>= 0.4'}
+ hasBin: true
+
+ reusify@1.1.0:
+ resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+
+ scheduler@0.23.2:
+ resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
+
+ source-map-js@1.2.1:
+ resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
+ engines: {node: '>=0.10.0'}
+
+ streamsearch@1.1.0:
+ resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
+ engines: {node: '>=10.0.0'}
+
+ styled-jsx@5.1.1:
+ resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
+ engines: {node: '>= 12.0.0'}
+ peerDependencies:
+ '@babel/core': '*'
+ babel-plugin-macros: '*'
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ babel-plugin-macros:
+ optional: true
+
+ sucrase@3.35.1:
+ resolution: {integrity: sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ hasBin: true
+
+ supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+
+ tailwind-merge@2.6.1:
+ resolution: {integrity: sha512-Oo6tHdpZsGpkKG88HJ8RR1rg/RdnEkQEfMoEk2x1XRI3F1AxeU+ijRXpiVUF4UbLfcxxRGw6TbUINKYdWVsQTQ==}
+
+ tailwindcss@3.4.19:
+ resolution: {integrity: sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
+ thenify-all@1.6.0:
+ resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
+ engines: {node: '>=0.8'}
+
+ thenify@3.3.1:
+ resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
+
+ tinyglobby@0.2.17:
+ resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
+ engines: {node: '>=12.0.0'}
+
+ to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+
+ ts-interface-checker@0.1.13:
+ resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
+
+ tslib@2.7.0:
+ resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==}
+
+ tslib@2.8.1:
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+
+ typescript@5.9.3:
+ resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ undici-types@6.19.8:
+ resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
+
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
+
+ update-browserslist-db@1.3.2:
+ resolution: {integrity: sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+
+ util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ ws@8.21.0:
+ resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==}
+ engines: {node: '>=10.0.0'}
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: '>=5.0.2'
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+
+snapshots:
+
+ '@adraffy/ens-normalize@1.11.1': {}
+
+ '@alloc/quick-lru@5.2.0': {}
+
+ '@jridgewell/gen-mapping@0.3.13':
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.6.0
+ '@jridgewell/trace-mapping': 0.3.31
+
+ '@jridgewell/resolve-uri@3.1.2': {}
+
+ '@jridgewell/sourcemap-codec@1.6.0': {}
+
+ '@jridgewell/trace-mapping@0.3.31':
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.6.0
+
+ '@next/env@14.2.35': {}
+
+ '@next/swc-darwin-arm64@14.2.33':
+ optional: true
+
+ '@next/swc-darwin-x64@14.2.33':
+ optional: true
+
+ '@next/swc-linux-arm64-gnu@14.2.33':
+ optional: true
+
+ '@next/swc-linux-arm64-musl@14.2.33':
+ optional: true
+
+ '@next/swc-linux-x64-gnu@14.2.33':
+ optional: true
+
+ '@next/swc-linux-x64-musl@14.2.33':
+ optional: true
+
+ '@next/swc-win32-arm64-msvc@14.2.33':
+ optional: true
+
+ '@next/swc-win32-ia32-msvc@14.2.33':
+ optional: true
+
+ '@next/swc-win32-x64-msvc@14.2.33':
+ optional: true
+
+ '@noble/curves@1.2.0':
+ dependencies:
+ '@noble/hashes': 1.3.2
+
+ '@noble/hashes@1.3.2': {}
+
+ '@nodelib/fs.scandir@2.1.5':
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ '@nodelib/fs.stat@2.0.5': {}
+
+ '@nodelib/fs.walk@1.2.8':
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.20.3
+
+ '@swc/counter@0.1.3': {}
+
+ '@swc/helpers@0.5.5':
+ dependencies:
+ '@swc/counter': 0.1.3
+ tslib: 2.8.1
+
+ '@types/node@20.19.43':
+ dependencies:
+ undici-types: 6.21.0
+
+ '@types/node@22.7.5':
+ dependencies:
+ undici-types: 6.19.8
+
+ '@types/prop-types@15.7.15': {}
+
+ '@types/react-dom@18.3.7(@types/react@18.3.31)':
+ dependencies:
+ '@types/react': 18.3.31
+
+ '@types/react@18.3.31':
+ dependencies:
+ '@types/prop-types': 15.7.15
+ csstype: 3.2.3
+
+ aes-js@4.0.0-beta.5: {}
+
+ any-promise@1.3.0: {}
+
+ anymatch@3.1.3:
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.2
+
+ arg@5.0.2: {}
+
+ autoprefixer@10.5.4(postcss@8.5.26):
+ dependencies:
+ browserslist: 4.28.8
+ caniuse-lite: 1.0.30001810
+ fraction.js: 5.3.4
+ picocolors: 1.1.1
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+
+ baseline-browser-mapping@2.11.20: {}
+
+ binary-extensions@2.3.0: {}
+
+ braces@3.0.3:
+ dependencies:
+ fill-range: 7.1.1
+
+ browserslist@4.28.8:
+ dependencies:
+ baseline-browser-mapping: 2.11.20
+ caniuse-lite: 1.0.30001810
+ electron-to-chromium: 1.5.416
+ node-releases: 2.0.54
+ update-browserslist-db: 1.3.2(browserslist@4.28.8)
+
+ busboy@1.6.0:
+ dependencies:
+ streamsearch: 1.1.0
+
+ camelcase-css@2.0.1: {}
+
+ caniuse-lite@1.0.30001810: {}
+
+ chokidar@3.6.0:
+ dependencies:
+ anymatch: 3.1.3
+ braces: 3.0.3
+ glob-parent: 5.1.2
+ is-binary-path: 2.1.0
+ is-glob: 4.0.3
+ normalize-path: 3.0.0
+ readdirp: 3.6.0
+ optionalDependencies:
+ fsevents: 2.3.3
+
+ client-only@0.0.1: {}
+
+ clsx@2.1.1: {}
+
+ commander@4.1.1: {}
+
+ cssesc@3.0.0: {}
+
+ csstype@3.2.3: {}
+
+ didyoumean@1.2.2: {}
+
+ dlv@1.1.3: {}
+
+ electron-to-chromium@1.5.416: {}
+
+ es-errors@1.3.0: {}
+
+ escalade@3.2.0: {}
+
+ ethers@6.17.0:
+ dependencies:
+ '@adraffy/ens-normalize': 1.11.1
+ '@noble/curves': 1.2.0
+ '@noble/hashes': 1.3.2
+ '@types/node': 22.7.5
+ aes-js: 4.0.0-beta.5
+ tslib: 2.7.0
+ ws: 8.21.0
+ transitivePeerDependencies:
+ - bufferutil
+ - utf-8-validate
+
+ fast-glob@3.3.3:
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ '@nodelib/fs.walk': 1.2.8
+ glob-parent: 5.1.2
+ merge2: 1.4.1
+ micromatch: 4.0.8
+
+ fastq@1.20.3:
+ dependencies:
+ reusify: 1.1.0
+
+ fdir@6.5.0(picomatch@4.0.7):
+ optionalDependencies:
+ picomatch: 4.0.7
+
+ fill-range@7.1.1:
+ dependencies:
+ to-regex-range: 5.0.1
+
+ fraction.js@5.3.4: {}
+
+ fsevents@2.3.3:
+ optional: true
+
+ function-bind@1.1.2: {}
+
+ glob-parent@5.1.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ glob-parent@6.0.2:
+ dependencies:
+ is-glob: 4.0.3
+
+ graceful-fs@4.2.11: {}
+
+ hasown@2.0.4:
+ dependencies:
+ function-bind: 1.1.2
+
+ is-binary-path@2.1.0:
+ dependencies:
+ binary-extensions: 2.3.0
+
+ is-core-module@2.16.2:
+ dependencies:
+ hasown: 2.0.4
+
+ is-extglob@2.1.1: {}
+
+ is-glob@4.0.3:
+ dependencies:
+ is-extglob: 2.1.1
+
+ is-number@7.0.0: {}
+
+ jiti@1.21.7: {}
+
+ js-tokens@4.0.0: {}
+
+ lilconfig@3.1.3: {}
+
+ lines-and-columns@1.2.4: {}
+
+ loose-envify@1.4.0:
+ dependencies:
+ js-tokens: 4.0.0
+
+ lucide-react@0.395.0(react@18.3.1):
+ dependencies:
+ react: 18.3.1
+
+ merge2@1.4.1: {}
+
+ micromatch@4.0.8:
+ dependencies:
+ braces: 3.0.3
+ picomatch: 2.3.2
+
+ mz@2.7.0:
+ dependencies:
+ any-promise: 1.3.0
+ object-assign: 4.1.1
+ thenify-all: 1.6.0
+
+ nanoid@3.3.18: {}
+
+ next@14.2.35(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
+ dependencies:
+ '@next/env': 14.2.35
+ '@swc/helpers': 0.5.5
+ busboy: 1.6.0
+ caniuse-lite: 1.0.30001810
+ graceful-fs: 4.2.11
+ postcss: 8.4.31
+ react: 18.3.1
+ react-dom: 18.3.1(react@18.3.1)
+ styled-jsx: 5.1.1(react@18.3.1)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 14.2.33
+ '@next/swc-darwin-x64': 14.2.33
+ '@next/swc-linux-arm64-gnu': 14.2.33
+ '@next/swc-linux-arm64-musl': 14.2.33
+ '@next/swc-linux-x64-gnu': 14.2.33
+ '@next/swc-linux-x64-musl': 14.2.33
+ '@next/swc-win32-arm64-msvc': 14.2.33
+ '@next/swc-win32-ia32-msvc': 14.2.33
+ '@next/swc-win32-x64-msvc': 14.2.33
+ transitivePeerDependencies:
+ - '@babel/core'
+ - babel-plugin-macros
+
+ node-releases@2.0.54: {}
+
+ normalize-path@3.0.0: {}
+
+ object-assign@4.1.1: {}
+
+ object-hash@3.0.0: {}
+
+ path-parse@1.0.7: {}
+
+ picocolors@1.1.1: {}
+
+ picomatch@2.3.2: {}
+
+ picomatch@4.0.7: {}
+
+ pirates@4.0.7: {}
+
+ postcss-import@15.1.0(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-value-parser: 4.2.0
+ read-cache: 1.0.2
+ resolve: 1.22.12
+
+ postcss-js@4.1.0(postcss@8.5.26):
+ dependencies:
+ camelcase-css: 2.0.1
+ postcss: 8.5.26
+
+ postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.26):
+ dependencies:
+ lilconfig: 3.1.3
+ optionalDependencies:
+ jiti: 1.21.7
+ postcss: 8.5.26
+
+ postcss-nested@6.2.0(postcss@8.5.26):
+ dependencies:
+ postcss: 8.5.26
+ postcss-selector-parser: 6.1.4
+
+ postcss-selector-parser@6.1.4:
+ dependencies:
+ cssesc: 3.0.0
+ util-deprecate: 1.0.2
+
+ postcss-value-parser@4.2.0: {}
+
+ postcss@8.4.31:
+ dependencies:
+ nanoid: 3.3.18
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ postcss@8.5.26:
+ dependencies:
+ nanoid: 3.3.18
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ queue-microtask@1.2.3: {}
+
+ react-dom@18.3.1(react@18.3.1):
+ dependencies:
+ loose-envify: 1.4.0
+ react: 18.3.1
+ scheduler: 0.23.2
+
+ react@18.3.1:
+ dependencies:
+ loose-envify: 1.4.0
+
+ read-cache@1.0.2: {}
+
+ readdirp@3.6.0:
+ dependencies:
+ picomatch: 2.3.2
+
+ resolve@1.22.12:
+ dependencies:
+ es-errors: 1.3.0
+ is-core-module: 2.16.2
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+
+ reusify@1.1.0: {}
+
+ run-parallel@1.2.0:
+ dependencies:
+ queue-microtask: 1.2.3
+
+ scheduler@0.23.2:
+ dependencies:
+ loose-envify: 1.4.0
+
+ source-map-js@1.2.1: {}
+
+ streamsearch@1.1.0: {}
+
+ styled-jsx@5.1.1(react@18.3.1):
+ dependencies:
+ client-only: 0.0.1
+ react: 18.3.1
+
+ sucrase@3.35.1:
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ commander: 4.1.1
+ lines-and-columns: 1.2.4
+ mz: 2.7.0
+ pirates: 4.0.7
+ tinyglobby: 0.2.17
+ ts-interface-checker: 0.1.13
+
+ supports-preserve-symlinks-flag@1.0.0: {}
+
+ tailwind-merge@2.6.1: {}
+
+ tailwindcss@3.4.19:
+ dependencies:
+ '@alloc/quick-lru': 5.2.0
+ arg: 5.0.2
+ chokidar: 3.6.0
+ didyoumean: 1.2.2
+ dlv: 1.1.3
+ fast-glob: 3.3.3
+ glob-parent: 6.0.2
+ is-glob: 4.0.3
+ jiti: 1.21.7
+ lilconfig: 3.1.3
+ micromatch: 4.0.8
+ normalize-path: 3.0.0
+ object-hash: 3.0.0
+ picocolors: 1.1.1
+ postcss: 8.5.26
+ postcss-import: 15.1.0(postcss@8.5.26)
+ postcss-js: 4.1.0(postcss@8.5.26)
+ postcss-load-config: 6.0.1(jiti@1.21.7)(postcss@8.5.26)
+ postcss-nested: 6.2.0(postcss@8.5.26)
+ postcss-selector-parser: 6.1.4
+ resolve: 1.22.12
+ sucrase: 3.35.1
+ transitivePeerDependencies:
+ - tsx
+ - yaml
+
+ thenify-all@1.6.0:
+ dependencies:
+ thenify: 3.3.1
+
+ thenify@3.3.1:
+ dependencies:
+ any-promise: 1.3.0
+
+ tinyglobby@0.2.17:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.7)
+ picomatch: 4.0.7
+
+ to-regex-range@5.0.1:
+ dependencies:
+ is-number: 7.0.0
+
+ ts-interface-checker@0.1.13: {}
+
+ tslib@2.7.0: {}
+
+ tslib@2.8.1: {}
+
+ typescript@5.9.3: {}
+
+ undici-types@6.19.8: {}
+
+ undici-types@6.21.0: {}
+
+ update-browserslist-db@1.3.2(browserslist@4.28.8):
+ dependencies:
+ browserslist: 4.28.8
+ escalade: 3.2.0
+ picocolors: 1.1.1
+
+ util-deprecate@1.0.2: {}
+
+ ws@8.21.0: {}