{
  "version": "0.2.0",
  "name": "spl_token_lending",
  "instructions": [
    {
      "name": "initLendingMarket",
      "accounts": [
        {
          "name": "lendingMarket",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "rent",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "oracleProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "owner",
          "type": "publicKey"
        },
        {
          "name": "quoteCurrency",
          "type": {
            "array": [
              "u8",
              32
            ]
          }
        }
      ]
    },
    {
      "name": "setLendingMarketOwner",
      "accounts": [
        {
          "name": "lendingMarket",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "lendingMarketOwner",
          "isMut": false,
          "isSigner": true
        }
      ],
      "args": [
        {
          "name": "newOwner",
          "type": "publicKey"
        }
      ]
    },
    {
      "name": "initReserve",
      "accounts": [
        {
          "name": "sourceLiquidity",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "destinationCollateral",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "reserve",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "reserveLiquidityMint",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "reserveLiquiditySupply",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "reserveLiquidityFeeReceiver",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "reserveCollateralMint",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "reserveCollateralSupply",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "pythProduct",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "pythPrice",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "lendingMarket",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "lendingMarketAuthority",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "lendingMarketOwner",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "userTransferAuthority",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "clock",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "rent",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "liquidityAmount",
          "type": "u64"
        },
        {
          "name": "config",
          "type": {
            "defined": "ReserveConfig"
          }
        }
      ]
    },
    {
      "name": "refreshReserve",
      "accounts": [
        {
          "name": "reserve",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "reserveLiquidityOracle",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "clock",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": []
    },
    {
      "name": "depositReserveLiquidity",
      "accounts": [
        {
          "name": "sourceLiquidity",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "destinationCollateral",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "reserve",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "reserveLiquiditySupply",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "reserveCollateralMint",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "lendingMarket",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "lendingMarketAuthority",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "userTransferAuthority",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "clock",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "liquidityAmount",
          "type": "u64"
        }
      ]
    },
    {
      "name": "redeemReserveCollateral",
      "accounts": [
        {
          "name": "sourceCollateral",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "destinationLiquidity",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "reserve",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "reserveCollateralMint",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "reserveLiquiditySupply",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "lendingMarket",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "lendingMarketAuthority",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "userTransferAuthority",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "clock",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "collateralAmount",
          "type": "u64"
        }
      ]
    },
    {
      "name": "initObligation",
      "accounts": [
        {
          "name": "obligation",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "lendingMarket",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "obligationOwner",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "clock",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "rent",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": []
    },
    {
      "name": "refreshObligation",
      "accounts": [
        {
          "name": "obligation",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "clock",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": []
    },
    {
      "name": "depositObligationCollateral",
      "accounts": [
        {
          "name": "sourceCollateral",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "destinationCollateral",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "depositReserve",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "obligation",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "lendingMarket",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "obligationOwner",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "userTransferAuthority",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "clock",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "collateralAmount",
          "type": "u64"
        }
      ]
    },
    {
      "name": "withdrawObligationCollateral",
      "accounts": [
        {
          "name": "sourceCollateral",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "destinationCollateral",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "withdrawReserve",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "obligation",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "lendingMarket",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "lendingMarketAuthority",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "obligationOwner",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "clock",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "collateralAmount",
          "type": "u64"
        }
      ]
    },
    {
      "name": "borrowObligationLiquidity",
      "accounts": [
        {
          "name": "sourceLiquidity",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "destinationLiquidity",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "borrowReserve",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "borrowReserveLiquidityFeeReceiver",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "obligation",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "lendingMarket",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "lendingMarketAuthority",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "obligationOwner",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "clock",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "liquidityAmount",
          "type": "u64"
        }
      ]
    },
    {
      "name": "repayObligationLiquidity",
      "accounts": [
        {
          "name": "sourceLiquidity",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "destinationLiquidity",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "repayReserve",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "obligation",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "lendingMarket",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "userTransferAuthority",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "clock",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "liquidityAmount",
          "type": "u64"
        }
      ]
    },
    {
      "name": "liquidateObligation",
      "accounts": [
        {
          "name": "sourceLiquidity",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "destinationCollateral",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "repayReserve",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "repayReserveLiquiditySupply",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "withdrawReserve",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "withdrawReserveCollateralSupply",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "obligation",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "lendingMarket",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "lendingMarketAuthority",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "userTransferAuthority",
          "isMut": false,
          "isSigner": true
        },
        {
          "name": "clock",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "liquidityAmount",
          "type": "u64"
        }
      ]
    },
    {
      "name": "flashLoan",
      "accounts": [
        {
          "name": "sourceLiquidity",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "destinationLiquidity",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "reserve",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "reserveLiquidityFeeReceiver",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "hostFeeReceiver",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "lendingMarket",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "lendingMarketAuthority",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "flashLoanReceiverProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "amount",
          "type": "u64"
        }
      ]
    }
  ],
  "accounts": [
    {
      "name": "Obligation",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "version",
            "type": "u8"
          },
          {
            "name": "lastUpdate",
            "type": {
              "defined": "LastUpdate"
            }
          },
          {
            "name": "lendingMarket",
            "type": "publicKey"
          },
          {
            "name": "owner",
            "type": "publicKey"
          },
          {
            "name": "deposits",
            "type": {
              "vec": {
                "defined": "ObligationCollateral"
              }
            }
          },
          {
            "name": "borrows",
            "type": {
              "vec": {
                "defined": "ObligationLiquidity"
              }
            }
          },
          {
            "name": "depositedValue",
            "type": {
              "defined": "Decimal"
            }
          },
          {
            "name": "borrowedValue",
            "type": {
              "defined": "Decimal"
            }
          },
          {
            "name": "allowedBorrowValue",
            "type": {
              "defined": "Decimal"
            }
          },
          {
            "name": "unhealthyBorrowValue",
            "type": {
              "defined": "Decimal"
            }
          }
        ]
      }
    },
    {
      "name": "LendingMarket",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "version",
            "type": "u8"
          },
          {
            "name": "bumpSeed",
            "type": "u8"
          },
          {
            "name": "owner",
            "type": "publicKey"
          },
          {
            "name": "quoteCurrency",
            "type": {
              "array": [
                "u8",
                32
              ]
            }
          },
          {
            "name": "tokenProgramId",
            "type": "publicKey"
          },
          {
            "name": "oracleProgramId",
            "type": "publicKey"
          }
        ]
      }
    },
    {
      "name": "Reserve",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "version",
            "type": "u8"
          },
          {
            "name": "lastUpdate",
            "type": {
              "defined": "LastUpdate"
            }
          },
          {
            "name": "lendingMarket",
            "type": "publicKey"
          },
          {
            "name": "liquidity",
            "type": {
              "defined": "ReserveLiquidity"
            }
          },
          {
            "name": "collateral",
            "type": {
              "defined": "ReserveCollateral"
            }
          },
          {
            "name": "config",
            "type": {
              "defined": "ReserveConfig"
            }
          }
        ]
      }
    }
  ],
  "types": [
    {
      "name": "LastUpdate",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "slot",
            "type": "u64"
          },
          {
            "name": "stale",
            "type": "bool"
          }
        ]
      }
    },
    {
      "name": "ObligationCollateral",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "depositReserve",
            "type": "publicKey"
          },
          {
            "name": "depositedAmount",
            "type": "u64"
          },
          {
            "name": "marketValue",
            "type": {
              "defined": "Decimal"
            }
          }
        ]
      }
    },
    {
      "name": "ObligationLiquidity",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "borrowReserve",
            "type": "publicKey"
          },
          {
            "name": "cumulativeBorrowRateWads",
            "type": {
              "defined": "Decimal"
            }
          },
          {
            "name": "borrowedAmountWads",
            "type": {
              "defined": "Decimal"
            }
          },
          {
            "name": "marketValue",
            "type": {
              "defined": "Decimal"
            }
          }
        ]
      }
    },
    {
      "name": "ReserveLiquidity",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "mintPubkey",
            "type": "publicKey"
          },
          {
            "name": "mintDecimals",
            "type": "u8"
          },
          {
            "name": "supplyPubkey",
            "type": "publicKey"
          },
          {
            "name": "feeReceiver",
            "type": "publicKey"
          },
          {
            "name": "oraclePubkey",
            "type": "publicKey"
          },
          {
            "name": "availableAmount",
            "type": "u64"
          },
          {
            "name": "borrowedAmountWads",
            "type": {
              "defined": "Decimal"
            }
          },
          {
            "name": "cumulativeBorrowRateWads",
            "type": {
              "defined": "Decimal"
            }
          },
          {
            "name": "marketPrice",
            "type": {
              "defined": "Decimal"
            }
          }
        ]
      }
    },
    {
      "name": "ReserveCollateral",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "mintPubkey",
            "type": "publicKey"
          },
          {
            "name": "mintTotalSupply",
            "type": "u64"
          },
          {
            "name": "supplyPubkey",
            "type": "publicKey"
          }
        ]
      }
    },
    {
      "name": "ReserveFees",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "borrowFeeWad",
            "type": "u64"
          },
          {
            "name": "flashLoanFeeWad",
            "type": "u64"
          },
          {
            "name": "hostFeePercentage",
            "type": "u8"
          }
        ]
      }
    },
    {
      "name": "ReserveConfig",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "optimalUtilizationRate",
            "type": "u8"
          },
          {
            "name": "loanToValueRatio",
            "type": "u8"
          },
          {
            "name": "liquidationBonus",
            "type": "u8"
          },
          {
            "name": "liquidationThreshold",
            "type": "u8"
          },
          {
            "name": "minBorrowRate",
            "type": "u8"
          },
          {
            "name": "optimalBorrowRate",
            "type": "u8"
          },
          {
            "name": "maxBorrowRate",
            "type": "u8"
          },
          {
            "name": "fees",
            "type": {
              "defined": "ReserveFees"
            }
          }
        ]
      }
    }
  ],
  "errors": [
    {
      "code": 0,
      "name": "InstructionUnpackError",
      "msg": "Failed to unpack instruction data"
    },
    {
      "code": 1,
      "name": "AlreadyInitialized",
      "msg": "Account is already initialized"
    },
    {
      "code": 2,
      "name": "NotRentExempt",
      "msg": "Lamport balance below rent-exempt threshold"
    },
    {
      "code": 3,
      "name": "InvalidMarketAuthority",
      "msg": "Market authority is invalid"
    },
    {
      "code": 4,
      "name": "InvalidMarketOwner",
      "msg": "Market owner is invalid"
    },
    {
      "code": 5,
      "name": "InvalidAccountOwner",
      "msg": "Input account owner is not the program address"
    },
    {
      "code": 6,
      "name": "InvalidTokenOwner",
      "msg": "Input token account is not owned by the correct token program id"
    },
    {
      "code": 7,
      "name": "InvalidTokenAccount",
      "msg": "Input token account is not valid"
    },
    {
      "code": 8,
      "name": "InvalidTokenMint",
      "msg": "Input token mint account is not valid"
    },
    {
      "code": 9,
      "name": "InvalidTokenProgram",
      "msg": "Input token program account is not valid"
    },
    {
      "code": 10,
      "name": "InvalidAmount",
      "msg": "Input amount is invalid"
    },
    {
      "code": 11,
      "name": "InvalidConfig",
      "msg": "Input config value is invalid"
    },
    {
      "code": 12,
      "name": "InvalidSigner",
      "msg": "Input account must be a signer"
    },
    {
      "code": 13,
      "name": "InvalidAccountInput",
      "msg": "Invalid account input"
    },
    {
      "code": 14,
      "name": "MathOverflow",
      "msg": "Math operation overflow"
    },
    {
      "code": 15,
      "name": "TokenInitializeMintFailed",
      "msg": "Token initialize mint failed"
    },
    {
      "code": 16,
      "name": "TokenInitializeAccountFailed",
      "msg": "Token initialize account failed"
    },
    {
      "code": 17,
      "name": "TokenTransferFailed",
      "msg": "Token transfer failed"
    },
    {
      "code": 18,
      "name": "TokenMintToFailed",
      "msg": "Token mint to failed"
    },
    {
      "code": 19,
      "name": "TokenBurnFailed",
      "msg": "Token burn failed"
    },
    {
      "code": 20,
      "name": "InsufficientLiquidity",
      "msg": "Insufficient liquidity available"
    },
    {
      "code": 21,
      "name": "ReserveCollateralDisabled",
      "msg": "Input reserve has collateral disabled"
    },
    {
      "code": 22,
      "name": "ReserveStale",
      "msg": "Reserve state needs to be refreshed"
    },
    {
      "code": 23,
      "name": "WithdrawTooSmall",
      "msg": "Withdraw amount too small"
    },
    {
      "code": 24,
      "name": "WithdrawTooLarge",
      "msg": "Withdraw amount too large"
    },
    {
      "code": 25,
      "name": "BorrowTooSmall",
      "msg": "Borrow amount too small to receive liquidity after fees"
    },
    {
      "code": 26,
      "name": "BorrowTooLarge",
      "msg": "Borrow amount too large for deposited collateral"
    },
    {
      "code": 27,
      "name": "RepayTooSmall",
      "msg": "Repay amount too small to transfer liquidity"
    },
    {
      "code": 28,
      "name": "LiquidationTooSmall",
      "msg": "Liquidation amount too small to receive collateral"
    },
    {
      "code": 29,
      "name": "ObligationHealthy",
      "msg": "Cannot liquidate healthy obligations"
    },
    {
      "code": 30,
      "name": "ObligationStale",
      "msg": "Obligation state needs to be refreshed"
    },
    {
      "code": 31,
      "name": "ObligationReserveLimit",
      "msg": "Obligation reserve limit exceeded"
    },
    {
      "code": 32,
      "name": "InvalidObligationOwner",
      "msg": "Obligation owner is invalid"
    },
    {
      "code": 33,
      "name": "ObligationDepositsEmpty",
      "msg": "Obligation deposits are empty"
    },
    {
      "code": 34,
      "name": "ObligationBorrowsEmpty",
      "msg": "Obligation borrows are empty"
    },
    {
      "code": 35,
      "name": "ObligationDepositsZero",
      "msg": "Obligation deposits have zero value"
    },
    {
      "code": 36,
      "name": "ObligationBorrowsZero",
      "msg": "Obligation borrows have zero value"
    },
    {
      "code": 37,
      "name": "InvalidObligationCollateral",
      "msg": "Invalid obligation collateral"
    },
    {
      "code": 38,
      "name": "InvalidObligationLiquidity",
      "msg": "Invalid obligation liquidity"
    },
    {
      "code": 39,
      "name": "ObligationCollateralEmpty",
      "msg": "Obligation collateral is empty"
    },
    {
      "code": 40,
      "name": "ObligationLiquidityEmpty",
      "msg": "Obligation liquidity is empty"
    },
    {
      "code": 41,
      "name": "NegativeInterestRate",
      "msg": "Interest rate is negative"
    },
    {
      "code": 42,
      "name": "InvalidOracleConfig",
      "msg": "Input oracle config is invalid"
    },
    {
      "code": 43,
      "name": "InvalidFlashLoanReceiverProgram",
      "msg": "Input flash loan receiver program account is not valid"
    },
    {
      "code": 44,
      "name": "NotEnoughLiquidityAfterFlashLoan",
      "msg": "Not enough liquidity after flash loan"
    }
  ]
}