From ae1df08b6d0c9831dde69f8b6b3c5f5fcd925404 Mon Sep 17 00:00:00 2001 From: 0xripleys <0xripleys@solend.fi> Date: Wed, 12 Jul 2023 18:28:27 -0400 Subject: [PATCH] instruction changes --- solend-sdk/src/instructions/forgiveDebt.ts | 41 +++++++++++++ solend-sdk/src/instructions/initReserve.ts | 42 ++++++++++++- .../setLendingMarketOwnerAndConfig.ts | 59 +++++++++++++++++++ .../src/instructions/updateReserveConfig.ts | 16 +++++ 4 files changed, 156 insertions(+), 2 deletions(-) create mode 100644 solend-sdk/src/instructions/forgiveDebt.ts create mode 100644 solend-sdk/src/instructions/setLendingMarketOwnerAndConfig.ts diff --git a/solend-sdk/src/instructions/forgiveDebt.ts b/solend-sdk/src/instructions/forgiveDebt.ts new file mode 100644 index 00000000..48019dd6 --- /dev/null +++ b/solend-sdk/src/instructions/forgiveDebt.ts @@ -0,0 +1,41 @@ +import { PublicKey, TransactionInstruction } from "@solana/web3.js"; +import * as BufferLayout from "buffer-layout"; +import { RateLimiterConfig } from "../state/rateLimiter"; +import * as Layout from "../utils/layout"; +import { LendingInstruction } from "./instruction"; + +export const ForgiveDebtInstruction = ( + obligation: PublicKey, + reserve: PublicKey, + lendingMarket: PublicKey, + lendingMarketOwner: PublicKey, + liquidityAmount: number, + lendingProgramId: PublicKey +): TransactionInstruction => { + const dataLayout = BufferLayout.struct([ + BufferLayout.u8("instruction"), + Layout.uint64("liquidityAmount"), + ]); + + const data = Buffer.alloc(dataLayout.span); + dataLayout.encode( + { + instruction: LendingInstruction.SetLendingMarketOwnerAndConfig, + liquidityAmount: liquidityAmount, + }, + data + ); + + const keys = [ + { pubkey: obligation, isSigner: false, isWritable: true }, + { pubkey: reserve, isSigner: false, isWritable: true }, + { pubkey: lendingMarket, isSigner: false, isWritable: false }, + { pubkey: lendingMarketOwner, isSigner: true, isWritable: false }, + ]; + + return new TransactionInstruction({ + keys, + programId: lendingProgramId, + data, + }); +}; diff --git a/solend-sdk/src/instructions/initReserve.ts b/solend-sdk/src/instructions/initReserve.ts index 2e550ec5..c519ba7b 100644 --- a/solend-sdk/src/instructions/initReserve.ts +++ b/solend-sdk/src/instructions/initReserve.ts @@ -34,7 +34,26 @@ export const initReserveInstruction = ( const dataLayout = BufferLayout.struct([ BufferLayout.u8("instruction"), Layout.uint64("liquidityAmount"), - ReserveConfigLayout, + BufferLayout.u8("optimalUtilizationRate"), + BufferLayout.u8("maxUtilizationRate"), + BufferLayout.u8("loanToValueRatio"), + BufferLayout.u8("liquidationBonus"), + BufferLayout.u8("liquidationThreshold"), + BufferLayout.u8("minBorrowRate"), + BufferLayout.u8("optimalBorrowRate"), + BufferLayout.u8("maxBorrowRate"), + Layout.uint64("borrowFeeWad"), + Layout.uint64("flashLoanFeeWad"), + BufferLayout.u8("hostFeePercentage"), + Layout.uint64("depositLimit"), + Layout.uint64("borrowLimit"), + Layout.publicKey("feeReceiver"), + BufferLayout.u8("protocolLiquidationFee"), + BufferLayout.u8("protocolTakeRate"), + Layout.uint64("addedBorrowWeightBPS"), + BufferLayout.u8("reserveType"), + BufferLayout.u8("maxLiquidationBonus"), + BufferLayout.u8("maxLiquidationThreshold"), ]); const data = Buffer.alloc(dataLayout.span); @@ -42,7 +61,26 @@ export const initReserveInstruction = ( { instruction: LendingInstruction.InitReserve, liquidityAmount: new BN(liquidityAmount), - config, + optimalUtilizationRate: config.optimalUtilizationRate, + maxUtilizationRate: config.maxUtilizationRate, + loanToValueRatio: config.loanToValueRatio, + liquidationBonus: config.liquidationBonus, + liquidationThreshold: config.liquidationThreshold, + minBorrowRate: config.minBorrowRate, + optimalBorrowRate: config.optimalBorrowRate, + maxBorrowRate: config.maxBorrowRate, + borrowFeeWad: config.fees.borrowFeeWad, + flashLoanFeeWad: config.fees.flashLoanFeeWad, + hostFeePercentage: config.fees.hostFeePercentage, + depositLimit: config.depositLimit, + borrowLimit: config.borrowLimit, + feeReceiver: config.feeReceiver, + protocolLiquidationFee: config.protocolLiquidationFee, + protocolTakeRate: config.protocolTakeRate, + addedBorrowWeightBPS: config.addedBorrowWeightBPS, + reserveType: config.reserveType, + maxLiquidationBonus: config.maxLiquidationBonus, + maxLiquidationThreshold: config.maxLiquidationThreshold, }, data ); diff --git a/solend-sdk/src/instructions/setLendingMarketOwnerAndConfig.ts b/solend-sdk/src/instructions/setLendingMarketOwnerAndConfig.ts new file mode 100644 index 00000000..3154822c --- /dev/null +++ b/solend-sdk/src/instructions/setLendingMarketOwnerAndConfig.ts @@ -0,0 +1,59 @@ +import { PublicKey, TransactionInstruction } from '@solana/web3.js'; +import * as BufferLayout from 'buffer-layout'; +import {RateLimiterConfig} from '../state/rateLimiter'; +import * as Layout from "../utils/layout"; +import { LendingInstruction } from './instruction'; + +/// Sets the new owner of a lending market. +/// +/// Accounts expected by this instruction: +/// +/// 0. `[writable]` Lending market account. +/// 1. `[signer]` Current owner. +export const SetLendingMarketOwnerAndConfigInstruction = ( + lendingMarket: PublicKey, + currentMarketOwner: PublicKey, + newMarketOwner: PublicKey, + newRateLimiterConfig: RateLimiterConfig, + whitelistedLiquidator: PublicKey | null, + riskAuthority: PublicKey, + lendingProgramId: PublicKey, +): TransactionInstruction => { + if (whitelistedLiquidator != null) { + throw new Error("Whitelisted liquidator not supported yet"); + } + + const dataLayout = BufferLayout.struct([ + BufferLayout.u8('instruction'), + Layout.publicKey('newOwner'), + Layout.uint64('windowDuration'), + Layout.uint64('maxOutflow'), + BufferLayout.u8('whitelistedLiquidator'), + Layout.publicKey('riskAuthority'), + ]); + + + const data = Buffer.alloc(dataLayout.span); + dataLayout.encode( + { + instruction: LendingInstruction.SetLendingMarketOwnerAndConfig, + newOwner: newMarketOwner, + windowDuration: newRateLimiterConfig.windowDuration, + maxOutflow: newRateLimiterConfig.maxOutflow, + whitelistedLiquidator: 0, + riskAuthority: riskAuthority, + }, + data, + ); + + const keys = [ + { pubkey: lendingMarket, isSigner: false, isWritable: true }, + { pubkey: currentMarketOwner, isSigner: true, isWritable: false }, + ]; + + return new TransactionInstruction({ + keys, + programId: lendingProgramId, + data, + }); +}; diff --git a/solend-sdk/src/instructions/updateReserveConfig.ts b/solend-sdk/src/instructions/updateReserveConfig.ts index 63e687b5..f4e40365 100644 --- a/solend-sdk/src/instructions/updateReserveConfig.ts +++ b/solend-sdk/src/instructions/updateReserveConfig.ts @@ -1,4 +1,5 @@ import { PublicKey, TransactionInstruction } from "@solana/web3.js"; +import {RateLimiterConfig} from "../state/rateLimiter"; import { ReserveConfig } from "../state/reserve"; import * as Layout from "../utils/layout"; import { LendingInstruction } from "./instruction"; @@ -25,11 +26,13 @@ export const updateReserveConfig = ( pythPrice: PublicKey, switchboardOracle: PublicKey, reserveConfig: ReserveConfig, + rateLimiterConfig: RateLimiterConfig, solendProgramAddress: PublicKey ): TransactionInstruction => { const dataLayout = BufferLayout.struct([ BufferLayout.u8("instruction"), BufferLayout.u8("optimalUtilizationRate"), + BufferLayout.u8("maxUtilizationRate"), BufferLayout.u8("loanToValueRatio"), BufferLayout.u8("liquidationBonus"), BufferLayout.u8("liquidationThreshold"), @@ -44,6 +47,12 @@ export const updateReserveConfig = ( Layout.publicKey("feeReceiver"), BufferLayout.u8("protocolLiquidationFee"), BufferLayout.u8("protocolTakeRate"), + Layout.uint64("addedBorrowWeightBPS"), + BufferLayout.u8("reserveType"), + BufferLayout.u8("maxLiquidationBonus"), + BufferLayout.u8("maxLiquidationThreshold"), + Layout.uint64("windowDuration"), + Layout.uint64("maxOutflow"), ]); const data = Buffer.alloc(dataLayout.span); @@ -51,6 +60,7 @@ export const updateReserveConfig = ( { instruction: LendingInstruction.UpdateReserveConfig, optimalUtilizationRate: reserveConfig.optimalUtilizationRate, + maxUtilizationRate: reserveConfig.maxUtilizationRate, loanToValueRatio: reserveConfig.loanToValueRatio, liquidationBonus: reserveConfig.liquidationBonus, liquidationThreshold: reserveConfig.liquidationThreshold, @@ -65,6 +75,12 @@ export const updateReserveConfig = ( feeReceiver: reserveConfig.feeReceiver, protocolLiquidationFee: reserveConfig.protocolLiquidationFee, protocolTakeRate: reserveConfig.protocolTakeRate, + addedBorrowWeightBPS: reserveConfig.addedBorrowWeightBPS, + reserveType: reserveConfig.reserveType, + maxLiquidationBonus: reserveConfig.maxLiquidationBonus, + maxLiquidationThreshold: reserveConfig.maxLiquidationThreshold, + windowDuration: rateLimiterConfig.windowDuration, + maxOutflow: rateLimiterConfig.maxOutflow, }, data );