{
  "version": "3.0.0",
  "name": "spl_token_swap",
  "instructions": [
    {
      "name": "initialize",
      "accounts": [
        {
          "name": "swap",
          "isMut": true,
          "isSigner": true
        },
        {
          "name": "authority",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenA",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenB",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "pool",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "fee",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "destination",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "fees",
          "type": {
            "defined": "Fees"
          }
        },
        {
          "name": "swapCurve",
          "type": {
            "defined": "SwapCurve"
          }
        }
      ]
    },
    {
      "name": "swap",
      "accounts": [
        {
          "name": "swap",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "authority",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "userTransferAuthority",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "source",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "swapSource",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "swapDestination",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "destination",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "poolMint",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "poolFee",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "amountIn",
          "type": "u64"
        },
        {
          "name": "minimumAmountOut",
          "type": "u64"
        }
      ]
    },
    {
      "name": "depositAllTokenTypes",
      "accounts": [
        {
          "name": "swap",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "authority",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "userTransferAuthority",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "depositTokenA",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "depositTokenB",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "swapTokenA",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "swapTokenB",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "poolMint",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "destination",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "poolTokenAmount",
          "type": "u64"
        },
        {
          "name": "maximumTokenAAmount",
          "type": "u64"
        },
        {
          "name": "maximumTokenBAmount",
          "type": "u64"
        }
      ]
    },
    {
      "name": "withdrawAllTokenTypes",
      "accounts": [
        {
          "name": "swap",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "authority",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "userTransferAuthority",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "poolMint",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "source",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "swapTokenA",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "swapTokenB",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "destinationTokenA",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "destinationTokenB",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "feeAccount",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "poolTokenAmount",
          "type": "u64"
        },
        {
          "name": "minimumTokenAAmount",
          "type": "u64"
        },
        {
          "name": "minimumTokenBAmount",
          "type": "u64"
        }
      ]
    },
    {
      "name": "depositSingleTokenTypeExactAmountIn",
      "accounts": [
        {
          "name": "swap",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "authority",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "userTransferAuthority",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "sourceToken",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "swapTokenA",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "swapTokenB",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "poolMint",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "destination",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "sourceTokenAmount",
          "type": "u64"
        },
        {
          "name": "minimumPoolTokenAmount",
          "type": "u64"
        }
      ]
    },
    {
      "name": "withdrawSingleTokenTypeExactAmountOut",
      "accounts": [
        {
          "name": "swap",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "authority",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "userTransferAuthority",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "poolMint",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "poolTokenSource",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "swapTokenA",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "swapTokenB",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "destination",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "feeAccount",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "destinationTokenAmount",
          "type": "u64"
        },
        {
          "name": "maximumPoolTokenAmount",
          "type": "u64"
        }
      ]
    }
  ],
  "accounts": [
    {
      "name": "Swap",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "version",
            "type": "u8"
          },
          {
            "name": "isInitialized",
            "type": "bool"
          },
          {
            "name": "bumpSeed",
            "type": "u8"
          },
          {
            "name": "tokenProgramId",
            "type": "publicKey"
          },
          {
            "name": "tokenA",
            "type": "publicKey"
          },
          {
            "name": "tokenB",
            "type": "publicKey"
          },
          {
            "name": "poolMint",
            "type": "publicKey"
          },
          {
            "name": "tokenAMint",
            "type": "publicKey"
          },
          {
            "name": "tokenBMint",
            "type": "publicKey"
          },
          {
            "name": "poolFeeAccount",
            "type": "publicKey"
          },
          {
            "name": "fees",
            "type": {
              "defined": "Fees"
            }
          },
          {
            "name": "swapCurve",
            "type": {
              "defined": "SwapCurve"
            }
          }
        ]
      }
    }
  ],
  "types": [
    {
      "name": "Fees",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "tradeFeeNumerator",
            "type": "u64"
          },
          {
            "name": "tradeFeeDenominator",
            "type": "u64"
          },
          {
            "name": "ownerTradeFeeNumerator",
            "type": "u64"
          },
          {
            "name": "ownerTradeFeeDenominator",
            "type": "u64"
          },
          {
            "name": "ownerWithdrawFeeNumerator",
            "type": "u64"
          },
          {
            "name": "ownerWithdrawFeeDenominator",
            "type": "u64"
          },
          {
            "name": "hostFeeNumerator",
            "type": "u64"
          },
          {
            "name": "hostFeeDenominator",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "SwapCurve",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "curveType",
            "type": {
              "defined": "CurveType"
            }
          },
          {
            "name": "calculator",
            "type": {
              "array": [
                "u8",
                32
              ]
            }
          }
        ]
      }
    },
    {
      "name": "StableCurve",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "amp",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "OffsetCurve",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "tokenBOffset",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "ConstantProductCurve",
      "type": {
        "kind": "struct",
        "fields": []
      }
    },
    {
      "name": "ConstantPriceCurve",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "tokenBPrice",
            "type": "u64"
          }
        ]
      }
    },
    {
      "name": "CurveType",
      "type": {
        "kind": "enum",
        "variants": [
          {
            "name": "ConstantProduct"
          },
          {
            "name": "ConstantPrice"
          },
          {
            "name": "Stable"
          },
          {
            "name": "Offset"
          }
        ]
      }
    }
  ],
  "errors": [
    {
      "code": 0,
      "name": "AlreadyInUse",
      "msg": "Swap account already in use"
    },
    {
      "code": 1,
      "name": "InvalidProgramAddress",
      "msg": "Invalid program address generated from bump seed and key"
    },
    {
      "code": 2,
      "name": "InvalidOwner",
      "msg": "Input account owner is not the program address"
    },
    {
      "code": 3,
      "name": "InvalidOutputOwner",
      "msg": "Output pool account owner cannot be the program address"
    },
    {
      "code": 4,
      "name": "ExpectedMint",
      "msg": "Deserialized account is not an SPL Token mint"
    },
    {
      "code": 5,
      "name": "ExpectedAccount",
      "msg": "Deserialized account is not an SPL Token account"
    },
    {
      "code": 6,
      "name": "EmptySupply",
      "msg": "Input token account empty"
    },
    {
      "code": 7,
      "name": "InvalidSupply",
      "msg": "Pool token mint has a non-zero supply"
    },
    {
      "code": 8,
      "name": "InvalidDelegate",
      "msg": "Token account has a delegate"
    },
    {
      "code": 9,
      "name": "InvalidInput",
      "msg": "InvalidInput"
    },
    {
      "code": 10,
      "name": "IncorrectSwapAccount",
      "msg": "Address of the provided swap token account is incorrect"
    },
    {
      "code": 11,
      "name": "IncorrectPoolMint",
      "msg": "Address of the provided pool token mint is incorrect"
    },
    {
      "code": 12,
      "name": "InvalidOutput",
      "msg": "InvalidOutput"
    },
    {
      "code": 13,
      "name": "CalculationFailure",
      "msg": "General calculation failure due to overflow or underflow"
    },
    {
      "code": 14,
      "name": "InvalidInstruction",
      "msg": "Invalid instruction"
    },
    {
      "code": 15,
      "name": "RepeatedMint",
      "msg": "Swap input token accounts have the same mint"
    },
    {
      "code": 16,
      "name": "ExceededSlippage",
      "msg": "Swap instruction exceeds desired slippage limit"
    },
    {
      "code": 17,
      "name": "InvalidCloseAuthority",
      "msg": "Token account has a close authority"
    },
    {
      "code": 18,
      "name": "InvalidFreezeAuthority",
      "msg": "Pool token mint has a freeze authority"
    },
    {
      "code": 19,
      "name": "IncorrectFeeAccount",
      "msg": "Pool fee token account incorrect"
    },
    {
      "code": 20,
      "name": "ZeroTradingTokens",
      "msg": "Given pool token amount results in zero trading tokens"
    },
    {
      "code": 21,
      "name": "FeeCalculationFailure",
      "msg": "Fee calculation failed due to overflow, underflow, or unexpected 0"
    },
    {
      "code": 22,
      "name": "ConversionFailure",
      "msg": "Conversion to u64 failed with an overflow or underflow"
    },
    {
      "code": 23,
      "name": "InvalidFee",
      "msg": "The provided fee does not match the program owner's constraints"
    },
    {
      "code": 24,
      "name": "IncorrectTokenProgramId",
      "msg": "The provided token program does not match the token program expected by the swap"
    },
    {
      "code": 25,
      "name": "UnsupportedCurveType",
      "msg": "The provided curve type is not supported by the program owner"
    },
    {
      "code": 26,
      "name": "InvalidCurve",
      "msg": "The provided curve parameters are invalid"
    },
    {
      "code": 27,
      "name": "UnsupportedCurveOperation",
      "msg": "The operation cannot be performed on the given curve"
    }
  ]
}