Skip to content

Commit

Permalink
instruction changes
Browse files Browse the repository at this point in the history
  • Loading branch information
0xripleys committed Jul 12, 2023
1 parent 1aa823d commit ae1df08
Show file tree
Hide file tree
Showing 4 changed files with 156 additions and 2 deletions.
41 changes: 41 additions & 0 deletions solend-sdk/src/instructions/forgiveDebt.ts
Original file line number Diff line number Diff line change
@@ -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,
});
};
42 changes: 40 additions & 2 deletions solend-sdk/src/instructions/initReserve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,15 +34,53 @@ 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);
dataLayout.encode(
{
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
);
Expand Down
59 changes: 59 additions & 0 deletions solend-sdk/src/instructions/setLendingMarketOwnerAndConfig.ts
Original file line number Diff line number Diff line change
@@ -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,
});
};
16 changes: 16 additions & 0 deletions solend-sdk/src/instructions/updateReserveConfig.ts
Original file line number Diff line number Diff line change
@@ -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";
Expand All @@ -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"),
Expand All @@ -44,13 +47,20 @@ 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);
dataLayout.encode(
{
instruction: LendingInstruction.UpdateReserveConfig,
optimalUtilizationRate: reserveConfig.optimalUtilizationRate,
maxUtilizationRate: reserveConfig.maxUtilizationRate,
loanToValueRatio: reserveConfig.loanToValueRatio,
liquidationBonus: reserveConfig.liquidationBonus,
liquidationThreshold: reserveConfig.liquidationThreshold,
Expand All @@ -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
);
Expand Down

0 comments on commit ae1df08

Please sign in to comment.