Updated adapter to support Rain.fi v2 (#13634)

Co-authored-by: g1nt0ki <99907941+g1nt0ki@users.noreply.github.com>
This commit is contained in:
Whitey
2025-02-25 16:13:56 +01:00
committed by GitHub
parent cf99ff5343
commit e94457c49f
5 changed files with 241 additions and 572 deletions

93
projects/rain/bank-idl.js Normal file
View File

@@ -0,0 +1,93 @@
module.exports = {
"address": "rain2M5b9GeFCk792swkwUu51ZihHJb3SUQ8uHxSRJf",
"metadata": {"name": "bank", "version": "0.1.0", "spec": "0.1.0", "description": "Created with Anchor"},
"instructions": [],
"accounts": [
{"name": "Bank", "discriminator": [142, 49, 166, 242, 50, 66, 97, 188]},
],
"events": [],
"errors": [],
"types": [
{
"name": "Bank",
"type": {
"kind": "struct",
"fields": [
{"name": "owner", "type": "pubkey"},
{"name": "mint", "type": "pubkey"},
{"name": "vault", "type": "pubkey"},
{"name": "authority", "type": "pubkey"},
{"name": "bank_type", "type": {"defined": {"name": "BankType"}}},
{"name": "total_liquidity", "type": "u64"},
{"name": "available_liquidity", "type": "u64"},
{"name": "delegated_liquidity", "type": "u64"},
{"name": "cooldown_liquidity", "type": "u64"},
{"name": "cooldown_period", "type": "u64"},
{"name": "delegators", "type": {"array": [{"defined": {"name": "Delegator"}}, 8]}},
{"name": "created_at", "type": "u64"},
{"name": "deposited_at", "type": "u64"},
{"name": "withdrawn_at", "type": "u64"},
{"name": "borrowed_at", "type": "u64"},
{"name": "repaid_at", "type": "u64"},
{"name": "frozen_until", "type": "u64"},
{"name": "reserved", "type": {"array": ["u8", 512]}}
]
}
},
{
"name": "BankType",
"type": {
"kind": "enum",
"variants": [
{"name": "Personal", "fields": [{"defined": {"name": "PersonalBank"}}]},
{"name": "Shared", "fields": [{"defined": {"name": "SharedBank"}}]}
]
}
},
{
"name": "PersonalBank",
"type": {
"kind": "struct",
"fields": [
{"name": "reserved", "type": {"array": ["u8", 32]}},
{"name": "reserved1", "type": {"array": ["u8", 32]}},
{"name": "reserved2", "type": {"array": ["u8", 16]}}
]
}
},
{
"name": "SharedBank",
"type": {
"kind": "struct",
"fields": [
{"name": "lp_mint", "type": "pubkey"},
{"name": "lp_rate", "type": "u128"},
{"name": "lp_supply", "type": "u64"},
{"name": "_padding1", "type": {"array": ["u8", 8]}},
{"name": "lp_decimals", "type": "u8"},
{"name": "_padding2", "type": {"array": ["u8", 15]}}
]
}
},
{
"name": "Delegator",
"type": {
"kind": "struct",
"fields": [{"name": "delegator_type", "type": {"defined": {"name": "DelegatorType"}}}, {"name": "delegated_amount", "type": "u64"}]
}
},
{"name": "DelegatorType", "type": {"kind": "enum", "variants": [{"name": "Empty", "fields": [{"defined": {"name": "EmptyDelegator"}}]}]}},
{
"name": "EmptyDelegator",
"type": {
"kind": "struct",
"fields": [
{"name": "reserved", "type": {"array": ["u8", 32]}},
{"name": "reserved1", "type": {"array": ["u8", 32]}},
{"name": "reserved2", "type": {"array": ["u8", 32]}},
{"name": "reserved3", "type": {"array": ["u8", 24]}}
]
}
}
]
}

74
projects/rain/defi-idl.js Normal file
View File

@@ -0,0 +1,74 @@
module.exports = {
"address": "rDeFiHPjHZRLiz4iBzMw3zv6unZs4VwdU6qQcVd3NSK",
"metadata": { "name": "defi_lending", "version": "0.1.0", "spec": "0.1.0", "description": "Created with Anchor" },
"instructions": [],
"accounts": [{ "name": "Loan", "discriminator": [20, 195, 70, 117, 165, 227, 182, 1] }],
"events": [],
"errors": [],
"types": [
{
"name": "Loan",
"type": {
"kind": "struct",
"fields": [
{ "name": "kind", "type": { "defined": { "name": "LoanKind" } } },
{ "name": "status", "type": { "defined": { "name": "LoanStatus" } } },
{ "name": "is_custom", "type": "u8" },
{ "name": "_padding1", "type": { "array": ["u8", 6] } },
{ "name": "borrower", "type": "pubkey" },
{ "name": "bank", "type": "pubkey" },
{ "name": "pool", "type": "pubkey" },
{ "name": "collateral", "type": "pubkey" },
{ "name": "principal", "type": "pubkey" },
{ "name": "referrer", "type": "pubkey" },
{ "name": "interest", "type": "u64" },
{ "name": "borrowed_amount", "type": "u64" },
{ "name": "collateral_amount", "type": "u64" },
{ "name": "duration", "type": "u32" },
{ "name": "currency", "type": "u32" },
{ "name": "liquidation", "type": "u16" },
{ "name": "_padding2", "type": { "array": ["u8", 6] } },
{ "name": "created_at", "type": "u64" },
{ "name": "expired_at", "type": "u64" },
{ "name": "repaid_at", "type": "u64" },
{ "name": "liquidated_at", "type": "u64" },
{ "name": "sold_amount", "type": "u64" },
{ "name": "reserved", "type": { "array": ["u64", 9] } }
]
}
},
{
"name": "LoanKind",
"type": {
"kind": "enum",
"variants": [
{ "name": "Classic", "fields": [{ "defined": { "name": "ClassicLoan" } }] },
{ "name": "MarginSwap", "fields": [{ "defined": { "name": "MarginSwapLoan" } }] },
{ "name": "Request", "fields": [{ "defined": { "name": "RequestLoan" } }] },
]
}
},
{ "name": "ClassicLoan", "type": { "kind": "struct", "fields": [{ "name": "reserved", "type": { "array": ["u8", 64] } }] } },
{
"name": "MarginSwapLoan",
"type": {
"kind": "struct",
"fields": [
{ "name": "down_payment", "type": "u64" },
{ "name": "reserved", "type": { "array": ["u8", 32] } },
{ "name": "reserved1", "type": { "array": ["u8", 24] } }
]
}
},
{
"name": "RequestLoan",
"type": {
"kind": "struct",
"fields": [
{"name": "reserved", "type": {"array": ["u8", 64]}}
]
}
},
{ "name": "LoanStatus", "type": { "kind": "enum", "variants": [{ "name": "Ongoing" }, { "name": "Repaid" }, { "name": "Liquidated" }, { "name": "Sold" }] } }
]
}

View File

@@ -1,549 +0,0 @@
module.exports = {
"version": "0.1.0",
"name": "rain",
"instructions": [],
"accounts": [
{
"name": "loan",
"type": {
"kind": "struct",
"fields": [
{
"name": "kind",
"type": {
"defined": "LoanKind"
}
},
{
"name": "status",
"type": {
"defined": "LoanStatus"
}
},
{
"name": "borrower",
"type": "publicKey"
},
{
"name": "lender",
"type": "publicKey"
},
{
"name": "pool",
"type": "publicKey"
},
{
"name": "mint",
"type": "publicKey"
},
{
"name": "currency",
"type": "publicKey"
},
{
"name": "isCustom",
"type": "bool"
},
{
"name": "isFrozen",
"type": "bool"
},
{
"name": "price",
"type": "u64"
},
{
"name": "interest",
"type": "u64"
},
{
"name": "amount",
"type": "u64"
},
{
"name": "duration",
"type": "u64"
},
{
"name": "collection",
"type": "u32"
},
{
"name": "liquidation",
"type": "u16"
},
{
"name": "marketplace",
"type": {
"defined": "Marketplace"
}
},
{
"name": "sale",
"type": {
"defined": "Sale"
}
},
{
"name": "createdAt",
"type": "u64"
},
{
"name": "expiredAt",
"type": "u64"
},
{
"name": "repaidAt",
"type": "u64"
},
{
"name": "soldAt",
"type": "u64"
},
{
"name": "liquidatedAt",
"type": "u64"
},
{
"name": "listing",
"type": {
"defined": "Listing"
}
},
{
"name": "isCompressedLoan",
"type": "bool"
},
{
"name": "isDefi",
"type": "bool"
},
{
"name": "collateralAmount",
"type": "u64"
},
{
"name": "collateralDecimals",
"type": "u8"
},
{
"name": "padding",
"type": {
"array": [
"u64",
5
]
}
},
{
"name": "padding1",
"type": "u32"
}
]
}
},
{
"name": "pool",
"type": {
"kind": "struct",
"fields": [
{
"name": "bump",
"type": "u8"
},
{
"name": "owner",
"type": "publicKey"
},
{
"name": "currency",
"type": "publicKey"
},
{
"name": "oraclePoolUsd",
"type": "publicKey"
},
{
"name": "oracleSolUsd",
"type": "publicKey"
},
{
"name": "status",
"type": {
"defined": "PoolStatus"
}
},
{
"name": "isCompounded",
"type": "bool"
},
{
"name": "isShared",
"type": "bool"
},
{
"name": "totalAmount",
"type": "u64"
},
{
"name": "borrowedAmount",
"type": "u64"
},
{
"name": "availableAmount",
"type": "u64"
},
{
"name": "usableAmount",
"type": "u64"
},
{
"name": "loanCurve",
"type": {
"defined": "Curve"
}
},
{
"name": "mortgageCurve",
"type": {
"defined": "Curve"
}
},
{
"name": "isMortgageEnabled",
"type": "bool"
},
{
"name": "nftLocked",
"type": "u64"
},
{
"name": "totalLiquidations",
"type": "u64"
},
{
"name": "totalLoans",
"type": "u64"
},
{
"name": "totalMortgages",
"type": "u64"
},
{
"name": "totalInterest",
"type": "u64"
},
{
"name": "depositedAt",
"type": "u64"
},
{
"name": "createdAt",
"type": "u64"
},
{
"name": "updatedAt",
"type": "u64"
},
{
"name": "collectionsUpdatedAt",
"type": "u64"
},
{
"name": "lastLoanAt",
"type": "u64"
},
{
"name": "lastMortgageAt",
"type": "u64"
},
{
"name": "conditions",
"type": {
"defined": "PoolCondition"
}
},
{
"name": "liquidation",
"type": {
"defined": "PoolLiquidation"
}
},
{
"name": "whitelist",
"type": "publicKey"
},
{
"name": "padding",
"type": {
"array": [
"u64",
16
]
}
},
{
"name": "collections",
"type": {
"array": [
{
"defined": "PoolCollection"
},
50
]
}
}
]
}
},
],
"types": [
{
"name": "LoanKind",
"type": {
"kind": "enum",
"variants": [
{
"name": "Loan"
},
{
"name": "Mortgage"
}
]
}
},
{
"name": "LoanStatus",
"type": {
"kind": "enum",
"variants": [
{
"name": "Ongoing"
},
{
"name": "Repaid"
},
{
"name": "Liquidated"
},
{
"name": "Sold"
}
]
}
},
{
"name": "Curve",
"type": {
"kind": "struct",
"fields": [
{
"name": "baseInterest",
"type": "u16"
},
{
"name": "interestRate",
"type": "u16"
},
{
"name": "curveRate",
"type": "u16"
},
{
"name": "curveRateDay",
"type": "u16"
},
{
"name": "maxDuration",
"type": "u64"
},
{
"name": "maxAmount",
"type": "u64"
}
]
}
},
{
"name": "PoolCollection",
"type": {
"kind": "struct",
"fields": [
{
"name": "collection",
"type": "u32"
},
{
"name": "collectionLtv",
"type": "u16"
},
{
"name": "exposure",
"type": "u16"
},
{
"name": "amountUsed",
"type": "u64"
}
]
}
},
{
"name": "PoolCondition",
"type": {
"kind": "struct",
"fields": [
{
"name": "isEnabled",
"type": "bool"
},
{
"name": "minAge",
"type": "u64"
},
{
"name": "minLoan",
"type": "u64"
},
{
"name": "minVolume",
"type": "u64"
},
{
"name": "liquidationThreshold",
"type": "u16"
},
{
"name": "padding1",
"type": "u16"
},
{
"name": "padding2",
"type": "u16"
},
{
"name": "padding3",
"type": "u8"
}
]
}
},
{
"name": "PoolLiquidation",
"type": {
"kind": "struct",
"fields": [
{
"name": "loanLiquidation",
"type": "u16"
},
{
"name": "mortgageLiquidation",
"type": "u16"
},
{
"name": "isAutoSellEnabled",
"type": "bool"
},
{
"name": "percentageMaxLoss",
"type": "u16"
}
]
}
},
{
"name": "PoolStatus",
"docs": [
"Pool status enum"
],
"type": {
"kind": "enum",
"variants": [
{
"name": "Ready"
},
{
"name": "Disabled"
}
]
}
},
{
"name": "Marketplace",
"type": {
"kind": "enum",
"variants": [
{
"name": "None"
},
{
"name": "Auctionhouse"
},
{
"name": "Solanart"
},
{
"name": "Hyperspace"
},
{
"name": "Yaww"
},
{
"name": "Hadeswap"
},
{
"name": "Rain"
},
{
"name": "TensorswapOrder"
},
{
"name": "TensorswapListing"
},
{
"name": "MagicEden"
}
]
}
},
{
"name": "Sale",
"type": {
"kind": "struct",
"fields": [
{
"name": "isForSale",
"type": "bool"
},
{
"name": "salePrice",
"type": "u64"
},
{
"name": "currency",
"type": "publicKey"
}
]
}
},
{
"name": "Listing",
"type": {
"kind": "struct",
"fields": [
{
"name": "isListed",
"type": "bool"
},
{
"name": "price",
"type": "u64"
}
]
}
}
],
"errors": []
}

View File

@@ -1,43 +1,66 @@
const { Program } = require("@project-serum/anchor");
const { Program } = require("@coral-xyz/anchor");
const bs58 = require('bs58');
const { getProvider } = require("../helper/solana");
const idl = require('./idl')
const bankIdl = require('./bank-idl');
const defiIdl = require('./defi-idl');
async function tvl(api) {
const provider = getProvider()
const program = new Program(idl, 'RainEraPU5yDoJmTrHdYynK9739GkEfDsE4ffqce2BR', provider)
const provider = getProvider();
const bankProgram = new Program(bankIdl, provider);
const defiProgram = new Program(defiIdl, provider);
const pools = await program.account.pool.all()
const loans = await program.account.loan.all([
// Get all banks
const banks = await bankProgram.account.bank.all();
// Get all active defi loans
const defiLoans = await defiProgram.account.loan.all([
{
memcmp: {
offset: 294 + 8,
bytes: bs58.encode(Buffer.from([1])), // tokens loans only
},
},
{
memcmp: {
offset: 8 + 1,
offset: 8 + 64 + 1,
bytes: bs58.encode(Buffer.from([0])), // active loans only
},
},
])
]);
for (const loan of loans) {
api.add(loan.account.mint.toString(), loan.account.collateralAmount)
// Add bank available liquidity to TVL, availableLiquidity = totalLiquidity - borrowedLiquidity
for (const bank of banks) {
api.add(
bank.account.mint.toString(),
bank.account.availableLiquidity
);
}
for (const pool of pools)
api.add(pool.account.currency.toString(), pool.account.availableAmount)
// Add defi loan collateral to TVL
for (const loan of defiLoans) {
api.add(
loan.account.collateral.toString(),
loan.account.collateralAmount
);
}
}
async function borrowed(api) {
const provider = getProvider()
const program = new Program(idl, 'RainEraPU5yDoJmTrHdYynK9739GkEfDsE4ffqce2BR', provider)
const pools = await program.account.pool.all()
const provider = getProvider();
const defiProgram = new Program(defiIdl, provider);
for (const pool of pools)
api.add(pool.account.currency.toString(), pool.account.borrowedAmount)
// Get all active defi loans
const defiLoans = await defiProgram.account.loan.all([
{
memcmp: {
offset: 8 + 64 + 1,
bytes: bs58.encode(Buffer.from([0])), // active loans only
},
},
]);
// Add defi loan collateral to TVL
for (const loan of defiLoans) {
api.add(
loan.account.principal.toString(),
loan.account.borrowedAmount
);
}
}
module.exports = {

View File

@@ -32,7 +32,22 @@ function checkType(typeObj) {
if (isAccountObjInTypeMap || !accountMap[typeObj.name])
whitelistedTypeMap[typeObj.name] = typeObj
if (typeObj.type.kind === 'enum' && Array.isArray(typeObj.type.variants)) {
typeObj.type.variants.forEach(v => {
if (!v.fields) {
const name = getDefinedName(v)
if (name && typeMap[name]) checkType(typeMap[name])
return;
}
v.fields.forEach(f => {
const name = getDefinedName(f)
if (name && typeMap[name]) checkType(typeMap[name])
})
})
}
if (typeObj.type.kind !== 'struct') return;
typeObj.type.fields.forEach(f => {
const isVec = f.type?.vec?.defined?.name
if (isVec) {
@@ -49,6 +64,19 @@ function checkType(typeObj) {
if (name && typeMap[name]) checkType(typeMap[name])
})
}
if (typeof f.type === 'enum' && Array.isArray(f.type.variants)) {
f.type.variants.forEach(v => {
if (!v.fields) {
const name = getDefinedName(v)
if (name && typeMap[name]) checkType(typeMap[name])
return;
}
v.fields.forEach(f => {
const name = getDefinedName(f)
if (name && typeMap[name]) checkType(typeMap[name])
})
})
}
})
}