Skip to content

Commit

Permalink
Add new RPC methods to interface
Browse files Browse the repository at this point in the history
  • Loading branch information
DaSichuan committed Oct 9, 2024
1 parent c459efe commit 5c46e88
Show file tree
Hide file tree
Showing 13 changed files with 601 additions and 287 deletions.
254 changes: 134 additions & 120 deletions solend-sdk/src/core/actions.ts

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion solend-sdk/src/core/margin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,7 @@ export class Margin {
environment: "production",
customObligationAddress: this.obligationAddress,
customObligationSeed: this.obligationSeed,
lookupTableAddress: lookupTableAccount?.key
lookupTableAddress: lookupTableAccount?.key,
}
);
const { preLendingTxn, lendingTxn } =
Expand Down
2 changes: 1 addition & 1 deletion solend-sdk/src/core/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,4 +73,4 @@ export type InputReserveConfigParams = {
extraOracle?: PublicKey;
attributedBorrowLimitOpen: BN;
attributedBorrowLimitClose: BN;
}
};
2 changes: 1 addition & 1 deletion solend-sdk/src/core/utils/obligations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export type ObligationType = ReturnType<typeof formatObligation>;

export function formatObligation(
obligation: { pubkey: PublicKey; info: Obligation },
reserveMap: {[key: string]: ReserveType}
reserveMap: { [key: string]: ReserveType }
) {
const poolAddress = obligation.info.lendingMarket.toBase58();
let minPriceUserTotalSupply = new BigNumber(0);
Expand Down
38 changes: 23 additions & 15 deletions solend-sdk/src/core/utils/pools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ export function formatReserve(
name?: string;
},
config?: {
showApy: boolean,
avgSlotTime: number,
showApy: boolean;
avgSlotTime: number;
}
) {
const decimals = reserve.info.liquidity.mintDecimals;
Expand Down Expand Up @@ -101,16 +101,18 @@ export function formatReserve(

const lstPatch = priceData?.lstAdjustmentRatio
? {
loanToValueRatio: Number(
new BigNumber(reserve.info.config.loanToValueRatio)
.div(priceData.lstAdjustmentRatio)
.toString(),
) / 100,
liquidationThreshold: Number(
new BigNumber(reserve.info.config.liquidationThreshold)
.div(priceData.lstAdjustmentRatio)
.toString(),
) / 100,
loanToValueRatio:
Number(
new BigNumber(reserve.info.config.loanToValueRatio)
.div(priceData.lstAdjustmentRatio)
.toString()
) / 100,
liquidationThreshold:
Number(
new BigNumber(reserve.info.config.liquidationThreshold)
.div(priceData.lstAdjustmentRatio)
.toString()
) / 100,
}
: {};

Expand Down Expand Up @@ -146,8 +148,14 @@ export function formatReserve(
minBorrowApr: reserve.info.config.minBorrowRate / 100,
maxBorrowApr: reserve.info.config.maxBorrowRate / 100,
superMaxBorrowRate: reserve.info.config.superMaxBorrowRate.toNumber() / 100,
supplyInterest: calculateSupplyInterest(reserve.info, Boolean(config?.showApy)).times((0.5 / (config?.avgSlotTime ?? 0.5))),
borrowInterest: calculateBorrowInterest(reserve.info, Boolean(config?.showApy)).times((0.5 / (config?.avgSlotTime ?? 0.5))),
supplyInterest: calculateSupplyInterest(
reserve.info,
Boolean(config?.showApy)
).times(0.5 / (config?.avgSlotTime ?? 0.5)),
borrowInterest: calculateBorrowInterest(
reserve.info,
Boolean(config?.showApy)
).times(0.5 / (config?.avgSlotTime ?? 0.5)),
totalSupply,
totalBorrow,
availableAmount,
Expand Down Expand Up @@ -193,7 +201,7 @@ export function formatReserve(
attributedBorrowValue: reserve.info.config.attributedBorrowValue,
attributedBorrowLimitOpen: reserve.info.config.attributedBorrowLimitOpen,
attributedBorrowLimitClose: reserve.info.config.attributedBorrowLimitClose,
...lstPatch
...lstPatch,
};
}

Expand Down
2 changes: 1 addition & 1 deletion solend-sdk/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
export * from "./lib";
export * from "./core";
export * from "./transaction";
export * from "./transaction";
79 changes: 79 additions & 0 deletions solend-sdk/src/rpc/cached.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,15 @@ import {
RpcResponseAndContext,
SendOptions,
SignatureResult,
SignaturesForAddressOptions,
SignatureStatus,
SignatureStatusConfig,
SimulatedTransactionResponse,
SimulateTransactionConfig,
TokenAmount,
TransactionResponse,
TransactionSignature,
VersionedMessage,
VersionedTransaction,
VersionedTransactionResponse,
} from "@solana/web3.js";
Expand Down Expand Up @@ -300,4 +304,79 @@ export class CachedConnection implements SolendRPCConnection {
))
);
}
async getSignatureStatus(
signature: TransactionSignature,
config?: SignatureStatusConfig
): Promise<RpcResponseAndContext<SignatureStatus | null>> {
const key = `getSignatureStatus_${signature}_${JSON.stringify(config)}`;
return (
(await this.cache.get(key)) ||
(await this.cache.set(
key,
this.connection.getSignatureStatus(signature, config)
))
);
}

async getSignatureStatuses(
signatures: Array<TransactionSignature>,
config?: SignatureStatusConfig
): Promise<RpcResponseAndContext<Array<SignatureStatus | null>>> {
const key = `getSignatureStatuses_${signatures
.map((sig) => sig)
.join("_")}_${JSON.stringify(config)}`;
return (
(await this.cache.get(key)) ||
(await this.cache.set(
key,
this.connection.getSignatureStatuses(signatures, config)
))
);
}

async getSignaturesForAddress(
address: PublicKey,
options?: SignaturesForAddressOptions,
commitment?: Finality
): Promise<Array<ConfirmedSignatureInfo>> {
const key = `getSignaturesForAddress_${address.toBase58()}_${JSON.stringify(
options
)}_${commitment}`;
return (
(await this.cache.get(key)) ||
(await this.cache.set(
key,
this.connection.getSignaturesForAddress(address, options, commitment)
))
);
}

async getBlocks(
startSlot: number,
endSlot?: number,
commitment?: Finality
): Promise<Array<number>> {
const key = `getBlocks_${startSlot}_${endSlot}_${commitment}`;
return (
(await this.cache.get(key)) ||
(await this.cache.set(
key,
this.connection.getBlocks(startSlot, endSlot, commitment)
))
);
}

async getFeeForMessage(
message: VersionedMessage,
commitment?: Commitment
): Promise<RpcResponseAndContext<number | null>> {
const key = `getFeeForMessage_${JSON.stringify(message)}_${commitment}`;
return (
(await this.cache.get(key)) ||
(await this.cache.set(
key,
this.connection.getFeeForMessage(message, commitment)
))
);
}
}
56 changes: 56 additions & 0 deletions solend-sdk/src/rpc/instrumented.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,15 @@ import {
RpcResponseAndContext,
SendOptions,
SignatureResult,
SignaturesForAddressOptions,
SignatureStatus,
SignatureStatusConfig,
SimulatedTransactionResponse,
SimulateTransactionConfig,
TokenAmount,
TransactionResponse,
TransactionSignature,
VersionedMessage,
VersionedTransaction,
VersionedTransactionResponse,
} from "@solana/web3.js";
Expand Down Expand Up @@ -196,6 +200,58 @@ export class InstrumentedConnection implements SolendRPCConnection {
);
}

async getSignatureStatus(
signature: TransactionSignature,
config?: SignatureStatusConfig
): Promise<RpcResponseAndContext<SignatureStatus | null>> {
return this.withStats(
this.connection.getSignatureStatus(signature, config),
"getSignatureStatus"
);
}

async getSignatureStatuses(
signatures: Array<TransactionSignature>,
config?: SignatureStatusConfig
): Promise<RpcResponseAndContext<Array<SignatureStatus | null>>> {
return this.withStats(
this.connection.getSignatureStatuses(signatures, config),
"getSignatureStatuses"
);
}

async getSignaturesForAddress(
address: PublicKey,
options?: SignaturesForAddressOptions,
commitment?: Finality
): Promise<Array<ConfirmedSignatureInfo>> {
return this.withStats(
this.connection.getSignaturesForAddress(address, options, commitment),
"getSignaturesForAddress"
);
}

async getBlocks(
startSlot: number,
endSlot?: number,
commitment?: Finality
): Promise<Array<number>> {
return this.withStats(
this.connection.getBlocks(startSlot, endSlot, commitment),
"getBlocks"
);
}

async getFeeForMessage(
message: VersionedMessage,
commitment?: Commitment
): Promise<RpcResponseAndContext<number | null>> {
return this.withStats(
this.connection.getFeeForMessage(message, commitment),
"getFeeForMessage"
);
}

async withStats(fn: Promise<any>, fnName: string) {
const tags = [`rpc:${this.prefix}`, `function:${fnName}`];
this.statsd.increment("rpc_method_call", tags);
Expand Down
26 changes: 26 additions & 0 deletions solend-sdk/src/rpc/interface.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,15 @@ import {
RpcResponseAndContext,
SendOptions,
SignatureResult,
SignaturesForAddressOptions,
SignatureStatus,
SignatureStatusConfig,
SimulatedTransactionResponse,
SimulateTransactionConfig,
TokenAmount,
TransactionResponse,
TransactionSignature,
VersionedMessage,
VersionedTransaction,
VersionedTransactionResponse,
} from "@solana/web3.js";
Expand Down Expand Up @@ -92,4 +96,26 @@ export interface SolendRPCConnection {
strategy: BlockheightBasedTransactionConfirmationStrategy,
commitment?: Commitment
): Promise<RpcResponseAndContext<SignatureResult>>;
getSignatureStatus(
signature: TransactionSignature,
config?: SignatureStatusConfig
): Promise<RpcResponseAndContext<SignatureStatus | null>>;
getSignatureStatuses(
signatures: Array<TransactionSignature>,
config?: SignatureStatusConfig
): Promise<RpcResponseAndContext<Array<SignatureStatus | null>>>;
getSignaturesForAddress(
address: PublicKey,
options?: SignaturesForAddressOptions,
commitment?: Finality
): Promise<Array<ConfirmedSignatureInfo>>;
getBlocks(
startSlot: number,
endSlot?: number,
commitment?: Finality
): Promise<Array<number>>;
getFeeForMessage(
message: VersionedMessage,
commitment?: Commitment
): Promise<RpcResponseAndContext<number | null>>;
}
Loading

0 comments on commit 5c46e88

Please sign in to comment.