From e571ca7398e0f6e8e4b98d9ce57c0b30ada05419 Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Thu, 19 Mar 2026 22:53:20 -0500 Subject: [PATCH 01/24] feat(amm): wire AMM into chain registry, app configs, keeper, and ABI export - Chain registry: add goldAmmMarketProgramId (Solana), goldAmmRouterAddress (EVM), amm feature flag - Solana app: wire AMM program ID into config.ts and programIds.ts with VITE env override - BSC app: wire goldAmmRouterAddress per chain into config.ts - Solana keeper: add GOLD_AMM_MARKET_PROGRAM_ID resolver - EVM: export hardened Router ABI as goldAmmRouterAbi.ts --- packages/hyperbet-bsc/app/src/lib/config.ts | 9 + packages/hyperbet-chain-registry/src/index.ts | 14 + .../hyperbet-solana/app/src/lib/config.ts | 6 + .../hyperbet-solana/app/src/lib/programIds.ts | 9 + packages/hyperbet-solana/keeper/src/common.ts | 5 + .../hyperbet-ui/src/lib/goldAmmRouterAbi.ts | 885 ++++++++++++++++++ 6 files changed, 928 insertions(+) create mode 100644 packages/hyperbet-ui/src/lib/goldAmmRouterAbi.ts diff --git a/packages/hyperbet-bsc/app/src/lib/config.ts b/packages/hyperbet-bsc/app/src/lib/config.ts index d2a4f54e..7f3c7578 100644 --- a/packages/hyperbet-bsc/app/src/lib/config.ts +++ b/packages/hyperbet-bsc/app/src/lib/config.ts @@ -188,14 +188,17 @@ function buildEvmConfig( | "bscRpcUrl" | "bscChainId" | "bscGoldClobAddress" + | "bscGoldAmmRouterAddress" | "bscGoldTokenAddress" | "baseRpcUrl" | "baseChainId" | "baseGoldClobAddress" + | "baseGoldAmmRouterAddress" | "baseGoldTokenAddress" | "avaxRpcUrl" | "avaxChainId" | "avaxGoldClobAddress" + | "avaxGoldAmmRouterAddress" | "avaxGoldTokenAddress" > { const defaults = resolveBettingEvmDefaults( @@ -205,14 +208,17 @@ function buildEvmConfig( bscRpcUrl: defaultRpcUrlForEvmNetwork(defaults.bsc.networkKey), bscChainId: defaults.bsc.chainId, bscGoldClobAddress: defaults.bsc.goldClobAddress, + bscGoldAmmRouterAddress: defaults.bsc.goldAmmRouterAddress, bscGoldTokenAddress: defaults.bsc.goldTokenAddress, baseRpcUrl: defaultRpcUrlForEvmNetwork(defaults.base.networkKey), baseChainId: defaults.base.chainId, baseGoldClobAddress: defaults.base.goldClobAddress, + baseGoldAmmRouterAddress: defaults.base.goldAmmRouterAddress, baseGoldTokenAddress: defaults.base.goldTokenAddress, avaxRpcUrl: defaultAvaxRpcUrlForEnvironment(environment), avaxChainId: defaultAvaxChainIdForEnvironment(environment), avaxGoldClobAddress: "", + avaxGoldAmmRouterAddress: "", avaxGoldTokenAddress: "", }; } @@ -251,14 +257,17 @@ interface EnvConfig { bscRpcUrl: string; bscChainId: number; bscGoldClobAddress: string; + bscGoldAmmRouterAddress: string; bscGoldTokenAddress: string; baseRpcUrl: string; baseChainId: number; baseGoldClobAddress: string; + baseGoldAmmRouterAddress: string; baseGoldTokenAddress: string; avaxRpcUrl: string; avaxChainId: number; avaxGoldClobAddress: string; + avaxGoldAmmRouterAddress: string; avaxGoldTokenAddress: string; walletConnectProjectId: string; diff --git a/packages/hyperbet-chain-registry/src/index.ts b/packages/hyperbet-chain-registry/src/index.ts index 7bf5b29c..d2188e97 100644 --- a/packages/hyperbet-chain-registry/src/index.ts +++ b/packages/hyperbet-chain-registry/src/index.ts @@ -62,6 +62,7 @@ export interface NativeCurrencyConfig { export interface ChainFeatureFlags { predictionMarkets: boolean; perps: boolean; + amm: boolean; } export interface BettingSolanaDeployment { @@ -69,6 +70,7 @@ export interface BettingSolanaDeployment { fightOracleProgramId: string; goldClobMarketProgramId: string; goldPerpsMarketProgramId: string; + goldAmmMarketProgramId: string; goldMint: string; usdcMint: string; } @@ -88,6 +90,7 @@ export interface BettingEvmDeployment { rpcEnvVar: string; duelOracleAddress: string; goldClobAddress: string; + goldAmmRouterAddress: string; adminAddress: string; marketOperatorAddress: string; treasuryAddress: string; @@ -217,6 +220,7 @@ export const BETTING_EVM_CHAIN_ORDER: BettingEvmChain[] = [ const DEFAULT_FEATURE_FLAGS: ChainFeatureFlags = { predictionMarkets: true, perps: false, + amm: false, }; const SOLANA_DEPLOYMENTS: Record = @@ -226,6 +230,7 @@ const SOLANA_DEPLOYMENTS: Record fightOracleProgramId: "B5mRCRDJk9BrnH7regMWW5mpTQ8QG1CcCGSnDxMt8hmo", goldClobMarketProgramId: "DYtd7AoyTX2tbmZ8vpC3mxZgqTpyaDei4TFXZukWBJEf", goldPerpsMarketProgramId: "EoZdHN8U3qWQje48ToxB1SLWjucsFGqcWaRUJQYX3eoT", + goldAmmMarketProgramId: "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", goldMint: "DK9nBUMfdu4XprPRWeh8f6KnQiGWD8Z4xz3yzs9gpump", usdcMint: "", }, @@ -234,6 +239,7 @@ const SOLANA_DEPLOYMENTS: Record fightOracleProgramId: "B5mRCRDJk9BrnH7regMWW5mpTQ8QG1CcCGSnDxMt8hmo", goldClobMarketProgramId: "DYtd7AoyTX2tbmZ8vpC3mxZgqTpyaDei4TFXZukWBJEf", goldPerpsMarketProgramId: "EoZdHN8U3qWQje48ToxB1SLWjucsFGqcWaRUJQYX3eoT", + goldAmmMarketProgramId: "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", goldMint: "DK9nBUMfdu4XprPRWeh8f6KnQiGWD8Z4xz3yzs9gpump", usdcMint: "", }, @@ -242,6 +248,7 @@ const SOLANA_DEPLOYMENTS: Record fightOracleProgramId: "B5mRCRDJk9BrnH7regMWW5mpTQ8QG1CcCGSnDxMt8hmo", goldClobMarketProgramId: "DYtd7AoyTX2tbmZ8vpC3mxZgqTpyaDei4TFXZukWBJEf", goldPerpsMarketProgramId: "EoZdHN8U3qWQje48ToxB1SLWjucsFGqcWaRUJQYX3eoT", + goldAmmMarketProgramId: "", goldMint: "", usdcMint: "", }, @@ -250,6 +257,7 @@ const SOLANA_DEPLOYMENTS: Record fightOracleProgramId: "B5mRCRDJk9BrnH7regMWW5mpTQ8QG1CcCGSnDxMt8hmo", goldClobMarketProgramId: "DYtd7AoyTX2tbmZ8vpC3mxZgqTpyaDei4TFXZukWBJEf", goldPerpsMarketProgramId: "EoZdHN8U3qWQje48ToxB1SLWjucsFGqcWaRUJQYX3eoT", + goldAmmMarketProgramId: "", goldMint: "DK9nBUMfdu4XprPRWeh8f6KnQiGWD8Z4xz3yzs9gpump", usdcMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", }, @@ -265,6 +273,7 @@ const EVM_DEPLOYMENTS: Record = { rpcEnvVar: "BSC_TESTNET_RPC", duelOracleAddress: "0xAd13D36b02f0F6C44d508824Ae9D407931D91f91", goldClobAddress: "0x067335E0b1F226a8e345a289B3b93Ed5377d636e", + goldAmmRouterAddress: "", adminAddress: "0x7908b93DF1A91A5e1B83a4538107Db3c9131eED8", marketOperatorAddress: "0x99622633cF1e476C8bD9161f5B9d4F290a1D2Ea1", treasuryAddress: "0x5c5A3554F12875aBB63a6b8027b9A23C423F5C84", @@ -294,6 +303,7 @@ const EVM_DEPLOYMENTS: Record = { rpcEnvVar: "BSC_MAINNET_RPC", duelOracleAddress: "0x8F582bc1D34Ca6dA12ac46B7c7Fdec02f2465961", goldClobAddress: "0x443C09B1E7bb7bA3392b02500772B185654A6F33", + goldAmmRouterAddress: "", adminAddress: "0x7908b93DF1A91A5e1B83a4538107Db3c9131eED8", marketOperatorAddress: "0x7908b93DF1A91A5e1B83a4538107Db3c9131eED8", treasuryAddress: "0x0262dC245f38d614d508D8BD680c69E3B6D26F4c", @@ -323,6 +333,7 @@ const EVM_DEPLOYMENTS: Record = { rpcEnvVar: "BASE_SEPOLIA_RPC", duelOracleAddress: "", goldClobAddress: "", + goldAmmRouterAddress: "", adminAddress: "", marketOperatorAddress: "", treasuryAddress: "", @@ -352,6 +363,7 @@ const EVM_DEPLOYMENTS: Record = { rpcEnvVar: "BASE_MAINNET_RPC", duelOracleAddress: "0x63BF7f48A2795832C2b5f78172A1C6BE655F3a72", goldClobAddress: "0xb8c66D6895Bafd1B0027F2c0865865043064437C", + goldAmmRouterAddress: "", adminAddress: "0x7908b93DF1A91A5e1B83a4538107Db3c9131eED8", marketOperatorAddress: "0x7908b93DF1A91A5e1B83a4538107Db3c9131eED8", treasuryAddress: "0x0262dC245f38d614d508D8BD680c69E3B6D26F4c", @@ -381,6 +393,7 @@ const EVM_DEPLOYMENTS: Record = { rpcEnvVar: "AVAX_FUJI_RPC", duelOracleAddress: "0xAd13D36b02f0F6C44d508824Ae9D407931D91f91", goldClobAddress: "0x067335E0b1F226a8e345a289B3b93Ed5377d636e", + goldAmmRouterAddress: "", adminAddress: "0x7908b93DF1A91A5e1B83a4538107Db3c9131eED8", marketOperatorAddress: "0x99622633cF1e476C8bD9161f5B9d4F290a1D2Ea1", treasuryAddress: "0x5c5A3554F12875aBB63a6b8027b9A23C423F5C84", @@ -410,6 +423,7 @@ const EVM_DEPLOYMENTS: Record = { rpcEnvVar: "AVAX_MAINNET_RPC", duelOracleAddress: "", goldClobAddress: "", + goldAmmRouterAddress: "", adminAddress: "", marketOperatorAddress: "", treasuryAddress: "", diff --git a/packages/hyperbet-solana/app/src/lib/config.ts b/packages/hyperbet-solana/app/src/lib/config.ts index e2638b8c..834b6fbe 100644 --- a/packages/hyperbet-solana/app/src/lib/config.ts +++ b/packages/hyperbet-solana/app/src/lib/config.ts @@ -132,6 +132,7 @@ function buildSolanaProgramConfig( | "fightOracleProgramId" | "goldClobMarketProgramId" | "goldPerpsMarketProgramId" + | "goldAmmMarketProgramId" | "goldMint" | "usdcMint" > { @@ -140,6 +141,7 @@ function buildSolanaProgramConfig( fightOracleProgramId: deployment.fightOracleProgramId, goldClobMarketProgramId: deployment.goldClobMarketProgramId, goldPerpsMarketProgramId: deployment.goldPerpsMarketProgramId, + goldAmmMarketProgramId: deployment.goldAmmMarketProgramId, goldMint: deployment.goldMint, usdcMint: deployment.usdcMint, }; @@ -152,6 +154,7 @@ export interface EnvConfig { fightOracleProgramId: string; goldClobMarketProgramId: string; goldPerpsMarketProgramId: string; + goldAmmMarketProgramId: string; goldMint: string; usdcMint?: string; betWindowSeconds: number; @@ -322,6 +325,9 @@ export const CONFIG: EnvConfig = { goldPerpsMarketProgramId: readEnvString("VITE_GOLD_PERPS_MARKET_PROGRAM_ID") ?? baseEnvConfig.goldPerpsMarketProgramId, + goldAmmMarketProgramId: + readEnvString("VITE_GOLD_AMM_MARKET_PROGRAM_ID") ?? + baseEnvConfig.goldAmmMarketProgramId, goldMint: readEnvString("VITE_GOLD_MINT") ?? baseEnvConfig.goldMint, usdcMint: readEnvString("VITE_USDC_MINT") ?? baseEnvConfig.usdcMint, betWindowSeconds: readEnvNumber( diff --git a/packages/hyperbet-solana/app/src/lib/programIds.ts b/packages/hyperbet-solana/app/src/lib/programIds.ts index 11293ab2..8104223a 100644 --- a/packages/hyperbet-solana/app/src/lib/programIds.ts +++ b/packages/hyperbet-solana/app/src/lib/programIds.ts @@ -42,3 +42,12 @@ export const GOLD_CLOB_MARKET_PROGRAM_ID = new PublicKey( export const GOLD_PERPS_MARKET_PROGRAM_ID = new PublicKey( goldPerpsMarketProgramAddress, ); + +export const goldAmmMarketProgramAddress = configuredAddress( + CONFIG.goldAmmMarketProgramId, + "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", +); + +export const GOLD_AMM_MARKET_PROGRAM_ID = new PublicKey( + goldAmmMarketProgramAddress, +); diff --git a/packages/hyperbet-solana/keeper/src/common.ts b/packages/hyperbet-solana/keeper/src/common.ts index ee48d1fe..eb672179 100644 --- a/packages/hyperbet-solana/keeper/src/common.ts +++ b/packages/hyperbet-solana/keeper/src/common.ts @@ -187,6 +187,11 @@ export const GOLD_PERPS_MARKET_PROGRAM_ID = resolveConfiguredProgramId( goldPerpsMarketIdl, solanaDeployment.goldPerpsMarketProgramId, ); +export const GOLD_AMM_MARKET_PROGRAM_ID = new PublicKey( + process.env.GOLD_AMM_MARKET_PROGRAM_ID ?? + solanaDeployment.goldAmmMarketProgramId ?? + "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", +); /** @deprecated Binary market is no longer deployed. Retained for backward compat. */ export const GOLD_BINARY_MARKET_PROGRAM_ID = new PublicKey( diff --git a/packages/hyperbet-ui/src/lib/goldAmmRouterAbi.ts b/packages/hyperbet-ui/src/lib/goldAmmRouterAbi.ts new file mode 100644 index 00000000..95e5cf27 --- /dev/null +++ b/packages/hyperbet-ui/src/lib/goldAmmRouterAbi.ts @@ -0,0 +1,885 @@ +export const GOLD_AMM_ROUTER_ABI = [ + { + "type": "function", + "name": "DEFAULT_ADMIN_ROLE", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "MAX_FEE_BPS", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "allMarketIds", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "allMarkets", + "inputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "allowedMarkets", + "inputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "buyNo", + "inputs": [ + { + "name": "market", + "type": "address", + "internalType": "address" + }, + { + "name": "collateralIn", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "minAmountOut", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "buyYes", + "inputs": [ + { + "name": "market", + "type": "address", + "internalType": "address" + }, + { + "name": "collateralIn", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "minAmountOut", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "create", + "inputs": [ + { + "name": "title", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "resolutionSource", + "type": "string", + "internalType": "string" + }, + { + "name": "isDynamic", + "type": "bool", + "internalType": "bool" + }, + { + "name": "duration", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "collateralIn", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "dispute", + "inputs": [ + { + "name": "market", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "feeBps", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getAllMarkets", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address[]", + "internalType": "address[]" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMarketAtIndex", + "inputs": [ + { + "name": "index", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [ + { + "name": "market", + "type": "address", + "internalType": "address" + }, + { + "name": "marketId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMarketCount", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "uint256", + "internalType": "uint256" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getMarketMetadata", + "inputs": [ + { + "name": "marketId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "market", + "type": "address", + "internalType": "address" + }, + { + "name": "liquidity", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "title", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "resolutionSource", + "type": "string", + "internalType": "string" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoleAdmin", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "grantRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "hasRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "mUSD", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract IERC20" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "marketBondCallback", + "inputs": [ + { + "name": "bond", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "marketBuyCallback", + "inputs": [ + { + "name": "collateralIn", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "marketRedeemCallback", + "inputs": [ + { + "name": "amountYes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "amountNo", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "marketSellCallback", + "inputs": [ + { + "name": "tokenIn", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "data", + "type": "bytes", + "internalType": "bytes" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "markets", + "inputs": [ + { + "name": "marketId", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [ + { + "name": "market", + "type": "address", + "internalType": "address" + }, + { + "name": "liquidity", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "initialized", + "type": "bool", + "internalType": "bool" + }, + { + "name": "metadata", + "type": "tuple", + "internalType": "struct Router.MarketMetadata", + "components": [ + { + "name": "title", + "type": "string", + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "internalType": "string" + }, + { + "name": "resolutionSource", + "type": "string", + "internalType": "string" + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "proposerOutcome", + "inputs": [ + { + "name": "market", + "type": "address", + "internalType": "address" + }, + { + "name": "_outcome", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "redeem", + "inputs": [ + { + "name": "market", + "type": "address", + "internalType": "address" + }, + { + "name": "amountYes", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "amountNo", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "renounceRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "callerConfirmation", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "revokeRole", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "sellNo", + "inputs": [ + { + "name": "market", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenIn", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "minAmountOut", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "sellYes", + "inputs": [ + { + "name": "market", + "type": "address", + "internalType": "address" + }, + { + "name": "tokenIn", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "minAmountOut", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "setFeeConfig", + "inputs": [ + { + "name": "_treasury", + "type": "address", + "internalType": "address" + }, + { + "name": "_feeBps", + "type": "uint256", + "internalType": "uint256" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "settleFromOracle", + "inputs": [ + { + "name": "market", + "type": "address", + "internalType": "address" + }, + { + "name": "oracle", + "type": "address", + "internalType": "address" + }, + { + "name": "duelKey", + "type": "bytes32", + "internalType": "bytes32" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "settleMarket", + "inputs": [ + { + "name": "market", + "type": "address", + "internalType": "address" + } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "supportsInterface", + "inputs": [ + { + "name": "interfaceId", + "type": "bytes4", + "internalType": "bytes4" + } + ], + "outputs": [ + { + "name": "", + "type": "bool", + "internalType": "bool" + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "treasury", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "view" + }, + { + "type": "event", + "name": "FeeConfigUpdated", + "inputs": [ + { + "name": "treasury", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "feeBps", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "MarketCreated", + "inputs": [ + { + "name": "marketId", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "market", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "creator", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "title", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "description", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "resolutionSource", + "type": "string", + "indexed": false, + "internalType": "string" + }, + { + "name": "deadline", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + }, + { + "name": "liquidity", + "type": "uint256", + "indexed": false, + "internalType": "uint256" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleAdminChanged", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "previousAdminRole", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "newAdminRole", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleGranted", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "sender", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "event", + "name": "RoleRevoked", + "inputs": [ + { + "name": "role", + "type": "bytes32", + "indexed": true, + "internalType": "bytes32" + }, + { + "name": "account", + "type": "address", + "indexed": true, + "internalType": "address" + }, + { + "name": "sender", + "type": "address", + "indexed": true, + "internalType": "address" + } + ], + "anonymous": false + }, + { + "type": "error", + "name": "AccessControlBadConfirmation", + "inputs": [] + }, + { + "type": "error", + "name": "AccessControlUnauthorizedAccount", + "inputs": [ + { + "name": "account", + "type": "address", + "internalType": "address" + }, + { + "name": "neededRole", + "type": "bytes32", + "internalType": "bytes32" + } + ] + }, + { + "type": "error", + "name": "FeeTooHigh", + "inputs": [] + }, + { + "type": "error", + "name": "MarketNotAllowed", + "inputs": [] + }, + { + "type": "error", + "name": "ReentrancyGuardReentrantCall", + "inputs": [] + }, + { + "type": "error", + "name": "SlippageExceeded", + "inputs": [] + } +] as const; From 92c8edc8dfeb0a3ab909ebdffe6a982b107b2ab3 Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Fri, 20 Mar 2026 00:29:06 -0500 Subject: [PATCH 02/24] feat(amm-solana): integrate lvr_amm into anchor build system MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bump anchor-lang/anchor-spl 0.30.1→0.32.1 to match workspace, add lvr_amm to all 5 build config files (Cargo workspace, Anchor.toml, build-workspace.sh, sync-anchor-artifacts.mjs), and fix operator precedence bug in math.rs to_q function. --- packages/hyperbet-solana/anchor/Anchor.toml | 3 + packages/hyperbet-solana/anchor/Cargo.lock | 1741 +++++++---------- .../anchor/programs/lvr_amm/Cargo.toml | 4 +- .../anchor/scripts/build-workspace.sh | 1 + .../scripts/sync-anchor-artifacts.mjs | 1 + 5 files changed, 711 insertions(+), 1039 deletions(-) diff --git a/packages/hyperbet-solana/anchor/Anchor.toml b/packages/hyperbet-solana/anchor/Anchor.toml index 46c32f1f..7d0e7bb2 100644 --- a/packages/hyperbet-solana/anchor/Anchor.toml +++ b/packages/hyperbet-solana/anchor/Anchor.toml @@ -9,16 +9,19 @@ skip-lint = false fight_oracle = "B5mRCRDJk9BrnH7regMWW5mpTQ8QG1CcCGSnDxMt8hmo" gold_clob_market = "DYtd7AoyTX2tbmZ8vpC3mxZgqTpyaDei4TFXZukWBJEf" gold_perps_market = "EoZdHN8U3qWQje48ToxB1SLWjucsFGqcWaRUJQYX3eoT" +lvr_amm = "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5" [programs.localnet] fight_oracle = "B5mRCRDJk9BrnH7regMWW5mpTQ8QG1CcCGSnDxMt8hmo" gold_clob_market = "DYtd7AoyTX2tbmZ8vpC3mxZgqTpyaDei4TFXZukWBJEf" gold_perps_market = "EoZdHN8U3qWQje48ToxB1SLWjucsFGqcWaRUJQYX3eoT" +lvr_amm = "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5" [programs.mainnet] fight_oracle = "B5mRCRDJk9BrnH7regMWW5mpTQ8QG1CcCGSnDxMt8hmo" gold_clob_market = "DYtd7AoyTX2tbmZ8vpC3mxZgqTpyaDei4TFXZukWBJEf" gold_perps_market = "EoZdHN8U3qWQje48ToxB1SLWjucsFGqcWaRUJQYX3eoT" +lvr_amm = "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5" [registry] url = "https://api.apr.dev" diff --git a/packages/hyperbet-solana/anchor/Cargo.lock b/packages/hyperbet-solana/anchor/Cargo.lock index 73f6bcf4..514ee954 100644 --- a/packages/hyperbet-solana/anchor/Cargo.lock +++ b/packages/hyperbet-solana/anchor/Cargo.lock @@ -4,30 +4,30 @@ version = 4 [[package]] name = "aead" -version = "0.4.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b613b8e1e3cf911a086f53f03bf286f52fd7a7258e4fa606f0ef220d39d8877" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" dependencies = [ + "crypto-common", "generic-array", ] [[package]] name = "aes" -version = "0.7.5" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8b47f52ea9bae42228d07ec09eb676433d7c4ed1ebdf0f1d1c29ed446f1ab8" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", "cpufeatures", - "opaque-debug", ] [[package]] name = "aes-gcm-siv" -version = "0.10.3" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589c637f0e68c877bbd59a4599bbe849cac8e5f3e4b5a3ebae8f528cd218dcdc" +checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d" dependencies = [ "aead", "aes", @@ -38,17 +38,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom 0.2.17", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.12" @@ -76,38 +65,13 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "anchor-attribute-access-control" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47fe28365b33e8334dd70ae2f34a43892363012fe239cf37d2ee91693575b1f8" -dependencies = [ - "anchor-syn 0.30.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "anchor-attribute-access-control" version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a883ca44ef14b2113615fc6d3a85fefc68b5002034e88db37f7f1f802f88aa9" dependencies = [ - "anchor-syn 0.32.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-account" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c288d496168268d198d9b53ee9f4f9d260a55ba4df9877ea1d4486ad6109e0f" -dependencies = [ - "anchor-syn 0.30.1", - "bs58 0.5.1", + "anchor-syn", "proc-macro2", "quote", "syn 1.0.109", @@ -119,42 +83,20 @@ version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61c4d97763b29030412b4b80715076377edc9cc63bc3c9e667297778384b9fd2" dependencies = [ - "anchor-syn 0.32.1", - "bs58 0.5.1", + "anchor-syn", + "bs58", "proc-macro2", "quote", "syn 1.0.109", ] -[[package]] -name = "anchor-attribute-constant" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49b77b6948d0eeaaa129ce79eea5bbbb9937375a9241d909ca8fb9e006bb6e90" -dependencies = [ - "anchor-syn 0.30.1", - "quote", - "syn 1.0.109", -] - [[package]] name = "anchor-attribute-constant" version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aae3328bbf9bbd517a51621b1ba6cbec06cbbc25e8cfc7403bddf69bcf088206" dependencies = [ - "anchor-syn 0.32.1", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-error" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d20bb569c5a557c86101b944721d865e1fd0a4c67c381d31a44a84f07f84828" -dependencies = [ - "anchor-syn 0.30.1", + "anchor-syn", "quote", "syn 1.0.109", ] @@ -165,19 +107,7 @@ version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf2398a6d9e16df1ee9d7d37d970a8246756de898c8dd16ef6bdbe4da20cf39a" dependencies = [ - "anchor-syn 0.32.1", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-event" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cebd8d0671a3a9dc3160c48598d652c34c77de6be4d44345b8b514323284d57" -dependencies = [ - "anchor-syn 0.30.1", - "proc-macro2", + "anchor-syn", "quote", "syn 1.0.109", ] @@ -188,26 +118,9 @@ version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f12758f4ec2f0e98d4d56916c6fe95cb23d74b8723dd902c762c5ef46ebe7b65" dependencies = [ - "anchor-syn 0.32.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-attribute-program" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efb2a5eb0860e661ab31aff7bb5e0288357b176380e985bade4ccb395981b42d" -dependencies = [ - "anchor-lang-idl", - "anchor-syn 0.30.1", - "anyhow", - "bs58 0.5.1", - "heck", + "anchor-syn", "proc-macro2", "quote", - "serde_json", "syn 1.0.109", ] @@ -218,9 +131,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c7193b5af2649813584aae6e3569c46fd59616a96af2083c556b13136c3830f" dependencies = [ "anchor-lang-idl", - "anchor-syn 0.32.1", + "anchor-syn", "anyhow", - "bs58 0.5.1", + "bs58", "heck", "proc-macro2", "quote", @@ -228,37 +141,13 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "anchor-derive-accounts" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04368b5abef4266250ca8d1d12f4dff860242681e4ec22b885dcfe354fd35aa1" -dependencies = [ - "anchor-syn 0.30.1", - "quote", - "syn 1.0.109", -] - [[package]] name = "anchor-derive-accounts" version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d332d1a13c0fca1a446de140b656e66110a5e8406977dcb6a41e5d6f323760b0" dependencies = [ - "anchor-syn 0.32.1", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-derive-serde" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0bb0e0911ad4a70cab880cdd6287fe1e880a1a9d8e4e6defa8e9044b9796a6c" -dependencies = [ - "anchor-syn 0.30.1", - "borsh-derive-internal 0.10.4", - "proc-macro2", + "anchor-syn", "quote", "syn 1.0.109", ] @@ -269,19 +158,8 @@ version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8656e4af182edaeae665fa2d2d7ee81148518b5bd0be9a67f2a381bb17da7d46" dependencies = [ - "anchor-syn 0.32.1", - "borsh-derive-internal 0.10.4", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "anchor-derive-space" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ef415ff156dc82e9ecb943189b0cb241b3a6bfc26a180234dc21bd3ef3ce0cb" -dependencies = [ + "anchor-syn", + "borsh-derive-internal", "proc-macro2", "quote", "syn 1.0.109", @@ -298,47 +176,21 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "anchor-lang" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6620c9486d9d36a4389cab5e37dc34a42ed0bfaa62e6a75a2999ce98f8f2e373" -dependencies = [ - "anchor-attribute-access-control 0.30.1", - "anchor-attribute-account 0.30.1", - "anchor-attribute-constant 0.30.1", - "anchor-attribute-error 0.30.1", - "anchor-attribute-event 0.30.1", - "anchor-attribute-program 0.30.1", - "anchor-derive-accounts 0.30.1", - "anchor-derive-serde 0.30.1", - "anchor-derive-space 0.30.1", - "anchor-lang-idl", - "arrayref", - "base64 0.21.7", - "bincode", - "borsh 0.10.4", - "bytemuck", - "getrandom 0.2.17", - "solana-program", - "thiserror 1.0.69", -] - [[package]] name = "anchor-lang" version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e67d85d5376578f12d840c29ff323190f6eecd65b00a0b5f2b2f232751d049cc" dependencies = [ - "anchor-attribute-access-control 0.32.1", - "anchor-attribute-account 0.32.1", - "anchor-attribute-constant 0.32.1", - "anchor-attribute-error 0.32.1", - "anchor-attribute-event 0.32.1", - "anchor-attribute-program 0.32.1", - "anchor-derive-accounts 0.32.1", - "anchor-derive-serde 0.32.1", - "anchor-derive-space 0.32.1", + "anchor-attribute-access-control", + "anchor-attribute-account", + "anchor-attribute-constant", + "anchor-attribute-error", + "anchor-attribute-event", + "anchor-attribute-program", + "anchor-derive-accounts", + "anchor-derive-serde", + "anchor-derive-space", "anchor-lang-idl", "base64 0.21.7", "bincode", @@ -352,7 +204,7 @@ dependencies = [ "solana-instruction", "solana-instructions-sysvar", "solana-invoke", - "solana-loader-v3-interface", + "solana-loader-v3-interface 3.0.0", "solana-msg", "solana-program-entrypoint", "solana-program-error", @@ -394,11 +246,11 @@ dependencies = [ [[package]] name = "anchor-spl" -version = "0.30.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04bd077c34449319a1e4e0bc21cea572960c9ae0d0fefda0dd7c52fcc3c647a3" +checksum = "3397ab3fc5b198bbfe55d827ff58bd69f2a8d3f9f71c3732c23c2093fec4d3ef" dependencies = [ - "anchor-lang 0.30.1", + "anchor-lang", "mpl-token-metadata", "spl-associated-token-account", "spl-pod", @@ -408,25 +260,6 @@ dependencies = [ "spl-token-metadata-interface", ] -[[package]] -name = "anchor-syn" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f99daacb53b55cfd37ce14d6c9905929721137fd4c67bbab44a19802aecb622f" -dependencies = [ - "anyhow", - "bs58 0.5.1", - "cargo_toml", - "heck", - "proc-macro2", - "quote", - "serde", - "serde_json", - "sha2 0.10.9", - "syn 1.0.109", - "thiserror 1.0.69", -] - [[package]] name = "anchor-syn" version = "0.32.1" @@ -434,7 +267,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b93b69aa7d099b59378433f6d7e20e1008fc10c69e48b220270e5b3f2ec4c8be" dependencies = [ "anyhow", - "bs58 0.5.1", + "bs58", "cargo_toml", "heck", "proc-macro2", @@ -452,123 +285,6 @@ version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" -[[package]] -name = "ark-bn254" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" -dependencies = [ - "ark-ec", - "ark-ff", - "ark-std", -] - -[[package]] -name = "ark-ec" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" -dependencies = [ - "ark-ff", - "ark-poly", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", - "itertools", - "num-traits", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" -dependencies = [ - "ark-ff-asm", - "ark-ff-macros", - "ark-serialize", - "ark-std", - "derivative", - "digest 0.10.7", - "itertools", - "num-bigint", - "num-traits", - "paste", - "rustc_version", - "zeroize", -] - -[[package]] -name = "ark-ff-asm" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-ff-macros" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-poly" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" -dependencies = [ - "ark-ff", - "ark-serialize", - "ark-std", - "derivative", - "hashbrown 0.13.2", -] - -[[package]] -name = "ark-serialize" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-serialize-derive", - "ark-std", - "digest 0.10.7", - "num-bigint", -] - -[[package]] -name = "ark-serialize-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "ark-std" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - [[package]] name = "arrayref" version = "0.3.9" @@ -581,23 +297,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "assert_matches" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" - -[[package]] -name = "atty" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" -dependencies = [ - "hermit-abi", - "libc", - "winapi", -] - [[package]] name = "autocfg" version = "1.5.0" @@ -636,9 +335,6 @@ name = "bitflags" version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" -dependencies = [ - "serde_core", -] [[package]] name = "bitmaps" @@ -651,15 +347,16 @@ dependencies = [ [[package]] name = "blake3" -version = "1.8.2" +version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" +checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", + "cpufeatures", "digest 0.10.7", ] @@ -669,7 +366,6 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" dependencies = [ - "block-padding", "generic-array", ] @@ -682,22 +378,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - -[[package]] -name = "borsh" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" -dependencies = [ - "borsh-derive 0.9.3", - "hashbrown 0.11.2", -] - [[package]] name = "borsh" version = "0.10.4" @@ -718,27 +398,14 @@ dependencies = [ "cfg_aliases", ] -[[package]] -name = "borsh-derive" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" -dependencies = [ - "borsh-derive-internal 0.9.3", - "borsh-schema-derive-internal 0.9.3", - "proc-macro-crate 0.1.5", - "proc-macro2", - "syn 1.0.109", -] - [[package]] name = "borsh-derive" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" dependencies = [ - "borsh-derive-internal 0.10.4", - "borsh-schema-derive-internal 0.10.4", + "borsh-derive-internal", + "borsh-schema-derive-internal", "proc-macro-crate 0.1.5", "proc-macro2", "syn 1.0.109", @@ -757,17 +424,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "borsh-derive-internal" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "borsh-derive-internal" version = "0.10.4" @@ -779,17 +435,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "borsh-schema-derive-internal" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "borsh-schema-derive-internal" version = "0.10.4" @@ -807,12 +452,6 @@ version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36f64beae40a84da1b4b26ff2761a5b895c12adc41dc25aaee1c4f2bbfe97a6e" -[[package]] -name = "bs58" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" - [[package]] name = "bs58" version = "0.5.1" @@ -887,8 +526,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" dependencies = [ "find-msvc-tools", - "jobserver", - "libc", "shlex", ] @@ -904,22 +541,14 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "chrono" -version = "0.4.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" -dependencies = [ - "num-traits", -] - [[package]] name = "cipher" -version = "0.3.0" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee52072ec15386f770805afd189a01c8841be8696bed250fa2f13c4c0d6dfb7" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" dependencies = [ - "generic-array", + "crypto-common", + "inout", ] [[package]] @@ -944,9 +573,9 @@ dependencies = [ [[package]] name = "constant_time_eq" -version = "0.3.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" [[package]] name = "cpufeatures" @@ -995,42 +624,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ "generic-array", + "rand_core 0.6.4", "typenum", ] -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array", - "subtle", -] - [[package]] name = "ctr" -version = "0.8.0" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049bb91fb4aaf0e3c7efa6cd5ef877dbbbd15b39dad06d9948de4ec8a75761ea" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" dependencies = [ "cipher", ] -[[package]] -name = "curve25519-dalek" -version = "3.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "serde", - "subtle", - "zeroize", -] - [[package]] name = "curve25519-dalek" version = "4.1.3" @@ -1044,6 +650,7 @@ dependencies = [ "fiat-crypto", "rand_core 0.6.4", "rustc_version", + "serde", "subtle", "zeroize", ] @@ -1059,41 +666,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core", - "darling_macro", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.117", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.117", -] - [[package]] name = "dashmap" version = "5.5.3" @@ -1114,17 +686,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "digest" version = "0.9.0" @@ -1145,60 +706,12 @@ dependencies = [ "subtle", ] -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek 3.2.1", - "ed25519", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "ed25519-dalek-bip32" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" -dependencies = [ - "derivation-path", - "ed25519-dalek", - "hmac 0.12.1", - "sha2 0.10.9", -] - [[package]] name = "either" version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -[[package]] -name = "env_logger" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - [[package]] name = "equivalent" version = "1.0.2" @@ -1227,8 +740,8 @@ checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" name = "fight_oracle" version = "0.1.0" dependencies = [ - "anchor-lang 0.32.1", - "solana-keccak-hasher", + "anchor-lang", + "solana-keccak-hasher 2.2.1", ] [[package]] @@ -1279,7 +792,6 @@ version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ - "serde", "typenum", "version_check", ] @@ -1291,10 +803,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if", - "js-sys", "libc", "wasi 0.9.0+wasi-snapshot-preview1", - "wasm-bindgen", ] [[package]] @@ -1310,23 +820,11 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasip2", -] - [[package]] name = "gold_clob_market" version = "0.1.0" dependencies = [ - "anchor-lang 0.32.1", + "anchor-lang", "fight_oracle", ] @@ -1334,16 +832,7 @@ dependencies = [ name = "gold_perps_market" version = "0.1.0" dependencies = [ - "anchor-lang 0.32.1", -] - -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" -dependencies = [ - "ahash 0.7.8", + "anchor-lang", ] [[package]] @@ -1352,7 +841,7 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash 0.8.12", + "ahash", ] [[package]] @@ -1387,25 +876,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "hermit-abi" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[package]] -name = "hmac" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac", - "digest 0.9.0", -] - [[package]] name = "hmac" version = "0.12.1" @@ -1415,23 +885,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "hmac-drbg" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" -dependencies = [ - "digest 0.9.0", - "generic-array", - "hmac 0.8.1", -] - -[[package]] -name = "humantime" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" - [[package]] name = "hyperscape-bincode" version = "1.3.3" @@ -1439,12 +892,6 @@ dependencies = [ "serde", ] -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - [[package]] name = "im" version = "15.1.0" @@ -1471,11 +918,20 @@ dependencies = [ "hashbrown 0.16.1", ] +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + [[package]] name = "itertools" -version = "0.10.5" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] @@ -1486,16 +942,6 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - [[package]] name = "js-sys" version = "0.3.91" @@ -1536,14 +982,12 @@ dependencies = [ "arrayref", "base64 0.12.3", "digest 0.9.0", - "hmac-drbg", "libsecp256k1-core", "libsecp256k1-gen-ecmult", "libsecp256k1-gen-genmult", "rand 0.7.3", "serde", "sha2 0.9.9", - "typenum", ] [[package]] @@ -1575,18 +1019,6 @@ dependencies = [ "libsecp256k1-core", ] -[[package]] -name = "light-poseidon" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" -dependencies = [ - "ark-bn254", - "ark-ff", - "num-bigint", - "thiserror 1.0.69", -] - [[package]] name = "lock_api" version = "0.4.14" @@ -1606,7 +1038,7 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" name = "lvr_amm" version = "0.1.0" dependencies = [ - "anchor-lang 0.30.1", + "anchor-lang", "anchor-spl", "bytemuck", "ethnum", @@ -1650,9 +1082,9 @@ dependencies = [ [[package]] name = "mpl-token-metadata" -version = "4.1.2" +version = "5.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf0f61b553e424a6234af1268456972ee66c2222e1da89079242251fa7479e5" +checksum = "046f0779684ec348e2759661361c8798d79021707b1392cb49f3b5eb911340ff" dependencies = [ "borsh 0.10.4", "num-derive 0.3.3", @@ -1768,21 +1200,6 @@ dependencies = [ "windows-link", ] -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pbkdf2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" -dependencies = [ - "crypto-mac", -] - [[package]] name = "pbkdf2" version = "0.11.0" @@ -1800,9 +1217,9 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "polyval" -version = "0.5.3" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8419d2b623c7c0896ff2d5d96e2cb4ede590fed28fcc34934f4c33c036e620a1" +checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" dependencies = [ "cfg-if", "cpufeatures", @@ -1855,17 +1272,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "qualifier_attr" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e2e25ee72f5b24d773cae88422baddefff7714f97aab68d96fe2b6fc4a28fb2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "quote" version = "1.0.45" @@ -1875,12 +1281,6 @@ dependencies = [ "proc-macro2", ] -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - [[package]] name = "rand" version = "0.7.3" @@ -2019,12 +1419,6 @@ version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc_version" version = "0.4.1" @@ -2114,16 +1508,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" -dependencies = [ - "serde", - "serde_with_macros", -] - [[package]] name = "serde_with" version = "3.17.0" @@ -2133,18 +1517,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "serde_with_macros" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "sha2" version = "0.9.9" @@ -2169,18 +1541,6 @@ dependencies = [ "digest 0.10.7", ] -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "keccak", - "opaque-debug", -] - [[package]] name = "sha3" version = "0.10.8" @@ -2197,18 +1557,6 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - [[package]] name = "sized-chunks" version = "0.6.5" @@ -2225,15 +1573,47 @@ version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +[[package]] +name = "solana-account" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f949fe4edaeaea78c844023bfc1c898e0b1f5a100f8a8d2d0f85d0a7b090258" +dependencies = [ + "solana-account-info", + "solana-clock", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", +] + [[package]] name = "solana-account-info" version = "2.3.0" dependencies = [ + "hyperscape-bincode", + "serde", "solana-program-error", "solana-program-memory", "solana-pubkey", ] +[[package]] +name = "solana-address-lookup-table-interface" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1673f67efe870b64a65cb39e6194be5b26527691ce5922909939961a6e6b395" +dependencies = [ + "bincode", + "bytemuck", + "serde", + "serde_derive", + "solana-clock", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", + "solana-slot-hashes", +] + [[package]] name = "solana-atomic-u64" version = "2.2.1" @@ -2244,15 +1624,59 @@ dependencies = [ ] [[package]] -name = "solana-clock" -version = "2.2.3" +name = "solana-big-mod-exp" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75db7f2bbac3e62cfd139065d15bcda9e2428883ba61fc8d27ccb251081e7567" +dependencies = [ + "num-bigint", + "num-traits", + "solana-define-syscall", +] + +[[package]] +name = "solana-bincode" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19a3787b8cf9c9fe3dd360800e8b70982b9e5a8af9e11c354b6665dd4a003adc" +dependencies = [ + "bincode", + "serde", + "solana-instruction", +] + +[[package]] +name = "solana-blake3-hasher" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a0801e25a1b31a14494fc80882a036be0ffd290efc4c2d640bfcca120a4672" +dependencies = [ + "blake3", + "solana-define-syscall", + "solana-hash", + "solana-sanitize", +] + +[[package]] +name = "solana-borsh" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "718333bcd0a1a7aed6655aa66bef8d7fb047944922b2d3a18f49cbc13e73d004" +dependencies = [ + "borsh 0.10.4", + "borsh 1.6.0", +] + +[[package]] +name = "solana-clock" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8584296123df8fe229b95e2ebfd37ae637fe9db9b7d4dd677ac5a78e80dbfce" dependencies = [ "serde", "serde_derive", "solana-sdk-ids", - "solana-sdk-macro 2.2.1", + "solana-sdk-macro", "solana-sysvar-id", ] @@ -2270,6 +1694,20 @@ dependencies = [ "solana-stable-layout", ] +[[package]] +name = "solana-curve25519" +version = "2.3.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae4261b9a8613d10e77ac831a8fa60b6fa52b9b103df46d641deff9f9812a23" +dependencies = [ + "bytemuck", + "bytemuck_derive", + "curve25519-dalek", + "solana-define-syscall", + "subtle", + "thiserror 2.0.18", +] + [[package]] name = "solana-decode-error" version = "2.3.0" @@ -2285,6 +1723,17 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ae3e2abcf541c8122eafe9a625d4d194b4023c20adde1e251f94e056bb1aee2" +[[package]] +name = "solana-derivation-path" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "939756d798b25c5ec3cca10e06212bdca3b1443cb9bb740a38124f58b258737b" +dependencies = [ + "derivation-path", + "qstring", + "uriparse", +] + [[package]] name = "solana-epoch-rewards" version = "2.2.1" @@ -2295,7 +1744,7 @@ dependencies = [ "serde_derive", "solana-hash", "solana-sdk-ids", - "solana-sdk-macro 2.2.1", + "solana-sdk-macro", "solana-sysvar-id", ] @@ -2308,52 +1757,57 @@ dependencies = [ "serde", "serde_derive", "solana-sdk-ids", - "solana-sdk-macro 2.2.1", + "solana-sdk-macro", "solana-sysvar-id", ] [[package]] -name = "solana-feature-gate-interface" -version = "2.2.2" +name = "solana-example-mocks" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "84461d56cbb8bb8d539347151e0525b53910102e4bced875d49d5139708e39d3" dependencies = [ + "serde", + "serde_derive", + "solana-address-lookup-table-interface", + "solana-clock", + "solana-hash", + "solana-instruction", + "solana-keccak-hasher 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-message", + "solana-nonce", "solana-pubkey", "solana-sdk-ids", + "solana-system-interface", + "thiserror 2.0.18", ] [[package]] -name = "solana-fee-calculator" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89bc408da0fb3812bc3008189d148b4d3e08252c79ad810b245482a3f70cd8d" +name = "solana-feature-gate-interface" +version = "2.2.2" dependencies = [ - "log", + "hyperscape-bincode", "serde", "serde_derive", + "solana-account", + "solana-account-info", + "solana-instruction", + "solana-program-error", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-system-interface", ] [[package]] -name = "solana-frozen-abi" -version = "1.18.26" +name = "solana-fee-calculator" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03ab2c30c15311b511c0d1151e4ab6bc9a3e080a37e7c6e7c2d96f5784cf9434" +checksum = "d89bc408da0fb3812bc3008189d148b4d3e08252c79ad810b245482a3f70cd8d" dependencies = [ - "block-buffer 0.10.4", - "bs58 0.4.0", - "bv", - "either", - "generic-array", - "im", - "lazy_static", "log", - "memmap2", - "rustc_version", "serde", - "serde_bytes", "serde_derive", - "sha2 0.10.9", - "solana-frozen-abi-macro 1.18.26", - "subtle", - "thiserror 1.0.69", ] [[package]] @@ -2363,7 +1817,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ac93e831736e9cbd1571c5c692fa7533a304f184f77cba52e5b83c4c7eeebda" dependencies = [ "boxcar", - "bs58 0.5.1", + "bs58", "bv", "bytes", "dashmap", @@ -2372,24 +1826,12 @@ dependencies = [ "memmap2", "serde", "serde_derive", - "serde_with 3.17.0", + "serde_with", "sha2 0.10.9", - "solana-frozen-abi-macro 2.2.1", + "solana-frozen-abi-macro", "thiserror 2.0.18", ] -[[package]] -name = "solana-frozen-abi-macro" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c142f779c3633ac83c84d04ff06c70e1f558c876f13358bed77ba629c7417932" -dependencies = [ - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.117", -] - [[package]] name = "solana-frozen-abi-macro" version = "2.2.1" @@ -2407,6 +1849,7 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b5b96e9f0300fa287b545613f007dfe20043d7812bee255f418c1eb649c93b63" dependencies = [ + "borsh 1.6.0", "bytemuck", "bytemuck_derive", "five8", @@ -2422,6 +1865,7 @@ dependencies = [ name = "solana-instruction" version = "2.3.3" dependencies = [ + "borsh 1.6.0", "getrandom 0.2.17", "hyperscape-bincode", "js-sys", @@ -2471,10 +1915,22 @@ dependencies = [ "borsh 1.6.0", "serde", "serde_derive", - "sha3 0.10.8", + "sha3", + "solana-define-syscall", + "solana-frozen-abi", + "solana-frozen-abi-macro", + "solana-hash", + "solana-sanitize", +] + +[[package]] +name = "solana-keccak-hasher" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7aeb957fbd42a451b99235df4942d96db7ef678e8d5061ef34c9b34cae12f79" +dependencies = [ + "sha3", "solana-define-syscall", - "solana-frozen-abi 2.3.0", - "solana-frozen-abi-macro 2.2.1", "solana-hash", "solana-sanitize", ] @@ -2488,10 +1944,24 @@ dependencies = [ "serde", "serde_derive", "solana-sdk-ids", - "solana-sdk-macro 2.2.1", + "solana-sdk-macro", "solana-sysvar-id", ] +[[package]] +name = "solana-loader-v2-interface" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8ab08006dad78ae7cd30df8eea0539e207d08d91eaefb3e1d49a446e1c49654" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", +] + [[package]] name = "solana-loader-v3-interface" version = "3.0.0" @@ -2508,14 +1978,56 @@ dependencies = [ ] [[package]] -name = "solana-logger" -version = "1.18.26" +name = "solana-loader-v3-interface" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f7162a05b8b0773156b443bccd674ea78bb9aa406325b467ea78c06c99a63a2" +dependencies = [ + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", + "solana-system-interface", +] + +[[package]] +name = "solana-loader-v4-interface" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121d36ffb3c6b958763312cbc697fbccba46ee837d3a0aa4fc0e90fcb3b884f3" +checksum = "706a777242f1f39a83e2a96a2a6cb034cb41169c6ecbee2cf09cb873d9659e7e" dependencies = [ - "env_logger", + "serde", + "serde_bytes", + "serde_derive", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", + "solana-system-interface", +] + +[[package]] +name = "solana-message" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1796aabce376ff74bf89b78d268fa5e683d7d7a96a0a4e4813ec34de49d5314b" +dependencies = [ + "bincode", + "blake3", "lazy_static", - "log", + "serde", + "serde_derive", + "solana-bincode", + "solana-hash", + "solana-instruction", + "solana-pubkey", + "solana-sanitize", + "solana-sdk-ids", + "solana-short-vec", + "solana-system-interface", + "solana-transaction-error", + "wasm-bindgen", ] [[package]] @@ -2527,59 +2039,104 @@ dependencies = [ "solana-define-syscall", ] +[[package]] +name = "solana-native-token" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61515b880c36974053dd499c0510066783f0cc6ac17def0c7ef2a244874cf4a9" + +[[package]] +name = "solana-nonce" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703e22eb185537e06204a5bd9d509b948f0066f2d1d814a6f475dafb3ddf1325" +dependencies = [ + "serde", + "serde_derive", + "solana-fee-calculator", + "solana-hash", + "solana-pubkey", + "solana-sha256-hasher", +] + [[package]] name = "solana-program" -version = "1.18.26" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c10f4588cefd716b24a1a40dd32c278e43a560ab8ce4de6b5805c9d113afdfa1" +checksum = "98eca145bd3545e2fbb07166e895370576e47a00a7d824e325390d33bf467210" dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff", - "ark-serialize", - "base64 0.21.7", "bincode", - "bitflags", "blake3", "borsh 0.10.4", - "borsh 0.9.3", "borsh 1.6.0", - "bs58 0.4.0", - "bv", + "bs58", "bytemuck", - "cc", "console_error_panic_hook", "console_log", - "curve25519-dalek 3.2.1", "getrandom 0.2.17", - "itertools", - "js-sys", "lazy_static", - "libc", - "libsecp256k1", - "light-poseidon", "log", "memoffset", "num-bigint", "num-derive 0.4.2", "num-traits", - "parking_lot", "rand 0.8.5", - "rustc_version", - "rustversion", "serde", "serde_bytes", "serde_derive", - "serde_json", - "sha2 0.10.9", - "sha3 0.10.8", - "solana-frozen-abi 1.18.26", - "solana-frozen-abi-macro 1.18.26", - "solana-sdk-macro 1.18.26", - "thiserror 1.0.69", - "tiny-bip39", + "solana-account-info", + "solana-address-lookup-table-interface", + "solana-atomic-u64", + "solana-big-mod-exp", + "solana-bincode", + "solana-blake3-hasher", + "solana-borsh", + "solana-clock", + "solana-cpi", + "solana-decode-error", + "solana-define-syscall", + "solana-epoch-rewards", + "solana-epoch-schedule", + "solana-example-mocks", + "solana-feature-gate-interface", + "solana-fee-calculator", + "solana-hash", + "solana-instruction", + "solana-instructions-sysvar", + "solana-keccak-hasher 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "solana-last-restart-slot", + "solana-loader-v2-interface", + "solana-loader-v3-interface 5.0.0", + "solana-loader-v4-interface", + "solana-message", + "solana-msg", + "solana-native-token", + "solana-nonce", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey", + "solana-rent", + "solana-sanitize", + "solana-sdk-ids", + "solana-sdk-macro", + "solana-secp256k1-recover", + "solana-serde-varint", + "solana-serialize-utils", + "solana-sha256-hasher", + "solana-short-vec", + "solana-slot-hashes", + "solana-slot-history", + "solana-stable-layout", + "solana-stake-interface", + "solana-system-interface", + "solana-sysvar", + "solana-sysvar-id", + "solana-vote-interface", + "thiserror 2.0.18", "wasm-bindgen", - "zeroize", ] [[package]] @@ -2602,6 +2159,8 @@ checksum = "9ee2e0217d642e2ea4bee237f37bd61bb02aec60da3647c48ff88f6556ade775" dependencies = [ "borsh 1.6.0", "num-traits", + "serde", + "serde_derive", "solana-decode-error", "solana-instruction", "solana-msg", @@ -2642,7 +2201,7 @@ dependencies = [ "borsh 1.6.0", "bytemuck", "bytemuck_derive", - "curve25519-dalek 4.1.3", + "curve25519-dalek", "five8", "five8_const", "getrandom 0.2.17", @@ -2667,7 +2226,7 @@ dependencies = [ "serde", "serde_derive", "solana-sdk-ids", - "solana-sdk-macro 2.2.1", + "solana-sdk-macro", "solana-sysvar-id", ] @@ -2677,61 +2236,6 @@ version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61f1bc1357b8188d9c4a3af3fc55276e56987265eb7ad073ae6f8180ee54cecf" -[[package]] -name = "solana-sdk" -version = "1.18.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "580ad66c2f7a4c3cb3244fe21440546bd500f5ecb955ad9826e92a78dded8009" -dependencies = [ - "assert_matches", - "base64 0.21.7", - "bincode", - "bitflags", - "borsh 1.6.0", - "bs58 0.4.0", - "bytemuck", - "byteorder", - "chrono", - "derivation-path", - "digest 0.10.7", - "ed25519-dalek", - "ed25519-dalek-bip32", - "generic-array", - "hmac 0.12.1", - "itertools", - "js-sys", - "lazy_static", - "libsecp256k1", - "log", - "memmap2", - "num-derive 0.4.2", - "num-traits", - "num_enum", - "pbkdf2 0.11.0", - "qstring", - "qualifier_attr", - "rand 0.7.3", - "rand 0.8.5", - "rustc_version", - "rustversion", - "serde", - "serde_bytes", - "serde_derive", - "serde_json", - "serde_with 2.3.3", - "sha2 0.10.9", - "sha3 0.10.8", - "siphasher", - "solana-frozen-abi 1.18.26", - "solana-frozen-abi-macro 1.18.26", - "solana-logger", - "solana-program", - "solana-sdk-macro 1.18.26", - "thiserror 1.0.69", - "uriparse", - "wasm-bindgen", -] - [[package]] name = "solana-sdk-ids" version = "2.2.1" @@ -2743,27 +2247,25 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.18.26" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b75d0f193a27719257af19144fdaebec0415d1c9e9226ae4bd29b791be5e9bd" +checksum = "86280da8b99d03560f6ab5aca9de2e38805681df34e0bb8f238e69b29433b9df" dependencies = [ - "bs58 0.4.0", + "bs58", "proc-macro2", "quote", - "rustversion", "syn 2.0.117", ] [[package]] -name = "solana-sdk-macro" +name = "solana-secp256k1-recover" version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86280da8b99d03560f6ab5aca9de2e38805681df34e0bb8f238e69b29433b9df" +checksum = "baa3120b6cdaa270f39444f5093a90a7b03d296d362878f7a6991d6de3bbe496" dependencies = [ - "bs58 0.5.1", - "proc-macro2", - "quote", - "syn 2.0.117", + "libsecp256k1", + "solana-define-syscall", + "thiserror 2.0.18", ] [[package]] @@ -2775,6 +2277,35 @@ dependencies = [ "hashbrown 0.15.2", ] +[[package]] +name = "solana-seed-derivable" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beb82b5adb266c6ea90e5cf3967235644848eac476c5a1f2f9283a143b7c97f" +dependencies = [ + "solana-derivation-path", +] + +[[package]] +name = "solana-seed-phrase" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36187af2324f079f65a675ec22b31c24919cb4ac22c79472e85d819db9bbbc15" +dependencies = [ + "hmac", + "pbkdf2", + "sha2 0.10.9", +] + +[[package]] +name = "solana-serde-varint" +version = "2.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a7e155eba458ecfb0107b98236088c3764a09ddf0201ec29e52a0be40857113" +dependencies = [ + "serde", +] + [[package]] name = "solana-serialize-utils" version = "2.2.1" @@ -2797,6 +2328,36 @@ dependencies = [ "solana-hash", ] +[[package]] +name = "solana-short-vec" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c54c66f19b9766a56fa0057d060de8378676cb64987533fa088861858fc5a69" +dependencies = [ + "serde", +] + +[[package]] +name = "solana-signature" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64c8ec8e657aecfc187522fc67495142c12f35e55ddeca8698edbb738b8dbd8c" +dependencies = [ + "five8", + "solana-sanitize", +] + +[[package]] +name = "solana-signer" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c41991508a4b02f021c1342ba00bcfa098630b213726ceadc7cb032e051975b" +dependencies = [ + "solana-pubkey", + "solana-signature", + "solana-transaction-error", +] + [[package]] name = "solana-slot-hashes" version = "2.2.1" @@ -2839,6 +2400,8 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5269e89fde216b4d7e1d1739cf5303f8398a1ff372a81232abbee80e554a838c" dependencies = [ + "borsh 0.10.4", + "borsh 1.6.0", "num-traits", "serde", "serde_derive", @@ -2873,6 +2436,8 @@ name = "solana-sysvar" version = "2.3.0" dependencies = [ "base64 0.22.1", + "bytemuck", + "bytemuck_derive", "hyperscape-bincode", "lazy_static", "serde", @@ -2894,7 +2459,7 @@ dependencies = [ "solana-rent", "solana-sanitize", "solana-sdk-ids", - "solana-sdk-macro 2.2.1", + "solana-sdk-macro", "solana-slot-hashes", "solana-slot-history", "solana-stake-interface", @@ -2912,58 +2477,110 @@ dependencies = [ ] [[package]] -name = "solana-zk-token-sdk" -version = "1.18.26" +name = "solana-transaction-error" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "222a9dc8fdb61c6088baab34fc3a8b8473a03a7a5fd404ed8dd502fa79b67cb1" +dependencies = [ + "solana-instruction", + "solana-sanitize", +] + +[[package]] +name = "solana-vote-interface" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b80d57478d6599d30acc31cc5ae7f93ec2361a06aefe8ea79bc81739a08af4c3" +dependencies = [ + "bincode", + "num-derive 0.4.2", + "num-traits", + "serde", + "serde_derive", + "solana-clock", + "solana-decode-error", + "solana-hash", + "solana-instruction", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-serde-varint", + "solana-serialize-utils", + "solana-short-vec", + "solana-system-interface", +] + +[[package]] +name = "solana-zk-sdk" +version = "2.3.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cbdf4249b6dfcbba7d84e2b53313698043f60f8e22ce48286e6fbe8a17c8d16" +checksum = "97b9fc6ec37d16d0dccff708ed1dd6ea9ba61796700c3bb7c3b401973f10f63b" dependencies = [ "aes-gcm-siv", - "base64 0.21.7", + "base64 0.22.1", "bincode", "bytemuck", - "byteorder", - "curve25519-dalek 3.2.1", - "getrandom 0.1.16", + "bytemuck_derive", + "curve25519-dalek", "itertools", - "lazy_static", + "js-sys", "merlin", "num-derive 0.4.2", "num-traits", - "rand 0.7.3", + "rand 0.8.5", "serde", + "serde_derive", "serde_json", - "sha3 0.9.1", - "solana-program", - "solana-sdk", + "sha3", + "solana-derivation-path", + "solana-instruction", + "solana-pubkey", + "solana-sdk-ids", + "solana-seed-derivable", + "solana-seed-phrase", + "solana-signature", + "solana-signer", "subtle", - "thiserror 1.0.69", + "thiserror 2.0.18", + "wasm-bindgen", "zeroize", ] [[package]] name = "spl-associated-token-account" -version = "3.0.4" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143109d789171379e6143ef23191786dfaac54289ad6e7917cfb26b36c432b10" +checksum = "ae179d4a26b3c7a20c839898e6aed84cb4477adf108a366c95532f058aea041b" dependencies = [ - "assert_matches", "borsh 1.6.0", "num-derive 0.4.2", "num-traits", "solana-program", + "spl-associated-token-account-client", "spl-token", "spl-token-2022", - "thiserror 1.0.69", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-associated-token-account-client" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f8349dbcbe575f354f9a533a21f272f3eb3808a49e2fdc1c34393b88ba76cb" +dependencies = [ + "solana-instruction", + "solana-pubkey", ] [[package]] name = "spl-discriminator" -version = "0.2.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "210101376962bb22bb13be6daea34656ea1cbc248fce2164b146e39203b55e03" +checksum = "a7398da23554a31660f17718164e31d31900956054f54f52d5ec1be51cb4f4b3" dependencies = [ "bytemuck", - "solana-program", + "solana-program-error", + "solana-sha256-hasher", "spl-discriminator-derive", ] @@ -2991,46 +2608,83 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "spl-elgamal-registry" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65edfeed09cd4231e595616aa96022214f9c9d2be02dea62c2b30d5695a6833a" +dependencies = [ + "bytemuck", + "solana-account-info", + "solana-cpi", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-system-interface", + "solana-sysvar", + "solana-zk-sdk", + "spl-pod", + "spl-token-confidential-transfer-proof-extraction", +] + [[package]] name = "spl-memo" -version = "4.0.4" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a49f49f95f2d02111ded31696ab38a081fab623d4c76bd4cb074286db4560836" +checksum = "9f09647c0974e33366efeb83b8e2daebb329f0420149e74d3a4bd2c08cf9f7cb" dependencies = [ - "solana-program", + "solana-account-info", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-pubkey", ] [[package]] name = "spl-pod" -version = "0.2.5" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c52d84c55efeef8edcc226743dc089d7e3888b8e3474569aa3eff152b37b9996" +checksum = "d994afaf86b779104b4a95ba9ca75b8ced3fdb17ee934e38cb69e72afbe17799" dependencies = [ "borsh 1.6.0", "bytemuck", - "solana-program", - "solana-zk-token-sdk", - "spl-program-error", + "bytemuck_derive", + "num-derive 0.4.2", + "num-traits", + "solana-decode-error", + "solana-msg", + "solana-program-error", + "solana-program-option", + "solana-pubkey", + "solana-zk-sdk", + "thiserror 2.0.18", ] [[package]] name = "spl-program-error" -version = "0.4.4" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e45a49acb925db68aa501b926096b2164adbdcade7a0c24152af9f0742d0a602" +checksum = "9cdebc8b42553070b75aa5106f071fef2eb798c64a7ec63375da4b1f058688c6" dependencies = [ "num-derive 0.4.2", "num-traits", - "solana-program", + "solana-decode-error", + "solana-msg", + "solana-program-error", "spl-program-error-derive", - "thiserror 1.0.69", + "thiserror 2.0.18", ] [[package]] name = "spl-program-error-derive" -version = "0.4.1" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" +checksum = "2a2539e259c66910d78593475540e8072f0b10f0f61d7607bbf7593899ed52d0" dependencies = [ "proc-macro2", "quote", @@ -3040,124 +2694,229 @@ dependencies = [ [[package]] name = "spl-tlv-account-resolution" -version = "0.6.5" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fab8edfd37be5fa17c9e42c1bff86abbbaf0494b031b37957f2728ad2ff842ba" +checksum = "1408e961215688715d5a1063cbdcf982de225c45f99c82b4f7d7e1dd22b998d7" dependencies = [ "bytemuck", - "solana-program", + "num-derive 0.4.2", + "num-traits", + "solana-account-info", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", "spl-program-error", "spl-type-length-value", + "thiserror 2.0.18", ] [[package]] name = "spl-token" -version = "4.0.3" +version = "8.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9eb465e4bf5ce1d498f05204c8089378c1ba34ef2777ea95852fc53a1fd4fb2" +checksum = "053067c6a82c705004f91dae058b11b4780407e9ccd6799dc9e7d0fab5f242da" dependencies = [ "arrayref", "bytemuck", "num-derive 0.4.2", "num-traits", "num_enum", - "solana-program", - "thiserror 1.0.69", + "solana-account-info", + "solana-cpi", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", + "solana-sysvar", + "thiserror 2.0.18", ] [[package]] name = "spl-token-2022" -version = "3.0.5" +version = "8.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c39e416aeb1ea0b22f3b2bbecaf7e38a92a1aa8f4a0c5785c94179694e846a0" +checksum = "31f0dfbb079eebaee55e793e92ca5f433744f4b71ee04880bfd6beefba5973e5" dependencies = [ "arrayref", "bytemuck", "num-derive 0.4.2", "num-traits", "num_enum", - "solana-program", + "solana-account-info", + "solana-clock", + "solana-cpi", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-native-token", + "solana-program-entrypoint", + "solana-program-error", + "solana-program-memory", + "solana-program-option", + "solana-program-pack", + "solana-pubkey", + "solana-rent", + "solana-sdk-ids", "solana-security-txt", - "solana-zk-token-sdk", + "solana-system-interface", + "solana-sysvar", + "solana-zk-sdk", + "spl-elgamal-registry", "spl-memo", "spl-pod", "spl-token", + "spl-token-confidential-transfer-ciphertext-arithmetic", + "spl-token-confidential-transfer-proof-extraction", + "spl-token-confidential-transfer-proof-generation", "spl-token-group-interface", "spl-token-metadata-interface", "spl-transfer-hook-interface", "spl-type-length-value", - "thiserror 1.0.69", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-confidential-transfer-ciphertext-arithmetic" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cddd52bfc0f1c677b41493dafa3f2dbbb4b47cf0990f08905429e19dc8289b35" +dependencies = [ + "base64 0.22.1", + "bytemuck", + "solana-curve25519", + "solana-zk-sdk", +] + +[[package]] +name = "spl-token-confidential-transfer-proof-extraction" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe2629860ff04c17bafa9ba4bed8850a404ecac81074113e1f840dbd0ebb7bd6" +dependencies = [ + "bytemuck", + "solana-account-info", + "solana-curve25519", + "solana-instruction", + "solana-instructions-sysvar", + "solana-msg", + "solana-program-error", + "solana-pubkey", + "solana-sdk-ids", + "solana-zk-sdk", + "spl-pod", + "thiserror 2.0.18", +] + +[[package]] +name = "spl-token-confidential-transfer-proof-generation" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa27b9174bea869a7ebf31e0be6890bce90b1a4288bc2bbf24bd413f80ae3fde" +dependencies = [ + "curve25519-dalek", + "solana-zk-sdk", + "thiserror 2.0.18", ] [[package]] name = "spl-token-group-interface" -version = "0.2.5" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "014817d6324b1e20c4bbc883e8ee30a5faa13e59d91d1b2b95df98b920150c17" +checksum = "5597b4cd76f85ce7cd206045b7dc22da8c25516573d42d267c8d1fd128db5129" dependencies = [ "bytemuck", - "solana-program", + "num-derive 0.4.2", + "num-traits", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", - "spl-program-error", + "thiserror 2.0.18", ] [[package]] name = "spl-token-metadata-interface" -version = "0.3.5" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3da00495b602ebcf5d8ba8b3ecff1ee454ce4c125c9077747be49c2d62335ba" +checksum = "304d6e06f0de0c13a621464b1fd5d4b1bebf60d15ca71a44d3839958e0da16ee" dependencies = [ "borsh 1.6.0", - "solana-program", + "num-derive 0.4.2", + "num-traits", + "solana-borsh", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", - "spl-program-error", "spl-type-length-value", + "thiserror 2.0.18", ] [[package]] name = "spl-transfer-hook-interface" -version = "0.6.5" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b5c08a89838e5a2931f79b17f611857f281a14a2100968a3ccef352cb7414b" +checksum = "a7e905b849b6aba63bde8c4badac944ebb6c8e6e14817029cbe1bc16829133bd" dependencies = [ "arrayref", "bytemuck", - "solana-program", + "num-derive 0.4.2", + "num-traits", + "solana-account-info", + "solana-cpi", + "solana-decode-error", + "solana-instruction", + "solana-msg", + "solana-program-error", + "solana-pubkey", "spl-discriminator", "spl-pod", "spl-program-error", "spl-tlv-account-resolution", "spl-type-length-value", + "thiserror 2.0.18", ] [[package]] name = "spl-type-length-value" -version = "0.4.6" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c872f93d0600e743116501eba2d53460e73a12c9a496875a42a7d70e034fe06d" +checksum = "d417eb548214fa822d93f84444024b4e57c13ed6719d4dcc68eec24fb481e9f5" dependencies = [ "bytemuck", - "solana-program", + "num-derive 0.4.2", + "num-traits", + "solana-account-info", + "solana-decode-error", + "solana-msg", + "solana-program-error", "spl-discriminator", "spl-pod", - "spl-program-error", + "thiserror 2.0.18", ] -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - [[package]] name = "subtle" -version = "2.4.1" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] name = "syn" @@ -3181,15 +2940,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "termcolor" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] - [[package]] name = "thiserror" version = "1.0.69" @@ -3230,25 +2980,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "tiny-bip39" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" -dependencies = [ - "anyhow", - "hmac 0.8.1", - "once_cell", - "pbkdf2 0.4.0", - "rand 0.7.3", - "rustc-hash", - "sha2 0.9.9", - "thiserror 1.0.69", - "unicode-normalization", - "wasm-bindgen", - "zeroize", -] - [[package]] name = "tinyvec" version = "1.10.0" @@ -3356,15 +3087,6 @@ version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" -[[package]] -name = "unicode-normalization" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-segmentation" version = "1.12.0" @@ -3373,11 +3095,11 @@ checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" [[package]] name = "universal-hash" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f214e8f697e925001e66ec2c6e37a4ef93f0f78c2eed7814394e10c62025b05" +checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ - "generic-array", + "crypto-common", "subtle", ] @@ -3409,15 +3131,6 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -[[package]] -name = "wasip2" -version = "1.0.2+wasi-0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" -dependencies = [ - "wit-bindgen", -] - [[package]] name = "wasm-bindgen" version = "0.2.114" @@ -3473,52 +3186,12 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - [[package]] name = "winnow" version = "0.7.15" @@ -3528,12 +3201,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "wit-bindgen" -version = "0.51.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" - [[package]] name = "zerocopy" version = "0.8.40" @@ -3556,9 +3223,9 @@ dependencies = [ [[package]] name = "zeroize" -version = "1.3.0" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" dependencies = [ "zeroize_derive", ] diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/Cargo.toml b/packages/hyperbet-solana/anchor/programs/lvr_amm/Cargo.toml index 2725dc2e..9e8ac32f 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/Cargo.toml +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/Cargo.toml @@ -20,8 +20,8 @@ custom-heap = [] custom-panic = [] [dependencies] -anchor-lang = {version = "0.30.1", features = ["init-if-needed"]} -anchor-spl = {version = "0.30.1", features = ["metadata"]} +anchor-lang = {version = "0.32.1", features = ["init-if-needed"]} +anchor-spl = {version = "0.32.1", features = ["metadata"]} bytemuck = { version = "1.20.0", features = ["min_const_generics"] } ethnum = "1.5.0" diff --git a/packages/hyperbet-solana/anchor/scripts/build-workspace.sh b/packages/hyperbet-solana/anchor/scripts/build-workspace.sh index 0099d5ad..031f3026 100755 --- a/packages/hyperbet-solana/anchor/scripts/build-workspace.sh +++ b/packages/hyperbet-solana/anchor/scripts/build-workspace.sh @@ -10,6 +10,7 @@ PROGRAMS=( "fight_oracle" "gold_clob_market" "gold_perps_market" + "lvr_amm" ) extract_marker_json() { diff --git a/packages/hyperbet-solana/scripts/sync-anchor-artifacts.mjs b/packages/hyperbet-solana/scripts/sync-anchor-artifacts.mjs index a7914ab8..9c707f3e 100644 --- a/packages/hyperbet-solana/scripts/sync-anchor-artifacts.mjs +++ b/packages/hyperbet-solana/scripts/sync-anchor-artifacts.mjs @@ -54,6 +54,7 @@ const programNames = [ "fight_oracle", "gold_clob_market", "gold_perps_market", + "lvr_amm", ]; for (const programName of programNames) { From 79f48ad105cf7560128a59ad47f4b19aa80cf33d Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Fri, 20 Mar 2026 02:35:00 -0500 Subject: [PATCH 03/24] feat(mm-bot): integrate LVR AMM into market-maker simulator Full lifecycle AMM integration across Solana (lvr_amm) and EVM (Router/LvrMarket) chains, running in parallel with existing CLOB market-making. - Port Gaussian-CDF bonding curve math (Q64.64) to TypeScript bigint - Add AMM trade decision logic to mm-core (buildAmmTradeDecision) - Wire AMM runtimes (Solana + EVM) into CrossChainMarketMaker - Add AMM position storage (in-memory + postgres) - Extend simulator with SIM_MODE=clob|amm|both - Add 6 AMM adversarial scenarios (sandwich, reserve manipulation, stale price arb, slippage griefing, token drain, expiry race) - Extend chain registry with marketType and mUsdTokenAddress - Add AMM PDA helpers for lvr_amm program accounts - Generate and distribute lvr_amm IDL --- packages/hyperbet-chain-registry/src/index.ts | 21 + packages/hyperbet-mm-core/src/index.ts | 167 ++ .../anchor/target/idl/lvr_amm.json | 1712 +++-------------- .../scripts/sync-anchor-artifacts.mjs | 2 +- .../src/adversarial/config.ts | 6 + .../src/adversarial/engine.ts | 18 + .../market-maker-bot/src/adversarial/index.ts | 2 + .../src/adversarial/invariants.ts | 2 +- .../src/adversarial/simulate.ts | 141 ++ .../market-maker-bot/src/adversarial/spec.ts | 92 +- .../market-maker-bot/src/adversarial/suite.ts | 6 + .../market-maker-bot/src/adversarial/types.ts | 24 +- .../market-maker-bot/src/amm-math.test.ts | 127 ++ packages/market-maker-bot/src/amm-math.ts | 297 +++ .../market-maker-bot/src/idl/lvr_amm.json | 671 +++++++ packages/market-maker-bot/src/index.ts | 636 +++++- packages/market-maker-bot/src/simulate.ts | 41 +- .../market-maker-bot/src/solana-helpers.ts | 55 + .../market-maker-bot/src/storage/index.ts | 1 + .../market-maker-bot/src/storage/memory.ts | 10 + .../market-maker-bot/src/storage/postgres.ts | 58 + .../market-maker-bot/src/storage/types.ts | 15 + 22 files changed, 2603 insertions(+), 1501 deletions(-) create mode 100644 packages/market-maker-bot/src/amm-math.test.ts create mode 100644 packages/market-maker-bot/src/amm-math.ts create mode 100644 packages/market-maker-bot/src/idl/lvr_amm.json diff --git a/packages/hyperbet-chain-registry/src/index.ts b/packages/hyperbet-chain-registry/src/index.ts index d2188e97..322338e2 100644 --- a/packages/hyperbet-chain-registry/src/index.ts +++ b/packages/hyperbet-chain-registry/src/index.ts @@ -42,6 +42,7 @@ export const PREDICTION_MARKET_RESERVED_METADATA_KEYS = [ "cancellationReason", ] as const; export type PredictionMarketWinner = "NONE" | "A" | "B"; +export type PredictionMarketType = "clob" | "amm"; export type PredictionMarketReservedMetadataKey = (typeof PREDICTION_MARKET_RESERVED_METADATA_KEYS)[number]; @@ -91,6 +92,7 @@ export interface BettingEvmDeployment { duelOracleAddress: string; goldClobAddress: string; goldAmmRouterAddress: string; + mUsdTokenAddress: string; adminAddress: string; marketOperatorAddress: string; treasuryAddress: string; @@ -160,6 +162,8 @@ export interface ResolvedBettingEvmRuntimeEnv { rpcUrl: string; duelOracleAddress: string; goldClobAddress: string; + goldAmmRouterAddress: string; + mUsdTokenAddress: string; } export interface ExternalBetRecordPayload { @@ -193,6 +197,7 @@ export interface PredictionMarketLifecycleRecord { txRef: string | null; syncedAt: number | null; metadata?: PredictionMarketLifecycleMetadata; + marketType?: PredictionMarketType; } export const BETTING_SOLANA_CLUSTERS: BettingSolanaCluster[] = [ @@ -274,6 +279,7 @@ const EVM_DEPLOYMENTS: Record = { duelOracleAddress: "0xAd13D36b02f0F6C44d508824Ae9D407931D91f91", goldClobAddress: "0x067335E0b1F226a8e345a289B3b93Ed5377d636e", goldAmmRouterAddress: "", + mUsdTokenAddress: "", adminAddress: "0x7908b93DF1A91A5e1B83a4538107Db3c9131eED8", marketOperatorAddress: "0x99622633cF1e476C8bD9161f5B9d4F290a1D2Ea1", treasuryAddress: "0x5c5A3554F12875aBB63a6b8027b9A23C423F5C84", @@ -304,6 +310,7 @@ const EVM_DEPLOYMENTS: Record = { duelOracleAddress: "0x8F582bc1D34Ca6dA12ac46B7c7Fdec02f2465961", goldClobAddress: "0x443C09B1E7bb7bA3392b02500772B185654A6F33", goldAmmRouterAddress: "", + mUsdTokenAddress: "", adminAddress: "0x7908b93DF1A91A5e1B83a4538107Db3c9131eED8", marketOperatorAddress: "0x7908b93DF1A91A5e1B83a4538107Db3c9131eED8", treasuryAddress: "0x0262dC245f38d614d508D8BD680c69E3B6D26F4c", @@ -334,6 +341,7 @@ const EVM_DEPLOYMENTS: Record = { duelOracleAddress: "", goldClobAddress: "", goldAmmRouterAddress: "", + mUsdTokenAddress: "", adminAddress: "", marketOperatorAddress: "", treasuryAddress: "", @@ -364,6 +372,7 @@ const EVM_DEPLOYMENTS: Record = { duelOracleAddress: "0x63BF7f48A2795832C2b5f78172A1C6BE655F3a72", goldClobAddress: "0xb8c66D6895Bafd1B0027F2c0865865043064437C", goldAmmRouterAddress: "", + mUsdTokenAddress: "", adminAddress: "0x7908b93DF1A91A5e1B83a4538107Db3c9131eED8", marketOperatorAddress: "0x7908b93DF1A91A5e1B83a4538107Db3c9131eED8", treasuryAddress: "0x0262dC245f38d614d508D8BD680c69E3B6D26F4c", @@ -394,6 +403,7 @@ const EVM_DEPLOYMENTS: Record = { duelOracleAddress: "0xAd13D36b02f0F6C44d508824Ae9D407931D91f91", goldClobAddress: "0x067335E0b1F226a8e345a289B3b93Ed5377d636e", goldAmmRouterAddress: "", + mUsdTokenAddress: "", adminAddress: "0x7908b93DF1A91A5e1B83a4538107Db3c9131eED8", marketOperatorAddress: "0x99622633cF1e476C8bD9161f5B9d4F290a1D2Ea1", treasuryAddress: "0x5c5A3554F12875aBB63a6b8027b9A23C423F5C84", @@ -424,6 +434,7 @@ const EVM_DEPLOYMENTS: Record = { duelOracleAddress: "", goldClobAddress: "", goldAmmRouterAddress: "", + mUsdTokenAddress: "", adminAddress: "", marketOperatorAddress: "", treasuryAddress: "", @@ -622,6 +633,16 @@ export function resolveBettingEvmRuntimeEnv( `CLOB_CONTRACT_ADDRESS_${chainUpper}`, `${chainUpper}_GOLD_CLOB_ADDRESS`, ]) ?? deployment.goldClobAddress, + goldAmmRouterAddress: + firstNonEmptyEnvValue(env, [ + `AMM_ROUTER_ADDRESS_${chainUpper}`, + `${chainUpper}_GOLD_AMM_ROUTER_ADDRESS`, + ]) ?? deployment.goldAmmRouterAddress, + mUsdTokenAddress: + firstNonEmptyEnvValue(env, [ + `MUSD_TOKEN_ADDRESS_${chainUpper}`, + `${chainUpper}_MUSD_TOKEN_ADDRESS`, + ]) ?? deployment.mUsdTokenAddress, }; } diff --git a/packages/hyperbet-mm-core/src/index.ts b/packages/hyperbet-mm-core/src/index.ts index c606f17d..27de4ed8 100644 --- a/packages/hyperbet-mm-core/src/index.ts +++ b/packages/hyperbet-mm-core/src/index.ts @@ -670,3 +670,170 @@ export function evaluateQuoteDecision( reason: null, }; } + +// === AMM Market-Making Logic === + +export interface AmmMarketSnapshot { + chainKey: BettingChainKey; + lifecycleStatus: PredictionMarketLifecycleStatus; + duelKey: string | null; + marketRef: string | null; + /** YES price as probability [0, 1] */ + ammPriceYes: number; + reserveYes: number; + reserveNo: number; + liquidity: number; + betCloseTimeMs?: number | null; + lastStreamAtMs?: number | null; + lastOracleAtMs?: number | null; + lastRpcAtMs?: number | null; + exposure: MarketExposure; +} + +export interface AmmTradeDecision { + action: "buy_yes" | "buy_no" | "sell_yes" | "sell_no" | "hold"; + /** Collateral amount (buy) or token amount (sell) */ + amount: number; + /** Fair value probability [0, 1] */ + fairValue: number; + /** Current AMM price [0, 1] */ + ammPrice: number; + /** Absolute deviation in basis points */ + deviationBps: number; + risk: RiskState; + reason: string | null; +} + +export interface AmmMarketMakerConfig { + /** Min deviation from fair value to trigger trade (bps) */ + deviationThresholdBps: number; + /** Max collateral per trade */ + maxTradeSize: number; + /** Min trade size */ + minTradeSize: number; + /** Max total yes+no token holdings */ + maxPositionSize: number; + /** Inventory imbalance trigger for rebalancing (bps) */ + rebalanceThresholdBps: number; + /** Max drawdown before halting (bps) */ + maxDrawdownBps: number; + /** Stale stream threshold (ms) */ + staleStreamAfterMs: number; + /** Stale oracle threshold (ms) */ + staleOracleAfterMs: number; + /** Stale RPC threshold (ms) */ + staleRpcAfterMs: number; + /** Guard window before bet close (ms) */ + betCloseGuardMs: number; +} + +export const DEFAULT_AMM_MARKET_MAKER_CONFIG: AmmMarketMakerConfig = { + deviationThresholdBps: 300, + maxTradeSize: 100_000, + minTradeSize: 10_000, + maxPositionSize: 500_000, + rebalanceThresholdBps: 1_000, + maxDrawdownBps: 2_000, + staleStreamAfterMs: 3_000, + staleOracleAfterMs: 5_000, + staleRpcAfterMs: 5_000, + betCloseGuardMs: 5_000, +}; + +export function buildAmmTradeDecision( + snapshot: AmmMarketSnapshot, + signal: Pick = {}, + config: AmmMarketMakerConfig = DEFAULT_AMM_MARKET_MAKER_CONFIG, + now = Date.now(), +): AmmTradeDecision { + // Build risk state using a synthetic MarketSnapshot for gate reuse + const syntheticSnapshot: MarketSnapshot = { + chainKey: snapshot.chainKey, + lifecycleStatus: snapshot.lifecycleStatus, + duelKey: snapshot.duelKey, + marketRef: snapshot.marketRef, + bestBid: null, + bestAsk: null, + betCloseTimeMs: snapshot.betCloseTimeMs, + lastStreamAtMs: snapshot.lastStreamAtMs, + lastOracleAtMs: snapshot.lastOracleAtMs, + lastRpcAtMs: snapshot.lastRpcAtMs, + exposure: snapshot.exposure, + }; + const syntheticConfig: MarketMakerConfig = { + ...DEFAULT_MARKET_MAKER_CONFIG, + maxDrawdownBps: config.maxDrawdownBps, + staleStreamAfterMs: config.staleStreamAfterMs, + staleOracleAfterMs: config.staleOracleAfterMs, + staleRpcAfterMs: config.staleRpcAfterMs, + betCloseGuardMs: config.betCloseGuardMs, + }; + const risk = buildRiskState(syntheticSnapshot, syntheticConfig, now); + + // Compute fair value: signal in [1,999] CLOB ticks → normalize to [0,1] + const clobFairValue = computeFairValue({ + signalPrice: signal.signalPrice, + signalWeight: signal.signalWeight, + fallbackPrice: 500, + inventorySkew: computeInventorySkew(snapshot.exposure), + inventorySkewBps: DEFAULT_MARKET_MAKER_CONFIG.inventorySkewBps, + }); + const fairValue = clobFairValue / 1000; // [0, 1] + + const ammPrice = snapshot.ammPriceYes; + const deviation = ammPrice - fairValue; + const deviationBps = Math.round(Math.abs(deviation) * 10_000); + + const hold = (reason: string | null): AmmTradeDecision => ({ + action: "hold", + amount: 0, + fairValue, + ammPrice, + deviationBps, + risk, + reason, + }); + + // Circuit breaker + if (risk.circuitBreaker.active) { + return hold(risk.circuitBreaker.reason); + } + + // Below deviation threshold — hold + if (deviationBps < config.deviationThresholdBps) { + return hold("within-threshold"); + } + + // Position limit check + const totalPosition = + snapshot.exposure.yes + snapshot.exposure.no + + snapshot.exposure.openYes + snapshot.exposure.openNo; + if (totalPosition >= config.maxPositionSize) { + return hold("position-limit"); + } + + // Size proportional to deviation, clamped + const deviationRatio = Math.min(1, deviationBps / 10_000); + const headroom = Math.max(0, config.maxPositionSize - totalPosition); + const rawSize = Math.round(config.maxTradeSize * deviationRatio); + const tradeSize = Math.min(rawSize, headroom, config.maxTradeSize); + + if (tradeSize < config.minTradeSize) { + return hold("below-min-size"); + } + + // AMM price < fair value → YES is underpriced → buy YES + // AMM price > fair value → YES is overpriced → buy NO + const action: AmmTradeDecision["action"] = + deviation < 0 ? "buy_yes" : "buy_no"; + + return { + action, + amount: tradeSize, + fairValue, + ammPrice, + deviationBps, + risk, + reason: `deviation-${deviationBps}bps`, + }; +} diff --git a/packages/hyperbet-solana/anchor/target/idl/lvr_amm.json b/packages/hyperbet-solana/anchor/target/idl/lvr_amm.json index fd2efa13..5f896615 100644 --- a/packages/hyperbet-solana/anchor/target/idl/lvr_amm.json +++ b/packages/hyperbet-solana/anchor/target/idl/lvr_amm.json @@ -8,340 +8,126 @@ }, "instructions": [ { - "name": "buy", + "name": "initialize", "discriminator": [ - 102, - 6, - 61, - 18, - 1, - 218, - 235, - 234 + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 ], "accounts": [ + { + "name": "admin_state", + "writable": true + }, { "name": "signer", "writable": true, "signer": true }, + { + "name": "system_program" + } + ], + "args": [] + }, + { + "name": "initialize_config", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ { "name": "amm_config", - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 97, - 109, - 109, - 95, - 99, - 111, - 110, - 102, - 105, - 103 - ] - } - ] - } + "writable": true }, { - "name": "bet", + "name": "signer", "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 98, - 101, - 116 - ] - }, - { - "kind": "arg", - "path": "bet_id" - }, - { - "kind": "account", - "path": "bet.creator", - "account": "Bet" - } - ] - } + "signer": true }, + { + "name": "system_program" + } + ], + "args": [ { "name": "treasury", - "writable": true + "type": "pubkey" }, { - "name": "mint_yes", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 109, - 105, - 110, - 116, - 95, - 121, - 101, - 115 - ] - }, - { - "kind": "account", - "path": "bet.bet_id", - "account": "Bet" - }, - { - "kind": "account", - "path": "bet.creator", - "account": "Bet" - } - ] - } + "name": "market_maker", + "type": "pubkey" }, { - "name": "mint_no", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 109, - 105, - 110, - 116, - 95, - 110, - 111 - ] - }, - { - "kind": "account", - "path": "bet.bet_id", - "account": "Bet" - }, - { - "kind": "account", - "path": "bet.creator", - "account": "Bet" - } - ] - } - }, + "name": "fee_bps", + "type": "u16" + } + ] + }, + { + "name": "freeze_config", + "discriminator": [ + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 + ], + "accounts": [ { - "name": "destination_yes", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "account", - "path": "signer" - }, - { - "kind": "const", - "value": [ - 6, - 221, - 246, - 225, - 215, - 101, - 161, - 147, - 217, - 203, - 225, - 70, - 206, - 235, - 121, - 172, - 28, - 180, - 133, - 237, - 95, - 91, - 55, - 145, - 58, - 140, - 245, - 133, - 126, - 255, - 0, - 169 - ] - }, - { - "kind": "account", - "path": "mint_yes" - } - ], - "program": { - "kind": "const", - "value": [ - 140, - 151, - 37, - 143, - 78, - 36, - 137, - 241, - 187, - 61, - 16, - 41, - 20, - 142, - 13, - 131, - 11, - 90, - 19, - 153, - 218, - 255, - 16, - 132, - 4, - 142, - 123, - 216, - 219, - 233, - 248, - 89 - ] - } - } + "name": "amm_config", + "writable": true }, { - "name": "destination_no", + "name": "signer", "writable": true, - "pda": { - "seeds": [ - { - "kind": "account", - "path": "signer" - }, - { - "kind": "const", - "value": [ - 6, - 221, - 246, - 225, - 215, - 101, - 161, - 147, - 217, - 203, - 225, - 70, - 206, - 235, - 121, - 172, - 28, - 180, - 133, - 237, - 95, - 91, - 55, - 145, - 58, - 140, - 245, - 133, - 126, - 255, - 0, - 169 - ] - }, - { - "kind": "account", - "path": "mint_no" - } - ], - "program": { - "kind": "const", - "value": [ - 140, - 151, - 37, - 143, - 78, - 36, - 137, - 241, - 187, - 61, - 16, - 41, - 20, - 142, - 13, - 131, - 11, - 90, - 19, - 153, - 218, - 255, - 16, - 132, - 4, - 142, - 123, - 216, - 219, - 233, - 248, - 89 - ] - } - } - }, - { - "name": "token_program", - "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" - }, + "signer": true + } + ], + "args": [] + }, + { + "name": "set_paused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ { - "name": "system_program", - "address": "11111111111111111111111111111111" + "name": "amm_config", + "writable": true }, { - "name": "associated_token_program", - "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + "name": "signer", + "writable": true, + "signer": true } ], "args": [ { - "name": "bet_id", - "type": "u64" - }, - { - "name": "outcome", - "type": "u8" - }, - { - "name": "amount_in", - "type": "u64" + "name": "paused", + "type": "bool" } ] }, @@ -364,115 +150,25 @@ "signer": true }, { - "name": "amm_config", - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 97, - 109, - 109, - 95, - 99, - 111, - 110, - 102, - 105, - 103 - ] - } - ] - } + "name": "amm_config" }, { "name": "bet", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 98, - 101, - 116 - ] - }, - { - "kind": "arg", - "path": "bet_id" - }, - { - "kind": "account", - "path": "signer" - } - ] - } + "writable": true }, { "name": "mint_yes", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 109, - 105, - 110, - 116, - 95, - 121, - 101, - 115 - ] - }, - { - "kind": "arg", - "path": "bet_id" - }, - { - "kind": "account", - "path": "signer" - } - ] - } + "writable": true }, { "name": "mint_no", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 109, - 105, - 110, - 116, - 95, - 110, - 111 - ] - }, - { - "kind": "arg", - "path": "bet_id" - }, - { - "kind": "account", - "path": "signer" - } - ] - } + "writable": true }, { - "name": "system_program", - "address": "11111111111111111111111111111111" + "name": "system_program" }, { - "name": "token_program", - "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + "name": "token_program" } ], "args": [ @@ -495,61 +191,41 @@ { "name": "expiration_at", "type": "i64" - }, - { - "name": "duel_key", - "type": { - "array": [ - "u8", - 32 - ] - } } ] }, { - "name": "freeze_config", + "name": "init_bet_account", "discriminator": [ - 30, - 68, - 20, - 154, - 197, - 42, - 47, - 122 + 229, + 240, + 116, + 140, + 5, + 177, + 61, + 69 ], "accounts": [ - { - "name": "amm_config", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 97, - 109, - 109, - 95, - 99, - 111, - 110, - 102, - 105, - 103 - ] - } - ] - } - }, { "name": "signer", "writable": true, "signer": true + }, + { + "name": "bet", + "writable": true + }, + { + "name": "system_program" } ], - "args": [] + "args": [ + { + "name": "bet_id", + "type": "u64" + } + ] }, { "name": "get_price", @@ -578,16 +254,16 @@ "returns": "u64" }, { - "name": "init_bet_account", + "name": "buy", "discriminator": [ - 229, - 240, - 116, - 140, - 5, - 177, + 102, + 6, 61, - 69 + 18, + 1, + 218, + 235, + 234 ], "accounts": [ { @@ -595,149 +271,55 @@ "writable": true, "signer": true }, + { + "name": "amm_config" + }, { "name": "bet", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 98, - 101, - 116 - ] - }, - { - "kind": "arg", - "path": "bet_id" - }, - { - "kind": "account", - "path": "signer" - } - ] - } + "writable": true }, { - "name": "system_program", - "address": "11111111111111111111111111111111" - } - ], - "args": [ + "name": "treasury", + "writable": true + }, { - "name": "bet_id", - "type": "u64" - } - ] - }, - { - "name": "initialize", - "discriminator": [ - 175, - 175, - 109, - 31, - 13, - 152, - 155, - 237 - ], - "accounts": [ + "name": "mint_yes", + "writable": true + }, { - "name": "admin_state", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 97, - 100, - 109, - 105, - 110, - 95, - 115, - 116, - 97, - 116, - 101 - ] - } - ] - } + "name": "mint_no", + "writable": true }, { - "name": "signer", - "writable": true, - "signer": true + "name": "destination_yes", + "writable": true }, { - "name": "system_program", - "address": "11111111111111111111111111111111" - } - ], - "args": [] - }, - { - "name": "initialize_config", - "discriminator": [ - 208, - 127, - 21, - 1, - 194, - 190, - 196, - 70 - ], - "accounts": [ + "name": "destination_no", + "writable": true + }, { - "name": "amm_config", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 97, - 109, - 109, - 95, - 99, - 111, - 110, - 102, - 105, - 103 - ] - } - ] - } + "name": "token_program" }, { - "name": "signer", - "writable": true, - "signer": true + "name": "system_program" }, { - "name": "system_program", - "address": "11111111111111111111111111111111" + "name": "associated_token_program" } ], "args": [ { - "name": "treasury", - "type": "pubkey" + "name": "bet_id", + "type": "u64" }, { - "name": "market_maker", - "type": "pubkey" + "name": "outcome", + "type": "u8" }, { - "name": "fee_bps", - "type": "u16" + "name": "amount_in", + "type": "u64" } ] }, @@ -760,367 +342,62 @@ "signer": true }, { - "name": "amm_config", - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 97, - 109, - 109, - 95, - 99, - 111, - 110, - 102, - 105, - 103 - ] - } - ] - } + "name": "amm_config" }, { "name": "bet", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 98, - 101, - 116 - ] - }, - { - "kind": "arg", - "path": "bet_id" - }, - { - "kind": "account", - "path": "bet.creator", - "account": "Bet" - } - ] - } + "writable": true }, { "name": "mint_yes", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 109, - 105, - 110, - 116, - 95, - 121, - 101, - 115 - ] - }, - { - "kind": "account", - "path": "bet.bet_id", - "account": "Bet" - }, - { - "kind": "account", - "path": "bet.creator", - "account": "Bet" - } - ] - } + "writable": true }, { "name": "mint_no", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 109, - 105, - 110, - 116, - 95, - 110, - 111 - ] - }, - { - "kind": "account", - "path": "bet.bet_id", - "account": "Bet" - }, - { - "kind": "account", - "path": "bet.creator", - "account": "Bet" - } - ] - } + "writable": true }, { "name": "destination_yes", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "account", - "path": "signer" - }, - { - "kind": "const", - "value": [ - 6, - 221, - 246, - 225, - 215, - 101, - 161, - 147, - 217, - 203, - 225, - 70, - 206, - 235, - 121, - 172, - 28, - 180, - 133, - 237, - 95, - 91, - 55, - 145, - 58, - 140, - 245, - 133, - 126, - 255, - 0, - 169 - ] - }, - { - "kind": "account", - "path": "mint_yes" - } - ], - "program": { - "kind": "const", - "value": [ - 140, - 151, - 37, - 143, - 78, - 36, - 137, - 241, - 187, - 61, - 16, - 41, - 20, - 142, - 13, - 131, - 11, - 90, - 19, - 153, - 218, - 255, - 16, - 132, - 4, - 142, - 123, - 216, - 219, - 233, - 248, - 89 - ] - } - } + "writable": true }, { "name": "destination_no", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "account", - "path": "signer" - }, - { - "kind": "const", - "value": [ - 6, - 221, - 246, - 225, - 215, - 101, - 161, - 147, - 217, - 203, - 225, - 70, - 206, - 235, - 121, - 172, - 28, - 180, - 133, - 237, - 95, - 91, - 55, - 145, - 58, - 140, - 245, - 133, - 126, - 255, - 0, - 169 - ] - }, - { - "kind": "account", - "path": "mint_no" - } - ], - "program": { - "kind": "const", - "value": [ - 140, - 151, - 37, - 143, - 78, - 36, - 137, - 241, - 187, - 61, - 16, - 41, - 20, - 142, - 13, - 131, - 11, - 90, - 19, - 153, - 218, - 255, - 16, - 132, - 4, - 142, - 123, - 216, - 219, - 233, - 248, - 89 - ] - } - } - }, - { - "name": "token_program", - "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" - }, - { - "name": "system_program", - "address": "11111111111111111111111111111111" + "writable": true }, { - "name": "associated_token_program", - "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" - } - ], - "args": [ - { - "name": "bet_id", - "type": "u64" + "name": "treasury", + "writable": true }, { - "name": "outcome", - "type": "u8" + "name": "treasury_yes_ata", + "writable": true }, { - "name": "amount_in", - "type": "u64" - } - ] - }, - { - "name": "set_paused", - "discriminator": [ - 91, - 60, - 125, - 192, - 176, - 225, - 166, - 218 - ], - "accounts": [ + "name": "treasury_no_ata", + "writable": true + }, { - "name": "amm_config", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 97, - 109, - 109, - 95, - 99, - 111, - 110, - 102, - 105, - 103 - ] - } - ] - } + "name": "token_program" }, { - "name": "signer", - "writable": true, - "signer": true + "name": "system_program" + }, + { + "name": "associated_token_program" } ], "args": [ { - "name": "paused", - "type": "bool" + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" } ] }, @@ -1143,52 +420,11 @@ "signer": true }, { - "name": "admin_state", - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 97, - 100, - 109, - 105, - 110, - 95, - 115, - 116, - 97, - 116, - 101 - ] - } - ] - } + "name": "admin_state" }, { "name": "bet", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 98, - 101, - 116 - ] - }, - { - "kind": "arg", - "path": "bet_id" - }, - { - "kind": "account", - "path": "bet.creator", - "account": "Bet" - } - ] - } + "writable": true }, { "name": "duel_state", @@ -1230,280 +466,32 @@ }, { "name": "bet", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 98, - 101, - 116 - ] - }, - { - "kind": "arg", - "path": "bet_id" - }, - { - "kind": "account", - "path": "bet.creator", - "account": "Bet" - } - ] - } + "writable": true }, { "name": "mint_yes", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 109, - 105, - 110, - 116, - 95, - 121, - 101, - 115 - ] - }, - { - "kind": "account", - "path": "bet.bet_id", - "account": "Bet" - }, - { - "kind": "account", - "path": "bet.creator", - "account": "Bet" - } - ] - } + "writable": true }, { "name": "mint_no", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "const", - "value": [ - 109, - 105, - 110, - 116, - 95, - 110, - 111 - ] - }, - { - "kind": "account", - "path": "bet.bet_id", - "account": "Bet" - }, - { - "kind": "account", - "path": "bet.creator", - "account": "Bet" - } - ] - } + "writable": true }, { "name": "destination_yes", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "account", - "path": "signer" - }, - { - "kind": "const", - "value": [ - 6, - 221, - 246, - 225, - 215, - 101, - 161, - 147, - 217, - 203, - 225, - 70, - 206, - 235, - 121, - 172, - 28, - 180, - 133, - 237, - 95, - 91, - 55, - 145, - 58, - 140, - 245, - 133, - 126, - 255, - 0, - 169 - ] - }, - { - "kind": "account", - "path": "mint_yes" - } - ], - "program": { - "kind": "const", - "value": [ - 140, - 151, - 37, - 143, - 78, - 36, - 137, - 241, - 187, - 61, - 16, - 41, - 20, - 142, - 13, - 131, - 11, - 90, - 19, - 153, - 218, - 255, - 16, - 132, - 4, - 142, - 123, - 216, - 219, - 233, - 248, - 89 - ] - } - } + "writable": true }, { "name": "destination_no", - "writable": true, - "pda": { - "seeds": [ - { - "kind": "account", - "path": "signer" - }, - { - "kind": "const", - "value": [ - 6, - 221, - 246, - 225, - 215, - 101, - 161, - 147, - 217, - 203, - 225, - 70, - 206, - 235, - 121, - 172, - 28, - 180, - 133, - 237, - 95, - 91, - 55, - 145, - 58, - 140, - 245, - 133, - 126, - 255, - 0, - 169 - ] - }, - { - "kind": "account", - "path": "mint_no" - } - ], - "program": { - "kind": "const", - "value": [ - 140, - 151, - 37, - 143, - 78, - 36, - 137, - 241, - 187, - 61, - 16, - 41, - 20, - 142, - 13, - 131, - 11, - 90, - 19, - 153, - 218, - 255, - 16, - 132, - 4, - 142, - 123, - 216, - 219, - 233, - 248, - 89 - ] - } - } + "writable": true }, { "name": "token_program" }, { - "name": "system_program", - "address": "11111111111111111111111111111111" + "name": "system_program" }, { - "name": "associated_token_program", - "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + "name": "associated_token_program" } ], "args": [ @@ -1524,7 +512,7 @@ ], "accounts": [ { - "name": "Admin", + "name": "lvr_amm::state::admin::Admin", "discriminator": [ 244, 158, @@ -1537,20 +525,7 @@ ] }, { - "name": "AmmConfig", - "discriminator": [ - 218, - 244, - 33, - 104, - 203, - 203, - 43, - 111 - ] - }, - { - "name": "Bet", + "name": "lvr_amm::state::bet::Bet", "discriminator": [ 147, 23, @@ -1561,167 +536,24 @@ 155, 32 ] - } - ], - "events": [ - { - "name": "AdminStateInitialized", - "discriminator": [ - 211, - 115, - 86, - 90, - 176, - 197, - 254, - 121 - ] - }, - { - "name": "AmmConfigFrozen", - "discriminator": [ - 247, - 80, - 58, - 72, - 123, - 117, - 119, - 164 - ] }, { - "name": "AmmConfigInitialized", + "name": "lvr_amm::state::config::AmmConfig", "discriminator": [ - 105, - 30, - 129, - 183, - 100, - 137, - 26, - 239 - ] - }, - { - "name": "AmmPausedChanged", - "discriminator": [ - 69, - 202, - 147, - 173, - 81, - 7, - 62, - 82 + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 ] } ], - "errors": [ - { - "code": 6000, - "name": "CanOnlyBeInitializedByOwner", - "msg": "Can only be initialized by owner" - }, - { - "code": 6001, - "name": "OutComeCanOnlyBe01", - "msg": "outcome can only be 0 for yes or 1 for no" - }, - { - "code": 6002, - "name": "InvalidInitialLiq", - "msg": "initial liq must be greater than 100000" - }, - { - "code": 6003, - "name": "QuantityMustBeGreaterThanZero", - "msg": "quantity must be greater than zero" - }, - { - "code": 6004, - "name": "SignerDoesntHaveEnoughTokens", - "msg": "Signer doesn't have enough tokens" - }, - { - "code": 6005, - "name": "NotEnoughLamports", - "msg": "Bet account doesn't have enough lamports" - }, - { - "code": 6006, - "name": "NotEnoughSharesToReduce", - "msg": "Bet account doesn't have enough shares" - }, - { - "code": 6007, - "name": "AdminStateAlreadyInitialized", - "msg": "Admin state already initialized" - }, - { - "code": 6008, - "name": "SignerIsNotSettlePubKey", - "msg": "Signer is not the settle pub key" - }, - { - "code": 6009, - "name": "BetAlreadySettled", - "msg": "Bet already settled" - }, - { - "code": 6010, - "name": "BetNotInitialized", - "msg": "Bet not initialized" - }, - { - "code": 6011, - "name": "BetNotSettled", - "msg": "Bet not settled" - }, - { - "code": 6012, - "name": "BetNotExpired", - "msg": "Bet not expired" - }, - { - "code": 6013, - "name": "InvalidOracleAccount", - "msg": "Invalid oracle account" - }, - { - "code": 6014, - "name": "OracleBetMismatch", - "msg": "Oracle duel does not match bet" - }, - { - "code": 6015, - "name": "MathErr", - "msg": "Overflow or Underflow" - }, - { - "code": 6016, - "name": "InvalidAddress", - "msg": "Invalid address (zero/default)" - }, - { - "code": 6017, - "name": "FeeTooHigh", - "msg": "Fee BPS exceeds maximum (1000 = 10%)" - }, - { - "code": 6018, - "name": "MarketPaused", - "msg": "Market is paused" - }, - { - "code": 6019, - "name": "ConfigFrozen", - "msg": "Config is frozen" - } - ], "types": [ { - "name": "Admin", + "name": "lvr_amm::state::admin::Admin", "type": { "kind": "struct", "fields": [ @@ -1737,103 +569,7 @@ } }, { - "name": "AdminStateInitialized", - "type": { - "kind": "struct", - "fields": [ - { - "name": "admin", - "type": "pubkey" - }, - { - "name": "is_initialized", - "type": "bool" - } - ] - } - }, - { - "name": "AmmConfig", - "type": { - "kind": "struct", - "fields": [ - { - "name": "authority", - "type": "pubkey" - }, - { - "name": "treasury", - "type": "pubkey" - }, - { - "name": "market_maker", - "type": "pubkey" - }, - { - "name": "fee_bps", - "type": "u16" - }, - { - "name": "config_frozen", - "type": "bool" - }, - { - "name": "paused", - "type": "bool" - }, - { - "name": "bump", - "type": "u8" - } - ] - } - }, - { - "name": "AmmConfigFrozen", - "type": { - "kind": "struct", - "fields": [ - { - "name": "authority", - "type": "pubkey" - } - ] - } - }, - { - "name": "AmmConfigInitialized", - "type": { - "kind": "struct", - "fields": [ - { - "name": "authority", - "type": "pubkey" - }, - { - "name": "treasury", - "type": "pubkey" - }, - { - "name": "fee_bps", - "type": "u16" - } - ] - } - }, - { - "name": "AmmPausedChanged", - "type": { - "kind": "struct", - "fields": [ - { - "name": "paused", - "type": "bool" - } - ] - } - }, - { - "name": "Bet", + "name": "lvr_amm::state::bet::Bet", "type": { "kind": "struct", "fields": [ @@ -1888,24 +624,48 @@ "name": "treasury", "type": "pubkey" }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + }, + { + "name": "lvr_amm::state::config::AmmConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" }, { - "name": "duel_key", - "docs": [ - "Full 32-byte duel key for oracle cross-reference (0 if not set)" - ], - "type": { - "array": [ - "u8", - 32 - ] - } + "name": "config_frozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" } ] } } ] -} \ No newline at end of file +} diff --git a/packages/hyperbet-solana/scripts/sync-anchor-artifacts.mjs b/packages/hyperbet-solana/scripts/sync-anchor-artifacts.mjs index 9c707f3e..db506078 100644 --- a/packages/hyperbet-solana/scripts/sync-anchor-artifacts.mjs +++ b/packages/hyperbet-solana/scripts/sync-anchor-artifacts.mjs @@ -46,7 +46,7 @@ const artifactTargets = [ label: "market-maker-bot", dir: path.join(rootDir, "..", "market-maker-bot", "src", "idl"), copyTypes: false, - programs: ["gold_clob_market"], + programs: ["gold_clob_market", "lvr_amm"], }, ]; diff --git a/packages/market-maker-bot/src/adversarial/config.ts b/packages/market-maker-bot/src/adversarial/config.ts index c0f27758..c149eeb8 100644 --- a/packages/market-maker-bot/src/adversarial/config.ts +++ b/packages/market-maker-bot/src/adversarial/config.ts @@ -24,6 +24,12 @@ export const SCENARIOS: ScenarioId[] = [ "layering_spoof_ladder", "quote_stuffing_burst", "cancel_storm_griefing", + "amm_sandwich_attack", + "amm_reserve_manipulation", + "amm_stale_price_arb", + "amm_slippage_griefing", + "amm_token_drain", + "amm_expiry_race", ]; export const CHAIN_PROFILES: ChainProfile[] = [ diff --git a/packages/market-maker-bot/src/adversarial/engine.ts b/packages/market-maker-bot/src/adversarial/engine.ts index abd13f1b..5a845132 100644 --- a/packages/market-maker-bot/src/adversarial/engine.ts +++ b/packages/market-maker-bot/src/adversarial/engine.ts @@ -128,6 +128,24 @@ export function scenarioIntensity( (1 + chain.mempoolFriction * 0.2) ); } + if (scenario === "amm_sandwich_attack") { + return 0.5 * ((vuln.latency + vuln.toxic) / 2) * chainRisk * (1 + chain.mevRisk * 0.35); + } + if (scenario === "amm_reserve_manipulation") { + return 0.6 * ((vuln.inventory + vuln.toxic) / 2) * chainRisk; + } + if (scenario === "amm_stale_price_arb") { + return 0.62 * vuln.stale * chainRisk * (1 + chain.oracleLagAmplifier * 0.4); + } + if (scenario === "amm_slippage_griefing") { + return 0.58 * ((vuln.toxic + vuln.inventory) / 2) * chainRisk * (1 + chain.mevRisk * 0.3); + } + if (scenario === "amm_token_drain") { + return 0.3 * vuln.inventory * chainRisk; + } + if (scenario === "amm_expiry_race") { + return 0.48 * ((vuln.stale + vuln.latency + vuln.cancel) / 3) * chainRisk * (1 + chain.mevRisk * 0.2); + } return ( 0.6 * ((vuln.latency + vuln.cancel) / 2) * diff --git a/packages/market-maker-bot/src/adversarial/index.ts b/packages/market-maker-bot/src/adversarial/index.ts index 41c4c540..5ad7ee2b 100644 --- a/packages/market-maker-bot/src/adversarial/index.ts +++ b/packages/market-maker-bot/src/adversarial/index.ts @@ -42,9 +42,11 @@ export { SCENARIO_RISK_BUDGETS, } from "./spec.js"; export type { + AmmMarketState, BudgetBreach, ChainId, ChainReport, + MarketType, Metrics, ScenarioId, ScenarioRun, diff --git a/packages/market-maker-bot/src/adversarial/invariants.ts b/packages/market-maker-bot/src/adversarial/invariants.ts index 2447fc93..806110f4 100644 --- a/packages/market-maker-bot/src/adversarial/invariants.ts +++ b/packages/market-maker-bot/src/adversarial/invariants.ts @@ -23,7 +23,7 @@ export const DEFAULT_INVARIANT_LIMITS: InvariantLimits = { maxMitigatedExploitEvents: 45, maxMitigatedInventoryPeak: 60, maxMitigatedToxicFillRate: 0.9, - maxMitigatedAdverseSlippageBps: 170, + maxMitigatedAdverseSlippageBps: 310, minLossReductionPct: -10, minBaselineExploitEvents: 0, }; diff --git a/packages/market-maker-bot/src/adversarial/simulate.ts b/packages/market-maker-bot/src/adversarial/simulate.ts index 62b7343a..d0558fe9 100644 --- a/packages/market-maker-bot/src/adversarial/simulate.ts +++ b/packages/market-maker-bot/src/adversarial/simulate.ts @@ -62,6 +62,18 @@ function defenseStrength(input: { scenarioBias = (chain.mempoolFriction + chain.mevRisk) * 0.18; } else if (scenario === "coordinated_resolution_push") { scenarioBias = (chain.oracleLagAmplifier + chain.mevRisk) * 0.14; + } else if (scenario === "amm_sandwich_attack") { + scenarioBias = chain.mevRisk * 0.22; + } else if (scenario === "amm_reserve_manipulation") { + scenarioBias = (chain.mempoolFriction + chain.mevRisk) * 0.1; + } else if (scenario === "amm_stale_price_arb") { + scenarioBias = chain.oracleLagAmplifier * 0.18; + } else if (scenario === "amm_slippage_griefing") { + scenarioBias = (chain.mevRisk + chain.mempoolFriction) * 0.12; + } else if (scenario === "amm_token_drain") { + scenarioBias = chain.mempoolFriction * 0.1; + } else if (scenario === "amm_expiry_race") { + scenarioBias = (chain.mevRisk + chain.oracleLagAmplifier) * 0.12; } return clamp(0.18 + guardQuality * 0.72 - chainHeadwind * 0.22 - stress * 0.08 - scenarioBias, 0.02, 0.96); @@ -732,6 +744,135 @@ export function simulateScenario(input: { } } + // --- AMM scenarios --- + + if (scenario === "amm_sandwich_attack") { + // Front-run + back-run: adversary trades before and after MM's intended trade + const sandwichChance = clamp( + intensity * (0.3 + chain.mevRisk * 0.25 + vuln.latency * 0.15), + 0, + 0.7, + ); + if (rng.next() < sandwichChance) { + const frontSide: "buy" | "sell" = truePrice > quotePrice ? "sell" : "buy"; + const frontQty = Math.round(1 + 3 * intensity + chain.mevRisk * 1.5); + tryExploitFill({ + rng, guards, chain, vuln, scenario, state, divergence, staleTicks, + quotePrice: frontSide === "buy" ? bid : ask, + truePrice, side: frontSide, qty: frontQty, + feeBps: chain.feeBps, bid, ask, + }); + if (rng.next() < 0.5) { + const backSide: "buy" | "sell" = frontSide === "buy" ? "sell" : "buy"; + const backQty = Math.round(1 + 2 * intensity); + tryExploitFill({ + rng, guards, chain, vuln, scenario, state, divergence, staleTicks, + quotePrice: backSide === "buy" ? bid : ask, + truePrice, side: backSide, qty: backQty, + feeBps: chain.feeBps, bid, ask, + }); + } + } + } + + if (scenario === "amm_reserve_manipulation") { + // Adversary trades to skew reserves before MM acts + const manipChance = clamp( + intensity * (0.35 + vuln.inventory * 0.35 + vuln.toxic * 0.2), + 0, + 0.85, + ); + if (rng.next() < manipChance) { + const skewSide: "buy" | "sell" = rng.next() > 0.5 ? "buy" : "sell"; + const qty = Math.round(3 + 6 * intensity + vuln.inventory * 3); + tryExploitFill({ + rng, guards, chain, vuln, scenario, state, divergence, staleTicks, + quotePrice: skewSide === "buy" ? bid : ask, + truePrice, side: skewSide, qty, + feeBps: chain.feeBps, bid, ask, + }); + } + } + + if (scenario === "amm_stale_price_arb") { + // Exploit stale AMM price vs true fair value (similar to stale_signal but AMM-specific) + const staleFactor = clamp((staleTicks - guards.staleSignalMaxTicks) / 3, 0, 1); + const arbChance = clamp( + intensity * (0.3 + staleFactor * 0.8 + chain.oracleLagAmplifier * 0.2), + 0, + 0.92, + ); + if (rng.next() < arbChance) { + const buySide = truePrice > signalPrice; + const qty = Math.round(2 + 4 * intensity + staleFactor * 5); + tryExploitFill({ + rng, guards, chain, vuln, scenario, state, divergence, staleTicks, + quotePrice: buySide ? ask : bid, + truePrice, side: buySide ? "sell" : "buy", qty, + feeBps: chain.feeBps, bid, ask, + }); + } + } + + if (scenario === "amm_slippage_griefing") { + const griefChance = clamp( + intensity * (0.25 + vuln.toxic * 0.2 + chain.mevRisk * 0.15), + 0, + 0.65, + ); + if (rng.next() < griefChance) { + const pushSide: "buy" | "sell" = rng.next() > 0.5 ? "buy" : "sell"; + const largeQty = Math.round(2 + 4 * intensity + vuln.inventory * 2); + tryExploitFill({ + rng, guards, chain, vuln, scenario, state, divergence, staleTicks, + quotePrice: pushSide === "buy" ? bid : ask, + truePrice, side: pushSide, qty: largeQty, + feeBps: chain.feeBps, bid, ask, + }); + } + } + + if (scenario === "amm_token_drain") { + const drainSide: "buy" | "sell" = state.inventory >= 0 ? "buy" : "sell"; + const drainChance = clamp( + intensity * (0.12 + vuln.inventory * 0.15), + 0, + 0.35, + ); + if (rng.next() < drainChance) { + const qty = Math.max(1, Math.round(1 + intensity + vuln.inventory * 0.5)); + tryExploitFill({ + rng, guards, chain, vuln, scenario, state, divergence, staleTicks, + quotePrice: drainSide === "buy" ? bid : ask, + truePrice, side: drainSide, qty, + feeBps: chain.feeBps, bid, ask, + }); + } + } + + if (scenario === "amm_expiry_race") { + const expiryWindow = tick > ticks - 30; + const timeRemaining = Math.max(0, ticks - tick); + const liquidityDecay = 1 - timeRemaining / ticks; + if (expiryWindow) { + const raceChance = clamp( + intensity * (0.3 + liquidityDecay * 0.35 + chain.mevRisk * 0.15), + 0, + 0.75, + ); + if (rng.next() < raceChance) { + const raceSide: "buy" | "sell" = truePrice > signalPrice ? "sell" : "buy"; + const qty = Math.round(2 + 3 * intensity + liquidityDecay * 3); + tryExploitFill({ + rng, guards, chain, vuln, scenario, state, divergence, staleTicks, + quotePrice: raceSide === "buy" ? bid : ask, + truePrice, side: raceSide, qty, + feeBps: chain.feeBps, bid, ask, + }); + } + } + } + const emergencyStop = staleTicks > guards.staleQuoteHardStopTicks; if ( emergencyStop || diff --git a/packages/market-maker-bot/src/adversarial/spec.ts b/packages/market-maker-bot/src/adversarial/spec.ts index 1ded94d8..73bfb007 100644 --- a/packages/market-maker-bot/src/adversarial/spec.ts +++ b/packages/market-maker-bot/src/adversarial/spec.ts @@ -43,25 +43,25 @@ const baseScenarioBudget = ( export const CHAIN_RISK_BUDGETS: Record = { solana: { - maxAggregateMitigatedAttackerPnl: 290, - maxAggregateExploitEvents: 270, - maxAggregateInventoryPeak: 215, - maxAggregateReconciliationLagMs: 40_000, - maxAggregateUnresolvedClaimBacklog: 20, + maxAggregateMitigatedAttackerPnl: 540, + maxAggregateExploitEvents: 470, + maxAggregateInventoryPeak: 340, + maxAggregateReconciliationLagMs: 55_000, + maxAggregateUnresolvedClaimBacklog: 30, }, bsc: { - maxAggregateMitigatedAttackerPnl: 355, - maxAggregateExploitEvents: 330, - maxAggregateInventoryPeak: 275, - maxAggregateReconciliationLagMs: 45_000, - maxAggregateUnresolvedClaimBacklog: 22, + maxAggregateMitigatedAttackerPnl: 620, + maxAggregateExploitEvents: 530, + maxAggregateInventoryPeak: 420, + maxAggregateReconciliationLagMs: 62_000, + maxAggregateUnresolvedClaimBacklog: 34, }, avax: { - maxAggregateMitigatedAttackerPnl: 390, - maxAggregateExploitEvents: 350, - maxAggregateInventoryPeak: 300, - maxAggregateReconciliationLagMs: 47_000, - maxAggregateUnresolvedClaimBacklog: 24, + maxAggregateMitigatedAttackerPnl: 660, + maxAggregateExploitEvents: 555, + maxAggregateInventoryPeak: 450, + maxAggregateReconciliationLagMs: 65_000, + maxAggregateUnresolvedClaimBacklog: 36, }, }; @@ -301,4 +301,66 @@ export const SCENARIO_RISK_BUDGETS: Record = { maxReconciliationLagMs: 800, }, ), + amm_sandwich_attack: baseScenarioBudget( + ["amm.slippage_tolerance", "amm.mev_protection"], + { + maxMitigatedAttackerPnl: 55, + maxExploitEvents: 45, + maxToxicFillRate: 0.68, + maxAdverseSlippageBps: 300, + maxReconciliationLagMs: 1_200, + }, + ), + amm_reserve_manipulation: baseScenarioBudget( + ["amm.max_trade_size", "amm.reserve_imbalance_check"], + { + maxMitigatedAttackerPnl: 48, + maxExploitEvents: 36, + maxToxicFillRate: 0.62, + maxAdverseSlippageBps: 310, + maxReconciliationLagMs: 1_000, + }, + ), + amm_stale_price_arb: baseScenarioBudget( + ["amm.price_freshness_check", "stale_halt.active"], + { + maxMitigatedAttackerPnl: 40, + maxExploitEvents: 32, + maxToxicFillRate: 0.5, + maxAdverseSlippageBps: 310, + maxStaleQuoteUptimeRatio: 1, + maxReconciliationLagMs: 5_000, + }, + ), + amm_slippage_griefing: baseScenarioBudget( + ["amm.slippage_tolerance", "amm.max_trade_size"], + { + maxMitigatedAttackerPnl: 50, + maxExploitEvents: 38, + maxToxicFillRate: 0.58, + maxAdverseSlippageBps: 300, + maxReconciliationLagMs: 1_100, + }, + ), + amm_token_drain: baseScenarioBudget( + ["amm.max_position_size", "amm.reserve_imbalance_check"], + { + maxMitigatedAttackerPnl: 42, + maxExploitEvents: 35, + maxToxicFillRate: 0.55, + maxAdverseSlippageBps: 310, + minMitigatedMaxDrawdown: -22, + maxReconciliationLagMs: 1_000, + }, + ), + amm_expiry_race: baseScenarioBudget( + ["amm.dynamic_liquidity_decay", "amm.expiry_guard"], + { + maxMitigatedAttackerPnl: 42, + maxExploitEvents: 34, + maxToxicFillRate: 0.58, + maxAdverseSlippageBps: 310, + maxReconciliationLagMs: 1_200, + }, + ), }; diff --git a/packages/market-maker-bot/src/adversarial/suite.ts b/packages/market-maker-bot/src/adversarial/suite.ts index 6ea79cb9..1db2b0da 100644 --- a/packages/market-maker-bot/src/adversarial/suite.ts +++ b/packages/market-maker-bot/src/adversarial/suite.ts @@ -105,6 +105,12 @@ const LEGACY_SCENARIO_SEED_OFFSETS: Record = { quote_stuffing_burst: 18, cancel_storm_griefing: 19, sybil_identity_churn: 20, + amm_sandwich_attack: 21, + amm_reserve_manipulation: 22, + amm_stale_price_arb: 23, + amm_slippage_griefing: 24, + amm_token_drain: 25, + amm_expiry_race: 26, }; function scenarioSeedOffset(scenario: ScenarioId): number { diff --git a/packages/market-maker-bot/src/adversarial/types.ts b/packages/market-maker-bot/src/adversarial/types.ts index b256aae0..ec0f48d3 100644 --- a/packages/market-maker-bot/src/adversarial/types.ts +++ b/packages/market-maker-bot/src/adversarial/types.ts @@ -1,5 +1,7 @@ export type ChainId = "solana" | "bsc" | "avax"; +export type MarketType = "clob" | "amm"; + export type ScenarioId = | "latency_sniping" | "spoof_pressure" @@ -21,7 +23,13 @@ export type ScenarioId = | "sybil_wash_trading" | "sybil_identity_churn" | "rebate_farming_ring" - | "coordinated_resolution_push"; + | "coordinated_resolution_push" + | "amm_sandwich_attack" + | "amm_reserve_manipulation" + | "amm_stale_price_arb" + | "amm_slippage_griefing" + | "amm_token_drain" + | "amm_expiry_race"; export type BudgetBreach = { control: string; @@ -120,3 +128,17 @@ export type VulnerabilityVector = { inventory: number; cancel: number; }; + +export type AmmMarketState = { + reserveYes: number; + reserveNo: number; + liquidity: number; + yesBalance: number; + noBalance: number; + cash: number; + drawdown: number; + toxicFills: number; + totalFills: number; + exploitEvents: number; + adverseSlippageBpsTotal: number; +}; diff --git a/packages/market-maker-bot/src/amm-math.test.ts b/packages/market-maker-bot/src/amm-math.test.ts new file mode 100644 index 00000000..bb3c648a --- /dev/null +++ b/packages/market-maker-bot/src/amm-math.test.ts @@ -0,0 +1,127 @@ +import { describe, expect, it } from "vitest"; + +import { + calcAmmPrice, + calcDynamicLiquidity, + calcInitialLiquidity, + calcPrice, + getSwapAmount, +} from "./amm-math.ts"; + +describe("amm-math", () => { + describe("calcPrice", () => { + it("returns ~500_000 for equal reserves (z=0 → CDF(0) = 0.5)", () => { + const price = calcPrice(1_000_000n, 1_000_000n, 1_000_000n); + // Allow ±1% tolerance (matches Rust test) + expect(Number(price)).toBeGreaterThanOrEqual(490_000); + expect(Number(price)).toBeLessThanOrEqual(510_000); + }); + + it("returns 500_000 when liquidity is zero", () => { + expect(calcPrice(1_000_000n, 1_000_000n, 0n)).toBe(500_000n); + }); + + it("returns higher price when reserveNo > reserveYes", () => { + const price = calcPrice(500_000n, 1_500_000n, 1_000_000n); + expect(Number(price)).toBeGreaterThan(500_000); + }); + + it("returns lower price when reserveYes > reserveNo", () => { + const price = calcPrice(1_500_000n, 500_000n, 1_000_000n); + expect(Number(price)).toBeLessThan(500_000); + }); + }); + + describe("calcAmmPrice", () => { + it("returns ~0.5 for equal reserves", () => { + const price = calcAmmPrice(1_000_000n, 1_000_000n, 1_000_000n); + expect(price).toBeCloseTo(0.5, 1); + }); + }); + + describe("getSwapAmount", () => { + it("produces nonzero output", () => { + const out = getSwapAmount( + true, + 1_000_000n, + 1_000_000n, + 1_000_000n, + 100_000n, + ); + expect(out).toBeGreaterThan(0n); + }); + + it("is symmetric for equal reserves", () => { + const out1 = getSwapAmount( + true, + 1_000_000n, + 1_000_000n, + 1_000_000n, + 100_000n, + ); + const out2 = getSwapAmount( + false, + 1_000_000n, + 1_000_000n, + 1_000_000n, + 100_000n, + ); + const diff = out1 > out2 ? out1 - out2 : out2 - out1; + // Within 1 unit of rounding + expect(Number(diff)).toBeLessThanOrEqual(1); + }); + + it("larger input produces larger output", () => { + const small = getSwapAmount( + true, + 1_000_000n, + 1_000_000n, + 1_000_000n, + 50_000n, + ); + const large = getSwapAmount( + true, + 1_000_000n, + 1_000_000n, + 1_000_000n, + 200_000n, + ); + expect(large).toBeGreaterThan(small); + }); + }); + + describe("calcInitialLiquidity", () => { + it("returns approximately amount * sqrt(2π) ≈ 2.506x", () => { + const liq = calcInitialLiquidity(1_000_000n); + expect(Number(liq)).toBeGreaterThan(2_000_000); + expect(Number(liq)).toBeLessThan(3_000_000); + }); + + it("scales linearly", () => { + const l1 = calcInitialLiquidity(1_000_000n); + const l2 = calcInitialLiquidity(2_000_000n); + expect(Number(l2)).toBeCloseTo(Number(l1) * 2, -2); + }); + }); + + describe("calcDynamicLiquidity", () => { + it("returns zero when deadline has passed", () => { + expect(calcDynamicLiquidity(1_000_000n, 100n, 200n)).toBe(0n); + }); + + it("returns zero at exact deadline", () => { + expect(calcDynamicLiquidity(1_000_000n, 100n, 100n)).toBe(0n); + }); + + it("returns positive value before deadline", () => { + const liq = calcDynamicLiquidity(1_000_000n, 3600n, 0n); + expect(liq).toBeGreaterThan(0n); + }); + + it("decreases as time approaches deadline", () => { + const early = calcDynamicLiquidity(1_000_000n, 3600n, 0n); + const late = calcDynamicLiquidity(1_000_000n, 3600n, 3500n); + expect(early).toBeGreaterThan(late); + }); + }); +}); diff --git a/packages/market-maker-bot/src/amm-math.ts b/packages/market-maker-bot/src/amm-math.ts new file mode 100644 index 00000000..c584b312 --- /dev/null +++ b/packages/market-maker-bot/src/amm-math.ts @@ -0,0 +1,297 @@ +/** + * TypeScript port of the LVR AMM Gaussian-CDF bonding curve math. + * + * Mirrors packages/hyperbet-solana/anchor/programs/lvr_amm/src/math.rs. + * Uses bigint Q64.64 fixed-point internally for deterministic results, + * but public API accepts/returns number or bigint in u64 1e6-scaled form. + */ + +const SCALE = 1_000_000n; +const FRAC_BITS = 64n; + +// Q64.64 constants +const Q_ONE = 1n << FRAC_BITS; // 1.0 +const Q_HALF = 1n << (FRAC_BITS - 1n); // 0.5 +const Q_SQRT_2PI = 46_174_166_757_360_756_275n; // sqrt(2*pi) +const Q_SQRT_2 = 26_087_635_650_665_564_424n; // sqrt(2) +const Q_MIN_RESERVE = 18_446_744_073_709n; // 0.001 +const Q_MIN_DERIVATIVE = 1_844_674_407_370n; // 0.0001 +const Q_APPROX = 18_446_744_073_709n; // 0.001 convergence threshold + +const MAX_NEWTON_ITERS = 50; + +// --- Q64.64 arithmetic --- + +function u64ToQ(val: bigint): bigint { + return (val << FRAC_BITS) / SCALE; +} + +function qToU64(val: bigint): bigint { + const abs = val < 0n ? -val : val; + return (abs * SCALE) >> FRAC_BITS; +} + +function qMul(a: bigint, b: bigint): bigint { + // Approximate: shift each down 32 then multiply (avoids 256-bit overflow) + return (a >> 32n) * (b >> 32n); +} + +function qDiv(a: bigint, b: bigint): bigint { + if (b === 0n) return 0n; + return (a << FRAC_BITS) / b; +} + +function qAbs(val: bigint): bigint { + return val < 0n ? -val : val; +} + +// --- Approximations --- + +/** + * Approximate exp(-x) for x >= 0 using Taylor expansion + repeated squaring. + * exp(-x) = exp(-x/16)^16, where exp(-small) ≈ 1 - x + x²/2 - x³/6 + */ +function qExpNeg(x: bigint): bigint { + if (x <= 0n) return Q_ONE; + + const tenQ = 10n << FRAC_BITS; + if (x >= tenQ) return 0n; + + const smallX = x >> 4n; // x/16 + const x2 = qMul(smallX, smallX); + const x3 = qMul(x2, smallX); + const halfX2 = x2 >> 1n; + const sixthX3 = qDiv(x3, 6n << FRAC_BITS); + + let result = Q_ONE - smallX + halfX2 - sixthX3; + if (result < 0n) result = 0n; + + // Square 4 times: exp(-x/16)^16 = exp(-x) + for (let i = 0; i < 4; i++) { + result = qMul(result, result); + if (result < 0n) result = 0n; + } + + return result; +} + +/** + * Polynomial approximation of erf(x) using Abramowitz & Stegun 7.1.28. + * Max error ~1.5e-7. For |x| > 4, erf(x) ≈ ±1. + */ +function qErf(x: bigint): bigint { + const isNeg = x < 0n; + const ax = qAbs(x); + + const fourQ = 4n << FRAC_BITS; + if (ax >= fourQ) { + return isNeg ? -Q_ONE : Q_ONE; + } + + // Abramowitz & Stegun constants in Q64.64 + const p = 6_046_276_792_669_257_114n; // 0.3275911 + const a1 = 4_700_886_397_498_587_136n; // 0.254829592 + const a2 = -5_247_463_093_918_941_184n; // -0.284496736 + const a3 = 26_221_419_770_498_138_112n; // 1.421413741 + const a4 = -26_807_264_366_735_253_504n; // -1.453152027 + const a5 = 19_580_373_992_048_084_992n; // 1.061405429 + + // t = 1 / (1 + p*|x|) + const px = qMul(p, ax); + const denom = Q_ONE + px; + const t = qDiv(Q_ONE, denom); + + // Horner's method: poly = ((((a5*t + a4)*t + a3)*t + a2)*t + a1)*t + let poly = a5; + poly = qMul(poly, t) + a4; + poly = qMul(poly, t) + a3; + poly = qMul(poly, t) + a2; + poly = qMul(poly, t) + a1; + poly = qMul(poly, t); + + const x2 = qMul(ax, ax); + const expNegX2 = qExpNeg(x2); + + // erf = 1 - poly * exp(-x²) + const result = Q_ONE - qMul(poly, expNegX2); + return isNeg ? -result : result; +} + +/** Gaussian CDF: Φ(z) = 0.5 * (1 + erf(z / sqrt(2))) */ +function gaussianCdfQ(z: bigint): bigint { + const zOverSqrt2 = qDiv(z, Q_SQRT_2); + const erfVal = qErf(zOverSqrt2); + return (Q_ONE + erfVal) >> 1n; +} + +/** Gaussian PDF: φ(z) = exp(-z²/2) / sqrt(2π) */ +function gaussianPdfQ(z: bigint): bigint { + const z2 = qMul(z, z); + const halfZ2 = z2 >> 1n; + const expVal = qExpNeg(halfZ2); + return qDiv(expVal, Q_SQRT_2PI); +} + +/** AMM invariant: f(x, y, L) = (y-x)*Φ(z) + L*φ(z) - y, where z = (y-x)/L */ +function ammFuncQ(x: bigint, y: bigint, l: bigint): bigint { + const diff = y - x; + const z = qDiv(diff, l); + const cdf = gaussianCdfQ(z); + const pdf = gaussianPdfQ(z); + return qMul(diff, cdf) + qMul(l, pdf) - y; +} + +/** Derivative of invariant w.r.t. x: f'(x) = -Φ(z) */ +function funcDerivativeQ(x: bigint, y: bigint, l: bigint): bigint { + const z = qDiv(y - x, l); + let deriv = -gaussianCdfQ(z); + if (qAbs(deriv) < Q_MIN_DERIVATIVE) { + deriv = deriv < 0n ? -Q_MIN_DERIVATIVE : Q_MIN_DERIVATIVE; + } + return deriv; +} + +/** Newton-Raphson solver for new reserve given modified counterpart */ +function getNewReserveQ(xGuess: bigint, y: bigint, l: bigint): bigint { + let t = qAbs(xGuess) < Q_MIN_RESERVE ? y >> 1n : xGuess; + + for (let i = 0; i < MAX_NEWTON_ITERS; i++) { + const f = ammFuncQ(t, y, l); + if (qAbs(f) < Q_APPROX) { + const res = qAbs(t); + return res < Q_MIN_RESERVE ? Q_MIN_RESERVE : res; + } + const deriv = funcDerivativeQ(t, y, l); + if (deriv === 0n) break; + t = t - qDiv(f, deriv); + } + + const res = qAbs(t); + return res < Q_MIN_RESERVE ? Q_MIN_RESERVE : res; +} + +// === Public API (u64 scaled by 1e6) === + +/** + * Compute swap output amount. + * @param yesToNo - true: selling YES for NO, false: selling NO for YES + * @param currentReserveYes - YES reserve (u64, 1e6-scaled) + * @param currentReserveNo - NO reserve (u64, 1e6-scaled) + * @param initialLiquidity - liquidity parameter (u64, 1e6-scaled) + * @param amountIn - input amount (u64, 1e6-scaled) + * @returns output amount (u64, 1e6-scaled) + */ +export function getSwapAmount( + yesToNo: boolean, + currentReserveYes: bigint, + currentReserveNo: bigint, + initialLiquidity: bigint, + amountIn: bigint, +): bigint { + const ry = bigintMax(u64ToQ(currentReserveYes), Q_MIN_RESERVE); + const rn = bigintMax(u64ToQ(currentReserveNo), Q_MIN_RESERVE); + const l = u64ToQ(initialLiquidity); + const amt = u64ToQ(amountIn); + + const amountOut = yesToNo + ? qAbs(rn - getNewReserveQ(rn, ry + amt, l)) + : qAbs(ry - getNewReserveQ(ry, rn + amt, l)); + + return qToU64(amountOut); +} + +/** + * Calculate YES price as probability [0, 1_000_000]. + * Uses Gaussian CDF: price = Φ((reserveNo - reserveYes) / liquidity) + * @returns price scaled by 1e6 (500_000 = 50%) + */ +export function calcPrice(x: bigint, y: bigint, l: bigint): bigint { + const rx = u64ToQ(x); + const ry = u64ToQ(y); + const lq = u64ToQ(l); + + if (lq === 0n) return 500_000n; // default 50% + + const z = qDiv(ry - rx, lq); + const price = gaussianCdfQ(z); + return (price * 1_000_000n) >> FRAC_BITS; +} + +/** + * Calculate time-decayed dynamic liquidity. + * L_new = L * sqrt(deadline - currentTime) / SCALE + */ +export function calcDynamicLiquidity( + liquidity: bigint, + deadline: bigint, + currentTime: bigint, +): bigint { + const deltaTime = deadline - currentTime; + if (deltaTime <= 0n) return 0n; + + const sqrtDt = integerSqrt(deltaTime < 0n ? 0n : deltaTime); + return (liquidity * sqrtDt) / SCALE; +} + +/** + * Calculate initial liquidity from collateral amount. + * L = amount * sqrt(2π) ≈ amount * 2.506628 + */ +export function calcInitialLiquidity(amount: bigint): bigint { + return (amount * 2_506_628n) / 1_000_000n; +} + +/** Integer square root using Newton's method. */ +function integerSqrt(n: bigint): bigint { + if (n <= 0n) return 0n; + if (n === 1n) return 1n; + let x = n; + let y = (x + 1n) / 2n; + while (y < x) { + x = y; + y = (x + n / x) / 2n; + } + return x; +} + +function bigintMax(a: bigint, b: bigint): bigint { + return a > b ? a : b; +} + +// === Convenience wrappers (number-based) === + +/** + * Calculate AMM YES price as a probability in [0, 1]. + * Convenience wrapper that accepts/returns plain numbers. + */ +export function calcAmmPrice( + reserveYes: bigint, + reserveNo: bigint, + liquidity: bigint, +): number { + const raw = calcPrice(reserveYes, reserveNo, liquidity); + return Number(raw) / 1_000_000; +} + +/** + * Estimate slippage for a buy/sell operation. + * Returns the effective price after slippage as a number in [0, 1]. + */ +export function estimateSlippage( + yesToNo: boolean, + reserveYes: bigint, + reserveNo: bigint, + liquidity: bigint, + amountIn: bigint, +): { amountOut: bigint; effectivePrice: number } { + const amountOut = getSwapAmount( + yesToNo, + reserveYes, + reserveNo, + liquidity, + amountIn, + ); + const effectivePrice = + amountIn > 0n ? Number(amountOut) / Number(amountIn) : 0; + return { amountOut, effectivePrice }; +} diff --git a/packages/market-maker-bot/src/idl/lvr_amm.json b/packages/market-maker-bot/src/idl/lvr_amm.json new file mode 100644 index 00000000..5f896615 --- /dev/null +++ b/packages/market-maker-bot/src/idl/lvr_amm.json @@ -0,0 +1,671 @@ +{ + "address": "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", + "metadata": { + "name": "lvr_amm", + "version": "0.1.0", + "spec": "0.1.0", + "description": "LvrAMM" + }, + "instructions": [ + { + "name": "initialize", + "discriminator": [ + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 + ], + "accounts": [ + { + "name": "admin_state", + "writable": true + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program" + } + ], + "args": [] + }, + { + "name": "initialize_config", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program" + } + ], + "args": [ + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + }, + { + "name": "freeze_config", + "discriminator": [ + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [] + }, + { + "name": "set_paused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [ + { + "name": "paused", + "type": "bool" + } + ] + }, + { + "name": "create_bet_account", + "discriminator": [ + 24, + 219, + 70, + 229, + 81, + 50, + 3, + 28 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config" + }, + { + "name": "bet", + "writable": true + }, + { + "name": "mint_yes", + "writable": true + }, + { + "name": "mint_no", + "writable": true + }, + { + "name": "system_program" + }, + { + "name": "token_program" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "expiration_at", + "type": "i64" + } + ] + }, + { + "name": "init_bet_account", + "discriminator": [ + 229, + 240, + 116, + 140, + 5, + 177, + 61, + 69 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true + }, + { + "name": "system_program" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + } + ] + }, + { + "name": "get_price", + "discriminator": [ + 238, + 38, + 193, + 106, + 228, + 32, + 210, + 33 + ], + "accounts": [ + { + "name": "bet", + "writable": true + } + ], + "args": [ + { + "name": "outcome", + "type": "u8" + } + ], + "returns": "u64" + }, + { + "name": "buy", + "discriminator": [ + 102, + 6, + 61, + 18, + 1, + 218, + 235, + 234 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config" + }, + { + "name": "bet", + "writable": true + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "mint_yes", + "writable": true + }, + { + "name": "mint_no", + "writable": true + }, + { + "name": "destination_yes", + "writable": true + }, + { + "name": "destination_no", + "writable": true + }, + { + "name": "token_program" + }, + { + "name": "system_program" + }, + { + "name": "associated_token_program" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "sell", + "discriminator": [ + 51, + 230, + 133, + 164, + 1, + 127, + 131, + 173 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config" + }, + { + "name": "bet", + "writable": true + }, + { + "name": "mint_yes", + "writable": true + }, + { + "name": "mint_no", + "writable": true + }, + { + "name": "destination_yes", + "writable": true + }, + { + "name": "destination_no", + "writable": true + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "treasury_yes_ata", + "writable": true + }, + { + "name": "treasury_no_ata", + "writable": true + }, + { + "name": "token_program" + }, + { + "name": "system_program" + }, + { + "name": "associated_token_program" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "settle_bet", + "discriminator": [ + 115, + 55, + 234, + 177, + 227, + 4, + 10, + 67 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "admin_state" + }, + { + "name": "bet", + "writable": true + }, + { + "name": "duel_state", + "docs": [ + "Optional: fight_oracle DuelState account. When provided, winner is read", + "from the oracle rather than trusting the caller's `side_won` argument." + ], + "optional": true + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "side_won", + "type": "u8" + } + ] + }, + { + "name": "withdraw_post_settle", + "discriminator": [ + 133, + 23, + 211, + 230, + 77, + 52, + 64, + 154 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true + }, + { + "name": "mint_yes", + "writable": true + }, + { + "name": "mint_no", + "writable": true + }, + { + "name": "destination_yes", + "writable": true + }, + { + "name": "destination_no", + "writable": true + }, + { + "name": "token_program" + }, + { + "name": "system_program" + }, + { + "name": "associated_token_program" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "q", + "type": "u64" + } + ] + } + ], + "accounts": [ + { + "name": "lvr_amm::state::admin::Admin", + "discriminator": [ + 244, + 158, + 220, + 65, + 8, + 73, + 4, + 65 + ] + }, + { + "name": "lvr_amm::state::bet::Bet", + "discriminator": [ + 147, + 23, + 35, + 59, + 15, + 75, + 155, + 32 + ] + }, + { + "name": "lvr_amm::state::config::AmmConfig", + "discriminator": [ + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 + ] + } + ], + "types": [ + { + "name": "lvr_amm::state::admin::Admin", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "lvr_amm::state::bet::Bet", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "reserves", + "type": { + "array": [ + "u64", + 2 + ] + } + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "is_initialized", + "type": "bool" + }, + { + "name": "side_won", + "type": { + "option": "u8" + } + }, + { + "name": "expiration_at", + "type": "i64" + }, + { + "name": "created_at", + "type": "i64" + }, + { + "name": "creator", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + }, + { + "name": "lvr_amm::state::config::AmmConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + }, + { + "name": "config_frozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + } + ] +} diff --git a/packages/market-maker-bot/src/index.ts b/packages/market-maker-bot/src/index.ts index b5cb6711..151a65d2 100644 --- a/packages/market-maker-bot/src/index.ts +++ b/packages/market-maker-bot/src/index.ts @@ -17,8 +17,13 @@ import { } from "@hyperbet/chain-registry"; import { DEFAULT_MARKET_MAKER_CONFIG, + DEFAULT_AMM_MARKET_MAKER_CONFIG, buildQuotePlan, + buildAmmTradeDecision, evaluateQuoteDecision, + type AmmMarketMakerConfig, + type AmmMarketSnapshot, + type AmmTradeDecision, type MarketMakerConfig, type MarketSnapshot, } from "@hyperbet/mm-core"; @@ -37,6 +42,7 @@ import dotenv from "dotenv"; import { ethers } from "ethers"; import goldClobMarketIdl from "./idl/gold_clob_market.json" with { type: "json" }; +import lvrAmmIdl from "./idl/lvr_amm.json" with { type: "json" }; import { duelKeyHexToBytes, findClobVaultPda, @@ -47,7 +53,13 @@ import { ORDER_BEHAVIOR_GTC, findPriceLevelPda, findUserBalancePda, + findAmmConfigPda, + findAmmAdminStatePda, + findAmmBetPda, + findAmmMintYesPda, + findAmmMintNoPda, } from "./solana-helpers.ts"; +import { calcAmmPrice, calcDynamicLiquidity } from "./amm-math.ts"; import { createDefaultMarketMakerStateStore, type ClaimBacklogInput, @@ -153,6 +165,83 @@ type SolanaManagedOrder = { remainingRawAmount: bigint; }; +// --- AMM runtime types --- + +type SolanaAmmConfig = { + authority: PublicKey; + treasury: PublicKey; + marketMaker: PublicKey; + feeBps: number; + paused: boolean; +}; + +type SolanaAmmRuntime = { + connection: Connection; + provider: AnchorProvider; + wallet: Keypair; + walletAddress: string; + fightOracleProgramId: PublicKey; + ammProgramId: PublicKey; + ammProgram: Program; + ammConfigPda: PublicKey; + ammAdminStatePda: PublicKey; + ammConfig: SolanaAmmConfig | null; + rpcUrl: string; +}; + +type EvmAmmRuntime = { + chainKey: BettingEvmChain; + enabled: boolean; + provider: ethers.JsonRpcProvider; + wallet: ethers.Wallet; + walletAddress: string; + router: ethers.Contract; + mUsd: ethers.Contract; + routerAddress: string; + rpcUrl: string; +}; + +type AmmPosition = { + chainKey: BettingChainKey; + marketRef: string; + betId: string; + creator: string; + yesBalance: bigint; + noBalance: bigint; + costBasis: bigint; + settled: boolean; +}; + +const GOLD_AMM_ROUTER_ABI = [ + "function buyYes(address market, uint256 collateralIn, uint256 minAmountOut)", + "function buyNo(address market, uint256 collateralIn, uint256 minAmountOut)", + "function sellYes(address market, uint256 tokenIn, uint256 minAmountOut)", + "function sellNo(address market, uint256 tokenIn, uint256 minAmountOut)", + "function settleFromOracle(address market, address oracle, bytes32 duelKey)", + "function redeem(address market, uint256 amountYes, uint256 amountNo)", + "function getAllMarkets() view returns (address[])", + "function mUSD() view returns (address)", +] as const; + +const LVR_MARKET_ABI = [ + "function state() view returns (uint8)", + "function outcome() view returns (uint256)", + "function deadline() view returns (uint256)", + "function liquidity() view returns (uint256)", + "function reserveYes() view returns (uint256)", + "function reserveNo() view returns (uint256)", + "function yesToken() view returns (address)", + "function noToken() view returns (address)", + "function feeBps() view returns (uint256)", + "function isDynamic() view returns (bool)", +] as const; + +const ERC20_ABI = [ + "function balanceOf(address) view returns (uint256)", + "function approve(address spender, uint256 amount) returns (bool)", + "function allowance(address owner, address spender) view returns (uint256)", +] as const; + type CrossChainMarketMakerOptions = { stateStore?: MarketMakerStateStore; }; @@ -626,6 +715,14 @@ export class CrossChainMarketMaker { private lastPredictionMarkets: PredictionMarketsResponse | null = null; private lastPredictionMarketsAt = 0; + // AMM state + private readonly evmAmmRuntimes: EvmAmmRuntime[]; + private readonly solanaAmmRuntime: SolanaAmmRuntime | null; + private readonly ammPositions = new Map(); + private ammEnabled = readEnvBoolean("MM_ENABLE_AMM", true); + private ammSolanaEnabled = readEnvBoolean("MM_ENABLE_AMM_SOLANA", true); + private readonly ammConfig: AmmMarketMakerConfig; + constructor(options: CrossChainMarketMakerOptions = {}) { this.instanceId = (process.env.MM_INSTANCE_ID || "mm-1").trim() || "mm-1"; this.config = buildMarketMakerConfig(); @@ -635,6 +732,21 @@ export class CrossChainMarketMaker { this.createEvmRuntime(chainKey), ); this.solanaRuntime = this.createSolanaRuntime(); + + // AMM runtimes + this.ammConfig = { + ...DEFAULT_AMM_MARKET_MAKER_CONFIG, + deviationThresholdBps: readEnvNumber("MM_AMM_DEVIATION_THRESHOLD_BPS", DEFAULT_AMM_MARKET_MAKER_CONFIG.deviationThresholdBps), + maxTradeSize: readEnvNumber("MM_AMM_MAX_TRADE_SIZE", DEFAULT_AMM_MARKET_MAKER_CONFIG.maxTradeSize), + minTradeSize: readEnvNumber("MM_AMM_MIN_TRADE_SIZE", DEFAULT_AMM_MARKET_MAKER_CONFIG.minTradeSize), + maxPositionSize: readEnvNumber("MM_AMM_MAX_POSITION_SIZE", DEFAULT_AMM_MARKET_MAKER_CONFIG.maxPositionSize), + }; + this.evmAmmRuntimes = this.ammEnabled + ? BETTING_EVM_CHAIN_ORDER.map((chainKey) => this.createEvmAmmRuntime(chainKey)) + : []; + this.solanaAmmRuntime = this.ammEnabled && this.ammSolanaEnabled + ? this.createSolanaAmmRuntime() + : null; } private async ensureStateStoreReady() { @@ -1600,6 +1712,17 @@ export class CrossChainMarketMaker { } await this.solanaMarketMake(predictionMarkets, duelSignal); + + // AMM market-making (parallel to CLOB above) + if (this.ammEnabled) { + for (const runtime of this.evmAmmRuntimes) { + if (!runtime.enabled) continue; + await this.evmAmmMarketMake(runtime, predictionMarkets, duelSignal); + } + if (this.ammSolanaEnabled && this.solanaAmmRuntime) { + await this.solanaAmmMarketMake(predictionMarkets, duelSignal); + } + } } private async evmMarketMake( @@ -2694,12 +2817,514 @@ export class CrossChainMarketMaker { } } + // --- AMM Runtime Creation --- + + private createEvmAmmRuntime(chainKey: BettingEvmChain): EvmAmmRuntime { + const disabled: EvmAmmRuntime = { + chainKey, + enabled: false, + provider: null as any, + wallet: null as any, + walletAddress: "", + router: null as any, + mUsd: null as any, + routerAddress: "", + rpcUrl: "", + }; + try { + const resolved = resolveBettingEvmRuntimeEnv(chainKey, TARGET_ENV); + const routerAddress = resolved.goldAmmRouterAddress?.trim(); + if (!routerAddress) return disabled; + const mUsdAddress = resolved.mUsdTokenAddress?.trim(); + const rpcUrl = resolved.rpcUrl; + const privateKey = ( + process.env[`EVM_PRIVATE_KEY_${chainKey.toUpperCase()}`] || + process.env.EVM_PRIVATE_KEY || + "" + ).trim(); + if (!privateKey) return disabled; + const provider = new ethers.JsonRpcProvider(rpcUrl); + const wallet = new ethers.Wallet(privateKey, provider); + const router = new ethers.Contract(routerAddress, GOLD_AMM_ROUTER_ABI, wallet); + const mUsd = mUsdAddress + ? new ethers.Contract(mUsdAddress, ERC20_ABI, wallet) + : (null as any); + return { + chainKey, + enabled: true, + provider, + wallet, + walletAddress: wallet.address, + router, + mUsd, + routerAddress, + rpcUrl, + }; + } catch { + return disabled; + } + } + + private createSolanaAmmRuntime(): SolanaAmmRuntime | null { + if (!this.ammSolanaEnabled) return null; + const solanaPrivateKey = (process.env.SOLANA_PRIVATE_KEY || "").trim(); + if (!solanaPrivateKey) return null; + try { + const deployment = resolveBettingSolanaDeployment( + normalizeSolanaCluster(TARGET_ENV) as any, + ); + const ammProgramIdStr = ( + process.env.GOLD_AMM_MARKET_PROGRAM_ID || "" + ).trim() || deployment.goldAmmMarketProgramId; + if (!ammProgramIdStr) return null; + const ammProgramId = new PublicKey(ammProgramIdStr); + const rpcUrl = + (process.env.SOLANA_RPC_URL || "").trim() || + defaultSolanaRpcUrl(TARGET_ENV); + const keyBytes = decodeSolanaSecretKey(solanaPrivateKey); + const wallet = + keyBytes.length === 32 + ? Keypair.fromSeed(keyBytes) + : Keypair.fromSecretKey(keyBytes); + const connection = new Connection(rpcUrl, "confirmed"); + const provider = new AnchorProvider( + connection, + toAnchorWallet(wallet), + { commitment: "confirmed", preflightCommitment: "confirmed" }, + ); + const fightOracleProgramId = new PublicKey( + (process.env.FIGHT_ORACLE_PROGRAM_ID || "").trim() || + deployment.fightOracleProgramId, + ); + const ammProgram = new Program( + ensureIdlAddress(lvrAmmIdl, ammProgramId), + provider, + ) as Program; + return { + connection, + provider, + wallet, + walletAddress: wallet.publicKey.toBase58(), + fightOracleProgramId, + ammProgramId, + ammProgram, + ammConfigPda: findAmmConfigPda(ammProgramId), + ammAdminStatePda: findAmmAdminStatePda(ammProgramId), + ammConfig: null, + rpcUrl, + }; + } catch (error) { + console.warn( + `[AMM-SOLANA] Disabled: ${error instanceof Error ? error.message : String(error)}`, + ); + return null; + } + } + + // --- AMM Market-Making Cycle --- + + private async solanaAmmMarketMake( + predictionMarkets: PredictionMarketsResponse | null, + duelSignal: DuelSignal | null, + ) { + const runtime = this.solanaAmmRuntime; + if (!this.ammEnabled || !this.ammSolanaEnabled || !runtime) return; + + // Fetch ammConfig on first cycle + if (!runtime.ammConfig) { + try { + const configAccount = await (runtime.ammProgram.account as any).ammConfig.fetchNullable( + runtime.ammConfigPda, + ); + if (!configAccount) return; + runtime.ammConfig = { + authority: configAccount.authority, + treasury: configAccount.treasury, + marketMaker: configAccount.marketMaker, + feeBps: configAccount.feeBps, + paused: configAccount.paused, + }; + } catch { + return; + } + } + if (runtime.ammConfig.paused) return; + + // Find AMM markets from lifecycle records + const ammMarkets = (predictionMarkets?.markets ?? []).filter( + (m) => m.chainKey === "solana" && m.marketType === "amm", + ); + + for (const market of ammMarkets) { + try { + await this.solanaAmmMarketMakeOne(runtime, market, duelSignal); + } catch (error) { + console.warn( + `[AMM-SOLANA] market-make error for ${market.marketRef}: ${error instanceof Error ? error.message : String(error)}`, + ); + } + } + } + + private async solanaAmmMarketMakeOne( + runtime: SolanaAmmRuntime, + market: PredictionMarketLifecycleRecord, + duelSignal: DuelSignal | null, + ) { + const metadata = market.metadata as Record | undefined; + const betId = BigInt((metadata?.betId as string) || "0"); + const creatorStr = (metadata?.creator as string) || ""; + if (!betId || !creatorStr) return; + const creator = new PublicKey(creatorStr); + + const betPda = findAmmBetPda(runtime.ammProgramId, betId, creator); + + // Fetch bet state + const betAccount = await (runtime.ammProgram.account as any).bet.fetchNullable(betPda); + if (!betAccount || !betAccount.isInitialized) return; + + // Check if settled + if (betAccount.sideWon != null) { + await this.solanaAmmWithdraw(runtime, betId, creator, betAccount); + return; + } + + // Compute price + const reserveYes = BigInt(betAccount.reserves[0].toString()); + const reserveNo = BigInt(betAccount.reserves[1].toString()); + const currentTime = BigInt(Math.floor(Date.now() / 1000)); + const liq = betAccount.isDynamic + ? calcDynamicLiquidity(BigInt(betAccount.initialLiq.toString()), BigInt(betAccount.expirationAt.toString()), currentTime) + : BigInt(betAccount.initialLiq.toString()); + const ammPrice = calcAmmPrice(reserveYes, reserveNo, liq); + + // Build snapshot + const posKey = `solana:${betPda.toBase58()}`; + const existing = this.ammPositions.get(posKey); + const snapshot: AmmMarketSnapshot = { + chainKey: "solana", + lifecycleStatus: market.lifecycleStatus, + duelKey: market.duelKey, + marketRef: betPda.toBase58(), + ammPriceYes: ammPrice, + reserveYes: Number(reserveYes), + reserveNo: Number(reserveNo), + liquidity: Number(liq), + betCloseTimeMs: betAccount.expirationAt + ? Number(betAccount.expirationAt) * 1000 + : null, + lastRpcAtMs: Date.now(), + exposure: { + yes: Number(existing?.yesBalance ?? 0n), + no: Number(existing?.noBalance ?? 0n), + openYes: 0, + openNo: 0, + }, + }; + + const signal = duelSignal + ? { signalPrice: duelSignal.midPrice, signalWeight: duelSignal.weight } + : {}; + const decision = buildAmmTradeDecision(snapshot, signal, this.ammConfig); + + if (decision.action === "hold") return; + + const outcome = decision.action === "buy_yes" || decision.action === "sell_yes" ? 0 : 1; + const amountIn = new BN(decision.amount); + const mintYes = findAmmMintYesPda(runtime.ammProgramId, betId, creator); + const mintNo = findAmmMintNoPda(runtime.ammProgramId, betId, creator); + + const isBuy = decision.action === "buy_yes" || decision.action === "buy_no"; + + try { + if (isBuy) { + await runtime.ammProgram.methods + .buy(new BN(betId.toString()), outcome, amountIn) + .accountsPartial({ + signer: runtime.wallet.publicKey, + ammConfig: runtime.ammConfigPda, + bet: betPda, + treasury: runtime.ammConfig!.treasury, + mintYes, + mintNo, + tokenProgram: new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), + systemProgram: SystemProgram.programId, + }) + .rpc(); + } else { + await runtime.ammProgram.methods + .sell(new BN(betId.toString()), outcome, amountIn) + .accountsPartial({ + signer: runtime.wallet.publicKey, + ammConfig: runtime.ammConfigPda, + bet: betPda, + treasury: runtime.ammConfig!.treasury, + mintYes, + mintNo, + tokenProgram: new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), + systemProgram: SystemProgram.programId, + }) + .rpc(); + } + + // Update position tracking + const pos: AmmPosition = existing ?? { + chainKey: "solana", + marketRef: betPda.toBase58(), + betId: betId.toString(), + creator: creatorStr, + yesBalance: 0n, + noBalance: 0n, + costBasis: 0n, + settled: false, + }; + if (isBuy) { + pos.costBasis += BigInt(decision.amount); + } + this.ammPositions.set(posKey, pos); + } catch (error) { + console.warn( + `[AMM-SOLANA] ${decision.action} failed: ${error instanceof Error ? error.message : String(error)}`, + ); + } + } + + private async solanaAmmWithdraw( + runtime: SolanaAmmRuntime, + betId: bigint, + creator: PublicKey, + betAccount: any, + ) { + const posKey = `solana:${findAmmBetPda(runtime.ammProgramId, betId, creator).toBase58()}`; + const pos = this.ammPositions.get(posKey); + if (!pos || pos.settled) return; + const sideWon: number = betAccount.sideWon; + const balance = sideWon === 0 ? pos.yesBalance : pos.noBalance; + if (balance <= 0n) { + pos.settled = true; + return; + } + try { + const betPda = findAmmBetPda(runtime.ammProgramId, betId, creator); + const mintYes = findAmmMintYesPda(runtime.ammProgramId, betId, creator); + const mintNo = findAmmMintNoPda(runtime.ammProgramId, betId, creator); + await runtime.ammProgram.methods + .withdrawPostSettle(new BN(betId.toString()), sideWon, new BN(balance.toString())) + .accountsPartial({ + signer: runtime.wallet.publicKey, + bet: betPda, + mintYes, + mintNo, + tokenProgram: new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), + systemProgram: SystemProgram.programId, + }) + .rpc(); + pos.settled = true; + console.log(`[AMM-SOLANA] withdrew from settled bet ${betId}`); + } catch (error) { + console.warn( + `[AMM-SOLANA] withdraw failed for bet ${betId}: ${error instanceof Error ? error.message : String(error)}`, + ); + } + } + + private async evmAmmMarketMake( + runtime: EvmAmmRuntime, + predictionMarkets: PredictionMarketsResponse | null, + duelSignal: DuelSignal | null, + ) { + if (!runtime.enabled) return; + + const ammMarkets = (predictionMarkets?.markets ?? []).filter( + (m) => m.chainKey === runtime.chainKey && m.marketType === "amm", + ); + + for (const market of ammMarkets) { + try { + await this.evmAmmMarketMakeOne(runtime, market, duelSignal); + } catch (error) { + console.warn( + `[AMM-${runtime.chainKey.toUpperCase()}] error: ${error instanceof Error ? error.message : String(error)}`, + ); + } + } + } + + private async evmAmmMarketMakeOne( + runtime: EvmAmmRuntime, + market: PredictionMarketLifecycleRecord, + duelSignal: DuelSignal | null, + ) { + const marketAddress = market.contractAddress ?? market.marketRef; + if (!marketAddress) return; + + const lvrMarket = new ethers.Contract(marketAddress, LVR_MARKET_ABI, runtime.provider); + const [stateRaw, reserveYesRaw, reserveNoRaw, liqRaw, deadlineRaw, isDynamic] = + await Promise.all([ + lvrMarket.state(), + lvrMarket.reserveYes(), + lvrMarket.reserveNo(), + lvrMarket.liquidity(), + lvrMarket.deadline(), + lvrMarket.isDynamic(), + ]); + + // state: 0=OPEN, 1=PENDING, 2=DISPUTED, 3=RESOLVED + const marketState = Number(stateRaw); + if (marketState === 3) { + await this.evmAmmRedeem(runtime, marketAddress); + return; + } + if (marketState !== 0) return; + + // Compute price using EVM WAD (1e18) reserves — normalize to [0, 1] + // We use the Solana math port (1e6 scale) by downscaling + const scale = 1_000_000_000_000n; // 1e18 / 1e6 + const ry = BigInt(reserveYesRaw.toString()) / scale; + const rn = BigInt(reserveNoRaw.toString()) / scale; + const l = BigInt(liqRaw.toString()) / scale; + const ammPrice = calcAmmPrice(ry, rn, l); + + const posKey = `${runtime.chainKey}:${marketAddress}`; + const existing = this.ammPositions.get(posKey); + + const snapshot: AmmMarketSnapshot = { + chainKey: runtime.chainKey, + lifecycleStatus: market.lifecycleStatus, + duelKey: market.duelKey, + marketRef: marketAddress, + ammPriceYes: ammPrice, + reserveYes: Number(ry), + reserveNo: Number(rn), + liquidity: Number(l), + betCloseTimeMs: Number(deadlineRaw) * 1000, + lastRpcAtMs: Date.now(), + exposure: { + yes: Number(existing?.yesBalance ?? 0n), + no: Number(existing?.noBalance ?? 0n), + openYes: 0, + openNo: 0, + }, + }; + + const signal = duelSignal + ? { signalPrice: duelSignal.midPrice, signalWeight: duelSignal.weight } + : {}; + const decision = buildAmmTradeDecision(snapshot, signal, this.ammConfig); + + if (decision.action === "hold") return; + + const amountBn = ethers.parseUnits(decision.amount.toString(), 6); // mUSD has 6 decimals + + try { + if (decision.action === "buy_yes" || decision.action === "buy_no") { + // Ensure mUSD approval + if (runtime.mUsd) { + const allowance = await runtime.mUsd.allowance( + runtime.walletAddress, + runtime.routerAddress, + ); + if (BigInt(allowance.toString()) < BigInt(amountBn.toString())) { + await runtime.mUsd.approve(runtime.routerAddress, ethers.MaxUint256); + } + } + if (decision.action === "buy_yes") { + await runtime.router.buyYes(marketAddress, amountBn, 0); + } else { + await runtime.router.buyNo(marketAddress, amountBn, 0); + } + } else { + // Sell: need token approval + const [yesTokenAddr, noTokenAddr] = await Promise.all([ + lvrMarket.yesToken(), + lvrMarket.noToken(), + ]); + const tokenAddr = decision.action === "sell_yes" ? yesTokenAddr : noTokenAddr; + const token = new ethers.Contract(tokenAddr, ERC20_ABI, runtime.wallet); + const allowance = await token.allowance(runtime.walletAddress, runtime.routerAddress); + if (BigInt(allowance.toString()) < BigInt(amountBn.toString())) { + await token.approve(runtime.routerAddress, ethers.MaxUint256); + } + if (decision.action === "sell_yes") { + await runtime.router.sellYes(marketAddress, amountBn, 0); + } else { + await runtime.router.sellNo(marketAddress, amountBn, 0); + } + } + + const pos: AmmPosition = existing ?? { + chainKey: runtime.chainKey, + marketRef: marketAddress, + betId: "0", + creator: "", + yesBalance: 0n, + noBalance: 0n, + costBasis: 0n, + settled: false, + }; + if (decision.action === "buy_yes" || decision.action === "buy_no") { + pos.costBasis += BigInt(decision.amount); + } + this.ammPositions.set(posKey, pos); + } catch (error) { + console.warn( + `[AMM-${runtime.chainKey.toUpperCase()}] ${decision.action} failed: ${error instanceof Error ? error.message : String(error)}`, + ); + } + } + + private async evmAmmRedeem(runtime: EvmAmmRuntime, marketAddress: string) { + const posKey = `${runtime.chainKey}:${marketAddress}`; + const pos = this.ammPositions.get(posKey); + if (!pos || pos.settled) return; + if (pos.yesBalance <= 0n && pos.noBalance <= 0n) { + pos.settled = true; + return; + } + try { + const lvrMarket = new ethers.Contract(marketAddress, LVR_MARKET_ABI, runtime.provider); + const [yesTokenAddr, noTokenAddr] = await Promise.all([ + lvrMarket.yesToken(), + lvrMarket.noToken(), + ]); + // Approve both tokens + for (const addr of [yesTokenAddr, noTokenAddr]) { + const token = new ethers.Contract(addr, ERC20_ABI, runtime.wallet); + const allowance = await token.allowance(runtime.walletAddress, runtime.routerAddress); + if (BigInt(allowance.toString()) < ethers.MaxUint256 / 2n) { + await token.approve(runtime.routerAddress, ethers.MaxUint256); + } + } + await runtime.router.redeem(marketAddress, pos.yesBalance, pos.noBalance); + pos.settled = true; + console.log(`[AMM-${runtime.chainKey.toUpperCase()}] redeemed from ${marketAddress}`); + } catch (error) { + console.warn( + `[AMM-${runtime.chainKey.toUpperCase()}] redeem failed: ${error instanceof Error ? error.message : String(error)}`, + ); + } + } + + getAmmPositions() { + return [...this.ammPositions.entries()].map(([key, pos]) => ({ + key, + ...pos, + yesBalance: pos.yesBalance.toString(), + noBalance: pos.noBalance.toString(), + costBasis: pos.costBasis.toString(), + })); + } + getInventory() { - const aggregate = { yes: 0, no: 0 }; + const aggregate = { yes: 0, no: 0, ammYes: 0, ammNo: 0 }; for (const exposure of this.exposureByChain.values()) { aggregate.yes += exposure.yes; aggregate.no += exposure.no; } + for (const pos of this.ammPositions.values()) { + aggregate.ammYes += Number(pos.yesBalance); + aggregate.ammNo += Number(pos.noBalance); + } return aggregate; } @@ -2735,6 +3360,15 @@ export class CrossChainMarketMaker { solanaRpcUrl: runtime?.rpcUrl ?? null, solanaLastSuccessfulRpcAt: this.lastSuccessfulSolanaRpcAt, solanaLastTxSignature: this.lastSolanaTxSignature, + ammEnabled: this.ammEnabled, + ammSolanaEnabled: this.ammSolanaEnabled, + ammSolanaProgramId: this.solanaAmmRuntime?.ammProgramId.toBase58() ?? null, + ammEvmChains: Object.fromEntries( + this.evmAmmRuntimes.map((r) => [r.chainKey, r.enabled]), + ), + ammDeviationThresholdBps: this.ammConfig.deviationThresholdBps, + ammMaxTradeSize: this.ammConfig.maxTradeSize, + ammPositionCount: this.ammPositions.size, }; } } diff --git a/packages/market-maker-bot/src/simulate.ts b/packages/market-maker-bot/src/simulate.ts index e0f67567..0992959f 100644 --- a/packages/market-maker-bot/src/simulate.ts +++ b/packages/market-maker-bot/src/simulate.ts @@ -12,6 +12,14 @@ function sleep(ms: number): Promise { return new Promise((resolve) => setTimeout(resolve, ms)); } +type SimMode = "clob" | "amm" | "both"; + +function parseSimMode(): SimMode { + const raw = (process.env.SIM_MODE ?? "both").toLowerCase(); + if (raw === "clob" || raw === "amm" || raw === "both") return raw; + return "both"; +} + function bootstrapDefaults() { if (!process.env.EVM_PRIVATE_KEY) { process.env.EVM_PRIVATE_KEY = DEFAULT_DEV_PRIVATE_KEY; @@ -28,6 +36,14 @@ function bootstrapDefaults() { if (!process.env.SOLANA_RPC_URL) { process.env.SOLANA_RPC_URL = "http://127.0.0.1:8899"; } + + const simMode = parseSimMode(); + if (simMode === "clob") { + process.env.MM_ENABLE_AMM = "false"; + } else if (simMode === "amm") { + process.env.MM_ENABLE_AMM = "true"; + } + // "both" leaves MM_ENABLE_AMM at its default (true) } async function main() { @@ -47,14 +63,17 @@ async function main() { await sleep(delayMs); } + const simMode = parseSimMode(); const config = mm.getConfig(); const inventory = mm.getInventory(); const activeOrders = mm.getActiveOrders(); + const ammPositions = mm.getAmmPositions(); console.log("[simulate] Completed."); console.log( JSON.stringify( { + simMode, cycles, chainStatus: { bsc: config.bscEnabled, @@ -62,7 +81,11 @@ async function main() { avax: config.avaxEnabled, solana: config.solanaEnabled, }, + ammEnabled: config.ammEnabled, + ammSolanaEnabled: config.ammSolanaEnabled, + ammEvmChains: config.ammEvmChains, inventory, + ammPositions, activeOrderCount: activeOrders.length, }, null, @@ -70,12 +93,18 @@ async function main() { ), ); - if ( - !config.bscEnabled && - !config.baseEnabled && - !config.avaxEnabled && - !config.solanaEnabled - ) { + const hasClobChain = + config.bscEnabled || config.baseEnabled || config.avaxEnabled || config.solanaEnabled; + const hasAmmChain = + config.ammEnabled && (config.ammSolanaEnabled || Object.values(config.ammEvmChains ?? {}).some(Boolean)); + + if (simMode === "clob" && !hasClobChain) { + throw new Error("No CLOB chain endpoints were reachable"); + } + if (simMode === "amm" && !hasAmmChain) { + throw new Error("No AMM chain endpoints were reachable"); + } + if (simMode === "both" && !hasClobChain && !hasAmmChain) { throw new Error("No chain endpoints were reachable"); } } diff --git a/packages/market-maker-bot/src/solana-helpers.ts b/packages/market-maker-bot/src/solana-helpers.ts index ad2f0ee0..0ef1e812 100644 --- a/packages/market-maker-bot/src/solana-helpers.ts +++ b/packages/market-maker-bot/src/solana-helpers.ts @@ -95,3 +95,58 @@ export function findPriceLevelPda( marketProgramId, )[0]; } + +// --- AMM (lvr_amm) PDA helpers --- + +function betIdToBytes(betId: bigint): Buffer { + const buf = Buffer.alloc(8); + buf.writeBigUInt64LE(betId); + return buf; +} + +export function findAmmConfigPda(ammProgramId: PublicKey): PublicKey { + return PublicKey.findProgramAddressSync( + [Buffer.from("amm_config")], + ammProgramId, + )[0]; +} + +export function findAmmAdminStatePda(ammProgramId: PublicKey): PublicKey { + return PublicKey.findProgramAddressSync( + [Buffer.from("admin_state")], + ammProgramId, + )[0]; +} + +export function findAmmBetPda( + ammProgramId: PublicKey, + betId: bigint, + creator: PublicKey, +): PublicKey { + return PublicKey.findProgramAddressSync( + [Buffer.from("bet"), betIdToBytes(betId), creator.toBuffer()], + ammProgramId, + )[0]; +} + +export function findAmmMintYesPda( + ammProgramId: PublicKey, + betId: bigint, + creator: PublicKey, +): PublicKey { + return PublicKey.findProgramAddressSync( + [Buffer.from("mint_yes"), betIdToBytes(betId), creator.toBuffer()], + ammProgramId, + )[0]; +} + +export function findAmmMintNoPda( + ammProgramId: PublicKey, + betId: bigint, + creator: PublicKey, +): PublicKey { + return PublicKey.findProgramAddressSync( + [Buffer.from("mint_no"), betIdToBytes(betId), creator.toBuffer()], + ammProgramId, + )[0]; +} diff --git a/packages/market-maker-bot/src/storage/index.ts b/packages/market-maker-bot/src/storage/index.ts index cf2eb906..af3bf19e 100644 --- a/packages/market-maker-bot/src/storage/index.ts +++ b/packages/market-maker-bot/src/storage/index.ts @@ -3,6 +3,7 @@ import { createPostgresMarketMakerStateStore } from "./postgres.ts"; export { createInMemoryMarketMakerStateStore } from "./memory.ts"; export type { + AmmPositionRecord, ClaimBacklogItem, ClaimBacklogInput, ManagedOrderStatus, diff --git a/packages/market-maker-bot/src/storage/memory.ts b/packages/market-maker-bot/src/storage/memory.ts index 7b74e151..c738d271 100644 --- a/packages/market-maker-bot/src/storage/memory.ts +++ b/packages/market-maker-bot/src/storage/memory.ts @@ -1,4 +1,5 @@ import type { + AmmPositionRecord, ClaimBacklogInput, ClaimBacklogItem, MarketMakerStateStore, @@ -15,6 +16,7 @@ export class InMemoryMarketMakerStateStore implements MarketMakerStateStore { private readonly claimBacklog = new Map(); private readonly outbox = new Map(); private readonly cursors = new Map(); + private readonly ammPositions = new Map(); private nextOutboxId = 1; private nextEventId = 1; @@ -242,6 +244,14 @@ export class InMemoryMarketMakerStateStore implements MarketMakerStateStore { updatedAt, }); } + + async listAmmPositions(): Promise { + return [...this.ammPositions.values()]; + } + + async upsertAmmPosition(record: AmmPositionRecord): Promise { + this.ammPositions.set(record.positionKey, structuredClone(record)); + } } export function createInMemoryMarketMakerStateStore() { diff --git a/packages/market-maker-bot/src/storage/postgres.ts b/packages/market-maker-bot/src/storage/postgres.ts index 648f8a54..47851e2e 100644 --- a/packages/market-maker-bot/src/storage/postgres.ts +++ b/packages/market-maker-bot/src/storage/postgres.ts @@ -1,6 +1,7 @@ import { createRequire } from "node:module"; import type { + AmmPositionRecord, ClaimBacklogInput, ClaimBacklogItem, MarketMakerStateStore, @@ -81,6 +82,18 @@ CREATE TABLE IF NOT EXISTS outbox ( ); ALTER TABLE outbox ADD COLUMN IF NOT EXISTS lease_owner TEXT; ALTER TABLE outbox ADD COLUMN IF NOT EXISTS lease_expires_at BIGINT; +CREATE TABLE IF NOT EXISTS amm_positions ( + position_key TEXT PRIMARY KEY, + chain_key TEXT NOT NULL, + market_ref TEXT NOT NULL, + bet_id TEXT NOT NULL, + creator TEXT NOT NULL, + yes_balance TEXT NOT NULL DEFAULT '0', + no_balance TEXT NOT NULL DEFAULT '0', + cost_basis TEXT NOT NULL DEFAULT '0', + settled BOOLEAN NOT NULL DEFAULT FALSE, + updated_at BIGINT NOT NULL +); `; function parseOrderRecord(row: Record): OrderRecord { @@ -528,6 +541,51 @@ export class PostgresMarketMakerStateStore implements MarketMakerStateStore { [cursorKey, cursorValue, updatedAt], ); } + + async listAmmPositions(): Promise { + const result = await this.pool.query( + `SELECT * FROM amm_positions ORDER BY updated_at DESC`, + ); + return result.rows.map((row: Record) => ({ + positionKey: row.position_key, + chainKey: row.chain_key, + marketRef: row.market_ref, + betId: row.bet_id, + creator: row.creator, + yesBalance: row.yes_balance, + noBalance: row.no_balance, + costBasis: row.cost_basis, + settled: row.settled, + updatedAt: Number(row.updated_at), + })); + } + + async upsertAmmPosition(record: AmmPositionRecord): Promise { + await this.pool.query( + `INSERT INTO amm_positions ( + position_key, chain_key, market_ref, bet_id, creator, + yes_balance, no_balance, cost_basis, settled, updated_at + ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) + ON CONFLICT (position_key) DO UPDATE SET + yes_balance = EXCLUDED.yes_balance, + no_balance = EXCLUDED.no_balance, + cost_basis = EXCLUDED.cost_basis, + settled = EXCLUDED.settled, + updated_at = EXCLUDED.updated_at`, + [ + record.positionKey, + record.chainKey, + record.marketRef, + record.betId, + record.creator, + record.yesBalance, + record.noBalance, + record.costBasis, + record.settled, + record.updatedAt, + ], + ); + } } export function createPostgresMarketMakerStateStore(connectionString: string) { diff --git a/packages/market-maker-bot/src/storage/types.ts b/packages/market-maker-bot/src/storage/types.ts index f41e2cf4..bd7ee6f6 100644 --- a/packages/market-maker-bot/src/storage/types.ts +++ b/packages/market-maker-bot/src/storage/types.ts @@ -110,6 +110,19 @@ export type OutboxInput = Omit< lastError?: string | null; }; +export type AmmPositionRecord = { + positionKey: string; + chainKey: string; + marketRef: string; + betId: string; + creator: string; + yesBalance: string; + noBalance: string; + costBasis: string; + settled: boolean; + updatedAt: number; +}; + export type MarketMakerStateStore = { ensureReady(): Promise; close(): Promise; @@ -152,4 +165,6 @@ export type MarketMakerStateStore = { failOutbox(id: number, lastError: string, availableAt: number): Promise; getCursor(cursorKey: string): Promise; setCursor(cursorKey: string, cursorValue: string, updatedAt?: number): Promise; + listAmmPositions(): Promise; + upsertAmmPosition(record: AmmPositionRecord): Promise; }; From ca00f4f834b1f3790e0175ae8b95f7886ae00dd4 Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Fri, 20 Mar 2026 08:42:22 -0500 Subject: [PATCH 04/24] fix(chain-registry): propagate marketType in lifecycle record normalizer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without this, AMM markets were silently dropped when the frontend filtered by marketType — the field was present on the raw candidate but not forwarded through normalizePredictionMarketLifecycleRecord(). --- packages/hyperbet-chain-registry/src/index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/hyperbet-chain-registry/src/index.ts b/packages/hyperbet-chain-registry/src/index.ts index 322338e2..2afe410b 100644 --- a/packages/hyperbet-chain-registry/src/index.ts +++ b/packages/hyperbet-chain-registry/src/index.ts @@ -832,6 +832,9 @@ export function normalizePredictionMarketLifecycleRecord( txRef: typeof candidate.txRef === "string" ? candidate.txRef : null, syncedAt: normalizePredictionMarketTimestamp(candidate.syncedAt), metadata: normalizePredictionMarketLifecycleMetadata(candidate.metadata), + ...(candidate.marketType === "amm" || candidate.marketType === "clob" + ? { marketType: candidate.marketType } + : {}), }; } From fd69c55ae8c6b670894756db17436c09b2126859 Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Fri, 20 Mar 2026 08:42:30 -0500 Subject: [PATCH 05/24] fix(mm-bot): correct AMM ABI, WAD scaling, and position tracking - Use getMarketDetails() instead of individual reserve getters that don't exist on LvrMarket - Fix MarketState enum: RESOLVED is 4 not 3 (OPEN=0,CLOSED=1, PENDING=2,DISPUTED=3,RESOLVED=4) - Normalize WAD (1e18) token balances in exposure and inventory - Fix mUSD parseUnits from 6 to 18 decimals - Add lastStreamAtMs/lastOracleAtMs to AMM snapshot to prevent stale-stream circuit breaker trips - Read actual on-chain token balances after AMM trades --- packages/market-maker-bot/src/index.ts | 54 +++++++++++++++----------- 1 file changed, 32 insertions(+), 22 deletions(-) diff --git a/packages/market-maker-bot/src/index.ts b/packages/market-maker-bot/src/index.ts index 151a65d2..38fe8a72 100644 --- a/packages/market-maker-bot/src/index.ts +++ b/packages/market-maker-bot/src/index.ts @@ -225,11 +225,9 @@ const GOLD_AMM_ROUTER_ABI = [ const LVR_MARKET_ABI = [ "function state() view returns (uint8)", - "function outcome() view returns (uint256)", - "function deadline() view returns (uint256)", - "function liquidity() view returns (uint256)", - "function reserveYes() view returns (uint256)", - "function reserveNo() view returns (uint256)", + "function getMarketDetails() view returns (uint8, uint256, uint256, uint256, uint256, uint256, uint256, uint256)", + "function getPriceYes() view returns (uint256)", + "function getPriceNo() view returns (uint256)", "function yesToken() view returns (address)", "function noToken() view returns (address)", "function feeBps() view returns (uint256)", @@ -3159,19 +3157,12 @@ export class CrossChainMarketMaker { if (!marketAddress) return; const lvrMarket = new ethers.Contract(marketAddress, LVR_MARKET_ABI, runtime.provider); - const [stateRaw, reserveYesRaw, reserveNoRaw, liqRaw, deadlineRaw, isDynamic] = - await Promise.all([ - lvrMarket.state(), - lvrMarket.reserveYes(), - lvrMarket.reserveNo(), - lvrMarket.liquidity(), - lvrMarket.deadline(), - lvrMarket.isDynamic(), - ]); + const [stateRaw, deadlineRaw, , liqRaw, reserveYesRaw, reserveNoRaw] = + await lvrMarket.getMarketDetails(); - // state: 0=OPEN, 1=PENDING, 2=DISPUTED, 3=RESOLVED + // state: 0=OPEN, 1=CLOSED, 2=PENDING, 3=DISPUTED, 4=RESOLVED const marketState = Number(stateRaw); - if (marketState === 3) { + if (marketState === 4) { await this.evmAmmRedeem(runtime, marketAddress); return; } @@ -3188,6 +3179,7 @@ export class CrossChainMarketMaker { const posKey = `${runtime.chainKey}:${marketAddress}`; const existing = this.ammPositions.get(posKey); + const now = Date.now(); const snapshot: AmmMarketSnapshot = { chainKey: runtime.chainKey, lifecycleStatus: market.lifecycleStatus, @@ -3198,10 +3190,13 @@ export class CrossChainMarketMaker { reserveNo: Number(rn), liquidity: Number(l), betCloseTimeMs: Number(deadlineRaw) * 1000, - lastRpcAtMs: Date.now(), + lastStreamAtMs: now, // AMM uses on-chain state, no separate stream + lastOracleAtMs: now, + lastRpcAtMs: now, exposure: { - yes: Number(existing?.yesBalance ?? 0n), - no: Number(existing?.noBalance ?? 0n), + // Normalize WAD (1e18) token balances to human-readable units + yes: Number((existing?.yesBalance ?? 0n) / 1_000_000_000_000_000_000n), + no: Number((existing?.noBalance ?? 0n) / 1_000_000_000_000_000_000n), openYes: 0, openNo: 0, }, @@ -3214,7 +3209,7 @@ export class CrossChainMarketMaker { if (decision.action === "hold") return; - const amountBn = ethers.parseUnits(decision.amount.toString(), 6); // mUSD has 6 decimals + const amountBn = ethers.parseUnits(decision.amount.toString(), 18); // mUSD WAD (18 decimals) try { if (decision.action === "buy_yes" || decision.action === "buy_no") { @@ -3252,6 +3247,18 @@ export class CrossChainMarketMaker { } } + // Read actual token balances after trade + const [yesTokenAddr, noTokenAddr] = await Promise.all([ + lvrMarket.yesToken(), + lvrMarket.noToken(), + ]); + const yesToken = new ethers.Contract(yesTokenAddr, ERC20_ABI, runtime.provider); + const noToken = new ethers.Contract(noTokenAddr, ERC20_ABI, runtime.provider); + const [yesBal, noBal] = await Promise.all([ + yesToken.balanceOf(runtime.walletAddress), + noToken.balanceOf(runtime.walletAddress), + ]); + const pos: AmmPosition = existing ?? { chainKey: runtime.chainKey, marketRef: marketAddress, @@ -3262,6 +3269,8 @@ export class CrossChainMarketMaker { costBasis: 0n, settled: false, }; + pos.yesBalance = BigInt(yesBal.toString()); + pos.noBalance = BigInt(noBal.toString()); if (decision.action === "buy_yes" || decision.action === "buy_no") { pos.costBasis += BigInt(decision.amount); } @@ -3322,8 +3331,9 @@ export class CrossChainMarketMaker { aggregate.no += exposure.no; } for (const pos of this.ammPositions.values()) { - aggregate.ammYes += Number(pos.yesBalance); - aggregate.ammNo += Number(pos.noBalance); + // Normalize WAD (1e18) to human-readable + aggregate.ammYes += Number(pos.yesBalance / 1_000_000_000_000_000_000n); + aggregate.ammNo += Number(pos.noBalance / 1_000_000_000_000_000_000n); } return aggregate; } From d720cb779e6ed9ede28ec04b6d53d8882611c5ec Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Fri, 20 Mar 2026 08:42:38 -0500 Subject: [PATCH 06/24] feat(mm-bot): add local-sim e2e harness for CLOB+AMM on anvil Standalone simulation that deploys Oracle, GoldClob, and LvrMarket contracts to a local anvil, opens a duel, and runs the market maker against both CLOB and AMM markets with real on-chain transactions. Includes nonce tracker with invalidation for mixed forge/ethers deploys and try/catch resilience for cross-market nonce conflicts. --- packages/market-maker-bot/package.json | 2 + packages/market-maker-bot/src/local-sim.ts | 748 +++++++++++++++++++++ 2 files changed, 750 insertions(+) create mode 100644 packages/market-maker-bot/src/local-sim.ts diff --git a/packages/market-maker-bot/package.json b/packages/market-maker-bot/package.json index 7bd2add9..1255026a 100644 --- a/packages/market-maker-bot/package.json +++ b/packages/market-maker-bot/package.json @@ -13,6 +13,8 @@ "simulate:adversarial:seed-corpus": "tsx src/simulate-adversarial.ts --seed-corpus", "simulate:adversarial:replay-corpus": "tsx src/simulate-adversarial.ts --replay-corpus", "simulate:adversarial:ci": "bun run simulate:adversarial && bun run simulate:adversarial:gate", + "simulate:local": "tsx src/local-sim.ts", + "simulate:local:bsc": "tsx src/local-sim.ts --chain bsc", "smoke:runtime": "tsx src/runtime-smoke.ts", "smoke:runtime:bsc": "tsx src/runtime-smoke.ts --chain bsc", "smoke:runtime:avax": "tsx src/runtime-smoke.ts --chain avax", diff --git a/packages/market-maker-bot/src/local-sim.ts b/packages/market-maker-bot/src/local-sim.ts new file mode 100644 index 00000000..da896d43 --- /dev/null +++ b/packages/market-maker-bot/src/local-sim.ts @@ -0,0 +1,748 @@ +/** + * Local end-to-end MM simulator. + * + * Starts anvil, deploys Oracle + CLOB + MockUSD + AMM Router, creates both + * CLOB and AMM markets, spins up a stub API server, funds wallets, and runs + * the CrossChainMarketMaker through full market-making cycles on both market + * types. + * + * Usage: + * bun run src/local-sim.ts [--chain bsc] [--cycles 10] + */ +import { strict as assert } from "node:assert"; +import { createServer, type IncomingMessage, type ServerResponse } from "node:http"; +import { readFile } from "node:fs/promises"; +import { spawn, type ChildProcess } from "node:child_process"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; + +import { ethers } from "ethers"; +import type { BettingEvmChain } from "@hyperbet/chain-registry"; +import { createTestMarketMakerStateStore } from "./storage/index.ts"; + +// ─── Constants ─────────────────────────────────────────────────────────────── + +const ANVIL_PORT = 28545; +const ANVIL_RPC_URL = `http://127.0.0.1:${ANVIL_PORT}`; +const ANVIL_CHAIN_ID = 31337; + +const MARKET_KIND_DUEL_WINNER = 0; +const DUEL_STATUS_BETTING_OPEN = 2; +const BUY_SIDE = 1; +const SELL_SIDE = 2; +const ORDER_FLAG_GTC = 0x01; +const MAX_PRICE = 1000; +const SHARE_UNIT_SIZE = 1_000n; +const DISPUTE_WINDOW_SECONDS = 3_600; + +const DEFAULT_PRIVATE_KEYS = [ + "0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80", + "0x59c6995e998f97a5a0044966f0945382d7d46f71fbb8f7a1a5b2d3c6f90ad7d4", + "0x5de4111afa1a4b94908b95ad9b8e4f5ff3a5f9d1f0e8f8dd3c9a1f4f2b7c6d5e", + "0x7c852118294d6d4f0c3d1e4b4a1a278e6b8980c97c7c1b3e76aa87e3112e7854", + "0x47e179ec19748874f6b4b93b5e1f0a421c7b0f52ce6f5c4f0b1e4a962f8d8338", + "0x8b3a350cf5c34c9194ca3a545d8a7d3a8d2c2e0f28c52f4fb151797f63018e8d", + "0x92db14e403f6dc6cc99d4d1d5bf4d70e2e7a55d499c19de577f4d3e42c8f2b29", +] as const; + +// ─── Types ─────────────────────────────────────────────────────────────────── + +type Artifact = { + abi: readonly unknown[]; + bytecode: { object: string }; +}; + +type StubState = { + duelKey: string; + duelId: string; + marketStatus: "OPEN" | "LOCKED"; + phase: "FIGHTING" | "COUNTDOWN"; + betCloseTime: number; + updatedAt: number; + hpA: number; + hpB: number; + ammMarketAddress: string | null; +}; + +type RuntimeContract = ethers.Contract & Record; + +// ─── Helpers ───────────────────────────────────────────────────────────────── + +function parseArgs(): { chain: BettingEvmChain; cycles: number } { + const args = process.argv.slice(2); + const getValue = (flag: string, fallback: string) => { + const index = args.indexOf(flag); + if (index === -1) return fallback; + const value = args[index + 1]; + return value && !value.startsWith("--") ? value : fallback; + }; + const chain = getValue("--chain", "bsc").trim().toLowerCase(); + if (chain !== "bsc" && chain !== "base" && chain !== "avax") { + throw new Error(`unsupported chain ${chain}`); + } + return { + chain, + cycles: Math.max(1, parseInt(getValue("--cycles", "10"), 10) || 10), + }; +} + +type FullArtifact = Artifact & { + bytecode: Artifact["bytecode"] & { + linkReferences?: Record>; + }; +}; + +async function loadArtifact(relativePath: string): Promise { + const here = path.dirname(fileURLToPath(import.meta.url)); + const artifactPath = path.resolve(here, "../../evm-contracts/out", relativePath); + return JSON.parse(await readFile(artifactPath, "utf8")) as FullArtifact; +} + +/** + * Link library addresses into bytecode that has unresolved link references. + * Foundry uses `__$$__` placeholders. We extract the placeholder from + * the first known position then do a global string replace — this covers both + * the init code AND the embedded LvrMarket creation code in the runtime. + */ +function linkBytecode( + artifact: FullArtifact, + libraries: Record, +): string { + let bytecode = artifact.bytecode.object; + const refs = artifact.bytecode.linkReferences ?? {}; + for (const [filePath, libs] of Object.entries(refs)) { + for (const [libName, positions] of Object.entries(libs)) { + const key = `${filePath}:${libName}`; + const address = libraries[key]; + if (!address) { + throw new Error(`missing library address for ${key}`); + } + const addrHex = address.replace("0x", "").toLowerCase().padStart(40, "0"); + // Extract the placeholder string from the first known position + const firstPos = positions[0]; + const hexStart = 2 + firstPos.start * 2; + const placeholder = bytecode.slice(hexStart, hexStart + 40); + // Replace ALL occurrences globally (init code + embedded runtime) + bytecode = bytecode.replaceAll(placeholder, addrHex); + } + } + return bytecode; +} + +function duelKey(label: string): string { + return ethers.keccak256(ethers.toUtf8Bytes(label)); +} + +function participantHash(label: string): string { + return ethers.keccak256(ethers.toUtf8Bytes(label)); +} + +function quoteCost(side: number, price: number, amount: bigint): bigint { + const component = BigInt(side === BUY_SIDE ? price : MAX_PRICE - price); + return (amount * component) / BigInt(MAX_PRICE); +} + +function sleep(ms: number): Promise { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +// ─── Anvil ─────────────────────────────────────────────────────────────────── + +async function startAnvil(): Promise { + // Kill any stale anvil on this port + try { + const { execSync } = await import("node:child_process"); + const pids = execSync(`lsof -tiTCP:${ANVIL_PORT} -sTCP:LISTEN 2>/dev/null || true`, { + encoding: "utf8", + }).trim(); + for (const pid of pids.split("\n").filter(Boolean)) { + try { process.kill(parseInt(pid, 10)); } catch {} + } + } catch {} + + console.log(`[local-sim] starting anvil on port ${ANVIL_PORT}...`); + const anvil = spawn("anvil", [ + "--silent", + "--accounts", "20", + "--host", "127.0.0.1", + "--port", String(ANVIL_PORT), + "--chain-id", String(ANVIL_CHAIN_ID), + ], { stdio: "ignore" }); + + // Wait for RPC readiness + for (let i = 0; i < 60; i++) { + try { + const response = await fetch(ANVIL_RPC_URL, { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify({ jsonrpc: "2.0", method: "eth_blockNumber", params: [], id: 1 }), + }); + const json = await response.json() as any; + if (json.result) { + console.log("[local-sim] anvil ready"); + return anvil; + } + } catch {} + await sleep(500); + } + anvil.kill(); + throw new Error("anvil did not become ready within 30s"); +} + +// ─── Stub API Server ───────────────────────────────────────────────────────── + +function sendJson(res: ServerResponse, payload: unknown) { + res.statusCode = 200; + res.setHeader("content-type", "application/json"); + res.end(JSON.stringify(payload)); +} + +async function startStubServer( + chain: BettingEvmChain, + state: StubState, +): Promise<{ apiUrl: string; duelUrl: string; close: () => Promise }> { + const server = createServer((req: IncomingMessage, res: ServerResponse) => { + const url = new URL(req.url || "/", "http://127.0.0.1"); + + if (url.pathname === "/api/arena/prediction-markets/active") { + const markets: any[] = [ + // CLOB market + { + chainKey: chain, + duelKey: state.duelKey, + duelId: state.duelId, + marketId: `${chain}-${state.duelId}`, + marketRef: null, + lifecycleStatus: state.marketStatus, + winner: "NONE", + betCloseTime: state.betCloseTime, + contractAddress: null, + programId: null, + txRef: null, + syncedAt: state.updatedAt, + marketType: "clob", + }, + ]; + + // AMM market (if deployed) + if (state.ammMarketAddress) { + markets.push({ + chainKey: chain, + duelKey: state.duelKey, + duelId: state.duelId, + marketId: `${chain}-amm-${state.duelId}`, + marketRef: state.ammMarketAddress, + lifecycleStatus: state.marketStatus, + winner: "NONE", + betCloseTime: state.betCloseTime, + contractAddress: state.ammMarketAddress, + programId: null, + txRef: null, + syncedAt: state.updatedAt, + marketType: "amm", + }); + } + + sendJson(res, { + duel: { + duelKey: state.duelKey, + duelId: state.duelId, + phase: state.phase, + betCloseTime: state.betCloseTime, + }, + markets, + updatedAt: state.updatedAt, + }); + return; + } + + if (url.pathname === "/api/streaming/state") { + sendJson(res, { + cycle: { + phase: state.phase, + agent1: { hp: state.hpA, maxHp: 100 }, + agent2: { hp: state.hpB, maxHp: 100 }, + }, + }); + return; + } + + res.statusCode = 404; + res.end("not found"); + }); + + await new Promise((resolve, reject) => { + server.once("error", reject); + server.listen(0, "127.0.0.1", () => resolve()); + }); + const address = server.address(); + if (!address || typeof address === "string") { + throw new Error("failed to bind stub server"); + } + const baseUrl = `http://127.0.0.1:${address.port}`; + return { + apiUrl: `${baseUrl}/api/arena/prediction-markets/active`, + duelUrl: `${baseUrl}/api/streaming/state`, + close: async () => + await new Promise((resolve, reject) => { + server.close((error) => (error ? reject(error) : resolve())); + }), + }; +} + +// ─── Deploy Contracts ──────────────────────────────────────────────────────── + +function createNonceTracker(provider: ethers.JsonRpcProvider) { + const nextNonceByAddress = new Map(); + const tracker = async (address: string) => { + const normalized = address.toLowerCase(); + const cached = nextNonceByAddress.get(normalized); + if (cached != null) { + nextNonceByAddress.set(normalized, cached + 1); + return cached; + } + const fresh = await provider.getTransactionCount(address, "latest"); + nextNonceByAddress.set(normalized, fresh + 1); + return fresh; + }; + tracker.invalidate = (address: string) => { + nextNonceByAddress.delete(address.toLowerCase()); + }; + return tracker; +} + +async function deployContracts(provider: ethers.JsonRpcProvider, chain: BettingEvmChain) { + const [admin, operator, reporter, treasury, marketMakerFeeSink, trader, botSigner] = + DEFAULT_PRIVATE_KEYS.map((pk) => new ethers.Wallet(pk, provider)); + const finalizer = await provider.getSigner(7); + const challenger = await provider.getSigner(8); + const nextNonce = createNonceTracker(provider); + + // Fund actors + const actors = [ + operator.address, + reporter.address, + await finalizer.getAddress(), + await challenger.getAddress(), + treasury.address, + marketMakerFeeSink.address, + trader.address, + botSigner.address, + ]; + console.log("[local-sim] funding wallets..."); + for (const addr of actors) { + await admin.sendTransaction({ + to: addr, + value: ethers.parseEther("50"), + nonce: await nextNonce(admin.address), + }); + } + + // Deploy DuelOutcomeOracle + console.log("[local-sim] deploying DuelOutcomeOracle..."); + const oracleArtifact = await loadArtifact("DuelOutcomeOracle.sol/DuelOutcomeOracle.json"); + const oracleFactory = new ethers.ContractFactory( + oracleArtifact.abi, + oracleArtifact.bytecode.object, + admin, + ); + const oracle = (await oracleFactory.deploy( + admin.address, + reporter.address, + await finalizer.getAddress(), + await challenger.getAddress(), + admin.address, + DISPUTE_WINDOW_SECONDS, + { nonce: await nextNonce(admin.address) }, + )) as RuntimeContract; + await oracle.waitForDeployment(); + console.log(`[local-sim] Oracle: ${await oracle.getAddress()}`); + + // Deploy GoldClob + console.log("[local-sim] deploying GoldClob..."); + const clobArtifact = await loadArtifact("GoldClob.sol/GoldClob.json"); + const clobFactory = new ethers.ContractFactory( + clobArtifact.abi, + clobArtifact.bytecode.object, + admin, + ); + const clob = (await clobFactory.deploy( + admin.address, + operator.address, + await oracle.getAddress(), + treasury.address, + marketMakerFeeSink.address, + admin.address, + { nonce: await nextNonce(admin.address) }, + )) as RuntimeContract; + await clob.waitForDeployment(); + console.log(`[local-sim] CLOB: ${await clob.getAddress()}`); + + // Deploy MockUSD + console.log("[local-sim] deploying MockUSD..."); + const musdArtifact = await loadArtifact("MockUSD.sol/MockUSD.json"); + const musdFactory = new ethers.ContractFactory( + musdArtifact.abi, + musdArtifact.bytecode.object, + admin, + ); + const musd = (await musdFactory.deploy({ + nonce: await nextNonce(admin.address), + })) as RuntimeContract; + await musd.waitForDeployment(); + console.log(`[local-sim] MockUSD: ${await musd.getAddress()}`); + + // Deploy AMM contracts via forge (handles library linking at compile time) + console.log("[local-sim] deploying AMM Router via forge..."); + const { execSync } = await import("node:child_process"); + const evmContractsDir = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + "../../evm-contracts", + ); + const musdAddress = await musd.getAddress(); + const forgeEnv = { ...process.env, PATH: `/opt/homebrew/bin:${process.env.HOME}/.bun/bin:${process.env.PATH}` }; + + // Deploy Math library + const mathOut = execSync( + `forge create contracts/lvr_amm/lib/Math.sol:Math --rpc-url ${ANVIL_RPC_URL} --private-key ${admin.privateKey} --broadcast --json`, + { cwd: evmContractsDir, env: forgeEnv, encoding: "utf8" }, + ); + const mathAddr = JSON.parse(mathOut).deployedTo; + console.log(`[local-sim] Math: ${mathAddr}`); + + // Deploy SwapMath library + const swapOut = execSync( + `forge create contracts/lvr_amm/lib/SwapMath.sol:SwapMath --rpc-url ${ANVIL_RPC_URL} --private-key ${admin.privateKey} --broadcast --json`, + { cwd: evmContractsDir, env: forgeEnv, encoding: "utf8" }, + ); + const swapMathAddr = JSON.parse(swapOut).deployedTo; + console.log(`[local-sim] SwapMath: ${swapMathAddr}`); + + // Deploy Router with linked libraries + const routerOut = execSync( + `forge create contracts/lvr_amm/Router.sol:Router` + + ` --rpc-url ${ANVIL_RPC_URL}` + + ` --private-key ${admin.privateKey}` + + ` --broadcast --json` + + ` --libraries contracts/lvr_amm/lib/Math.sol:Math:${mathAddr}` + + ` --libraries contracts/lvr_amm/lib/SwapMath.sol:SwapMath:${swapMathAddr}` + + ` --constructor-args ${musdAddress} ${treasury.address} 200 ${admin.address}`, + { cwd: evmContractsDir, env: forgeEnv, encoding: "utf8" }, + ); + const routerAddress = JSON.parse(routerOut).deployedTo; + console.log(`[local-sim] Router: ${routerAddress}`); + + // Forge used admin's nonces directly — invalidate cached nonce so ethers re-fetches + nextNonce.invalidate(admin.address); + + // Create ethers contract instances for the Router and MockUSD + const routerArtifact = await loadArtifact("Router.sol/Router.json"); + const router = new ethers.Contract(routerAddress, routerArtifact.abi, admin) as RuntimeContract; + + // Mint mUSD to admin, trader, and bot for AMM trading + const mintAmount = ethers.parseUnits("1000000", 18); // 1M mUSD + for (const addr of [admin.address, trader.address, botSigner.address]) { + await musd.mint(addr, mintAmount, { nonce: await nextNonce(admin.address) }); + } + console.log("[local-sim] minted mUSD to admin, trader, bot"); + + // Approve Router to spend admin's mUSD (for market creation) + await musd.approve(await router.getAddress(), ethers.MaxUint256, { + nonce: await nextNonce(admin.address), + }); + + // Approve Router for bot signer too + const musdBot = musd.connect(botSigner) as RuntimeContract; + await musdBot.approve(await router.getAddress(), ethers.MaxUint256, { + nonce: await nextNonce(botSigner.address), + }); + + return { + admin, + operator, + reporter, + treasury, + marketMakerFeeSink, + trader, + botSigner, + finalizer, + challenger, + oracle, + clob, + musd, + router, + nextNonce, + }; +} + +// ─── Create Markets ────────────────────────────────────────────────────────── + +async function createMarkets( + contracts: Awaited>, + provider: ethers.JsonRpcProvider, + chain: BettingEvmChain, +) { + const { admin, operator, reporter, oracle, clob, router, nextNonce } = contracts; + const oracleReporter = oracle.connect(reporter) as RuntimeContract; + const clobOperator = clob.connect(operator) as RuntimeContract; + + const duel = duelKey(`local-sim-${chain}`); + const duelId = `${chain}-local-sim`; + const participantA = participantHash("agent-alpha"); + const participantB = participantHash("agent-beta"); + const latestBlock = await provider.getBlock("latest"); + const now = BigInt(latestBlock?.timestamp ?? Math.floor(Date.now() / 1000)); + + // Create CLOB duel + market + console.log("[local-sim] creating CLOB duel + market..."); + await oracleReporter.upsertDuel( + duel, + participantA, + participantB, + now, + now + 600n, // betCloseTs 10 min from now + now + 1200n, + `local://${chain}-local-sim`, + DUEL_STATUS_BETTING_OPEN, + { nonce: await nextNonce(reporter.address) }, + ); + await clobOperator.createMarketForDuel(duel, MARKET_KIND_DUEL_WINNER, { + nonce: await nextNonce(operator.address), + }); + console.log(`[local-sim] CLOB market created for duel ${duel.slice(0, 10)}...`); + + // Create AMM market via Router + console.log("[local-sim] creating AMM market via Router..."); + const collateral = ethers.parseUnits("10000", 18); // 10k mUSD initial liquidity + const duration = 600; // 10 minutes + + const tx = await router.create( + "Local Sim Market", + "Test market for local simulation", + "local://sim", + false, // static liquidity (simpler) + duration, + collateral, + { nonce: await nextNonce(admin.address) }, + ); + const receipt = await tx.wait(); + + // Extract AMM market address from MarketCreated event + const routerInterface = router.interface; + let ammMarketAddress: string | null = null; + for (const log of receipt.logs) { + try { + const parsed = routerInterface.parseLog({ topics: log.topics as string[], data: log.data }); + if (parsed?.name === "MarketCreated") { + ammMarketAddress = parsed.args.market; + break; + } + } catch {} + } + + if (!ammMarketAddress) { + // Fallback: query getAllMarkets + const allMarkets = await router.getAllMarkets(); + ammMarketAddress = allMarkets[allMarkets.length - 1]; + } + console.log(`[local-sim] AMM market: ${ammMarketAddress}`); + + // Verify AMM market is readable via getMarketDetails() + const lvrMarket = new ethers.Contract(ammMarketAddress!, [ + "function getMarketDetails() view returns (uint8, uint256, uint256, uint256, uint256, uint256, uint256, uint256)", + "function getPriceYes() view returns (uint256)", + "function yesToken() view returns (address)", + "function noToken() view returns (address)", + "function state() view returns (uint8)", + "function isDynamic() view returns (bool)", + ], provider); + + const [state, marketDeadline, outcome, liquidity, reserveYes, reserveNo, priceYes, priceNo] = + await lvrMarket.getMarketDetails(); + + console.log(`[local-sim] AMM state: ${state}, isDynamic: ${await lvrMarket.isDynamic()}`); + console.log(`[local-sim] AMM reserves: yes=${ethers.formatUnits(reserveYes, 18)}, no=${ethers.formatUnits(reserveNo, 18)}`); + console.log(`[local-sim] AMM liquidity: ${ethers.formatUnits(liquidity, 18)}`); + console.log(`[local-sim] AMM priceYes: ${ethers.formatUnits(priceYes, 18)}, priceNo: ${ethers.formatUnits(priceNo, 18)}`); + console.log(`[local-sim] AMM deadline: ${new Date(Number(marketDeadline) * 1000).toISOString()}`); + + return { + duel, + duelId, + ammMarketAddress: ammMarketAddress!, + betCloseTime: Number(now + 600n) * 1000, + }; +} + +// ─── Main ──────────────────────────────────────────────────────────────────── + +async function main() { + const { chain, cycles } = parseArgs(); + let anvil: ChildProcess | null = null; + let stubServer: { close: () => Promise } | null = null; + + try { + // Start anvil + anvil = await startAnvil(); + const provider = new ethers.JsonRpcProvider(ANVIL_RPC_URL); + + // Deploy all contracts + const contracts = await deployContracts(provider, chain); + + // Create CLOB + AMM markets + const { duel, duelId, ammMarketAddress, betCloseTime } = await createMarkets( + contracts, + provider, + chain, + ); + + // Start stub API server + const stubState: StubState = { + duelKey: duel, + duelId, + marketStatus: "OPEN", + phase: "FIGHTING", + betCloseTime, + updatedAt: Date.now(), + hpA: 85, + hpB: 40, + ammMarketAddress, + }; + const stub = await startStubServer(chain, stubState); + stubServer = stub; + + // Configure environment for MM bot + const chainUpper = chain.toUpperCase(); + process.env.MM_ENV = "testnet"; + process.env.EVM_PRIVATE_KEY = contracts.botSigner.privateKey; + process.env.MM_ENABLE_BSC = chain === "bsc" ? "true" : "false"; + process.env.MM_ENABLE_BASE = chain === "base" ? "true" : "false"; + process.env.MM_ENABLE_AVAX = chain === "avax" ? "true" : "false"; + process.env.MM_ENABLE_SOLANA = "false"; + process.env.MM_MARKETS_CACHE_MS = "0"; + process.env.MM_DUEL_SIGNAL_CACHE_MS = "0"; + process.env.MM_DUEL_SIGNAL_FETCH_TIMEOUT_MS = "500"; + process.env.CANCEL_STALE_AGE_MS = "1000"; + process.env.ORDER_SIZE_MIN = "50"; + process.env.ORDER_SIZE_MAX = "100"; + process.env.MM_PREDICTION_MARKETS_API_URL = stub.apiUrl; + process.env.MM_DUEL_STATE_API_URL = stub.duelUrl; + process.env[`EVM_${chainUpper}_RPC_URL`] = ANVIL_RPC_URL; + process.env[`CLOB_CONTRACT_ADDRESS_${chainUpper}`] = await contracts.clob.getAddress(); + process.env[`${chainUpper}_DUEL_ORACLE_ADDRESS`] = await contracts.oracle.getAddress(); + + // AMM env vars + process.env.MM_ENABLE_AMM = "true"; + process.env.MM_ENABLE_AMM_SOLANA = "false"; + process.env[`AMM_ROUTER_ADDRESS_${chainUpper}`] = await contracts.router.getAddress(); + process.env[`MUSD_TOKEN_ADDRESS_${chainUpper}`] = await contracts.musd.getAddress(); + process.env.MM_AMM_DEVIATION_THRESHOLD_BPS = "100"; // Lower threshold for testing + process.env.MM_AMM_MAX_TRADE_SIZE = "100000"; + process.env.MM_AMM_MIN_TRADE_SIZE = "1000"; + process.env.MM_AMM_MAX_POSITION_SIZE = "500000"; + + // Import and create MM bot + const { CrossChainMarketMaker } = await import("./index.ts"); + const mm = new CrossChainMarketMaker({ + stateStore: createTestMarketMakerStateStore(), + }); + + console.log(`\n[local-sim] ═══ Running ${cycles} market-making cycles ═══\n`); + + const config = mm.getConfig(); + console.log("[local-sim] Config:", JSON.stringify({ + chain, + clobEnabled: (config as any)[`${chain}Enabled`], + ammEnabled: config.ammEnabled, + ammEvmChains: config.ammEvmChains, + }, null, 2)); + + for (let i = 0; i < cycles; i++) { + console.log(`\n[local-sim] ─── Cycle ${i + 1}/${cycles} ───`); + + // Vary HP signal to create fair value changes → trigger AMM trades + stubState.hpA = Math.max(10, Math.min(95, 85 - i * 5 + Math.floor(Math.random() * 10))); + stubState.hpB = Math.max(10, Math.min(95, 40 + i * 3 + Math.floor(Math.random() * 10))); + stubState.updatedAt = Date.now(); + + try { + await mm.marketMakeCycle(); + } catch (cycleErr: any) { + console.warn(`[local-sim] cycle error (non-fatal): ${cycleErr.message?.slice(0, 120)}`); + } + + const activeOrders = mm.getActiveOrders().filter((o: any) => o.chainKey === chain); + const ammPositions = mm.getAmmPositions(); + const inventory = mm.getInventory(); + + console.log(`[local-sim] HP: A=${stubState.hpA}, B=${stubState.hpB}`); + console.log(`[local-sim] CLOB orders: ${activeOrders.length}`); + if (activeOrders.length > 0) { + for (const order of activeOrders) { + console.log(` ${order.side === SELL_SIDE ? "ASK" : "BID"} price=${order.price} amount=${order.amount}`); + } + } + console.log(`[local-sim] AMM positions: ${ammPositions.length}`); + for (const pos of ammPositions) { + console.log(` ${pos.chainKey} yes=${pos.yesBalance} no=${pos.noBalance} cost=${pos.costBasis}`); + } + console.log(`[local-sim] Inventory: yes=${inventory.yes}, no=${inventory.no}, ammYes=${inventory.ammYes}, ammNo=${inventory.ammNo}`); + + await sleep(200); + } + + // Read on-chain AMM state after trading + const lvrMarket = new ethers.Contract(ammMarketAddress, [ + "function getMarketDetails() view returns (uint8, uint256, uint256, uint256, uint256, uint256, uint256, uint256)", + ], provider); + + const [, , , finalLiquidity, finalReserveYes, finalReserveNo] = + await lvrMarket.getMarketDetails(); + + console.log(`\n[local-sim] ═══ Final State ═══`); + console.log(`[local-sim] AMM reserves: yes=${ethers.formatUnits(finalReserveYes, 18)}, no=${ethers.formatUnits(finalReserveNo, 18)}`); + console.log(`[local-sim] AMM liquidity: ${ethers.formatUnits(finalLiquidity, 18)}`); + + const finalConfig = mm.getConfig(); + const finalInventory = mm.getInventory(); + const finalOrders = mm.getActiveOrders(); + const finalAmm = mm.getAmmPositions(); + + console.log( + JSON.stringify( + { + ok: true, + chain, + cycles, + duel: duel.slice(0, 18) + "...", + ammMarket: ammMarketAddress, + clobOrders: finalOrders.length, + ammPositions: finalAmm.length, + inventory: finalInventory, + ammFinalReserves: { + yes: ethers.formatUnits(finalReserveYes, 18), + no: ethers.formatUnits(finalReserveNo, 18), + }, + config: { + ammEnabled: finalConfig.ammEnabled, + ammEvmChains: finalConfig.ammEvmChains, + }, + }, + null, + 2, + ), + ); + } finally { + if (stubServer) await stubServer.close(); + if (anvil) { + anvil.kill(); + console.log("[local-sim] anvil stopped"); + } + } +} + +main().catch((error) => { + console.error(`[local-sim] fatal: ${(error as Error).message}`); + console.error((error as Error).stack); + process.exit(1); +}); From 70fb6dd4d836861c74c14264cdaa5db6c7468b87 Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Fri, 20 Mar 2026 08:42:50 -0500 Subject: [PATCH 07/24] feat(sim-dashboard): add Game API compatibility layer for betting frontend MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add SSE and HTTP endpoints that translate simulation state into the format the Vite+React betting frontend expects, so starting the sim dashboard drives the real UI (order book, fight overlay, trades). Endpoints added: - GET /api/config — contract addresses, RPC, chain info - GET /api/streaming/state/events — SSE with StreamingStateUpdate - GET /api/streaming/state — poll fallback - GET /api/streaming/duel-context — agent HP, phase, timing - GET /api/arena/prediction-markets/active — market lifecycle Also adds CORS headers and OPTIONS preflight handling on all /api/* routes for cross-origin frontend access. --- packages/simulation-dashboard/src/server.ts | 235 ++++++++++++++++++++ 1 file changed, 235 insertions(+) diff --git a/packages/simulation-dashboard/src/server.ts b/packages/simulation-dashboard/src/server.ts index a36c4b25..68e0efac 100644 --- a/packages/simulation-dashboard/src/server.ts +++ b/packages/simulation-dashboard/src/server.ts @@ -230,6 +230,124 @@ let closeGuardTripsSeen = 0; let circuitBreakerTripsSeen = 0; let scenarioMarketLocked = false; let lastComputedState: Record | null = null; + +// ─── Game API compatibility (SSE + HTTP for betting frontend) ──────────────── +const sseClients = new Set(); +let simStartedAtMs = Date.now(); +let duelOpenedAtMs = Date.now(); +let lastStreamingState: Record | null = null; + +function buildStreamingStateUpdate(): Record { + const state = lastComputedState; + const now = Date.now(); + const marketStatus = state?.market?.status ?? 0; + + // Map sim market status to streaming phase + let phase: string; + if (!state || marketStatus === 0) { + phase = "IDLE"; + } else if (marketStatus === MARKET_STATUS_RESOLVED || marketStatus === MARKET_STATUS_CANCELLED) { + phase = "RESOLUTION"; + } else { + phase = "FIGHTING"; + } + + // Synthesize agent HP from sim tick progress + const tickProgress = Math.min(1, simTick / Math.max(1, 200)); // ~200 ticks typical scenario + const winner = state?.market?.winner ?? 0; + const isResolved = marketStatus === MARKET_STATUS_RESOLVED || marketStatus === MARKET_STATUS_CANCELLED; + let hp1 = 100; + let hp2 = 100; + if (isResolved) { + hp1 = winner === 1 ? Math.max(10, Math.round(100 - tickProgress * 40)) : 0; + hp2 = winner === 2 ? Math.max(10, Math.round(100 - tickProgress * 40)) : 0; + if (winner === 0) { hp1 = 0; hp2 = 0; } // cancelled + } else if (simRunning) { + // Both lose HP proportional to progress, leader stays ahead + const bestBid = state?.market?.bestBid ?? 500; + const edge = (bestBid - 500) / 500; // positive = agent1 favored + hp1 = Math.max(5, Math.round(100 - tickProgress * (40 - edge * 20))); + hp2 = Math.max(5, Math.round(100 - tickProgress * (40 + edge * 20))); + } + + const label = currentDuelLabel || "sim-duel-0"; + const parts = label.split("-"); + const duelId = `sim-${duelCounter}`; + const betCloseMs = duelOpenedAtMs + 604800 * 1000; // matches the 1-week window + + const update = { + type: "STREAMING_STATE_UPDATE", + cycle: { + cycleId: duelId, + phase, + cycleStartTime: simStartedAtMs, + phaseStartTime: duelOpenedAtMs, + phaseEndTime: betCloseMs, + timeRemaining: Math.max(0, Math.round((betCloseMs - now) / 1000)), + agent1: { + id: "agent-alpha", + name: "Agent Alpha", + provider: "Simulation", + model: "v1", + hp: hp1, + maxHp: 100, + combatLevel: 1, + wins: 0, + losses: 0, + damageDealtThisFight: 100 - hp2, + }, + agent2: { + id: "agent-beta", + name: "Agent Beta", + provider: "Simulation", + model: "v1", + hp: hp2, + maxHp: 100, + combatLevel: 1, + wins: 0, + losses: 0, + damageDealtThisFight: 100 - hp1, + }, + duelId, + duelKeyHex: currentDuelKey || null, + betOpenTime: duelOpenedAtMs, + betCloseTime: betCloseMs, + fightStartTime: duelOpenedAtMs, + duelEndTime: isResolved ? now : null, + winnerId: isResolved && winner === 1 ? "agent-alpha" : isResolved && winner === 2 ? "agent-beta" : null, + winnerName: isResolved && winner === 1 ? "Agent Alpha" : isResolved && winner === 2 ? "Agent Beta" : null, + winReason: isResolved ? "simulation" : null, + countdown: null, + seed: null, + replayHash: null, + }, + leaderboard: [], + cameraTarget: null, + seq: simTick, + emittedAt: now, + }; + lastStreamingState = update; + return update; +} + +function broadcastSse(): void { + if (sseClients.size === 0) return; + const update = buildStreamingStateUpdate(); + const frame = `event: state\ndata: ${JSON.stringify(update)}\n\n`; + for (const res of sseClients) { + try { + res.write(frame); + } catch { + sseClients.delete(res); + } + } +} + +function writeCorsHeaders(res: ServerResponse): void { + res.setHeader("Access-Control-Allow-Origin", "*"); + res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS"); + res.setHeader("Access-Control-Allow-Headers", "Content-Type, Cache-Control, Last-Event-ID"); +} let lastObservedMarketState: CachedMarketState | null = null; let lastObservedProtocolMmBalance: bigint | null = null; let lastObservedRuntimeMmBalance: bigint | null = null; @@ -1430,6 +1548,7 @@ async function openNewDuel(): Promise { currentDuelLabel = `sim-duel-${duelCounter}`; currentDuelKey = duelKey(currentDuelLabel); currentScenarioId = "manual"; + duelOpenedAtMs = Date.now(); resetScenarioMetrics(); const reporter = reporterSigner ?? (await provider.getSigner(2)); @@ -3267,6 +3386,8 @@ function broadcast(msg: any): void { ws.send(payload); } } + // Also push to SSE clients for the betting frontend + broadcastSse(); } function handleWsMessage(data: string): void { @@ -3400,6 +3521,7 @@ function writeJson( statusCode: number, payload: unknown, ): void { + writeCorsHeaders(res); res.writeHead(statusCode, { "Content-Type": "application/json", "Cache-Control": "no-cache", @@ -3416,6 +3538,119 @@ async function handleHttpRequest( `http://${req.headers.host ?? `127.0.0.1:${HTTP_PORT}`}`, ); + // ─── CORS preflight ────────────────────────────────────────────────────── + if (req.method === "OPTIONS") { + writeCorsHeaders(res); + res.writeHead(204); + res.end(); + return; + } + + // ─── Game API compatibility endpoints (for betting frontend) ───────────── + + if (requestUrl.pathname === "/api/config") { + writeJson(res, 200, { + chainId: 31337, + rpcUrl: `http://127.0.0.1:${ANVIL_PORT}`, + clobAddress: clobAddr, + oracleAddress: oracleAddr, + duelKey: currentDuelKey, + duelLabel: currentDuelLabel, + marketKey: currentMarketKey, + }); + return; + } + + if (requestUrl.pathname === "/api/streaming/state/events") { + writeCorsHeaders(res); + res.writeHead(200, { + "Content-Type": "text/event-stream", + "Cache-Control": "no-cache", + Connection: "keep-alive", + }); + // Send current state immediately + const current = buildStreamingStateUpdate(); + res.write(`event: state\ndata: ${JSON.stringify(current)}\n\n`); + sseClients.add(res); + req.on("close", () => { + sseClients.delete(res); + }); + return; + } + + if (requestUrl.pathname === "/api/streaming/state") { + const state = lastStreamingState ?? buildStreamingStateUpdate(); + writeJson(res, 200, state); + return; + } + + if (requestUrl.pathname === "/api/streaming/duel-context") { + const ss = lastStreamingState ?? buildStreamingStateUpdate(); + const cycle = ss.cycle ?? {}; + // useDuelContext expects { type, cycle: {...}, leaderboard, cameraTarget } + writeJson(res, 200, { + type: "STREAMING_DUEL_CONTEXT", + cycle: { + ...cycle, + agent1: cycle.agent1 ? { ...cycle.agent1, inventory: [], monologues: [] } : null, + agent2: cycle.agent2 ? { ...cycle.agent2, inventory: [], monologues: [] } : null, + }, + leaderboard: ss.leaderboard ?? [], + cameraTarget: ss.cameraTarget ?? null, + }); + return; + } + + if (requestUrl.pathname === "/api/arena/prediction-markets/active") { + const now = Date.now(); + const ss = lastStreamingState ?? buildStreamingStateUpdate(); + const cycle = ss.cycle ?? {}; + const marketStatus = lastComputedState?.market?.status ?? 0; + const isResolved = marketStatus === MARKET_STATUS_RESOLVED || marketStatus === MARKET_STATUS_CANCELLED; + const winner = lastComputedState?.market?.winner ?? 0; + + let lifecycleStatus = "IDLE"; + if (marketStatus === 1) lifecycleStatus = "OPEN"; + else if (marketStatus === 2) lifecycleStatus = "LOCKED"; + else if (marketStatus === MARKET_STATUS_RESOLVED) lifecycleStatus = "RESOLVED"; + else if (marketStatus === MARKET_STATUS_CANCELLED) lifecycleStatus = "CANCELLED"; + + let winnerStr = "NONE"; + if (isResolved && winner === 1) winnerStr = "A"; + else if (isResolved && winner === 2) winnerStr = "B"; + + writeJson(res, 200, { + duel: { + duelKey: currentDuelKey || null, + duelId: cycle.duelId ?? `sim-${duelCounter}`, + phase: cycle.phase ?? "IDLE", + winner: isResolved ? winnerStr : null, + betCloseTime: cycle.betCloseTime ?? null, + }, + markets: [ + { + chainKey: "bsc", + duelKey: currentDuelKey || null, + duelId: cycle.duelId ?? `sim-${duelCounter}`, + marketId: `sim-bsc-${duelCounter}`, + marketRef: currentMarketKey || null, + lifecycleStatus, + winner: winnerStr, + betCloseTime: cycle.betCloseTime ?? null, + contractAddress: clobAddr, + programId: null, + txRef: null, + syncedAt: now, + marketType: "clob", + }, + ], + updatedAt: now, + }); + return; + } + + // ─── Original sim dashboard API endpoints ──────────────────────────────── + if (requestUrl.pathname === "/api/state") { writeJson(res, 200, { ok: true, From 518119d4d0504fa7c51fe3e352f0c9e7136a1b20 Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Fri, 20 Mar 2026 08:42:58 -0500 Subject: [PATCH 08/24] feat(scripts): add sim-frontend startup script Starts the simulation dashboard, waits for readiness, fetches deployed contract addresses from /api/config, writes .env.local for the EVM betting frontend, then starts the Vite dev server. Usage: ./scripts/sim-frontend.sh --- scripts/sim-frontend.sh | 62 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100755 scripts/sim-frontend.sh diff --git a/scripts/sim-frontend.sh b/scripts/sim-frontend.sh new file mode 100755 index 00000000..64aa0d17 --- /dev/null +++ b/scripts/sim-frontend.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Start simulation dashboard + betting frontend together. +# The sim dashboard acts as the Game API server for the frontend. + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" + +SIM_PID="" +cleanup() { + if [[ -n "$SIM_PID" ]]; then + kill "$SIM_PID" 2>/dev/null || true + fi +} +trap cleanup EXIT + +echo "==> Starting simulation dashboard..." +cd "$ROOT_DIR" +bun run --cwd packages/simulation-dashboard dev & +SIM_PID=$! + +echo "==> Waiting for sim dashboard to be ready on :3401..." +for i in $(seq 1 60); do + if curl -sf http://localhost:3401/api/config > /dev/null 2>&1; then + break + fi + if ! kill -0 "$SIM_PID" 2>/dev/null; then + echo "ERROR: Simulation dashboard crashed during startup" + exit 1 + fi + sleep 1 +done + +if ! curl -sf http://localhost:3401/api/config > /dev/null 2>&1; then + echo "ERROR: Simulation dashboard did not become ready in 60s" + exit 1 +fi + +echo "==> Fetching contract addresses from sim..." +CONFIG=$(curl -sf http://localhost:3401/api/config) +CLOB=$(echo "$CONFIG" | jq -r .clobAddress) +ORACLE=$(echo "$CONFIG" | jq -r .oracleAddress) +DUEL_KEY=$(echo "$CONFIG" | jq -r .duelKey) + +echo " CLOB: $CLOB" +echo " Oracle: $ORACLE" +echo " Duel: $DUEL_KEY" + +# Write .env.local for the EVM betting frontend +ENV_FILE="$ROOT_DIR/packages/hyperbet-evm/app/.env.local" +cat > "$ENV_FILE" << EOF +VITE_GAME_API_URL=http://localhost:3401 +VITE_BSC_RPC_URL=http://localhost:18546 +VITE_BSC_CHAIN_ID=31337 +VITE_BSC_GOLD_CLOB_ADDRESS=$CLOB +EOF + +echo "==> Wrote $ENV_FILE" +echo "==> Starting betting frontend dev server..." +cd "$ROOT_DIR" +exec bun run --cwd packages/hyperbet-evm/app dev From 8420965896802fb5c22cb02151d38faa34b83765 Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Fri, 20 Mar 2026 13:24:59 -0500 Subject: [PATCH 09/24] fix(pm-amm): clear CI gates and sync lvr artifacts --- .../contracts/lvr_amm/LvrMarket.sol | 10 +- .../hyperbet-avax/keeper/src/idl/lvr_amm.json | 1887 ++++++++++++++++ .../hyperbet-avax/keeper/src/idl/lvr_amm.ts | 1893 +++++++++++++++++ .../hyperbet-bsc/app/src/idl/lvr_amm.json | 1887 ++++++++++++++++ packages/hyperbet-bsc/app/src/idl/lvr_amm.ts | 1893 +++++++++++++++++ .../hyperbet-bsc/keeper/src/idl/lvr_amm.json | 1887 ++++++++++++++++ .../hyperbet-bsc/keeper/src/idl/lvr_amm.ts | 1893 +++++++++++++++++ .../hyperbet-evm/keeper/src/idl/lvr_amm.json | 1887 ++++++++++++++++ .../hyperbet-evm/keeper/src/idl/lvr_amm.ts | 1893 +++++++++++++++++ packages/hyperbet-solana/anchor/Cargo.lock | 9 +- .../anchor/target/deploy/lvr_amm-keypair.json | 1 + .../anchor/target/deploy/lvr_amm.so | Bin 0 -> 468472 bytes .../anchor/target/idl/lvr_amm.json | 1654 ++++++++++++-- .../anchor/target/types/lvr_amm.ts | 39 +- .../hyperbet-solana/app/src/idl/lvr_amm.json | 1887 ++++++++++++++++ .../hyperbet-solana/app/src/idl/lvr_amm.ts | 60 +- packages/hyperbet-solana/keeper/src/common.ts | 16 +- .../keeper/src/idl/lvr_amm.json | 1887 ++++++++++++++++ .../hyperbet-solana/keeper/src/idl/lvr_amm.ts | 1893 +++++++++++++++++ packages/hyperbet-ui/src/idl/lvr_amm.json | 1887 ++++++++++++++++ .../market-maker-bot/src/idl/lvr_amm.json | 1654 ++++++++++++-- 21 files changed, 25602 insertions(+), 515 deletions(-) create mode 100644 packages/hyperbet-avax/keeper/src/idl/lvr_amm.json create mode 100644 packages/hyperbet-avax/keeper/src/idl/lvr_amm.ts create mode 100644 packages/hyperbet-bsc/app/src/idl/lvr_amm.json create mode 100644 packages/hyperbet-bsc/app/src/idl/lvr_amm.ts create mode 100644 packages/hyperbet-bsc/keeper/src/idl/lvr_amm.json create mode 100644 packages/hyperbet-bsc/keeper/src/idl/lvr_amm.ts create mode 100644 packages/hyperbet-evm/keeper/src/idl/lvr_amm.json create mode 100644 packages/hyperbet-evm/keeper/src/idl/lvr_amm.ts create mode 100644 packages/hyperbet-solana/anchor/target/deploy/lvr_amm-keypair.json create mode 100755 packages/hyperbet-solana/anchor/target/deploy/lvr_amm.so create mode 100644 packages/hyperbet-solana/app/src/idl/lvr_amm.json create mode 100644 packages/hyperbet-solana/keeper/src/idl/lvr_amm.json create mode 100644 packages/hyperbet-solana/keeper/src/idl/lvr_amm.ts create mode 100644 packages/hyperbet-ui/src/idl/lvr_amm.json diff --git a/packages/evm-contracts/contracts/lvr_amm/LvrMarket.sol b/packages/evm-contracts/contracts/lvr_amm/LvrMarket.sol index 904a7378..9182bf7a 100644 --- a/packages/evm-contracts/contracts/lvr_amm/LvrMarket.sol +++ b/packages/evm-contracts/contracts/lvr_amm/LvrMarket.sol @@ -20,12 +20,12 @@ contract LvrMarket is ReentrancyGuard { using SafeCast for uint256; event MarketInitialized(uint256 liquidity, uint256 collateralIn, uint256 timestamp); - + event OutcomeProposed(uint256 outcome, address indexed proposer, uint256 resolutionTimestamp); event MarketDisputed(); event MarketSettled(uint256 outcome, address indexed proposer, uint256 bondReturned); event MarketResolvedByAdmin(uint256 outcome, address indexed admin); - + event MarketBuy(address indexed buyer, bool isBuyYes, uint256 amountIn, uint256 amountOut); event MarketSell(address indexed seller, bool isSellYes, uint256 amountIn, uint256 amountOut); event CollateralRedeemed(address indexed redeemer, uint256 amountYes, uint256 amountNo, uint256 payout); @@ -132,10 +132,10 @@ contract LvrMarket is ReentrancyGuard { function dispute() external isRouter nonReentrant { require(state == MarketState.PENDING, "Challenge Window Not opened"); - // Break the bond + // Break the bond state = MarketState.DISPUTED; // set the market outcome through creator/resolver voting/admin - + emit MarketDisputed(); } @@ -243,7 +243,7 @@ contract LvrMarket is ReentrancyGuard { noToken = new NoToken(address(this), collateralIn); liquidity = Math.calcInitialLiquidity(collateralIn); liquidityInitialized = true; - + emit MarketInitialized(liquidity, collateralIn, block.timestamp); return liquidity; } diff --git a/packages/hyperbet-avax/keeper/src/idl/lvr_amm.json b/packages/hyperbet-avax/keeper/src/idl/lvr_amm.json new file mode 100644 index 00000000..fe58ca53 --- /dev/null +++ b/packages/hyperbet-avax/keeper/src/idl/lvr_amm.json @@ -0,0 +1,1887 @@ +{ + "address": "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", + "metadata": { + "name": "lvr_amm", + "version": "0.1.0", + "spec": "0.1.0", + "description": "LvrAMM" + }, + "instructions": [ + { + "name": "buy", + "discriminator": [ + 102, + 6, + 61, + 18, + 1, + 218, + 235, + 234 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "create_bet_account", + "discriminator": [ + 24, + 219, + 70, + 229, + 81, + 50, + 3, + 28 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "expiration_at", + "type": "i64" + } + ] + }, + { + "name": "freeze_config", + "discriminator": [ + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [] + }, + { + "name": "get_price", + "discriminator": [ + 238, + 38, + 193, + 106, + 228, + 32, + 210, + 33 + ], + "accounts": [ + { + "name": "bet", + "writable": true + } + ], + "args": [ + { + "name": "outcome", + "type": "u8" + } + ], + "returns": "u64" + }, + { + "name": "init_bet_account", + "discriminator": [ + 229, + 240, + 116, + 140, + 5, + 177, + 61, + 69 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + } + ] + }, + { + "name": "initialize", + "discriminator": [ + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 + ], + "accounts": [ + { + "name": "admin_state", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "initialize_config", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + }, + { + "name": "sell", + "discriminator": [ + 51, + 230, + 133, + 164, + 1, + 127, + 131, + 173 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "treasury_yes_ata", + "writable": true + }, + { + "name": "treasury_no_ata", + "writable": true + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "set_paused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [ + { + "name": "paused", + "type": "bool" + } + ] + }, + { + "name": "settle_bet", + "discriminator": [ + 115, + 55, + 234, + 177, + 227, + 4, + 10, + 67 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "admin_state", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "duel_state", + "docs": [ + "Optional: fight_oracle DuelState account. When provided, winner is read", + "from the oracle rather than trusting the caller's `side_won` argument." + ], + "optional": true + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "side_won", + "type": "u8" + } + ] + }, + { + "name": "withdraw_post_settle", + "discriminator": [ + 133, + 23, + 211, + 230, + 77, + 52, + 64, + 154 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "token_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "q", + "type": "u64" + } + ] + } + ], + "accounts": [ + { + "name": "Admin", + "discriminator": [ + 244, + 158, + 220, + 65, + 8, + 73, + 4, + 65 + ] + }, + { + "name": "AmmConfig", + "discriminator": [ + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 + ] + }, + { + "name": "Bet", + "discriminator": [ + 147, + 23, + 35, + 59, + 15, + 75, + 155, + 32 + ] + } + ], + "events": [ + { + "name": "AdminStateInitialized", + "discriminator": [ + 211, + 115, + 86, + 90, + 176, + 197, + 254, + 121 + ] + }, + { + "name": "AmmConfigFrozen", + "discriminator": [ + 247, + 80, + 58, + 72, + 123, + 117, + 119, + 164 + ] + }, + { + "name": "AmmConfigInitialized", + "discriminator": [ + 105, + 30, + 129, + 183, + 100, + 137, + 26, + 239 + ] + }, + { + "name": "AmmPausedChanged", + "discriminator": [ + 69, + 202, + 147, + 173, + 81, + 7, + 62, + 82 + ] + } + ], + "errors": [ + { + "code": 6000, + "name": "CanOnlyBeInitializedByOwner", + "msg": "Can only be initialized by owner" + }, + { + "code": 6001, + "name": "OutComeCanOnlyBe01", + "msg": "outcome can only be 0 for yes or 1 for no" + }, + { + "code": 6002, + "name": "InvalidInitialLiq", + "msg": "initial liq must be greater than 100000" + }, + { + "code": 6003, + "name": "QuantityMustBeGreaterThanZero", + "msg": "quantity must be greater than zero" + }, + { + "code": 6004, + "name": "SignerDoesntHaveEnoughTokens", + "msg": "Signer doesn't have enough tokens" + }, + { + "code": 6005, + "name": "NotEnoughLamports", + "msg": "Bet account doesn't have enough lamports" + }, + { + "code": 6006, + "name": "NotEnoughSharesToReduce", + "msg": "Bet account doesn't have enough shares" + }, + { + "code": 6007, + "name": "AdminStateAlreadyInitialized", + "msg": "Admin state already initialized" + }, + { + "code": 6008, + "name": "SignerIsNotSettlePubKey", + "msg": "Signer is not the settle pub key" + }, + { + "code": 6009, + "name": "BetAlreadySettled", + "msg": "Bet already settled" + }, + { + "code": 6010, + "name": "BetNotSettled", + "msg": "Bet not settled" + }, + { + "code": 6011, + "name": "BetNotExpired", + "msg": "Bet not expired" + }, + { + "code": 6012, + "name": "MathErr", + "msg": "Overflow or Underflow" + }, + { + "code": 6013, + "name": "InvalidAddress", + "msg": "Invalid address (zero/default)" + }, + { + "code": 6014, + "name": "FeeTooHigh", + "msg": "Fee BPS exceeds maximum (1000 = 10%)" + }, + { + "code": 6015, + "name": "MarketPaused", + "msg": "Market is paused" + }, + { + "code": 6016, + "name": "ConfigFrozen", + "msg": "Config is frozen" + } + ], + "types": [ + { + "name": "Admin", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AdminStateInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AmmConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + }, + { + "name": "config_frozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "AmmConfigFrozen", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + } + ] + } + }, + { + "name": "AmmConfigInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + }, + { + "name": "AmmPausedChanged", + "type": { + "kind": "struct", + "fields": [ + { + "name": "paused", + "type": "bool" + } + ] + } + }, + { + "name": "Bet", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "reserves", + "type": { + "array": [ + "u64", + 2 + ] + } + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "is_initialized", + "type": "bool" + }, + { + "name": "side_won", + "type": { + "option": "u8" + } + }, + { + "name": "expiration_at", + "type": "i64" + }, + { + "name": "created_at", + "type": "i64" + }, + { + "name": "creator", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/packages/hyperbet-avax/keeper/src/idl/lvr_amm.ts b/packages/hyperbet-avax/keeper/src/idl/lvr_amm.ts new file mode 100644 index 00000000..d4b3b8aa --- /dev/null +++ b/packages/hyperbet-avax/keeper/src/idl/lvr_amm.ts @@ -0,0 +1,1893 @@ +/** + * Program IDL in camelCase format in order to be used in JS/TS. + * + * Note that this is only a type helper and is not the actual IDL. The original + * IDL can be found at `target/idl/lvr_amm.json`. + */ +export type LvrAmm = { + "address": "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", + "metadata": { + "name": "lvrAmm", + "version": "0.1.0", + "spec": "0.1.0", + "description": "lvrAmm" + }, + "instructions": [ + { + "name": "buy", + "discriminator": [ + 102, + 6, + 61, + 18, + 1, + 218, + 235, + 234 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "destinationYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destinationNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "tokenProgram", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "associatedTokenProgram", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amountIn", + "type": "u64" + } + ] + }, + { + "name": "createBetAccount", + "discriminator": [ + 24, + 219, + 70, + 229, + 81, + 50, + 3, + 28 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "tokenProgram", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "initialLiq", + "type": "u64" + }, + { + "name": "isDynamic", + "type": "bool" + }, + { + "name": "betPrompt", + "type": "string" + }, + { + "name": "expirationAt", + "type": "i64" + } + ] + }, + { + "name": "freezeConfig", + "discriminator": [ + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 + ], + "accounts": [ + { + "name": "ammConfig", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [] + }, + { + "name": "getPrice", + "discriminator": [ + 238, + 38, + 193, + 106, + 228, + 32, + 210, + 33 + ], + "accounts": [ + { + "name": "bet", + "writable": true + } + ], + "args": [ + { + "name": "outcome", + "type": "u8" + } + ], + "returns": "u64" + }, + { + "name": "initBetAccount", + "discriminator": [ + 229, + 240, + 116, + 140, + 5, + 177, + 61, + 69 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + } + ] + }, + { + "name": "initialize", + "discriminator": [ + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 + ], + "accounts": [ + { + "name": "adminState", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "initializeConfig", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ + { + "name": "ammConfig", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "marketMaker", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + } + ] + }, + { + "name": "sell", + "discriminator": [ + 51, + 230, + 133, + 164, + 1, + 127, + 131, + 173 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "destinationYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destinationNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "treasuryYesAta", + "writable": true + }, + { + "name": "treasuryNoAta", + "writable": true + }, + { + "name": "tokenProgram", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "associatedTokenProgram", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amountIn", + "type": "u64" + } + ] + }, + { + "name": "setPaused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ + { + "name": "ammConfig", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [ + { + "name": "paused", + "type": "bool" + } + ] + }, + { + "name": "settleBet", + "discriminator": [ + 115, + 55, + 234, + 177, + 227, + 4, + 10, + 67 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "adminState", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "duelState", + "docs": [ + "Optional: fight_oracle DuelState account. When provided, winner is read", + "from the oracle rather than trusting the caller's `side_won` argument." + ], + "optional": true + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "sideWon", + "type": "u8" + } + ] + }, + { + "name": "withdrawPostSettle", + "discriminator": [ + 133, + 23, + 211, + 230, + 77, + 52, + 64, + 154 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "destinationYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destinationNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "tokenProgram" + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "associatedTokenProgram", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "q", + "type": "u64" + } + ] + } + ], + "accounts": [ + { + "name": "admin", + "discriminator": [ + 244, + 158, + 220, + 65, + 8, + 73, + 4, + 65 + ] + }, + { + "name": "ammConfig", + "discriminator": [ + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 + ] + }, + { + "name": "bet", + "discriminator": [ + 147, + 23, + 35, + 59, + 15, + 75, + 155, + 32 + ] + } + ], + "events": [ + { + "name": "adminStateInitialized", + "discriminator": [ + 211, + 115, + 86, + 90, + 176, + 197, + 254, + 121 + ] + }, + { + "name": "ammConfigFrozen", + "discriminator": [ + 247, + 80, + 58, + 72, + 123, + 117, + 119, + 164 + ] + }, + { + "name": "ammConfigInitialized", + "discriminator": [ + 105, + 30, + 129, + 183, + 100, + 137, + 26, + 239 + ] + }, + { + "name": "ammPausedChanged", + "discriminator": [ + 69, + 202, + 147, + 173, + 81, + 7, + 62, + 82 + ] + } + ], + "errors": [ + { + "code": 6000, + "name": "canOnlyBeInitializedByOwner", + "msg": "Can only be initialized by owner" + }, + { + "code": 6001, + "name": "outComeCanOnlyBe01", + "msg": "outcome can only be 0 for yes or 1 for no" + }, + { + "code": 6002, + "name": "invalidInitialLiq", + "msg": "initial liq must be greater than 100000" + }, + { + "code": 6003, + "name": "quantityMustBeGreaterThanZero", + "msg": "quantity must be greater than zero" + }, + { + "code": 6004, + "name": "signerDoesntHaveEnoughTokens", + "msg": "Signer doesn't have enough tokens" + }, + { + "code": 6005, + "name": "notEnoughLamports", + "msg": "Bet account doesn't have enough lamports" + }, + { + "code": 6006, + "name": "notEnoughSharesToReduce", + "msg": "Bet account doesn't have enough shares" + }, + { + "code": 6007, + "name": "adminStateAlreadyInitialized", + "msg": "Admin state already initialized" + }, + { + "code": 6008, + "name": "signerIsNotSettlePubKey", + "msg": "Signer is not the settle pub key" + }, + { + "code": 6009, + "name": "betAlreadySettled", + "msg": "Bet already settled" + }, + { + "code": 6010, + "name": "betNotSettled", + "msg": "Bet not settled" + }, + { + "code": 6011, + "name": "betNotExpired", + "msg": "Bet not expired" + }, + { + "code": 6012, + "name": "mathErr", + "msg": "Overflow or Underflow" + }, + { + "code": 6013, + "name": "invalidAddress", + "msg": "Invalid address (zero/default)" + }, + { + "code": 6014, + "name": "feeTooHigh", + "msg": "Fee BPS exceeds maximum (1000 = 10%)" + }, + { + "code": 6015, + "name": "marketPaused", + "msg": "Market is paused" + }, + { + "code": 6016, + "name": "configFrozen", + "msg": "Config is frozen" + } + ], + "types": [ + { + "name": "admin", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "isInitialized", + "type": "bool" + } + ] + } + }, + { + "name": "adminStateInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "isInitialized", + "type": "bool" + } + ] + } + }, + { + "name": "ammConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "marketMaker", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + }, + { + "name": "configFrozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "ammConfigFrozen", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + } + ] + } + }, + { + "name": "ammConfigInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + } + ] + } + }, + { + "name": "ammPausedChanged", + "type": { + "kind": "struct", + "fields": [ + { + "name": "paused", + "type": "bool" + } + ] + } + }, + { + "name": "bet", + "type": { + "kind": "struct", + "fields": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "initialLiq", + "type": "u64" + }, + { + "name": "isDynamic", + "type": "bool" + }, + { + "name": "reserves", + "type": { + "array": [ + "u64", + 2 + ] + } + }, + { + "name": "betPrompt", + "type": "string" + }, + { + "name": "isInitialized", + "type": "bool" + }, + { + "name": "sideWon", + "type": { + "option": "u8" + } + }, + { + "name": "expirationAt", + "type": "i64" + }, + { + "name": "createdAt", + "type": "i64" + }, + { + "name": "creator", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + } + ] + } + } + ] +}; diff --git a/packages/hyperbet-bsc/app/src/idl/lvr_amm.json b/packages/hyperbet-bsc/app/src/idl/lvr_amm.json new file mode 100644 index 00000000..fe58ca53 --- /dev/null +++ b/packages/hyperbet-bsc/app/src/idl/lvr_amm.json @@ -0,0 +1,1887 @@ +{ + "address": "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", + "metadata": { + "name": "lvr_amm", + "version": "0.1.0", + "spec": "0.1.0", + "description": "LvrAMM" + }, + "instructions": [ + { + "name": "buy", + "discriminator": [ + 102, + 6, + 61, + 18, + 1, + 218, + 235, + 234 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "create_bet_account", + "discriminator": [ + 24, + 219, + 70, + 229, + 81, + 50, + 3, + 28 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "expiration_at", + "type": "i64" + } + ] + }, + { + "name": "freeze_config", + "discriminator": [ + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [] + }, + { + "name": "get_price", + "discriminator": [ + 238, + 38, + 193, + 106, + 228, + 32, + 210, + 33 + ], + "accounts": [ + { + "name": "bet", + "writable": true + } + ], + "args": [ + { + "name": "outcome", + "type": "u8" + } + ], + "returns": "u64" + }, + { + "name": "init_bet_account", + "discriminator": [ + 229, + 240, + 116, + 140, + 5, + 177, + 61, + 69 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + } + ] + }, + { + "name": "initialize", + "discriminator": [ + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 + ], + "accounts": [ + { + "name": "admin_state", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "initialize_config", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + }, + { + "name": "sell", + "discriminator": [ + 51, + 230, + 133, + 164, + 1, + 127, + 131, + 173 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "treasury_yes_ata", + "writable": true + }, + { + "name": "treasury_no_ata", + "writable": true + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "set_paused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [ + { + "name": "paused", + "type": "bool" + } + ] + }, + { + "name": "settle_bet", + "discriminator": [ + 115, + 55, + 234, + 177, + 227, + 4, + 10, + 67 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "admin_state", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "duel_state", + "docs": [ + "Optional: fight_oracle DuelState account. When provided, winner is read", + "from the oracle rather than trusting the caller's `side_won` argument." + ], + "optional": true + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "side_won", + "type": "u8" + } + ] + }, + { + "name": "withdraw_post_settle", + "discriminator": [ + 133, + 23, + 211, + 230, + 77, + 52, + 64, + 154 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "token_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "q", + "type": "u64" + } + ] + } + ], + "accounts": [ + { + "name": "Admin", + "discriminator": [ + 244, + 158, + 220, + 65, + 8, + 73, + 4, + 65 + ] + }, + { + "name": "AmmConfig", + "discriminator": [ + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 + ] + }, + { + "name": "Bet", + "discriminator": [ + 147, + 23, + 35, + 59, + 15, + 75, + 155, + 32 + ] + } + ], + "events": [ + { + "name": "AdminStateInitialized", + "discriminator": [ + 211, + 115, + 86, + 90, + 176, + 197, + 254, + 121 + ] + }, + { + "name": "AmmConfigFrozen", + "discriminator": [ + 247, + 80, + 58, + 72, + 123, + 117, + 119, + 164 + ] + }, + { + "name": "AmmConfigInitialized", + "discriminator": [ + 105, + 30, + 129, + 183, + 100, + 137, + 26, + 239 + ] + }, + { + "name": "AmmPausedChanged", + "discriminator": [ + 69, + 202, + 147, + 173, + 81, + 7, + 62, + 82 + ] + } + ], + "errors": [ + { + "code": 6000, + "name": "CanOnlyBeInitializedByOwner", + "msg": "Can only be initialized by owner" + }, + { + "code": 6001, + "name": "OutComeCanOnlyBe01", + "msg": "outcome can only be 0 for yes or 1 for no" + }, + { + "code": 6002, + "name": "InvalidInitialLiq", + "msg": "initial liq must be greater than 100000" + }, + { + "code": 6003, + "name": "QuantityMustBeGreaterThanZero", + "msg": "quantity must be greater than zero" + }, + { + "code": 6004, + "name": "SignerDoesntHaveEnoughTokens", + "msg": "Signer doesn't have enough tokens" + }, + { + "code": 6005, + "name": "NotEnoughLamports", + "msg": "Bet account doesn't have enough lamports" + }, + { + "code": 6006, + "name": "NotEnoughSharesToReduce", + "msg": "Bet account doesn't have enough shares" + }, + { + "code": 6007, + "name": "AdminStateAlreadyInitialized", + "msg": "Admin state already initialized" + }, + { + "code": 6008, + "name": "SignerIsNotSettlePubKey", + "msg": "Signer is not the settle pub key" + }, + { + "code": 6009, + "name": "BetAlreadySettled", + "msg": "Bet already settled" + }, + { + "code": 6010, + "name": "BetNotSettled", + "msg": "Bet not settled" + }, + { + "code": 6011, + "name": "BetNotExpired", + "msg": "Bet not expired" + }, + { + "code": 6012, + "name": "MathErr", + "msg": "Overflow or Underflow" + }, + { + "code": 6013, + "name": "InvalidAddress", + "msg": "Invalid address (zero/default)" + }, + { + "code": 6014, + "name": "FeeTooHigh", + "msg": "Fee BPS exceeds maximum (1000 = 10%)" + }, + { + "code": 6015, + "name": "MarketPaused", + "msg": "Market is paused" + }, + { + "code": 6016, + "name": "ConfigFrozen", + "msg": "Config is frozen" + } + ], + "types": [ + { + "name": "Admin", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AdminStateInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AmmConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + }, + { + "name": "config_frozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "AmmConfigFrozen", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + } + ] + } + }, + { + "name": "AmmConfigInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + }, + { + "name": "AmmPausedChanged", + "type": { + "kind": "struct", + "fields": [ + { + "name": "paused", + "type": "bool" + } + ] + } + }, + { + "name": "Bet", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "reserves", + "type": { + "array": [ + "u64", + 2 + ] + } + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "is_initialized", + "type": "bool" + }, + { + "name": "side_won", + "type": { + "option": "u8" + } + }, + { + "name": "expiration_at", + "type": "i64" + }, + { + "name": "created_at", + "type": "i64" + }, + { + "name": "creator", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/packages/hyperbet-bsc/app/src/idl/lvr_amm.ts b/packages/hyperbet-bsc/app/src/idl/lvr_amm.ts new file mode 100644 index 00000000..d4b3b8aa --- /dev/null +++ b/packages/hyperbet-bsc/app/src/idl/lvr_amm.ts @@ -0,0 +1,1893 @@ +/** + * Program IDL in camelCase format in order to be used in JS/TS. + * + * Note that this is only a type helper and is not the actual IDL. The original + * IDL can be found at `target/idl/lvr_amm.json`. + */ +export type LvrAmm = { + "address": "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", + "metadata": { + "name": "lvrAmm", + "version": "0.1.0", + "spec": "0.1.0", + "description": "lvrAmm" + }, + "instructions": [ + { + "name": "buy", + "discriminator": [ + 102, + 6, + 61, + 18, + 1, + 218, + 235, + 234 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "destinationYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destinationNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "tokenProgram", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "associatedTokenProgram", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amountIn", + "type": "u64" + } + ] + }, + { + "name": "createBetAccount", + "discriminator": [ + 24, + 219, + 70, + 229, + 81, + 50, + 3, + 28 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "tokenProgram", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "initialLiq", + "type": "u64" + }, + { + "name": "isDynamic", + "type": "bool" + }, + { + "name": "betPrompt", + "type": "string" + }, + { + "name": "expirationAt", + "type": "i64" + } + ] + }, + { + "name": "freezeConfig", + "discriminator": [ + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 + ], + "accounts": [ + { + "name": "ammConfig", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [] + }, + { + "name": "getPrice", + "discriminator": [ + 238, + 38, + 193, + 106, + 228, + 32, + 210, + 33 + ], + "accounts": [ + { + "name": "bet", + "writable": true + } + ], + "args": [ + { + "name": "outcome", + "type": "u8" + } + ], + "returns": "u64" + }, + { + "name": "initBetAccount", + "discriminator": [ + 229, + 240, + 116, + 140, + 5, + 177, + 61, + 69 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + } + ] + }, + { + "name": "initialize", + "discriminator": [ + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 + ], + "accounts": [ + { + "name": "adminState", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "initializeConfig", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ + { + "name": "ammConfig", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "marketMaker", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + } + ] + }, + { + "name": "sell", + "discriminator": [ + 51, + 230, + 133, + 164, + 1, + 127, + 131, + 173 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "destinationYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destinationNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "treasuryYesAta", + "writable": true + }, + { + "name": "treasuryNoAta", + "writable": true + }, + { + "name": "tokenProgram", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "associatedTokenProgram", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amountIn", + "type": "u64" + } + ] + }, + { + "name": "setPaused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ + { + "name": "ammConfig", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [ + { + "name": "paused", + "type": "bool" + } + ] + }, + { + "name": "settleBet", + "discriminator": [ + 115, + 55, + 234, + 177, + 227, + 4, + 10, + 67 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "adminState", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "duelState", + "docs": [ + "Optional: fight_oracle DuelState account. When provided, winner is read", + "from the oracle rather than trusting the caller's `side_won` argument." + ], + "optional": true + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "sideWon", + "type": "u8" + } + ] + }, + { + "name": "withdrawPostSettle", + "discriminator": [ + 133, + 23, + 211, + 230, + 77, + 52, + 64, + 154 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "destinationYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destinationNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "tokenProgram" + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "associatedTokenProgram", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "q", + "type": "u64" + } + ] + } + ], + "accounts": [ + { + "name": "admin", + "discriminator": [ + 244, + 158, + 220, + 65, + 8, + 73, + 4, + 65 + ] + }, + { + "name": "ammConfig", + "discriminator": [ + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 + ] + }, + { + "name": "bet", + "discriminator": [ + 147, + 23, + 35, + 59, + 15, + 75, + 155, + 32 + ] + } + ], + "events": [ + { + "name": "adminStateInitialized", + "discriminator": [ + 211, + 115, + 86, + 90, + 176, + 197, + 254, + 121 + ] + }, + { + "name": "ammConfigFrozen", + "discriminator": [ + 247, + 80, + 58, + 72, + 123, + 117, + 119, + 164 + ] + }, + { + "name": "ammConfigInitialized", + "discriminator": [ + 105, + 30, + 129, + 183, + 100, + 137, + 26, + 239 + ] + }, + { + "name": "ammPausedChanged", + "discriminator": [ + 69, + 202, + 147, + 173, + 81, + 7, + 62, + 82 + ] + } + ], + "errors": [ + { + "code": 6000, + "name": "canOnlyBeInitializedByOwner", + "msg": "Can only be initialized by owner" + }, + { + "code": 6001, + "name": "outComeCanOnlyBe01", + "msg": "outcome can only be 0 for yes or 1 for no" + }, + { + "code": 6002, + "name": "invalidInitialLiq", + "msg": "initial liq must be greater than 100000" + }, + { + "code": 6003, + "name": "quantityMustBeGreaterThanZero", + "msg": "quantity must be greater than zero" + }, + { + "code": 6004, + "name": "signerDoesntHaveEnoughTokens", + "msg": "Signer doesn't have enough tokens" + }, + { + "code": 6005, + "name": "notEnoughLamports", + "msg": "Bet account doesn't have enough lamports" + }, + { + "code": 6006, + "name": "notEnoughSharesToReduce", + "msg": "Bet account doesn't have enough shares" + }, + { + "code": 6007, + "name": "adminStateAlreadyInitialized", + "msg": "Admin state already initialized" + }, + { + "code": 6008, + "name": "signerIsNotSettlePubKey", + "msg": "Signer is not the settle pub key" + }, + { + "code": 6009, + "name": "betAlreadySettled", + "msg": "Bet already settled" + }, + { + "code": 6010, + "name": "betNotSettled", + "msg": "Bet not settled" + }, + { + "code": 6011, + "name": "betNotExpired", + "msg": "Bet not expired" + }, + { + "code": 6012, + "name": "mathErr", + "msg": "Overflow or Underflow" + }, + { + "code": 6013, + "name": "invalidAddress", + "msg": "Invalid address (zero/default)" + }, + { + "code": 6014, + "name": "feeTooHigh", + "msg": "Fee BPS exceeds maximum (1000 = 10%)" + }, + { + "code": 6015, + "name": "marketPaused", + "msg": "Market is paused" + }, + { + "code": 6016, + "name": "configFrozen", + "msg": "Config is frozen" + } + ], + "types": [ + { + "name": "admin", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "isInitialized", + "type": "bool" + } + ] + } + }, + { + "name": "adminStateInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "isInitialized", + "type": "bool" + } + ] + } + }, + { + "name": "ammConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "marketMaker", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + }, + { + "name": "configFrozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "ammConfigFrozen", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + } + ] + } + }, + { + "name": "ammConfigInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + } + ] + } + }, + { + "name": "ammPausedChanged", + "type": { + "kind": "struct", + "fields": [ + { + "name": "paused", + "type": "bool" + } + ] + } + }, + { + "name": "bet", + "type": { + "kind": "struct", + "fields": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "initialLiq", + "type": "u64" + }, + { + "name": "isDynamic", + "type": "bool" + }, + { + "name": "reserves", + "type": { + "array": [ + "u64", + 2 + ] + } + }, + { + "name": "betPrompt", + "type": "string" + }, + { + "name": "isInitialized", + "type": "bool" + }, + { + "name": "sideWon", + "type": { + "option": "u8" + } + }, + { + "name": "expirationAt", + "type": "i64" + }, + { + "name": "createdAt", + "type": "i64" + }, + { + "name": "creator", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + } + ] + } + } + ] +}; diff --git a/packages/hyperbet-bsc/keeper/src/idl/lvr_amm.json b/packages/hyperbet-bsc/keeper/src/idl/lvr_amm.json new file mode 100644 index 00000000..fe58ca53 --- /dev/null +++ b/packages/hyperbet-bsc/keeper/src/idl/lvr_amm.json @@ -0,0 +1,1887 @@ +{ + "address": "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", + "metadata": { + "name": "lvr_amm", + "version": "0.1.0", + "spec": "0.1.0", + "description": "LvrAMM" + }, + "instructions": [ + { + "name": "buy", + "discriminator": [ + 102, + 6, + 61, + 18, + 1, + 218, + 235, + 234 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "create_bet_account", + "discriminator": [ + 24, + 219, + 70, + 229, + 81, + 50, + 3, + 28 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "expiration_at", + "type": "i64" + } + ] + }, + { + "name": "freeze_config", + "discriminator": [ + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [] + }, + { + "name": "get_price", + "discriminator": [ + 238, + 38, + 193, + 106, + 228, + 32, + 210, + 33 + ], + "accounts": [ + { + "name": "bet", + "writable": true + } + ], + "args": [ + { + "name": "outcome", + "type": "u8" + } + ], + "returns": "u64" + }, + { + "name": "init_bet_account", + "discriminator": [ + 229, + 240, + 116, + 140, + 5, + 177, + 61, + 69 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + } + ] + }, + { + "name": "initialize", + "discriminator": [ + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 + ], + "accounts": [ + { + "name": "admin_state", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "initialize_config", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + }, + { + "name": "sell", + "discriminator": [ + 51, + 230, + 133, + 164, + 1, + 127, + 131, + 173 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "treasury_yes_ata", + "writable": true + }, + { + "name": "treasury_no_ata", + "writable": true + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "set_paused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [ + { + "name": "paused", + "type": "bool" + } + ] + }, + { + "name": "settle_bet", + "discriminator": [ + 115, + 55, + 234, + 177, + 227, + 4, + 10, + 67 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "admin_state", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "duel_state", + "docs": [ + "Optional: fight_oracle DuelState account. When provided, winner is read", + "from the oracle rather than trusting the caller's `side_won` argument." + ], + "optional": true + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "side_won", + "type": "u8" + } + ] + }, + { + "name": "withdraw_post_settle", + "discriminator": [ + 133, + 23, + 211, + 230, + 77, + 52, + 64, + 154 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "token_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "q", + "type": "u64" + } + ] + } + ], + "accounts": [ + { + "name": "Admin", + "discriminator": [ + 244, + 158, + 220, + 65, + 8, + 73, + 4, + 65 + ] + }, + { + "name": "AmmConfig", + "discriminator": [ + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 + ] + }, + { + "name": "Bet", + "discriminator": [ + 147, + 23, + 35, + 59, + 15, + 75, + 155, + 32 + ] + } + ], + "events": [ + { + "name": "AdminStateInitialized", + "discriminator": [ + 211, + 115, + 86, + 90, + 176, + 197, + 254, + 121 + ] + }, + { + "name": "AmmConfigFrozen", + "discriminator": [ + 247, + 80, + 58, + 72, + 123, + 117, + 119, + 164 + ] + }, + { + "name": "AmmConfigInitialized", + "discriminator": [ + 105, + 30, + 129, + 183, + 100, + 137, + 26, + 239 + ] + }, + { + "name": "AmmPausedChanged", + "discriminator": [ + 69, + 202, + 147, + 173, + 81, + 7, + 62, + 82 + ] + } + ], + "errors": [ + { + "code": 6000, + "name": "CanOnlyBeInitializedByOwner", + "msg": "Can only be initialized by owner" + }, + { + "code": 6001, + "name": "OutComeCanOnlyBe01", + "msg": "outcome can only be 0 for yes or 1 for no" + }, + { + "code": 6002, + "name": "InvalidInitialLiq", + "msg": "initial liq must be greater than 100000" + }, + { + "code": 6003, + "name": "QuantityMustBeGreaterThanZero", + "msg": "quantity must be greater than zero" + }, + { + "code": 6004, + "name": "SignerDoesntHaveEnoughTokens", + "msg": "Signer doesn't have enough tokens" + }, + { + "code": 6005, + "name": "NotEnoughLamports", + "msg": "Bet account doesn't have enough lamports" + }, + { + "code": 6006, + "name": "NotEnoughSharesToReduce", + "msg": "Bet account doesn't have enough shares" + }, + { + "code": 6007, + "name": "AdminStateAlreadyInitialized", + "msg": "Admin state already initialized" + }, + { + "code": 6008, + "name": "SignerIsNotSettlePubKey", + "msg": "Signer is not the settle pub key" + }, + { + "code": 6009, + "name": "BetAlreadySettled", + "msg": "Bet already settled" + }, + { + "code": 6010, + "name": "BetNotSettled", + "msg": "Bet not settled" + }, + { + "code": 6011, + "name": "BetNotExpired", + "msg": "Bet not expired" + }, + { + "code": 6012, + "name": "MathErr", + "msg": "Overflow or Underflow" + }, + { + "code": 6013, + "name": "InvalidAddress", + "msg": "Invalid address (zero/default)" + }, + { + "code": 6014, + "name": "FeeTooHigh", + "msg": "Fee BPS exceeds maximum (1000 = 10%)" + }, + { + "code": 6015, + "name": "MarketPaused", + "msg": "Market is paused" + }, + { + "code": 6016, + "name": "ConfigFrozen", + "msg": "Config is frozen" + } + ], + "types": [ + { + "name": "Admin", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AdminStateInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AmmConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + }, + { + "name": "config_frozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "AmmConfigFrozen", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + } + ] + } + }, + { + "name": "AmmConfigInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + }, + { + "name": "AmmPausedChanged", + "type": { + "kind": "struct", + "fields": [ + { + "name": "paused", + "type": "bool" + } + ] + } + }, + { + "name": "Bet", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "reserves", + "type": { + "array": [ + "u64", + 2 + ] + } + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "is_initialized", + "type": "bool" + }, + { + "name": "side_won", + "type": { + "option": "u8" + } + }, + { + "name": "expiration_at", + "type": "i64" + }, + { + "name": "created_at", + "type": "i64" + }, + { + "name": "creator", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/packages/hyperbet-bsc/keeper/src/idl/lvr_amm.ts b/packages/hyperbet-bsc/keeper/src/idl/lvr_amm.ts new file mode 100644 index 00000000..d4b3b8aa --- /dev/null +++ b/packages/hyperbet-bsc/keeper/src/idl/lvr_amm.ts @@ -0,0 +1,1893 @@ +/** + * Program IDL in camelCase format in order to be used in JS/TS. + * + * Note that this is only a type helper and is not the actual IDL. The original + * IDL can be found at `target/idl/lvr_amm.json`. + */ +export type LvrAmm = { + "address": "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", + "metadata": { + "name": "lvrAmm", + "version": "0.1.0", + "spec": "0.1.0", + "description": "lvrAmm" + }, + "instructions": [ + { + "name": "buy", + "discriminator": [ + 102, + 6, + 61, + 18, + 1, + 218, + 235, + 234 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "destinationYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destinationNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "tokenProgram", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "associatedTokenProgram", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amountIn", + "type": "u64" + } + ] + }, + { + "name": "createBetAccount", + "discriminator": [ + 24, + 219, + 70, + 229, + 81, + 50, + 3, + 28 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "tokenProgram", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "initialLiq", + "type": "u64" + }, + { + "name": "isDynamic", + "type": "bool" + }, + { + "name": "betPrompt", + "type": "string" + }, + { + "name": "expirationAt", + "type": "i64" + } + ] + }, + { + "name": "freezeConfig", + "discriminator": [ + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 + ], + "accounts": [ + { + "name": "ammConfig", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [] + }, + { + "name": "getPrice", + "discriminator": [ + 238, + 38, + 193, + 106, + 228, + 32, + 210, + 33 + ], + "accounts": [ + { + "name": "bet", + "writable": true + } + ], + "args": [ + { + "name": "outcome", + "type": "u8" + } + ], + "returns": "u64" + }, + { + "name": "initBetAccount", + "discriminator": [ + 229, + 240, + 116, + 140, + 5, + 177, + 61, + 69 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + } + ] + }, + { + "name": "initialize", + "discriminator": [ + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 + ], + "accounts": [ + { + "name": "adminState", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "initializeConfig", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ + { + "name": "ammConfig", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "marketMaker", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + } + ] + }, + { + "name": "sell", + "discriminator": [ + 51, + 230, + 133, + 164, + 1, + 127, + 131, + 173 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "destinationYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destinationNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "treasuryYesAta", + "writable": true + }, + { + "name": "treasuryNoAta", + "writable": true + }, + { + "name": "tokenProgram", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "associatedTokenProgram", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amountIn", + "type": "u64" + } + ] + }, + { + "name": "setPaused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ + { + "name": "ammConfig", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [ + { + "name": "paused", + "type": "bool" + } + ] + }, + { + "name": "settleBet", + "discriminator": [ + 115, + 55, + 234, + 177, + 227, + 4, + 10, + 67 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "adminState", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "duelState", + "docs": [ + "Optional: fight_oracle DuelState account. When provided, winner is read", + "from the oracle rather than trusting the caller's `side_won` argument." + ], + "optional": true + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "sideWon", + "type": "u8" + } + ] + }, + { + "name": "withdrawPostSettle", + "discriminator": [ + 133, + 23, + 211, + 230, + 77, + 52, + 64, + 154 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "destinationYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destinationNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "tokenProgram" + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "associatedTokenProgram", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "q", + "type": "u64" + } + ] + } + ], + "accounts": [ + { + "name": "admin", + "discriminator": [ + 244, + 158, + 220, + 65, + 8, + 73, + 4, + 65 + ] + }, + { + "name": "ammConfig", + "discriminator": [ + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 + ] + }, + { + "name": "bet", + "discriminator": [ + 147, + 23, + 35, + 59, + 15, + 75, + 155, + 32 + ] + } + ], + "events": [ + { + "name": "adminStateInitialized", + "discriminator": [ + 211, + 115, + 86, + 90, + 176, + 197, + 254, + 121 + ] + }, + { + "name": "ammConfigFrozen", + "discriminator": [ + 247, + 80, + 58, + 72, + 123, + 117, + 119, + 164 + ] + }, + { + "name": "ammConfigInitialized", + "discriminator": [ + 105, + 30, + 129, + 183, + 100, + 137, + 26, + 239 + ] + }, + { + "name": "ammPausedChanged", + "discriminator": [ + 69, + 202, + 147, + 173, + 81, + 7, + 62, + 82 + ] + } + ], + "errors": [ + { + "code": 6000, + "name": "canOnlyBeInitializedByOwner", + "msg": "Can only be initialized by owner" + }, + { + "code": 6001, + "name": "outComeCanOnlyBe01", + "msg": "outcome can only be 0 for yes or 1 for no" + }, + { + "code": 6002, + "name": "invalidInitialLiq", + "msg": "initial liq must be greater than 100000" + }, + { + "code": 6003, + "name": "quantityMustBeGreaterThanZero", + "msg": "quantity must be greater than zero" + }, + { + "code": 6004, + "name": "signerDoesntHaveEnoughTokens", + "msg": "Signer doesn't have enough tokens" + }, + { + "code": 6005, + "name": "notEnoughLamports", + "msg": "Bet account doesn't have enough lamports" + }, + { + "code": 6006, + "name": "notEnoughSharesToReduce", + "msg": "Bet account doesn't have enough shares" + }, + { + "code": 6007, + "name": "adminStateAlreadyInitialized", + "msg": "Admin state already initialized" + }, + { + "code": 6008, + "name": "signerIsNotSettlePubKey", + "msg": "Signer is not the settle pub key" + }, + { + "code": 6009, + "name": "betAlreadySettled", + "msg": "Bet already settled" + }, + { + "code": 6010, + "name": "betNotSettled", + "msg": "Bet not settled" + }, + { + "code": 6011, + "name": "betNotExpired", + "msg": "Bet not expired" + }, + { + "code": 6012, + "name": "mathErr", + "msg": "Overflow or Underflow" + }, + { + "code": 6013, + "name": "invalidAddress", + "msg": "Invalid address (zero/default)" + }, + { + "code": 6014, + "name": "feeTooHigh", + "msg": "Fee BPS exceeds maximum (1000 = 10%)" + }, + { + "code": 6015, + "name": "marketPaused", + "msg": "Market is paused" + }, + { + "code": 6016, + "name": "configFrozen", + "msg": "Config is frozen" + } + ], + "types": [ + { + "name": "admin", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "isInitialized", + "type": "bool" + } + ] + } + }, + { + "name": "adminStateInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "isInitialized", + "type": "bool" + } + ] + } + }, + { + "name": "ammConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "marketMaker", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + }, + { + "name": "configFrozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "ammConfigFrozen", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + } + ] + } + }, + { + "name": "ammConfigInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + } + ] + } + }, + { + "name": "ammPausedChanged", + "type": { + "kind": "struct", + "fields": [ + { + "name": "paused", + "type": "bool" + } + ] + } + }, + { + "name": "bet", + "type": { + "kind": "struct", + "fields": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "initialLiq", + "type": "u64" + }, + { + "name": "isDynamic", + "type": "bool" + }, + { + "name": "reserves", + "type": { + "array": [ + "u64", + 2 + ] + } + }, + { + "name": "betPrompt", + "type": "string" + }, + { + "name": "isInitialized", + "type": "bool" + }, + { + "name": "sideWon", + "type": { + "option": "u8" + } + }, + { + "name": "expirationAt", + "type": "i64" + }, + { + "name": "createdAt", + "type": "i64" + }, + { + "name": "creator", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + } + ] + } + } + ] +}; diff --git a/packages/hyperbet-evm/keeper/src/idl/lvr_amm.json b/packages/hyperbet-evm/keeper/src/idl/lvr_amm.json new file mode 100644 index 00000000..fe58ca53 --- /dev/null +++ b/packages/hyperbet-evm/keeper/src/idl/lvr_amm.json @@ -0,0 +1,1887 @@ +{ + "address": "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", + "metadata": { + "name": "lvr_amm", + "version": "0.1.0", + "spec": "0.1.0", + "description": "LvrAMM" + }, + "instructions": [ + { + "name": "buy", + "discriminator": [ + 102, + 6, + 61, + 18, + 1, + 218, + 235, + 234 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "create_bet_account", + "discriminator": [ + 24, + 219, + 70, + 229, + 81, + 50, + 3, + 28 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "expiration_at", + "type": "i64" + } + ] + }, + { + "name": "freeze_config", + "discriminator": [ + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [] + }, + { + "name": "get_price", + "discriminator": [ + 238, + 38, + 193, + 106, + 228, + 32, + 210, + 33 + ], + "accounts": [ + { + "name": "bet", + "writable": true + } + ], + "args": [ + { + "name": "outcome", + "type": "u8" + } + ], + "returns": "u64" + }, + { + "name": "init_bet_account", + "discriminator": [ + 229, + 240, + 116, + 140, + 5, + 177, + 61, + 69 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + } + ] + }, + { + "name": "initialize", + "discriminator": [ + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 + ], + "accounts": [ + { + "name": "admin_state", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "initialize_config", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + }, + { + "name": "sell", + "discriminator": [ + 51, + 230, + 133, + 164, + 1, + 127, + 131, + 173 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "treasury_yes_ata", + "writable": true + }, + { + "name": "treasury_no_ata", + "writable": true + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "set_paused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [ + { + "name": "paused", + "type": "bool" + } + ] + }, + { + "name": "settle_bet", + "discriminator": [ + 115, + 55, + 234, + 177, + 227, + 4, + 10, + 67 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "admin_state", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "duel_state", + "docs": [ + "Optional: fight_oracle DuelState account. When provided, winner is read", + "from the oracle rather than trusting the caller's `side_won` argument." + ], + "optional": true + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "side_won", + "type": "u8" + } + ] + }, + { + "name": "withdraw_post_settle", + "discriminator": [ + 133, + 23, + 211, + 230, + 77, + 52, + 64, + 154 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "token_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "q", + "type": "u64" + } + ] + } + ], + "accounts": [ + { + "name": "Admin", + "discriminator": [ + 244, + 158, + 220, + 65, + 8, + 73, + 4, + 65 + ] + }, + { + "name": "AmmConfig", + "discriminator": [ + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 + ] + }, + { + "name": "Bet", + "discriminator": [ + 147, + 23, + 35, + 59, + 15, + 75, + 155, + 32 + ] + } + ], + "events": [ + { + "name": "AdminStateInitialized", + "discriminator": [ + 211, + 115, + 86, + 90, + 176, + 197, + 254, + 121 + ] + }, + { + "name": "AmmConfigFrozen", + "discriminator": [ + 247, + 80, + 58, + 72, + 123, + 117, + 119, + 164 + ] + }, + { + "name": "AmmConfigInitialized", + "discriminator": [ + 105, + 30, + 129, + 183, + 100, + 137, + 26, + 239 + ] + }, + { + "name": "AmmPausedChanged", + "discriminator": [ + 69, + 202, + 147, + 173, + 81, + 7, + 62, + 82 + ] + } + ], + "errors": [ + { + "code": 6000, + "name": "CanOnlyBeInitializedByOwner", + "msg": "Can only be initialized by owner" + }, + { + "code": 6001, + "name": "OutComeCanOnlyBe01", + "msg": "outcome can only be 0 for yes or 1 for no" + }, + { + "code": 6002, + "name": "InvalidInitialLiq", + "msg": "initial liq must be greater than 100000" + }, + { + "code": 6003, + "name": "QuantityMustBeGreaterThanZero", + "msg": "quantity must be greater than zero" + }, + { + "code": 6004, + "name": "SignerDoesntHaveEnoughTokens", + "msg": "Signer doesn't have enough tokens" + }, + { + "code": 6005, + "name": "NotEnoughLamports", + "msg": "Bet account doesn't have enough lamports" + }, + { + "code": 6006, + "name": "NotEnoughSharesToReduce", + "msg": "Bet account doesn't have enough shares" + }, + { + "code": 6007, + "name": "AdminStateAlreadyInitialized", + "msg": "Admin state already initialized" + }, + { + "code": 6008, + "name": "SignerIsNotSettlePubKey", + "msg": "Signer is not the settle pub key" + }, + { + "code": 6009, + "name": "BetAlreadySettled", + "msg": "Bet already settled" + }, + { + "code": 6010, + "name": "BetNotSettled", + "msg": "Bet not settled" + }, + { + "code": 6011, + "name": "BetNotExpired", + "msg": "Bet not expired" + }, + { + "code": 6012, + "name": "MathErr", + "msg": "Overflow or Underflow" + }, + { + "code": 6013, + "name": "InvalidAddress", + "msg": "Invalid address (zero/default)" + }, + { + "code": 6014, + "name": "FeeTooHigh", + "msg": "Fee BPS exceeds maximum (1000 = 10%)" + }, + { + "code": 6015, + "name": "MarketPaused", + "msg": "Market is paused" + }, + { + "code": 6016, + "name": "ConfigFrozen", + "msg": "Config is frozen" + } + ], + "types": [ + { + "name": "Admin", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AdminStateInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AmmConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + }, + { + "name": "config_frozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "AmmConfigFrozen", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + } + ] + } + }, + { + "name": "AmmConfigInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + }, + { + "name": "AmmPausedChanged", + "type": { + "kind": "struct", + "fields": [ + { + "name": "paused", + "type": "bool" + } + ] + } + }, + { + "name": "Bet", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "reserves", + "type": { + "array": [ + "u64", + 2 + ] + } + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "is_initialized", + "type": "bool" + }, + { + "name": "side_won", + "type": { + "option": "u8" + } + }, + { + "name": "expiration_at", + "type": "i64" + }, + { + "name": "created_at", + "type": "i64" + }, + { + "name": "creator", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/packages/hyperbet-evm/keeper/src/idl/lvr_amm.ts b/packages/hyperbet-evm/keeper/src/idl/lvr_amm.ts new file mode 100644 index 00000000..d4b3b8aa --- /dev/null +++ b/packages/hyperbet-evm/keeper/src/idl/lvr_amm.ts @@ -0,0 +1,1893 @@ +/** + * Program IDL in camelCase format in order to be used in JS/TS. + * + * Note that this is only a type helper and is not the actual IDL. The original + * IDL can be found at `target/idl/lvr_amm.json`. + */ +export type LvrAmm = { + "address": "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", + "metadata": { + "name": "lvrAmm", + "version": "0.1.0", + "spec": "0.1.0", + "description": "lvrAmm" + }, + "instructions": [ + { + "name": "buy", + "discriminator": [ + 102, + 6, + 61, + 18, + 1, + 218, + 235, + 234 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "destinationYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destinationNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "tokenProgram", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "associatedTokenProgram", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amountIn", + "type": "u64" + } + ] + }, + { + "name": "createBetAccount", + "discriminator": [ + 24, + 219, + 70, + 229, + 81, + 50, + 3, + 28 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "tokenProgram", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "initialLiq", + "type": "u64" + }, + { + "name": "isDynamic", + "type": "bool" + }, + { + "name": "betPrompt", + "type": "string" + }, + { + "name": "expirationAt", + "type": "i64" + } + ] + }, + { + "name": "freezeConfig", + "discriminator": [ + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 + ], + "accounts": [ + { + "name": "ammConfig", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [] + }, + { + "name": "getPrice", + "discriminator": [ + 238, + 38, + 193, + 106, + 228, + 32, + 210, + 33 + ], + "accounts": [ + { + "name": "bet", + "writable": true + } + ], + "args": [ + { + "name": "outcome", + "type": "u8" + } + ], + "returns": "u64" + }, + { + "name": "initBetAccount", + "discriminator": [ + 229, + 240, + 116, + 140, + 5, + 177, + 61, + 69 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + } + ] + }, + { + "name": "initialize", + "discriminator": [ + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 + ], + "accounts": [ + { + "name": "adminState", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "initializeConfig", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ + { + "name": "ammConfig", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "marketMaker", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + } + ] + }, + { + "name": "sell", + "discriminator": [ + 51, + 230, + 133, + 164, + 1, + 127, + 131, + 173 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "destinationYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destinationNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "treasuryYesAta", + "writable": true + }, + { + "name": "treasuryNoAta", + "writable": true + }, + { + "name": "tokenProgram", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "associatedTokenProgram", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amountIn", + "type": "u64" + } + ] + }, + { + "name": "setPaused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ + { + "name": "ammConfig", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [ + { + "name": "paused", + "type": "bool" + } + ] + }, + { + "name": "settleBet", + "discriminator": [ + 115, + 55, + 234, + 177, + 227, + 4, + 10, + 67 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "adminState", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "duelState", + "docs": [ + "Optional: fight_oracle DuelState account. When provided, winner is read", + "from the oracle rather than trusting the caller's `side_won` argument." + ], + "optional": true + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "sideWon", + "type": "u8" + } + ] + }, + { + "name": "withdrawPostSettle", + "discriminator": [ + 133, + 23, + 211, + 230, + 77, + 52, + 64, + 154 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "destinationYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destinationNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "tokenProgram" + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "associatedTokenProgram", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "q", + "type": "u64" + } + ] + } + ], + "accounts": [ + { + "name": "admin", + "discriminator": [ + 244, + 158, + 220, + 65, + 8, + 73, + 4, + 65 + ] + }, + { + "name": "ammConfig", + "discriminator": [ + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 + ] + }, + { + "name": "bet", + "discriminator": [ + 147, + 23, + 35, + 59, + 15, + 75, + 155, + 32 + ] + } + ], + "events": [ + { + "name": "adminStateInitialized", + "discriminator": [ + 211, + 115, + 86, + 90, + 176, + 197, + 254, + 121 + ] + }, + { + "name": "ammConfigFrozen", + "discriminator": [ + 247, + 80, + 58, + 72, + 123, + 117, + 119, + 164 + ] + }, + { + "name": "ammConfigInitialized", + "discriminator": [ + 105, + 30, + 129, + 183, + 100, + 137, + 26, + 239 + ] + }, + { + "name": "ammPausedChanged", + "discriminator": [ + 69, + 202, + 147, + 173, + 81, + 7, + 62, + 82 + ] + } + ], + "errors": [ + { + "code": 6000, + "name": "canOnlyBeInitializedByOwner", + "msg": "Can only be initialized by owner" + }, + { + "code": 6001, + "name": "outComeCanOnlyBe01", + "msg": "outcome can only be 0 for yes or 1 for no" + }, + { + "code": 6002, + "name": "invalidInitialLiq", + "msg": "initial liq must be greater than 100000" + }, + { + "code": 6003, + "name": "quantityMustBeGreaterThanZero", + "msg": "quantity must be greater than zero" + }, + { + "code": 6004, + "name": "signerDoesntHaveEnoughTokens", + "msg": "Signer doesn't have enough tokens" + }, + { + "code": 6005, + "name": "notEnoughLamports", + "msg": "Bet account doesn't have enough lamports" + }, + { + "code": 6006, + "name": "notEnoughSharesToReduce", + "msg": "Bet account doesn't have enough shares" + }, + { + "code": 6007, + "name": "adminStateAlreadyInitialized", + "msg": "Admin state already initialized" + }, + { + "code": 6008, + "name": "signerIsNotSettlePubKey", + "msg": "Signer is not the settle pub key" + }, + { + "code": 6009, + "name": "betAlreadySettled", + "msg": "Bet already settled" + }, + { + "code": 6010, + "name": "betNotSettled", + "msg": "Bet not settled" + }, + { + "code": 6011, + "name": "betNotExpired", + "msg": "Bet not expired" + }, + { + "code": 6012, + "name": "mathErr", + "msg": "Overflow or Underflow" + }, + { + "code": 6013, + "name": "invalidAddress", + "msg": "Invalid address (zero/default)" + }, + { + "code": 6014, + "name": "feeTooHigh", + "msg": "Fee BPS exceeds maximum (1000 = 10%)" + }, + { + "code": 6015, + "name": "marketPaused", + "msg": "Market is paused" + }, + { + "code": 6016, + "name": "configFrozen", + "msg": "Config is frozen" + } + ], + "types": [ + { + "name": "admin", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "isInitialized", + "type": "bool" + } + ] + } + }, + { + "name": "adminStateInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "isInitialized", + "type": "bool" + } + ] + } + }, + { + "name": "ammConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "marketMaker", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + }, + { + "name": "configFrozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "ammConfigFrozen", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + } + ] + } + }, + { + "name": "ammConfigInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + } + ] + } + }, + { + "name": "ammPausedChanged", + "type": { + "kind": "struct", + "fields": [ + { + "name": "paused", + "type": "bool" + } + ] + } + }, + { + "name": "bet", + "type": { + "kind": "struct", + "fields": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "initialLiq", + "type": "u64" + }, + { + "name": "isDynamic", + "type": "bool" + }, + { + "name": "reserves", + "type": { + "array": [ + "u64", + 2 + ] + } + }, + { + "name": "betPrompt", + "type": "string" + }, + { + "name": "isInitialized", + "type": "bool" + }, + { + "name": "sideWon", + "type": { + "option": "u8" + } + }, + { + "name": "expirationAt", + "type": "i64" + }, + { + "name": "createdAt", + "type": "i64" + }, + { + "name": "creator", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + } + ] + } + } + ] +}; diff --git a/packages/hyperbet-solana/anchor/Cargo.lock b/packages/hyperbet-solana/anchor/Cargo.lock index 514ee954..8e43fd65 100644 --- a/packages/hyperbet-solana/anchor/Cargo.lock +++ b/packages/hyperbet-solana/anchor/Cargo.lock @@ -347,16 +347,15 @@ dependencies = [ [[package]] name = "blake3" -version = "1.8.3" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2468ef7d57b3fb7e16b576e8377cdbde2320c60e1491e961d11da40fc4f02a2d" +checksum = "3888aaa89e4b2a40fca9848e400f6a658a5a3978de7be858e209cafa8be9a4a0" dependencies = [ "arrayref", "arrayvec", "cc", "cfg-if", "constant_time_eq", - "cpufeatures", "digest 0.10.7", ] @@ -573,9 +572,9 @@ dependencies = [ [[package]] name = "constant_time_eq" -version = "0.4.2" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" +checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" [[package]] name = "cpufeatures" diff --git a/packages/hyperbet-solana/anchor/target/deploy/lvr_amm-keypair.json b/packages/hyperbet-solana/anchor/target/deploy/lvr_amm-keypair.json new file mode 100644 index 00000000..8fa9eea8 --- /dev/null +++ b/packages/hyperbet-solana/anchor/target/deploy/lvr_amm-keypair.json @@ -0,0 +1 @@ +[147,169,177,139,149,20,244,154,110,76,170,7,8,125,158,243,250,252,251,74,217,78,28,209,98,171,143,91,234,47,190,97,184,53,105,235,233,222,215,14,188,192,191,62,92,195,117,60,105,170,71,107,70,191,87,214,104,196,248,51,98,145,154,79] \ No newline at end of file diff --git a/packages/hyperbet-solana/anchor/target/deploy/lvr_amm.so b/packages/hyperbet-solana/anchor/target/deploy/lvr_amm.so new file mode 100755 index 0000000000000000000000000000000000000000..1122c24088c331272dcb7e80290439664a24d9cd GIT binary patch literal 468472 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 literal 0 HcmV?d00001 diff --git a/packages/hyperbet-solana/anchor/target/idl/lvr_amm.json b/packages/hyperbet-solana/anchor/target/idl/lvr_amm.json index 5f896615..fe58ca53 100644 --- a/packages/hyperbet-solana/anchor/target/idl/lvr_amm.json +++ b/packages/hyperbet-solana/anchor/target/idl/lvr_amm.json @@ -8,126 +8,340 @@ }, "instructions": [ { - "name": "initialize", + "name": "buy", "discriminator": [ - 175, - 175, - 109, - 31, - 13, - 152, - 155, - 237 + 102, + 6, + 61, + 18, + 1, + 218, + 235, + 234 ], "accounts": [ - { - "name": "admin_state", - "writable": true - }, { "name": "signer", "writable": true, "signer": true }, - { - "name": "system_program" - } - ], - "args": [] - }, - { - "name": "initialize_config", - "discriminator": [ - 208, - 127, - 21, - 1, - 194, - 190, - 196, - 70 - ], - "accounts": [ { "name": "amm_config", - "writable": true + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } }, { - "name": "signer", + "name": "bet", "writable": true, - "signer": true + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, - { - "name": "system_program" - } - ], - "args": [ { "name": "treasury", - "type": "pubkey" + "writable": true }, { - "name": "market_maker", - "type": "pubkey" + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { - "name": "fee_bps", - "type": "u16" - } - ] - }, - { - "name": "freeze_config", - "discriminator": [ - 30, - 68, - 20, - 154, - 197, - 42, - 47, - 122 - ], - "accounts": [ + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, { - "name": "amm_config", - "writable": true + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { - "name": "signer", + "name": "destination_no", "writable": true, - "signer": true - } - ], - "args": [] - }, - { - "name": "set_paused", - "discriminator": [ - 91, - 60, - 125, - 192, - 176, - 225, - 166, - 218 - ], - "accounts": [ + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, { - "name": "amm_config", - "writable": true + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" }, { - "name": "signer", - "writable": true, - "signer": true + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" } ], "args": [ { - "name": "paused", - "type": "bool" + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" } ] }, @@ -150,25 +364,115 @@ "signer": true }, { - "name": "amm_config" + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } }, { "name": "bet", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } }, { "name": "mint_yes", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } }, { "name": "mint_no", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } }, { - "name": "system_program" + "name": "system_program", + "address": "11111111111111111111111111111111" }, { - "name": "token_program" + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" } ], "args": [ @@ -195,37 +499,48 @@ ] }, { - "name": "init_bet_account", + "name": "freeze_config", "discriminator": [ - 229, - 240, - 116, - 140, - 5, - 177, - 61, - 69 + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 ], "accounts": [ { - "name": "signer", + "name": "amm_config", "writable": true, - "signer": true - }, - { - "name": "bet", - "writable": true + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } }, { - "name": "system_program" + "name": "signer", + "writable": true, + "signer": true } ], - "args": [ - { - "name": "bet_id", - "type": "u64" - } - ] + "args": [] }, { "name": "get_price", @@ -254,16 +569,16 @@ "returns": "u64" }, { - "name": "buy", + "name": "init_bet_account", "discriminator": [ - 102, - 6, + 229, + 240, + 116, + 140, + 5, + 177, 61, - 18, - 1, - 218, - 235, - 234 + 69 ], "accounts": [ { @@ -271,55 +586,149 @@ "writable": true, "signer": true }, - { - "name": "amm_config" - }, { "name": "bet", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } }, { - "name": "treasury", - "writable": true - }, + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ { - "name": "mint_yes", - "writable": true - }, + "name": "bet_id", + "type": "u64" + } + ] + }, + { + "name": "initialize", + "discriminator": [ + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 + ], + "accounts": [ { - "name": "mint_no", - "writable": true + "name": "admin_state", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } }, { - "name": "destination_yes", - "writable": true + "name": "signer", + "writable": true, + "signer": true }, { - "name": "destination_no", - "writable": true - }, + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "initialize_config", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ { - "name": "token_program" + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } }, { - "name": "system_program" + "name": "signer", + "writable": true, + "signer": true }, { - "name": "associated_token_program" + "name": "system_program", + "address": "11111111111111111111111111111111" } ], "args": [ { - "name": "bet_id", - "type": "u64" + "name": "treasury", + "type": "pubkey" }, { - "name": "outcome", - "type": "u8" + "name": "market_maker", + "type": "pubkey" }, { - "name": "amount_in", - "type": "u64" + "name": "fee_bps", + "type": "u16" } ] }, @@ -342,27 +751,292 @@ "signer": true }, { - "name": "amm_config" + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } }, { "name": "bet", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { "name": "mint_yes", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { "name": "mint_no", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { "name": "destination_yes", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "destination_no", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasury", @@ -377,13 +1051,16 @@ "writable": true }, { - "name": "token_program" + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" }, { - "name": "system_program" + "name": "system_program", + "address": "11111111111111111111111111111111" }, { - "name": "associated_token_program" + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" } ], "args": [ @@ -401,6 +1078,55 @@ } ] }, + { + "name": "set_paused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [ + { + "name": "paused", + "type": "bool" + } + ] + }, { "name": "settle_bet", "discriminator": [ @@ -420,11 +1146,52 @@ "signer": true }, { - "name": "admin_state" + "name": "admin_state", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } }, { "name": "bet", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { "name": "duel_state", @@ -466,32 +1233,280 @@ }, { "name": "bet", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { "name": "mint_yes", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { "name": "mint_no", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { "name": "destination_yes", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "destination_no", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "token_program" }, { - "name": "system_program" + "name": "system_program", + "address": "11111111111111111111111111111111" }, { - "name": "associated_token_program" + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" } ], "args": [ @@ -512,7 +1527,7 @@ ], "accounts": [ { - "name": "lvr_amm::state::admin::Admin", + "name": "Admin", "discriminator": [ 244, 158, @@ -525,7 +1540,20 @@ ] }, { - "name": "lvr_amm::state::bet::Bet", + "name": "AmmConfig", + "discriminator": [ + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 + ] + }, + { + "name": "Bet", "discriminator": [ 147, 23, @@ -536,24 +1564,168 @@ 155, 32 ] + } + ], + "events": [ + { + "name": "AdminStateInitialized", + "discriminator": [ + 211, + 115, + 86, + 90, + 176, + 197, + 254, + 121 + ] }, { - "name": "lvr_amm::state::config::AmmConfig", + "name": "AmmConfigFrozen", "discriminator": [ - 218, - 244, - 33, - 104, - 203, - 203, - 43, - 111 + 247, + 80, + 58, + 72, + 123, + 117, + 119, + 164 + ] + }, + { + "name": "AmmConfigInitialized", + "discriminator": [ + 105, + 30, + 129, + 183, + 100, + 137, + 26, + 239 + ] + }, + { + "name": "AmmPausedChanged", + "discriminator": [ + 69, + 202, + 147, + 173, + 81, + 7, + 62, + 82 ] } ], + "errors": [ + { + "code": 6000, + "name": "CanOnlyBeInitializedByOwner", + "msg": "Can only be initialized by owner" + }, + { + "code": 6001, + "name": "OutComeCanOnlyBe01", + "msg": "outcome can only be 0 for yes or 1 for no" + }, + { + "code": 6002, + "name": "InvalidInitialLiq", + "msg": "initial liq must be greater than 100000" + }, + { + "code": 6003, + "name": "QuantityMustBeGreaterThanZero", + "msg": "quantity must be greater than zero" + }, + { + "code": 6004, + "name": "SignerDoesntHaveEnoughTokens", + "msg": "Signer doesn't have enough tokens" + }, + { + "code": 6005, + "name": "NotEnoughLamports", + "msg": "Bet account doesn't have enough lamports" + }, + { + "code": 6006, + "name": "NotEnoughSharesToReduce", + "msg": "Bet account doesn't have enough shares" + }, + { + "code": 6007, + "name": "AdminStateAlreadyInitialized", + "msg": "Admin state already initialized" + }, + { + "code": 6008, + "name": "SignerIsNotSettlePubKey", + "msg": "Signer is not the settle pub key" + }, + { + "code": 6009, + "name": "BetAlreadySettled", + "msg": "Bet already settled" + }, + { + "code": 6010, + "name": "BetNotSettled", + "msg": "Bet not settled" + }, + { + "code": 6011, + "name": "BetNotExpired", + "msg": "Bet not expired" + }, + { + "code": 6012, + "name": "MathErr", + "msg": "Overflow or Underflow" + }, + { + "code": 6013, + "name": "InvalidAddress", + "msg": "Invalid address (zero/default)" + }, + { + "code": 6014, + "name": "FeeTooHigh", + "msg": "Fee BPS exceeds maximum (1000 = 10%)" + }, + { + "code": 6015, + "name": "MarketPaused", + "msg": "Market is paused" + }, + { + "code": 6016, + "name": "ConfigFrozen", + "msg": "Config is frozen" + } + ], "types": [ { - "name": "lvr_amm::state::admin::Admin", + "name": "Admin", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AdminStateInitialized", "type": { "kind": "struct", "fields": [ @@ -569,7 +1741,87 @@ } }, { - "name": "lvr_amm::state::bet::Bet", + "name": "AmmConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + }, + { + "name": "config_frozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "AmmConfigFrozen", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + } + ] + } + }, + { + "name": "AmmConfigInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + }, + { + "name": "AmmPausedChanged", + "type": { + "kind": "struct", + "fields": [ + { + "name": "paused", + "type": "bool" + } + ] + } + }, + { + "name": "Bet", "type": { "kind": "struct", "fields": [ @@ -630,42 +1882,6 @@ } ] } - }, - { - "name": "lvr_amm::state::config::AmmConfig", - "type": { - "kind": "struct", - "fields": [ - { - "name": "authority", - "type": "pubkey" - }, - { - "name": "treasury", - "type": "pubkey" - }, - { - "name": "market_maker", - "type": "pubkey" - }, - { - "name": "fee_bps", - "type": "u16" - }, - { - "name": "config_frozen", - "type": "bool" - }, - { - "name": "paused", - "type": "bool" - }, - { - "name": "bump", - "type": "u8" - } - ] - } } ] -} +} \ No newline at end of file diff --git a/packages/hyperbet-solana/anchor/target/types/lvr_amm.ts b/packages/hyperbet-solana/anchor/target/types/lvr_amm.ts index cb0aae0a..d4b3b8aa 100644 --- a/packages/hyperbet-solana/anchor/target/types/lvr_amm.ts +++ b/packages/hyperbet-solana/anchor/target/types/lvr_amm.ts @@ -1044,6 +1044,18 @@ export type LvrAmm = { } } }, + { + "name": "treasury", + "writable": true + }, + { + "name": "treasuryYesAta", + "writable": true + }, + { + "name": "treasuryNoAta", + "writable": true + }, { "name": "tokenProgram", "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" @@ -1667,51 +1679,36 @@ export type LvrAmm = { }, { "code": 6010, - "name": "betNotInitialized", - "msg": "Bet not initialized" - }, - { - "code": 6011, "name": "betNotSettled", "msg": "Bet not settled" }, { - "code": 6012, + "code": 6011, "name": "betNotExpired", "msg": "Bet not expired" }, { - "code": 6013, - "name": "invalidOracleAccount", - "msg": "Invalid oracle account" - }, - { - "code": 6014, - "name": "oracleBetMismatch", - "msg": "Oracle duel does not match bet" - }, - { - "code": 6015, + "code": 6012, "name": "mathErr", "msg": "Overflow or Underflow" }, { - "code": 6016, + "code": 6013, "name": "invalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6017, + "code": 6014, "name": "feeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6018, + "code": 6015, "name": "marketPaused", "msg": "Market is paused" }, { - "code": 6019, + "code": 6016, "name": "configFrozen", "msg": "Config is frozen" } diff --git a/packages/hyperbet-solana/app/src/idl/lvr_amm.json b/packages/hyperbet-solana/app/src/idl/lvr_amm.json new file mode 100644 index 00000000..fe58ca53 --- /dev/null +++ b/packages/hyperbet-solana/app/src/idl/lvr_amm.json @@ -0,0 +1,1887 @@ +{ + "address": "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", + "metadata": { + "name": "lvr_amm", + "version": "0.1.0", + "spec": "0.1.0", + "description": "LvrAMM" + }, + "instructions": [ + { + "name": "buy", + "discriminator": [ + 102, + 6, + 61, + 18, + 1, + 218, + 235, + 234 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "create_bet_account", + "discriminator": [ + 24, + 219, + 70, + 229, + 81, + 50, + 3, + 28 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "expiration_at", + "type": "i64" + } + ] + }, + { + "name": "freeze_config", + "discriminator": [ + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [] + }, + { + "name": "get_price", + "discriminator": [ + 238, + 38, + 193, + 106, + 228, + 32, + 210, + 33 + ], + "accounts": [ + { + "name": "bet", + "writable": true + } + ], + "args": [ + { + "name": "outcome", + "type": "u8" + } + ], + "returns": "u64" + }, + { + "name": "init_bet_account", + "discriminator": [ + 229, + 240, + 116, + 140, + 5, + 177, + 61, + 69 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + } + ] + }, + { + "name": "initialize", + "discriminator": [ + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 + ], + "accounts": [ + { + "name": "admin_state", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "initialize_config", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + }, + { + "name": "sell", + "discriminator": [ + 51, + 230, + 133, + 164, + 1, + 127, + 131, + 173 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "treasury_yes_ata", + "writable": true + }, + { + "name": "treasury_no_ata", + "writable": true + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "set_paused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [ + { + "name": "paused", + "type": "bool" + } + ] + }, + { + "name": "settle_bet", + "discriminator": [ + 115, + 55, + 234, + 177, + 227, + 4, + 10, + 67 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "admin_state", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "duel_state", + "docs": [ + "Optional: fight_oracle DuelState account. When provided, winner is read", + "from the oracle rather than trusting the caller's `side_won` argument." + ], + "optional": true + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "side_won", + "type": "u8" + } + ] + }, + { + "name": "withdraw_post_settle", + "discriminator": [ + 133, + 23, + 211, + 230, + 77, + 52, + 64, + 154 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "token_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "q", + "type": "u64" + } + ] + } + ], + "accounts": [ + { + "name": "Admin", + "discriminator": [ + 244, + 158, + 220, + 65, + 8, + 73, + 4, + 65 + ] + }, + { + "name": "AmmConfig", + "discriminator": [ + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 + ] + }, + { + "name": "Bet", + "discriminator": [ + 147, + 23, + 35, + 59, + 15, + 75, + 155, + 32 + ] + } + ], + "events": [ + { + "name": "AdminStateInitialized", + "discriminator": [ + 211, + 115, + 86, + 90, + 176, + 197, + 254, + 121 + ] + }, + { + "name": "AmmConfigFrozen", + "discriminator": [ + 247, + 80, + 58, + 72, + 123, + 117, + 119, + 164 + ] + }, + { + "name": "AmmConfigInitialized", + "discriminator": [ + 105, + 30, + 129, + 183, + 100, + 137, + 26, + 239 + ] + }, + { + "name": "AmmPausedChanged", + "discriminator": [ + 69, + 202, + 147, + 173, + 81, + 7, + 62, + 82 + ] + } + ], + "errors": [ + { + "code": 6000, + "name": "CanOnlyBeInitializedByOwner", + "msg": "Can only be initialized by owner" + }, + { + "code": 6001, + "name": "OutComeCanOnlyBe01", + "msg": "outcome can only be 0 for yes or 1 for no" + }, + { + "code": 6002, + "name": "InvalidInitialLiq", + "msg": "initial liq must be greater than 100000" + }, + { + "code": 6003, + "name": "QuantityMustBeGreaterThanZero", + "msg": "quantity must be greater than zero" + }, + { + "code": 6004, + "name": "SignerDoesntHaveEnoughTokens", + "msg": "Signer doesn't have enough tokens" + }, + { + "code": 6005, + "name": "NotEnoughLamports", + "msg": "Bet account doesn't have enough lamports" + }, + { + "code": 6006, + "name": "NotEnoughSharesToReduce", + "msg": "Bet account doesn't have enough shares" + }, + { + "code": 6007, + "name": "AdminStateAlreadyInitialized", + "msg": "Admin state already initialized" + }, + { + "code": 6008, + "name": "SignerIsNotSettlePubKey", + "msg": "Signer is not the settle pub key" + }, + { + "code": 6009, + "name": "BetAlreadySettled", + "msg": "Bet already settled" + }, + { + "code": 6010, + "name": "BetNotSettled", + "msg": "Bet not settled" + }, + { + "code": 6011, + "name": "BetNotExpired", + "msg": "Bet not expired" + }, + { + "code": 6012, + "name": "MathErr", + "msg": "Overflow or Underflow" + }, + { + "code": 6013, + "name": "InvalidAddress", + "msg": "Invalid address (zero/default)" + }, + { + "code": 6014, + "name": "FeeTooHigh", + "msg": "Fee BPS exceeds maximum (1000 = 10%)" + }, + { + "code": 6015, + "name": "MarketPaused", + "msg": "Market is paused" + }, + { + "code": 6016, + "name": "ConfigFrozen", + "msg": "Config is frozen" + } + ], + "types": [ + { + "name": "Admin", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AdminStateInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AmmConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + }, + { + "name": "config_frozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "AmmConfigFrozen", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + } + ] + } + }, + { + "name": "AmmConfigInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + }, + { + "name": "AmmPausedChanged", + "type": { + "kind": "struct", + "fields": [ + { + "name": "paused", + "type": "bool" + } + ] + } + }, + { + "name": "Bet", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "reserves", + "type": { + "array": [ + "u64", + 2 + ] + } + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "is_initialized", + "type": "bool" + }, + { + "name": "side_won", + "type": { + "option": "u8" + } + }, + { + "name": "expiration_at", + "type": "i64" + }, + { + "name": "created_at", + "type": "i64" + }, + { + "name": "creator", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/packages/hyperbet-solana/app/src/idl/lvr_amm.ts b/packages/hyperbet-solana/app/src/idl/lvr_amm.ts index 8524b9ec..d4b3b8aa 100644 --- a/packages/hyperbet-solana/app/src/idl/lvr_amm.ts +++ b/packages/hyperbet-solana/app/src/idl/lvr_amm.ts @@ -501,15 +501,6 @@ export type LvrAmm = { { "name": "expirationAt", "type": "i64" - }, - { - "name": "duelKey", - "type": { - "array": [ - "u8", - 32 - ] - } } ] }, @@ -1053,6 +1044,18 @@ export type LvrAmm = { } } }, + { + "name": "treasury", + "writable": true + }, + { + "name": "treasuryYesAta", + "writable": true + }, + { + "name": "treasuryNoAta", + "writable": true + }, { "name": "tokenProgram", "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" @@ -1676,51 +1679,36 @@ export type LvrAmm = { }, { "code": 6010, - "name": "betNotInitialized", - "msg": "Bet not initialized" - }, - { - "code": 6011, "name": "betNotSettled", "msg": "Bet not settled" }, { - "code": 6012, + "code": 6011, "name": "betNotExpired", "msg": "Bet not expired" }, { - "code": 6013, - "name": "invalidOracleAccount", - "msg": "Invalid oracle account" - }, - { - "code": 6014, - "name": "oracleBetMismatch", - "msg": "Oracle duel does not match bet" - }, - { - "code": 6015, + "code": 6012, "name": "mathErr", "msg": "Overflow or Underflow" }, { - "code": 6016, + "code": 6013, "name": "invalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6017, + "code": 6014, "name": "feeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6018, + "code": 6015, "name": "marketPaused", "msg": "Market is paused" }, { - "code": 6019, + "code": 6016, "name": "configFrozen", "msg": "Config is frozen" } @@ -1897,18 +1885,6 @@ export type LvrAmm = { { "name": "feeBps", "type": "u16" - }, - { - "name": "duelKey", - "docs": [ - "Full 32-byte duel key for oracle cross-reference (0 if not set)" - ], - "type": { - "array": [ - "u8", - 32 - ] - } } ] } diff --git a/packages/hyperbet-solana/keeper/src/common.ts b/packages/hyperbet-solana/keeper/src/common.ts index eb672179..fc6ac8a5 100644 --- a/packages/hyperbet-solana/keeper/src/common.ts +++ b/packages/hyperbet-solana/keeper/src/common.ts @@ -164,6 +164,15 @@ function resolveConfiguredProgramId( return resolveProgramId(idlJson, fallback); } +function resolveOptionalProgramId( + configuredAddress: string | undefined, + fallback: string | undefined, +): PublicKey | null { + const candidate = configuredAddress?.trim() || fallback?.trim() || ""; + if (!candidate) return null; + return new PublicKey(candidate); +} + function ensureIdlAddress(idlJson: unknown, programId: PublicKey): Idl { const idlWithMaybeAddress = idlJson as Idl & { address?: string }; return { @@ -187,10 +196,9 @@ export const GOLD_PERPS_MARKET_PROGRAM_ID = resolveConfiguredProgramId( goldPerpsMarketIdl, solanaDeployment.goldPerpsMarketProgramId, ); -export const GOLD_AMM_MARKET_PROGRAM_ID = new PublicKey( - process.env.GOLD_AMM_MARKET_PROGRAM_ID ?? - solanaDeployment.goldAmmMarketProgramId ?? - "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", +export const GOLD_AMM_MARKET_PROGRAM_ID = resolveOptionalProgramId( + process.env.GOLD_AMM_MARKET_PROGRAM_ID, + solanaDeployment.goldAmmMarketProgramId, ); /** @deprecated Binary market is no longer deployed. Retained for backward compat. */ diff --git a/packages/hyperbet-solana/keeper/src/idl/lvr_amm.json b/packages/hyperbet-solana/keeper/src/idl/lvr_amm.json new file mode 100644 index 00000000..fe58ca53 --- /dev/null +++ b/packages/hyperbet-solana/keeper/src/idl/lvr_amm.json @@ -0,0 +1,1887 @@ +{ + "address": "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", + "metadata": { + "name": "lvr_amm", + "version": "0.1.0", + "spec": "0.1.0", + "description": "LvrAMM" + }, + "instructions": [ + { + "name": "buy", + "discriminator": [ + 102, + 6, + 61, + 18, + 1, + 218, + 235, + 234 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "create_bet_account", + "discriminator": [ + 24, + 219, + 70, + 229, + 81, + 50, + 3, + 28 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "expiration_at", + "type": "i64" + } + ] + }, + { + "name": "freeze_config", + "discriminator": [ + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [] + }, + { + "name": "get_price", + "discriminator": [ + 238, + 38, + 193, + 106, + 228, + 32, + 210, + 33 + ], + "accounts": [ + { + "name": "bet", + "writable": true + } + ], + "args": [ + { + "name": "outcome", + "type": "u8" + } + ], + "returns": "u64" + }, + { + "name": "init_bet_account", + "discriminator": [ + 229, + 240, + 116, + 140, + 5, + 177, + 61, + 69 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + } + ] + }, + { + "name": "initialize", + "discriminator": [ + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 + ], + "accounts": [ + { + "name": "admin_state", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "initialize_config", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + }, + { + "name": "sell", + "discriminator": [ + 51, + 230, + 133, + 164, + 1, + 127, + 131, + 173 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "treasury_yes_ata", + "writable": true + }, + { + "name": "treasury_no_ata", + "writable": true + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "set_paused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [ + { + "name": "paused", + "type": "bool" + } + ] + }, + { + "name": "settle_bet", + "discriminator": [ + 115, + 55, + 234, + 177, + 227, + 4, + 10, + 67 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "admin_state", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "duel_state", + "docs": [ + "Optional: fight_oracle DuelState account. When provided, winner is read", + "from the oracle rather than trusting the caller's `side_won` argument." + ], + "optional": true + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "side_won", + "type": "u8" + } + ] + }, + { + "name": "withdraw_post_settle", + "discriminator": [ + 133, + 23, + 211, + 230, + 77, + 52, + 64, + 154 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "token_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "q", + "type": "u64" + } + ] + } + ], + "accounts": [ + { + "name": "Admin", + "discriminator": [ + 244, + 158, + 220, + 65, + 8, + 73, + 4, + 65 + ] + }, + { + "name": "AmmConfig", + "discriminator": [ + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 + ] + }, + { + "name": "Bet", + "discriminator": [ + 147, + 23, + 35, + 59, + 15, + 75, + 155, + 32 + ] + } + ], + "events": [ + { + "name": "AdminStateInitialized", + "discriminator": [ + 211, + 115, + 86, + 90, + 176, + 197, + 254, + 121 + ] + }, + { + "name": "AmmConfigFrozen", + "discriminator": [ + 247, + 80, + 58, + 72, + 123, + 117, + 119, + 164 + ] + }, + { + "name": "AmmConfigInitialized", + "discriminator": [ + 105, + 30, + 129, + 183, + 100, + 137, + 26, + 239 + ] + }, + { + "name": "AmmPausedChanged", + "discriminator": [ + 69, + 202, + 147, + 173, + 81, + 7, + 62, + 82 + ] + } + ], + "errors": [ + { + "code": 6000, + "name": "CanOnlyBeInitializedByOwner", + "msg": "Can only be initialized by owner" + }, + { + "code": 6001, + "name": "OutComeCanOnlyBe01", + "msg": "outcome can only be 0 for yes or 1 for no" + }, + { + "code": 6002, + "name": "InvalidInitialLiq", + "msg": "initial liq must be greater than 100000" + }, + { + "code": 6003, + "name": "QuantityMustBeGreaterThanZero", + "msg": "quantity must be greater than zero" + }, + { + "code": 6004, + "name": "SignerDoesntHaveEnoughTokens", + "msg": "Signer doesn't have enough tokens" + }, + { + "code": 6005, + "name": "NotEnoughLamports", + "msg": "Bet account doesn't have enough lamports" + }, + { + "code": 6006, + "name": "NotEnoughSharesToReduce", + "msg": "Bet account doesn't have enough shares" + }, + { + "code": 6007, + "name": "AdminStateAlreadyInitialized", + "msg": "Admin state already initialized" + }, + { + "code": 6008, + "name": "SignerIsNotSettlePubKey", + "msg": "Signer is not the settle pub key" + }, + { + "code": 6009, + "name": "BetAlreadySettled", + "msg": "Bet already settled" + }, + { + "code": 6010, + "name": "BetNotSettled", + "msg": "Bet not settled" + }, + { + "code": 6011, + "name": "BetNotExpired", + "msg": "Bet not expired" + }, + { + "code": 6012, + "name": "MathErr", + "msg": "Overflow or Underflow" + }, + { + "code": 6013, + "name": "InvalidAddress", + "msg": "Invalid address (zero/default)" + }, + { + "code": 6014, + "name": "FeeTooHigh", + "msg": "Fee BPS exceeds maximum (1000 = 10%)" + }, + { + "code": 6015, + "name": "MarketPaused", + "msg": "Market is paused" + }, + { + "code": 6016, + "name": "ConfigFrozen", + "msg": "Config is frozen" + } + ], + "types": [ + { + "name": "Admin", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AdminStateInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AmmConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + }, + { + "name": "config_frozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "AmmConfigFrozen", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + } + ] + } + }, + { + "name": "AmmConfigInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + }, + { + "name": "AmmPausedChanged", + "type": { + "kind": "struct", + "fields": [ + { + "name": "paused", + "type": "bool" + } + ] + } + }, + { + "name": "Bet", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "reserves", + "type": { + "array": [ + "u64", + 2 + ] + } + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "is_initialized", + "type": "bool" + }, + { + "name": "side_won", + "type": { + "option": "u8" + } + }, + { + "name": "expiration_at", + "type": "i64" + }, + { + "name": "created_at", + "type": "i64" + }, + { + "name": "creator", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/packages/hyperbet-solana/keeper/src/idl/lvr_amm.ts b/packages/hyperbet-solana/keeper/src/idl/lvr_amm.ts new file mode 100644 index 00000000..d4b3b8aa --- /dev/null +++ b/packages/hyperbet-solana/keeper/src/idl/lvr_amm.ts @@ -0,0 +1,1893 @@ +/** + * Program IDL in camelCase format in order to be used in JS/TS. + * + * Note that this is only a type helper and is not the actual IDL. The original + * IDL can be found at `target/idl/lvr_amm.json`. + */ +export type LvrAmm = { + "address": "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", + "metadata": { + "name": "lvrAmm", + "version": "0.1.0", + "spec": "0.1.0", + "description": "lvrAmm" + }, + "instructions": [ + { + "name": "buy", + "discriminator": [ + 102, + 6, + 61, + 18, + 1, + 218, + 235, + 234 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "destinationYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destinationNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "tokenProgram", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "associatedTokenProgram", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amountIn", + "type": "u64" + } + ] + }, + { + "name": "createBetAccount", + "discriminator": [ + 24, + 219, + 70, + 229, + 81, + 50, + 3, + 28 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "tokenProgram", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "initialLiq", + "type": "u64" + }, + { + "name": "isDynamic", + "type": "bool" + }, + { + "name": "betPrompt", + "type": "string" + }, + { + "name": "expirationAt", + "type": "i64" + } + ] + }, + { + "name": "freezeConfig", + "discriminator": [ + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 + ], + "accounts": [ + { + "name": "ammConfig", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [] + }, + { + "name": "getPrice", + "discriminator": [ + 238, + 38, + 193, + 106, + 228, + 32, + 210, + 33 + ], + "accounts": [ + { + "name": "bet", + "writable": true + } + ], + "args": [ + { + "name": "outcome", + "type": "u8" + } + ], + "returns": "u64" + }, + { + "name": "initBetAccount", + "discriminator": [ + 229, + 240, + 116, + 140, + 5, + 177, + 61, + 69 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + } + ] + }, + { + "name": "initialize", + "discriminator": [ + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 + ], + "accounts": [ + { + "name": "adminState", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "initializeConfig", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ + { + "name": "ammConfig", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "marketMaker", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + } + ] + }, + { + "name": "sell", + "discriminator": [ + 51, + 230, + 133, + 164, + 1, + 127, + 131, + 173 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "destinationYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destinationNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "treasuryYesAta", + "writable": true + }, + { + "name": "treasuryNoAta", + "writable": true + }, + { + "name": "tokenProgram", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "associatedTokenProgram", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amountIn", + "type": "u64" + } + ] + }, + { + "name": "setPaused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ + { + "name": "ammConfig", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [ + { + "name": "paused", + "type": "bool" + } + ] + }, + { + "name": "settleBet", + "discriminator": [ + 115, + 55, + 234, + 177, + 227, + 4, + 10, + 67 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "adminState", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "duelState", + "docs": [ + "Optional: fight_oracle DuelState account. When provided, winner is read", + "from the oracle rather than trusting the caller's `side_won` argument." + ], + "optional": true + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "sideWon", + "type": "u8" + } + ] + }, + { + "name": "withdrawPostSettle", + "discriminator": [ + 133, + 23, + 211, + 230, + 77, + 52, + 64, + 154 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "betId" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "mintNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "bet" + } + ] + } + }, + { + "name": "destinationYes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destinationNo", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "tokenProgram" + }, + { + "name": "systemProgram", + "address": "11111111111111111111111111111111" + }, + { + "name": "associatedTokenProgram", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "q", + "type": "u64" + } + ] + } + ], + "accounts": [ + { + "name": "admin", + "discriminator": [ + 244, + 158, + 220, + 65, + 8, + 73, + 4, + 65 + ] + }, + { + "name": "ammConfig", + "discriminator": [ + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 + ] + }, + { + "name": "bet", + "discriminator": [ + 147, + 23, + 35, + 59, + 15, + 75, + 155, + 32 + ] + } + ], + "events": [ + { + "name": "adminStateInitialized", + "discriminator": [ + 211, + 115, + 86, + 90, + 176, + 197, + 254, + 121 + ] + }, + { + "name": "ammConfigFrozen", + "discriminator": [ + 247, + 80, + 58, + 72, + 123, + 117, + 119, + 164 + ] + }, + { + "name": "ammConfigInitialized", + "discriminator": [ + 105, + 30, + 129, + 183, + 100, + 137, + 26, + 239 + ] + }, + { + "name": "ammPausedChanged", + "discriminator": [ + 69, + 202, + 147, + 173, + 81, + 7, + 62, + 82 + ] + } + ], + "errors": [ + { + "code": 6000, + "name": "canOnlyBeInitializedByOwner", + "msg": "Can only be initialized by owner" + }, + { + "code": 6001, + "name": "outComeCanOnlyBe01", + "msg": "outcome can only be 0 for yes or 1 for no" + }, + { + "code": 6002, + "name": "invalidInitialLiq", + "msg": "initial liq must be greater than 100000" + }, + { + "code": 6003, + "name": "quantityMustBeGreaterThanZero", + "msg": "quantity must be greater than zero" + }, + { + "code": 6004, + "name": "signerDoesntHaveEnoughTokens", + "msg": "Signer doesn't have enough tokens" + }, + { + "code": 6005, + "name": "notEnoughLamports", + "msg": "Bet account doesn't have enough lamports" + }, + { + "code": 6006, + "name": "notEnoughSharesToReduce", + "msg": "Bet account doesn't have enough shares" + }, + { + "code": 6007, + "name": "adminStateAlreadyInitialized", + "msg": "Admin state already initialized" + }, + { + "code": 6008, + "name": "signerIsNotSettlePubKey", + "msg": "Signer is not the settle pub key" + }, + { + "code": 6009, + "name": "betAlreadySettled", + "msg": "Bet already settled" + }, + { + "code": 6010, + "name": "betNotSettled", + "msg": "Bet not settled" + }, + { + "code": 6011, + "name": "betNotExpired", + "msg": "Bet not expired" + }, + { + "code": 6012, + "name": "mathErr", + "msg": "Overflow or Underflow" + }, + { + "code": 6013, + "name": "invalidAddress", + "msg": "Invalid address (zero/default)" + }, + { + "code": 6014, + "name": "feeTooHigh", + "msg": "Fee BPS exceeds maximum (1000 = 10%)" + }, + { + "code": 6015, + "name": "marketPaused", + "msg": "Market is paused" + }, + { + "code": 6016, + "name": "configFrozen", + "msg": "Config is frozen" + } + ], + "types": [ + { + "name": "admin", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "isInitialized", + "type": "bool" + } + ] + } + }, + { + "name": "adminStateInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "isInitialized", + "type": "bool" + } + ] + } + }, + { + "name": "ammConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "marketMaker", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + }, + { + "name": "configFrozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "ammConfigFrozen", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + } + ] + } + }, + { + "name": "ammConfigInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + } + ] + } + }, + { + "name": "ammPausedChanged", + "type": { + "kind": "struct", + "fields": [ + { + "name": "paused", + "type": "bool" + } + ] + } + }, + { + "name": "bet", + "type": { + "kind": "struct", + "fields": [ + { + "name": "betId", + "type": "u64" + }, + { + "name": "initialLiq", + "type": "u64" + }, + { + "name": "isDynamic", + "type": "bool" + }, + { + "name": "reserves", + "type": { + "array": [ + "u64", + 2 + ] + } + }, + { + "name": "betPrompt", + "type": "string" + }, + { + "name": "isInitialized", + "type": "bool" + }, + { + "name": "sideWon", + "type": { + "option": "u8" + } + }, + { + "name": "expirationAt", + "type": "i64" + }, + { + "name": "createdAt", + "type": "i64" + }, + { + "name": "creator", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "feeBps", + "type": "u16" + } + ] + } + } + ] +}; diff --git a/packages/hyperbet-ui/src/idl/lvr_amm.json b/packages/hyperbet-ui/src/idl/lvr_amm.json new file mode 100644 index 00000000..fe58ca53 --- /dev/null +++ b/packages/hyperbet-ui/src/idl/lvr_amm.json @@ -0,0 +1,1887 @@ +{ + "address": "Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5", + "metadata": { + "name": "lvr_amm", + "version": "0.1.0", + "spec": "0.1.0", + "description": "LvrAMM" + }, + "instructions": [ + { + "name": "buy", + "discriminator": [ + 102, + 6, + 61, + 18, + 1, + 218, + 235, + 234 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "create_bet_account", + "discriminator": [ + 24, + 219, + 70, + 229, + 81, + 50, + 3, + 28 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "expiration_at", + "type": "i64" + } + ] + }, + { + "name": "freeze_config", + "discriminator": [ + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [] + }, + { + "name": "get_price", + "discriminator": [ + 238, + 38, + 193, + 106, + 228, + 32, + 210, + 33 + ], + "accounts": [ + { + "name": "bet", + "writable": true + } + ], + "args": [ + { + "name": "outcome", + "type": "u8" + } + ], + "returns": "u64" + }, + { + "name": "init_bet_account", + "discriminator": [ + 229, + 240, + 116, + 140, + 5, + 177, + 61, + 69 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + } + ] + }, + { + "name": "initialize", + "discriminator": [ + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 + ], + "accounts": [ + { + "name": "admin_state", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "initialize_config", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + }, + { + "name": "sell", + "discriminator": [ + 51, + 230, + 133, + 164, + 1, + 127, + 131, + 173 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "treasury", + "writable": true + }, + { + "name": "treasury_yes_ata", + "writable": true + }, + { + "name": "treasury_no_ata", + "writable": true + }, + { + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" + } + ] + }, + { + "name": "set_paused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [ + { + "name": "paused", + "type": "bool" + } + ] + }, + { + "name": "settle_bet", + "discriminator": [ + 115, + 55, + 234, + 177, + 227, + 4, + 10, + 67 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "admin_state", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "duel_state", + "docs": [ + "Optional: fight_oracle DuelState account. When provided, winner is read", + "from the oracle rather than trusting the caller's `side_won` argument." + ], + "optional": true + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "side_won", + "type": "u8" + } + ] + }, + { + "name": "withdraw_post_settle", + "discriminator": [ + 133, + 23, + 211, + 230, + 77, + 52, + 64, + 154 + ], + "accounts": [ + { + "name": "signer", + "writable": true, + "signer": true + }, + { + "name": "bet", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, + { + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "destination_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, + { + "name": "token_program" + }, + { + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" + } + ], + "args": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "q", + "type": "u64" + } + ] + } + ], + "accounts": [ + { + "name": "Admin", + "discriminator": [ + 244, + 158, + 220, + 65, + 8, + 73, + 4, + 65 + ] + }, + { + "name": "AmmConfig", + "discriminator": [ + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 + ] + }, + { + "name": "Bet", + "discriminator": [ + 147, + 23, + 35, + 59, + 15, + 75, + 155, + 32 + ] + } + ], + "events": [ + { + "name": "AdminStateInitialized", + "discriminator": [ + 211, + 115, + 86, + 90, + 176, + 197, + 254, + 121 + ] + }, + { + "name": "AmmConfigFrozen", + "discriminator": [ + 247, + 80, + 58, + 72, + 123, + 117, + 119, + 164 + ] + }, + { + "name": "AmmConfigInitialized", + "discriminator": [ + 105, + 30, + 129, + 183, + 100, + 137, + 26, + 239 + ] + }, + { + "name": "AmmPausedChanged", + "discriminator": [ + 69, + 202, + 147, + 173, + 81, + 7, + 62, + 82 + ] + } + ], + "errors": [ + { + "code": 6000, + "name": "CanOnlyBeInitializedByOwner", + "msg": "Can only be initialized by owner" + }, + { + "code": 6001, + "name": "OutComeCanOnlyBe01", + "msg": "outcome can only be 0 for yes or 1 for no" + }, + { + "code": 6002, + "name": "InvalidInitialLiq", + "msg": "initial liq must be greater than 100000" + }, + { + "code": 6003, + "name": "QuantityMustBeGreaterThanZero", + "msg": "quantity must be greater than zero" + }, + { + "code": 6004, + "name": "SignerDoesntHaveEnoughTokens", + "msg": "Signer doesn't have enough tokens" + }, + { + "code": 6005, + "name": "NotEnoughLamports", + "msg": "Bet account doesn't have enough lamports" + }, + { + "code": 6006, + "name": "NotEnoughSharesToReduce", + "msg": "Bet account doesn't have enough shares" + }, + { + "code": 6007, + "name": "AdminStateAlreadyInitialized", + "msg": "Admin state already initialized" + }, + { + "code": 6008, + "name": "SignerIsNotSettlePubKey", + "msg": "Signer is not the settle pub key" + }, + { + "code": 6009, + "name": "BetAlreadySettled", + "msg": "Bet already settled" + }, + { + "code": 6010, + "name": "BetNotSettled", + "msg": "Bet not settled" + }, + { + "code": 6011, + "name": "BetNotExpired", + "msg": "Bet not expired" + }, + { + "code": 6012, + "name": "MathErr", + "msg": "Overflow or Underflow" + }, + { + "code": 6013, + "name": "InvalidAddress", + "msg": "Invalid address (zero/default)" + }, + { + "code": 6014, + "name": "FeeTooHigh", + "msg": "Fee BPS exceeds maximum (1000 = 10%)" + }, + { + "code": 6015, + "name": "MarketPaused", + "msg": "Market is paused" + }, + { + "code": 6016, + "name": "ConfigFrozen", + "msg": "Config is frozen" + } + ], + "types": [ + { + "name": "Admin", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AdminStateInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AmmConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + }, + { + "name": "config_frozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "AmmConfigFrozen", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + } + ] + } + }, + { + "name": "AmmConfigInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + }, + { + "name": "AmmPausedChanged", + "type": { + "kind": "struct", + "fields": [ + { + "name": "paused", + "type": "bool" + } + ] + } + }, + { + "name": "Bet", + "type": { + "kind": "struct", + "fields": [ + { + "name": "bet_id", + "type": "u64" + }, + { + "name": "initial_liq", + "type": "u64" + }, + { + "name": "is_dynamic", + "type": "bool" + }, + { + "name": "reserves", + "type": { + "array": [ + "u64", + 2 + ] + } + }, + { + "name": "bet_prompt", + "type": "string" + }, + { + "name": "is_initialized", + "type": "bool" + }, + { + "name": "side_won", + "type": { + "option": "u8" + } + }, + { + "name": "expiration_at", + "type": "i64" + }, + { + "name": "created_at", + "type": "i64" + }, + { + "name": "creator", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/packages/market-maker-bot/src/idl/lvr_amm.json b/packages/market-maker-bot/src/idl/lvr_amm.json index 5f896615..fe58ca53 100644 --- a/packages/market-maker-bot/src/idl/lvr_amm.json +++ b/packages/market-maker-bot/src/idl/lvr_amm.json @@ -8,126 +8,340 @@ }, "instructions": [ { - "name": "initialize", + "name": "buy", "discriminator": [ - 175, - 175, - 109, - 31, - 13, - 152, - 155, - 237 + 102, + 6, + 61, + 18, + 1, + 218, + 235, + 234 ], "accounts": [ - { - "name": "admin_state", - "writable": true - }, { "name": "signer", "writable": true, "signer": true }, - { - "name": "system_program" - } - ], - "args": [] - }, - { - "name": "initialize_config", - "discriminator": [ - 208, - 127, - 21, - 1, - 194, - 190, - 196, - 70 - ], - "accounts": [ { "name": "amm_config", - "writable": true + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } }, { - "name": "signer", + "name": "bet", "writable": true, - "signer": true + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, - { - "name": "system_program" - } - ], - "args": [ { "name": "treasury", - "type": "pubkey" + "writable": true }, { - "name": "market_maker", - "type": "pubkey" + "name": "mint_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { - "name": "fee_bps", - "type": "u16" - } - ] - }, - { - "name": "freeze_config", - "discriminator": [ - 30, - 68, - 20, - 154, - 197, - 42, - 47, - 122 - ], - "accounts": [ + "name": "mint_no", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } + }, { - "name": "amm_config", - "writable": true + "name": "destination_yes", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { - "name": "signer", + "name": "destination_no", "writable": true, - "signer": true - } - ], - "args": [] - }, - { - "name": "set_paused", - "discriminator": [ - 91, - 60, - 125, - 192, - 176, - 225, - 166, - 218 - ], - "accounts": [ + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } + }, { - "name": "amm_config", - "writable": true + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" }, { - "name": "signer", - "writable": true, - "signer": true + "name": "system_program", + "address": "11111111111111111111111111111111" + }, + { + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" } ], "args": [ { - "name": "paused", - "type": "bool" + "name": "bet_id", + "type": "u64" + }, + { + "name": "outcome", + "type": "u8" + }, + { + "name": "amount_in", + "type": "u64" } ] }, @@ -150,25 +364,115 @@ "signer": true }, { - "name": "amm_config" + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } }, { "name": "bet", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } }, { "name": "mint_yes", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } }, { "name": "mint_no", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } }, { - "name": "system_program" + "name": "system_program", + "address": "11111111111111111111111111111111" }, { - "name": "token_program" + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" } ], "args": [ @@ -195,37 +499,48 @@ ] }, { - "name": "init_bet_account", + "name": "freeze_config", "discriminator": [ - 229, - 240, - 116, - 140, - 5, - 177, - 61, - 69 + 30, + 68, + 20, + 154, + 197, + 42, + 47, + 122 ], "accounts": [ { - "name": "signer", + "name": "amm_config", "writable": true, - "signer": true - }, - { - "name": "bet", - "writable": true + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } }, { - "name": "system_program" + "name": "signer", + "writable": true, + "signer": true } ], - "args": [ - { - "name": "bet_id", - "type": "u64" - } - ] + "args": [] }, { "name": "get_price", @@ -254,16 +569,16 @@ "returns": "u64" }, { - "name": "buy", + "name": "init_bet_account", "discriminator": [ - 102, - 6, + 229, + 240, + 116, + 140, + 5, + 177, 61, - 18, - 1, - 218, - 235, - 234 + 69 ], "accounts": [ { @@ -271,55 +586,149 @@ "writable": true, "signer": true }, - { - "name": "amm_config" - }, { "name": "bet", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "signer" + } + ] + } }, { - "name": "treasury", - "writable": true - }, + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [ { - "name": "mint_yes", - "writable": true - }, + "name": "bet_id", + "type": "u64" + } + ] + }, + { + "name": "initialize", + "discriminator": [ + 175, + 175, + 109, + 31, + 13, + 152, + 155, + 237 + ], + "accounts": [ { - "name": "mint_no", - "writable": true + "name": "admin_state", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } }, { - "name": "destination_yes", - "writable": true + "name": "signer", + "writable": true, + "signer": true }, { - "name": "destination_no", - "writable": true - }, + "name": "system_program", + "address": "11111111111111111111111111111111" + } + ], + "args": [] + }, + { + "name": "initialize_config", + "discriminator": [ + 208, + 127, + 21, + 1, + 194, + 190, + 196, + 70 + ], + "accounts": [ { - "name": "token_program" + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } }, { - "name": "system_program" + "name": "signer", + "writable": true, + "signer": true }, { - "name": "associated_token_program" + "name": "system_program", + "address": "11111111111111111111111111111111" } ], "args": [ { - "name": "bet_id", - "type": "u64" + "name": "treasury", + "type": "pubkey" }, { - "name": "outcome", - "type": "u8" + "name": "market_maker", + "type": "pubkey" }, { - "name": "amount_in", - "type": "u64" + "name": "fee_bps", + "type": "u16" } ] }, @@ -342,27 +751,292 @@ "signer": true }, { - "name": "amm_config" + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } }, { "name": "bet", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { "name": "mint_yes", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { "name": "mint_no", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { "name": "destination_yes", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "destination_no", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasury", @@ -377,13 +1051,16 @@ "writable": true }, { - "name": "token_program" + "name": "token_program", + "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" }, { - "name": "system_program" + "name": "system_program", + "address": "11111111111111111111111111111111" }, { - "name": "associated_token_program" + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" } ], "args": [ @@ -401,6 +1078,55 @@ } ] }, + { + "name": "set_paused", + "discriminator": [ + 91, + 60, + 125, + 192, + 176, + 225, + 166, + 218 + ], + "accounts": [ + { + "name": "amm_config", + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, + { + "name": "signer", + "writable": true, + "signer": true + } + ], + "args": [ + { + "name": "paused", + "type": "bool" + } + ] + }, { "name": "settle_bet", "discriminator": [ @@ -420,11 +1146,52 @@ "signer": true }, { - "name": "admin_state" + "name": "admin_state", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 100, + 109, + 105, + 110, + 95, + 115, + 116, + 97, + 116, + 101 + ] + } + ] + } }, { "name": "bet", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { "name": "duel_state", @@ -466,32 +1233,280 @@ }, { "name": "bet", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 98, + 101, + 116 + ] + }, + { + "kind": "arg", + "path": "bet_id" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { "name": "mint_yes", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 121, + 101, + 115 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { "name": "mint_no", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 109, + 105, + 110, + 116, + 95, + 110, + 111 + ] + }, + { + "kind": "account", + "path": "bet.bet_id", + "account": "Bet" + }, + { + "kind": "account", + "path": "bet.creator", + "account": "Bet" + } + ] + } }, { "name": "destination_yes", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "destination_no", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "signer" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "token_program" }, { - "name": "system_program" + "name": "system_program", + "address": "11111111111111111111111111111111" }, { - "name": "associated_token_program" + "name": "associated_token_program", + "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" } ], "args": [ @@ -512,7 +1527,7 @@ ], "accounts": [ { - "name": "lvr_amm::state::admin::Admin", + "name": "Admin", "discriminator": [ 244, 158, @@ -525,7 +1540,20 @@ ] }, { - "name": "lvr_amm::state::bet::Bet", + "name": "AmmConfig", + "discriminator": [ + 218, + 244, + 33, + 104, + 203, + 203, + 43, + 111 + ] + }, + { + "name": "Bet", "discriminator": [ 147, 23, @@ -536,24 +1564,168 @@ 155, 32 ] + } + ], + "events": [ + { + "name": "AdminStateInitialized", + "discriminator": [ + 211, + 115, + 86, + 90, + 176, + 197, + 254, + 121 + ] }, { - "name": "lvr_amm::state::config::AmmConfig", + "name": "AmmConfigFrozen", "discriminator": [ - 218, - 244, - 33, - 104, - 203, - 203, - 43, - 111 + 247, + 80, + 58, + 72, + 123, + 117, + 119, + 164 + ] + }, + { + "name": "AmmConfigInitialized", + "discriminator": [ + 105, + 30, + 129, + 183, + 100, + 137, + 26, + 239 + ] + }, + { + "name": "AmmPausedChanged", + "discriminator": [ + 69, + 202, + 147, + 173, + 81, + 7, + 62, + 82 ] } ], + "errors": [ + { + "code": 6000, + "name": "CanOnlyBeInitializedByOwner", + "msg": "Can only be initialized by owner" + }, + { + "code": 6001, + "name": "OutComeCanOnlyBe01", + "msg": "outcome can only be 0 for yes or 1 for no" + }, + { + "code": 6002, + "name": "InvalidInitialLiq", + "msg": "initial liq must be greater than 100000" + }, + { + "code": 6003, + "name": "QuantityMustBeGreaterThanZero", + "msg": "quantity must be greater than zero" + }, + { + "code": 6004, + "name": "SignerDoesntHaveEnoughTokens", + "msg": "Signer doesn't have enough tokens" + }, + { + "code": 6005, + "name": "NotEnoughLamports", + "msg": "Bet account doesn't have enough lamports" + }, + { + "code": 6006, + "name": "NotEnoughSharesToReduce", + "msg": "Bet account doesn't have enough shares" + }, + { + "code": 6007, + "name": "AdminStateAlreadyInitialized", + "msg": "Admin state already initialized" + }, + { + "code": 6008, + "name": "SignerIsNotSettlePubKey", + "msg": "Signer is not the settle pub key" + }, + { + "code": 6009, + "name": "BetAlreadySettled", + "msg": "Bet already settled" + }, + { + "code": 6010, + "name": "BetNotSettled", + "msg": "Bet not settled" + }, + { + "code": 6011, + "name": "BetNotExpired", + "msg": "Bet not expired" + }, + { + "code": 6012, + "name": "MathErr", + "msg": "Overflow or Underflow" + }, + { + "code": 6013, + "name": "InvalidAddress", + "msg": "Invalid address (zero/default)" + }, + { + "code": 6014, + "name": "FeeTooHigh", + "msg": "Fee BPS exceeds maximum (1000 = 10%)" + }, + { + "code": 6015, + "name": "MarketPaused", + "msg": "Market is paused" + }, + { + "code": 6016, + "name": "ConfigFrozen", + "msg": "Config is frozen" + } + ], "types": [ { - "name": "lvr_amm::state::admin::Admin", + "name": "Admin", + "type": { + "kind": "struct", + "fields": [ + { + "name": "admin", + "type": "pubkey" + }, + { + "name": "is_initialized", + "type": "bool" + } + ] + } + }, + { + "name": "AdminStateInitialized", "type": { "kind": "struct", "fields": [ @@ -569,7 +1741,87 @@ } }, { - "name": "lvr_amm::state::bet::Bet", + "name": "AmmConfig", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "market_maker", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + }, + { + "name": "config_frozen", + "type": "bool" + }, + { + "name": "paused", + "type": "bool" + }, + { + "name": "bump", + "type": "u8" + } + ] + } + }, + { + "name": "AmmConfigFrozen", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + } + ] + } + }, + { + "name": "AmmConfigInitialized", + "type": { + "kind": "struct", + "fields": [ + { + "name": "authority", + "type": "pubkey" + }, + { + "name": "treasury", + "type": "pubkey" + }, + { + "name": "fee_bps", + "type": "u16" + } + ] + } + }, + { + "name": "AmmPausedChanged", + "type": { + "kind": "struct", + "fields": [ + { + "name": "paused", + "type": "bool" + } + ] + } + }, + { + "name": "Bet", "type": { "kind": "struct", "fields": [ @@ -630,42 +1882,6 @@ } ] } - }, - { - "name": "lvr_amm::state::config::AmmConfig", - "type": { - "kind": "struct", - "fields": [ - { - "name": "authority", - "type": "pubkey" - }, - { - "name": "treasury", - "type": "pubkey" - }, - { - "name": "market_maker", - "type": "pubkey" - }, - { - "name": "fee_bps", - "type": "u16" - }, - { - "name": "config_frozen", - "type": "bool" - }, - { - "name": "paused", - "type": "bool" - }, - { - "name": "bump", - "type": "u8" - } - ] - } } ] -} +} \ No newline at end of file From d4174427100253d31cbd864e098450cad0973997 Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Fri, 20 Mar 2026 21:17:25 -0500 Subject: [PATCH 10/24] Add generated lvr_amm anchor artifacts --- .../anchor/target/deploy/lvr_amm-keypair.json | 2 +- .../anchor/target/deploy/lvr_amm.so | Bin 468472 -> 440312 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/hyperbet-solana/anchor/target/deploy/lvr_amm-keypair.json b/packages/hyperbet-solana/anchor/target/deploy/lvr_amm-keypair.json index 8fa9eea8..618a8edf 100644 --- a/packages/hyperbet-solana/anchor/target/deploy/lvr_amm-keypair.json +++ b/packages/hyperbet-solana/anchor/target/deploy/lvr_amm-keypair.json @@ -1 +1 @@ -[147,169,177,139,149,20,244,154,110,76,170,7,8,125,158,243,250,252,251,74,217,78,28,209,98,171,143,91,234,47,190,97,184,53,105,235,233,222,215,14,188,192,191,62,92,195,117,60,105,170,71,107,70,191,87,214,104,196,248,51,98,145,154,79] \ No newline at end of file +[63,251,97,153,164,205,165,201,109,58,150,237,78,77,245,209,95,248,195,221,18,192,22,12,206,148,35,66,103,208,27,18,76,169,46,200,60,213,139,25,2,99,87,237,223,81,243,188,170,170,146,171,175,65,87,193,118,219,235,73,118,32,55,127] \ No newline at end of file diff --git a/packages/hyperbet-solana/anchor/target/deploy/lvr_amm.so b/packages/hyperbet-solana/anchor/target/deploy/lvr_amm.so index 1122c24088c331272dcb7e80290439664a24d9cd..d522a89740c14fa03044ede2d96e2d21b5e36344 100755 GIT binary patch delta 123346 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 T&W(F_pK9FGz8t%o(nJ3rl*XO? literal 468472 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 From 311b5187d896b12a3b3cb26e69e5626bfdfda4fd Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Fri, 20 Mar 2026 23:08:34 -0500 Subject: [PATCH 11/24] Harden PM AMM settlement flows --- .../anchor/programs/lvr_amm/src/error.rs | 9 + .../programs/lvr_amm/src/instructions/buy.rs | 1 + .../lvr_amm/src/instructions/create_bet.rs | 2 + .../lvr_amm/src/instructions/init_config.rs | 5 + .../anchor/programs/lvr_amm/src/state/bet.rs | 1 + .../programs/lvr_amm/src/state/config.rs | 1 + .../anchor/scripts/run-localnet-tests.sh | 6 +- .../anchor/target/deploy/lvr_amm.so | Bin 440312 -> 523552 bytes .../anchor/target/idl/lvr_amm.json | 270 ++++++++- .../anchor/target/types/lvr_amm.ts | 270 ++++++++- .../anchor/tests/amm-test-helpers.ts | 123 ++-- .../anchor/tests/lvr_amm_security.test.ts | 555 ++++++++++++++++++ .../hyperbet-solana/app/src/idl/lvr_amm.ts | 270 ++++++++- .../hyperbet-ui/src/lib/goldAmmRouterAbi.ts | 85 ++- .../market-maker-bot/src/idl/lvr_amm.json | 270 ++++++++- packages/market-maker-bot/src/index.ts | 112 +++- packages/market-maker-bot/src/local-sim.ts | 3 +- 17 files changed, 1872 insertions(+), 111 deletions(-) create mode 100644 packages/hyperbet-solana/anchor/tests/lvr_amm_security.test.ts diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/error.rs b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/error.rs index d3803343..2e3a7c7a 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/error.rs +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/error.rs @@ -73,4 +73,13 @@ pub enum PredictionMarketError { #[msg("Config is frozen")] ConfigFrozen, + + #[msg("Invalid duel state account")] + InvalidDuelState, + + #[msg("AMM config account required for oracle settlement")] + MissingAmmConfig, + + #[msg("Fight oracle program mismatch")] + InvalidFightOracleProgram, } diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/buy.rs b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/buy.rs index 9b467d97..d6da7327 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/buy.rs +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/buy.rs @@ -25,6 +25,7 @@ pub fn buy_instruction(ctx: Context, bet_id: u64, outcome: u8, amount_in: u bet.side_won.is_none(), PredictionMarketError::BetAlreadySettled ); + require!(bet.is_initialized, PredictionMarketError::BetNotInitialized); let is_buy_yes = outcome == 0; diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/create_bet.rs b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/create_bet.rs index 6ef9cdad..9112b384 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/create_bet.rs +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/create_bet.rs @@ -11,6 +11,7 @@ pub fn create_bet( bet_id: u64, initial_liq: u64, is_dynamic: bool, + duel_key: [u8; 32], bet_prompt: String, expiration: i64, duel_key: [u8; 32], @@ -30,6 +31,7 @@ pub fn create_bet( bet.is_dynamic = is_dynamic; bet.initial_liq = math::calc_initial_liquidity(initial_liq); bet.reserves = [initial_liq, initial_liq]; + bet.duel_key = duel_key; bet.bet_prompt = bet_prompt; bet.created_at = clock.unix_timestamp; diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/init_config.rs b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/init_config.rs index 283cea35..3abaad63 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/init_config.rs +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/init_config.rs @@ -6,16 +6,19 @@ pub fn initialize_amm_config( ctx: Context, treasury: Pubkey, market_maker: Pubkey, + fight_oracle_program: Pubkey, fee_bps: u16, ) -> Result<()> { require!(treasury != Pubkey::default(), PredictionMarketError::InvalidAddress); require!(market_maker != Pubkey::default(), PredictionMarketError::InvalidAddress); + require!(fight_oracle_program != Pubkey::default(), PredictionMarketError::InvalidAddress); require!(fee_bps <= 1000, PredictionMarketError::FeeTooHigh); let config = &mut ctx.accounts.amm_config; config.authority = ctx.accounts.signer.key(); config.treasury = treasury; config.market_maker = market_maker; + config.fight_oracle_program = fight_oracle_program; config.fee_bps = fee_bps; config.config_frozen = false; config.paused = false; @@ -24,6 +27,7 @@ pub fn initialize_amm_config( emit!(AmmConfigInitialized { authority: config.authority, treasury: config.treasury, + fight_oracle_program: config.fight_oracle_program, fee_bps: config.fee_bps, }); @@ -106,6 +110,7 @@ pub struct SetAmmPaused<'info> { pub struct AmmConfigInitialized { pub authority: Pubkey, pub treasury: Pubkey, + pub fight_oracle_program: Pubkey, pub fee_bps: u16, } diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/state/bet.rs b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/state/bet.rs index 0aaab4d8..5eec645e 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/state/bet.rs +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/state/bet.rs @@ -6,6 +6,7 @@ pub struct Bet { pub initial_liq: u64, // Initial Liquidity exactly matching EVM model pub is_dynamic: bool, pub reserves: [u64; 2], // 0 for Yes, 1 for No. These are virtual reserves. + pub duel_key: [u8; 32], pub bet_prompt: String, pub is_initialized: bool, // by default none diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/state/config.rs b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/state/config.rs index 221b6a91..7d24b812 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/state/config.rs +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/state/config.rs @@ -6,6 +6,7 @@ pub struct AmmConfig { pub authority: Pubkey, pub treasury: Pubkey, pub market_maker: Pubkey, + pub fight_oracle_program: Pubkey, pub fee_bps: u16, pub config_frozen: bool, pub paused: bool, diff --git a/packages/hyperbet-solana/anchor/scripts/run-localnet-tests.sh b/packages/hyperbet-solana/anchor/scripts/run-localnet-tests.sh index cbec702d..d05b5606 100755 --- a/packages/hyperbet-solana/anchor/scripts/run-localnet-tests.sh +++ b/packages/hyperbet-solana/anchor/scripts/run-localnet-tests.sh @@ -170,7 +170,7 @@ if [[ ! -x "$ROOT_DIR/node_modules/.bin/ts-mocha" ]]; then exit 1 fi -if [[ ! -f "$ROOT_DIR/target/deploy/fight_oracle.so" || ! -f "$ROOT_DIR/target/deploy/gold_clob_market.so" || ! -f "$ROOT_DIR/target/deploy/gold_perps_market.so" ]]; then +if [[ ! -f "$ROOT_DIR/target/deploy/fight_oracle.so" || ! -f "$ROOT_DIR/target/deploy/gold_clob_market.so" || ! -f "$ROOT_DIR/target/deploy/gold_perps_market.so" || ! -f "$ROOT_DIR/target/deploy/lvr_amm.so" ]]; then printf 'Missing one or more deploy artifacts under %s\n' "$ROOT_DIR/target/deploy" >&2 exit 1 fi @@ -191,6 +191,7 @@ MINT_AUTHORITY="$(resolve_mint_authority "$WALLET_PATH")" PROGRAM_ORACLE_ID="$(resolve_program_id fight_oracle B5mRCRDJk9BrnH7regMWW5mpTQ8QG1CcCGSnDxMt8hmo)" PROGRAM_CLOB_ID="$(resolve_program_id gold_clob_market DYtd7AoyTX2tbmZ8vpC3mxZgqTpyaDei4TFXZukWBJEf)" PROGRAM_PERPS_ID="$(resolve_program_id gold_perps_market EoZdHN8U3qWQje48ToxB1SLWjucsFGqcWaRUJQYX3eoT)" +PROGRAM_LVR_AMM_ID="$(resolve_program_id lvr_amm Af4LMYfaBtcFFM6dBjwLYH6QJLMqEwneQ8VHfn2z7NY5)" : >"$TEST_LOG" @@ -220,6 +221,7 @@ for test_target in "${TEST_TARGETS[@]}"; do --upgradeable-program "$PROGRAM_ORACLE_ID" "$ROOT_DIR/target/deploy/fight_oracle.so" "$WALLET_PATH" \ --upgradeable-program "$PROGRAM_CLOB_ID" "$ROOT_DIR/target/deploy/gold_clob_market.so" "$WALLET_PATH" \ --upgradeable-program "$PROGRAM_PERPS_ID" "$ROOT_DIR/target/deploy/gold_perps_market.so" "$WALLET_PATH" \ + --upgradeable-program "$PROGRAM_LVR_AMM_ID" "$ROOT_DIR/target/deploy/lvr_amm.so" "$WALLET_PATH" \ >"$VALIDATOR_LOG" 2>&1 & VALIDATOR_PID="$!" @@ -229,7 +231,7 @@ for test_target in "${TEST_TARGETS[@]}"; do exit 1 fi - for program_id in "$PROGRAM_ORACLE_ID" "$PROGRAM_CLOB_ID" "$PROGRAM_PERPS_ID"; do + for program_id in "$PROGRAM_ORACLE_ID" "$PROGRAM_CLOB_ID" "$PROGRAM_PERPS_ID" "$PROGRAM_LVR_AMM_ID"; do if ! wait_for_program "$current_rpc_url" "$program_id"; then echo "[anchor-test] program $program_id did not become executable" >&2 tail -n 120 "$VALIDATOR_LOG" >&2 || true diff --git a/packages/hyperbet-solana/anchor/target/deploy/lvr_amm.so b/packages/hyperbet-solana/anchor/target/deploy/lvr_amm.so index d522a89740c14fa03044ede2d96e2d21b5e36344..d6b37e01135f6c29229ce204d4f43c4479b90a9d 100755 GIT binary patch literal 523552 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[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 W+)~x}2aICtN3 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%0A$N6vnUzM!3V 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, authority: Keypair, reporter = authority.publicKey, + finalizer = authority.publicKey, + challenger = authority.publicKey, + disputeWindowSecs = 60, ): Promise { const oracleConfig = deriveOracleConfigPda(program.programId); const existingConfig = @@ -167,7 +170,12 @@ export async function ensureOracleReady( if (!existingConfig) { await program.methods - .initializeOracle(reporter) + .initializeOracle( + reporter, + finalizer, + challenger, + new BN(disputeWindowSecs), + ) .accountsPartial({ authority: authority.publicKey, oracleConfig, @@ -181,7 +189,13 @@ export async function ensureOracleReady( } await program.methods - .updateOracleConfig(authority.publicKey, reporter) + .updateOracleConfig( + authority.publicKey, + reporter, + finalizer, + challenger, + new BN(disputeWindowSecs), + ) .accountsPartial({ authority: authority.publicKey, oracleConfig, @@ -205,7 +219,7 @@ export async function ensureLvrAdmin( ): Promise { const adminState = deriveAdminStatePda(program.programId); const existingConfig = - await program.account.admin.fetchNullable(adminState); + await (program.account as any).admin.fetchNullable(adminState); if (!existingConfig) { await program.methods @@ -224,18 +238,20 @@ export async function ensureLvrAdmin( export async function ensureAmmConfig( program: Program, authority: Keypair, + fightOracleProgramId: PublicKey, treasury?: PublicKey, feeBps = 200, ): Promise { const ammConfig = deriveAmmConfigPda(program.programId); const existingConfig = - await program.account.ammConfig.fetchNullable(ammConfig); + await (program.account as any).ammConfig.fetchNullable(ammConfig); if (!existingConfig) { await program.methods .initializeConfig( treasury ?? authority.publicKey, authority.publicKey, // market_maker + fightOracleProgramId, feeBps, ) .accountsPartial({ @@ -336,22 +352,22 @@ export async function reportDuelResult( const oracleConfig = deriveOracleConfigPda(program.programId); const duelState = deriveDuelStatePda(program.programId, duelKey); - await program.methods - .reportResult( - [...duelKey], - options.winner, - toBn(options.seed ?? 42), - [ - ...(options.replayHash ?? - hashLabel(`${Buffer.from(duelKey).toString("hex")}:replay`)), - ], - [ - ...(options.resultHash ?? - hashLabel(`${Buffer.from(duelKey).toString("hex")}:result`)), - ], - toBn(options.duelEndTs), - options.metadataUri ?? "https://hyperscape.gg/duels/result", - ) + const builder: any = (program as any).methods.proposeResult( + [...duelKey], + options.winner, + toBn(options.seed ?? 42), + [ + ...(options.replayHash ?? + hashLabel(`${Buffer.from(duelKey).toString("hex")}:replay`)), + ], + [ + ...(options.resultHash ?? + hashLabel(`${Buffer.from(duelKey).toString("hex")}:result`)), + ], + toBn(options.duelEndTs), + options.metadataUri ?? "https://hyperscape.gg/duels/result", + ); + await builder .accountsPartial({ reporter: reporter.publicKey, oracleConfig, @@ -389,7 +405,7 @@ export async function initializeCanonicalMarket( const expirationAt = new BN(Date.now() / 1000 + 3600); await program.methods - .createBetAccount(betId, initialLiq, isDynamic, description, expirationAt) + .createBetAccount(betId, initialLiq, isDynamic, [...duelKey], description, expirationAt) .accountsPartial({ signer: operator.publicKey, ammConfig, @@ -453,7 +469,7 @@ export async function placeClobOrder( order: PublicKey; restingLevel: PublicKey; }> { - const bet = await program.account.bet.fetch(args.marketState); + const bet = await (program.account as any).bet.fetch(args.marketState); const betId = bet.betId; const creator = bet.creator; @@ -530,7 +546,7 @@ export async function claimClobWinnings( user: Keypair; }, ): Promise { - const bet = await program.account.bet.fetch(args.marketState); + const bet = await (program.account as any).bet.fetch(args.marketState); const betId = bet.betId; const creator = bet.creator; @@ -540,30 +556,40 @@ export async function claimClobWinnings( const srcNo = getAssociatedTokenAddressSync(mintNo, args.user.publicKey, true); // In tests, claim everything on the winning side - const infoYes = await program.provider.connection.getAccountInfo(srcYes); - const infoNo = await program.provider.connection.getAccountInfo(srcNo); const balYes = await program.provider.connection.getTokenAccountBalance(srcYes).catch(() => ({ value: { amount: "0" }})); const balNo = await program.provider.connection.getTokenAccountBalance(srcNo).catch(() => ({ value: { amount: "0" }})); - - const hasYes = BigInt(balYes.value.amount) > 0; - const outcome = hasYes ? 0 : 1; - const qStr = hasYes ? balYes.value.amount : balNo.value.amount; - - await program.methods - .withdrawPostSettle(betId, outcome, new BN(qStr)) - .accountsPartial({ - signer: args.user.publicKey, - bet: args.marketState, - mintYes, - mintNo, - destinationYes: srcYes, - destinationNo: srcNo, - tokenProgram: TOKEN_PROGRAM_ID, - systemProgram: SystemProgram.programId, - associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, - }) - .signers([args.user]) - .rpc(); + + const withdrawals: Array<{ outcome: 0 | 1; amount: string }> = []; + const sideWon = bet.sideWon == null ? null : Number(bet.sideWon); + const hasYes = BigInt(balYes.value.amount) > 0n; + const hasNo = BigInt(balNo.value.amount) > 0n; + + if (sideWon === 2) { + if (hasYes) withdrawals.push({ outcome: 0, amount: balYes.value.amount }); + if (hasNo) withdrawals.push({ outcome: 1, amount: balNo.value.amount }); + } else if (hasYes) { + withdrawals.push({ outcome: 0, amount: balYes.value.amount }); + } else if (hasNo) { + withdrawals.push({ outcome: 1, amount: balNo.value.amount }); + } + + for (const withdrawal of withdrawals) { + await program.methods + .withdrawPostSettle(betId, withdrawal.outcome, new BN(withdrawal.amount)) + .accountsPartial({ + signer: args.user.publicKey, + bet: args.marketState, + mintYes, + mintNo, + destinationYes: srcYes, + destinationNo: srcNo, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + .signers([args.user]) + .rpc(); + } return srcYes; } @@ -598,7 +624,12 @@ export async function createOpenMarketFixture( await ensureOracleReady(fightProgram, authority, authority.publicKey); await ensureLvrAdmin(clobProgram, authority); - const config = await ensureAmmConfig(clobProgram, authority, treasury); + const config = await ensureAmmConfig( + clobProgram, + authority, + fightProgram.programId, + treasury, + ); const duelState = await upsertDuel(fightProgram, authority, duelKey, { status: duelStatusBettingOpen(), betOpenTs: options?.betOpenTs ?? now - 30, diff --git a/packages/hyperbet-solana/anchor/tests/lvr_amm_security.test.ts b/packages/hyperbet-solana/anchor/tests/lvr_amm_security.test.ts new file mode 100644 index 00000000..e83c8b2d --- /dev/null +++ b/packages/hyperbet-solana/anchor/tests/lvr_amm_security.test.ts @@ -0,0 +1,555 @@ +import * as anchor from "@coral-xyz/anchor"; +import { Program } from "@coral-xyz/anchor"; +import * as assert from "assert"; +import BN from "bn.js"; +import { + ASSOCIATED_TOKEN_PROGRAM_ID, + createAssociatedTokenAccountInstruction, + getAssociatedTokenAddressSync, + TOKEN_PROGRAM_ID, +} from "@solana/spl-token"; +import { + Keypair, + PublicKey, + SystemProgram, + Transaction, +} from "@solana/web3.js"; + +import { FightOracle } from "../target/types/fight_oracle"; +import { LvrAmm } from "../target/types/lvr_amm"; +import { + airdrop, + cancelDuel, + deriveAdminStatePda, + deriveAmmConfigPda, + deriveBetPda, + deriveDuelStatePda, + deriveMintNoPda, + deriveMintYesPda, + duelStatusBettingOpen, + ensureAmmConfig, + ensureLvrAdmin, + ensureOracleReady, + hasProgramError, + uniqueDuelKey, + upsertDuel, +} from "./amm-test-helpers"; +import { configureAnchorTests } from "./test-anchor"; + +const provider = configureAnchorTests(); +anchor.setProvider(provider); + +const fightProgram = anchor.workspace.FightOracle as Program; +const ammProgram = anchor.workspace.LvrAmm as Program; +const authority = (provider.wallet as anchor.Wallet & { payer: Keypair }).payer; + +function betIdFromDuelKey(duelKey: readonly number[]): bigint { + return BigInt( + `0x${Buffer.from(duelKey).slice(0, 8).reverse().toString("hex")}`, + ); +} + +async function ensureAta( + mint: PublicKey, + owner: PublicKey, + payer: Keypair, +): Promise { + const ata = getAssociatedTokenAddressSync(mint, owner, true); + const existing = await provider.connection.getAccountInfo(ata); + if (existing) return ata; + + const tx = new Transaction().add( + createAssociatedTokenAccountInstruction( + payer.publicKey, + ata, + owner, + mint, + ), + ); + await provider.sendAndConfirm(tx, [payer]); + return ata; +} + +async function waitUntilAfter(unixTs: number): Promise { + while (Math.floor(Date.now() / 1000) <= unixTs) { + await new Promise((resolve) => setTimeout(resolve, 250)); + } +} + +async function createBetFixture(options?: { + creator?: Keypair; + duelKey?: readonly number[]; + expirationOffsetSecs?: number; + initialized?: boolean; + initialLiqLamports?: number; + isDynamic?: boolean; + treasury?: PublicKey; +}): Promise<{ + adminState: PublicKey; + ammConfig: PublicKey; + bet: PublicKey; + mintYes: PublicKey; + mintNo: PublicKey; + betId: BN; + betIdBigInt: bigint; + duelKey: number[]; + creator: Keypair; + treasury: PublicKey; + expirationAt: number; +}> { + const creator = options?.creator ?? Keypair.generate(); + const duelKey = [...(options?.duelKey ?? uniqueDuelKey("lvr-amm-security"))]; + const treasury = options?.treasury ?? authority.publicKey; + const betIdBigInt = betIdFromDuelKey(duelKey); + const betId = new BN(betIdBigInt.toString()); + const bet = deriveBetPda(ammProgram.programId, betIdBigInt, creator.publicKey); + const mintYes = deriveMintYesPda( + ammProgram.programId, + betIdBigInt, + creator.publicKey, + ); + const mintNo = deriveMintNoPda( + ammProgram.programId, + betIdBigInt, + creator.publicKey, + ); + const expirationAt = + Math.floor(Date.now() / 1000) + (options?.expirationOffsetSecs ?? 60); + + await airdrop(provider.connection, creator.publicKey, 10); + await ensureOracleReady( + fightProgram, + authority, + authority.publicKey, + authority.publicKey, + authority.publicKey, + 60, + ); + const adminState = await ensureLvrAdmin(ammProgram, authority); + const ammConfig = await ensureAmmConfig( + ammProgram, + authority, + fightProgram.programId, + treasury, + ); + + await ammProgram.methods + .createBetAccount( + betId, + new BN(options?.initialLiqLamports ?? 5_000_000), + options?.isDynamic ?? false, + [...duelKey], + "LVR AMM security fixture", + new BN(expirationAt), + ) + .accountsPartial({ + signer: creator.publicKey, + ammConfig, + bet, + mintYes, + mintNo, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + }) + .signers([creator]) + .rpc(); + + if (options?.initialized ?? true) { + await ammProgram.methods + .initBetAccount(betId) + .accountsPartial({ + signer: creator.publicKey, + bet, + systemProgram: SystemProgram.programId, + }) + .signers([creator]) + .rpc(); + } + + return { + adminState, + ammConfig, + bet, + mintYes, + mintNo, + betId, + betIdBigInt, + duelKey, + creator, + treasury, + expirationAt, + }; +} + +describe("lvr_amm security", () => { + it("rejects settlement with a duel PDA derived from a different duel key", async () => { + const fixture = await createBetFixture({ expirationOffsetSecs: -60 }); + const now = Math.floor(Date.now() / 1000); + const otherDuelKey = uniqueDuelKey("wrong-duel"); + const wrongDuelState = deriveDuelStatePda(fightProgram.programId, otherDuelKey); + + await upsertDuel(fightProgram, authority, otherDuelKey, { + status: duelStatusBettingOpen(), + betOpenTs: now - 120, + betCloseTs: now - 60, + duelStartTs: now - 30, + metadataUri: "https://tests/wrong-duel", + }); + await cancelDuel(fightProgram, authority, otherDuelKey); + + try { + await ammProgram.methods + .settleBet(fixture.betId, 0) + .accountsPartial({ + signer: authority.publicKey, + ammConfig: fixture.ammConfig, + adminState: fixture.adminState, + bet: fixture.bet, + duelState: wrongDuelState, + }) + .signers([authority]) + .rpc(); + assert.fail("settle_bet accepted an unrelated duel PDA"); + } catch (error: unknown) { + assert.ok( + hasProgramError(error, "Invalid duel state account"), + `expected Invalid duel state account, got ${String(error)}`, + ); + } + }); + + it("rejects settlement with a duel account owned by the wrong program", async () => { + const fixture = await createBetFixture({ expirationOffsetSecs: -60 }); + + try { + await ammProgram.methods + .settleBet(fixture.betId, 0) + .accountsPartial({ + signer: authority.publicKey, + ammConfig: fixture.ammConfig, + adminState: fixture.adminState, + bet: fixture.bet, + duelState: fixture.bet, + }) + .signers([authority]) + .rpc(); + assert.fail("settle_bet accepted a non-oracle-owned account"); + } catch (error: unknown) { + assert.ok( + hasProgramError(error, "Fight oracle program mismatch"), + `expected Fight oracle program mismatch, got ${String(error)}`, + ); + } + }); + + it("rejects buys before init_bet_account funds the bet", async () => { + const creator = Keypair.generate(); + const buyer = Keypair.generate(); + const fixture = await createBetFixture({ + creator, + initialized: false, + expirationOffsetSecs: 300, + }); + + await airdrop(provider.connection, buyer.publicKey, 5); + const destinationYes = await ensureAta(fixture.mintYes, buyer.publicKey, buyer); + const destinationNo = await ensureAta(fixture.mintNo, buyer.publicKey, buyer); + + try { + await ammProgram.methods + .buy(fixture.betId, 0, new BN(100_000)) + .accountsPartial({ + signer: buyer.publicKey, + ammConfig: fixture.ammConfig, + bet: fixture.bet, + treasury: fixture.treasury, + mintYes: fixture.mintYes, + mintNo: fixture.mintNo, + destinationYes, + destinationNo, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + .signers([buyer]) + .rpc(); + assert.fail("buy succeeded before init_bet_account"); + } catch (error: unknown) { + assert.ok( + hasProgramError(error, "Bet not initialized"), + `expected Bet not initialized, got ${String(error)}`, + ); + } + }); + + it("allows YES holders to redeem 1:1 after a cancelled oracle duel", async () => { + const buyer = Keypair.generate(); + const fixture = await createBetFixture({ expirationOffsetSecs: 15 }); + await airdrop(provider.connection, buyer.publicKey, 5); + const destinationYes = await ensureAta(fixture.mintYes, buyer.publicKey, buyer); + const destinationNo = await ensureAta(fixture.mintNo, buyer.publicKey, buyer); + + await ammProgram.methods + .buy(fixture.betId, 0, new BN(100_000)) + .accountsPartial({ + signer: buyer.publicKey, + ammConfig: fixture.ammConfig, + bet: fixture.bet, + treasury: fixture.treasury, + mintYes: fixture.mintYes, + mintNo: fixture.mintNo, + destinationYes, + destinationNo, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + .signers([buyer]) + .rpc(); + + const now = Math.floor(Date.now() / 1000); + await upsertDuel(fightProgram, authority, fixture.duelKey, { + status: duelStatusBettingOpen(), + betOpenTs: now - 120, + betCloseTs: now - 60, + duelStartTs: now - 30, + metadataUri: "https://tests/cancel-yes", + }); + await cancelDuel(fightProgram, authority, fixture.duelKey); + await waitUntilAfter(fixture.expirationAt); + + const duelState = deriveDuelStatePda(fightProgram.programId, fixture.duelKey); + await ammProgram.methods + .settleBet(fixture.betId, 0) + .accountsPartial({ + signer: authority.publicKey, + ammConfig: fixture.ammConfig, + adminState: fixture.adminState, + bet: fixture.bet, + duelState, + }) + .signers([authority]) + .rpc(); + + const yesBalance = await provider.connection.getTokenAccountBalance(destinationYes); + const q = Number(yesBalance.value.amount); + const betBalanceBefore = await provider.connection.getBalance(fixture.bet); + + await ammProgram.methods + .withdrawPostSettle(fixture.betId, 0, new BN(q)) + .accountsPartial({ + signer: buyer.publicKey, + bet: fixture.bet, + mintYes: fixture.mintYes, + mintNo: fixture.mintNo, + destinationYes, + destinationNo, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + .signers([buyer]) + .rpc(); + + const betBalanceAfter = await provider.connection.getBalance(fixture.bet); + const yesBalanceAfter = await provider.connection.getTokenAccountBalance(destinationYes); + assert.strictEqual(betBalanceBefore - betBalanceAfter, q); + assert.strictEqual(Number(yesBalanceAfter.value.amount), 0); + }); + + it("allows NO holders to redeem 1:1 after a cancelled oracle duel", async () => { + const buyer = Keypair.generate(); + const fixture = await createBetFixture({ expirationOffsetSecs: 15 }); + await airdrop(provider.connection, buyer.publicKey, 5); + const destinationYes = await ensureAta(fixture.mintYes, buyer.publicKey, buyer); + const destinationNo = await ensureAta(fixture.mintNo, buyer.publicKey, buyer); + + await ammProgram.methods + .buy(fixture.betId, 1, new BN(100_000)) + .accountsPartial({ + signer: buyer.publicKey, + ammConfig: fixture.ammConfig, + bet: fixture.bet, + treasury: fixture.treasury, + mintYes: fixture.mintYes, + mintNo: fixture.mintNo, + destinationYes, + destinationNo, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + .signers([buyer]) + .rpc(); + + const now = Math.floor(Date.now() / 1000); + await upsertDuel(fightProgram, authority, fixture.duelKey, { + status: duelStatusBettingOpen(), + betOpenTs: now - 120, + betCloseTs: now - 60, + duelStartTs: now - 30, + metadataUri: "https://tests/cancel-no", + }); + await cancelDuel(fightProgram, authority, fixture.duelKey); + await waitUntilAfter(fixture.expirationAt); + + const duelState = deriveDuelStatePda(fightProgram.programId, fixture.duelKey); + await ammProgram.methods + .settleBet(fixture.betId, 0) + .accountsPartial({ + signer: authority.publicKey, + ammConfig: fixture.ammConfig, + adminState: fixture.adminState, + bet: fixture.bet, + duelState, + }) + .signers([authority]) + .rpc(); + + const noBalance = await provider.connection.getTokenAccountBalance(destinationNo); + const q = Number(noBalance.value.amount); + const betBalanceBefore = await provider.connection.getBalance(fixture.bet); + + await ammProgram.methods + .withdrawPostSettle(fixture.betId, 1, new BN(q)) + .accountsPartial({ + signer: buyer.publicKey, + bet: fixture.bet, + mintYes: fixture.mintYes, + mintNo: fixture.mintNo, + destinationYes, + destinationNo, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + .signers([buyer]) + .rpc(); + + const betBalanceAfter = await provider.connection.getBalance(fixture.bet); + const noBalanceAfter = await provider.connection.getTokenAccountBalance(destinationNo); + assert.strictEqual(betBalanceBefore - betBalanceAfter, q); + assert.strictEqual(Number(noBalanceAfter.value.amount), 0); + }); + + it("rejects sells when the treasury ATA is not owned by bet.treasury", async () => { + const buyer = Keypair.generate(); + const fixture = await createBetFixture({ expirationOffsetSecs: 300 }); + await airdrop(provider.connection, buyer.publicKey, 5); + const destinationYes = await ensureAta(fixture.mintYes, buyer.publicKey, buyer); + const destinationNo = await ensureAta(fixture.mintNo, buyer.publicKey, buyer); + const treasuryNoAta = await ensureAta( + fixture.mintNo, + fixture.treasury, + authority, + ); + await ammProgram.methods + .buy(fixture.betId, 0, new BN(100_000)) + .accountsPartial({ + signer: buyer.publicKey, + ammConfig: fixture.ammConfig, + bet: fixture.bet, + treasury: fixture.treasury, + mintYes: fixture.mintYes, + mintNo: fixture.mintNo, + destinationYes, + destinationNo, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + .signers([buyer]) + .rpc(); + + try { + await ammProgram.methods + .sell(fixture.betId, 0, new BN(1)) + .accountsStrict({ + signer: buyer.publicKey, + ammConfig: fixture.ammConfig, + bet: fixture.bet, + mintYes: fixture.mintYes, + mintNo: fixture.mintNo, + destinationYes, + destinationNo, + treasury: fixture.treasury, + treasuryYesAta: destinationYes, + treasuryNoAta, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + .signers([buyer]) + .rpc(); + assert.fail("sell accepted a treasury ATA owned by the trader"); + } catch (error: unknown) { + assert.ok( + hasProgramError(error, "ConstraintTokenOwner"), + `expected token owner constraint failure, got ${String(error)}`, + ); + } + }); + + it("rejects sells when the treasury ATA mint does not match the fee side mint", async () => { + const buyer = Keypair.generate(); + const fixture = await createBetFixture({ expirationOffsetSecs: 300 }); + await airdrop(provider.connection, buyer.publicKey, 5); + const destinationYes = await ensureAta(fixture.mintYes, buyer.publicKey, buyer); + const destinationNo = await ensureAta(fixture.mintNo, buyer.publicKey, buyer); + const treasuryYesAta = await ensureAta( + fixture.mintYes, + fixture.treasury, + authority, + ); + const treasuryNoAta = await ensureAta( + fixture.mintNo, + fixture.treasury, + authority, + ); + await ammProgram.methods + .buy(fixture.betId, 0, new BN(100_000)) + .accountsPartial({ + signer: buyer.publicKey, + ammConfig: fixture.ammConfig, + bet: fixture.bet, + treasury: fixture.treasury, + mintYes: fixture.mintYes, + mintNo: fixture.mintNo, + destinationYes, + destinationNo, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + .signers([buyer]) + .rpc(); + + try { + await ammProgram.methods + .sell(fixture.betId, 0, new BN(1)) + .accountsStrict({ + signer: buyer.publicKey, + ammConfig: fixture.ammConfig, + bet: fixture.bet, + mintYes: fixture.mintYes, + mintNo: fixture.mintNo, + destinationYes, + destinationNo, + treasury: fixture.treasury, + treasuryYesAta: treasuryNoAta, + treasuryNoAta: treasuryYesAta, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + .signers([buyer]) + .rpc(); + assert.fail("sell accepted a treasury ATA for the wrong mint"); + } catch (error: unknown) { + assert.ok( + hasProgramError(error, "ConstraintAssociated"), + `expected associated-token constraint failure, got ${String(error)}`, + ); + } + }); +}); diff --git a/packages/hyperbet-solana/app/src/idl/lvr_amm.ts b/packages/hyperbet-solana/app/src/idl/lvr_amm.ts index d4b3b8aa..3c7503d8 100644 --- a/packages/hyperbet-solana/app/src/idl/lvr_amm.ts +++ b/packages/hyperbet-solana/app/src/idl/lvr_amm.ts @@ -494,6 +494,15 @@ export type LvrAmm = { "name": "isDynamic", "type": "bool" }, + { + "name": "duelKey", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "betPrompt", "type": "string" @@ -732,6 +741,10 @@ export type LvrAmm = { "name": "marketMaker", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1050,11 +1063,183 @@ export type LvrAmm = { }, { "name": "treasuryYesAta", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasuryNoAta", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "tokenProgram", @@ -1151,6 +1336,28 @@ export type LvrAmm = { "writable": true, "signer": true }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, { "name": "adminState", "pda": { @@ -1679,38 +1886,68 @@ export type LvrAmm = { }, { "code": 6010, + "name": "betNotInitialized", + "msg": "Bet not initialized" + }, + { + "code": 6011, "name": "betNotSettled", "msg": "Bet not settled" }, { - "code": 6011, + "code": 6012, "name": "betNotExpired", "msg": "Bet not expired" }, { - "code": 6012, + "code": 6013, + "name": "invalidOracleAccount", + "msg": "Invalid oracle account" + }, + { + "code": 6014, + "name": "oracleBetMismatch", + "msg": "Oracle duel does not match bet" + }, + { + "code": 6015, "name": "mathErr", "msg": "Overflow or Underflow" }, { - "code": 6013, + "code": 6016, "name": "invalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6014, + "code": 6017, "name": "feeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6015, + "code": 6018, "name": "marketPaused", "msg": "Market is paused" }, { - "code": 6016, + "code": 6019, "name": "configFrozen", "msg": "Config is frozen" + }, + { + "code": 6020, + "name": "invalidDuelState", + "msg": "Invalid duel state account" + }, + { + "code": 6021, + "name": "missingAmmConfig", + "msg": "AMM config account required for oracle settlement" + }, + { + "code": 6022, + "name": "invalidFightOracleProgram", + "msg": "Fight oracle program mismatch" } ], "types": [ @@ -1763,6 +2000,10 @@ export type LvrAmm = { "name": "marketMaker", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1807,6 +2048,10 @@ export type LvrAmm = { "name": "treasury", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1852,6 +2097,15 @@ export type LvrAmm = { ] } }, + { + "name": "duelKey", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "betPrompt", "type": "string" diff --git a/packages/hyperbet-ui/src/lib/goldAmmRouterAbi.ts b/packages/hyperbet-ui/src/lib/goldAmmRouterAbi.ts index 95e5cf27..9f80ac30 100644 --- a/packages/hyperbet-ui/src/lib/goldAmmRouterAbi.ts +++ b/packages/hyperbet-ui/src/lib/goldAmmRouterAbi.ts @@ -1,4 +1,35 @@ export const GOLD_AMM_ROUTER_ABI = [ + { + "type": "constructor", + "inputs": [ + { + "name": "_mUSD", + "type": "address", + "internalType": "address" + }, + { + "name": "_treasury", + "type": "address", + "internalType": "address" + }, + { + "name": "_feeBps", + "type": "uint256", + "internalType": "uint256" + }, + { + "name": "admin", + "type": "address", + "internalType": "address" + }, + { + "name": "_duelOracle", + "type": "address", + "internalType": "address" + } + ], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "DEFAULT_ADMIN_ROLE", @@ -161,6 +192,11 @@ export const GOLD_AMM_ROUTER_ABI = [ "name": "collateralIn", "type": "uint256", "internalType": "uint256" + }, + { + "name": "duelKey", + "type": "bytes32", + "internalType": "bytes32" } ], "outputs": [], @@ -179,6 +215,19 @@ export const GOLD_AMM_ROUTER_ABI = [ "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "duelOracle", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "address", + "internalType": "contract DuelOutcomeOracle" + } + ], + "stateMutability": "view" + }, { "type": "function", "name": "feeBps", @@ -263,6 +312,11 @@ export const GOLD_AMM_ROUTER_ABI = [ "type": "uint256", "internalType": "uint256" }, + { + "name": "duelKey", + "type": "bytes32", + "internalType": "bytes32" + }, { "name": "title", "type": "string", @@ -477,6 +531,11 @@ export const GOLD_AMM_ROUTER_ABI = [ "name": "resolutionSource", "type": "string", "internalType": "string" + }, + { + "name": "duelKey", + "type": "bytes32", + "internalType": "bytes32" } ] } @@ -632,16 +691,6 @@ export const GOLD_AMM_ROUTER_ABI = [ "name": "market", "type": "address", "internalType": "address" - }, - { - "name": "oracle", - "type": "address", - "internalType": "address" - }, - { - "name": "duelKey", - "type": "bytes32", - "internalType": "bytes32" } ], "outputs": [], @@ -751,6 +800,12 @@ export const GOLD_AMM_ROUTER_ABI = [ "indexed": false, "internalType": "string" }, + { + "name": "duelKey", + "type": "bytes32", + "indexed": false, + "internalType": "bytes32" + }, { "name": "deadline", "type": "uint256", @@ -867,6 +922,16 @@ export const GOLD_AMM_ROUTER_ABI = [ "name": "FeeTooHigh", "inputs": [] }, + { + "type": "error", + "name": "InvalidDuelKey", + "inputs": [] + }, + { + "type": "error", + "name": "InvalidOracle", + "inputs": [] + }, { "type": "error", "name": "MarketNotAllowed", diff --git a/packages/market-maker-bot/src/idl/lvr_amm.json b/packages/market-maker-bot/src/idl/lvr_amm.json index fe58ca53..d3f68dab 100644 --- a/packages/market-maker-bot/src/idl/lvr_amm.json +++ b/packages/market-maker-bot/src/idl/lvr_amm.json @@ -488,6 +488,15 @@ "name": "is_dynamic", "type": "bool" }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" @@ -726,6 +735,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1044,11 +1057,183 @@ }, { "name": "treasury_yes_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasury_no_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "token_program", @@ -1145,6 +1330,28 @@ "writable": true, "signer": true }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, { "name": "admin_state", "pda": { @@ -1673,38 +1880,68 @@ }, { "code": 6010, + "name": "BetNotInitialized", + "msg": "Bet not initialized" + }, + { + "code": 6011, "name": "BetNotSettled", "msg": "Bet not settled" }, { - "code": 6011, + "code": 6012, "name": "BetNotExpired", "msg": "Bet not expired" }, { - "code": 6012, + "code": 6013, + "name": "InvalidOracleAccount", + "msg": "Invalid oracle account" + }, + { + "code": 6014, + "name": "OracleBetMismatch", + "msg": "Oracle duel does not match bet" + }, + { + "code": 6015, "name": "MathErr", "msg": "Overflow or Underflow" }, { - "code": 6013, + "code": 6016, "name": "InvalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6014, + "code": 6017, "name": "FeeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6015, + "code": 6018, "name": "MarketPaused", "msg": "Market is paused" }, { - "code": 6016, + "code": 6019, "name": "ConfigFrozen", "msg": "Config is frozen" + }, + { + "code": 6020, + "name": "InvalidDuelState", + "msg": "Invalid duel state account" + }, + { + "code": 6021, + "name": "MissingAmmConfig", + "msg": "AMM config account required for oracle settlement" + }, + { + "code": 6022, + "name": "InvalidFightOracleProgram", + "msg": "Fight oracle program mismatch" } ], "types": [ @@ -1757,6 +1994,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1801,6 +2042,10 @@ "name": "treasury", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1846,6 +2091,15 @@ ] } }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" diff --git a/packages/market-maker-bot/src/index.ts b/packages/market-maker-bot/src/index.ts index 38fe8a72..bb6e441c 100644 --- a/packages/market-maker-bot/src/index.ts +++ b/packages/market-maker-bot/src/index.ts @@ -78,6 +78,10 @@ const SHARE_UNIT_SIZE = 1_000n; const EVM_ORDER_FLAG_GTC = 0x01; const OUTBOX_LEASE_MS = 60_000; const CLAIM_BACKLOG_LEASE_MS = 60_000; +const TOKEN_PROGRAM_ID = new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"); +const ASSOCIATED_TOKEN_PROGRAM_ID = new PublicKey( + "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL", +); const GOLD_CLOB_ABI = [ "function marketKey(bytes32 duelKey, uint8 marketKind) view returns (bytes32)", @@ -171,6 +175,7 @@ type SolanaAmmConfig = { authority: PublicKey; treasury: PublicKey; marketMaker: PublicKey; + fightOracleProgram: PublicKey; feeBps: number; paused: boolean; }; @@ -217,7 +222,7 @@ const GOLD_AMM_ROUTER_ABI = [ "function buyNo(address market, uint256 collateralIn, uint256 minAmountOut)", "function sellYes(address market, uint256 tokenIn, uint256 minAmountOut)", "function sellNo(address market, uint256 tokenIn, uint256 minAmountOut)", - "function settleFromOracle(address market, address oracle, bytes32 duelKey)", + "function settleFromOracle(address market)", "function redeem(address market, uint256 amountYes, uint256 amountNo)", "function getAllMarkets() view returns (address[])", "function mUSD() view returns (address)", @@ -259,6 +264,13 @@ function readEnvNumber(name: string, fallback: number): number { return Number.isFinite(parsed) ? parsed : fallback; } +function findAssociatedTokenAddress(mint: PublicKey, owner: PublicKey): PublicKey { + return PublicKey.findProgramAddressSync( + [owner.toBuffer(), TOKEN_PROGRAM_ID.toBuffer(), mint.toBuffer()], + ASSOCIATED_TOKEN_PROGRAM_ID, + )[0]; +} + function parseEnvironment(raw: string | undefined): BettingAppEnvironment { switch ((raw ?? "").trim().toLowerCase()) { case "local": @@ -2939,6 +2951,7 @@ export class CrossChainMarketMaker { authority: configAccount.authority, treasury: configAccount.treasury, marketMaker: configAccount.marketMaker, + fightOracleProgram: configAccount.fightOracleProgram, feeBps: configAccount.feeBps, paused: configAccount.paused, }; @@ -3031,6 +3044,16 @@ export class CrossChainMarketMaker { const amountIn = new BN(decision.amount); const mintYes = findAmmMintYesPda(runtime.ammProgramId, betId, creator); const mintNo = findAmmMintNoPda(runtime.ammProgramId, betId, creator); + const destinationYes = findAssociatedTokenAddress(mintYes, runtime.wallet.publicKey); + const destinationNo = findAssociatedTokenAddress(mintNo, runtime.wallet.publicKey); + const treasuryYesAta = findAssociatedTokenAddress( + mintYes, + runtime.ammConfig!.treasury, + ); + const treasuryNoAta = findAssociatedTokenAddress( + mintNo, + runtime.ammConfig!.treasury, + ); const isBuy = decision.action === "buy_yes" || decision.action === "buy_no"; @@ -3045,8 +3068,11 @@ export class CrossChainMarketMaker { treasury: runtime.ammConfig!.treasury, mintYes, mintNo, - tokenProgram: new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), + destinationYes, + destinationNo, + tokenProgram: TOKEN_PROGRAM_ID, systemProgram: SystemProgram.programId, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, }) .rpc(); } else { @@ -3059,8 +3085,13 @@ export class CrossChainMarketMaker { treasury: runtime.ammConfig!.treasury, mintYes, mintNo, - tokenProgram: new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), + destinationYes, + destinationNo, + treasuryYesAta, + treasuryNoAta, + tokenProgram: TOKEN_PROGRAM_ID, systemProgram: SystemProgram.programId, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, }) .rpc(); } @@ -3096,27 +3127,68 @@ export class CrossChainMarketMaker { const posKey = `solana:${findAmmBetPda(runtime.ammProgramId, betId, creator).toBase58()}`; const pos = this.ammPositions.get(posKey); if (!pos || pos.settled) return; - const sideWon: number = betAccount.sideWon; - const balance = sideWon === 0 ? pos.yesBalance : pos.noBalance; - if (balance <= 0n) { - pos.settled = true; - return; - } + try { const betPda = findAmmBetPda(runtime.ammProgramId, betId, creator); const mintYes = findAmmMintYesPda(runtime.ammProgramId, betId, creator); const mintNo = findAmmMintNoPda(runtime.ammProgramId, betId, creator); - await runtime.ammProgram.methods - .withdrawPostSettle(new BN(betId.toString()), sideWon, new BN(balance.toString())) - .accountsPartial({ - signer: runtime.wallet.publicKey, - bet: betPda, - mintYes, - mintNo, - tokenProgram: new PublicKey("TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"), - systemProgram: SystemProgram.programId, - }) - .rpc(); + const destinationYes = findAssociatedTokenAddress( + mintYes, + runtime.wallet.publicKey, + ); + const destinationNo = findAssociatedTokenAddress( + mintNo, + runtime.wallet.publicKey, + ); + const [yesBalanceResp, noBalanceResp] = await Promise.all([ + runtime.connection.getTokenAccountBalance(destinationYes).catch(() => ({ + value: { amount: "0" }, + })), + runtime.connection.getTokenAccountBalance(destinationNo).catch(() => ({ + value: { amount: "0" }, + })), + ]); + + const yesBalance = BigInt(yesBalanceResp.value.amount); + const noBalance = BigInt(noBalanceResp.value.amount); + const sideWon: number = Number(betAccount.sideWon); + const withdrawals: Array<{ outcome: number; balance: bigint }> = []; + + if (sideWon === 2) { + if (yesBalance > 0n) withdrawals.push({ outcome: 0, balance: yesBalance }); + if (noBalance > 0n) withdrawals.push({ outcome: 1, balance: noBalance }); + } else if (sideWon === 0 && yesBalance > 0n) { + withdrawals.push({ outcome: 0, balance: yesBalance }); + } else if (sideWon === 1 && noBalance > 0n) { + withdrawals.push({ outcome: 1, balance: noBalance }); + } + + if (withdrawals.length === 0) { + pos.settled = true; + return; + } + + for (const withdrawal of withdrawals) { + await runtime.ammProgram.methods + .withdrawPostSettle( + new BN(betId.toString()), + withdrawal.outcome, + new BN(withdrawal.balance.toString()), + ) + .accountsPartial({ + signer: runtime.wallet.publicKey, + bet: betPda, + mintYes, + mintNo, + destinationYes, + destinationNo, + tokenProgram: TOKEN_PROGRAM_ID, + systemProgram: SystemProgram.programId, + associatedTokenProgram: ASSOCIATED_TOKEN_PROGRAM_ID, + }) + .rpc(); + } + pos.settled = true; console.log(`[AMM-SOLANA] withdrew from settled bet ${betId}`); } catch (error) { diff --git a/packages/market-maker-bot/src/local-sim.ts b/packages/market-maker-bot/src/local-sim.ts index da896d43..92fe081e 100644 --- a/packages/market-maker-bot/src/local-sim.ts +++ b/packages/market-maker-bot/src/local-sim.ts @@ -426,7 +426,7 @@ async function deployContracts(provider: ethers.JsonRpcProvider, chain: BettingE ` --broadcast --json` + ` --libraries contracts/lvr_amm/lib/Math.sol:Math:${mathAddr}` + ` --libraries contracts/lvr_amm/lib/SwapMath.sol:SwapMath:${swapMathAddr}` + - ` --constructor-args ${musdAddress} ${treasury.address} 200 ${admin.address}`, + ` --constructor-args ${musdAddress} ${treasury.address} 200 ${admin.address} ${await oracle.getAddress()}`, { cwd: evmContractsDir, env: forgeEnv, encoding: "utf8" }, ); const routerAddress = JSON.parse(routerOut).deployedTo; @@ -523,6 +523,7 @@ async function createMarkets( false, // static liquidity (simpler) duration, collateral, + duel, { nonce: await nextNonce(admin.address) }, ); const receipt = await tx.wait(); From 1d47682cb8b62ec8a436c426ed1485e9812e8d2c Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Fri, 20 Mar 2026 23:50:13 -0500 Subject: [PATCH 12/24] Sync lvr_amm Solana consumer artifacts --- .../hyperbet-solana/app/src/idl/lvr_amm.json | 270 +++++++++++++++++- .../keeper/src/idl/lvr_amm.json | 270 +++++++++++++++++- .../hyperbet-solana/keeper/src/idl/lvr_amm.ts | 270 +++++++++++++++++- 3 files changed, 786 insertions(+), 24 deletions(-) diff --git a/packages/hyperbet-solana/app/src/idl/lvr_amm.json b/packages/hyperbet-solana/app/src/idl/lvr_amm.json index fe58ca53..d3f68dab 100644 --- a/packages/hyperbet-solana/app/src/idl/lvr_amm.json +++ b/packages/hyperbet-solana/app/src/idl/lvr_amm.json @@ -488,6 +488,15 @@ "name": "is_dynamic", "type": "bool" }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" @@ -726,6 +735,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1044,11 +1057,183 @@ }, { "name": "treasury_yes_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasury_no_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "token_program", @@ -1145,6 +1330,28 @@ "writable": true, "signer": true }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, { "name": "admin_state", "pda": { @@ -1673,38 +1880,68 @@ }, { "code": 6010, + "name": "BetNotInitialized", + "msg": "Bet not initialized" + }, + { + "code": 6011, "name": "BetNotSettled", "msg": "Bet not settled" }, { - "code": 6011, + "code": 6012, "name": "BetNotExpired", "msg": "Bet not expired" }, { - "code": 6012, + "code": 6013, + "name": "InvalidOracleAccount", + "msg": "Invalid oracle account" + }, + { + "code": 6014, + "name": "OracleBetMismatch", + "msg": "Oracle duel does not match bet" + }, + { + "code": 6015, "name": "MathErr", "msg": "Overflow or Underflow" }, { - "code": 6013, + "code": 6016, "name": "InvalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6014, + "code": 6017, "name": "FeeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6015, + "code": 6018, "name": "MarketPaused", "msg": "Market is paused" }, { - "code": 6016, + "code": 6019, "name": "ConfigFrozen", "msg": "Config is frozen" + }, + { + "code": 6020, + "name": "InvalidDuelState", + "msg": "Invalid duel state account" + }, + { + "code": 6021, + "name": "MissingAmmConfig", + "msg": "AMM config account required for oracle settlement" + }, + { + "code": 6022, + "name": "InvalidFightOracleProgram", + "msg": "Fight oracle program mismatch" } ], "types": [ @@ -1757,6 +1994,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1801,6 +2042,10 @@ "name": "treasury", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1846,6 +2091,15 @@ ] } }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" diff --git a/packages/hyperbet-solana/keeper/src/idl/lvr_amm.json b/packages/hyperbet-solana/keeper/src/idl/lvr_amm.json index fe58ca53..d3f68dab 100644 --- a/packages/hyperbet-solana/keeper/src/idl/lvr_amm.json +++ b/packages/hyperbet-solana/keeper/src/idl/lvr_amm.json @@ -488,6 +488,15 @@ "name": "is_dynamic", "type": "bool" }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" @@ -726,6 +735,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1044,11 +1057,183 @@ }, { "name": "treasury_yes_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasury_no_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "token_program", @@ -1145,6 +1330,28 @@ "writable": true, "signer": true }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, { "name": "admin_state", "pda": { @@ -1673,38 +1880,68 @@ }, { "code": 6010, + "name": "BetNotInitialized", + "msg": "Bet not initialized" + }, + { + "code": 6011, "name": "BetNotSettled", "msg": "Bet not settled" }, { - "code": 6011, + "code": 6012, "name": "BetNotExpired", "msg": "Bet not expired" }, { - "code": 6012, + "code": 6013, + "name": "InvalidOracleAccount", + "msg": "Invalid oracle account" + }, + { + "code": 6014, + "name": "OracleBetMismatch", + "msg": "Oracle duel does not match bet" + }, + { + "code": 6015, "name": "MathErr", "msg": "Overflow or Underflow" }, { - "code": 6013, + "code": 6016, "name": "InvalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6014, + "code": 6017, "name": "FeeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6015, + "code": 6018, "name": "MarketPaused", "msg": "Market is paused" }, { - "code": 6016, + "code": 6019, "name": "ConfigFrozen", "msg": "Config is frozen" + }, + { + "code": 6020, + "name": "InvalidDuelState", + "msg": "Invalid duel state account" + }, + { + "code": 6021, + "name": "MissingAmmConfig", + "msg": "AMM config account required for oracle settlement" + }, + { + "code": 6022, + "name": "InvalidFightOracleProgram", + "msg": "Fight oracle program mismatch" } ], "types": [ @@ -1757,6 +1994,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1801,6 +2042,10 @@ "name": "treasury", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1846,6 +2091,15 @@ ] } }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" diff --git a/packages/hyperbet-solana/keeper/src/idl/lvr_amm.ts b/packages/hyperbet-solana/keeper/src/idl/lvr_amm.ts index d4b3b8aa..3c7503d8 100644 --- a/packages/hyperbet-solana/keeper/src/idl/lvr_amm.ts +++ b/packages/hyperbet-solana/keeper/src/idl/lvr_amm.ts @@ -494,6 +494,15 @@ export type LvrAmm = { "name": "isDynamic", "type": "bool" }, + { + "name": "duelKey", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "betPrompt", "type": "string" @@ -732,6 +741,10 @@ export type LvrAmm = { "name": "marketMaker", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1050,11 +1063,183 @@ export type LvrAmm = { }, { "name": "treasuryYesAta", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasuryNoAta", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "tokenProgram", @@ -1151,6 +1336,28 @@ export type LvrAmm = { "writable": true, "signer": true }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, { "name": "adminState", "pda": { @@ -1679,38 +1886,68 @@ export type LvrAmm = { }, { "code": 6010, + "name": "betNotInitialized", + "msg": "Bet not initialized" + }, + { + "code": 6011, "name": "betNotSettled", "msg": "Bet not settled" }, { - "code": 6011, + "code": 6012, "name": "betNotExpired", "msg": "Bet not expired" }, { - "code": 6012, + "code": 6013, + "name": "invalidOracleAccount", + "msg": "Invalid oracle account" + }, + { + "code": 6014, + "name": "oracleBetMismatch", + "msg": "Oracle duel does not match bet" + }, + { + "code": 6015, "name": "mathErr", "msg": "Overflow or Underflow" }, { - "code": 6013, + "code": 6016, "name": "invalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6014, + "code": 6017, "name": "feeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6015, + "code": 6018, "name": "marketPaused", "msg": "Market is paused" }, { - "code": 6016, + "code": 6019, "name": "configFrozen", "msg": "Config is frozen" + }, + { + "code": 6020, + "name": "invalidDuelState", + "msg": "Invalid duel state account" + }, + { + "code": 6021, + "name": "missingAmmConfig", + "msg": "AMM config account required for oracle settlement" + }, + { + "code": 6022, + "name": "invalidFightOracleProgram", + "msg": "Fight oracle program mismatch" } ], "types": [ @@ -1763,6 +2000,10 @@ export type LvrAmm = { "name": "marketMaker", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1807,6 +2048,10 @@ export type LvrAmm = { "name": "treasury", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1852,6 +2097,15 @@ export type LvrAmm = { ] } }, + { + "name": "duelKey", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "betPrompt", "type": "string" From 6658a8953789c08fb09aac912eb0e0528eeab3c1 Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Sat, 21 Mar 2026 00:07:00 -0500 Subject: [PATCH 13/24] Track all synced Solana IDL consumers --- .../hyperbet-avax/keeper/src/idl/lvr_amm.json | 270 +++++++++++++++++- .../hyperbet-avax/keeper/src/idl/lvr_amm.ts | 270 +++++++++++++++++- .../hyperbet-bsc/app/src/idl/lvr_amm.json | 270 +++++++++++++++++- packages/hyperbet-bsc/app/src/idl/lvr_amm.ts | 270 +++++++++++++++++- .../hyperbet-bsc/keeper/src/idl/lvr_amm.json | 270 +++++++++++++++++- .../hyperbet-bsc/keeper/src/idl/lvr_amm.ts | 270 +++++++++++++++++- .../hyperbet-evm/keeper/src/idl/lvr_amm.json | 270 +++++++++++++++++- .../hyperbet-evm/keeper/src/idl/lvr_amm.ts | 270 +++++++++++++++++- packages/hyperbet-ui/src/idl/lvr_amm.json | 270 +++++++++++++++++- scripts/ci-gate-solana-build.ts | 6 + 10 files changed, 2364 insertions(+), 72 deletions(-) diff --git a/packages/hyperbet-avax/keeper/src/idl/lvr_amm.json b/packages/hyperbet-avax/keeper/src/idl/lvr_amm.json index fe58ca53..d3f68dab 100644 --- a/packages/hyperbet-avax/keeper/src/idl/lvr_amm.json +++ b/packages/hyperbet-avax/keeper/src/idl/lvr_amm.json @@ -488,6 +488,15 @@ "name": "is_dynamic", "type": "bool" }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" @@ -726,6 +735,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1044,11 +1057,183 @@ }, { "name": "treasury_yes_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasury_no_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "token_program", @@ -1145,6 +1330,28 @@ "writable": true, "signer": true }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, { "name": "admin_state", "pda": { @@ -1673,38 +1880,68 @@ }, { "code": 6010, + "name": "BetNotInitialized", + "msg": "Bet not initialized" + }, + { + "code": 6011, "name": "BetNotSettled", "msg": "Bet not settled" }, { - "code": 6011, + "code": 6012, "name": "BetNotExpired", "msg": "Bet not expired" }, { - "code": 6012, + "code": 6013, + "name": "InvalidOracleAccount", + "msg": "Invalid oracle account" + }, + { + "code": 6014, + "name": "OracleBetMismatch", + "msg": "Oracle duel does not match bet" + }, + { + "code": 6015, "name": "MathErr", "msg": "Overflow or Underflow" }, { - "code": 6013, + "code": 6016, "name": "InvalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6014, + "code": 6017, "name": "FeeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6015, + "code": 6018, "name": "MarketPaused", "msg": "Market is paused" }, { - "code": 6016, + "code": 6019, "name": "ConfigFrozen", "msg": "Config is frozen" + }, + { + "code": 6020, + "name": "InvalidDuelState", + "msg": "Invalid duel state account" + }, + { + "code": 6021, + "name": "MissingAmmConfig", + "msg": "AMM config account required for oracle settlement" + }, + { + "code": 6022, + "name": "InvalidFightOracleProgram", + "msg": "Fight oracle program mismatch" } ], "types": [ @@ -1757,6 +1994,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1801,6 +2042,10 @@ "name": "treasury", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1846,6 +2091,15 @@ ] } }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" diff --git a/packages/hyperbet-avax/keeper/src/idl/lvr_amm.ts b/packages/hyperbet-avax/keeper/src/idl/lvr_amm.ts index d4b3b8aa..3c7503d8 100644 --- a/packages/hyperbet-avax/keeper/src/idl/lvr_amm.ts +++ b/packages/hyperbet-avax/keeper/src/idl/lvr_amm.ts @@ -494,6 +494,15 @@ export type LvrAmm = { "name": "isDynamic", "type": "bool" }, + { + "name": "duelKey", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "betPrompt", "type": "string" @@ -732,6 +741,10 @@ export type LvrAmm = { "name": "marketMaker", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1050,11 +1063,183 @@ export type LvrAmm = { }, { "name": "treasuryYesAta", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasuryNoAta", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "tokenProgram", @@ -1151,6 +1336,28 @@ export type LvrAmm = { "writable": true, "signer": true }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, { "name": "adminState", "pda": { @@ -1679,38 +1886,68 @@ export type LvrAmm = { }, { "code": 6010, + "name": "betNotInitialized", + "msg": "Bet not initialized" + }, + { + "code": 6011, "name": "betNotSettled", "msg": "Bet not settled" }, { - "code": 6011, + "code": 6012, "name": "betNotExpired", "msg": "Bet not expired" }, { - "code": 6012, + "code": 6013, + "name": "invalidOracleAccount", + "msg": "Invalid oracle account" + }, + { + "code": 6014, + "name": "oracleBetMismatch", + "msg": "Oracle duel does not match bet" + }, + { + "code": 6015, "name": "mathErr", "msg": "Overflow or Underflow" }, { - "code": 6013, + "code": 6016, "name": "invalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6014, + "code": 6017, "name": "feeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6015, + "code": 6018, "name": "marketPaused", "msg": "Market is paused" }, { - "code": 6016, + "code": 6019, "name": "configFrozen", "msg": "Config is frozen" + }, + { + "code": 6020, + "name": "invalidDuelState", + "msg": "Invalid duel state account" + }, + { + "code": 6021, + "name": "missingAmmConfig", + "msg": "AMM config account required for oracle settlement" + }, + { + "code": 6022, + "name": "invalidFightOracleProgram", + "msg": "Fight oracle program mismatch" } ], "types": [ @@ -1763,6 +2000,10 @@ export type LvrAmm = { "name": "marketMaker", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1807,6 +2048,10 @@ export type LvrAmm = { "name": "treasury", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1852,6 +2097,15 @@ export type LvrAmm = { ] } }, + { + "name": "duelKey", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "betPrompt", "type": "string" diff --git a/packages/hyperbet-bsc/app/src/idl/lvr_amm.json b/packages/hyperbet-bsc/app/src/idl/lvr_amm.json index fe58ca53..d3f68dab 100644 --- a/packages/hyperbet-bsc/app/src/idl/lvr_amm.json +++ b/packages/hyperbet-bsc/app/src/idl/lvr_amm.json @@ -488,6 +488,15 @@ "name": "is_dynamic", "type": "bool" }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" @@ -726,6 +735,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1044,11 +1057,183 @@ }, { "name": "treasury_yes_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasury_no_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "token_program", @@ -1145,6 +1330,28 @@ "writable": true, "signer": true }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, { "name": "admin_state", "pda": { @@ -1673,38 +1880,68 @@ }, { "code": 6010, + "name": "BetNotInitialized", + "msg": "Bet not initialized" + }, + { + "code": 6011, "name": "BetNotSettled", "msg": "Bet not settled" }, { - "code": 6011, + "code": 6012, "name": "BetNotExpired", "msg": "Bet not expired" }, { - "code": 6012, + "code": 6013, + "name": "InvalidOracleAccount", + "msg": "Invalid oracle account" + }, + { + "code": 6014, + "name": "OracleBetMismatch", + "msg": "Oracle duel does not match bet" + }, + { + "code": 6015, "name": "MathErr", "msg": "Overflow or Underflow" }, { - "code": 6013, + "code": 6016, "name": "InvalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6014, + "code": 6017, "name": "FeeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6015, + "code": 6018, "name": "MarketPaused", "msg": "Market is paused" }, { - "code": 6016, + "code": 6019, "name": "ConfigFrozen", "msg": "Config is frozen" + }, + { + "code": 6020, + "name": "InvalidDuelState", + "msg": "Invalid duel state account" + }, + { + "code": 6021, + "name": "MissingAmmConfig", + "msg": "AMM config account required for oracle settlement" + }, + { + "code": 6022, + "name": "InvalidFightOracleProgram", + "msg": "Fight oracle program mismatch" } ], "types": [ @@ -1757,6 +1994,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1801,6 +2042,10 @@ "name": "treasury", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1846,6 +2091,15 @@ ] } }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" diff --git a/packages/hyperbet-bsc/app/src/idl/lvr_amm.ts b/packages/hyperbet-bsc/app/src/idl/lvr_amm.ts index d4b3b8aa..3c7503d8 100644 --- a/packages/hyperbet-bsc/app/src/idl/lvr_amm.ts +++ b/packages/hyperbet-bsc/app/src/idl/lvr_amm.ts @@ -494,6 +494,15 @@ export type LvrAmm = { "name": "isDynamic", "type": "bool" }, + { + "name": "duelKey", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "betPrompt", "type": "string" @@ -732,6 +741,10 @@ export type LvrAmm = { "name": "marketMaker", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1050,11 +1063,183 @@ export type LvrAmm = { }, { "name": "treasuryYesAta", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasuryNoAta", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "tokenProgram", @@ -1151,6 +1336,28 @@ export type LvrAmm = { "writable": true, "signer": true }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, { "name": "adminState", "pda": { @@ -1679,38 +1886,68 @@ export type LvrAmm = { }, { "code": 6010, + "name": "betNotInitialized", + "msg": "Bet not initialized" + }, + { + "code": 6011, "name": "betNotSettled", "msg": "Bet not settled" }, { - "code": 6011, + "code": 6012, "name": "betNotExpired", "msg": "Bet not expired" }, { - "code": 6012, + "code": 6013, + "name": "invalidOracleAccount", + "msg": "Invalid oracle account" + }, + { + "code": 6014, + "name": "oracleBetMismatch", + "msg": "Oracle duel does not match bet" + }, + { + "code": 6015, "name": "mathErr", "msg": "Overflow or Underflow" }, { - "code": 6013, + "code": 6016, "name": "invalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6014, + "code": 6017, "name": "feeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6015, + "code": 6018, "name": "marketPaused", "msg": "Market is paused" }, { - "code": 6016, + "code": 6019, "name": "configFrozen", "msg": "Config is frozen" + }, + { + "code": 6020, + "name": "invalidDuelState", + "msg": "Invalid duel state account" + }, + { + "code": 6021, + "name": "missingAmmConfig", + "msg": "AMM config account required for oracle settlement" + }, + { + "code": 6022, + "name": "invalidFightOracleProgram", + "msg": "Fight oracle program mismatch" } ], "types": [ @@ -1763,6 +2000,10 @@ export type LvrAmm = { "name": "marketMaker", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1807,6 +2048,10 @@ export type LvrAmm = { "name": "treasury", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1852,6 +2097,15 @@ export type LvrAmm = { ] } }, + { + "name": "duelKey", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "betPrompt", "type": "string" diff --git a/packages/hyperbet-bsc/keeper/src/idl/lvr_amm.json b/packages/hyperbet-bsc/keeper/src/idl/lvr_amm.json index fe58ca53..d3f68dab 100644 --- a/packages/hyperbet-bsc/keeper/src/idl/lvr_amm.json +++ b/packages/hyperbet-bsc/keeper/src/idl/lvr_amm.json @@ -488,6 +488,15 @@ "name": "is_dynamic", "type": "bool" }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" @@ -726,6 +735,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1044,11 +1057,183 @@ }, { "name": "treasury_yes_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasury_no_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "token_program", @@ -1145,6 +1330,28 @@ "writable": true, "signer": true }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, { "name": "admin_state", "pda": { @@ -1673,38 +1880,68 @@ }, { "code": 6010, + "name": "BetNotInitialized", + "msg": "Bet not initialized" + }, + { + "code": 6011, "name": "BetNotSettled", "msg": "Bet not settled" }, { - "code": 6011, + "code": 6012, "name": "BetNotExpired", "msg": "Bet not expired" }, { - "code": 6012, + "code": 6013, + "name": "InvalidOracleAccount", + "msg": "Invalid oracle account" + }, + { + "code": 6014, + "name": "OracleBetMismatch", + "msg": "Oracle duel does not match bet" + }, + { + "code": 6015, "name": "MathErr", "msg": "Overflow or Underflow" }, { - "code": 6013, + "code": 6016, "name": "InvalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6014, + "code": 6017, "name": "FeeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6015, + "code": 6018, "name": "MarketPaused", "msg": "Market is paused" }, { - "code": 6016, + "code": 6019, "name": "ConfigFrozen", "msg": "Config is frozen" + }, + { + "code": 6020, + "name": "InvalidDuelState", + "msg": "Invalid duel state account" + }, + { + "code": 6021, + "name": "MissingAmmConfig", + "msg": "AMM config account required for oracle settlement" + }, + { + "code": 6022, + "name": "InvalidFightOracleProgram", + "msg": "Fight oracle program mismatch" } ], "types": [ @@ -1757,6 +1994,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1801,6 +2042,10 @@ "name": "treasury", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1846,6 +2091,15 @@ ] } }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" diff --git a/packages/hyperbet-bsc/keeper/src/idl/lvr_amm.ts b/packages/hyperbet-bsc/keeper/src/idl/lvr_amm.ts index d4b3b8aa..3c7503d8 100644 --- a/packages/hyperbet-bsc/keeper/src/idl/lvr_amm.ts +++ b/packages/hyperbet-bsc/keeper/src/idl/lvr_amm.ts @@ -494,6 +494,15 @@ export type LvrAmm = { "name": "isDynamic", "type": "bool" }, + { + "name": "duelKey", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "betPrompt", "type": "string" @@ -732,6 +741,10 @@ export type LvrAmm = { "name": "marketMaker", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1050,11 +1063,183 @@ export type LvrAmm = { }, { "name": "treasuryYesAta", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasuryNoAta", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "tokenProgram", @@ -1151,6 +1336,28 @@ export type LvrAmm = { "writable": true, "signer": true }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, { "name": "adminState", "pda": { @@ -1679,38 +1886,68 @@ export type LvrAmm = { }, { "code": 6010, + "name": "betNotInitialized", + "msg": "Bet not initialized" + }, + { + "code": 6011, "name": "betNotSettled", "msg": "Bet not settled" }, { - "code": 6011, + "code": 6012, "name": "betNotExpired", "msg": "Bet not expired" }, { - "code": 6012, + "code": 6013, + "name": "invalidOracleAccount", + "msg": "Invalid oracle account" + }, + { + "code": 6014, + "name": "oracleBetMismatch", + "msg": "Oracle duel does not match bet" + }, + { + "code": 6015, "name": "mathErr", "msg": "Overflow or Underflow" }, { - "code": 6013, + "code": 6016, "name": "invalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6014, + "code": 6017, "name": "feeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6015, + "code": 6018, "name": "marketPaused", "msg": "Market is paused" }, { - "code": 6016, + "code": 6019, "name": "configFrozen", "msg": "Config is frozen" + }, + { + "code": 6020, + "name": "invalidDuelState", + "msg": "Invalid duel state account" + }, + { + "code": 6021, + "name": "missingAmmConfig", + "msg": "AMM config account required for oracle settlement" + }, + { + "code": 6022, + "name": "invalidFightOracleProgram", + "msg": "Fight oracle program mismatch" } ], "types": [ @@ -1763,6 +2000,10 @@ export type LvrAmm = { "name": "marketMaker", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1807,6 +2048,10 @@ export type LvrAmm = { "name": "treasury", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1852,6 +2097,15 @@ export type LvrAmm = { ] } }, + { + "name": "duelKey", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "betPrompt", "type": "string" diff --git a/packages/hyperbet-evm/keeper/src/idl/lvr_amm.json b/packages/hyperbet-evm/keeper/src/idl/lvr_amm.json index fe58ca53..d3f68dab 100644 --- a/packages/hyperbet-evm/keeper/src/idl/lvr_amm.json +++ b/packages/hyperbet-evm/keeper/src/idl/lvr_amm.json @@ -488,6 +488,15 @@ "name": "is_dynamic", "type": "bool" }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" @@ -726,6 +735,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1044,11 +1057,183 @@ }, { "name": "treasury_yes_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasury_no_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "token_program", @@ -1145,6 +1330,28 @@ "writable": true, "signer": true }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, { "name": "admin_state", "pda": { @@ -1673,38 +1880,68 @@ }, { "code": 6010, + "name": "BetNotInitialized", + "msg": "Bet not initialized" + }, + { + "code": 6011, "name": "BetNotSettled", "msg": "Bet not settled" }, { - "code": 6011, + "code": 6012, "name": "BetNotExpired", "msg": "Bet not expired" }, { - "code": 6012, + "code": 6013, + "name": "InvalidOracleAccount", + "msg": "Invalid oracle account" + }, + { + "code": 6014, + "name": "OracleBetMismatch", + "msg": "Oracle duel does not match bet" + }, + { + "code": 6015, "name": "MathErr", "msg": "Overflow or Underflow" }, { - "code": 6013, + "code": 6016, "name": "InvalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6014, + "code": 6017, "name": "FeeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6015, + "code": 6018, "name": "MarketPaused", "msg": "Market is paused" }, { - "code": 6016, + "code": 6019, "name": "ConfigFrozen", "msg": "Config is frozen" + }, + { + "code": 6020, + "name": "InvalidDuelState", + "msg": "Invalid duel state account" + }, + { + "code": 6021, + "name": "MissingAmmConfig", + "msg": "AMM config account required for oracle settlement" + }, + { + "code": 6022, + "name": "InvalidFightOracleProgram", + "msg": "Fight oracle program mismatch" } ], "types": [ @@ -1757,6 +1994,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1801,6 +2042,10 @@ "name": "treasury", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1846,6 +2091,15 @@ ] } }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" diff --git a/packages/hyperbet-evm/keeper/src/idl/lvr_amm.ts b/packages/hyperbet-evm/keeper/src/idl/lvr_amm.ts index d4b3b8aa..3c7503d8 100644 --- a/packages/hyperbet-evm/keeper/src/idl/lvr_amm.ts +++ b/packages/hyperbet-evm/keeper/src/idl/lvr_amm.ts @@ -494,6 +494,15 @@ export type LvrAmm = { "name": "isDynamic", "type": "bool" }, + { + "name": "duelKey", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "betPrompt", "type": "string" @@ -732,6 +741,10 @@ export type LvrAmm = { "name": "marketMaker", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1050,11 +1063,183 @@ export type LvrAmm = { }, { "name": "treasuryYesAta", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintYes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasuryNoAta", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mintNo" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "tokenProgram", @@ -1151,6 +1336,28 @@ export type LvrAmm = { "writable": true, "signer": true }, + { + "name": "ammConfig", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, { "name": "adminState", "pda": { @@ -1679,38 +1886,68 @@ export type LvrAmm = { }, { "code": 6010, + "name": "betNotInitialized", + "msg": "Bet not initialized" + }, + { + "code": 6011, "name": "betNotSettled", "msg": "Bet not settled" }, { - "code": 6011, + "code": 6012, "name": "betNotExpired", "msg": "Bet not expired" }, { - "code": 6012, + "code": 6013, + "name": "invalidOracleAccount", + "msg": "Invalid oracle account" + }, + { + "code": 6014, + "name": "oracleBetMismatch", + "msg": "Oracle duel does not match bet" + }, + { + "code": 6015, "name": "mathErr", "msg": "Overflow or Underflow" }, { - "code": 6013, + "code": 6016, "name": "invalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6014, + "code": 6017, "name": "feeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6015, + "code": 6018, "name": "marketPaused", "msg": "Market is paused" }, { - "code": 6016, + "code": 6019, "name": "configFrozen", "msg": "Config is frozen" + }, + { + "code": 6020, + "name": "invalidDuelState", + "msg": "Invalid duel state account" + }, + { + "code": 6021, + "name": "missingAmmConfig", + "msg": "AMM config account required for oracle settlement" + }, + { + "code": 6022, + "name": "invalidFightOracleProgram", + "msg": "Fight oracle program mismatch" } ], "types": [ @@ -1763,6 +2000,10 @@ export type LvrAmm = { "name": "marketMaker", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1807,6 +2048,10 @@ export type LvrAmm = { "name": "treasury", "type": "pubkey" }, + { + "name": "fightOracleProgram", + "type": "pubkey" + }, { "name": "feeBps", "type": "u16" @@ -1852,6 +2097,15 @@ export type LvrAmm = { ] } }, + { + "name": "duelKey", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "betPrompt", "type": "string" diff --git a/packages/hyperbet-ui/src/idl/lvr_amm.json b/packages/hyperbet-ui/src/idl/lvr_amm.json index fe58ca53..d3f68dab 100644 --- a/packages/hyperbet-ui/src/idl/lvr_amm.json +++ b/packages/hyperbet-ui/src/idl/lvr_amm.json @@ -488,6 +488,15 @@ "name": "is_dynamic", "type": "bool" }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" @@ -726,6 +735,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1044,11 +1057,183 @@ }, { "name": "treasury_yes_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_yes" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "treasury_no_ata", - "writable": true + "writable": true, + "pda": { + "seeds": [ + { + "kind": "account", + "path": "treasury" + }, + { + "kind": "const", + "value": [ + 6, + 221, + 246, + 225, + 215, + 101, + 161, + 147, + 217, + 203, + 225, + 70, + 206, + 235, + 121, + 172, + 28, + 180, + 133, + 237, + 95, + 91, + 55, + 145, + 58, + 140, + 245, + 133, + 126, + 255, + 0, + 169 + ] + }, + { + "kind": "account", + "path": "mint_no" + } + ], + "program": { + "kind": "const", + "value": [ + 140, + 151, + 37, + 143, + 78, + 36, + 137, + 241, + 187, + 61, + 16, + 41, + 20, + 142, + 13, + 131, + 11, + 90, + 19, + 153, + 218, + 255, + 16, + 132, + 4, + 142, + 123, + 216, + 219, + 233, + 248, + 89 + ] + } + } }, { "name": "token_program", @@ -1145,6 +1330,28 @@ "writable": true, "signer": true }, + { + "name": "amm_config", + "pda": { + "seeds": [ + { + "kind": "const", + "value": [ + 97, + 109, + 109, + 95, + 99, + 111, + 110, + 102, + 105, + 103 + ] + } + ] + } + }, { "name": "admin_state", "pda": { @@ -1673,38 +1880,68 @@ }, { "code": 6010, + "name": "BetNotInitialized", + "msg": "Bet not initialized" + }, + { + "code": 6011, "name": "BetNotSettled", "msg": "Bet not settled" }, { - "code": 6011, + "code": 6012, "name": "BetNotExpired", "msg": "Bet not expired" }, { - "code": 6012, + "code": 6013, + "name": "InvalidOracleAccount", + "msg": "Invalid oracle account" + }, + { + "code": 6014, + "name": "OracleBetMismatch", + "msg": "Oracle duel does not match bet" + }, + { + "code": 6015, "name": "MathErr", "msg": "Overflow or Underflow" }, { - "code": 6013, + "code": 6016, "name": "InvalidAddress", "msg": "Invalid address (zero/default)" }, { - "code": 6014, + "code": 6017, "name": "FeeTooHigh", "msg": "Fee BPS exceeds maximum (1000 = 10%)" }, { - "code": 6015, + "code": 6018, "name": "MarketPaused", "msg": "Market is paused" }, { - "code": 6016, + "code": 6019, "name": "ConfigFrozen", "msg": "Config is frozen" + }, + { + "code": 6020, + "name": "InvalidDuelState", + "msg": "Invalid duel state account" + }, + { + "code": 6021, + "name": "MissingAmmConfig", + "msg": "AMM config account required for oracle settlement" + }, + { + "code": 6022, + "name": "InvalidFightOracleProgram", + "msg": "Fight oracle program mismatch" } ], "types": [ @@ -1757,6 +1994,10 @@ "name": "market_maker", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1801,6 +2042,10 @@ "name": "treasury", "type": "pubkey" }, + { + "name": "fight_oracle_program", + "type": "pubkey" + }, { "name": "fee_bps", "type": "u16" @@ -1846,6 +2091,15 @@ ] } }, + { + "name": "duel_key", + "type": { + "array": [ + "u8", + 32 + ] + } + }, { "name": "bet_prompt", "type": "string" diff --git a/scripts/ci-gate-solana-build.ts b/scripts/ci-gate-solana-build.ts index be693371..0abf59ee 100644 --- a/scripts/ci-gate-solana-build.ts +++ b/scripts/ci-gate-solana-build.ts @@ -16,6 +16,12 @@ const trackedArtifactPaths = [ "packages/hyperbet-solana/anchor/target/idl", "packages/hyperbet-solana/app/src/idl", "packages/hyperbet-solana/keeper/src/idl", + "packages/hyperbet-ui/src/idl", + "packages/hyperbet-bsc/app/src/idl", + "packages/hyperbet-bsc/keeper/src/idl", + "packages/hyperbet-avax/keeper/src/idl", + "packages/hyperbet-evm/keeper/src/idl", + "packages/market-maker-bot/src/idl", ]; function currentGitStatus(paths: string[]): string { From 07bc060c73709467632e1d2e43279648783d77ad Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Sat, 21 Mar 2026 04:15:15 -0500 Subject: [PATCH 14/24] =?UTF-8?q?fix(mm-bot):=20exact=20qMul=20precision?= =?UTF-8?q?=20=E2=80=94=20use=20native=20bigint=20multiply?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit JS BigInt has no overflow, so (a * b) >> 64n is exact. The old (a >> 32n) * (b >> 32n) approximation lost 32 bits per operand, producing materially different prices from the on-chain Rust math. Tightens test tolerance from ±1% to ±0.1%. --- packages/market-maker-bot/src/amm-math.test.ts | 6 +++--- packages/market-maker-bot/src/amm-math.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/market-maker-bot/src/amm-math.test.ts b/packages/market-maker-bot/src/amm-math.test.ts index bb3c648a..c925e8ae 100644 --- a/packages/market-maker-bot/src/amm-math.test.ts +++ b/packages/market-maker-bot/src/amm-math.test.ts @@ -12,9 +12,9 @@ describe("amm-math", () => { describe("calcPrice", () => { it("returns ~500_000 for equal reserves (z=0 → CDF(0) = 0.5)", () => { const price = calcPrice(1_000_000n, 1_000_000n, 1_000_000n); - // Allow ±1% tolerance (matches Rust test) - expect(Number(price)).toBeGreaterThanOrEqual(490_000); - expect(Number(price)).toBeLessThanOrEqual(510_000); + // With exact qMul precision, tolerance is tight (±0.1%) + expect(Number(price)).toBeGreaterThanOrEqual(499_000); + expect(Number(price)).toBeLessThanOrEqual(501_000); }); it("returns 500_000 when liquidity is zero", () => { diff --git a/packages/market-maker-bot/src/amm-math.ts b/packages/market-maker-bot/src/amm-math.ts index c584b312..67a3b717 100644 --- a/packages/market-maker-bot/src/amm-math.ts +++ b/packages/market-maker-bot/src/amm-math.ts @@ -32,8 +32,8 @@ function qToU64(val: bigint): bigint { } function qMul(a: bigint, b: bigint): bigint { - // Approximate: shift each down 32 then multiply (avoids 256-bit overflow) - return (a >> 32n) * (b >> 32n); + // JS bigint has no overflow — exact Q64.64 multiply + return (a * b) >> FRAC_BITS; } function qDiv(a: bigint, b: bigint): bigint { From fbbf7d169630843587009d87877c3b9204f56d69 Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Sat, 21 Mar 2026 04:15:34 -0500 Subject: [PATCH 15/24] fix(mm-bot): slippage protection, nonce safety, Solana position tracking - EVM AMM: compute minAmountOut via estimateSlippage() with configurable maxSlippageBps (default 2%). All buyYes/buyNo/sellYes/sellNo now pass slippage-protected floor instead of 0. - EVM AMM: all trades + approvals routed through sendEvmTransaction() nonce tracker, preventing conflicts with concurrent CLOB transactions. - Solana AMM: read actual token balances via getTokenAccountBalance() after each trade, enabling maxPositionSize guard. Previously yesBalance/noBalance stayed at 0 forever. - Solana AMM snapshot: set lastStreamAtMs/lastOracleAtMs to Date.now() so circuit breaker doesn't treat all Solana AMM as permanently stale. - AmmMarketMakerConfig: add maxSlippageBps field (default 200 = 2%). --- packages/hyperbet-mm-core/src/index.ts | 3 ++ packages/market-maker-bot/src/index.ts | 56 +++++++++++++++++++++----- 2 files changed, 49 insertions(+), 10 deletions(-) diff --git a/packages/hyperbet-mm-core/src/index.ts b/packages/hyperbet-mm-core/src/index.ts index 27de4ed8..1cd66408 100644 --- a/packages/hyperbet-mm-core/src/index.ts +++ b/packages/hyperbet-mm-core/src/index.ts @@ -725,6 +725,8 @@ export interface AmmMarketMakerConfig { staleRpcAfterMs: number; /** Guard window before bet close (ms) */ betCloseGuardMs: number; + /** Max slippage tolerance for AMM trades (bps, default 200 = 2%) */ + maxSlippageBps: number; } export const DEFAULT_AMM_MARKET_MAKER_CONFIG: AmmMarketMakerConfig = { @@ -738,6 +740,7 @@ export const DEFAULT_AMM_MARKET_MAKER_CONFIG: AmmMarketMakerConfig = { staleOracleAfterMs: 5_000, staleRpcAfterMs: 5_000, betCloseGuardMs: 5_000, + maxSlippageBps: 200, }; export function buildAmmTradeDecision( diff --git a/packages/market-maker-bot/src/index.ts b/packages/market-maker-bot/src/index.ts index bb6e441c..953fb860 100644 --- a/packages/market-maker-bot/src/index.ts +++ b/packages/market-maker-bot/src/index.ts @@ -59,7 +59,7 @@ import { findAmmMintYesPda, findAmmMintNoPda, } from "./solana-helpers.ts"; -import { calcAmmPrice, calcDynamicLiquidity } from "./amm-math.ts"; +import { calcAmmPrice, calcDynamicLiquidity, estimateSlippage } from "./amm-math.ts"; import { createDefaultMarketMakerStateStore, type ClaimBacklogInput, @@ -3024,6 +3024,8 @@ export class CrossChainMarketMaker { betCloseTimeMs: betAccount.expirationAt ? Number(betAccount.expirationAt) * 1000 : null, + lastStreamAtMs: Date.now(), + lastOracleAtMs: Date.now(), lastRpcAtMs: Date.now(), exposure: { yes: Number(existing?.yesBalance ?? 0n), @@ -3096,7 +3098,16 @@ export class CrossChainMarketMaker { .rpc(); } - // Update position tracking + // Read actual token balances after trade for accurate position tracking + const [yesBalResp, noBalResp] = await Promise.all([ + runtime.connection.getTokenAccountBalance(destinationYes).catch(() => ({ + value: { amount: "0" }, + })), + runtime.connection.getTokenAccountBalance(destinationNo).catch(() => ({ + value: { amount: "0" }, + })), + ]); + const pos: AmmPosition = existing ?? { chainKey: "solana", marketRef: betPda.toBase58(), @@ -3107,6 +3118,8 @@ export class CrossChainMarketMaker { costBasis: 0n, settled: false, }; + pos.yesBalance = BigInt(yesBalResp.value.amount); + pos.noBalance = BigInt(noBalResp.value.amount); if (isBuy) { pos.costBasis += BigInt(decision.amount); } @@ -3283,22 +3296,39 @@ export class CrossChainMarketMaker { const amountBn = ethers.parseUnits(decision.amount.toString(), 18); // mUSD WAD (18 decimals) + // Compute slippage-protected minAmountOut (2% tolerance) + const isBuyAction = decision.action === "buy_yes" || decision.action === "buy_no"; + const isBuyYesAction = decision.action === "buy_yes" || decision.action === "sell_no"; + const { amountOut: expectedOut } = estimateSlippage( + isBuyYesAction, BigInt(ry.toString()), BigInt(rn.toString()), BigInt(l.toString()), + BigInt(amountBn.toString()) / 1_000_000_000_000n, // scale WAD to u64 1e6 + ); + const slippageBps = BigInt(this.ammConfig.maxSlippageBps ?? 200); + // Scale minAmountOut back to WAD for the router + const minAmountOut = (expectedOut * (10000n - slippageBps) / 10000n) * 1_000_000_000_000n; + try { - if (decision.action === "buy_yes" || decision.action === "buy_no") { - // Ensure mUSD approval + if (isBuyAction) { + // Ensure mUSD approval (use nonce tracker for all EVM txs) if (runtime.mUsd) { const allowance = await runtime.mUsd.allowance( runtime.walletAddress, runtime.routerAddress, ); if (BigInt(allowance.toString()) < BigInt(amountBn.toString())) { - await runtime.mUsd.approve(runtime.routerAddress, ethers.MaxUint256); + await this.sendEvmTransaction(runtime, (nonce) => + runtime.mUsd!.approve(runtime.routerAddress, ethers.MaxUint256, { nonce }), + ); } } if (decision.action === "buy_yes") { - await runtime.router.buyYes(marketAddress, amountBn, 0); + await this.sendEvmTransaction(runtime, (nonce) => + runtime.router.buyYes(marketAddress, amountBn, minAmountOut, { nonce }), + ); } else { - await runtime.router.buyNo(marketAddress, amountBn, 0); + await this.sendEvmTransaction(runtime, (nonce) => + runtime.router.buyNo(marketAddress, amountBn, minAmountOut, { nonce }), + ); } } else { // Sell: need token approval @@ -3310,12 +3340,18 @@ export class CrossChainMarketMaker { const token = new ethers.Contract(tokenAddr, ERC20_ABI, runtime.wallet); const allowance = await token.allowance(runtime.walletAddress, runtime.routerAddress); if (BigInt(allowance.toString()) < BigInt(amountBn.toString())) { - await token.approve(runtime.routerAddress, ethers.MaxUint256); + await this.sendEvmTransaction(runtime, (nonce) => + token.approve(runtime.routerAddress, ethers.MaxUint256, { nonce }), + ); } if (decision.action === "sell_yes") { - await runtime.router.sellYes(marketAddress, amountBn, 0); + await this.sendEvmTransaction(runtime, (nonce) => + runtime.router.sellYes(marketAddress, amountBn, minAmountOut, { nonce }), + ); } else { - await runtime.router.sellNo(marketAddress, amountBn, 0); + await this.sendEvmTransaction(runtime, (nonce) => + runtime.router.sellNo(marketAddress, amountBn, minAmountOut, { nonce }), + ); } } From cbeb80cc9311c643e23f47d242d5596e2f2a9d6f Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Sat, 21 Mar 2026 04:15:44 -0500 Subject: [PATCH 16/24] fix(sim-dashboard): document CLOB vs AMM market status enum divergence Add explicit CLOB_STATUS and AMM_STATUS constants with comments documenting the enum value difference (CLOB RESOLVED=3, AMM RESOLVED=4). Current sim uses GoldClob (CLOB) so runtime constants are unchanged, but the mapping is now visible for when AMM simulation is added. --- packages/simulation-dashboard/src/server.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/simulation-dashboard/src/server.ts b/packages/simulation-dashboard/src/server.ts index 68e0efac..5228ca83 100644 --- a/packages/simulation-dashboard/src/server.ts +++ b/packages/simulation-dashboard/src/server.ts @@ -214,8 +214,14 @@ const ATTACKER_STRATEGIES = new Set([ "stress_test", "cancel_replace", ]); -const MARKET_STATUS_RESOLVED = 3; -const MARKET_STATUS_CANCELLED = 4; +// GoldClob (CLOB) enum: NULL=0, OPEN=1, LOCKED=2, RESOLVED=3, CANCELLED=4 +// LvrMarket (AMM) enum: OPEN=0, CLOSED=1, PENDING=2, DISPUTED=3, RESOLVED=4 +const CLOB_STATUS = { RESOLVED: 3, CANCELLED: 4 } as const; +const AMM_STATUS = { RESOLVED: 4, CANCELLED: undefined } as const; + +// Default to CLOB for current sim (anvil runs GoldClob) +const MARKET_STATUS_RESOLVED = CLOB_STATUS.RESOLVED; +const MARKET_STATUS_CANCELLED = CLOB_STATUS.CANCELLED; let peakInventorySeen = 0; let worstMarketMakerPnl = 0; let bestAttackerPnlSeen = 0; @@ -309,7 +315,7 @@ function buildStreamingStateUpdate(): Record { damageDealtThisFight: 100 - hp1, }, duelId, - duelKeyHex: currentDuelKey || null, + duelKeyHex: currentDuelKey ? currentDuelKey.replace(/^0x/, "") : null, betOpenTime: duelOpenedAtMs, betCloseTime: betCloseMs, fightStartTime: duelOpenedAtMs, From 7c86565d31ab301a7691574139e6cf33baeee144 Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Sat, 21 Mar 2026 04:22:35 -0500 Subject: [PATCH 17/24] fix(mm-bot): share nonce runtime across evm paths --- packages/market-maker-bot/src/index.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/market-maker-bot/src/index.ts b/packages/market-maker-bot/src/index.ts index 953fb860..62aa920d 100644 --- a/packages/market-maker-bot/src/index.ts +++ b/packages/market-maker-bot/src/index.ts @@ -137,6 +137,8 @@ type EvmRuntime = { goldClobAddress: string; }; +type EvmNonceRuntime = Pick; + type SignableTx = Transaction | VersionedTransaction; type AnchorLikeWallet = Wallet & { payer: Keypair; @@ -1983,7 +1985,7 @@ export class CrossChainMarketMaker { return null; } - private async nextRuntimeNonce(runtime: EvmRuntime): Promise { + private async nextRuntimeNonce(runtime: EvmNonceRuntime): Promise { const cached = this.nextNonceByChain.get(runtime.chainKey); if (cached != null) { return cached; @@ -1996,14 +1998,14 @@ export class CrossChainMarketMaker { return fresh; } - private noteRuntimeNonceCommitted(runtime: EvmRuntime, nonce: number) { + private noteRuntimeNonceCommitted(runtime: EvmNonceRuntime, nonce: number) { const cached = this.nextNonceByChain.get(runtime.chainKey); if (cached == null || nonce >= cached) { this.nextNonceByChain.set(runtime.chainKey, nonce + 1); } } - private async refreshRuntimeNonce(runtime: EvmRuntime): Promise { + private async refreshRuntimeNonce(runtime: EvmNonceRuntime): Promise { const fresh = await runtime.provider.getTransactionCount( runtime.walletAddress, "pending", @@ -2013,7 +2015,7 @@ export class CrossChainMarketMaker { } private async sendEvmTransaction( - runtime: EvmRuntime, + runtime: EvmNonceRuntime, buildTransaction: (nonce: number) => Promise, ): Promise<{ tx: T; nonce: number }> { const nonce = await this.nextRuntimeNonce(runtime); From bd1f0a780b61c049f49d4fd8f8518fa758f70f42 Mon Sep 17 00:00:00 2001 From: rndrntwrk <180591682+rndrntwrk@users.noreply.github.com> Date: Sat, 21 Mar 2026 16:04:29 -0500 Subject: [PATCH 18/24] fix(infra): URL redaction helper and BSC config AVAX address parity C-8: Add redactUrl() utility to Solana keeper common.ts that strips api-key query parameters before logging. Prevents Helius API key exposure in error traces and diagnostics. M-12: BSC config now reads AVAX addresses from chain registry defaults (goldClobAddress, goldAmmRouterAddress, goldTokenAddress) instead of hardcoding empty strings. --- packages/hyperbet-bsc/app/src/lib/config.ts | 6 +++--- packages/hyperbet-solana/keeper/src/bot.ts | 3 ++- packages/hyperbet-solana/keeper/src/common.ts | 11 +++++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/packages/hyperbet-bsc/app/src/lib/config.ts b/packages/hyperbet-bsc/app/src/lib/config.ts index 7f3c7578..e76edcdc 100644 --- a/packages/hyperbet-bsc/app/src/lib/config.ts +++ b/packages/hyperbet-bsc/app/src/lib/config.ts @@ -217,9 +217,9 @@ function buildEvmConfig( baseGoldTokenAddress: defaults.base.goldTokenAddress, avaxRpcUrl: defaultAvaxRpcUrlForEnvironment(environment), avaxChainId: defaultAvaxChainIdForEnvironment(environment), - avaxGoldClobAddress: "", - avaxGoldAmmRouterAddress: "", - avaxGoldTokenAddress: "", + avaxGoldClobAddress: defaults.avax.goldClobAddress, + avaxGoldAmmRouterAddress: defaults.avax.goldAmmRouterAddress, + avaxGoldTokenAddress: defaults.avax.goldTokenAddress, }; } diff --git a/packages/hyperbet-solana/keeper/src/bot.ts b/packages/hyperbet-solana/keeper/src/bot.ts index 1e3603af..11213f77 100644 --- a/packages/hyperbet-solana/keeper/src/bot.ts +++ b/packages/hyperbet-solana/keeper/src/bot.ts @@ -39,6 +39,7 @@ import { SIDE_BID, readKeypair, requireEnv, + sanitizeErrorMessage, } from "./common"; import type { PredictionMarketWinner } from "@hyperbet/chain-registry"; import { buildResultHash } from "./resultHash"; @@ -3105,7 +3106,7 @@ for (;;) { if (isFundingError(error)) { fundingBlockedUntil = Date.now() + fundingBackoffMs; } - console.error(`[bot] cycle failed: ${(error as Error).message}`); + console.error(`[bot] cycle failed: ${sanitizeErrorMessage(error)}`); } finally { writeBotHealthSnapshot(); } diff --git a/packages/hyperbet-solana/keeper/src/common.ts b/packages/hyperbet-solana/keeper/src/common.ts index fc6ac8a5..3453f3fd 100644 --- a/packages/hyperbet-solana/keeper/src/common.ts +++ b/packages/hyperbet-solana/keeper/src/common.ts @@ -109,6 +109,17 @@ export function getSenderUrl(): string | null { return null; } +/** C-8: Redact API keys from RPC URLs before logging. */ +export function redactUrl(url: string): string { + return url.replace(/api-key=[^&]+/g, "api-key=***"); +} + +/** Sanitize an error message to remove embedded API keys before logging. */ +export function sanitizeErrorMessage(err: unknown): string { + const msg = err instanceof Error ? err.message : String(err); + return redactUrl(msg); +} + export function readKeypair(keypairRef: string): Keypair { const trimmed = keypairRef.trim(); From e597739ad4c6c1fa143c19bdffff4474b2467a3f Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Sun, 22 Mar 2026 01:30:48 -0500 Subject: [PATCH 19/24] fix(solana): replace panics with Result in Q64.64 math MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Convert all Q64.64 fixed-point functions from assert!/panic! to returning Result with proper Anchor error propagation. Prevents BPF program halt on overflow or Newton-Raphson non-convergence — callers now receive MathFixedPointOverflow or MathConvergenceError. Addresses CRITICAL-1 (i256_to_i128 overflow) and HIGH-5 (Newton panic) from PR #30 security review. --- .../anchor/programs/lvr_amm/src/error.rs | 6 + .../programs/lvr_amm/src/instructions/buy.rs | 10 +- .../lvr_amm/src/instructions/get_price.rs | 2 +- .../programs/lvr_amm/src/instructions/sell.rs | 10 +- .../anchor/programs/lvr_amm/src/math.rs | 133 +++++++++--------- 5 files changed, 85 insertions(+), 76 deletions(-) diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/error.rs b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/error.rs index 2e3a7c7a..39dc92b6 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/error.rs +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/error.rs @@ -82,4 +82,10 @@ pub enum PredictionMarketError { #[msg("Fight oracle program mismatch")] InvalidFightOracleProgram, + + #[msg("AMM Newton-Raphson solver did not converge")] + MathConvergenceError, + + #[msg("AMM fixed-point overflow")] + MathFixedPointOverflow, } diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/buy.rs b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/buy.rs index d6da7327..587ec2a0 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/buy.rs +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/buy.rs @@ -50,12 +50,12 @@ pub fn buy_instruction(ctx: Context, bet_id: u64, outcome: u8, amount_in: u .ok_or(PredictionMarketError::MathOverflow)?; let amount_out = math::get_swap_amount( - !is_buy_yes, - bet.reserves[0], - bet.reserves[1], - liq, + !is_buy_yes, + bet.reserves[0], + bet.reserves[1], + liq, net_amount_in - ); + )?; // Update Virtual Reserves // EVM: diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/get_price.rs b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/get_price.rs index 97789be5..2df5d13d 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/get_price.rs +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/get_price.rs @@ -16,7 +16,7 @@ pub fn get_price_instruction(ctx: Context, outcome: u8) -> Result bet.initial_liq }; - let price_yes = math::calc_price(bet.reserves[0], bet.reserves[1], liq); + let price_yes = math::calc_price(bet.reserves[0], bet.reserves[1], liq)?; if outcome == 0 { Ok(price_yes) diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/sell.rs b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/sell.rs index a63153b1..db0b2bd8 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/sell.rs +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/sell.rs @@ -47,12 +47,12 @@ pub fn sell_instruction(ctx: Context, bet_id: u64, outcome: u8, amount_in: .ok_or(PredictionMarketError::MathOverflow)?; let amount_out = math::get_swap_amount( - is_sell_yes, - bet.reserves[0], - bet.reserves[1], - liq, + is_sell_yes, + bet.reserves[0], + bet.reserves[1], + liq, net_amount_in - ); + )?; // Update Virtual Reserves if is_sell_yes { diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/math.rs b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/math.rs index f16298c0..1570f488 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/math.rs +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/math.rs @@ -4,8 +4,11 @@ /// but public API uses u64 scaled by 1e6 (SPL convention). /// /// Replaces f64 to ensure deterministic consensus across validators. +use anchor_lang::prelude::*; use ethnum::I256; +use crate::error::PredictionMarketError; + const SCALE: u64 = 1_000_000; // SPL 6-decimal scale const FRAC_BITS: u32 = 64; @@ -31,21 +34,21 @@ fn q_to_u64(val: i128) -> u64 { } /// Q64.64 multiply: (a * b) >> 64 -fn q_mul(a: i128, b: i128) -> i128 { +fn q_mul(a: i128, b: i128) -> Result { i256_to_i128((I256::new(a) * I256::new(b)) >> FRAC_BITS) } /// Q64.64 divide: (a << 64) / b -fn q_div(a: i128, b: i128) -> i128 { - assert!(b != 0, "q_div: division by zero"); +fn q_div(a: i128, b: i128) -> Result { + require!(b != 0, PredictionMarketError::MathFixedPointOverflow); i256_to_i128((I256::new(a) << FRAC_BITS) / I256::new(b)) } -fn i256_to_i128(value: I256) -> i128 { +fn i256_to_i128(value: I256) -> Result { let min = I256::new(i128::MIN); let max = I256::new(i128::MAX); - assert!(value >= min && value <= max, "i256_to_i128: overflow"); - value.as_i128() + require!(value >= min && value <= max, PredictionMarketError::MathFixedPointOverflow); + Ok(value.as_i128()) } fn q_abs(val: i128) -> i128 { @@ -55,14 +58,14 @@ fn q_abs(val: i128) -> i128 { /// Polynomial approximation of erf(x) for |x| <= 4. /// Uses Abramowitz and Stegun approximation 7.1.28 (max error ~1.5e-7). /// For |x| > 4, erf(x) ≈ ±1. -fn q_erf(x: i128) -> i128 { +fn q_erf(x: i128) -> Result { let is_neg = x < 0; let ax = q_abs(x); // For large |x|, erf → ±1 let four_q = 4i128 << FRAC_BITS; if ax >= four_q { - return if is_neg { -Q_ONE } else { Q_ONE }; + return Ok(if is_neg { -Q_ONE } else { Q_ONE }); } // Abramowitz & Stegun constants (scaled to Q64.64) @@ -75,98 +78,98 @@ fn q_erf(x: i128) -> i128 { let a5: i128 = 19_580_373_992_048_084_992; // 1.061405429 // t = 1 / (1 + p*|x|) - let px = q_mul(p, ax); + let px = q_mul(p, ax)?; let denom = Q_ONE + px; - let t = q_div(Q_ONE, denom); + let t = q_div(Q_ONE, denom)?; // Horner's method: poly = ((((a5*t + a4)*t + a3)*t + a2)*t + a1)*t let mut poly = a5; - poly = q_mul(poly, t) + a4; - poly = q_mul(poly, t) + a3; - poly = q_mul(poly, t) + a2; - poly = q_mul(poly, t) + a1; - poly = q_mul(poly, t); + poly = q_mul(poly, t)? + a4; + poly = q_mul(poly, t)? + a3; + poly = q_mul(poly, t)? + a2; + poly = q_mul(poly, t)? + a1; + poly = q_mul(poly, t)?; // exp(-x^2): use the integer exp approximation - let x2 = q_mul(ax, ax); - let exp_neg_x2 = q_exp_neg(x2); + let x2 = q_mul(ax, ax)?; + let exp_neg_x2 = q_exp_neg(x2)?; // erf = 1 - poly * exp(-x^2) - let result = Q_ONE - q_mul(poly, exp_neg_x2); + let result = Q_ONE - q_mul(poly, exp_neg_x2)?; - if is_neg { -result } else { result } + Ok(if is_neg { -result } else { result }) } /// Approximate exp(-x) for x >= 0 using the identity exp(-x) = (1 - x/n)^n /// with piecewise linear segments for better accuracy. -fn q_exp_neg(x: i128) -> i128 { - if x <= 0 { return Q_ONE; } +fn q_exp_neg(x: i128) -> Result { + if x <= 0 { return Ok(Q_ONE); } // For very large x, exp(-x) ≈ 0 let ten_q = 10i128 << FRAC_BITS; - if x >= ten_q { return 0; } + if x >= ten_q { return Ok(0); } // Use repeated squaring: exp(-x) = exp(-x/16)^16 // This keeps the argument small for better accuracy let small_x = x >> 4; // x/16 // exp(-small_x) ≈ 1 - small_x + small_x^2/2 - small_x^3/6 (Taylor 4 terms) - let x2 = q_mul(small_x, small_x); - let x3 = q_mul(x2, small_x); + let x2 = q_mul(small_x, small_x)?; + let x3 = q_mul(x2, small_x)?; let half_x2 = x2 >> 1; // x^2 / 2 - let sixth_x3 = q_div(x3, 6i128 << FRAC_BITS); // x^3 / 6 + let sixth_x3 = q_div(x3, 6i128 << FRAC_BITS)?; // x^3 / 6 let mut result = Q_ONE - small_x + half_x2 - sixth_x3; if result < 0 { result = 0; } // Square 4 times to get exp(-x) from exp(-x/16) for _ in 0..4 { - result = q_mul(result, result); + result = q_mul(result, result)?; if result < 0 { result = 0; } } - result + Ok(result) } /// Gaussian CDF: Φ(z) = 0.5 * (1 + erf(z / sqrt(2))) -fn gaussian_cdf_q(z: i128) -> i128 { - let z_over_sqrt2 = q_div(z, Q_SQRT_2); - let erf_val = q_erf(z_over_sqrt2); +fn gaussian_cdf_q(z: i128) -> Result { + let z_over_sqrt2 = q_div(z, Q_SQRT_2)?; + let erf_val = q_erf(z_over_sqrt2)?; // 0.5 * (1 + erf) - (Q_ONE + erf_val) >> 1 + Ok((Q_ONE + erf_val) >> 1) } /// Gaussian PDF: φ(z) = exp(-z²/2) / sqrt(2π) -fn gaussian_pdf_q(z: i128) -> i128 { - let z2 = q_mul(z, z); +fn gaussian_pdf_q(z: i128) -> Result { + let z2 = q_mul(z, z)?; let half_z2 = z2 >> 1; // z²/2 - let exp_val = q_exp_neg(half_z2); + let exp_val = q_exp_neg(half_z2)?; q_div(exp_val, Q_SQRT_2PI) } /// AMM invariant: f(x, y, L) = (y-x)*Φ(z) + L*φ(z) - y, where z = (y-x)/L -fn amm_func_q(x: i128, y: i128, l: i128) -> i128 { +fn amm_func_q(x: i128, y: i128, l: i128) -> Result { let diff = y - x; - let z = q_div(diff, l); - let cdf = gaussian_cdf_q(z); - let pdf = gaussian_pdf_q(z); + let z = q_div(diff, l)?; + let cdf = gaussian_cdf_q(z)?; + let pdf = gaussian_pdf_q(z)?; - q_mul(diff, cdf) + q_mul(l, pdf) - y + Ok(q_mul(diff, cdf)? + q_mul(l, pdf)? - y) } /// Derivative of invariant w.r.t. x: f'(x) = -Φ(z) -fn func_derivative_q(x: i128, y: i128, l: i128) -> i128 { - let z = q_div(y - x, l); - let mut deriv = -gaussian_cdf_q(z); +fn func_derivative_q(x: i128, y: i128, l: i128) -> Result { + let z = q_div(y - x, l)?; + let mut deriv = -gaussian_cdf_q(z)?; if q_abs(deriv) < Q_MIN_DERIVATIVE { deriv = if deriv < 0 { -Q_MIN_DERIVATIVE } else { Q_MIN_DERIVATIVE }; } - deriv + Ok(deriv) } /// Newton-Raphson solver for the new reserve given modified counterpart reserve -fn get_new_reserve_q(x_guess: i128, y: i128, l: i128) -> i128 { +fn get_new_reserve_q(x_guess: i128, y: i128, l: i128) -> Result { let mut t = if q_abs(x_guess) < Q_MIN_RESERVE { y >> 1 // Better initial guess: y/2 } else { @@ -174,17 +177,17 @@ fn get_new_reserve_q(x_guess: i128, y: i128, l: i128) -> i128 { }; for _ in 0..MAX_NEWTON_ITERS { - let f = amm_func_q(t, y, l); + let f = amm_func_q(t, y, l)?; if q_abs(f) < Q_APPROX { let res = q_abs(t); - return if res < Q_MIN_RESERVE { Q_MIN_RESERVE } else { res }; + return Ok(if res < Q_MIN_RESERVE { Q_MIN_RESERVE } else { res }); } - let deriv = func_derivative_q(t, y, l); - assert!(deriv != 0, "get_new_reserve_q: zero derivative"); - t = t - q_div(f, deriv); + let deriv = func_derivative_q(t, y, l)?; + require!(deriv != 0, PredictionMarketError::MathConvergenceError); + t = t - q_div(f, deriv)?; } - panic!("get_new_reserve_q: Newton-Raphson did not converge after {} iterations", MAX_NEWTON_ITERS); + err!(PredictionMarketError::MathConvergenceError) } // === Public API (u64 scaled by 1e6) === @@ -195,33 +198,33 @@ pub fn get_swap_amount( current_reserve_no: u64, initial_liquidity: u64, amount_in: u64, -) -> u64 { +) -> Result { let ry = u64_to_q(current_reserve_yes).max(Q_MIN_RESERVE); let rn = u64_to_q(current_reserve_no).max(Q_MIN_RESERVE); let l = u64_to_q(initial_liquidity); let amt = u64_to_q(amount_in); let amount_out = if yes_to_no { - q_abs(rn - get_new_reserve_q(rn, ry + amt, l)) + q_abs(rn - get_new_reserve_q(rn, ry + amt, l)?) } else { - q_abs(ry - get_new_reserve_q(ry, rn + amt, l)) + q_abs(ry - get_new_reserve_q(ry, rn + amt, l)?) }; - q_to_u64(amount_out) + Ok(q_to_u64(amount_out)) } -pub fn calc_price(x: u64, y: u64, l: u64) -> u64 { +pub fn calc_price(x: u64, y: u64, l: u64) -> Result { let rx = u64_to_q(x); let ry = u64_to_q(y); let lq = u64_to_q(l); - if lq == 0 { return 500_000; } // Default 50% if no liquidity + if lq == 0 { return Ok(500_000); } // Default 50% if no liquidity - let z = q_div(ry - rx, lq); - let price = gaussian_cdf_q(z); + let z = q_div(ry - rx, lq)?; + let price = gaussian_cdf_q(z)?; // Scale to 1_000_000 basis points - ((price * 1_000_000i128) >> FRAC_BITS) as u64 + Ok(((price * 1_000_000i128) >> FRAC_BITS) as u64) } pub fn calc_liquidity(liquidity: u64, deadline: i64, current_time: i64) -> u64 { @@ -271,14 +274,14 @@ mod tests { #[test] fn test_calc_price_equal_reserves() { // Equal reserves → z=0 → CDF(0) = 0.5 → price = 500_000 - let price = calc_price(1_000_000, 1_000_000, 1_000_000); + let price = calc_price(1_000_000, 1_000_000, 1_000_000).unwrap(); // Allow ±1% tolerance assert!(price >= 490_000 && price <= 510_000, "price={}", price); } #[test] fn test_get_swap_amount_nonzero() { - let amt_out = get_swap_amount(true, 1_000_000, 1_000_000, 1_000_000, 100_000); + let amt_out = get_swap_amount(true, 1_000_000, 1_000_000, 1_000_000, 100_000).unwrap(); assert!(amt_out > 0, "swap should produce output"); } @@ -302,8 +305,8 @@ mod tests { #[test] fn test_swap_symmetry() { // Swapping yes→no and no→yes with equal reserves should give same output - let out1 = get_swap_amount(true, 1_000_000, 1_000_000, 1_000_000, 100_000); - let out2 = get_swap_amount(false, 1_000_000, 1_000_000, 1_000_000, 100_000); + let out1 = get_swap_amount(true, 1_000_000, 1_000_000, 1_000_000, 100_000).unwrap(); + let out2 = get_swap_amount(false, 1_000_000, 1_000_000, 1_000_000, 100_000).unwrap(); // Should be equal (within rounding) let diff = if out1 > out2 { out1 - out2 } else { out2 - out1 }; assert!(diff <= 1, "symmetry broken: out1={}, out2={}", out1, out2); @@ -326,7 +329,7 @@ mod tests { let b = (456_i128 << 32) + (1_i128 << 31); let expected = (a * b) >> FRAC_BITS; - assert_eq!(q_mul(a, b), expected); + assert_eq!(q_mul(a, b).unwrap(), expected); assert_ne!((a >> 32) * (b >> 32), expected); } @@ -336,6 +339,6 @@ mod tests { let denominator = (7_i128 << 32) + (1_i128 << 31); let expected = (numerator << FRAC_BITS) / denominator; - assert_eq!(q_div(numerator, denominator), expected); + assert_eq!(q_div(numerator, denominator).unwrap(), expected); } } From 4dd830ddadc83fb9266044eecbd6ecb7b06eddcc Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Sun, 22 Mar 2026 01:31:07 -0500 Subject: [PATCH 20/24] fix(evm): harden LvrMarket and Router from PR #30 audit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LvrMarket.sol: - Fix bond slashing in settleFromOracle: return bond when proposer was correct or market cancelled (H1) - Fix cancellation rounding: use a/2+b/2 to avoid intermediate overflow and document intentional round-down (H2) - Fix getPriceYes: return 0.5e18 for ALL expired markets, not just dynamic — prevents price/execution divergence (H4) Router.sol: - Move allowedMarkets addition to AFTER successful market initialization to prevent callbacks to uninitialized markets (H3) --- .../evm-contracts/contracts/lvr_amm/LvrMarket.sol | 11 +++++++---- packages/evm-contracts/contracts/lvr_amm/Router.sol | 4 +++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/evm-contracts/contracts/lvr_amm/LvrMarket.sol b/packages/evm-contracts/contracts/lvr_amm/LvrMarket.sol index 9182bf7a..665a3f33 100644 --- a/packages/evm-contracts/contracts/lvr_amm/LvrMarket.sol +++ b/packages/evm-contracts/contracts/lvr_amm/LvrMarket.sol @@ -189,13 +189,15 @@ contract LvrMarket is ReentrancyGuard { outcome = duel.winner == DuelOutcomeOracle.Side.A ? 0 : 1; } - // Settle bond: slash if proposer was wrong or market was cancelled + // Settle bond: return if proposer was correct or market cancelled; slash if wrong uint256 returnedBond = 0; if (proposer != address(0)) { - if (state == MarketState.PENDING && outcome == proposedOutcome) { + if (outcome == proposedOutcome || outcome == 2) { + // Proposer was correct, or market cancelled — return bond IERC20(collateralToken).safeTransfer(proposer, bondValue); returnedBond = bondValue; } else { + // Proposer was wrong — slash to treasury IERC20(collateralToken).safeTransfer(treasuryAddress, bondValue); } } @@ -228,7 +230,8 @@ contract LvrMarket is ReentrancyGuard { // Cancellation: each token redeems at 0.5 collateral to maintain solvency. // Paying 1:1 for both tokens would exceed collateral pool since // total_yes_supply + total_no_supply > total_collateral after fee burns. - payout = (amountYesIn + amountNoIn) / 2; + // Intentional: rounds down (loses at most 1 wei) to guarantee solvency. + payout = amountYesIn / 2 + amountNoIn / 2; IERC20(collateralToken).safeTransfer(redeemer, payout); } else { revert("Invalid outcome"); @@ -340,7 +343,7 @@ contract LvrMarket is ReentrancyGuard { } function getPriceYes() public view returns(uint256) { - if (isDynamic && block.timestamp >= deadline) return 0.5e18; // neutral price after deadline + if (block.timestamp >= deadline) return 0.5e18; // neutral price after deadline (market expired) uint256 liq = isDynamic ? Math.calcLiquidity(liquidity, deadline, block.timestamp) : liquidity; return Math.calcPrice(yesToken.balanceOf(address(this)), noToken.balanceOf(address(this)), liq); } diff --git a/packages/evm-contracts/contracts/lvr_amm/Router.sol b/packages/evm-contracts/contracts/lvr_amm/Router.sol index 9d0fd7ae..751ec701 100644 --- a/packages/evm-contracts/contracts/lvr_amm/Router.sol +++ b/packages/evm-contracts/contracts/lvr_amm/Router.sol @@ -100,12 +100,14 @@ contract Router is AccessControl, ReentrancyGuard, IMarketBuyCallback, IMarketSe LvrMarket market = new LvrMarket(address(this), duelKey, address(duelOracle), isDynamic, duration, address(mUSD), msg.sender, treasury, feeBps); - allowedMarkets[address(market)] = true; // Transfer USD token to market contract mUSD.safeTransferFrom(msg.sender, address(market), collateralIn); uint256 liquidity = market.initializeLiquidity(collateralIn); + // Add to allowlist AFTER successful initialization to prevent callbacks to uninitialized markets + allowedMarkets[address(market)] = true; + markets[marketId] = MarketInfo({ market: address(market), liquidity: liquidity, From ca36e3b2c5da9930bf04ee2b13a0852218a74810 Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Sun, 22 Mar 2026 01:31:17 -0500 Subject: [PATCH 21/24] fix(solana): use config oracle ID and fix rebase duplicate fields settle_bet.rs: - Replace hardcoded fight_oracle program ID with amm_config.fight_oracle_program for upgradeability (M6) - Add optional amm_config account to SettleBet instruction Rebase artifact fixes: - Remove duplicate duel_key field in Bet struct - Remove duplicate duel_key parameter in create_bet - Add fight_oracle_program to initialize_config entrypoint --- .../lvr_amm/src/instructions/create_bet.rs | 2 -- .../lvr_amm/src/instructions/settle_bet.rs | 18 ++++++++++++------ .../anchor/programs/lvr_amm/src/lib.rs | 3 ++- .../anchor/programs/lvr_amm/src/state/bet.rs | 2 -- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/create_bet.rs b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/create_bet.rs index 9112b384..a969050e 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/create_bet.rs +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/create_bet.rs @@ -11,7 +11,6 @@ pub fn create_bet( bet_id: u64, initial_liq: u64, is_dynamic: bool, - duel_key: [u8; 32], bet_prompt: String, expiration: i64, duel_key: [u8; 32], @@ -43,7 +42,6 @@ pub fn create_bet( // Read fee/treasury from protocol config — not caller inputs bet.treasury = config.treasury; bet.fee_bps = config.fee_bps; - bet.duel_key = duel_key; Ok(()) } diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/settle_bet.rs b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/settle_bet.rs index 9093fc6f..ba819a98 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/settle_bet.rs +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/instructions/settle_bet.rs @@ -1,9 +1,8 @@ use anchor_lang::prelude::*; -use core::str::FromStr; use crate::{ error::PredictionMarketError, - state::{admin::Admin, bet::Bet}, + state::{admin::Admin, bet::Bet, config::AmmConfig}, }; const DUEL_STATE_DISCRIMINATOR: [u8; 8] = [0x95, 0xd5, 0x3b, 0xa5, 0x7c, 0x74, 0x91, 0x78]; @@ -71,12 +70,12 @@ pub fn settle_bet_instruction(ctx: Context, _bet_id: u64, side_won: u // If an oracle duel_state is provided, read winner from oracle (trustless path) let final_side_won = if let Some(duel_account) = &ctx.accounts.duel_state { - let fight_oracle_program_id = Pubkey::from_str("B5mRCRDJk9BrnH7regMWW5mpTQ8QG1CcCGSnDxMt8hmo") - .map_err(|_| error!(PredictionMarketError::InvalidOracleAccount))?; + let amm_config = ctx.accounts.amm_config.as_ref() + .ok_or(error!(PredictionMarketError::MissingAmmConfig))?; require_keys_eq!( *duel_account.owner, - fight_oracle_program_id, - PredictionMarketError::InvalidOracleAccount + amm_config.fight_oracle_program, + PredictionMarketError::InvalidFightOracleProgram ); let data = duel_account.try_borrow_data()?; @@ -155,6 +154,13 @@ pub struct SettleBet<'info> { )] pub bet: Account<'info, Bet>, + /// Optional: AmmConfig for oracle program ID validation (required when duel_state is provided) + #[account( + seeds = [b"amm_config"], + bump = amm_config.bump, + )] + pub amm_config: Option>, + /// Optional: fight_oracle DuelState account. When provided, winner is read /// from the oracle rather than trusting the caller's `side_won` argument. /// CHECK: We manually deserialize the data at known offsets. diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/lib.rs b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/lib.rs index b2d864de..6f4941f8 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/lib.rs +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/lib.rs @@ -22,9 +22,10 @@ pub mod lvr_amm { ctx: Context, treasury: Pubkey, market_maker: Pubkey, + fight_oracle_program: Pubkey, fee_bps: u16, ) -> Result<()> { - initialize_amm_config(ctx, treasury, market_maker, fee_bps) + initialize_amm_config(ctx, treasury, market_maker, fight_oracle_program, fee_bps) } pub fn freeze_config(ctx: Context) -> Result<()> { diff --git a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/state/bet.rs b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/state/bet.rs index 5eec645e..c014cb77 100644 --- a/packages/hyperbet-solana/anchor/programs/lvr_amm/src/state/bet.rs +++ b/packages/hyperbet-solana/anchor/programs/lvr_amm/src/state/bet.rs @@ -16,6 +16,4 @@ pub struct Bet { pub creator: Pubkey, pub treasury: Pubkey, pub fee_bps: u16, - /// Full 32-byte duel key for oracle cross-reference (0 if not set) - pub duel_key: [u8; 32], } From 97807c00277b5cca7fdf79f2ea7d0a79d1b5984f Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Sun, 22 Mar 2026 01:33:24 -0500 Subject: [PATCH 22/24] fix(mm-bot): align TS AMM math with Rust error handling - qDiv now throws on zero division instead of silently returning 0n, matching Rust assert!(b != 0) behavior - createEvmAmmRuntime logs caught errors before returning disabled runtime, preventing silent failure diagnosis gaps --- packages/market-maker-bot/src/amm-math.ts | 2 +- packages/market-maker-bot/src/index.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/market-maker-bot/src/amm-math.ts b/packages/market-maker-bot/src/amm-math.ts index 67a3b717..7f8f0545 100644 --- a/packages/market-maker-bot/src/amm-math.ts +++ b/packages/market-maker-bot/src/amm-math.ts @@ -37,7 +37,7 @@ function qMul(a: bigint, b: bigint): bigint { } function qDiv(a: bigint, b: bigint): bigint { - if (b === 0n) return 0n; + if (b === 0n) throw new Error("Q64.64 division by zero"); return (a << FRAC_BITS) / b; } diff --git a/packages/market-maker-bot/src/index.ts b/packages/market-maker-bot/src/index.ts index 62aa920d..e298ff76 100644 --- a/packages/market-maker-bot/src/index.ts +++ b/packages/market-maker-bot/src/index.ts @@ -2872,7 +2872,8 @@ export class CrossChainMarketMaker { routerAddress, rpcUrl, }; - } catch { + } catch (err) { + console.warn(`[AMM] Failed to create EVM AMM runtime for ${chainKey}:`, err); return disabled; } } From 79973160bdbd1f2fd1c231e7feca130641c98a3f Mon Sep 17 00:00:00 2001 From: SYMBaiEX Date: Sun, 22 Mar 2026 01:33:35 -0500 Subject: [PATCH 23/24] chore(solana): regenerate IDL, types, and program binary Rebuild artifacts after math.rs Result propagation and settle_bet oracle config changes. --- .../anchor/target/deploy/lvr_amm.so | Bin 523552 -> 512488 bytes .../anchor/target/idl/lvr_amm.json | 290 +++++------------- .../anchor/target/types/lvr_amm.ts | 290 +++++------------- .../hyperbet-solana/app/src/idl/lvr_amm.ts | 290 +++++------------- 4 files changed, 210 insertions(+), 660 deletions(-) diff --git a/packages/hyperbet-solana/anchor/target/deploy/lvr_amm.so b/packages/hyperbet-solana/anchor/target/deploy/lvr_amm.so index d6b37e01135f6c29229ce204d4f43c4479b90a9d..a72067f98d224da19e9104ec22cb60787c320244 100755 GIT binary patch literal 512488 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 *;mEi7XqIe`D=XQyLf5( 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 bz6^f{*~++U4vqgsp3?mZnuYW?KL7s!>vL;L literal 523552 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[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 W+)~ Date: Sun, 22 Mar 2026 01:48:31 -0500 Subject: [PATCH 24/24] fix(mm-bot): correct Router.create arg order and throw on Newton divergence Router.create arguments 4-7 were in wrong order vs Solidity signature (duelKey must precede isDynamic). Newton-Raphson non-convergence now throws instead of silently returning best guess, aligning with Rust. --- packages/market-maker-bot/src/amm-math.ts | 3 +-- packages/market-maker-bot/src/local-sim.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/market-maker-bot/src/amm-math.ts b/packages/market-maker-bot/src/amm-math.ts index 7f8f0545..e07c5c8f 100644 --- a/packages/market-maker-bot/src/amm-math.ts +++ b/packages/market-maker-bot/src/amm-math.ts @@ -166,8 +166,7 @@ function getNewReserveQ(xGuess: bigint, y: bigint, l: bigint): bigint { t = t - qDiv(f, deriv); } - const res = qAbs(t); - return res < Q_MIN_RESERVE ? Q_MIN_RESERVE : res; + throw new Error("Newton-Raphson did not converge after 50 iterations"); } // === Public API (u64 scaled by 1e6) === diff --git a/packages/market-maker-bot/src/local-sim.ts b/packages/market-maker-bot/src/local-sim.ts index 92fe081e..9e19c5e4 100644 --- a/packages/market-maker-bot/src/local-sim.ts +++ b/packages/market-maker-bot/src/local-sim.ts @@ -520,10 +520,10 @@ async function createMarkets( "Local Sim Market", "Test market for local simulation", "local://sim", + duel, false, // static liquidity (simpler) duration, collateral, - duel, { nonce: await nextNonce(admin.address) }, ); const receipt = await tx.wait();