{
  "network": "arc-mainnet",
  "chainId": 5042,
  "factoryStartBlock": 20883999,
  "explorer": "https://testnet.arcscan.app",
  "generatedBy": "foci/backend/ops/scripts/emit-ui-docs.ts",
  "contracts": [
    {
      "name": "FociLaunchFactory",
      "kind": "singleton",
      "address": "0xa392D6eca5242715517eeCd43406aeD19424FAC0",
      "abi": [
        {
          "type": "constructor",
          "inputs": [
            {
              "name": "initialOwner",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "poolManager_",
              "type": "address",
              "internalType": "contract IPoolManager"
            },
            {
              "name": "positionManager_",
              "type": "address",
              "internalType": "contract IPositionManager"
            },
            {
              "name": "permit2_",
              "type": "address",
              "internalType": "contract IAllowanceTransfer"
            },
            {
              "name": "locker_",
              "type": "address",
              "internalType": "contract FociLaunchLocker"
            },
            {
              "name": "memeHook_",
              "type": "address",
              "internalType": "contract FociMemeHook"
            },
            {
              "name": "feeEscrow_",
              "type": "address",
              "internalType": "contract IFociFeeEscrow"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "receive",
          "stateMutability": "payable"
        },
        {
          "type": "function",
          "name": "CREATOR_FEE_RECIPIENT_EXECUTION_WINDOW",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "CREATOR_FEE_RECIPIENT_TIMELOCK",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "GRADUATION_RESCUE_DELAY",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "acceptOwnership",
          "inputs": [],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "addLaunchConfig",
          "inputs": [
            {
              "name": "config",
              "type": "tuple",
              "internalType": "struct FociLaunchFactory.LaunchConfig",
              "components": [
                {
                  "name": "supply",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "curveFeeBps",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "phantomQuote",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "graduationThreshold",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "poolFee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "enabled",
                  "type": "bool",
                  "internalType": "bool"
                }
              ]
            }
          ],
          "outputs": [
            {
              "name": "id",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "approvedPairTokens",
          "inputs": [
            {
              "name": "pairToken",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "approved",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "canLaunch",
          "inputs": [
            {
              "name": "launcher",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "cancelCreatorFeeRecipientChange",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "createGraduatedPool",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "positionId",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "executeCreatorFeeRecipientChange",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "feeEscrow",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IFociFeeEscrow"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "forceSweptGraduation",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "getLaunchConfig",
          "inputs": [
            {
              "name": "id",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "tuple",
              "internalType": "struct FociLaunchFactory.LaunchConfig",
              "components": [
                {
                  "name": "supply",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "curveFeeBps",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "phantomQuote",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "graduationThreshold",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "poolFee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "enabled",
                  "type": "bool",
                  "internalType": "bool"
                }
              ]
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "getLaunchFeePolicy",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "tuple",
              "internalType": "struct FeePolicySnapshot",
              "components": [
                {
                  "name": "protocolFeeRecipient",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "protocolFeeShareBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "hookFeeBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "maxInternalPriceImpactBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "referralDiscountBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "referralShareBps",
                  "type": "uint16",
                  "internalType": "uint16"
                }
              ]
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "getLaunchedToken",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "tuple",
              "internalType": "struct IFociLaunchFactory.LaunchedToken",
              "components": [
                {
                  "name": "token",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "curve",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "deployer",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "creatorFeeRecipient",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "pairToken",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "graduationThreshold",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "poolFee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "creatorTaxBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "phase",
                  "type": "uint8",
                  "internalType": "enum GraduationPhase"
                },
                {
                  "name": "sweptQuote",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "sweptTokens",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "sweptAt",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "exists",
                  "type": "bool",
                  "internalType": "bool"
                }
              ]
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "graduate",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "graduationExecutor",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract FociGraduationExecutor"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "graduationGuard",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract FociGraduationGuard"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "launchConfigCount",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "launchDeployer",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract FociLaunchDeployer"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "launchEnabled",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "launchFee",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "launchFeeToken",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IERC20"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "launchForwarder",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "launchToken",
          "inputs": [
            {
              "name": "params",
              "type": "tuple",
              "internalType": "struct FociLaunchFactory.TokenParams",
              "components": [
                {
                  "name": "name",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "symbol",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "logo",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "description",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "socials",
                  "type": "tuple",
                  "internalType": "struct FociLauncherToken.Socials",
                  "components": [
                    {
                      "name": "twitter",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "telegram",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "discord",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "website",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "farcaster",
                      "type": "string",
                      "internalType": "string"
                    }
                  ]
                },
                {
                  "name": "creatorFeeRecipient",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "creatorTaxBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "expectedEconomics",
                  "type": "bytes32",
                  "internalType": "bytes32"
                },
                {
                  "name": "salt",
                  "type": "bytes32",
                  "internalType": "bytes32"
                }
              ]
            },
            {
              "name": "launchConfigId",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "pairToken",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "curve",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "launchTokenFor",
          "inputs": [
            {
              "name": "params",
              "type": "tuple",
              "internalType": "struct FociLaunchFactory.TokenParams",
              "components": [
                {
                  "name": "name",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "symbol",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "logo",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "description",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "socials",
                  "type": "tuple",
                  "internalType": "struct FociLauncherToken.Socials",
                  "components": [
                    {
                      "name": "twitter",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "telegram",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "discord",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "website",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "farcaster",
                      "type": "string",
                      "internalType": "string"
                    }
                  ]
                },
                {
                  "name": "creatorFeeRecipient",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "creatorTaxBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "expectedEconomics",
                  "type": "bytes32",
                  "internalType": "bytes32"
                },
                {
                  "name": "salt",
                  "type": "bytes32",
                  "internalType": "bytes32"
                }
              ]
            },
            {
              "name": "launchConfigId",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "pairToken",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "originalDeployer",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "curve",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "locker",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract FociLaunchLocker"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "maxCreatorTaxBps",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "memeHook",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract FociMemeHook"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "owner",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "pairTokenEconomics",
          "inputs": [
            {
              "name": "pairToken",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "phantomQuote",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "graduationThreshold",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "decimals",
              "type": "uint8",
              "internalType": "uint8"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "pendingCreatorFeeRecipient",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "newRecipient",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "effectiveAt",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "expiresAt",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "pendingOwner",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "permit2",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IAllowanceTransfer"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "poolManager",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IPoolManager"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "positionManager",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IPositionManager"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "previewLaunchEconomics",
          "inputs": [
            {
              "name": "launchConfigId",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "pairToken",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "renounceOwnership",
          "inputs": [],
          "outputs": [],
          "stateMutability": "pure"
        },
        {
          "type": "function",
          "name": "rescueCurveFees",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "rescueSweptGraduation",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setCreatorFeeRecipient",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "newRecipient",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setGraduationExecutor",
          "inputs": [
            {
              "name": "executor",
              "type": "address",
              "internalType": "contract FociGraduationExecutor"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setLaunchDeployer",
          "inputs": [
            {
              "name": "deployer",
              "type": "address",
              "internalType": "contract FociLaunchDeployer"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setLaunchEnabled",
          "inputs": [
            {
              "name": "enabled",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setLaunchFee",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "contract IERC20"
            },
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setLaunchForwarder",
          "inputs": [
            {
              "name": "forwarder",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setMaxCreatorTaxBps",
          "inputs": [
            {
              "name": "bps",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setPairTokenApproved",
          "inputs": [
            {
              "name": "pairToken",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "approved",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setPairTokenEconomics",
          "inputs": [
            {
              "name": "pairToken",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "phantomQuote",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "graduationThreshold",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "expectedDecimals",
              "type": "uint8",
              "internalType": "uint8"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setWhitelistedLauncher",
          "inputs": [
            {
              "name": "launcher",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "enabled",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "transferCreatorFeeRecipient",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "newRecipient",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "transferOwnership",
          "inputs": [
            {
              "name": "newOwner",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "updateLaunchConfig",
          "inputs": [
            {
              "name": "id",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "config",
              "type": "tuple",
              "internalType": "struct FociLaunchFactory.LaunchConfig",
              "components": [
                {
                  "name": "supply",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "curveFeeBps",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "phantomQuote",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "graduationThreshold",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "poolFee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "enabled",
                  "type": "bool",
                  "internalType": "bool"
                }
              ]
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "whitelistedLaunchers",
          "inputs": [
            {
              "name": "launcher",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "enabled",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "event",
          "name": "CreatorFeeRecipientChangeCancelled",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "proposedRecipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "CreatorFeeRecipientChangeProposed",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "currentRecipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "proposedRecipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "effectiveAt",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "expiresAt",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "CreatorFeeRecipientUpdated",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "previousRecipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "newRecipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "GraduationExecutorSet",
          "inputs": [
            {
              "name": "executor",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "GraduationTokensPermanentlyLocked",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "LaunchConfigAdded",
          "inputs": [
            {
              "name": "id",
              "type": "uint256",
              "indexed": true,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "LaunchConfigUpdated",
          "inputs": [
            {
              "name": "id",
              "type": "uint256",
              "indexed": true,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "LaunchDeployerSet",
          "inputs": [
            {
              "name": "deployer",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "LaunchEnabledUpdated",
          "inputs": [
            {
              "name": "enabled",
              "type": "bool",
              "indexed": false,
              "internalType": "bool"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "LaunchFeeUpdated",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "LaunchForceSwept",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "LaunchForwarderSet",
          "inputs": [
            {
              "name": "forwarder",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "LaunchGraduationRescued",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "recipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "quoteAmount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "tokenAmount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "LaunchSwept",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "quoteOut",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "tokenOut",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "MaxCreatorTaxUpdated",
          "inputs": [
            {
              "name": "bps",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "OwnershipTransferStarted",
          "inputs": [
            {
              "name": "previousOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "newOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "OwnershipTransferred",
          "inputs": [
            {
              "name": "previousOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "newOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "PairTokenApprovalUpdated",
          "inputs": [
            {
              "name": "pairToken",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "approved",
              "type": "bool",
              "indexed": false,
              "internalType": "bool"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "PairTokenEconomicsUpdated",
          "inputs": [
            {
              "name": "pairToken",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "phantomQuote",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "graduationThreshold",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "decimals",
              "type": "uint8",
              "indexed": false,
              "internalType": "uint8"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "PoolGraduated",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "positionId",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "tokenAmount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "pairTokenAmount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "TokenLaunched",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "curve",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "deployer",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "pairToken",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            },
            {
              "name": "launchConfigId",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "graduationThreshold",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "WhitelistedLauncherUpdated",
          "inputs": [
            {
              "name": "launcher",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "enabled",
              "type": "bool",
              "indexed": false,
              "internalType": "bool"
            }
          ],
          "anonymous": false
        },
        {
          "type": "error",
          "name": "AlreadySet",
          "inputs": []
        },
        {
          "type": "error",
          "name": "CombinedFeeTooHigh",
          "inputs": []
        },
        {
          "type": "error",
          "name": "CoreLpFeeMustBeZero",
          "inputs": []
        },
        {
          "type": "error",
          "name": "CreatorTaxTooHigh",
          "inputs": []
        },
        {
          "type": "error",
          "name": "CurveFeeTooHigh",
          "inputs": []
        },
        {
          "type": "error",
          "name": "CurveNotQuotable",
          "inputs": []
        },
        {
          "type": "error",
          "name": "FeeTransferFailed",
          "inputs": []
        },
        {
          "type": "error",
          "name": "GraduationExecutorNotSet",
          "inputs": []
        },
        {
          "type": "error",
          "name": "GraduationRescueTooEarly",
          "inputs": [
            {
              "name": "availableAt",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "GraduationSeedNotViable",
          "inputs": []
        },
        {
          "type": "error",
          "name": "GraduationStillViable",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InexactTransfer",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "expected",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "received",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "InvalidBasisPoints",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InvalidGraduationThreshold",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InvalidLaunchConfigId",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InvalidPhantomQuote",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InvalidTickSpacing",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InvalidTokenParams",
          "inputs": []
        },
        {
          "type": "error",
          "name": "LaunchConfigDisabled",
          "inputs": []
        },
        {
          "type": "error",
          "name": "LaunchDependenciesNotWired",
          "inputs": []
        },
        {
          "type": "error",
          "name": "LaunchDeployerNotSet",
          "inputs": []
        },
        {
          "type": "error",
          "name": "LaunchEconomicsMismatch",
          "inputs": [
            {
              "name": "expected",
              "type": "bytes32",
              "internalType": "bytes32"
            },
            {
              "name": "actual",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ]
        },
        {
          "type": "error",
          "name": "LaunchFeeTokenNotSet",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NoPendingChange",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotCreatorFeeRecipient",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotLaunchForwarder",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotReadyToGraduate",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotWhitelisted",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NothingToGraduate",
          "inputs": []
        },
        {
          "type": "error",
          "name": "OwnableInvalidOwner",
          "inputs": [
            {
              "name": "owner",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "OwnableUnauthorizedAccount",
          "inputs": [
            {
              "name": "account",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "OwnershipCannotBeRenounced",
          "inputs": []
        },
        {
          "type": "error",
          "name": "PairTokenDecimalsMismatch",
          "inputs": [
            {
              "name": "expected",
              "type": "uint8",
              "internalType": "uint8"
            },
            {
              "name": "actual",
              "type": "uint8",
              "internalType": "uint8"
            }
          ]
        },
        {
          "type": "error",
          "name": "PairTokenDecimalsUnavailable",
          "inputs": []
        },
        {
          "type": "error",
          "name": "PairTokenEconomicsInvalid",
          "inputs": []
        },
        {
          "type": "error",
          "name": "PairTokenNotApproved",
          "inputs": []
        },
        {
          "type": "error",
          "name": "PairTokenValidationFailed",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ReentrancyGuardReentrantCall",
          "inputs": []
        },
        {
          "type": "error",
          "name": "SafeERC20FailedOperation",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "SqrtPriceOutOfBounds",
          "inputs": []
        },
        {
          "type": "error",
          "name": "SupplyTooHigh",
          "inputs": []
        },
        {
          "type": "error",
          "name": "SupplyTooLow",
          "inputs": []
        },
        {
          "type": "error",
          "name": "TimelockExpired",
          "inputs": [
            {
              "name": "expiresAt",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "TimelockNotElapsed",
          "inputs": [
            {
              "name": "effectiveAt",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "TokenNotFound",
          "inputs": []
        },
        {
          "type": "error",
          "name": "UnsupportedPrice",
          "inputs": []
        },
        {
          "type": "error",
          "name": "WrongGraduationPhase",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ZeroAddress",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ZeroAmount",
          "inputs": []
        }
      ]
    },
    {
      "name": "FociBondingCurve",
      "kind": "perLaunch",
      "abi": [
        {
          "type": "constructor",
          "inputs": [
            {
              "name": "pairToken_",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "deployer_",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "factory_",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "feePolicy_",
              "type": "address",
              "internalType": "contract IFociFeePolicy"
            },
            {
              "name": "policy_",
              "type": "tuple",
              "internalType": "struct FeePolicySnapshot",
              "components": [
                {
                  "name": "protocolFeeRecipient",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "protocolFeeShareBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "hookFeeBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "maxInternalPriceImpactBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "referralDiscountBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "referralShareBps",
                  "type": "uint16",
                  "internalType": "uint16"
                }
              ]
            },
            {
              "name": "feeEscrow_",
              "type": "address",
              "internalType": "contract IFociFeeEscrow"
            },
            {
              "name": "referralRegistry_",
              "type": "address",
              "internalType": "contract IFociReferralRegistry"
            },
            {
              "name": "phantomQuote_",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "feeBps_",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "creatorTaxBps_",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "graduationThreshold_",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "buy",
          "inputs": [
            {
              "name": "quoteIn",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "minTokensOut",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "tokensOut",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "payable"
        },
        {
          "type": "function",
          "name": "buy",
          "inputs": [
            {
              "name": "quoteIn",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "minTokensOut",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "referrer",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "tokensOut",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "payable"
        },
        {
          "type": "function",
          "name": "creatorTaxBalance",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "creatorTaxBps",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "deployer",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "factory",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "feeBps",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "feeEscrow",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IFociFeeEscrow"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "feePolicy",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IFociFeePolicy"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "getReserves",
          "inputs": [],
          "outputs": [
            {
              "name": "quoteReserve_",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "tokenReserve_",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "graduate",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "quoteOut",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "tokenOut",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "graduated",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "graduationThreshold",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "initialize",
          "inputs": [
            {
              "name": "token_",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "isNativeQuote",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "launchSupply",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "launchedAt",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "maxInternalPriceImpactBps",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint16",
              "internalType": "uint16"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "pairToken",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "phantomQuote",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "protocolFeeRecipient",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "protocolFeeShareBps",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint16",
              "internalType": "uint16"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "quoteFeeBalance",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "quoteReserve",
          "inputs": [],
          "outputs": [
            {
              "name": "quoteReserve_",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "readyToGraduate",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "realQuoteReserve",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "referralDiscountBps",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint16",
              "internalType": "uint16"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "referralRegistry",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IFociReferralRegistry"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "referralShareBps",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint16",
              "internalType": "uint16"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "rescueFees",
          "inputs": [],
          "outputs": [
            {
              "name": "protocolAmount",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "creatorAmount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "reservedTokens",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "sell",
          "inputs": [
            {
              "name": "tokensIn",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "minQuoteOut",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "quoteOut",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "sellableTokens",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "setCreatorFeeRecipient",
          "inputs": [
            {
              "name": "newRecipient",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "sweepFees",
          "inputs": [],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "token",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "tokenReserve",
          "inputs": [],
          "outputs": [
            {
              "name": "tokenReserve_",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "trackedQuote",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "trackedTokens",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "event",
          "name": "AutoGraduationFailed",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "gasRemaining",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "AutoSeedFailed",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "gasRemaining",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "CreatorFeeRecipientUpdated",
          "inputs": [
            {
              "name": "previousRecipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "newRecipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "CurveBuy",
          "inputs": [
            {
              "name": "buyer",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "recipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "quoteIn",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "tokensOut",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "fee",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "tax",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "CurveBuyRefunded",
          "inputs": [
            {
              "name": "buyer",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "refund",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "CurveCompleted",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            },
            {
              "name": "quoteOut",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "tokenOut",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "CurveSell",
          "inputs": [
            {
              "name": "seller",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "recipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "tokensIn",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "quoteOut",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "fee",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "tax",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "FeesRescued",
          "inputs": [
            {
              "name": "protocolRecipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "creatorRecipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "protocolAmount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "creatorAmount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "FeesSwept",
          "inputs": [
            {
              "name": "protocolAmount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "creatorAmount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "Initialized",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "ReferralFeePaid",
          "inputs": [
            {
              "name": "referrer",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "trader",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "error",
          "name": "AlreadyGraduated",
          "inputs": []
        },
        {
          "type": "error",
          "name": "AlreadyInitialized",
          "inputs": []
        },
        {
          "type": "error",
          "name": "CurveGraduated",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InsufficientInputAmount",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InsufficientLiquidity",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InsufficientOutputAmount",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InvalidFeePolicy",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InvalidLaunchEconomics",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NativeValueMismatch",
          "inputs": [
            {
              "name": "supplied",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "expected",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "NotFactory",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotFeeSweepOperator",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotInitialized",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotReadyToGraduate",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ReentrancyGuardReentrantCall",
          "inputs": []
        },
        {
          "type": "error",
          "name": "SafeERC20FailedOperation",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "SlippageExceeded",
          "inputs": [
            {
              "name": "actual",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "minimum",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "TransferFailed",
          "inputs": []
        },
        {
          "type": "error",
          "name": "UnexpectedNativeValue",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ZeroAddress",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ZeroAmount",
          "inputs": []
        }
      ]
    },
    {
      "name": "FociLauncherToken",
      "kind": "perLaunch",
      "abi": [
        {
          "type": "constructor",
          "inputs": [
            {
              "name": "name_",
              "type": "string",
              "internalType": "string"
            },
            {
              "name": "symbol_",
              "type": "string",
              "internalType": "string"
            },
            {
              "name": "logo_",
              "type": "string",
              "internalType": "string"
            },
            {
              "name": "description_",
              "type": "string",
              "internalType": "string"
            },
            {
              "name": "socials_",
              "type": "tuple",
              "internalType": "struct FociLauncherToken.Socials",
              "components": [
                {
                  "name": "twitter",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "telegram",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "discord",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "website",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "farcaster",
                  "type": "string",
                  "internalType": "string"
                }
              ]
            },
            {
              "name": "deployer_",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "curve_",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "launchFactory_",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "supply_",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "allowance",
          "inputs": [
            {
              "name": "owner",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "spender",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "approve",
          "inputs": [
            {
              "name": "spender",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "value",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "balanceOf",
          "inputs": [
            {
              "name": "account",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "burn",
          "inputs": [
            {
              "name": "value",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "burnFrom",
          "inputs": [
            {
              "name": "account",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "value",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "curve",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "decimals",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint8",
              "internalType": "uint8"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "deployer",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "description",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "string",
              "internalType": "string"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "getTokenInfo",
          "inputs": [],
          "outputs": [
            {
              "name": "tokenDeployer",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "tokenLogo",
              "type": "string",
              "internalType": "string"
            },
            {
              "name": "tokenDescription",
              "type": "string",
              "internalType": "string"
            },
            {
              "name": "tokenSocials",
              "type": "tuple",
              "internalType": "struct FociLauncherToken.Socials",
              "components": [
                {
                  "name": "twitter",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "telegram",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "discord",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "website",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "farcaster",
                  "type": "string",
                  "internalType": "string"
                }
              ]
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "launchFactory",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "logo",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "string",
              "internalType": "string"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "name",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "string",
              "internalType": "string"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "socials",
          "inputs": [],
          "outputs": [
            {
              "name": "twitter",
              "type": "string",
              "internalType": "string"
            },
            {
              "name": "telegram",
              "type": "string",
              "internalType": "string"
            },
            {
              "name": "discord",
              "type": "string",
              "internalType": "string"
            },
            {
              "name": "website",
              "type": "string",
              "internalType": "string"
            },
            {
              "name": "farcaster",
              "type": "string",
              "internalType": "string"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "symbol",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "string",
              "internalType": "string"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "totalSupply",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "transfer",
          "inputs": [
            {
              "name": "to",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "value",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "transferFrom",
          "inputs": [
            {
              "name": "from",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "to",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "value",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "event",
          "name": "Approval",
          "inputs": [
            {
              "name": "owner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "spender",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "value",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "Transfer",
          "inputs": [
            {
              "name": "from",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "to",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "value",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "error",
          "name": "ERC20InsufficientAllowance",
          "inputs": [
            {
              "name": "spender",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "allowance",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "needed",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "ERC20InsufficientBalance",
          "inputs": [
            {
              "name": "sender",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "balance",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "needed",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "ERC20InvalidApprover",
          "inputs": [
            {
              "name": "approver",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "ERC20InvalidReceiver",
          "inputs": [
            {
              "name": "receiver",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "ERC20InvalidSender",
          "inputs": [
            {
              "name": "sender",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "ERC20InvalidSpender",
          "inputs": [
            {
              "name": "spender",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "ZeroAddress",
          "inputs": []
        }
      ]
    },
    {
      "name": "FociLaunchAndBuy",
      "kind": "singleton",
      "address": "0x5C5c202271E1300bD5Ce43A4F5C1cEA8efd57B63",
      "abi": [
        {
          "type": "constructor",
          "inputs": [
            {
              "name": "factory_",
              "type": "address",
              "internalType": "contract FociLaunchFactory"
            },
            {
              "name": "owner_",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "receive",
          "stateMutability": "payable"
        },
        {
          "type": "function",
          "name": "acceptOwnership",
          "inputs": [],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "factory",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract FociLaunchFactory"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "launchAndBuy",
          "inputs": [
            {
              "name": "params",
              "type": "tuple",
              "internalType": "struct FociLaunchFactory.TokenParams",
              "components": [
                {
                  "name": "name",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "symbol",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "logo",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "description",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "socials",
                  "type": "tuple",
                  "internalType": "struct FociLauncherToken.Socials",
                  "components": [
                    {
                      "name": "twitter",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "telegram",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "discord",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "website",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "farcaster",
                      "type": "string",
                      "internalType": "string"
                    }
                  ]
                },
                {
                  "name": "creatorFeeRecipient",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "creatorTaxBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "expectedEconomics",
                  "type": "bytes32",
                  "internalType": "bytes32"
                },
                {
                  "name": "salt",
                  "type": "bytes32",
                  "internalType": "bytes32"
                }
              ]
            },
            {
              "name": "launchConfigId",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "pairToken",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "quoteIn",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "minTokensOut",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "curve",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "tokensOut",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "payable"
        },
        {
          "type": "function",
          "name": "owner",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "pendingOwner",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "renounceOwnership",
          "inputs": [],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "rescue",
          "inputs": [
            {
              "name": "asset",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "transferOwnership",
          "inputs": [
            {
              "name": "newOwner",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "event",
          "name": "Launched",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "curve",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "recipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "launcher",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            },
            {
              "name": "quoteSpent",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "tokensReceived",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "OwnershipTransferStarted",
          "inputs": [
            {
              "name": "previousOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "newOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "OwnershipTransferred",
          "inputs": [
            {
              "name": "previousOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "newOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "Rescued",
          "inputs": [
            {
              "name": "asset",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "recipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "error",
          "name": "NativeValueMismatch",
          "inputs": [
            {
              "name": "sent",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "expected",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "NotApprovedLauncher",
          "inputs": []
        },
        {
          "type": "error",
          "name": "OwnableInvalidOwner",
          "inputs": [
            {
              "name": "owner",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "OwnableUnauthorizedAccount",
          "inputs": [
            {
              "name": "account",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "ReentrancyGuardReentrantCall",
          "inputs": []
        },
        {
          "type": "error",
          "name": "RefundFailed",
          "inputs": []
        },
        {
          "type": "error",
          "name": "SafeERC20FailedOperation",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "ZeroAddress",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ZeroAmount",
          "inputs": []
        }
      ]
    },
    {
      "name": "FociMemeHook",
      "kind": "singleton",
      "address": "0xF847790B6fA5DA300BB3f56f10d743e71E98e044",
      "abi": [
        {
          "type": "constructor",
          "inputs": [
            {
              "name": "poolManager_",
              "type": "address",
              "internalType": "contract IPoolManager"
            },
            {
              "name": "feeEscrow_",
              "type": "address",
              "internalType": "contract IFociFeeEscrow"
            },
            {
              "name": "protocolFeeRecipient_",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "initialOwner_",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "receive",
          "stateMutability": "payable"
        },
        {
          "type": "function",
          "name": "acceptOwnership",
          "inputs": [],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "afterAddLiquidity",
          "inputs": [
            {
              "name": "sender",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "key",
              "type": "tuple",
              "internalType": "struct PoolKey",
              "components": [
                {
                  "name": "currency0",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "currency1",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "fee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "hooks",
                  "type": "address",
                  "internalType": "contract IHooks"
                }
              ]
            },
            {
              "name": "params",
              "type": "tuple",
              "internalType": "struct ModifyLiquidityParams",
              "components": [
                {
                  "name": "tickLower",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "tickUpper",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "liquidityDelta",
                  "type": "int256",
                  "internalType": "int256"
                },
                {
                  "name": "salt",
                  "type": "bytes32",
                  "internalType": "bytes32"
                }
              ]
            },
            {
              "name": "delta",
              "type": "int256",
              "internalType": "BalanceDelta"
            },
            {
              "name": "feesAccrued",
              "type": "int256",
              "internalType": "BalanceDelta"
            },
            {
              "name": "hookData",
              "type": "bytes",
              "internalType": "bytes"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes4",
              "internalType": "bytes4"
            },
            {
              "name": "",
              "type": "int256",
              "internalType": "BalanceDelta"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "afterDonate",
          "inputs": [
            {
              "name": "sender",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "key",
              "type": "tuple",
              "internalType": "struct PoolKey",
              "components": [
                {
                  "name": "currency0",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "currency1",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "fee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "hooks",
                  "type": "address",
                  "internalType": "contract IHooks"
                }
              ]
            },
            {
              "name": "amount0",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "amount1",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "hookData",
              "type": "bytes",
              "internalType": "bytes"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes4",
              "internalType": "bytes4"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "afterInitialize",
          "inputs": [
            {
              "name": "sender",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "key",
              "type": "tuple",
              "internalType": "struct PoolKey",
              "components": [
                {
                  "name": "currency0",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "currency1",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "fee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "hooks",
                  "type": "address",
                  "internalType": "contract IHooks"
                }
              ]
            },
            {
              "name": "sqrtPriceX96",
              "type": "uint160",
              "internalType": "uint160"
            },
            {
              "name": "tick",
              "type": "int24",
              "internalType": "int24"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes4",
              "internalType": "bytes4"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "afterRemoveLiquidity",
          "inputs": [
            {
              "name": "sender",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "key",
              "type": "tuple",
              "internalType": "struct PoolKey",
              "components": [
                {
                  "name": "currency0",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "currency1",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "fee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "hooks",
                  "type": "address",
                  "internalType": "contract IHooks"
                }
              ]
            },
            {
              "name": "params",
              "type": "tuple",
              "internalType": "struct ModifyLiquidityParams",
              "components": [
                {
                  "name": "tickLower",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "tickUpper",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "liquidityDelta",
                  "type": "int256",
                  "internalType": "int256"
                },
                {
                  "name": "salt",
                  "type": "bytes32",
                  "internalType": "bytes32"
                }
              ]
            },
            {
              "name": "delta",
              "type": "int256",
              "internalType": "BalanceDelta"
            },
            {
              "name": "feesAccrued",
              "type": "int256",
              "internalType": "BalanceDelta"
            },
            {
              "name": "hookData",
              "type": "bytes",
              "internalType": "bytes"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes4",
              "internalType": "bytes4"
            },
            {
              "name": "",
              "type": "int256",
              "internalType": "BalanceDelta"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "afterSwap",
          "inputs": [
            {
              "name": "sender",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "key",
              "type": "tuple",
              "internalType": "struct PoolKey",
              "components": [
                {
                  "name": "currency0",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "currency1",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "fee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "hooks",
                  "type": "address",
                  "internalType": "contract IHooks"
                }
              ]
            },
            {
              "name": "params",
              "type": "tuple",
              "internalType": "struct SwapParams",
              "components": [
                {
                  "name": "zeroForOne",
                  "type": "bool",
                  "internalType": "bool"
                },
                {
                  "name": "amountSpecified",
                  "type": "int256",
                  "internalType": "int256"
                },
                {
                  "name": "sqrtPriceLimitX96",
                  "type": "uint160",
                  "internalType": "uint160"
                }
              ]
            },
            {
              "name": "delta",
              "type": "int256",
              "internalType": "BalanceDelta"
            },
            {
              "name": "hookData",
              "type": "bytes",
              "internalType": "bytes"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes4",
              "internalType": "bytes4"
            },
            {
              "name": "",
              "type": "int128",
              "internalType": "int128"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "beforeAddLiquidity",
          "inputs": [
            {
              "name": "sender",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "key",
              "type": "tuple",
              "internalType": "struct PoolKey",
              "components": [
                {
                  "name": "currency0",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "currency1",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "fee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "hooks",
                  "type": "address",
                  "internalType": "contract IHooks"
                }
              ]
            },
            {
              "name": "params",
              "type": "tuple",
              "internalType": "struct ModifyLiquidityParams",
              "components": [
                {
                  "name": "tickLower",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "tickUpper",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "liquidityDelta",
                  "type": "int256",
                  "internalType": "int256"
                },
                {
                  "name": "salt",
                  "type": "bytes32",
                  "internalType": "bytes32"
                }
              ]
            },
            {
              "name": "hookData",
              "type": "bytes",
              "internalType": "bytes"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes4",
              "internalType": "bytes4"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "beforeDonate",
          "inputs": [
            {
              "name": "sender",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "key",
              "type": "tuple",
              "internalType": "struct PoolKey",
              "components": [
                {
                  "name": "currency0",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "currency1",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "fee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "hooks",
                  "type": "address",
                  "internalType": "contract IHooks"
                }
              ]
            },
            {
              "name": "amount0",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "amount1",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "hookData",
              "type": "bytes",
              "internalType": "bytes"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes4",
              "internalType": "bytes4"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "beforeInitialize",
          "inputs": [
            {
              "name": "sender",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "key",
              "type": "tuple",
              "internalType": "struct PoolKey",
              "components": [
                {
                  "name": "currency0",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "currency1",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "fee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "hooks",
                  "type": "address",
                  "internalType": "contract IHooks"
                }
              ]
            },
            {
              "name": "sqrtPriceX96",
              "type": "uint160",
              "internalType": "uint160"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes4",
              "internalType": "bytes4"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "beforeRemoveLiquidity",
          "inputs": [
            {
              "name": "sender",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "key",
              "type": "tuple",
              "internalType": "struct PoolKey",
              "components": [
                {
                  "name": "currency0",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "currency1",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "fee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "hooks",
                  "type": "address",
                  "internalType": "contract IHooks"
                }
              ]
            },
            {
              "name": "params",
              "type": "tuple",
              "internalType": "struct ModifyLiquidityParams",
              "components": [
                {
                  "name": "tickLower",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "tickUpper",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "liquidityDelta",
                  "type": "int256",
                  "internalType": "int256"
                },
                {
                  "name": "salt",
                  "type": "bytes32",
                  "internalType": "bytes32"
                }
              ]
            },
            {
              "name": "hookData",
              "type": "bytes",
              "internalType": "bytes"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes4",
              "internalType": "bytes4"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "beforeSwap",
          "inputs": [
            {
              "name": "sender",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "key",
              "type": "tuple",
              "internalType": "struct PoolKey",
              "components": [
                {
                  "name": "currency0",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "currency1",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "fee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "hooks",
                  "type": "address",
                  "internalType": "contract IHooks"
                }
              ]
            },
            {
              "name": "params",
              "type": "tuple",
              "internalType": "struct SwapParams",
              "components": [
                {
                  "name": "zeroForOne",
                  "type": "bool",
                  "internalType": "bool"
                },
                {
                  "name": "amountSpecified",
                  "type": "int256",
                  "internalType": "int256"
                },
                {
                  "name": "sqrtPriceLimitX96",
                  "type": "uint160",
                  "internalType": "uint160"
                }
              ]
            },
            {
              "name": "hookData",
              "type": "bytes",
              "internalType": "bytes"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes4",
              "internalType": "bytes4"
            },
            {
              "name": "",
              "type": "int256",
              "internalType": "BeforeSwapDelta"
            },
            {
              "name": "",
              "type": "uint24",
              "internalType": "uint24"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "claimReferralFees",
          "inputs": [
            {
              "name": "referrer",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "currency",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "currentFeePolicy",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "tuple",
              "internalType": "struct FeePolicySnapshot",
              "components": [
                {
                  "name": "protocolFeeRecipient",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "protocolFeeShareBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "hookFeeBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "maxInternalPriceImpactBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "referralDiscountBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "referralShareBps",
                  "type": "uint16",
                  "internalType": "uint16"
                }
              ]
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "factory",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "feeEscrow",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IFociFeeEscrow"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "feeSweepOperator",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "getHookPermissions",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "tuple",
              "internalType": "struct Hooks.Permissions",
              "components": [
                {
                  "name": "beforeInitialize",
                  "type": "bool",
                  "internalType": "bool"
                },
                {
                  "name": "afterInitialize",
                  "type": "bool",
                  "internalType": "bool"
                },
                {
                  "name": "beforeAddLiquidity",
                  "type": "bool",
                  "internalType": "bool"
                },
                {
                  "name": "afterAddLiquidity",
                  "type": "bool",
                  "internalType": "bool"
                },
                {
                  "name": "beforeRemoveLiquidity",
                  "type": "bool",
                  "internalType": "bool"
                },
                {
                  "name": "afterRemoveLiquidity",
                  "type": "bool",
                  "internalType": "bool"
                },
                {
                  "name": "beforeSwap",
                  "type": "bool",
                  "internalType": "bool"
                },
                {
                  "name": "afterSwap",
                  "type": "bool",
                  "internalType": "bool"
                },
                {
                  "name": "beforeDonate",
                  "type": "bool",
                  "internalType": "bool"
                },
                {
                  "name": "afterDonate",
                  "type": "bool",
                  "internalType": "bool"
                },
                {
                  "name": "beforeSwapReturnDelta",
                  "type": "bool",
                  "internalType": "bool"
                },
                {
                  "name": "afterSwapReturnDelta",
                  "type": "bool",
                  "internalType": "bool"
                },
                {
                  "name": "afterAddLiquidityReturnDelta",
                  "type": "bool",
                  "internalType": "bool"
                },
                {
                  "name": "afterRemoveLiquidityReturnDelta",
                  "type": "bool",
                  "internalType": "bool"
                }
              ]
            }
          ],
          "stateMutability": "pure"
        },
        {
          "type": "function",
          "name": "hookFeeBps",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "launches",
          "inputs": [
            {
              "name": "",
              "type": "bytes32",
              "internalType": "PoolId"
            }
          ],
          "outputs": [
            {
              "name": "registered",
              "type": "bool",
              "internalType": "bool"
            },
            {
              "name": "memecoinIsCurrency0",
              "type": "bool",
              "internalType": "bool"
            },
            {
              "name": "memecoin",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "quoteToken",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "creator",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "protocolFeeRecipient",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "creatorTaxBps",
              "type": "uint16",
              "internalType": "uint16"
            },
            {
              "name": "protocolFeeShareBps",
              "type": "uint16",
              "internalType": "uint16"
            },
            {
              "name": "hookFeeBps",
              "type": "uint16",
              "internalType": "uint16"
            },
            {
              "name": "maxInternalPriceImpactBps",
              "type": "uint16",
              "internalType": "uint16"
            },
            {
              "name": "referralDiscountBps",
              "type": "uint16",
              "internalType": "uint16"
            },
            {
              "name": "referralShareBps",
              "type": "uint16",
              "internalType": "uint16"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "maxInternalPriceImpactBps",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "owner",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "pendingCreatorTax",
          "inputs": [
            {
              "name": "",
              "type": "bytes32",
              "internalType": "PoolId"
            },
            {
              "name": "currency",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "pendingFees",
          "inputs": [
            {
              "name": "",
              "type": "bytes32",
              "internalType": "PoolId"
            },
            {
              "name": "currency",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "pendingOwner",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "pendingReferral",
          "inputs": [
            {
              "name": "referrer",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "currency",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "poolManager",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IPoolManager"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "protocolFeeRecipient",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "protocolFeeShareBps",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "referralDiscountBps",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "referralRegistry",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IFociReferralRegistry"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "referralShareBps",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "registerPool",
          "inputs": [
            {
              "name": "key",
              "type": "tuple",
              "internalType": "struct PoolKey",
              "components": [
                {
                  "name": "currency0",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "currency1",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "fee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "hooks",
                  "type": "address",
                  "internalType": "contract IHooks"
                }
              ]
            },
            {
              "name": "memecoin",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "creator",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "creatorTaxBps",
              "type": "uint16",
              "internalType": "uint16"
            },
            {
              "name": "policy",
              "type": "tuple",
              "internalType": "struct FeePolicySnapshot",
              "components": [
                {
                  "name": "protocolFeeRecipient",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "protocolFeeShareBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "hookFeeBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "maxInternalPriceImpactBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "referralDiscountBps",
                  "type": "uint16",
                  "internalType": "uint16"
                },
                {
                  "name": "referralShareBps",
                  "type": "uint16",
                  "internalType": "uint16"
                }
              ]
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "renounceOwnership",
          "inputs": [],
          "outputs": [],
          "stateMutability": "pure"
        },
        {
          "type": "function",
          "name": "rescuePoolFees",
          "inputs": [
            {
              "name": "poolId",
              "type": "bytes32",
              "internalType": "PoolId"
            }
          ],
          "outputs": [
            {
              "name": "protocolAmount",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "creatorAmount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setCreatorFeeRecipient",
          "inputs": [
            {
              "name": "poolId",
              "type": "bytes32",
              "internalType": "PoolId"
            },
            {
              "name": "newRecipient",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setFactory",
          "inputs": [
            {
              "name": "factory_",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setFeeSweepOperator",
          "inputs": [
            {
              "name": "operator",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setHookFeeBps",
          "inputs": [
            {
              "name": "bps",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setMaxInternalPriceImpactBps",
          "inputs": [
            {
              "name": "bps",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setProtocolFeeRecipient",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setProtocolFeeShareBps",
          "inputs": [
            {
              "name": "bps",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setReferralDiscountBps",
          "inputs": [
            {
              "name": "bps",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setReferralRegistry",
          "inputs": [
            {
              "name": "registry",
              "type": "address",
              "internalType": "contract IFociReferralRegistry"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setReferralShareBps",
          "inputs": [
            {
              "name": "bps",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "sweepPoolFees",
          "inputs": [
            {
              "name": "poolId",
              "type": "bytes32",
              "internalType": "PoolId"
            },
            {
              "name": "minConversionQuoteOut",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "transferOwnership",
          "inputs": [
            {
              "name": "newOwner",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "unlockCallback",
          "inputs": [
            {
              "name": "data",
              "type": "bytes",
              "internalType": "bytes"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes",
              "internalType": "bytes"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "event",
          "name": "CreatorFeeRecipientUpdated",
          "inputs": [
            {
              "name": "poolId",
              "type": "bytes32",
              "indexed": true,
              "internalType": "PoolId"
            },
            {
              "name": "previousRecipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "newRecipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "FactorySet",
          "inputs": [
            {
              "name": "factory",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "FeeSweepOperatorUpdated",
          "inputs": [
            {
              "name": "operator",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "HookFeeBpsUpdated",
          "inputs": [
            {
              "name": "bps",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "HookFeeCollected",
          "inputs": [
            {
              "name": "poolId",
              "type": "bytes32",
              "indexed": true,
              "internalType": "PoolId"
            },
            {
              "name": "currency",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            },
            {
              "name": "feeAmount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "taxAmount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "MaxInternalPriceImpactUpdated",
          "inputs": [
            {
              "name": "bps",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "OwnershipTransferStarted",
          "inputs": [
            {
              "name": "previousOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "newOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "OwnershipTransferred",
          "inputs": [
            {
              "name": "previousOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "newOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "PoolConversionSkipped",
          "inputs": [
            {
              "name": "poolId",
              "type": "bytes32",
              "indexed": true,
              "internalType": "PoolId"
            },
            {
              "name": "retainedMemecoin",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "PoolFeesRescued",
          "inputs": [
            {
              "name": "poolId",
              "type": "bytes32",
              "indexed": true,
              "internalType": "PoolId"
            },
            {
              "name": "quoteToken",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "protocolAmount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "creatorAmount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "PoolFeesSwept",
          "inputs": [
            {
              "name": "poolId",
              "type": "bytes32",
              "indexed": true,
              "internalType": "PoolId"
            },
            {
              "name": "protocolAmount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "creatorAmount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "PoolRegistered",
          "inputs": [
            {
              "name": "poolId",
              "type": "bytes32",
              "indexed": true,
              "internalType": "PoolId"
            },
            {
              "name": "memecoin",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            },
            {
              "name": "quoteToken",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            },
            {
              "name": "creator",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "ProtocolFeeRecipientUpdated",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "ProtocolFeeShareUpdated",
          "inputs": [
            {
              "name": "bps",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "ReferralDiscountUpdated",
          "inputs": [
            {
              "name": "bps",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "ReferralFeeAccrued",
          "inputs": [
            {
              "name": "poolId",
              "type": "bytes32",
              "indexed": true,
              "internalType": "PoolId"
            },
            {
              "name": "referrer",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "currency",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "ReferralFeeClaimed",
          "inputs": [
            {
              "name": "referrer",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "currency",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "ReferralRegistrySet",
          "inputs": [
            {
              "name": "registry",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "ReferralShareUpdated",
          "inputs": [
            {
              "name": "bps",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "error",
          "name": "AlreadyRegistered",
          "inputs": []
        },
        {
          "type": "error",
          "name": "AlreadySet",
          "inputs": []
        },
        {
          "type": "error",
          "name": "HookNotImplemented",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InexactQuoteTransfer",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "expected",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "received",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "InternalSwapRequiresOperator",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InvalidBps",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InvalidPoolKey",
          "inputs": []
        },
        {
          "type": "error",
          "name": "MinimumOutputRequired",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotFactory",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotFeeSweepOperator",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotPoolManager",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NothingToRescue",
          "inputs": []
        },
        {
          "type": "error",
          "name": "OwnableInvalidOwner",
          "inputs": [
            {
              "name": "owner",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "OwnableUnauthorizedAccount",
          "inputs": [
            {
              "name": "account",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "OwnershipCannotBeRenounced",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ReentrancyGuardReentrantCall",
          "inputs": []
        },
        {
          "type": "error",
          "name": "SafeCastOverflowedIntToUint",
          "inputs": [
            {
              "name": "value",
              "type": "int256",
              "internalType": "int256"
            }
          ]
        },
        {
          "type": "error",
          "name": "SafeCastOverflowedUintToInt",
          "inputs": [
            {
              "name": "value",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "SafeERC20FailedOperation",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "SlippageExceeded",
          "inputs": [
            {
              "name": "actual",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "minimum",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "UnknownPool",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ZeroAddress",
          "inputs": []
        }
      ]
    },
    {
      "name": "FociFeeEscrow",
      "kind": "singleton",
      "address": "0x5a76a44B49ca0f7c4dB181f289C1eCA91d928406",
      "abi": [
        {
          "type": "function",
          "name": "balanceOf",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "balanceOfToken",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "claim",
          "inputs": [
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "claim",
          "inputs": [],
          "outputs": [
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "claimToken",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "claimToken",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "credit",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "payable"
        },
        {
          "type": "function",
          "name": "creditToken",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "event",
          "name": "Claimed",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "ClaimedToken",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "Credited",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "depositor",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "CreditedToken",
          "inputs": [
            {
              "name": "recipient",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "depositor",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "error",
          "name": "InsufficientBalance",
          "inputs": [
            {
              "name": "requested",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "available",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "NoBalance",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ReentrancyGuardReentrantCall",
          "inputs": []
        },
        {
          "type": "error",
          "name": "SafeERC20FailedOperation",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "TransferFailed",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ZeroAddress",
          "inputs": []
        }
      ]
    },
    {
      "name": "FociReferralRegistry",
      "kind": "singleton",
      "address": "0xe047D0F0ce0dD600732793762B1f1929Adc5015d",
      "abi": [
        {
          "type": "constructor",
          "inputs": [
            {
              "name": "factory_",
              "type": "address",
              "internalType": "contract IFociLaunchFactory"
            },
            {
              "name": "memeHook_",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "bindFor",
          "inputs": [
            {
              "name": "user",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "referrer",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "factory",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IFociLaunchFactory"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "memeHook",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "referrerOf",
          "inputs": [
            {
              "name": "user",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "referrer",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "setReferrer",
          "inputs": [
            {
              "name": "referrer",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "event",
          "name": "ReferrerBound",
          "inputs": [
            {
              "name": "user",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "referrer",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "boundBy",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "error",
          "name": "AlreadyReferred",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotAuthorizedBinder",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ReciprocalReferral",
          "inputs": []
        },
        {
          "type": "error",
          "name": "SelfReferral",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ZeroAddress",
          "inputs": []
        }
      ]
    },
    {
      "name": "FociLaunchLocker",
      "kind": "singleton",
      "address": "0x539fD9e6a6316B65bEd9dDb9A570959e0bc8C31A",
      "abi": [
        {
          "type": "constructor",
          "inputs": [
            {
              "name": "initialOwner",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "positionManager_",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "acceptOwnership",
          "inputs": [],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "factory",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "isLocked",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "lockPosition",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "tokenId",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "lockTokenSupply",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "lockedPositions",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "tokenId",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "lockedTokenSupply",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "onERC721Received",
          "inputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "",
              "type": "bytes",
              "internalType": "bytes"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes4",
              "internalType": "bytes4"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "owner",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "pendingOwner",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "positionManager",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "renounceOwnership",
          "inputs": [],
          "outputs": [],
          "stateMutability": "pure"
        },
        {
          "type": "function",
          "name": "setFactory",
          "inputs": [
            {
              "name": "factory_",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "transferOwnership",
          "inputs": [
            {
              "name": "newOwner",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "event",
          "name": "FactorySet",
          "inputs": [
            {
              "name": "factory",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "OwnershipTransferStarted",
          "inputs": [
            {
              "name": "previousOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "newOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "OwnershipTransferred",
          "inputs": [
            {
              "name": "previousOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "newOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "PositionLocked",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "tokenId",
              "type": "uint256",
              "indexed": true,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "TokenSupplyLocked",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "error",
          "name": "AlreadyInitialized",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotFactory",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotPositionManager",
          "inputs": []
        },
        {
          "type": "error",
          "name": "OwnableInvalidOwner",
          "inputs": [
            {
              "name": "owner",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "OwnableUnauthorizedAccount",
          "inputs": [
            {
              "name": "account",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "OwnershipCannotBeRenounced",
          "inputs": []
        },
        {
          "type": "error",
          "name": "PositionAlreadyLocked",
          "inputs": []
        },
        {
          "type": "error",
          "name": "PositionNotHeld",
          "inputs": []
        },
        {
          "type": "error",
          "name": "SafeERC20FailedOperation",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "ZeroAddress",
          "inputs": []
        }
      ]
    },
    {
      "name": "FociLaunchDeployer",
      "kind": "singleton",
      "address": "0xa93f9CeFD92A77e1EAffa3246B6F4DB91a5c5659",
      "abi": [
        {
          "type": "constructor",
          "inputs": [
            {
              "name": "factory_",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "referralRegistry_",
              "type": "address",
              "internalType": "contract IFociReferralRegistry"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "deployLaunch",
          "inputs": [
            {
              "name": "params",
              "type": "tuple",
              "internalType": "struct LaunchDeployment",
              "components": [
                {
                  "name": "pairToken",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "creatorFeeRecipient",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "originalDeployer",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "feePolicy",
                  "type": "address",
                  "internalType": "contract IFociFeePolicy"
                },
                {
                  "name": "policy",
                  "type": "tuple",
                  "internalType": "struct FeePolicySnapshot",
                  "components": [
                    {
                      "name": "protocolFeeRecipient",
                      "type": "address",
                      "internalType": "address"
                    },
                    {
                      "name": "protocolFeeShareBps",
                      "type": "uint16",
                      "internalType": "uint16"
                    },
                    {
                      "name": "hookFeeBps",
                      "type": "uint16",
                      "internalType": "uint16"
                    },
                    {
                      "name": "maxInternalPriceImpactBps",
                      "type": "uint16",
                      "internalType": "uint16"
                    },
                    {
                      "name": "referralDiscountBps",
                      "type": "uint16",
                      "internalType": "uint16"
                    },
                    {
                      "name": "referralShareBps",
                      "type": "uint16",
                      "internalType": "uint16"
                    }
                  ]
                },
                {
                  "name": "feeEscrow",
                  "type": "address",
                  "internalType": "contract IFociFeeEscrow"
                },
                {
                  "name": "phantomQuote",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "curveFeeBps",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "creatorTaxBps",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "graduationThreshold",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "supply",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "salt",
                  "type": "bytes32",
                  "internalType": "bytes32"
                },
                {
                  "name": "name",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "symbol",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "logo",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "description",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "socials",
                  "type": "tuple",
                  "internalType": "struct FociLauncherToken.Socials",
                  "components": [
                    {
                      "name": "twitter",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "telegram",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "discord",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "website",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "farcaster",
                      "type": "string",
                      "internalType": "string"
                    }
                  ]
                }
              ]
            }
          ],
          "outputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "curve",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "factory",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "predictLaunchAddresses",
          "inputs": [
            {
              "name": "params",
              "type": "tuple",
              "internalType": "struct LaunchDeployment",
              "components": [
                {
                  "name": "pairToken",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "creatorFeeRecipient",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "originalDeployer",
                  "type": "address",
                  "internalType": "address"
                },
                {
                  "name": "feePolicy",
                  "type": "address",
                  "internalType": "contract IFociFeePolicy"
                },
                {
                  "name": "policy",
                  "type": "tuple",
                  "internalType": "struct FeePolicySnapshot",
                  "components": [
                    {
                      "name": "protocolFeeRecipient",
                      "type": "address",
                      "internalType": "address"
                    },
                    {
                      "name": "protocolFeeShareBps",
                      "type": "uint16",
                      "internalType": "uint16"
                    },
                    {
                      "name": "hookFeeBps",
                      "type": "uint16",
                      "internalType": "uint16"
                    },
                    {
                      "name": "maxInternalPriceImpactBps",
                      "type": "uint16",
                      "internalType": "uint16"
                    },
                    {
                      "name": "referralDiscountBps",
                      "type": "uint16",
                      "internalType": "uint16"
                    },
                    {
                      "name": "referralShareBps",
                      "type": "uint16",
                      "internalType": "uint16"
                    }
                  ]
                },
                {
                  "name": "feeEscrow",
                  "type": "address",
                  "internalType": "contract IFociFeeEscrow"
                },
                {
                  "name": "phantomQuote",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "curveFeeBps",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "creatorTaxBps",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "graduationThreshold",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "supply",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "salt",
                  "type": "bytes32",
                  "internalType": "bytes32"
                },
                {
                  "name": "name",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "symbol",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "logo",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "description",
                  "type": "string",
                  "internalType": "string"
                },
                {
                  "name": "socials",
                  "type": "tuple",
                  "internalType": "struct FociLauncherToken.Socials",
                  "components": [
                    {
                      "name": "twitter",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "telegram",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "discord",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "website",
                      "type": "string",
                      "internalType": "string"
                    },
                    {
                      "name": "farcaster",
                      "type": "string",
                      "internalType": "string"
                    }
                  ]
                }
              ]
            }
          ],
          "outputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "curve",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "referralRegistry",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IFociReferralRegistry"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "error",
          "name": "Create2EmptyBytecode",
          "inputs": []
        },
        {
          "type": "error",
          "name": "FailedDeployment",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InsufficientBalance",
          "inputs": [
            {
              "name": "balance",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "needed",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "MetadataTooLong",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotFactory",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ZeroAddress",
          "inputs": []
        }
      ]
    },
    {
      "name": "FociGraduationExecutor",
      "kind": "singleton",
      "address": "0xEB286974C35d2741B0fe9b2a1Cd41E53d06aE406",
      "abi": [
        {
          "type": "constructor",
          "inputs": [
            {
              "name": "positionManager_",
              "type": "address",
              "internalType": "contract IPositionManager"
            },
            {
              "name": "permit2_",
              "type": "address",
              "internalType": "contract IAllowanceTransfer"
            },
            {
              "name": "locker_",
              "type": "address",
              "internalType": "contract FociLaunchLocker"
            },
            {
              "name": "factory_",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "receive",
          "stateMutability": "payable"
        },
        {
          "type": "function",
          "name": "factory",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "locker",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract FociLaunchLocker"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "mintFullRangePosition",
          "inputs": [
            {
              "name": "launchToken",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "key",
              "type": "tuple",
              "internalType": "struct PoolKey",
              "components": [
                {
                  "name": "currency0",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "currency1",
                  "type": "address",
                  "internalType": "Currency"
                },
                {
                  "name": "fee",
                  "type": "uint24",
                  "internalType": "uint24"
                },
                {
                  "name": "tickSpacing",
                  "type": "int24",
                  "internalType": "int24"
                },
                {
                  "name": "hooks",
                  "type": "address",
                  "internalType": "contract IHooks"
                }
              ]
            },
            {
              "name": "tickLower",
              "type": "int24",
              "internalType": "int24"
            },
            {
              "name": "tickUpper",
              "type": "int24",
              "internalType": "int24"
            },
            {
              "name": "sqrtPriceX96",
              "type": "uint160",
              "internalType": "uint160"
            },
            {
              "name": "amount0Max",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "amount1Max",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "currency0",
              "type": "address",
              "internalType": "Currency"
            },
            {
              "name": "currency1",
              "type": "address",
              "internalType": "Currency"
            },
            {
              "name": "protocolFeeRecipient",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "payable"
        },
        {
          "type": "function",
          "name": "permit2",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IAllowanceTransfer"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "positionManager",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IPositionManager"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "event",
          "name": "GraduationDustRetained",
          "inputs": [
            {
              "name": "launchToken",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "currency",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "GraduationDustSwept",
          "inputs": [
            {
              "name": "launchToken",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "currency",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "error",
          "name": "FeeTransferFailed",
          "inputs": []
        },
        {
          "type": "error",
          "name": "MintAmountOverflow",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotFactory",
          "inputs": []
        },
        {
          "type": "error",
          "name": "SafeERC20FailedOperation",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "SlippageExceeded",
          "inputs": [
            {
              "name": "actual",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "minimum",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "ZeroAddress",
          "inputs": []
        }
      ]
    },
    {
      "name": "FociRewardsDistributorFactory",
      "kind": "singleton",
      "address": "0xdac447110867954F00638125bbd5c66D8E0a7195",
      "abi": [
        {
          "type": "constructor",
          "inputs": [
            {
              "name": "escrow_",
              "type": "address",
              "internalType": "contract IFociFeeEscrow"
            },
            {
              "name": "launchFactory_",
              "type": "address",
              "internalType": "contract IFociLaunchFactory"
            },
            {
              "name": "distributorOwner_",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "deploy",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "salt",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "outputs": [
            {
              "name": "distributor",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "distributorOf",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "distributorOwner",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "escrow",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IFociFeeEscrow"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "initCodeHash",
          "inputs": [
            {
              "name": "pairToken",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "launchFactory",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IFociLaunchFactory"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "predict",
          "inputs": [
            {
              "name": "creator",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "salt",
              "type": "bytes32",
              "internalType": "bytes32"
            },
            {
              "name": "pairToken",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "tokenOf",
          "inputs": [
            {
              "name": "distributor",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "event",
          "name": "DistributorDeployed",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "distributor",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "creator",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "pairToken",
              "type": "address",
              "indexed": false,
              "internalType": "address"
            },
            {
              "name": "salt",
              "type": "bytes32",
              "indexed": false,
              "internalType": "bytes32"
            }
          ],
          "anonymous": false
        },
        {
          "type": "error",
          "name": "AlreadyRegistered",
          "inputs": []
        },
        {
          "type": "error",
          "name": "Create2EmptyBytecode",
          "inputs": []
        },
        {
          "type": "error",
          "name": "FailedDeployment",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InsufficientBalance",
          "inputs": [
            {
              "name": "balance",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "needed",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "NativeQuoteUnsupported",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NotCreatorFeeRecipient",
          "inputs": [
            {
              "name": "expected",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "actual",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "TokenNotFound",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ZeroAddress",
          "inputs": []
        }
      ]
    },
    {
      "name": "FociRewardsDistributor",
      "kind": "perLaunch",
      "abi": [
        {
          "type": "constructor",
          "inputs": [
            {
              "name": "quoteToken_",
              "type": "address",
              "internalType": "contract IERC20"
            },
            {
              "name": "escrow_",
              "type": "address",
              "internalType": "contract IFociFeeEscrow"
            },
            {
              "name": "owner_",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "CLAIM_WINDOW",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint64",
              "internalType": "uint64"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "acceptOwnership",
          "inputs": [],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "batchClaim",
          "inputs": [
            {
              "name": "epochIds",
              "type": "uint256[]",
              "internalType": "uint256[]"
            },
            {
              "name": "account",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "amounts",
              "type": "uint256[]",
              "internalType": "uint256[]"
            },
            {
              "name": "indexes",
              "type": "uint256[]",
              "internalType": "uint256[]"
            },
            {
              "name": "proofs",
              "type": "bytes32[][]",
              "internalType": "bytes32[][]"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "claim",
          "inputs": [
            {
              "name": "epochId",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "account",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "index",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "proof",
              "type": "bytes32[]",
              "internalType": "bytes32[]"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "epochCount",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "escrow",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IFociFeeEscrow"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "getEpoch",
          "inputs": [
            {
              "name": "epochId",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "tuple",
              "internalType": "struct FociRewardsDistributor.Epoch",
              "components": [
                {
                  "name": "merkleRoot",
                  "type": "bytes32",
                  "internalType": "bytes32"
                },
                {
                  "name": "total",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "claimed",
                  "type": "uint256",
                  "internalType": "uint256"
                },
                {
                  "name": "publishedAt",
                  "type": "uint64",
                  "internalType": "uint64"
                },
                {
                  "name": "rolledOver",
                  "type": "bool",
                  "internalType": "bool"
                }
              ]
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "harvest",
          "inputs": [],
          "outputs": [
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "hasClaimed",
          "inputs": [
            {
              "name": "epochId",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "account",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "isExcluded",
          "inputs": [
            {
              "name": "account",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "leafFor",
          "inputs": [
            {
              "name": "index",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "account",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "bytes32",
              "internalType": "bytes32"
            }
          ],
          "stateMutability": "pure"
        },
        {
          "type": "function",
          "name": "outstanding",
          "inputs": [
            {
              "name": "epochId",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "owner",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "pendingOwner",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "address"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "publishEpoch",
          "inputs": [
            {
              "name": "merkleRoot",
              "type": "bytes32",
              "internalType": "bytes32"
            },
            {
              "name": "total",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [
            {
              "name": "epochId",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "quoteToken",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "address",
              "internalType": "contract IERC20"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "function",
          "name": "renounceOwnership",
          "inputs": [],
          "outputs": [],
          "stateMutability": "pure"
        },
        {
          "type": "function",
          "name": "rollOver",
          "inputs": [
            {
              "name": "epochId",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "outputs": [
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setExcluded",
          "inputs": [
            {
              "name": "account",
              "type": "address",
              "internalType": "address"
            },
            {
              "name": "excluded",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "setExcludedBatch",
          "inputs": [
            {
              "name": "accounts",
              "type": "address[]",
              "internalType": "address[]"
            },
            {
              "name": "excluded",
              "type": "bool",
              "internalType": "bool"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "transferOwnership",
          "inputs": [
            {
              "name": "newOwner",
              "type": "address",
              "internalType": "address"
            }
          ],
          "outputs": [],
          "stateMutability": "nonpayable"
        },
        {
          "type": "function",
          "name": "unallocated",
          "inputs": [],
          "outputs": [
            {
              "name": "",
              "type": "uint256",
              "internalType": "uint256"
            }
          ],
          "stateMutability": "view"
        },
        {
          "type": "event",
          "name": "Claimed",
          "inputs": [
            {
              "name": "epochId",
              "type": "uint256",
              "indexed": true,
              "internalType": "uint256"
            },
            {
              "name": "account",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "EpochPublished",
          "inputs": [
            {
              "name": "epochId",
              "type": "uint256",
              "indexed": true,
              "internalType": "uint256"
            },
            {
              "name": "merkleRoot",
              "type": "bytes32",
              "indexed": false,
              "internalType": "bytes32"
            },
            {
              "name": "total",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "expiresAt",
              "type": "uint64",
              "indexed": false,
              "internalType": "uint64"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "ExclusionUpdated",
          "inputs": [
            {
              "name": "account",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "excluded",
              "type": "bool",
              "indexed": false,
              "internalType": "bool"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "Harvested",
          "inputs": [
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            },
            {
              "name": "unallocated",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "OwnershipTransferStarted",
          "inputs": [
            {
              "name": "previousOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "newOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "OwnershipTransferred",
          "inputs": [
            {
              "name": "previousOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            },
            {
              "name": "newOwner",
              "type": "address",
              "indexed": true,
              "internalType": "address"
            }
          ],
          "anonymous": false
        },
        {
          "type": "event",
          "name": "RolledOver",
          "inputs": [
            {
              "name": "epochId",
              "type": "uint256",
              "indexed": true,
              "internalType": "uint256"
            },
            {
              "name": "amount",
              "type": "uint256",
              "indexed": false,
              "internalType": "uint256"
            }
          ],
          "anonymous": false
        },
        {
          "type": "error",
          "name": "AlreadyClaimed",
          "inputs": []
        },
        {
          "type": "error",
          "name": "AlreadyRolledOver",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ClaimWindowClosed",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ClaimWindowOpen",
          "inputs": []
        },
        {
          "type": "error",
          "name": "EpochOverdrawn",
          "inputs": [
            {
              "name": "total",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "claimed",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "amount",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "ExcludedAccount",
          "inputs": []
        },
        {
          "type": "error",
          "name": "InsufficientUnallocated",
          "inputs": [
            {
              "name": "requested",
              "type": "uint256",
              "internalType": "uint256"
            },
            {
              "name": "available",
              "type": "uint256",
              "internalType": "uint256"
            }
          ]
        },
        {
          "type": "error",
          "name": "InvalidProof",
          "inputs": []
        },
        {
          "type": "error",
          "name": "LengthMismatch",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NoEpoch",
          "inputs": []
        },
        {
          "type": "error",
          "name": "NothingToHarvest",
          "inputs": []
        },
        {
          "type": "error",
          "name": "OwnableInvalidOwner",
          "inputs": [
            {
              "name": "owner",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "OwnableUnauthorizedAccount",
          "inputs": [
            {
              "name": "account",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "OwnershipCannotBeRenounced",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ReentrancyGuardReentrantCall",
          "inputs": []
        },
        {
          "type": "error",
          "name": "SafeERC20FailedOperation",
          "inputs": [
            {
              "name": "token",
              "type": "address",
              "internalType": "address"
            }
          ]
        },
        {
          "type": "error",
          "name": "ZeroAddress",
          "inputs": []
        },
        {
          "type": "error",
          "name": "ZeroAmount",
          "inputs": []
        }
      ]
    }
  ],
  "externals": [
    {
      "key": "poolManager",
      "address": "0x8366a39CC670B4001A1121B8F6A443A643e40951",
      "note": "Uniswap V4 PoolManager"
    },
    {
      "key": "positionManager",
      "address": "0x6049c9a0e26405c0985f9e3685c87d0ae917f82b",
      "note": "Uniswap V4 PositionManager"
    },
    {
      "key": "universalRouter",
      "address": "0x4fcA4a51Ab4F23A7447b3284fBd7D73289A89Fb1",
      "note": "Uniswap UniversalRouter — pool swaps"
    },
    {
      "key": "v4Quoter",
      "address": "0x8Dc178eFB8111BB0973Dd9d722ebeFF267c98F94",
      "note": "Uniswap V4 Quoter — pool-phase estimates"
    },
    {
      "key": "stateView",
      "address": "0xF3334192D15450CdD385c8B70e03f9A6bD9E673b",
      "note": "Uniswap V4 StateView — pool state reads"
    },
    {
      "key": "permit2",
      "address": "0x000000000022D473030F116dDEE9F6B43aC78BA3",
      "note": "Permit2 — required for UniversalRouter"
    },
    {
      "key": "usdc",
      "address": "0x3600000000000000000000000000000000000000",
      "note": "Quote asset (6 decimals)"
    }
  ]
}
