diff --git a/src/actions/account.ts b/src/actions/account.ts index 883530c..7d80fd4 100644 --- a/src/actions/account.ts +++ b/src/actions/account.ts @@ -1,12 +1,12 @@ -import { AccountLayout, Token } from "@solana/spl-token"; +import { AccountLayout, MintLayout, Token } from "@solana/spl-token"; import { Account, PublicKey, SystemProgram, TransactionInstruction, } from "@solana/web3.js"; -import { TOKEN_PROGRAM_ID, WRAPPED_SOL_MINT } from "../constants/ids"; -import { TokenAccount } from "../models"; +import { LENDING_PROGRAM_ID, TOKEN_PROGRAM_ID, WRAPPED_SOL_MINT } from "../constants/ids"; +import { LendingObligationLayout, TokenAccount } from "../models"; import { cache, TokenAccountParser } from "./../contexts/accounts"; export function ensureSplAccount( @@ -75,6 +75,50 @@ export function createTempMemoryAccount( return account.publicKey; } +export function createUninitializedObligation( + instructions: TransactionInstruction[], + payer: PublicKey, + amount: number, + signers: Account[] +) { + const account = new Account(); + instructions.push( + SystemProgram.createAccount({ + fromPubkey: payer, + newAccountPubkey: account.publicKey, + lamports: amount, + space: LendingObligationLayout.span, + programId: LENDING_PROGRAM_ID, + }) + ); + + signers.push(account); + + return account.publicKey; +} + +export function createUninitializedMint( + instructions: TransactionInstruction[], + payer: PublicKey, + amount: number, + signers: Account[] +) { + const account = new Account(); + instructions.push( + SystemProgram.createAccount({ + fromPubkey: payer, + newAccountPubkey: account.publicKey, + lamports: amount, + space: MintLayout.span, + programId: TOKEN_PROGRAM_ID, + }) + ); + + signers.push(account); + + return account.publicKey; +} + export function createUninitializedAccount( instructions: TransactionInstruction[], payer: PublicKey, diff --git a/src/actions/borrow.tsx b/src/actions/borrow.tsx index fb4a178..a03d2e5 100644 --- a/src/actions/borrow.tsx +++ b/src/actions/borrow.tsx @@ -12,6 +12,8 @@ import { LENDING_PROGRAM_ID, TOKEN_PROGRAM_ID } from "../constants/ids"; import { createTempMemoryAccount, createUninitializedAccount, + createUninitializedMint, + createUninitializedObligation, ensureSplAccount, findOrCreateAccountByMint, } from "./account"; @@ -51,7 +53,7 @@ export const borrow = async ( AccountLayout.span ); - const obligation = createUninitializedAccount( + const obligation = createUninitializedObligation( instructions, wallet.publicKey, await connection.getMinimumBalanceForRentExemption( @@ -60,7 +62,7 @@ export const borrow = async ( signers ); - const obligationMint = createUninitializedAccount( + const obligationMint = createUninitializedMint( instructions, wallet.publicKey, await connection.getMinimumBalanceForRentExemption(MintLayout.span), diff --git a/src/models/lending/borrow.ts b/src/models/lending/borrow.ts index 9708007..2909a96 100644 --- a/src/models/lending/borrow.ts +++ b/src/models/lending/borrow.ts @@ -22,7 +22,7 @@ import { LendingInstruction } from "./lending"; /// 6. `[writable]` Obligation - uninitialized /// 7. `[writable]` Obligation token mint - uninitialized /// 8. `[writable]` Obligation token output - uninitialized -/// 9. `[]` Obligation token owner - uninitialized +/// 9. `[]` Obligation token owner /// 10 `[]` Derived lending market authority ($authority). /// 11 `[]` Dex market /// 12 `[]` Dex order book side // could be bid/ask @@ -78,16 +78,16 @@ export const borrowInstruction = ( { pubkey: borrowReserveLiquiditySupply, isSigner: false, - isWritable: false, + isWritable: true, }, { pubkey: obligation, isSigner: false, isWritable: true }, { pubkey: obligationMint, isSigner: false, isWritable: true }, { pubkey: obligationTokenOutput, isSigner: false, isWritable: true }, { pubkey: obligationTokenOwner, isSigner: false, isWritable: false }, - { pubkey: lendingMarketAuthority, isSigner: false, isWritable: true }, - { pubkey: dexMarket, isSigner: false, isWritable: true }, + { pubkey: lendingMarketAuthority, isSigner: false, isWritable: false }, + { pubkey: dexMarket, isSigner: false, isWritable: false }, { pubkey: dexOrderBookSide, isSigner: false, isWritable: false }, - { pubkey: memory, isSigner: false, isWritable: true }, + { pubkey: memory, isSigner: false, isWritable: false }, { pubkey: SYSVAR_CLOCK_PUBKEY, isSigner: false, isWritable: false }, { pubkey: SYSVAR_RENT_PUBKEY, isSigner: false, isWritable: false }, { pubkey: TOKEN_PROGRAM_ID, isSigner: false, isWritable: false },