[
  {
    "type": "function",
    "name": "buy",
    "inputs": [
      {
        "name": "to",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "token",
        "type": "address",
        "internalType": "address"
      }
    ],
    "outputs": [
      {
        "name": "amountOut",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "calculateFeeAmount",
    "inputs": [
      {
        "name": "amount",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "outputs": [
      {
        "name": "feeAmount",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "config",
    "inputs": [],
    "outputs": [
      {
        "name": "virtualMonReserve",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "virtualTokenReserve",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "targetTokenAmount",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "create",
    "inputs": [
      {
        "name": "params",
        "type": "tuple",
        "internalType": "struct IBondingCurve.TokenCreationParams",
        "components": [
          {
            "name": "creator",
            "type": "address",
            "internalType": "address"
          },
          {
            "name": "name",
            "type": "string",
            "internalType": "string"
          },
          {
            "name": "symbol",
            "type": "string",
            "internalType": "string"
          },
          {
            "name": "tokenURI",
            "type": "string",
            "internalType": "string"
          },
          {
            "name": "salt",
            "type": "bytes32",
            "internalType": "bytes32"
          },
          {
            "name": "actionId",
            "type": "uint8",
            "internalType": "uint8"
          }
        ]
      }
    ],
    "outputs": [
      {
        "name": "token",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "pool",
        "type": "address",
        "internalType": "address"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "createdAt",
    "inputs": [
      {
        "name": "token",
        "type": "address",
        "internalType": "address"
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "curves",
    "inputs": [
      {
        "name": "token",
        "type": "address",
        "internalType": "address"
      }
    ],
    "outputs": [
      {
        "name": "realMonReserve",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "realTokenReserve",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "virtualMonReserve",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "virtualTokenReserve",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "k",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "targetTokenAmount",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "initVirtualMonReserve",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "initVirtualTokenReserve",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "feeConfig",
    "inputs": [],
    "outputs": [
      {
        "name": "deployFeeAmount",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "graduateFeeAmount",
        "type": "uint256",
        "internalType": "uint256"
      },
      {
        "name": "protocolFee",
        "type": "uint24",
        "internalType": "uint24"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "foundationTreasury",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "address",
        "internalType": "address"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "graduate",
    "inputs": [
      {
        "name": "token",
        "type": "address",
        "internalType": "address"
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "isGraduated",
    "inputs": [
      {
        "name": "token",
        "type": "address",
        "internalType": "address"
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "bool",
        "internalType": "bool"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "isLocked",
    "inputs": [
      {
        "name": "token",
        "type": "address",
        "internalType": "address"
      }
    ],
    "outputs": [
      {
        "name": "",
        "type": "bool",
        "internalType": "bool"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "sell",
    "inputs": [
      {
        "name": "to",
        "type": "address",
        "internalType": "address"
      },
      {
        "name": "token",
        "type": "address",
        "internalType": "address"
      }
    ],
    "outputs": [
      {
        "name": "amountOut",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "setConfig",
    "inputs": [
      {
        "name": "params",
        "type": "tuple",
        "internalType": "struct IBondingCurve.SetConfigParams",
        "components": [
          {
            "name": "config",
            "type": "tuple",
            "internalType": "struct IBondingCurve.Config",
            "components": [
              {
                "name": "virtualMonReserve",
                "type": "uint256",
                "internalType": "uint256"
              },
              {
                "name": "virtualTokenReserve",
                "type": "uint256",
                "internalType": "uint256"
              },
              {
                "name": "targetTokenAmount",
                "type": "uint256",
                "internalType": "uint256"
              }
            ]
          },
          {
            "name": "feeConfig",
            "type": "tuple",
            "internalType": "struct IBondingCurve.FeeConfig",
            "components": [
              {
                "name": "deployFeeAmount",
                "type": "uint256",
                "internalType": "uint256"
              },
              {
                "name": "graduateFeeAmount",
                "type": "uint256",
                "internalType": "uint256"
              },
              {
                "name": "protocolFee",
                "type": "uint24",
                "internalType": "uint24"
              }
            ]
          },
          {
            "name": "antiSnipingConfig",
            "type": "tuple",
            "internalType": "struct IBondingCurve.AntiSnipingConfig",
            "components": [
              {
                "name": "maxPenaltyBlocks",
                "type": "uint256",
                "internalType": "uint256"
              },
              {
                "name": "penaltyBlocks",
                "type": "uint256[]",
                "internalType": "uint256[]"
              },
              {
                "name": "penaltyRates",
                "type": "uint256[]",
                "internalType": "uint256[]"
              }
            ]
          }
        ]
      }
    ],
    "outputs": [],
    "stateMutability": "nonpayable"
  },
  {
    "type": "function",
    "name": "wMon",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "address",
        "internalType": "address"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "function",
    "name": "wMonReserve",
    "inputs": [],
    "outputs": [
      {
        "name": "",
        "type": "uint256",
        "internalType": "uint256"
      }
    ],
    "stateMutability": "view"
  },
  {
    "type": "event",
    "name": "CurveBuy",
    "inputs": [
      {
        "name": "sender",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "token",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "amountIn",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      },
      {
        "name": "amountOut",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "CurveCreate",
    "inputs": [
      {
        "name": "creator",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "token",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "pool",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "name",
        "type": "string",
        "indexed": false,
        "internalType": "string"
      },
      {
        "name": "symbol",
        "type": "string",
        "indexed": false,
        "internalType": "string"
      },
      {
        "name": "tokenURI",
        "type": "string",
        "indexed": false,
        "internalType": "string"
      },
      {
        "name": "virtualMon",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      },
      {
        "name": "virtualToken",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      },
      {
        "name": "targetTokenAmount",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "CurveGraduate",
    "inputs": [
      {
        "name": "token",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "pool",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "CurveSell",
    "inputs": [
      {
        "name": "sender",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "token",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "amountIn",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      },
      {
        "name": "amountOut",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "CurveSync",
    "inputs": [
      {
        "name": "token",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      },
      {
        "name": "realMonReserve",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      },
      {
        "name": "realTokenReserve",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      },
      {
        "name": "virtualMonReserve",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      },
      {
        "name": "virtualTokenReserve",
        "type": "uint256",
        "indexed": false,
        "internalType": "uint256"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "CurveTokenLocked",
    "inputs": [
      {
        "name": "token",
        "type": "address",
        "indexed": true,
        "internalType": "address"
      }
    ],
    "anonymous": false
  },
  {
    "type": "event",
    "name": "SetConfig",
    "inputs": [
      {
        "name": "params",
        "type": "tuple",
        "indexed": false,
        "internalType": "struct IBondingCurve.SetConfigParams",
        "components": [
          {
            "name": "config",
            "type": "tuple",
            "internalType": "struct IBondingCurve.Config",
            "components": [
              {
                "name": "virtualMonReserve",
                "type": "uint256",
                "internalType": "uint256"
              },
              {
                "name": "virtualTokenReserve",
                "type": "uint256",
                "internalType": "uint256"
              },
              {
                "name": "targetTokenAmount",
                "type": "uint256",
                "internalType": "uint256"
              }
            ]
          },
          {
            "name": "feeConfig",
            "type": "tuple",
            "internalType": "struct IBondingCurve.FeeConfig",
            "components": [
              {
                "name": "deployFeeAmount",
                "type": "uint256",
                "internalType": "uint256"
              },
              {
                "name": "graduateFeeAmount",
                "type": "uint256",
                "internalType": "uint256"
              },
              {
                "name": "protocolFee",
                "type": "uint24",
                "internalType": "uint24"
              }
            ]
          },
          {
            "name": "antiSnipingConfig",
            "type": "tuple",
            "internalType": "struct IBondingCurve.AntiSnipingConfig",
            "components": [
              {
                "name": "maxPenaltyBlocks",
                "type": "uint256",
                "internalType": "uint256"
              },
              {
                "name": "penaltyBlocks",
                "type": "uint256[]",
                "internalType": "uint256[]"
              },
              {
                "name": "penaltyRates",
                "type": "uint256[]",
                "internalType": "uint256[]"
              }
            ]
          }
        ]
      }
    ],
    "anonymous": false
  },
  {
    "type": "error",
    "name": "AlreadyGraduated",
    "inputs": []
  },
  {
    "type": "error",
    "name": "AlreadySet",
    "inputs": []
  },
  {
    "type": "error",
    "name": "BondingCurveLocked",
    "inputs": []
  },
  {
    "type": "error",
    "name": "BondingCurveNotLocked",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InsufficientAmount",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InsufficientFee",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InsufficientWMon",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidAmountIn",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidAntiSnipingConfig",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidFeeConfig",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidKValue",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidName",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidPenaltyRate",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidSymbol",
    "inputs": []
  },
  {
    "type": "error",
    "name": "InvalidToken",
    "inputs": []
  },
  {
    "type": "error",
    "name": "OverFlow",
    "inputs": []
  },
  {
    "type": "error",
    "name": "TargetAmountOverflow",
    "inputs": []
  },
  {
    "type": "error",
    "name": "Unauthorized",
    "inputs": []
  },
  {
    "type": "error",
    "name": "ZeroAddress",
    "inputs": []
  }
]
