├── .yarnrc.yml ├── .prettierrc ├── .gitignore ├── tsconfig.json ├── package.json ├── examples ├── lib │ └── createProvider.ts ├── place-offer.ts ├── repay-loan.ts ├── list-order-books.ts ├── revoke-offer.ts ├── list-offers.ts ├── foreclose-loan.ts └── take-loan.ts ├── .vscode └── settings.json ├── README.md └── idl ├── sharky-1.0.0-beta.json ├── sharky-2.0.0-beta.json ├── sharky-3.0.0.json ├── sharky-6.2.0.json ├── sharky-4.0.0.json └── sharky-4.1.0.json /.yarnrc.yml: -------------------------------------------------------------------------------- 1 | nodeLinker: node-modules 2 | 3 | yarnPath: .yarn/releases/yarn-3.2.0.cjs 4 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "printWidth": 80, 3 | "trailingComma": "es5", 4 | "tabWidth": 2, 5 | "semi": false, 6 | "singleQuote": true 7 | } 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | 3 | *.code-workspace 4 | 5 | *.log 6 | 7 | # Typescript incremental build file 8 | tsconfig.tsbuildinfo 9 | 10 | **/node_modules 11 | .parcel-cache 12 | 13 | # yarn 3+ (non-pnp) 14 | .pnp.* 15 | .yarn/* 16 | !.yarn/patches 17 | !.yarn/plugins 18 | !.yarn/releases 19 | !.yarn/sdks 20 | !.yarn/versions 21 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["es2021"], 4 | "module": "commonjs", 5 | "target": "es2021", 6 | 7 | "strict": false, 8 | "esModuleInterop": true, 9 | "skipLibCheck": true, 10 | "forceConsistentCasingInFileNames": true, 11 | "rootDir": "./", 12 | "sourceMap": true, 13 | "declaration": true, 14 | "declarationMap": true, 15 | "resolveJsonModule": true 16 | }, 17 | "include": ["**/**.ts"], 18 | "exclude": ["**/node_modules/**"] 19 | } 20 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@sharkyfi/client", 3 | "version": "6.7.0", 4 | "description": "Documentation for the @sharkyfi/client package", 5 | "repository": "https://github.com/SharkyFi/client", 6 | "license": "MIT", 7 | "dependencies": { 8 | "@sharkyfi/client": "^7.0.0", 9 | "@solana/web3.js": "^1.72.0", 10 | "commander": "^9.3.0", 11 | "node-fetch": "^2", 12 | "pretty-ms": "^7.0.1" 13 | }, 14 | "packageManager": "yarn@3.2.0", 15 | "devDependencies": { 16 | "@types/node": "^17.0.21", 17 | "ts-node": "^10.7.0", 18 | "typescript": "~4.6.0" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /examples/lib/createProvider.ts: -------------------------------------------------------------------------------- 1 | import { AnchorProvider } from '@coral-xyz/anchor' 2 | 3 | // This assembles an Anchor Provider using NodeWallet. 4 | // In the frontend, you can use @sharkyfi/client's createProvider, using a wallet from a WalletProvider 5 | export function createProvider( 6 | walletPath: string, 7 | rpcEndpoint: string = process.env.RPC_ENDPOINT 8 | ) { 9 | if (!rpcEndpoint) { 10 | throw Error('You must provide an RPC endpoint') 11 | } 12 | // Set up the sharky client 13 | process.env.ANCHOR_WALLET = walletPath 14 | process.env.ANCHOR_PROVIDER_URL = rpcEndpoint // You will need to provide your own RPC here 15 | const provider = AnchorProvider.env() 16 | // @ts-ignore // This is the only way to set this parameter when using .env() 17 | provider.connection._confirmTransactionInitialTimeout = 180_000 18 | return provider 19 | } 20 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "files.autoSave": "onFocusChange", // Autosave prevents problems like git pull or prettier causing conflicts with unsaved code 3 | "editor.formatOnSave": true, // Run Prettier whenever you save, so you never have to do it manually. NOTE you can do `cmd-k + s` to save without formatting if you ever need to. 4 | // "javascript.inlayHints.parameterNames.enabled": "all", // Strongly recommended for Anchor's many many arguments in functions 5 | "typescript.preferences.importModuleSpecifier": "non-relative", // Use tsconfig paths when available 6 | "javascript.preferences.importModuleSpecifier": "non-relative", 7 | "search.exclude": { 8 | // Exclude non-source junk from searches. 9 | ".yarn/**": true 10 | }, 11 | // Set Prettier as the default for every language it supports (that we use) 12 | "[javascript]": { 13 | "editor.defaultFormatter": "esbenp.prettier-vscode" 14 | }, 15 | "[javascriptreact]": { 16 | "editor.defaultFormatter": "esbenp.prettier-vscode" 17 | }, 18 | "[typescript]": { 19 | "editor.defaultFormatter": "esbenp.prettier-vscode" 20 | }, 21 | "[typescriptreact]": { 22 | "editor.defaultFormatter": "esbenp.prettier-vscode" 23 | }, 24 | "[json]": { 25 | "editor.defaultFormatter": "esbenp.prettier-vscode" 26 | }, 27 | "[jsonc]": { 28 | "editor.defaultFormatter": "esbenp.prettier-vscode" 29 | }, 30 | "[yaml]": { 31 | "editor.defaultFormatter": "esbenp.prettier-vscode" 32 | }, 33 | "[markdown]": { 34 | "editor.defaultFormatter": "esbenp.prettier-vscode", 35 | "editor.tabSize": 4 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /examples/place-offer.ts: -------------------------------------------------------------------------------- 1 | import { createSharkyClient, SHARKY_PROGRAM_ID } from '@sharkyfi/client' 2 | import { LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js' 3 | import { Command } from 'commander' 4 | import { createProvider } from './lib/createProvider' 5 | 6 | // Usage 7 | // npx ts-node examples/place-offer.ts --wallet-path ~/.config/solana/id.json --order-book --amount-sol 1 8 | // You can get the list of orderbook pubkeys from get-order-books.ts 9 | 10 | async function main() { 11 | const cli = new Command() 12 | const options = cli 13 | .requiredOption('--wallet-path ', 'path to private key file') 14 | .requiredOption( 15 | '--order-book ', 16 | 'pubkey of orderbook to submit offer on' 17 | ) 18 | .requiredOption( 19 | '--amount-sol ', 20 | 'amount of the loan offer (in SOL)' 21 | ) 22 | .parse() 23 | .opts() 24 | 25 | const provider = createProvider(options.walletPath) 26 | const sharkyClient = createSharkyClient( 27 | provider, 28 | new PublicKey(SHARKY_PROGRAM_ID), 29 | 'mainnet' 30 | ) 31 | const { program } = sharkyClient 32 | 33 | const { orderBook } = await sharkyClient.fetchOrderBook({ 34 | program, 35 | orderBookPubKey: options.orderBook, 36 | }) 37 | if (!orderBook) { 38 | console.error(`No orderbook found with pubkey ${options.orderBook}`) 39 | } 40 | const { offeredLoans, sig } = await orderBook.offerLoan({ 41 | program: sharkyClient.program, 42 | principalLamports: options.amountSol * LAMPORTS_PER_SOL, 43 | onTransactionUpdate: console.dir, 44 | }) 45 | 46 | console.log( 47 | `Loan offered! Its pubkey is: ${offeredLoans[0].pubKey.toString()}` 48 | ) 49 | } 50 | 51 | main() 52 | -------------------------------------------------------------------------------- /examples/repay-loan.ts: -------------------------------------------------------------------------------- 1 | import { createSharkyClient, SHARKY_PROGRAM_ID } from '@sharkyfi/client' 2 | import { PublicKey } from '@solana/web3.js' 3 | import { Command } from 'commander' 4 | import { createProvider } from './lib/createProvider' 5 | 6 | // Usage 7 | // npx ts-node examples/repay-loan.ts --wallet-path ~/.config/solana/id.json --loan --rpc-endpoint 8 | // You can get the list of orderbook pubkeys from get-order-books.ts 9 | 10 | async function main() { 11 | const cli = new Command() 12 | const options = cli 13 | .option('--rpc-endpoint ', 'url of rpc endpoint') 14 | .requiredOption('--wallet-path ', 'path to private key file') 15 | .requiredOption('--loan ', 'pubkey of loan you want to repay') 16 | .parse() 17 | .opts() 18 | 19 | const provider = createProvider(options.walletPath, options.rpcEndpoint) 20 | const sharkyClient = createSharkyClient( 21 | provider, 22 | new PublicKey(SHARKY_PROGRAM_ID), 23 | 'mainnet' 24 | ) 25 | const { program } = sharkyClient 26 | 27 | console.log('Fetching loan') 28 | const offeredOrTaken = await sharkyClient.fetchLoan({ 29 | program, 30 | loanPubKey: new PublicKey(options.loan), 31 | }) 32 | if (!offeredOrTaken) { 33 | throw Error(`No loan found with pubkey ${options.loan}`) 34 | } 35 | if (!('taken' in offeredOrTaken!)) { 36 | throw Error('Loan is not in taken state, so cannot be repaid.') 37 | } 38 | const loan = offeredOrTaken.taken 39 | 40 | console.log('Fetching orderbook') 41 | const { orderBook } = await sharkyClient.fetchOrderBook({ 42 | program, 43 | orderBookPubKey: loan.data.orderBook, 44 | }) 45 | 46 | const { sig } = await loan.repay({ 47 | program, 48 | orderBook, 49 | }) 50 | 51 | console.log(`Loan repaid! tx sig: ${sig}`) 52 | } 53 | 54 | main() 55 | -------------------------------------------------------------------------------- /examples/list-order-books.ts: -------------------------------------------------------------------------------- 1 | import { 2 | createSharkyClient, 3 | enabledOrderBooks, 4 | OrderBook, 5 | SHARKY_PROGRAM_ID, 6 | } from '@sharkyfi/client' 7 | import { PublicKey } from '@solana/web3.js' 8 | import { Command } from 'commander' 9 | import fetch from 'node-fetch' 10 | import { createProvider } from './lib/createProvider' 11 | 12 | // Usage 13 | // npx ts-node examples/list-order-books.ts --wallet-path ~/.config/solana/id.json 14 | // You can get the list of orderbook pubkeys from get-orderbooks.ts 15 | 16 | async function main() { 17 | const cli = new Command() 18 | const options = cli 19 | .requiredOption('--wallet-path ', 'path to private key file') 20 | .parse() 21 | .opts() 22 | 23 | const provider = createProvider(options.walletPath) 24 | const sharkyClient = createSharkyClient( 25 | provider, 26 | new PublicKey(SHARKY_PROGRAM_ID), 27 | 'mainnet' 28 | ) 29 | const { program } = sharkyClient 30 | 31 | // Fetch and log the current orderbooks 32 | const orderBooks = await sharkyClient.fetchAllOrderBooks({ program }) 33 | const collectionNames = await sharkyClient.fetchAllNftLists({ program }) 34 | 35 | const nftListPubKeyToNameMap = Object.fromEntries( 36 | collectionNames.map(({ pubKey, collectionName }) => [ 37 | pubKey, 38 | collectionName, 39 | ]) 40 | ) 41 | 42 | const orderBooksByName = Object.fromEntries( 43 | orderBooks 44 | .map((ob: OrderBook) => [ 45 | nftListPubKeyToNameMap[ 46 | ob.orderBookType.nftList!.listAccount.toString() 47 | ], 48 | { 49 | pubkey: ob.pubKey.toString(), 50 | enabled: enabledOrderBooks.includes(ob.pubKey.toString()), 51 | }, 52 | ]) 53 | .sort((a, b) => (a[0] < b[0] ? -1 : 1)) 54 | ) 55 | console.dir({ orderBooksByName }) 56 | } 57 | 58 | main() 59 | -------------------------------------------------------------------------------- /examples/revoke-offer.ts: -------------------------------------------------------------------------------- 1 | import { LAMPORTS_PER_SOL } from '@solana/web3.js' 2 | import { Command } from 'commander' 3 | import { createProvider } from './lib/createProvider' 4 | import { PublicKey } from '@solana/web3.js' 5 | import { 6 | createSharkyClient, 7 | OfferedLoan, 8 | SHARKY_PROGRAM_ID, 9 | } from '@sharkyfi/client' 10 | import { exit } from 'process' 11 | 12 | // Usage 13 | // npx ts-node examples/revoke-offer.ts --wallet-path ~/.config/solana/id.json --loan 14 | // You can get the list of loans from list-offers.ts 15 | 16 | async function main() { 17 | const cli = new Command() 18 | const options = cli 19 | .requiredOption('--wallet-path ', 'path to private key file') 20 | .requiredOption('--loan ', 'pubkey of the loan to revoke') 21 | .parse() 22 | .opts() 23 | 24 | const provider = createProvider(options.walletPath) 25 | const sharkyClient = createSharkyClient( 26 | provider, 27 | new PublicKey(SHARKY_PROGRAM_ID), 28 | 'mainnet' 29 | ) 30 | const { program } = sharkyClient 31 | 32 | const result = (await sharkyClient.fetchLoan({ 33 | program, 34 | loanPubKey: new PublicKey(options.loan), 35 | })) as { offered: OfferedLoan } 36 | if (!result) { 37 | console.error(`No loan at pubkey: ${options.loan}`) 38 | exit(1) 39 | } 40 | if (!('offered' in result)) { 41 | console.error( 42 | `Loan at ${options.loan} is already taken, and cannot be revoked` 43 | ) 44 | exit(1) 45 | } 46 | const loan = result.offered 47 | 48 | // rescind, AKA revoke in our UI 49 | await loan.rescind({ program, onTransactionUpdate: console.dir }) 50 | 51 | console.log( 52 | `Successfully revoked offer at ${options.loan} for ${( 53 | loan.data.principalLamports.toNumber() / LAMPORTS_PER_SOL 54 | ).toFixed(2)} SOL` 55 | ) 56 | } 57 | 58 | main() 59 | -------------------------------------------------------------------------------- /examples/list-offers.ts: -------------------------------------------------------------------------------- 1 | import { 2 | AnchorProvider, 3 | createSharkyClient, 4 | OfferedLoan, 5 | SHARKY_PROGRAM_ID, 6 | TakenLoan, 7 | } from '@sharkyfi/client' 8 | import { LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js' 9 | import { Command } from 'commander' 10 | import { createProvider } from './lib/createProvider' 11 | 12 | // Usage 13 | // npx ts-node examples/list-offers.ts --wallet-path ~/.config/solana/id.json 14 | // You can get the list of orderbook pubkeys from get-order-books.ts 15 | 16 | async function main() { 17 | const cli = new Command() 18 | const options = cli 19 | .requiredOption('--wallet-path ', 'path to private key file') 20 | .parse() 21 | .opts() 22 | 23 | const provider = createProvider(options.walletPath) 24 | const sharkyClient = createSharkyClient( 25 | provider, 26 | new PublicKey(SHARKY_PROGRAM_ID), 27 | 'mainnet' 28 | ) 29 | const { program } = sharkyClient 30 | 31 | const loans = await sharkyClient.fetchAllLoans({ 32 | program, 33 | }) 34 | 35 | const myOpenOffers = loans.filter( 36 | (loan) => 37 | loan.data.loanState.offer?.offer.lenderWallet.toString() === 38 | (program.provider as AnchorProvider).wallet.publicKey.toString() 39 | ) 40 | // Note: lenderNoteMint is currently just the lender's wallet address. 41 | const myActiveLoans = loans.filter( 42 | (loan) => 43 | loan.data.loanState.taken?.taken.lenderNoteMint.toString() === 44 | (program.provider as AnchorProvider).wallet.publicKey.toString() 45 | ) 46 | 47 | console.log('Open offers:') 48 | console.dir( 49 | myOpenOffers.map((loan: OfferedLoan) => ({ 50 | loan: loan.pubKey.toString(), 51 | orderBook: loan.data.orderBook.toString(), 52 | amountSol: ( 53 | loan.data.principalLamports.toNumber() / LAMPORTS_PER_SOL 54 | ).toFixed(2), 55 | })) 56 | ) 57 | console.log('Active loans:') 58 | console.dir( 59 | myActiveLoans.map((loan: TakenLoan) => ({ 60 | loan: loan.pubKey.toString(), 61 | orderBook: loan.data.orderBook.toString(), 62 | amountSol: ( 63 | loan.data.principalLamports.toNumber() / LAMPORTS_PER_SOL 64 | ).toFixed(2), 65 | borrower: loan.data.loanState.taken.taken.borrowerNoteMint.toString(), 66 | nftCollateralMint: 67 | loan.data.loanState.taken.taken.nftCollateralMint.toString(), 68 | isForeclosable: loan.isForeclosable(), 69 | })) 70 | ) 71 | } 72 | 73 | main() 74 | -------------------------------------------------------------------------------- /examples/foreclose-loan.ts: -------------------------------------------------------------------------------- 1 | import { 2 | createSharkyClient, 3 | SHARKY_PROGRAM_ID, 4 | TakenLoan, 5 | } from '@sharkyfi/client' 6 | import { LAMPORTS_PER_SOL, PublicKey } from '@solana/web3.js' 7 | import { Command } from 'commander' 8 | import prettyMs from 'pretty-ms' 9 | import { exit } from 'process' 10 | import { createProvider } from './lib/createProvider' 11 | 12 | // Usage 13 | // npx ts-node examples/foreclose-loan.ts --wallet-path ~/.config/solana/id.json --loan 14 | // You can get the list of loans from list-offers.ts 15 | 16 | async function main() { 17 | const cli = new Command() 18 | const options = cli 19 | .requiredOption('--wallet-path ', 'path to private key file') 20 | .requiredOption('--loan ', 'pubkey of the loan to foreclose') 21 | .parse() 22 | .opts() 23 | 24 | const provider = createProvider(options.walletPath) 25 | const sharkyClient = createSharkyClient( 26 | provider, 27 | new PublicKey(SHARKY_PROGRAM_ID), 28 | 'mainnet' 29 | ) 30 | const { program } = sharkyClient 31 | 32 | const result = (await sharkyClient.fetchLoan({ 33 | program, 34 | loanPubKey: new PublicKey(options.loan), 35 | })) as { taken: TakenLoan } 36 | if (!result) { 37 | console.error(`No loan at pubkey: ${options.loan}`) 38 | exit(1) 39 | } 40 | if (!('taken' in result)) { 41 | console.error( 42 | `Loan at ${options.loan} has not yet been taken, and cannot be foreclosed` 43 | ) 44 | exit(1) 45 | } 46 | const loan = result.taken 47 | 48 | if (!loan.isForeclosable()) { 49 | const currentTimestamp = new Date().getTime() / 1000 50 | const startTimestamp = 51 | loan.data.loanState.taken.taken.terms.time?.start.toNumber() 52 | const duration = 53 | loan.data.loanState.taken.taken.terms.time?.duration.toNumber() 54 | const endTimestamp = startTimestamp + duration 55 | const secondsUntilForeclosable = endTimestamp - currentTimestamp 56 | console.error( 57 | `Loan at ${ 58 | options.loan 59 | } is not yet foreclosable. Time remaining: ${prettyMs( 60 | secondsUntilForeclosable * 1000 61 | )}` 62 | ) 63 | exit(1) 64 | } 65 | 66 | await loan.foreclose({ program, onTransactionUpdate: console.dir }) 67 | 68 | console.log( 69 | `Successfully foreclosed loan at ${options.loan} (amount loaned was ${( 70 | loan.data.principalLamports.toNumber() / LAMPORTS_PER_SOL 71 | ).toFixed( 72 | 2 73 | )} SOL). You now own NFT ${loan.data.loanState.taken.taken.nftCollateralMint.toString()}.` 74 | ) 75 | } 76 | 77 | main() 78 | -------------------------------------------------------------------------------- /examples/take-loan.ts: -------------------------------------------------------------------------------- 1 | import { createSharkyClient, SHARKY_PROGRAM_ID } from '@sharkyfi/client' 2 | import { PublicKey } from '@solana/web3.js' 3 | import { Command } from 'commander' 4 | import { createProvider } from './lib/createProvider' 5 | 6 | // Usage 7 | // npx ts-node examples/take-loan.ts --wallet-path ~/.config/solana/id.json --loan --collateral-mint --rpc-endpoint 8 | // You can get the list of orderbook pubkeys from get-order-books.ts 9 | 10 | async function main() { 11 | const cli = new Command() 12 | const options = cli 13 | .option('--rpc-endpoint ', 'url of rpc endpoint') 14 | .requiredOption('--wallet-path ', 'path to private key file') 15 | .requiredOption('--loan ', 'pubkey of loan you want to take') 16 | .requiredOption( 17 | '--collateral-mint ', 18 | 'mint address of NFT you want to use as collateral' 19 | ) 20 | .parse() 21 | .opts() 22 | 23 | const provider = createProvider(options.walletPath, options.rpcEndpoint) 24 | const sharkyClient = createSharkyClient( 25 | provider, 26 | new PublicKey(SHARKY_PROGRAM_ID), 27 | 'mainnet' 28 | ) 29 | const { program } = sharkyClient 30 | 31 | console.log('Fetching loan') 32 | const offeredOrTaken = await sharkyClient.fetchLoan({ 33 | program, 34 | loanPubKey: new PublicKey(options.loan), 35 | }) 36 | if (!offeredOrTaken) { 37 | throw Error(`No loan found with pubkey ${options.loan}`) 38 | } 39 | if (!('offered' in offeredOrTaken!)) { 40 | throw Error('Loan is already taken.') 41 | } 42 | const loan = offeredOrTaken.offered 43 | 44 | console.log('Fetching orderbook') 45 | // Get the orderbook, so we can get the nftList, so we can get the index of the mint for the take instruction 46 | const { orderBook } = await sharkyClient.fetchOrderBook({ 47 | program, 48 | orderBookPubKey: loan.data.orderBook, 49 | }) 50 | console.dir({ orderBook }, { depth: 10 }) 51 | 52 | // Note: NFTLists are large. You may want to save them yourself and look NFTs up in their lists from the copies you've saved. You can download all the current NftLists with fetchAllNftLists. 53 | console.log('Fetching nftlist') 54 | const nftList = await sharkyClient.fetchNftList({ 55 | program, 56 | nftListPubKey: orderBook.orderBookType.nftList.listAccount, 57 | }) 58 | console.log(program.provider.connection.rpcEndpoint) 59 | if (!nftList) { 60 | throw Error( 61 | `NFTList ${orderBook.orderBookType.nftList.listAccount.toString()} doesn't exist, or you're using the default solana public RPC which doesn't support some calls.` 62 | ) 63 | } 64 | const nftListIndex = nftList.mints 65 | .map((pk) => pk.toString()) 66 | .indexOf(options.collateralMint) 67 | if (nftListIndex === -1) { 68 | throw Error("NFT mint not found in the NFTList's mints") 69 | } 70 | 71 | console.log('Fetching mint metadata') 72 | // Check if the loan can be frozen (escrow-less loan) or not (escrow loan) 73 | const metadata = 74 | (await sharkyClient.program.provider.connection.getParsedAccountInfo( 75 | new PublicKey(options.collateralMint), 76 | 'confirmed' 77 | )) as any 78 | const { freezeAuthority } = metadata?.value?.data?.parsed?.info 79 | const isFreezable = Boolean(freezeAuthority) 80 | 81 | // Execute the instruction 82 | try { 83 | const { takenLoan, sig } = await loan.take({ 84 | program, 85 | nftMintPubKey: new PublicKey(options.collateralMint), 86 | nftListIndex, 87 | skipFreezingCollateral: !isFreezable, 88 | }) 89 | 90 | console.log( 91 | `Loan taken! Its pubkey is: ${takenLoan.pubKey.toString()}; tx sig: ${sig}` 92 | ) 93 | } catch (e) { 94 | console.error(`Error taking loan (sig: ${e.sig})`, e) 95 | } 96 | } 97 | 98 | main() 99 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

2 | 3 |

4 | 5 |

@sharkyfi/client

6 | 7 | This repo gives examples for how to use the [@sharkyfi/client](https://www.npmjs.com/package/@sharkyfi/client) library to interact with the [Sharky](https://sharky.fi) solana program. It doesn't yet contain the client's code, because we use monorepo and publish package from there. But eventually the client's code will be migrated. 8 | 9 | The `examples` directory contains scripts that provide a reference for performing automated lending actions. You can copy-paste code from there into your own code, or run the scripts directly. 10 | 11 | Keep in mind that this repo and the Sharky library are licensed under [GPLv3](https://www.gnu.org/licenses/gpl-3.0.en.html). 12 | 13 | ## How to use the package 14 | 15 | The recommended way is to fork this repo and use examples as a starting point for your scripting. 16 | 17 | The more custom alternative is to run: 18 | 19 | ``` 20 | npm install @sharkyfi/client 21 | ``` 22 | 23 | And write your own scripts from scratch. 24 | 25 | ## Examples 26 | 27 | To run the scripts, run `yarn` or `npm install`, then: 28 | 29 | Get the current list of orderbooks (name and pubkey): 30 | 31 | ```bash 32 | npx ts-node examples/list-order-books.ts --wallet-path ~/.config/solana/id.json 33 | ``` 34 | 35 | Place a loan offer on an orderbook: 36 | 37 | ```bash 38 | npx ts-node examples/place-offer.ts --wallet-path ~/.config/solana/id.json --order-book --amount-sol 1 39 | ``` 40 | 41 | List your current offers: 42 | 43 | ```bash 44 | npx ts-node examples/list-offers.ts --wallet-path ~/.config/solana/id.json 45 | ``` 46 | 47 | Revoke an offer: 48 | 49 | ```bash 50 | npx ts-node examples/revoke-offer.ts --wallet-path ~/.config/solana/id.json --loan 51 | ``` 52 | 53 | ## Gotchas / things to know about how our data is structured 54 | 55 | ### APR and APY 56 | 57 | We originally named a property on loans and orderbooks "APY" when actually using it mathematically as APR. We've corrected this on the frontend, but in the data structure that is returned from the chain data, `orderBook.apy.fixed?.apy` is actually APR, as is `loan.data.loanState.taken?.taken.apy.fixed!.apy`. 58 | 59 | Additionally, those are stored as millpercents — thousandths of a percent, to allow for higher precision while being stored as integers. 60 | 61 | To get regular APR and APY as percents from the values we store on chain: 62 | 63 | ```js 64 | import { aprToApy, apyToApr, aprToInterestRatio, interestRatioToApr } from '@sharkyfi/client' 65 | 66 | // Get values from the loan and orderbook 67 | // for orderbooks: 68 | const apr = orderBook.apy.fixed!.apy / 1000 69 | // or for taken loans: 70 | const apr = loan.data.loanState.taken?.taken.apy.fixed!.apy / 1000 71 | 72 | const principalLamports = loan.data.principalLamports.toNumber() 73 | const feePermillicentage = orderBook.feePermillicentage 74 | const durationSeconds = 75 | loan.data.loanState.taken?.taken.terms.time?.duration.toNumber() || 76 | loan.data.loanState.offer?.offer.termsSpec.time?.duration.toNumber() 77 | 78 | // Calculations 79 | const interestRatio = aprToInterestRatio(apr, durationSeconds) 80 | const interestWithFeeLamports = interestRatio * principalLamports 81 | const totalOwedLamports = principalLamports + interestWithFeeLamports 82 | const feeLamports = Math.floor((interestWithFeeLamports * feePermillicentage) / 100_000) 83 | const interestWithoutFeeLamports = interestWithFeeLamports - feeLamports 84 | const interestRatioAfterFee = interestWithoutFeeLamports / principalLamports 85 | const aprAfterFee = interestRatioToApr(interestRatioAfterFee, durationSeconds) 86 | const apyAfterFee = aprToApy(aprAfterFee) 87 | 88 | console.log({ 89 | interestRatio, // Shown to borrowers 90 | interestWithFeeLamports, // Shown to borrowers 91 | totalOwedLamports, // Shown to borrowers 92 | apyAfterFee, // Shown to lenders 93 | }) 94 | ``` 95 | 96 | For example, given these inputs, you will get these values: 97 | 98 | ```js 99 | const principalLamports = 1e9 100 | const apr = 145365 / 1000 101 | const feePermillicentage = 16000 102 | const durationSeconds = 7 * 24 * 60 * 60 103 | 104 | // ...calculations 105 | 106 | console.log({ 107 | interestRatio, // 0.028270453175256227 (shown as 2.82%) 108 | interestWithFeeLamports, // 28270453 (shown as 0.028 SOL) 109 | totalOwedLamports, // 1028270453 (shown as 1.028 SOL) 110 | apyAfterFee, // 239.9988789793601 (shown as 240%) 111 | }) 112 | ``` 113 | 114 | # How to get historical events 115 | 116 | It depends for what purpose. If you want to get parsed transactions programmatically from the beginning of time, please refer to our official partner - Hello Moon, if you want to just do explorative analysis via SQL, we have pre-parsed table on Dune, if you want some super custom integration, we can give you acess to our own database for some unique use-cases. 117 | 118 | ## Hello Moon API 119 | 120 | For example: https://docs.hellomoon.io/reference/post_v0-sharky-loan-events 121 | 122 | Example response 123 | 124 | ```json 125 | { 126 | "data": [ 127 | { 128 | "blockTime": "1677959719", 129 | "blockId": "180767604", 130 | "transactionPosition": 977, 131 | "instructionOrdinal": 1, 132 | "transactionId": "4QovotWNSLvByYZCBpg83oLtW8rXdeAyFWfuEDeDh455QUgW43pBWCDYYjdPBAy5kb3vSVVHi338MeaWcjEdtCEp", 133 | "orderBook": "7yJpf4UzKkeWveDvW6KmHunbuXRAEZdcwgcv4zMyNU5y", 134 | "loan": "GY6kuy6rYwdRDR3tjz8idcH7vatKnhYkz8UQ1GzCCEtv", 135 | "actionType": "repay", 136 | "lender": "9sP8D7wcqHHNSdUqvXLeYFetvAk2G7rnLbnEfH29HHwM", 137 | "borrower": "FAWGVTAEyfBX2TcMLCQnUusW4CPh6REtTmCkDAURPETn", 138 | "collateralMint": "FiX2tBUWjWvjF1JhL15VzshFeyVc4P755gbh5apByZSA", 139 | "tokenMint": "So11111111111111111111111111111111111111112", 140 | "loanDurationSeconds": null, 141 | "amountOffered": null, 142 | "amountCancelled": null, 143 | "amountTaken": null, 144 | "amountRepayed": 0.122393078, 145 | "isRepayEscrow": true, 146 | "isDefaultEscrow": null 147 | } 148 | ], 149 | "paginationToken": "eyJibG9ja1RpbWUiOiIxNjc3OTU5NzE5IiwidHJhbnNhY3Rpb25JZCI6IjIxTlpta3FLZ0M0bzlyQllBSmZXZ2N4YzNKUXlKcjJxNlhEM3RyODR2QWQ1ZTV1SEFjd3FoOU1Nd3NSQ3lqamFNeGl3eURRbkVLcmM4cWpCeUs2ODc0ODUifQ==" 150 | } 151 | ``` 152 | 153 | By using the pagination token you can fetch events since the beginning of time. 154 | 155 | ## Dune 156 | 157 | Refer to this example query: https://dune.com/queries/2015361 158 | 159 | ## Custom Database Access 160 | 161 | Please open a support ticket in our [discord](http://discord.gg/sharkyfi) clearly describing the use-case. 162 | -------------------------------------------------------------------------------- /idl/sharky-1.0.0-beta.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.0", 3 | "name": "sharky", 4 | "instructions": [ 5 | { 6 | "name": "createOrderBook", 7 | "accounts": [ 8 | { 9 | "name": "sharkyKey", 10 | "isMut": false, 11 | "isSigner": true 12 | }, 13 | { 14 | "name": "funder", 15 | "isMut": true, 16 | "isSigner": true 17 | }, 18 | { 19 | "name": "orderBook", 20 | "isMut": true, 21 | "isSigner": true 22 | }, 23 | { 24 | "name": "systemProgram", 25 | "isMut": false, 26 | "isSigner": false 27 | } 28 | ], 29 | "args": [ 30 | { 31 | "name": "orderBookType", 32 | "type": { 33 | "defined": "OrderBookType" 34 | } 35 | }, 36 | { 37 | "name": "apy", 38 | "type": { 39 | "defined": "APY" 40 | } 41 | }, 42 | { 43 | "name": "loanTerms", 44 | "type": { 45 | "defined": "BookLoanTerms" 46 | } 47 | } 48 | ] 49 | }, 50 | { 51 | "name": "updateOrderBook", 52 | "accounts": [ 53 | { 54 | "name": "sharkyKey", 55 | "isMut": false, 56 | "isSigner": true 57 | }, 58 | { 59 | "name": "orderBook", 60 | "isMut": true, 61 | "isSigner": false 62 | } 63 | ], 64 | "args": [ 65 | { 66 | "name": "orderBookType", 67 | "type": { 68 | "option": { 69 | "defined": "OrderBookType" 70 | } 71 | } 72 | }, 73 | { 74 | "name": "apy", 75 | "type": { 76 | "option": { 77 | "defined": "APY" 78 | } 79 | } 80 | }, 81 | { 82 | "name": "loanTerms", 83 | "type": { 84 | "option": { 85 | "defined": "BookLoanTerms" 86 | } 87 | } 88 | } 89 | ] 90 | }, 91 | { 92 | "name": "closeOrderBook", 93 | "accounts": [ 94 | { 95 | "name": "sharkyKey", 96 | "isMut": false, 97 | "isSigner": true 98 | }, 99 | { 100 | "name": "fundee", 101 | "isMut": true, 102 | "isSigner": false 103 | }, 104 | { 105 | "name": "orderBook", 106 | "isMut": true, 107 | "isSigner": false 108 | } 109 | ], 110 | "args": [] 111 | }, 112 | { 113 | "name": "offerLoan", 114 | "accounts": [ 115 | { 116 | "name": "lender", 117 | "isMut": true, 118 | "isSigner": true 119 | }, 120 | { 121 | "name": "lenderTokenWallet", 122 | "isMut": true, 123 | "isSigner": false 124 | }, 125 | { 126 | "name": "loan", 127 | "isMut": true, 128 | "isSigner": true 129 | }, 130 | { 131 | "name": "escrow", 132 | "isMut": false, 133 | "isSigner": false 134 | }, 135 | { 136 | "name": "tokenMint", 137 | "isMut": false, 138 | "isSigner": false 139 | }, 140 | { 141 | "name": "escrowTokenAccount", 142 | "isMut": true, 143 | "isSigner": false 144 | }, 145 | { 146 | "name": "orderBook", 147 | "isMut": false, 148 | "isSigner": false 149 | }, 150 | { 151 | "name": "rent", 152 | "isMut": false, 153 | "isSigner": false 154 | }, 155 | { 156 | "name": "systemProgram", 157 | "isMut": false, 158 | "isSigner": false 159 | }, 160 | { 161 | "name": "tokenProgram", 162 | "isMut": false, 163 | "isSigner": false 164 | }, 165 | { 166 | "name": "associatedTokenProgram", 167 | "isMut": false, 168 | "isSigner": false 169 | } 170 | ], 171 | "args": [ 172 | { 173 | "name": "escrowBump", 174 | "type": "u8" 175 | }, 176 | { 177 | "name": "principalLamports", 178 | "type": "u64" 179 | }, 180 | { 181 | "name": "termsChoice", 182 | "type": { 183 | "option": { 184 | "defined": "LoanTermsSpec" 185 | } 186 | } 187 | } 188 | ] 189 | }, 190 | { 191 | "name": "rescindLoan", 192 | "accounts": [ 193 | { 194 | "name": "loan", 195 | "isMut": true, 196 | "isSigner": false 197 | }, 198 | { 199 | "name": "fundee", 200 | "isMut": true, 201 | "isSigner": false 202 | }, 203 | { 204 | "name": "tokensTo", 205 | "isMut": true, 206 | "isSigner": false 207 | }, 208 | { 209 | "name": "lenderWallet", 210 | "isMut": false, 211 | "isSigner": true 212 | }, 213 | { 214 | "name": "escrow", 215 | "isMut": false, 216 | "isSigner": false 217 | }, 218 | { 219 | "name": "escrowTokenAccount", 220 | "isMut": true, 221 | "isSigner": false 222 | }, 223 | { 224 | "name": "mint", 225 | "isMut": false, 226 | "isSigner": false 227 | }, 228 | { 229 | "name": "rent", 230 | "isMut": false, 231 | "isSigner": false 232 | }, 233 | { 234 | "name": "systemProgram", 235 | "isMut": false, 236 | "isSigner": false 237 | }, 238 | { 239 | "name": "tokenProgram", 240 | "isMut": false, 241 | "isSigner": false 242 | }, 243 | { 244 | "name": "associatedTokenProgram", 245 | "isMut": false, 246 | "isSigner": false 247 | } 248 | ], 249 | "args": [] 250 | }, 251 | { 252 | "name": "takeLoan", 253 | "accounts": [ 254 | { 255 | "name": "lender", 256 | "isMut": true, 257 | "isSigner": false 258 | }, 259 | { 260 | "name": "borrower", 261 | "isMut": true, 262 | "isSigner": true 263 | }, 264 | { 265 | "name": "borrowerTokenAccount", 266 | "isMut": true, 267 | "isSigner": false 268 | }, 269 | { 270 | "name": "valueTokenMint", 271 | "isMut": false, 272 | "isSigner": false 273 | }, 274 | { 275 | "name": "borrowerCollateralAccount", 276 | "isMut": true, 277 | "isSigner": false 278 | }, 279 | { 280 | "name": "collateralMint", 281 | "isMut": false, 282 | "isSigner": false 283 | }, 284 | { 285 | "name": "loan", 286 | "isMut": true, 287 | "isSigner": false 288 | }, 289 | { 290 | "name": "escrow", 291 | "isMut": false, 292 | "isSigner": false 293 | }, 294 | { 295 | "name": "escrowTokenAccount", 296 | "isMut": true, 297 | "isSigner": false 298 | }, 299 | { 300 | "name": "escrowCollateralAccount", 301 | "isMut": true, 302 | "isSigner": false 303 | }, 304 | { 305 | "name": "orderBook", 306 | "isMut": false, 307 | "isSigner": false 308 | }, 309 | { 310 | "name": "tokenProgram", 311 | "isMut": false, 312 | "isSigner": false 313 | }, 314 | { 315 | "name": "rent", 316 | "isMut": false, 317 | "isSigner": false 318 | }, 319 | { 320 | "name": "associatedTokenProgram", 321 | "isMut": false, 322 | "isSigner": false 323 | }, 324 | { 325 | "name": "systemProgram", 326 | "isMut": false, 327 | "isSigner": false 328 | } 329 | ], 330 | "args": [ 331 | { 332 | "name": "expectedLoan", 333 | "type": { 334 | "defined": "Loan" 335 | } 336 | }, 337 | { 338 | "name": "nftListIndex", 339 | "type": { 340 | "option": "u64" 341 | } 342 | } 343 | ] 344 | }, 345 | { 346 | "name": "forecloseLoan", 347 | "accounts": [ 348 | { 349 | "name": "loan", 350 | "isMut": true, 351 | "isSigner": false 352 | }, 353 | { 354 | "name": "fundee", 355 | "isMut": true, 356 | "isSigner": true 357 | }, 358 | { 359 | "name": "escrow", 360 | "isMut": false, 361 | "isSigner": false 362 | }, 363 | { 364 | "name": "escrowCollateralAccount", 365 | "isMut": true, 366 | "isSigner": false 367 | }, 368 | { 369 | "name": "collateralMint", 370 | "isMut": false, 371 | "isSigner": false 372 | }, 373 | { 374 | "name": "lender", 375 | "isMut": false, 376 | "isSigner": false 377 | }, 378 | { 379 | "name": "lenderCollateralAccount", 380 | "isMut": true, 381 | "isSigner": false 382 | }, 383 | { 384 | "name": "rent", 385 | "isMut": false, 386 | "isSigner": false 387 | }, 388 | { 389 | "name": "systemProgram", 390 | "isMut": false, 391 | "isSigner": false 392 | }, 393 | { 394 | "name": "tokenProgram", 395 | "isMut": false, 396 | "isSigner": false 397 | }, 398 | { 399 | "name": "associatedTokenProgram", 400 | "isMut": false, 401 | "isSigner": false 402 | } 403 | ], 404 | "args": [] 405 | }, 406 | { 407 | "name": "repayLoan", 408 | "accounts": [ 409 | { 410 | "name": "loan", 411 | "isMut": true, 412 | "isSigner": false 413 | }, 414 | { 415 | "name": "borrower", 416 | "isMut": true, 417 | "isSigner": true 418 | }, 419 | { 420 | "name": "borrowerTokenAccount", 421 | "isMut": true, 422 | "isSigner": false 423 | }, 424 | { 425 | "name": "borrowerCollateralAccount", 426 | "isMut": true, 427 | "isSigner": false 428 | }, 429 | { 430 | "name": "lender", 431 | "isMut": true, 432 | "isSigner": false 433 | }, 434 | { 435 | "name": "lenderTokenAccount", 436 | "isMut": true, 437 | "isSigner": false 438 | }, 439 | { 440 | "name": "escrow", 441 | "isMut": false, 442 | "isSigner": false 443 | }, 444 | { 445 | "name": "escrowCollateralAccount", 446 | "isMut": true, 447 | "isSigner": false 448 | }, 449 | { 450 | "name": "rent", 451 | "isMut": false, 452 | "isSigner": false 453 | }, 454 | { 455 | "name": "valueMint", 456 | "isMut": false, 457 | "isSigner": false 458 | }, 459 | { 460 | "name": "collateralMint", 461 | "isMut": false, 462 | "isSigner": false 463 | }, 464 | { 465 | "name": "tokenProgram", 466 | "isMut": false, 467 | "isSigner": false 468 | }, 469 | { 470 | "name": "associatedTokenProgram", 471 | "isMut": false, 472 | "isSigner": false 473 | }, 474 | { 475 | "name": "systemProgram", 476 | "isMut": false, 477 | "isSigner": false 478 | } 479 | ], 480 | "args": [] 481 | }, 482 | { 483 | "name": "createNftList", 484 | "accounts": [ 485 | { 486 | "name": "nftList", 487 | "isMut": true, 488 | "isSigner": false 489 | }, 490 | { 491 | "name": "sharkyKey", 492 | "isMut": false, 493 | "isSigner": true 494 | } 495 | ], 496 | "args": [ 497 | { 498 | "name": "collectionName", 499 | "type": "string" 500 | } 501 | ] 502 | }, 503 | { 504 | "name": "updateNftList", 505 | "accounts": [ 506 | { 507 | "name": "nftList", 508 | "isMut": true, 509 | "isSigner": false 510 | }, 511 | { 512 | "name": "sharkyKey", 513 | "isMut": false, 514 | "isSigner": true 515 | } 516 | ], 517 | "args": [ 518 | { 519 | "name": "mints", 520 | "type": { 521 | "vec": { 522 | "defined": "UpdateIndex" 523 | } 524 | } 525 | } 526 | ] 527 | }, 528 | { 529 | "name": "closeNftList", 530 | "accounts": [ 531 | { 532 | "name": "sharkyKey", 533 | "isMut": false, 534 | "isSigner": true 535 | }, 536 | { 537 | "name": "fundee", 538 | "isMut": true, 539 | "isSigner": false 540 | }, 541 | { 542 | "name": "nftList", 543 | "isMut": true, 544 | "isSigner": false 545 | } 546 | ], 547 | "args": [] 548 | } 549 | ], 550 | "accounts": [ 551 | { 552 | "name": "OrderBook", 553 | "type": { 554 | "kind": "struct", 555 | "fields": [ 556 | { 557 | "name": "version", 558 | "type": "u8" 559 | }, 560 | { 561 | "name": "orderBookType", 562 | "type": { 563 | "defined": "OrderBookType" 564 | } 565 | }, 566 | { 567 | "name": "apy", 568 | "type": { 569 | "defined": "APY" 570 | } 571 | }, 572 | { 573 | "name": "loanTerms", 574 | "type": { 575 | "defined": "BookLoanTerms" 576 | } 577 | } 578 | ] 579 | } 580 | }, 581 | { 582 | "name": "Loan", 583 | "type": { 584 | "kind": "struct", 585 | "fields": [ 586 | { 587 | "name": "version", 588 | "type": "u8" 589 | }, 590 | { 591 | "name": "principalLamports", 592 | "type": "u64" 593 | }, 594 | { 595 | "name": "orderBook", 596 | "type": "publicKey" 597 | }, 598 | { 599 | "name": "valueTokenMint", 600 | "type": "publicKey" 601 | }, 602 | { 603 | "name": "escrowBumpSeed", 604 | "type": "u8" 605 | }, 606 | { 607 | "name": "loanState", 608 | "type": { 609 | "defined": "LoanState" 610 | } 611 | } 612 | ] 613 | } 614 | }, 615 | { 616 | "name": "NFTList", 617 | "type": { 618 | "kind": "struct", 619 | "fields": [ 620 | { 621 | "name": "version", 622 | "type": "u8" 623 | }, 624 | { 625 | "name": "collectionName", 626 | "type": "string" 627 | } 628 | ] 629 | } 630 | } 631 | ], 632 | "types": [ 633 | { 634 | "name": "UpdateIndex", 635 | "type": { 636 | "kind": "struct", 637 | "fields": [ 638 | { 639 | "name": "index", 640 | "type": "u32" 641 | }, 642 | { 643 | "name": "mint", 644 | "type": "publicKey" 645 | } 646 | ] 647 | } 648 | }, 649 | { 650 | "name": "LoanOffer", 651 | "type": { 652 | "kind": "struct", 653 | "fields": [ 654 | { 655 | "name": "lenderWallet", 656 | "type": "publicKey" 657 | }, 658 | { 659 | "name": "termsSpec", 660 | "type": { 661 | "defined": "LoanTermsSpec" 662 | } 663 | } 664 | ] 665 | } 666 | }, 667 | { 668 | "name": "TakenLoan", 669 | "type": { 670 | "kind": "struct", 671 | "fields": [ 672 | { 673 | "name": "nftCollateralMint", 674 | "type": "publicKey" 675 | }, 676 | { 677 | "name": "lenderNoteMint", 678 | "type": "publicKey" 679 | }, 680 | { 681 | "name": "borrowerNoteMint", 682 | "type": "publicKey" 683 | }, 684 | { 685 | "name": "apy", 686 | "type": { 687 | "defined": "APY" 688 | } 689 | }, 690 | { 691 | "name": "terms", 692 | "type": { 693 | "defined": "LoanTerms" 694 | } 695 | } 696 | ] 697 | } 698 | }, 699 | { 700 | "name": "APY", 701 | "type": { 702 | "kind": "enum", 703 | "variants": [ 704 | { 705 | "name": "Fixed", 706 | "fields": [ 707 | { 708 | "name": "apy", 709 | "type": "u32" 710 | } 711 | ] 712 | } 713 | ] 714 | } 715 | }, 716 | { 717 | "name": "BookLoanTerms", 718 | "type": { 719 | "kind": "enum", 720 | "variants": [ 721 | { 722 | "name": "Fixed", 723 | "fields": [ 724 | { 725 | "name": "terms", 726 | "type": { 727 | "defined": "LoanTermsSpec" 728 | } 729 | } 730 | ] 731 | }, 732 | { 733 | "name": "LenderChooses" 734 | } 735 | ] 736 | } 737 | }, 738 | { 739 | "name": "LoanTermsSpec", 740 | "type": { 741 | "kind": "enum", 742 | "variants": [ 743 | { 744 | "name": "Time", 745 | "fields": [ 746 | { 747 | "name": "duration", 748 | "type": "u64" 749 | } 750 | ] 751 | } 752 | ] 753 | } 754 | }, 755 | { 756 | "name": "OrderBookType", 757 | "type": { 758 | "kind": "enum", 759 | "variants": [ 760 | { 761 | "name": "Collection", 762 | "fields": [ 763 | { 764 | "name": "collection_key", 765 | "type": "publicKey" 766 | } 767 | ] 768 | }, 769 | { 770 | "name": "NFTList", 771 | "fields": [ 772 | { 773 | "name": "list_account", 774 | "type": "publicKey" 775 | } 776 | ] 777 | } 778 | ] 779 | } 780 | }, 781 | { 782 | "name": "LoanTerms", 783 | "type": { 784 | "kind": "enum", 785 | "variants": [ 786 | { 787 | "name": "Time", 788 | "fields": [ 789 | { 790 | "name": "start", 791 | "type": "i64" 792 | }, 793 | { 794 | "name": "duration", 795 | "type": "u64" 796 | }, 797 | { 798 | "name": "total_owed_lamports", 799 | "type": "u64" 800 | } 801 | ] 802 | } 803 | ] 804 | } 805 | }, 806 | { 807 | "name": "LoanState", 808 | "type": { 809 | "kind": "enum", 810 | "variants": [ 811 | { 812 | "name": "Offer", 813 | "fields": [ 814 | { 815 | "name": "offer", 816 | "type": { 817 | "defined": "LoanOffer" 818 | } 819 | } 820 | ] 821 | }, 822 | { 823 | "name": "Taken", 824 | "fields": [ 825 | { 826 | "name": "taken", 827 | "type": { 828 | "defined": "TakenLoan" 829 | } 830 | } 831 | ] 832 | } 833 | ] 834 | } 835 | } 836 | ], 837 | "errors": [ 838 | { 839 | "code": 6000, 840 | "name": "Custom", 841 | "msg": "Custom" 842 | }, 843 | { 844 | "code": 6001, 845 | "name": "InvalidArgument", 846 | "msg": "InvalidArgument" 847 | }, 848 | { 849 | "code": 6002, 850 | "name": "InvalidAccountData", 851 | "msg": "InvalidAccountData" 852 | }, 853 | { 854 | "code": 6003, 855 | "name": "IllegalOwner", 856 | "msg": "IllegalOwner" 857 | } 858 | ] 859 | } 860 | -------------------------------------------------------------------------------- /idl/sharky-2.0.0-beta.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.0", 3 | "name": "sharky", 4 | "instructions": [ 5 | { 6 | "name": "createOrderBook", 7 | "accounts": [ 8 | { 9 | "name": "sharkyKey", 10 | "isMut": false, 11 | "isSigner": true 12 | }, 13 | { 14 | "name": "funder", 15 | "isMut": true, 16 | "isSigner": true 17 | }, 18 | { 19 | "name": "orderBook", 20 | "isMut": true, 21 | "isSigner": true 22 | }, 23 | { 24 | "name": "systemProgram", 25 | "isMut": false, 26 | "isSigner": false 27 | } 28 | ], 29 | "args": [ 30 | { 31 | "name": "orderBookType", 32 | "type": { 33 | "defined": "OrderBookType" 34 | } 35 | }, 36 | { 37 | "name": "apy", 38 | "type": { 39 | "defined": "APY" 40 | } 41 | }, 42 | { 43 | "name": "loanTerms", 44 | "type": { 45 | "defined": "BookLoanTerms" 46 | } 47 | } 48 | ] 49 | }, 50 | { 51 | "name": "updateOrderBook", 52 | "accounts": [ 53 | { 54 | "name": "sharkyKey", 55 | "isMut": false, 56 | "isSigner": true 57 | }, 58 | { 59 | "name": "orderBook", 60 | "isMut": true, 61 | "isSigner": false 62 | } 63 | ], 64 | "args": [ 65 | { 66 | "name": "orderBookType", 67 | "type": { 68 | "option": { 69 | "defined": "OrderBookType" 70 | } 71 | } 72 | }, 73 | { 74 | "name": "apy", 75 | "type": { 76 | "option": { 77 | "defined": "APY" 78 | } 79 | } 80 | }, 81 | { 82 | "name": "loanTerms", 83 | "type": { 84 | "option": { 85 | "defined": "BookLoanTerms" 86 | } 87 | } 88 | } 89 | ] 90 | }, 91 | { 92 | "name": "closeOrderBook", 93 | "accounts": [ 94 | { 95 | "name": "sharkyKey", 96 | "isMut": false, 97 | "isSigner": true 98 | }, 99 | { 100 | "name": "fundee", 101 | "isMut": true, 102 | "isSigner": false 103 | }, 104 | { 105 | "name": "orderBook", 106 | "isMut": true, 107 | "isSigner": false 108 | } 109 | ], 110 | "args": [] 111 | }, 112 | { 113 | "name": "offerLoan", 114 | "accounts": [ 115 | { 116 | "name": "lender", 117 | "isMut": true, 118 | "isSigner": true 119 | }, 120 | { 121 | "name": "lenderTokenWallet", 122 | "isMut": true, 123 | "isSigner": false 124 | }, 125 | { 126 | "name": "loan", 127 | "isMut": true, 128 | "isSigner": true 129 | }, 130 | { 131 | "name": "escrow", 132 | "isMut": false, 133 | "isSigner": false 134 | }, 135 | { 136 | "name": "escrowTokenAccount", 137 | "isMut": true, 138 | "isSigner": false 139 | }, 140 | { 141 | "name": "orderBook", 142 | "isMut": false, 143 | "isSigner": false 144 | }, 145 | { 146 | "name": "systemProgram", 147 | "isMut": false, 148 | "isSigner": false 149 | }, 150 | { 151 | "name": "tokenProgram", 152 | "isMut": false, 153 | "isSigner": false 154 | } 155 | ], 156 | "args": [ 157 | { 158 | "name": "escrowBump", 159 | "type": "u8" 160 | }, 161 | { 162 | "name": "principalLamports", 163 | "type": "u64" 164 | }, 165 | { 166 | "name": "termsChoice", 167 | "type": { 168 | "option": { 169 | "defined": "LoanTermsSpec" 170 | } 171 | } 172 | } 173 | ] 174 | }, 175 | { 176 | "name": "rescindLoan", 177 | "accounts": [ 178 | { 179 | "name": "loan", 180 | "isMut": true, 181 | "isSigner": false 182 | }, 183 | { 184 | "name": "fundee", 185 | "isMut": true, 186 | "isSigner": false 187 | }, 188 | { 189 | "name": "tokensTo", 190 | "isMut": true, 191 | "isSigner": false 192 | }, 193 | { 194 | "name": "lenderWallet", 195 | "isMut": false, 196 | "isSigner": true 197 | }, 198 | { 199 | "name": "escrow", 200 | "isMut": false, 201 | "isSigner": false 202 | }, 203 | { 204 | "name": "escrowTokenAccount", 205 | "isMut": true, 206 | "isSigner": false 207 | }, 208 | { 209 | "name": "rent", 210 | "isMut": false, 211 | "isSigner": false 212 | }, 213 | { 214 | "name": "tokenProgram", 215 | "isMut": false, 216 | "isSigner": false 217 | } 218 | ], 219 | "args": [] 220 | }, 221 | { 222 | "name": "takeLoan", 223 | "accounts": [ 224 | { 225 | "name": "lender", 226 | "isMut": true, 227 | "isSigner": false 228 | }, 229 | { 230 | "name": "borrower", 231 | "isMut": true, 232 | "isSigner": true 233 | }, 234 | { 235 | "name": "borrowerTokenAccount", 236 | "isMut": true, 237 | "isSigner": false 238 | }, 239 | { 240 | "name": "borrowerCollateralAccount", 241 | "isMut": true, 242 | "isSigner": false 243 | }, 244 | { 245 | "name": "collateralMint", 246 | "isMut": true, 247 | "isSigner": false 248 | }, 249 | { 250 | "name": "loan", 251 | "isMut": true, 252 | "isSigner": false 253 | }, 254 | { 255 | "name": "escrow", 256 | "isMut": true, 257 | "isSigner": false 258 | }, 259 | { 260 | "name": "escrowTokenAccount", 261 | "isMut": true, 262 | "isSigner": false 263 | }, 264 | { 265 | "name": "escrowCollateralAccount", 266 | "isMut": true, 267 | "isSigner": false 268 | }, 269 | { 270 | "name": "orderBook", 271 | "isMut": false, 272 | "isSigner": false 273 | }, 274 | { 275 | "name": "tokenProgram", 276 | "isMut": false, 277 | "isSigner": false 278 | } 279 | ], 280 | "args": [ 281 | { 282 | "name": "expectedLoan", 283 | "type": { 284 | "defined": "Loan" 285 | } 286 | }, 287 | { 288 | "name": "nftListIndex", 289 | "type": { 290 | "option": "u64" 291 | } 292 | } 293 | ] 294 | }, 295 | { 296 | "name": "transferAndFreezeCollateral", 297 | "accounts": [ 298 | { 299 | "name": "borrower", 300 | "isMut": false, 301 | "isSigner": true 302 | }, 303 | { 304 | "name": "borrowerCollateralAccount", 305 | "isMut": true, 306 | "isSigner": false 307 | }, 308 | { 309 | "name": "collateralMint", 310 | "isMut": true, 311 | "isSigner": false 312 | }, 313 | { 314 | "name": "loan", 315 | "isMut": true, 316 | "isSigner": false 317 | }, 318 | { 319 | "name": "escrow", 320 | "isMut": true, 321 | "isSigner": false 322 | }, 323 | { 324 | "name": "escrowCollateralAccount", 325 | "isMut": true, 326 | "isSigner": false 327 | }, 328 | { 329 | "name": "tokenManager", 330 | "isMut": true, 331 | "isSigner": false 332 | }, 333 | { 334 | "name": "tokenManagerTokenAccount", 335 | "isMut": true, 336 | "isSigner": false 337 | }, 338 | { 339 | "name": "mintCounter", 340 | "isMut": true, 341 | "isSigner": false 342 | }, 343 | { 344 | "name": "tokenManagerProgram", 345 | "isMut": false, 346 | "isSigner": false 347 | }, 348 | { 349 | "name": "tokenProgram", 350 | "isMut": false, 351 | "isSigner": false 352 | }, 353 | { 354 | "name": "systemProgram", 355 | "isMut": false, 356 | "isSigner": false 357 | } 358 | ], 359 | "args": [] 360 | }, 361 | { 362 | "name": "forecloseLoan", 363 | "accounts": [ 364 | { 365 | "name": "loan", 366 | "isMut": true, 367 | "isSigner": false 368 | }, 369 | { 370 | "name": "fundee", 371 | "isMut": true, 372 | "isSigner": true 373 | }, 374 | { 375 | "name": "escrow", 376 | "isMut": true, 377 | "isSigner": false 378 | }, 379 | { 380 | "name": "escrowCollateralAccount", 381 | "isMut": true, 382 | "isSigner": false 383 | }, 384 | { 385 | "name": "collateralMint", 386 | "isMut": true, 387 | "isSigner": false 388 | }, 389 | { 390 | "name": "lender", 391 | "isMut": false, 392 | "isSigner": false 393 | }, 394 | { 395 | "name": "lenderCollateralAccount", 396 | "isMut": true, 397 | "isSigner": false 398 | }, 399 | { 400 | "name": "tokenManager", 401 | "isMut": true, 402 | "isSigner": false 403 | }, 404 | { 405 | "name": "tokenManagerTokenAccount", 406 | "isMut": true, 407 | "isSigner": false 408 | }, 409 | { 410 | "name": "borrowerCollateralAccount", 411 | "isMut": true, 412 | "isSigner": false 413 | }, 414 | { 415 | "name": "collector", 416 | "isMut": true, 417 | "isSigner": false 418 | }, 419 | { 420 | "name": "tokenManagerProgram", 421 | "isMut": false, 422 | "isSigner": false 423 | }, 424 | { 425 | "name": "rent", 426 | "isMut": false, 427 | "isSigner": false 428 | }, 429 | { 430 | "name": "tokenProgram", 431 | "isMut": false, 432 | "isSigner": false 433 | } 434 | ], 435 | "args": [] 436 | }, 437 | { 438 | "name": "repayLoan", 439 | "accounts": [ 440 | { 441 | "name": "loan", 442 | "isMut": true, 443 | "isSigner": false 444 | }, 445 | { 446 | "name": "borrower", 447 | "isMut": true, 448 | "isSigner": true 449 | }, 450 | { 451 | "name": "borrowerTokenAccount", 452 | "isMut": true, 453 | "isSigner": false 454 | }, 455 | { 456 | "name": "borrowerCollateralAccount", 457 | "isMut": true, 458 | "isSigner": false 459 | }, 460 | { 461 | "name": "lender", 462 | "isMut": true, 463 | "isSigner": false 464 | }, 465 | { 466 | "name": "lenderTokenAccount", 467 | "isMut": true, 468 | "isSigner": false 469 | }, 470 | { 471 | "name": "escrow", 472 | "isMut": true, 473 | "isSigner": false 474 | }, 475 | { 476 | "name": "escrowCollateralAccount", 477 | "isMut": true, 478 | "isSigner": false 479 | }, 480 | { 481 | "name": "rent", 482 | "isMut": false, 483 | "isSigner": false 484 | }, 485 | { 486 | "name": "valueMint", 487 | "isMut": false, 488 | "isSigner": false 489 | }, 490 | { 491 | "name": "collateralMint", 492 | "isMut": true, 493 | "isSigner": false 494 | }, 495 | { 496 | "name": "tokenManager", 497 | "isMut": true, 498 | "isSigner": false 499 | }, 500 | { 501 | "name": "tokenManagerTokenAccount", 502 | "isMut": true, 503 | "isSigner": false 504 | }, 505 | { 506 | "name": "collector", 507 | "isMut": true, 508 | "isSigner": false 509 | }, 510 | { 511 | "name": "tokenManagerProgram", 512 | "isMut": false, 513 | "isSigner": false 514 | }, 515 | { 516 | "name": "tokenProgram", 517 | "isMut": false, 518 | "isSigner": false 519 | }, 520 | { 521 | "name": "systemProgram", 522 | "isMut": false, 523 | "isSigner": false 524 | } 525 | ], 526 | "args": [] 527 | }, 528 | { 529 | "name": "forecloseLoanEscrow", 530 | "accounts": [ 531 | { 532 | "name": "loan", 533 | "isMut": true, 534 | "isSigner": false 535 | }, 536 | { 537 | "name": "fundee", 538 | "isMut": true, 539 | "isSigner": true 540 | }, 541 | { 542 | "name": "escrow", 543 | "isMut": true, 544 | "isSigner": false 545 | }, 546 | { 547 | "name": "escrowCollateralAccount", 548 | "isMut": true, 549 | "isSigner": false 550 | }, 551 | { 552 | "name": "collateralMint", 553 | "isMut": false, 554 | "isSigner": false 555 | }, 556 | { 557 | "name": "lender", 558 | "isMut": false, 559 | "isSigner": false 560 | }, 561 | { 562 | "name": "lenderCollateralAccount", 563 | "isMut": true, 564 | "isSigner": false 565 | }, 566 | { 567 | "name": "tokenProgram", 568 | "isMut": false, 569 | "isSigner": false 570 | } 571 | ], 572 | "args": [] 573 | }, 574 | { 575 | "name": "repayLoanEscrow", 576 | "accounts": [ 577 | { 578 | "name": "loan", 579 | "isMut": true, 580 | "isSigner": false 581 | }, 582 | { 583 | "name": "borrower", 584 | "isMut": true, 585 | "isSigner": true 586 | }, 587 | { 588 | "name": "borrowerTokenAccount", 589 | "isMut": true, 590 | "isSigner": false 591 | }, 592 | { 593 | "name": "borrowerCollateralAccount", 594 | "isMut": true, 595 | "isSigner": false 596 | }, 597 | { 598 | "name": "lender", 599 | "isMut": true, 600 | "isSigner": false 601 | }, 602 | { 603 | "name": "lenderTokenAccount", 604 | "isMut": true, 605 | "isSigner": false 606 | }, 607 | { 608 | "name": "escrow", 609 | "isMut": true, 610 | "isSigner": false 611 | }, 612 | { 613 | "name": "escrowCollateralAccount", 614 | "isMut": true, 615 | "isSigner": false 616 | }, 617 | { 618 | "name": "rent", 619 | "isMut": false, 620 | "isSigner": false 621 | }, 622 | { 623 | "name": "valueMint", 624 | "isMut": false, 625 | "isSigner": false 626 | }, 627 | { 628 | "name": "collateralMint", 629 | "isMut": false, 630 | "isSigner": false 631 | }, 632 | { 633 | "name": "tokenProgram", 634 | "isMut": false, 635 | "isSigner": false 636 | }, 637 | { 638 | "name": "systemProgram", 639 | "isMut": false, 640 | "isSigner": false 641 | } 642 | ], 643 | "args": [] 644 | }, 645 | { 646 | "name": "createNftList", 647 | "accounts": [ 648 | { 649 | "name": "nftList", 650 | "isMut": true, 651 | "isSigner": false 652 | }, 653 | { 654 | "name": "sharkyKey", 655 | "isMut": false, 656 | "isSigner": true 657 | } 658 | ], 659 | "args": [ 660 | { 661 | "name": "collectionName", 662 | "type": "string" 663 | } 664 | ] 665 | }, 666 | { 667 | "name": "updateNftList", 668 | "accounts": [ 669 | { 670 | "name": "nftList", 671 | "isMut": true, 672 | "isSigner": false 673 | }, 674 | { 675 | "name": "sharkyKey", 676 | "isMut": false, 677 | "isSigner": true 678 | } 679 | ], 680 | "args": [ 681 | { 682 | "name": "mints", 683 | "type": { 684 | "vec": { 685 | "defined": "UpdateIndex" 686 | } 687 | } 688 | } 689 | ] 690 | }, 691 | { 692 | "name": "closeNftList", 693 | "accounts": [ 694 | { 695 | "name": "sharkyKey", 696 | "isMut": false, 697 | "isSigner": true 698 | }, 699 | { 700 | "name": "fundee", 701 | "isMut": true, 702 | "isSigner": false 703 | }, 704 | { 705 | "name": "nftList", 706 | "isMut": true, 707 | "isSigner": false 708 | } 709 | ], 710 | "args": [] 711 | } 712 | ], 713 | "accounts": [ 714 | { 715 | "name": "OrderBook", 716 | "type": { 717 | "kind": "struct", 718 | "fields": [ 719 | { 720 | "name": "version", 721 | "type": "u8" 722 | }, 723 | { 724 | "name": "orderBookType", 725 | "type": { 726 | "defined": "OrderBookType" 727 | } 728 | }, 729 | { 730 | "name": "apy", 731 | "type": { 732 | "defined": "APY" 733 | } 734 | }, 735 | { 736 | "name": "loanTerms", 737 | "type": { 738 | "defined": "BookLoanTerms" 739 | } 740 | } 741 | ] 742 | } 743 | }, 744 | { 745 | "name": "Loan", 746 | "type": { 747 | "kind": "struct", 748 | "fields": [ 749 | { 750 | "name": "version", 751 | "type": "u8" 752 | }, 753 | { 754 | "name": "principalLamports", 755 | "type": "u64" 756 | }, 757 | { 758 | "name": "orderBook", 759 | "type": "publicKey" 760 | }, 761 | { 762 | "name": "valueTokenMint", 763 | "type": "publicKey" 764 | }, 765 | { 766 | "name": "escrowBumpSeed", 767 | "type": "u8" 768 | }, 769 | { 770 | "name": "loanState", 771 | "type": { 772 | "defined": "LoanState" 773 | } 774 | } 775 | ] 776 | } 777 | }, 778 | { 779 | "name": "NFTList", 780 | "type": { 781 | "kind": "struct", 782 | "fields": [ 783 | { 784 | "name": "version", 785 | "type": "u8" 786 | }, 787 | { 788 | "name": "collectionName", 789 | "type": "string" 790 | } 791 | ] 792 | } 793 | } 794 | ], 795 | "types": [ 796 | { 797 | "name": "LoanOffer", 798 | "type": { 799 | "kind": "struct", 800 | "fields": [ 801 | { 802 | "name": "lenderWallet", 803 | "type": "publicKey" 804 | }, 805 | { 806 | "name": "termsSpec", 807 | "type": { 808 | "defined": "LoanTermsSpec" 809 | } 810 | }, 811 | { 812 | "name": "offerTime", 813 | "type": "i64" 814 | } 815 | ] 816 | } 817 | }, 818 | { 819 | "name": "TakenLoan", 820 | "type": { 821 | "kind": "struct", 822 | "fields": [ 823 | { 824 | "name": "nftCollateralMint", 825 | "type": "publicKey" 826 | }, 827 | { 828 | "name": "lenderNoteMint", 829 | "type": "publicKey" 830 | }, 831 | { 832 | "name": "borrowerNoteMint", 833 | "type": "publicKey" 834 | }, 835 | { 836 | "name": "apy", 837 | "type": { 838 | "defined": "APY" 839 | } 840 | }, 841 | { 842 | "name": "terms", 843 | "type": { 844 | "defined": "LoanTerms" 845 | } 846 | } 847 | ] 848 | } 849 | }, 850 | { 851 | "name": "UpdateIndex", 852 | "type": { 853 | "kind": "struct", 854 | "fields": [ 855 | { 856 | "name": "index", 857 | "type": "u32" 858 | }, 859 | { 860 | "name": "mint", 861 | "type": "publicKey" 862 | } 863 | ] 864 | } 865 | }, 866 | { 867 | "name": "ErrorCode", 868 | "type": { 869 | "kind": "enum", 870 | "variants": [ 871 | { 872 | "name": "Custom" 873 | }, 874 | { 875 | "name": "InvalidArgument" 876 | }, 877 | { 878 | "name": "InvalidAccountData" 879 | }, 880 | { 881 | "name": "IllegalOwner" 882 | }, 883 | { 884 | "name": "LoanIsCardinal" 885 | }, 886 | { 887 | "name": "LoanIsEscrow" 888 | }, 889 | { 890 | "name": "InvalidMint" 891 | } 892 | ] 893 | } 894 | }, 895 | { 896 | "name": "APY", 897 | "type": { 898 | "kind": "enum", 899 | "variants": [ 900 | { 901 | "name": "Fixed", 902 | "fields": [ 903 | { 904 | "name": "apy", 905 | "type": "u32" 906 | } 907 | ] 908 | } 909 | ] 910 | } 911 | }, 912 | { 913 | "name": "BookLoanTerms", 914 | "type": { 915 | "kind": "enum", 916 | "variants": [ 917 | { 918 | "name": "Fixed", 919 | "fields": [ 920 | { 921 | "name": "terms", 922 | "type": { 923 | "defined": "LoanTermsSpec" 924 | } 925 | } 926 | ] 927 | }, 928 | { 929 | "name": "LenderChooses" 930 | } 931 | ] 932 | } 933 | }, 934 | { 935 | "name": "LoanTermsSpec", 936 | "type": { 937 | "kind": "enum", 938 | "variants": [ 939 | { 940 | "name": "Time", 941 | "fields": [ 942 | { 943 | "name": "duration", 944 | "type": "u64" 945 | } 946 | ] 947 | } 948 | ] 949 | } 950 | }, 951 | { 952 | "name": "OrderBookType", 953 | "type": { 954 | "kind": "enum", 955 | "variants": [ 956 | { 957 | "name": "Collection", 958 | "fields": [ 959 | { 960 | "name": "collection_key", 961 | "type": "publicKey" 962 | } 963 | ] 964 | }, 965 | { 966 | "name": "NFTList", 967 | "fields": [ 968 | { 969 | "name": "list_account", 970 | "type": "publicKey" 971 | } 972 | ] 973 | } 974 | ] 975 | } 976 | }, 977 | { 978 | "name": "LoanTerms", 979 | "type": { 980 | "kind": "enum", 981 | "variants": [ 982 | { 983 | "name": "Time", 984 | "fields": [ 985 | { 986 | "name": "start", 987 | "type": "i64" 988 | }, 989 | { 990 | "name": "duration", 991 | "type": "u64" 992 | }, 993 | { 994 | "name": "total_owed_lamports", 995 | "type": "u64" 996 | } 997 | ] 998 | } 999 | ] 1000 | } 1001 | }, 1002 | { 1003 | "name": "LoanState", 1004 | "type": { 1005 | "kind": "enum", 1006 | "variants": [ 1007 | { 1008 | "name": "Offer", 1009 | "fields": [ 1010 | { 1011 | "name": "offer", 1012 | "type": { 1013 | "defined": "LoanOffer" 1014 | } 1015 | } 1016 | ] 1017 | }, 1018 | { 1019 | "name": "Taken", 1020 | "fields": [ 1021 | { 1022 | "name": "taken", 1023 | "type": { 1024 | "defined": "TakenLoan" 1025 | } 1026 | } 1027 | ] 1028 | } 1029 | ] 1030 | } 1031 | } 1032 | ] 1033 | } 1034 | -------------------------------------------------------------------------------- /idl/sharky-3.0.0.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "3.0.0", 3 | "name": "sharky", 4 | "instructions": [ 5 | { 6 | "name": "createOrderBook", 7 | "accounts": [ 8 | { 9 | "name": "orderBook", 10 | "isMut": true, 11 | "isSigner": true 12 | }, 13 | { 14 | "name": "payer", 15 | "isMut": true, 16 | "isSigner": true 17 | }, 18 | { 19 | "name": "systemProgram", 20 | "isMut": false, 21 | "isSigner": false 22 | } 23 | ], 24 | "args": [ 25 | { 26 | "name": "orderBookType", 27 | "type": { 28 | "defined": "OrderBookType" 29 | } 30 | }, 31 | { 32 | "name": "apy", 33 | "type": { 34 | "defined": "APY" 35 | } 36 | }, 37 | { 38 | "name": "loanTerms", 39 | "type": { 40 | "defined": "BookLoanTerms" 41 | } 42 | }, 43 | { 44 | "name": "feePermillicentage", 45 | "type": "u16" 46 | }, 47 | { 48 | "name": "feeAuthority", 49 | "type": "publicKey" 50 | } 51 | ] 52 | }, 53 | { 54 | "name": "updateOrderBook", 55 | "accounts": [ 56 | { 57 | "name": "orderBook", 58 | "isMut": true, 59 | "isSigner": false 60 | }, 61 | { 62 | "name": "payer", 63 | "isMut": false, 64 | "isSigner": true 65 | } 66 | ], 67 | "args": [ 68 | { 69 | "name": "orderBookType", 70 | "type": { 71 | "option": { 72 | "defined": "OrderBookType" 73 | } 74 | } 75 | }, 76 | { 77 | "name": "apy", 78 | "type": { 79 | "option": { 80 | "defined": "APY" 81 | } 82 | } 83 | }, 84 | { 85 | "name": "loanTerms", 86 | "type": { 87 | "option": { 88 | "defined": "BookLoanTerms" 89 | } 90 | } 91 | }, 92 | { 93 | "name": "feePermillicentage", 94 | "type": { 95 | "option": "u16" 96 | } 97 | }, 98 | { 99 | "name": "feeAuthority", 100 | "type": { 101 | "option": "publicKey" 102 | } 103 | } 104 | ] 105 | }, 106 | { 107 | "name": "closeOrderBook", 108 | "accounts": [ 109 | { 110 | "name": "orderBook", 111 | "isMut": true, 112 | "isSigner": false 113 | }, 114 | { 115 | "name": "payer", 116 | "isMut": false, 117 | "isSigner": true 118 | } 119 | ], 120 | "args": [] 121 | }, 122 | { 123 | "name": "offerLoan", 124 | "accounts": [ 125 | { 126 | "name": "lender", 127 | "isMut": true, 128 | "isSigner": true 129 | }, 130 | { 131 | "name": "lenderValueTokenAccount", 132 | "isMut": true, 133 | "isSigner": false 134 | }, 135 | { 136 | "name": "valueMint", 137 | "isMut": false, 138 | "isSigner": false 139 | }, 140 | { 141 | "name": "loan", 142 | "isMut": true, 143 | "isSigner": true 144 | }, 145 | { 146 | "name": "escrow", 147 | "isMut": true, 148 | "isSigner": false 149 | }, 150 | { 151 | "name": "escrowTokenAccount", 152 | "isMut": true, 153 | "isSigner": false 154 | }, 155 | { 156 | "name": "orderBook", 157 | "isMut": false, 158 | "isSigner": false 159 | }, 160 | { 161 | "name": "systemProgram", 162 | "isMut": false, 163 | "isSigner": false 164 | }, 165 | { 166 | "name": "tokenProgram", 167 | "isMut": false, 168 | "isSigner": false 169 | }, 170 | { 171 | "name": "associatedTokenProgram", 172 | "isMut": false, 173 | "isSigner": false 174 | }, 175 | { 176 | "name": "rent", 177 | "isMut": false, 178 | "isSigner": false 179 | } 180 | ], 181 | "args": [ 182 | { 183 | "name": "escrowBump", 184 | "type": "u8" 185 | }, 186 | { 187 | "name": "principalLamports", 188 | "type": "u64" 189 | }, 190 | { 191 | "name": "termsChoice", 192 | "type": { 193 | "option": { 194 | "defined": "LoanTermsSpec" 195 | } 196 | } 197 | } 198 | ] 199 | }, 200 | { 201 | "name": "rescindLoan", 202 | "accounts": [ 203 | { 204 | "name": "loan", 205 | "isMut": true, 206 | "isSigner": false 207 | }, 208 | { 209 | "name": "lenderValueTokenAccount", 210 | "isMut": true, 211 | "isSigner": false 212 | }, 213 | { 214 | "name": "lender", 215 | "isMut": false, 216 | "isSigner": true 217 | }, 218 | { 219 | "name": "valueMint", 220 | "isMut": false, 221 | "isSigner": false 222 | }, 223 | { 224 | "name": "escrow", 225 | "isMut": true, 226 | "isSigner": false 227 | }, 228 | { 229 | "name": "escrowTokenAccount", 230 | "isMut": true, 231 | "isSigner": false 232 | }, 233 | { 234 | "name": "systemProgram", 235 | "isMut": false, 236 | "isSigner": false 237 | }, 238 | { 239 | "name": "tokenProgram", 240 | "isMut": false, 241 | "isSigner": false 242 | } 243 | ], 244 | "args": [] 245 | }, 246 | { 247 | "name": "takeLoan", 248 | "accounts": [ 249 | { 250 | "name": "lender", 251 | "isMut": true, 252 | "isSigner": false 253 | }, 254 | { 255 | "name": "borrower", 256 | "isMut": true, 257 | "isSigner": true 258 | }, 259 | { 260 | "name": "borrowerValueTokenAccount", 261 | "isMut": true, 262 | "isSigner": false 263 | }, 264 | { 265 | "name": "borrowerCollateralAccount", 266 | "isMut": true, 267 | "isSigner": false 268 | }, 269 | { 270 | "name": "valueMint", 271 | "isMut": false, 272 | "isSigner": false 273 | }, 274 | { 275 | "name": "collateralMint", 276 | "isMut": true, 277 | "isSigner": false 278 | }, 279 | { 280 | "name": "loan", 281 | "isMut": true, 282 | "isSigner": false 283 | }, 284 | { 285 | "name": "escrow", 286 | "isMut": true, 287 | "isSigner": false 288 | }, 289 | { 290 | "name": "escrowTokenAccount", 291 | "isMut": true, 292 | "isSigner": false 293 | }, 294 | { 295 | "name": "escrowCollateralTokenAccount", 296 | "isMut": true, 297 | "isSigner": false 298 | }, 299 | { 300 | "name": "orderBook", 301 | "isMut": false, 302 | "isSigner": false 303 | }, 304 | { 305 | "name": "systemProgram", 306 | "isMut": false, 307 | "isSigner": false 308 | }, 309 | { 310 | "name": "tokenProgram", 311 | "isMut": false, 312 | "isSigner": false 313 | }, 314 | { 315 | "name": "associatedTokenProgram", 316 | "isMut": false, 317 | "isSigner": false 318 | }, 319 | { 320 | "name": "rent", 321 | "isMut": false, 322 | "isSigner": false 323 | } 324 | ], 325 | "args": [ 326 | { 327 | "name": "expectedLoan", 328 | "type": { 329 | "defined": "Loan" 330 | } 331 | }, 332 | { 333 | "name": "nftListIndex", 334 | "type": { 335 | "option": "u64" 336 | } 337 | } 338 | ] 339 | }, 340 | { 341 | "name": "transferAndFreezeCollateral", 342 | "accounts": [ 343 | { 344 | "name": "borrower", 345 | "isMut": false, 346 | "isSigner": true 347 | }, 348 | { 349 | "name": "borrowerCollateralAccount", 350 | "isMut": true, 351 | "isSigner": false 352 | }, 353 | { 354 | "name": "collateralMint", 355 | "isMut": true, 356 | "isSigner": false 357 | }, 358 | { 359 | "name": "loan", 360 | "isMut": true, 361 | "isSigner": false 362 | }, 363 | { 364 | "name": "escrow", 365 | "isMut": true, 366 | "isSigner": false 367 | }, 368 | { 369 | "name": "escrowCollateralTokenAccount", 370 | "isMut": false, 371 | "isSigner": false 372 | }, 373 | { 374 | "name": "tokenManager", 375 | "isMut": true, 376 | "isSigner": false 377 | }, 378 | { 379 | "name": "tokenManagerTokenAccount", 380 | "isMut": true, 381 | "isSigner": false 382 | }, 383 | { 384 | "name": "mintCounter", 385 | "isMut": true, 386 | "isSigner": false 387 | }, 388 | { 389 | "name": "tokenManagerProgram", 390 | "isMut": false, 391 | "isSigner": false 392 | }, 393 | { 394 | "name": "tokenProgram", 395 | "isMut": false, 396 | "isSigner": false 397 | }, 398 | { 399 | "name": "systemProgram", 400 | "isMut": false, 401 | "isSigner": false 402 | } 403 | ], 404 | "args": [] 405 | }, 406 | { 407 | "name": "forecloseLoan", 408 | "accounts": [ 409 | { 410 | "name": "loan", 411 | "isMut": true, 412 | "isSigner": false 413 | }, 414 | { 415 | "name": "escrow", 416 | "isMut": true, 417 | "isSigner": false 418 | }, 419 | { 420 | "name": "escrowCollateralTokenAccount", 421 | "isMut": true, 422 | "isSigner": false 423 | }, 424 | { 425 | "name": "collateralMint", 426 | "isMut": true, 427 | "isSigner": false 428 | }, 429 | { 430 | "name": "lender", 431 | "isMut": false, 432 | "isSigner": true 433 | }, 434 | { 435 | "name": "lenderCollateralAccount", 436 | "isMut": true, 437 | "isSigner": false 438 | }, 439 | { 440 | "name": "tokenManager", 441 | "isMut": true, 442 | "isSigner": false 443 | }, 444 | { 445 | "name": "tokenManagerTokenAccount", 446 | "isMut": true, 447 | "isSigner": false 448 | }, 449 | { 450 | "name": "borrowerCollateralAccount", 451 | "isMut": true, 452 | "isSigner": false 453 | }, 454 | { 455 | "name": "collector", 456 | "isMut": true, 457 | "isSigner": false 458 | }, 459 | { 460 | "name": "tokenManagerProgram", 461 | "isMut": false, 462 | "isSigner": false 463 | }, 464 | { 465 | "name": "tokenProgram", 466 | "isMut": false, 467 | "isSigner": false 468 | }, 469 | { 470 | "name": "rent", 471 | "isMut": false, 472 | "isSigner": false 473 | } 474 | ], 475 | "args": [] 476 | }, 477 | { 478 | "name": "repayLoan", 479 | "accounts": [ 480 | { 481 | "name": "loan", 482 | "isMut": true, 483 | "isSigner": false 484 | }, 485 | { 486 | "name": "borrower", 487 | "isMut": true, 488 | "isSigner": true 489 | }, 490 | { 491 | "name": "borrowerValueTokenAccount", 492 | "isMut": true, 493 | "isSigner": false 494 | }, 495 | { 496 | "name": "borrowerCollateralAccount", 497 | "isMut": true, 498 | "isSigner": false 499 | }, 500 | { 501 | "name": "lender", 502 | "isMut": true, 503 | "isSigner": false 504 | }, 505 | { 506 | "name": "lenderValueTokenAccount", 507 | "isMut": true, 508 | "isSigner": false 509 | }, 510 | { 511 | "name": "escrow", 512 | "isMut": true, 513 | "isSigner": false 514 | }, 515 | { 516 | "name": "escrowCollateralTokenAccount", 517 | "isMut": true, 518 | "isSigner": false 519 | }, 520 | { 521 | "name": "valueMint", 522 | "isMut": false, 523 | "isSigner": false 524 | }, 525 | { 526 | "name": "collateralMint", 527 | "isMut": true, 528 | "isSigner": false 529 | }, 530 | { 531 | "name": "orderBook", 532 | "isMut": false, 533 | "isSigner": false 534 | }, 535 | { 536 | "name": "feeTokenAccount", 537 | "isMut": false, 538 | "isSigner": false 539 | }, 540 | { 541 | "name": "feeAuthority", 542 | "isMut": true, 543 | "isSigner": false 544 | }, 545 | { 546 | "name": "tokenManager", 547 | "isMut": true, 548 | "isSigner": false 549 | }, 550 | { 551 | "name": "tokenManagerTokenAccount", 552 | "isMut": true, 553 | "isSigner": false 554 | }, 555 | { 556 | "name": "collector", 557 | "isMut": true, 558 | "isSigner": false 559 | }, 560 | { 561 | "name": "tokenManagerProgram", 562 | "isMut": false, 563 | "isSigner": false 564 | }, 565 | { 566 | "name": "systemProgram", 567 | "isMut": false, 568 | "isSigner": false 569 | }, 570 | { 571 | "name": "tokenProgram", 572 | "isMut": false, 573 | "isSigner": false 574 | }, 575 | { 576 | "name": "rent", 577 | "isMut": false, 578 | "isSigner": false 579 | } 580 | ], 581 | "args": [] 582 | }, 583 | { 584 | "name": "forecloseLoanEscrow", 585 | "accounts": [ 586 | { 587 | "name": "loan", 588 | "isMut": true, 589 | "isSigner": false 590 | }, 591 | { 592 | "name": "escrow", 593 | "isMut": true, 594 | "isSigner": false 595 | }, 596 | { 597 | "name": "escrowCollateralTokenAccount", 598 | "isMut": true, 599 | "isSigner": false 600 | }, 601 | { 602 | "name": "collateralMint", 603 | "isMut": false, 604 | "isSigner": false 605 | }, 606 | { 607 | "name": "lender", 608 | "isMut": false, 609 | "isSigner": true 610 | }, 611 | { 612 | "name": "lenderCollateralAccount", 613 | "isMut": true, 614 | "isSigner": false 615 | }, 616 | { 617 | "name": "tokenProgram", 618 | "isMut": false, 619 | "isSigner": false 620 | } 621 | ], 622 | "args": [] 623 | }, 624 | { 625 | "name": "repayLoanEscrow", 626 | "accounts": [ 627 | { 628 | "name": "loan", 629 | "isMut": true, 630 | "isSigner": false 631 | }, 632 | { 633 | "name": "borrower", 634 | "isMut": true, 635 | "isSigner": true 636 | }, 637 | { 638 | "name": "borrowerValueTokenAccount", 639 | "isMut": true, 640 | "isSigner": false 641 | }, 642 | { 643 | "name": "borrowerCollateralAccount", 644 | "isMut": true, 645 | "isSigner": false 646 | }, 647 | { 648 | "name": "lender", 649 | "isMut": true, 650 | "isSigner": false 651 | }, 652 | { 653 | "name": "lenderValueTokenAccount", 654 | "isMut": true, 655 | "isSigner": false 656 | }, 657 | { 658 | "name": "escrow", 659 | "isMut": true, 660 | "isSigner": false 661 | }, 662 | { 663 | "name": "escrowCollateralTokenAccount", 664 | "isMut": true, 665 | "isSigner": false 666 | }, 667 | { 668 | "name": "valueMint", 669 | "isMut": false, 670 | "isSigner": false 671 | }, 672 | { 673 | "name": "collateralMint", 674 | "isMut": false, 675 | "isSigner": false 676 | }, 677 | { 678 | "name": "orderBook", 679 | "isMut": false, 680 | "isSigner": false 681 | }, 682 | { 683 | "name": "feeTokenAccount", 684 | "isMut": false, 685 | "isSigner": false 686 | }, 687 | { 688 | "name": "feeAuthority", 689 | "isMut": true, 690 | "isSigner": false 691 | }, 692 | { 693 | "name": "systemProgram", 694 | "isMut": false, 695 | "isSigner": false 696 | }, 697 | { 698 | "name": "tokenProgram", 699 | "isMut": false, 700 | "isSigner": false 701 | }, 702 | { 703 | "name": "rent", 704 | "isMut": false, 705 | "isSigner": false 706 | } 707 | ], 708 | "args": [] 709 | }, 710 | { 711 | "name": "createNftList", 712 | "accounts": [ 713 | { 714 | "name": "nftList", 715 | "isMut": true, 716 | "isSigner": false 717 | }, 718 | { 719 | "name": "payer", 720 | "isMut": false, 721 | "isSigner": true 722 | } 723 | ], 724 | "args": [ 725 | { 726 | "name": "collectionName", 727 | "type": "string" 728 | } 729 | ] 730 | }, 731 | { 732 | "name": "updateNftList", 733 | "accounts": [ 734 | { 735 | "name": "nftList", 736 | "isMut": true, 737 | "isSigner": false 738 | }, 739 | { 740 | "name": "payer", 741 | "isMut": false, 742 | "isSigner": true 743 | } 744 | ], 745 | "args": [ 746 | { 747 | "name": "mints", 748 | "type": { 749 | "vec": { 750 | "defined": "UpdateIndex" 751 | } 752 | } 753 | } 754 | ] 755 | }, 756 | { 757 | "name": "closeNftList", 758 | "accounts": [ 759 | { 760 | "name": "nftList", 761 | "isMut": true, 762 | "isSigner": false 763 | }, 764 | { 765 | "name": "payer", 766 | "isMut": false, 767 | "isSigner": true 768 | } 769 | ], 770 | "args": [] 771 | } 772 | ], 773 | "accounts": [ 774 | { 775 | "name": "OrderBook", 776 | "type": { 777 | "kind": "struct", 778 | "fields": [ 779 | { 780 | "name": "version", 781 | "type": "u8" 782 | }, 783 | { 784 | "name": "orderBookType", 785 | "type": { 786 | "defined": "OrderBookType" 787 | } 788 | }, 789 | { 790 | "name": "apy", 791 | "type": { 792 | "defined": "APY" 793 | } 794 | }, 795 | { 796 | "name": "loanTerms", 797 | "type": { 798 | "defined": "BookLoanTerms" 799 | } 800 | }, 801 | { 802 | "name": "feePermillicentage", 803 | "type": "u16" 804 | }, 805 | { 806 | "name": "feeAuthority", 807 | "type": "publicKey" 808 | } 809 | ] 810 | } 811 | }, 812 | { 813 | "name": "Loan", 814 | "type": { 815 | "kind": "struct", 816 | "fields": [ 817 | { 818 | "name": "version", 819 | "type": "u8" 820 | }, 821 | { 822 | "name": "principalLamports", 823 | "type": "u64" 824 | }, 825 | { 826 | "name": "orderBook", 827 | "type": "publicKey" 828 | }, 829 | { 830 | "name": "valueTokenMint", 831 | "type": "publicKey" 832 | }, 833 | { 834 | "name": "escrowBumpSeed", 835 | "type": "u8" 836 | }, 837 | { 838 | "name": "loanState", 839 | "type": { 840 | "defined": "LoanState" 841 | } 842 | } 843 | ] 844 | } 845 | }, 846 | { 847 | "name": "NFTList", 848 | "type": { 849 | "kind": "struct", 850 | "fields": [ 851 | { 852 | "name": "version", 853 | "type": "u8" 854 | }, 855 | { 856 | "name": "collectionName", 857 | "type": "string" 858 | } 859 | ] 860 | } 861 | } 862 | ], 863 | "types": [ 864 | { 865 | "name": "UpdateIndex", 866 | "type": { 867 | "kind": "struct", 868 | "fields": [ 869 | { 870 | "name": "index", 871 | "type": "u32" 872 | }, 873 | { 874 | "name": "mint", 875 | "type": "publicKey" 876 | } 877 | ] 878 | } 879 | }, 880 | { 881 | "name": "Loan", 882 | "type": { 883 | "kind": "struct", 884 | "fields": [ 885 | { 886 | "name": "version", 887 | "type": "u8" 888 | }, 889 | { 890 | "name": "principalLamports", 891 | "type": "u64" 892 | }, 893 | { 894 | "name": "orderBook", 895 | "type": "publicKey" 896 | }, 897 | { 898 | "name": "valueTokenMint", 899 | "type": "publicKey" 900 | }, 901 | { 902 | "name": "escrowBumpSeed", 903 | "type": "u8" 904 | }, 905 | { 906 | "name": "loanState", 907 | "type": { 908 | "defined": "LoanState" 909 | } 910 | } 911 | ] 912 | } 913 | }, 914 | { 915 | "name": "LoanOffer", 916 | "type": { 917 | "kind": "struct", 918 | "fields": [ 919 | { 920 | "name": "lenderWallet", 921 | "type": "publicKey" 922 | }, 923 | { 924 | "name": "termsSpec", 925 | "type": { 926 | "defined": "LoanTermsSpec" 927 | } 928 | }, 929 | { 930 | "name": "offerTime", 931 | "type": "i64" 932 | } 933 | ] 934 | } 935 | }, 936 | { 937 | "name": "TakenLoan", 938 | "type": { 939 | "kind": "struct", 940 | "fields": [ 941 | { 942 | "name": "nftCollateralMint", 943 | "type": "publicKey" 944 | }, 945 | { 946 | "name": "lenderNoteMint", 947 | "type": "publicKey" 948 | }, 949 | { 950 | "name": "borrowerNoteMint", 951 | "type": "publicKey" 952 | }, 953 | { 954 | "name": "apy", 955 | "type": { 956 | "defined": "APY" 957 | } 958 | }, 959 | { 960 | "name": "terms", 961 | "type": { 962 | "defined": "LoanTerms" 963 | } 964 | } 965 | ] 966 | } 967 | }, 968 | { 969 | "name": "APY", 970 | "type": { 971 | "kind": "enum", 972 | "variants": [ 973 | { 974 | "name": "Fixed", 975 | "fields": [ 976 | { 977 | "name": "apy", 978 | "type": "u32" 979 | } 980 | ] 981 | } 982 | ] 983 | } 984 | }, 985 | { 986 | "name": "BookLoanTerms", 987 | "type": { 988 | "kind": "enum", 989 | "variants": [ 990 | { 991 | "name": "Fixed", 992 | "fields": [ 993 | { 994 | "name": "terms", 995 | "type": { 996 | "defined": "LoanTermsSpec" 997 | } 998 | } 999 | ] 1000 | }, 1001 | { 1002 | "name": "LenderChooses" 1003 | } 1004 | ] 1005 | } 1006 | }, 1007 | { 1008 | "name": "LoanTermsSpec", 1009 | "type": { 1010 | "kind": "enum", 1011 | "variants": [ 1012 | { 1013 | "name": "Time", 1014 | "fields": [ 1015 | { 1016 | "name": "duration", 1017 | "type": "u64" 1018 | } 1019 | ] 1020 | } 1021 | ] 1022 | } 1023 | }, 1024 | { 1025 | "name": "OrderBookType", 1026 | "type": { 1027 | "kind": "enum", 1028 | "variants": [ 1029 | { 1030 | "name": "Collection", 1031 | "fields": [ 1032 | { 1033 | "name": "collection_key", 1034 | "type": "publicKey" 1035 | } 1036 | ] 1037 | }, 1038 | { 1039 | "name": "NFTList", 1040 | "fields": [ 1041 | { 1042 | "name": "list_account", 1043 | "type": "publicKey" 1044 | } 1045 | ] 1046 | } 1047 | ] 1048 | } 1049 | }, 1050 | { 1051 | "name": "LoanTerms", 1052 | "type": { 1053 | "kind": "enum", 1054 | "variants": [ 1055 | { 1056 | "name": "Time", 1057 | "fields": [ 1058 | { 1059 | "name": "start", 1060 | "type": "i64" 1061 | }, 1062 | { 1063 | "name": "duration", 1064 | "type": "u64" 1065 | }, 1066 | { 1067 | "name": "total_owed_lamports", 1068 | "type": "u64" 1069 | } 1070 | ] 1071 | } 1072 | ] 1073 | } 1074 | }, 1075 | { 1076 | "name": "LoanState", 1077 | "type": { 1078 | "kind": "enum", 1079 | "variants": [ 1080 | { 1081 | "name": "Offer", 1082 | "fields": [ 1083 | { 1084 | "name": "offer", 1085 | "type": { 1086 | "defined": "LoanOffer" 1087 | } 1088 | } 1089 | ] 1090 | }, 1091 | { 1092 | "name": "Taken", 1093 | "fields": [ 1094 | { 1095 | "name": "taken", 1096 | "type": { 1097 | "defined": "TakenLoan" 1098 | } 1099 | } 1100 | ] 1101 | } 1102 | ] 1103 | } 1104 | } 1105 | ], 1106 | "errors": [ 1107 | { 1108 | "code": 6000, 1109 | "name": "Custom", 1110 | "msg": "Custom" 1111 | }, 1112 | { 1113 | "code": 6001, 1114 | "name": "InvalidArgument", 1115 | "msg": "InvalidArgument" 1116 | }, 1117 | { 1118 | "code": 6002, 1119 | "name": "InvalidAccountData", 1120 | "msg": "InvalidAccountData" 1121 | }, 1122 | { 1123 | "code": 6003, 1124 | "name": "IllegalOwner", 1125 | "msg": "IllegalOwner" 1126 | }, 1127 | { 1128 | "code": 6004, 1129 | "name": "LoanIsCardinal", 1130 | "msg": "Loan is cardinal when calling function that requires escrow" 1131 | }, 1132 | { 1133 | "code": 6005, 1134 | "name": "LoanIsEscrow", 1135 | "msg": "Loan is escrow when calling function that requires cardinal" 1136 | }, 1137 | { 1138 | "code": 6006, 1139 | "name": "InvalidMint", 1140 | "msg": "Mint is invalid" 1141 | }, 1142 | { 1143 | "code": 6007, 1144 | "name": "NumericalOverflowError", 1145 | "msg": "Numerical overflow error" 1146 | } 1147 | ] 1148 | } 1149 | -------------------------------------------------------------------------------- /idl/sharky-6.2.0.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "6.2.0", 3 | "name": "sharky", 4 | "instructions": [ 5 | { 6 | "name": "createOrderBook", 7 | "docs": ["Creates an order book, must be signed by sharky key"], 8 | "accounts": [ 9 | { 10 | "name": "orderBook", 11 | "isMut": true, 12 | "isSigner": true 13 | }, 14 | { 15 | "name": "payer", 16 | "isMut": true, 17 | "isSigner": true 18 | }, 19 | { 20 | "name": "systemProgram", 21 | "isMut": false, 22 | "isSigner": false 23 | } 24 | ], 25 | "args": [ 26 | { 27 | "name": "orderBookType", 28 | "type": { 29 | "defined": "OrderBookType" 30 | } 31 | }, 32 | { 33 | "name": "apy", 34 | "type": { 35 | "defined": "APY" 36 | } 37 | }, 38 | { 39 | "name": "loanTerms", 40 | "type": { 41 | "defined": "BookLoanTerms" 42 | } 43 | }, 44 | { 45 | "name": "feePermillicentage", 46 | "type": "u16" 47 | }, 48 | { 49 | "name": "feeAuthority", 50 | "type": "publicKey" 51 | } 52 | ] 53 | }, 54 | { 55 | "name": "updateOrderBook", 56 | "docs": ["Updates an order book, must be signed by sharky key"], 57 | "accounts": [ 58 | { 59 | "name": "orderBook", 60 | "isMut": true, 61 | "isSigner": false 62 | }, 63 | { 64 | "name": "payer", 65 | "isMut": false, 66 | "isSigner": true 67 | } 68 | ], 69 | "args": [ 70 | { 71 | "name": "orderBookType", 72 | "type": { 73 | "option": { 74 | "defined": "OrderBookType" 75 | } 76 | } 77 | }, 78 | { 79 | "name": "apy", 80 | "type": { 81 | "option": { 82 | "defined": "APY" 83 | } 84 | } 85 | }, 86 | { 87 | "name": "loanTerms", 88 | "type": { 89 | "option": { 90 | "defined": "BookLoanTerms" 91 | } 92 | } 93 | }, 94 | { 95 | "name": "feePermillicentage", 96 | "type": { 97 | "option": "u16" 98 | } 99 | }, 100 | { 101 | "name": "feeAuthority", 102 | "type": { 103 | "option": "publicKey" 104 | } 105 | } 106 | ] 107 | }, 108 | { 109 | "name": "closeOrderBook", 110 | "docs": ["Closes an order book, must be signed by sharky key"], 111 | "accounts": [ 112 | { 113 | "name": "orderBook", 114 | "isMut": true, 115 | "isSigner": false 116 | }, 117 | { 118 | "name": "payer", 119 | "isMut": false, 120 | "isSigner": true 121 | } 122 | ], 123 | "args": [] 124 | }, 125 | { 126 | "name": "offerLoan", 127 | "docs": ["Offers a loan for a given order book"], 128 | "accounts": [ 129 | { 130 | "name": "lender", 131 | "isMut": true, 132 | "isSigner": true 133 | }, 134 | { 135 | "name": "lenderValueTokenAccount", 136 | "isMut": true, 137 | "isSigner": false 138 | }, 139 | { 140 | "name": "valueMint", 141 | "isMut": false, 142 | "isSigner": false 143 | }, 144 | { 145 | "name": "loan", 146 | "isMut": true, 147 | "isSigner": true 148 | }, 149 | { 150 | "name": "escrow", 151 | "isMut": true, 152 | "isSigner": false 153 | }, 154 | { 155 | "name": "escrowTokenAccount", 156 | "isMut": true, 157 | "isSigner": false 158 | }, 159 | { 160 | "name": "orderBook", 161 | "isMut": false, 162 | "isSigner": false 163 | }, 164 | { 165 | "name": "systemProgram", 166 | "isMut": false, 167 | "isSigner": false 168 | }, 169 | { 170 | "name": "tokenProgram", 171 | "isMut": false, 172 | "isSigner": false 173 | }, 174 | { 175 | "name": "associatedTokenProgram", 176 | "isMut": false, 177 | "isSigner": false 178 | }, 179 | { 180 | "name": "rent", 181 | "isMut": false, 182 | "isSigner": false 183 | } 184 | ], 185 | "args": [ 186 | { 187 | "name": "escrowBump", 188 | "type": "u8" 189 | }, 190 | { 191 | "name": "principalLamports", 192 | "type": "u64" 193 | }, 194 | { 195 | "name": "termsChoice", 196 | "type": { 197 | "option": { 198 | "defined": "LoanTermsSpec" 199 | } 200 | } 201 | } 202 | ] 203 | }, 204 | { 205 | "name": "rescindLoan", 206 | "docs": ["Removes an offered but not taken loan"], 207 | "accounts": [ 208 | { 209 | "name": "loan", 210 | "isMut": true, 211 | "isSigner": false 212 | }, 213 | { 214 | "name": "lenderValueTokenAccount", 215 | "isMut": true, 216 | "isSigner": false 217 | }, 218 | { 219 | "name": "lender", 220 | "isMut": false, 221 | "isSigner": true 222 | }, 223 | { 224 | "name": "valueMint", 225 | "isMut": false, 226 | "isSigner": false 227 | }, 228 | { 229 | "name": "escrow", 230 | "isMut": true, 231 | "isSigner": false 232 | }, 233 | { 234 | "name": "escrowTokenAccount", 235 | "isMut": true, 236 | "isSigner": false 237 | }, 238 | { 239 | "name": "systemProgram", 240 | "isMut": false, 241 | "isSigner": false 242 | }, 243 | { 244 | "name": "tokenProgram", 245 | "isMut": false, 246 | "isSigner": false 247 | } 248 | ], 249 | "args": [] 250 | }, 251 | { 252 | "name": "rescindLoanByAdmin", 253 | "accounts": [ 254 | { 255 | "name": "loan", 256 | "isMut": true, 257 | "isSigner": false 258 | }, 259 | { 260 | "name": "lenderValueTokenAccount", 261 | "isMut": true, 262 | "isSigner": false 263 | }, 264 | { 265 | "name": "lender", 266 | "isMut": true, 267 | "isSigner": false 268 | }, 269 | { 270 | "name": "valueMint", 271 | "isMut": false, 272 | "isSigner": false 273 | }, 274 | { 275 | "name": "escrow", 276 | "isMut": true, 277 | "isSigner": false 278 | }, 279 | { 280 | "name": "escrowTokenAccount", 281 | "isMut": true, 282 | "isSigner": false 283 | }, 284 | { 285 | "name": "systemProgram", 286 | "isMut": false, 287 | "isSigner": false 288 | }, 289 | { 290 | "name": "tokenProgram", 291 | "isMut": false, 292 | "isSigner": false 293 | } 294 | ], 295 | "args": [] 296 | }, 297 | { 298 | "name": "takeLoanV3", 299 | "docs": [ 300 | "Takes an offered loan in exchange for a valid NFT (migration off cardinal)" 301 | ], 302 | "accounts": [ 303 | { 304 | "name": "lender", 305 | "isMut": true, 306 | "isSigner": false 307 | }, 308 | { 309 | "name": "borrower", 310 | "isMut": true, 311 | "isSigner": true, 312 | "docs": [ 313 | "The borrower that will receive the tokens in exchange for collateral" 314 | ] 315 | }, 316 | { 317 | "name": "borrowerCollateralTokenAccount", 318 | "isMut": true, 319 | "isSigner": false 320 | }, 321 | { 322 | "name": "collateralMint", 323 | "isMut": true, 324 | "isSigner": false, 325 | "docs": ["type of token"] 326 | }, 327 | { 328 | "name": "loan", 329 | "isMut": true, 330 | "isSigner": false, 331 | "docs": [ 332 | "Expected loan prevents a replacement attack where the loan is replaced between the", 333 | "user signing take_loan and it hitting the chain" 334 | ] 335 | }, 336 | { 337 | "name": "escrow", 338 | "isMut": true, 339 | "isSigner": false 340 | }, 341 | { 342 | "name": "escrowCollateralTokenAccount", 343 | "isMut": true, 344 | "isSigner": false 345 | }, 346 | { 347 | "name": "orderBook", 348 | "isMut": false, 349 | "isSigner": false 350 | }, 351 | { 352 | "name": "metadata", 353 | "isMut": true, 354 | "isSigner": false 355 | }, 356 | { 357 | "name": "edition", 358 | "isMut": true, 359 | "isSigner": false 360 | }, 361 | { 362 | "name": "systemProgram", 363 | "isMut": false, 364 | "isSigner": false 365 | }, 366 | { 367 | "name": "tokenProgram", 368 | "isMut": false, 369 | "isSigner": false 370 | }, 371 | { 372 | "name": "associatedTokenProgram", 373 | "isMut": false, 374 | "isSigner": false 375 | }, 376 | { 377 | "name": "rent", 378 | "isMut": false, 379 | "isSigner": false 380 | }, 381 | { 382 | "name": "mplTokenMetadataProgram", 383 | "isMut": false, 384 | "isSigner": false 385 | } 386 | ], 387 | "args": [ 388 | { 389 | "name": "expectedLoan", 390 | "type": "string" 391 | }, 392 | { 393 | "name": "nftListIndex", 394 | "type": { 395 | "option": "u32" 396 | } 397 | }, 398 | { 399 | "name": "skipFreezingCollateral", 400 | "type": "bool" 401 | } 402 | ] 403 | }, 404 | { 405 | "name": "forecloseLoanV3", 406 | "docs": ["Forecloses on a taken lone that has met some condition"], 407 | "accounts": [ 408 | { 409 | "name": "loan", 410 | "isMut": true, 411 | "isSigner": false 412 | }, 413 | { 414 | "name": "escrow", 415 | "isMut": true, 416 | "isSigner": false 417 | }, 418 | { 419 | "name": "escrowCollateralTokenAccount", 420 | "isMut": true, 421 | "isSigner": false 422 | }, 423 | { 424 | "name": "collateralMint", 425 | "isMut": true, 426 | "isSigner": false 427 | }, 428 | { 429 | "name": "borrower", 430 | "isMut": true, 431 | "isSigner": false 432 | }, 433 | { 434 | "name": "lender", 435 | "isMut": true, 436 | "isSigner": true 437 | }, 438 | { 439 | "name": "lenderCollateralTokenAccount", 440 | "isMut": true, 441 | "isSigner": false 442 | }, 443 | { 444 | "name": "borrowerCollateralTokenAccount", 445 | "isMut": true, 446 | "isSigner": false 447 | }, 448 | { 449 | "name": "metadata", 450 | "isMut": true, 451 | "isSigner": false 452 | }, 453 | { 454 | "name": "edition", 455 | "isMut": true, 456 | "isSigner": false 457 | }, 458 | { 459 | "name": "systemProgram", 460 | "isMut": false, 461 | "isSigner": false 462 | }, 463 | { 464 | "name": "tokenProgram", 465 | "isMut": false, 466 | "isSigner": false 467 | }, 468 | { 469 | "name": "associatedTokenProgram", 470 | "isMut": false, 471 | "isSigner": false 472 | }, 473 | { 474 | "name": "rent", 475 | "isMut": false, 476 | "isSigner": false 477 | }, 478 | { 479 | "name": "mplTokenMetadataProgram", 480 | "isMut": false, 481 | "isSigner": false 482 | } 483 | ], 484 | "args": [] 485 | }, 486 | { 487 | "name": "repayLoanV3", 488 | "docs": ["Repays a given loan in exchange for the NFT"], 489 | "accounts": [ 490 | { 491 | "name": "loan", 492 | "isMut": true, 493 | "isSigner": false 494 | }, 495 | { 496 | "name": "borrower", 497 | "isMut": true, 498 | "isSigner": true 499 | }, 500 | { 501 | "name": "borrowerCollateralTokenAccount", 502 | "isMut": true, 503 | "isSigner": false 504 | }, 505 | { 506 | "name": "lender", 507 | "isMut": true, 508 | "isSigner": false 509 | }, 510 | { 511 | "name": "escrow", 512 | "isMut": true, 513 | "isSigner": false 514 | }, 515 | { 516 | "name": "escrowCollateralTokenAccount", 517 | "isMut": true, 518 | "isSigner": false 519 | }, 520 | { 521 | "name": "valueMint", 522 | "isMut": false, 523 | "isSigner": false 524 | }, 525 | { 526 | "name": "collateralMint", 527 | "isMut": true, 528 | "isSigner": false 529 | }, 530 | { 531 | "name": "orderBook", 532 | "isMut": false, 533 | "isSigner": false 534 | }, 535 | { 536 | "name": "feeAuthority", 537 | "isMut": true, 538 | "isSigner": false 539 | }, 540 | { 541 | "name": "metadata", 542 | "isMut": true, 543 | "isSigner": false 544 | }, 545 | { 546 | "name": "edition", 547 | "isMut": true, 548 | "isSigner": false 549 | }, 550 | { 551 | "name": "systemProgram", 552 | "isMut": false, 553 | "isSigner": false 554 | }, 555 | { 556 | "name": "tokenProgram", 557 | "isMut": false, 558 | "isSigner": false 559 | }, 560 | { 561 | "name": "associatedTokenProgram", 562 | "isMut": false, 563 | "isSigner": false 564 | }, 565 | { 566 | "name": "rent", 567 | "isMut": false, 568 | "isSigner": false 569 | }, 570 | { 571 | "name": "mplTokenMetadataProgram", 572 | "isMut": false, 573 | "isSigner": false 574 | } 575 | ], 576 | "args": [] 577 | }, 578 | { 579 | "name": "extendLoanV3", 580 | "accounts": [ 581 | { 582 | "name": "loan", 583 | "isMut": true, 584 | "isSigner": false 585 | }, 586 | { 587 | "name": "newLoan", 588 | "isMut": true, 589 | "isSigner": false 590 | }, 591 | { 592 | "name": "borrower", 593 | "isMut": true, 594 | "isSigner": true 595 | }, 596 | { 597 | "name": "borrowerCollateralTokenAccount", 598 | "isMut": true, 599 | "isSigner": false 600 | }, 601 | { 602 | "name": "lender", 603 | "isMut": true, 604 | "isSigner": false 605 | }, 606 | { 607 | "name": "newLender", 608 | "isMut": true, 609 | "isSigner": false 610 | }, 611 | { 612 | "name": "escrow", 613 | "isMut": true, 614 | "isSigner": false 615 | }, 616 | { 617 | "name": "escrowCollateralTokenAccount", 618 | "isMut": true, 619 | "isSigner": false 620 | }, 621 | { 622 | "name": "newEscrow", 623 | "isMut": true, 624 | "isSigner": false 625 | }, 626 | { 627 | "name": "newEscrowCollateralTokenAccount", 628 | "isMut": true, 629 | "isSigner": false 630 | }, 631 | { 632 | "name": "valueMint", 633 | "isMut": false, 634 | "isSigner": false 635 | }, 636 | { 637 | "name": "collateralMint", 638 | "isMut": false, 639 | "isSigner": false 640 | }, 641 | { 642 | "name": "orderBook", 643 | "isMut": false, 644 | "isSigner": false 645 | }, 646 | { 647 | "name": "feeAuthority", 648 | "isMut": true, 649 | "isSigner": false 650 | }, 651 | { 652 | "name": "metadata", 653 | "isMut": true, 654 | "isSigner": false 655 | }, 656 | { 657 | "name": "edition", 658 | "isMut": true, 659 | "isSigner": false 660 | }, 661 | { 662 | "name": "systemProgram", 663 | "isMut": false, 664 | "isSigner": false 665 | }, 666 | { 667 | "name": "tokenProgram", 668 | "isMut": false, 669 | "isSigner": false 670 | }, 671 | { 672 | "name": "associatedTokenProgram", 673 | "isMut": false, 674 | "isSigner": false 675 | }, 676 | { 677 | "name": "rent", 678 | "isMut": false, 679 | "isSigner": false 680 | }, 681 | { 682 | "name": "mplTokenMetadataProgram", 683 | "isMut": false, 684 | "isSigner": false 685 | } 686 | ], 687 | "args": [ 688 | { 689 | "name": "expectedLoan", 690 | "type": "string" 691 | } 692 | ] 693 | }, 694 | { 695 | "name": "createNftList", 696 | "accounts": [ 697 | { 698 | "name": "nftList", 699 | "isMut": true, 700 | "isSigner": false 701 | }, 702 | { 703 | "name": "payer", 704 | "isMut": false, 705 | "isSigner": true 706 | } 707 | ], 708 | "args": [ 709 | { 710 | "name": "collectionName", 711 | "type": "string" 712 | } 713 | ] 714 | }, 715 | { 716 | "name": "updateNftList", 717 | "accounts": [ 718 | { 719 | "name": "nftList", 720 | "isMut": true, 721 | "isSigner": false 722 | }, 723 | { 724 | "name": "payer", 725 | "isMut": false, 726 | "isSigner": true 727 | } 728 | ], 729 | "args": [ 730 | { 731 | "name": "mints", 732 | "type": { 733 | "vec": { 734 | "defined": "UpdateIndex" 735 | } 736 | } 737 | } 738 | ] 739 | }, 740 | { 741 | "name": "closeNftList", 742 | "accounts": [ 743 | { 744 | "name": "nftList", 745 | "isMut": true, 746 | "isSigner": false 747 | }, 748 | { 749 | "name": "payer", 750 | "isMut": false, 751 | "isSigner": true 752 | } 753 | ], 754 | "args": [] 755 | }, 756 | { 757 | "name": "createProgramVersion", 758 | "accounts": [ 759 | { 760 | "name": "authority", 761 | "isMut": true, 762 | "isSigner": true 763 | }, 764 | { 765 | "name": "programVersion", 766 | "isMut": true, 767 | "isSigner": false 768 | }, 769 | { 770 | "name": "systemProgram", 771 | "isMut": false, 772 | "isSigner": false 773 | }, 774 | { 775 | "name": "rent", 776 | "isMut": false, 777 | "isSigner": false 778 | } 779 | ], 780 | "args": [ 781 | { 782 | "name": "version", 783 | "type": "u8" 784 | } 785 | ] 786 | }, 787 | { 788 | "name": "updateProgramVersion", 789 | "accounts": [ 790 | { 791 | "name": "authority", 792 | "isMut": false, 793 | "isSigner": true 794 | }, 795 | { 796 | "name": "programVersion", 797 | "isMut": true, 798 | "isSigner": false 799 | } 800 | ], 801 | "args": [ 802 | { 803 | "name": "version", 804 | "type": "u8" 805 | } 806 | ] 807 | } 808 | ], 809 | "accounts": [ 810 | { 811 | "name": "OrderBook", 812 | "type": { 813 | "kind": "struct", 814 | "fields": [ 815 | { 816 | "name": "version", 817 | "type": "u8" 818 | }, 819 | { 820 | "name": "orderBookType", 821 | "type": { 822 | "defined": "OrderBookType" 823 | } 824 | }, 825 | { 826 | "name": "apy", 827 | "type": { 828 | "defined": "APY" 829 | } 830 | }, 831 | { 832 | "name": "loanTerms", 833 | "type": { 834 | "defined": "BookLoanTerms" 835 | } 836 | }, 837 | { 838 | "name": "feePermillicentage", 839 | "type": "u16" 840 | }, 841 | { 842 | "name": "feeAuthority", 843 | "type": "publicKey" 844 | } 845 | ] 846 | } 847 | }, 848 | { 849 | "name": "Loan", 850 | "type": { 851 | "kind": "struct", 852 | "fields": [ 853 | { 854 | "name": "version", 855 | "type": "u8" 856 | }, 857 | { 858 | "name": "principalLamports", 859 | "docs": ["amount in tokens, decimals included"], 860 | "type": "u64" 861 | }, 862 | { 863 | "name": "orderBook", 864 | "type": "publicKey" 865 | }, 866 | { 867 | "name": "valueTokenMint", 868 | "docs": ["Token mint for what the loan is in (spl address)"], 869 | "type": "publicKey" 870 | }, 871 | { 872 | "name": "escrowBumpSeed", 873 | "type": "u8" 874 | }, 875 | { 876 | "name": "loanState", 877 | "docs": ["stores start and duration"], 878 | "type": { 879 | "defined": "LoanState" 880 | } 881 | } 882 | ] 883 | } 884 | }, 885 | { 886 | "name": "NFTList", 887 | "type": { 888 | "kind": "struct", 889 | "fields": [ 890 | { 891 | "name": "version", 892 | "type": "u8" 893 | }, 894 | { 895 | "name": "collectionName", 896 | "type": "string" 897 | } 898 | ] 899 | } 900 | }, 901 | { 902 | "name": "EscrowPDA", 903 | "type": { 904 | "kind": "struct", 905 | "fields": [ 906 | { 907 | "name": "bump", 908 | "type": "u8" 909 | } 910 | ] 911 | } 912 | }, 913 | { 914 | "name": "ProgramVersion", 915 | "type": { 916 | "kind": "struct", 917 | "fields": [ 918 | { 919 | "name": "version", 920 | "type": "u8" 921 | }, 922 | { 923 | "name": "bump", 924 | "type": "u8" 925 | }, 926 | { 927 | "name": "updated", 928 | "type": "i64" 929 | } 930 | ] 931 | } 932 | } 933 | ], 934 | "types": [ 935 | { 936 | "name": "UpdateIndex", 937 | "type": { 938 | "kind": "struct", 939 | "fields": [ 940 | { 941 | "name": "index", 942 | "type": "u32" 943 | }, 944 | { 945 | "name": "mint", 946 | "type": "publicKey" 947 | } 948 | ] 949 | } 950 | }, 951 | { 952 | "name": "LoanOffer", 953 | "type": { 954 | "kind": "struct", 955 | "fields": [ 956 | { 957 | "name": "lenderWallet", 958 | "type": "publicKey" 959 | }, 960 | { 961 | "name": "termsSpec", 962 | "type": { 963 | "defined": "LoanTermsSpec" 964 | } 965 | }, 966 | { 967 | "name": "offerTime", 968 | "type": "i64" 969 | } 970 | ] 971 | } 972 | }, 973 | { 974 | "name": "TakenLoan", 975 | "type": { 976 | "kind": "struct", 977 | "fields": [ 978 | { 979 | "name": "nftCollateralMint", 980 | "type": "publicKey" 981 | }, 982 | { 983 | "name": "lenderNoteMint", 984 | "type": "publicKey" 985 | }, 986 | { 987 | "name": "borrowerNoteMint", 988 | "type": "publicKey" 989 | }, 990 | { 991 | "name": "apy", 992 | "docs": [ 993 | "Thousandths of a percent (allows to have 3 decimal points of precision)" 994 | ], 995 | "type": { 996 | "defined": "APY" 997 | } 998 | }, 999 | { 1000 | "name": "terms", 1001 | "type": { 1002 | "defined": "LoanTerms" 1003 | } 1004 | }, 1005 | { 1006 | "name": "isCollateralFrozen", 1007 | "type": "u8" 1008 | } 1009 | ] 1010 | } 1011 | }, 1012 | { 1013 | "name": "APY", 1014 | "docs": ["APY settings on an [`OrderBook`]"], 1015 | "type": { 1016 | "kind": "enum", 1017 | "variants": [ 1018 | { 1019 | "name": "Fixed", 1020 | "fields": [ 1021 | { 1022 | "name": "apy", 1023 | "docs": ["Thousandths of a percent"], 1024 | "type": "u32" 1025 | } 1026 | ] 1027 | } 1028 | ] 1029 | } 1030 | }, 1031 | { 1032 | "name": "BookLoanTerms", 1033 | "type": { 1034 | "kind": "enum", 1035 | "variants": [ 1036 | { 1037 | "name": "Fixed", 1038 | "fields": [ 1039 | { 1040 | "name": "terms", 1041 | "type": { 1042 | "defined": "LoanTermsSpec" 1043 | } 1044 | } 1045 | ] 1046 | }, 1047 | { 1048 | "name": "LenderChooses" 1049 | } 1050 | ] 1051 | } 1052 | }, 1053 | { 1054 | "name": "LoanTermsSpec", 1055 | "type": { 1056 | "kind": "enum", 1057 | "variants": [ 1058 | { 1059 | "name": "Time", 1060 | "fields": [ 1061 | { 1062 | "name": "duration", 1063 | "type": "u64" 1064 | } 1065 | ] 1066 | } 1067 | ] 1068 | } 1069 | }, 1070 | { 1071 | "name": "OrderBookType", 1072 | "type": { 1073 | "kind": "enum", 1074 | "variants": [ 1075 | { 1076 | "name": "Collection", 1077 | "fields": [ 1078 | { 1079 | "name": "collection_key", 1080 | "type": "publicKey" 1081 | } 1082 | ] 1083 | }, 1084 | { 1085 | "name": "NFTList", 1086 | "fields": [ 1087 | { 1088 | "name": "list_account", 1089 | "type": "publicKey" 1090 | } 1091 | ] 1092 | } 1093 | ] 1094 | } 1095 | }, 1096 | { 1097 | "name": "LoanTerms", 1098 | "type": { 1099 | "kind": "enum", 1100 | "variants": [ 1101 | { 1102 | "name": "Time", 1103 | "fields": [ 1104 | { 1105 | "name": "start", 1106 | "docs": ["This is a [`UnixTimeStamp`]"], 1107 | "type": "i64" 1108 | }, 1109 | { 1110 | "name": "duration", 1111 | "type": "u64" 1112 | }, 1113 | { 1114 | "name": "total_owed_lamports", 1115 | "type": "u64" 1116 | } 1117 | ] 1118 | } 1119 | ] 1120 | } 1121 | }, 1122 | { 1123 | "name": "LoanState", 1124 | "type": { 1125 | "kind": "enum", 1126 | "variants": [ 1127 | { 1128 | "name": "Offer", 1129 | "fields": [ 1130 | { 1131 | "name": "offer", 1132 | "type": { 1133 | "defined": "LoanOffer" 1134 | } 1135 | } 1136 | ] 1137 | }, 1138 | { 1139 | "name": "Taken", 1140 | "fields": [ 1141 | { 1142 | "name": "taken", 1143 | "type": { 1144 | "defined": "TakenLoan" 1145 | } 1146 | } 1147 | ] 1148 | } 1149 | ] 1150 | } 1151 | } 1152 | ], 1153 | "errors": [ 1154 | { 1155 | "code": 6000, 1156 | "name": "Custom", 1157 | "msg": "Custom" 1158 | }, 1159 | { 1160 | "code": 6001, 1161 | "name": "InvalidArgument", 1162 | "msg": "InvalidArgument" 1163 | }, 1164 | { 1165 | "code": 6002, 1166 | "name": "InvalidAccountData", 1167 | "msg": "InvalidAccountData" 1168 | }, 1169 | { 1170 | "code": 6003, 1171 | "name": "IllegalOwner", 1172 | "msg": "IllegalOwner" 1173 | }, 1174 | { 1175 | "code": 6004, 1176 | "name": "InvalidMint", 1177 | "msg": "Mint is invalid" 1178 | }, 1179 | { 1180 | "code": 6005, 1181 | "name": "NumericalOverflowError", 1182 | "msg": "Numerical overflow error" 1183 | }, 1184 | { 1185 | "code": 6006, 1186 | "name": "MismatchedNftCollateralMint", 1187 | "msg": "Mismatched NFT collateral mint" 1188 | }, 1189 | { 1190 | "code": 6007, 1191 | "name": "MismatchedValueTokenMint", 1192 | "msg": "Mismatched value token mint" 1193 | }, 1194 | { 1195 | "code": 6008, 1196 | "name": "MismatchedLender", 1197 | "msg": "Mismatched lender" 1198 | }, 1199 | { 1200 | "code": 6009, 1201 | "name": "NotForeclosable", 1202 | "msg": "Loan is not foreclosable" 1203 | }, 1204 | { 1205 | "code": 6010, 1206 | "name": "FeeCalculationError", 1207 | "msg": "Fee calculation error" 1208 | }, 1209 | { 1210 | "code": 6011, 1211 | "name": "InvalidBookLoanTermsType", 1212 | "msg": "Invalid book loan terms type" 1213 | }, 1214 | { 1215 | "code": 6012, 1216 | "name": "InvalidEscrowBump", 1217 | "msg": "Invalid escrow bump" 1218 | }, 1219 | { 1220 | "code": 6013, 1221 | "name": "InvalidLoanVersion", 1222 | "msg": "Invalid loan version" 1223 | }, 1224 | { 1225 | "code": 6014, 1226 | "name": "InvalidValueMint", 1227 | "msg": "Value mint only supports native mint" 1228 | }, 1229 | { 1230 | "code": 6015, 1231 | "name": "OfferedLoanCannotBeForeclosed", 1232 | "msg": "Offered loan cannot be foreclosed" 1233 | } 1234 | ] 1235 | } 1236 | -------------------------------------------------------------------------------- /idl/sharky-4.0.0.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "4.0.0", 3 | "name": "sharky", 4 | "instructions": [ 5 | { 6 | "name": "createOrderBook", 7 | "docs": ["Creates an order book, must be signed by sharky key"], 8 | "accounts": [ 9 | { 10 | "name": "orderBook", 11 | "isMut": true, 12 | "isSigner": true 13 | }, 14 | { 15 | "name": "payer", 16 | "isMut": true, 17 | "isSigner": true 18 | }, 19 | { 20 | "name": "systemProgram", 21 | "isMut": false, 22 | "isSigner": false 23 | } 24 | ], 25 | "args": [ 26 | { 27 | "name": "orderBookType", 28 | "type": { 29 | "defined": "OrderBookType" 30 | } 31 | }, 32 | { 33 | "name": "apy", 34 | "type": { 35 | "defined": "APY" 36 | } 37 | }, 38 | { 39 | "name": "loanTerms", 40 | "type": { 41 | "defined": "BookLoanTerms" 42 | } 43 | }, 44 | { 45 | "name": "feePermillicentage", 46 | "type": "u16" 47 | }, 48 | { 49 | "name": "feeAuthority", 50 | "type": "publicKey" 51 | } 52 | ] 53 | }, 54 | { 55 | "name": "updateOrderBook", 56 | "docs": ["Updates an order book, must be signed by sharky key"], 57 | "accounts": [ 58 | { 59 | "name": "orderBook", 60 | "isMut": true, 61 | "isSigner": false 62 | }, 63 | { 64 | "name": "payer", 65 | "isMut": false, 66 | "isSigner": true 67 | } 68 | ], 69 | "args": [ 70 | { 71 | "name": "orderBookType", 72 | "type": { 73 | "option": { 74 | "defined": "OrderBookType" 75 | } 76 | } 77 | }, 78 | { 79 | "name": "apy", 80 | "type": { 81 | "option": { 82 | "defined": "APY" 83 | } 84 | } 85 | }, 86 | { 87 | "name": "loanTerms", 88 | "type": { 89 | "option": { 90 | "defined": "BookLoanTerms" 91 | } 92 | } 93 | }, 94 | { 95 | "name": "feePermillicentage", 96 | "type": { 97 | "option": "u16" 98 | } 99 | }, 100 | { 101 | "name": "feeAuthority", 102 | "type": { 103 | "option": "publicKey" 104 | } 105 | } 106 | ] 107 | }, 108 | { 109 | "name": "closeOrderBook", 110 | "docs": ["Closes an order book, must be signed by sharky key"], 111 | "accounts": [ 112 | { 113 | "name": "orderBook", 114 | "isMut": true, 115 | "isSigner": false 116 | }, 117 | { 118 | "name": "payer", 119 | "isMut": false, 120 | "isSigner": true 121 | } 122 | ], 123 | "args": [] 124 | }, 125 | { 126 | "name": "offerLoan", 127 | "docs": ["Offers a loan for a given order book"], 128 | "accounts": [ 129 | { 130 | "name": "lender", 131 | "isMut": true, 132 | "isSigner": true 133 | }, 134 | { 135 | "name": "lenderValueTokenAccount", 136 | "isMut": true, 137 | "isSigner": false 138 | }, 139 | { 140 | "name": "valueMint", 141 | "isMut": false, 142 | "isSigner": false 143 | }, 144 | { 145 | "name": "loan", 146 | "isMut": true, 147 | "isSigner": true 148 | }, 149 | { 150 | "name": "escrow", 151 | "isMut": true, 152 | "isSigner": false 153 | }, 154 | { 155 | "name": "escrowTokenAccount", 156 | "isMut": true, 157 | "isSigner": false 158 | }, 159 | { 160 | "name": "orderBook", 161 | "isMut": false, 162 | "isSigner": false 163 | }, 164 | { 165 | "name": "systemProgram", 166 | "isMut": false, 167 | "isSigner": false 168 | }, 169 | { 170 | "name": "tokenProgram", 171 | "isMut": false, 172 | "isSigner": false 173 | }, 174 | { 175 | "name": "associatedTokenProgram", 176 | "isMut": false, 177 | "isSigner": false 178 | }, 179 | { 180 | "name": "rent", 181 | "isMut": false, 182 | "isSigner": false 183 | } 184 | ], 185 | "args": [ 186 | { 187 | "name": "escrowBump", 188 | "type": "u8" 189 | }, 190 | { 191 | "name": "principalLamports", 192 | "type": "u64" 193 | }, 194 | { 195 | "name": "termsChoice", 196 | "type": { 197 | "option": { 198 | "defined": "LoanTermsSpec" 199 | } 200 | } 201 | } 202 | ] 203 | }, 204 | { 205 | "name": "rescindLoan", 206 | "docs": ["Removes an offered but not taken loan"], 207 | "accounts": [ 208 | { 209 | "name": "loan", 210 | "isMut": true, 211 | "isSigner": false 212 | }, 213 | { 214 | "name": "lenderValueTokenAccount", 215 | "isMut": true, 216 | "isSigner": false 217 | }, 218 | { 219 | "name": "lender", 220 | "isMut": false, 221 | "isSigner": true 222 | }, 223 | { 224 | "name": "valueMint", 225 | "isMut": false, 226 | "isSigner": false 227 | }, 228 | { 229 | "name": "escrow", 230 | "isMut": true, 231 | "isSigner": false 232 | }, 233 | { 234 | "name": "escrowTokenAccount", 235 | "isMut": true, 236 | "isSigner": false 237 | }, 238 | { 239 | "name": "systemProgram", 240 | "isMut": false, 241 | "isSigner": false 242 | }, 243 | { 244 | "name": "tokenProgram", 245 | "isMut": false, 246 | "isSigner": false 247 | } 248 | ], 249 | "args": [] 250 | }, 251 | { 252 | "name": "takeLoan", 253 | "docs": ["Takes an offered loan in exchange for a valid NFT"], 254 | "accounts": [ 255 | { 256 | "name": "lender", 257 | "isMut": true, 258 | "isSigner": false 259 | }, 260 | { 261 | "name": "borrower", 262 | "isMut": true, 263 | "isSigner": true, 264 | "docs": [ 265 | "The borrower that will receive the tokens in exchange for collateral" 266 | ] 267 | }, 268 | { 269 | "name": "borrowerCollateralAccount", 270 | "isMut": true, 271 | "isSigner": false 272 | }, 273 | { 274 | "name": "valueMint", 275 | "isMut": false, 276 | "isSigner": false 277 | }, 278 | { 279 | "name": "collateralMint", 280 | "isMut": true, 281 | "isSigner": false, 282 | "docs": ["type of token"] 283 | }, 284 | { 285 | "name": "loan", 286 | "isMut": true, 287 | "isSigner": false, 288 | "docs": [ 289 | "Expected loan prevents a replacement attack where the loan is replaced between the", 290 | "user signing take_loan and it hitting the chain" 291 | ] 292 | }, 293 | { 294 | "name": "escrow", 295 | "isMut": true, 296 | "isSigner": false 297 | }, 298 | { 299 | "name": "escrowCollateralTokenAccount", 300 | "isMut": true, 301 | "isSigner": false 302 | }, 303 | { 304 | "name": "orderBook", 305 | "isMut": false, 306 | "isSigner": false 307 | }, 308 | { 309 | "name": "systemProgram", 310 | "isMut": false, 311 | "isSigner": false 312 | }, 313 | { 314 | "name": "tokenProgram", 315 | "isMut": false, 316 | "isSigner": false 317 | }, 318 | { 319 | "name": "associatedTokenProgram", 320 | "isMut": false, 321 | "isSigner": false 322 | }, 323 | { 324 | "name": "rent", 325 | "isMut": false, 326 | "isSigner": false 327 | }, 328 | { 329 | "name": "instructionSysvarAccount", 330 | "isMut": false, 331 | "isSigner": false 332 | }, 333 | { 334 | "name": "mplTokenMetadataProgram", 335 | "isMut": false, 336 | "isSigner": false 337 | }, 338 | { 339 | "name": "metadata", 340 | "isMut": true, 341 | "isSigner": false 342 | } 343 | ], 344 | "args": [ 345 | { 346 | "name": "expectedLoan", 347 | "type": "string" 348 | }, 349 | { 350 | "name": "nftListIndex", 351 | "type": { 352 | "option": "u32" 353 | } 354 | }, 355 | { 356 | "name": "editionNumber", 357 | "type": { 358 | "option": "u32" 359 | } 360 | }, 361 | { 362 | "name": "isProgrammable", 363 | "type": "bool" 364 | } 365 | ] 366 | }, 367 | { 368 | "name": "transferAndFreezeCollateral", 369 | "accounts": [ 370 | { 371 | "name": "borrower", 372 | "isMut": false, 373 | "isSigner": true, 374 | "docs": [ 375 | "The borrower that will receive the tokens in exchange for collateral" 376 | ] 377 | }, 378 | { 379 | "name": "borrowerCollateralAccount", 380 | "isMut": true, 381 | "isSigner": false 382 | }, 383 | { 384 | "name": "collateralMint", 385 | "isMut": true, 386 | "isSigner": false, 387 | "docs": ["type of token"] 388 | }, 389 | { 390 | "name": "loan", 391 | "isMut": true, 392 | "isSigner": false, 393 | "docs": [ 394 | "Expected loan prevents a replacement attack where the loan is replaced between the", 395 | "user signing take_loan and it hitting the chain" 396 | ] 397 | }, 398 | { 399 | "name": "escrow", 400 | "isMut": true, 401 | "isSigner": false 402 | }, 403 | { 404 | "name": "escrowCollateralTokenAccount", 405 | "isMut": false, 406 | "isSigner": false 407 | }, 408 | { 409 | "name": "tokenManager", 410 | "isMut": true, 411 | "isSigner": false 412 | }, 413 | { 414 | "name": "tokenManagerTokenAccount", 415 | "isMut": true, 416 | "isSigner": false 417 | }, 418 | { 419 | "name": "mintCounter", 420 | "isMut": true, 421 | "isSigner": false 422 | }, 423 | { 424 | "name": "tokenManagerProgram", 425 | "isMut": false, 426 | "isSigner": false 427 | }, 428 | { 429 | "name": "tokenProgram", 430 | "isMut": false, 431 | "isSigner": false 432 | }, 433 | { 434 | "name": "systemProgram", 435 | "isMut": false, 436 | "isSigner": false 437 | } 438 | ], 439 | "args": [ 440 | { 441 | "name": "isProgrammable", 442 | "type": "bool" 443 | } 444 | ] 445 | }, 446 | { 447 | "name": "forecloseLoan", 448 | "docs": ["Forecloses on a taken lone that has met some condition"], 449 | "accounts": [ 450 | { 451 | "name": "loan", 452 | "isMut": true, 453 | "isSigner": false 454 | }, 455 | { 456 | "name": "escrow", 457 | "isMut": true, 458 | "isSigner": false 459 | }, 460 | { 461 | "name": "escrowCollateralTokenAccount", 462 | "isMut": true, 463 | "isSigner": false 464 | }, 465 | { 466 | "name": "collateralMint", 467 | "isMut": true, 468 | "isSigner": false 469 | }, 470 | { 471 | "name": "lender", 472 | "isMut": true, 473 | "isSigner": true 474 | }, 475 | { 476 | "name": "lenderCollateralAccount", 477 | "isMut": true, 478 | "isSigner": false 479 | }, 480 | { 481 | "name": "tokenManager", 482 | "isMut": true, 483 | "isSigner": false 484 | }, 485 | { 486 | "name": "tokenManagerTokenAccount", 487 | "isMut": true, 488 | "isSigner": false 489 | }, 490 | { 491 | "name": "borrowerCollateralAccount", 492 | "isMut": true, 493 | "isSigner": false 494 | }, 495 | { 496 | "name": "collector", 497 | "isMut": true, 498 | "isSigner": false 499 | }, 500 | { 501 | "name": "tokenManagerProgram", 502 | "isMut": false, 503 | "isSigner": false 504 | }, 505 | { 506 | "name": "systemProgram", 507 | "isMut": false, 508 | "isSigner": false 509 | }, 510 | { 511 | "name": "tokenProgram", 512 | "isMut": false, 513 | "isSigner": false 514 | }, 515 | { 516 | "name": "associatedTokenProgram", 517 | "isMut": false, 518 | "isSigner": false 519 | }, 520 | { 521 | "name": "rent", 522 | "isMut": false, 523 | "isSigner": false 524 | }, 525 | { 526 | "name": "instructionSysvarAccount", 527 | "isMut": false, 528 | "isSigner": false 529 | }, 530 | { 531 | "name": "mplTokenMetadataProgram", 532 | "isMut": false, 533 | "isSigner": false 534 | }, 535 | { 536 | "name": "metadata", 537 | "isMut": true, 538 | "isSigner": false 539 | } 540 | ], 541 | "args": [ 542 | { 543 | "name": "editionNumber", 544 | "type": { 545 | "option": "u32" 546 | } 547 | }, 548 | { 549 | "name": "isProgrammable", 550 | "type": "bool" 551 | } 552 | ] 553 | }, 554 | { 555 | "name": "repayLoan", 556 | "docs": ["Repays a given loan in exchange for the NFT"], 557 | "accounts": [ 558 | { 559 | "name": "loan", 560 | "isMut": true, 561 | "isSigner": false 562 | }, 563 | { 564 | "name": "borrower", 565 | "isMut": true, 566 | "isSigner": true 567 | }, 568 | { 569 | "name": "borrowerCollateralAccount", 570 | "isMut": true, 571 | "isSigner": false 572 | }, 573 | { 574 | "name": "lender", 575 | "isMut": true, 576 | "isSigner": false 577 | }, 578 | { 579 | "name": "escrow", 580 | "isMut": true, 581 | "isSigner": false 582 | }, 583 | { 584 | "name": "escrowCollateralTokenAccount", 585 | "isMut": true, 586 | "isSigner": false 587 | }, 588 | { 589 | "name": "valueMint", 590 | "isMut": false, 591 | "isSigner": false 592 | }, 593 | { 594 | "name": "collateralMint", 595 | "isMut": true, 596 | "isSigner": false 597 | }, 598 | { 599 | "name": "orderBook", 600 | "isMut": false, 601 | "isSigner": false 602 | }, 603 | { 604 | "name": "feeAuthority", 605 | "isMut": true, 606 | "isSigner": false 607 | }, 608 | { 609 | "name": "tokenManager", 610 | "isMut": true, 611 | "isSigner": false 612 | }, 613 | { 614 | "name": "tokenManagerTokenAccount", 615 | "isMut": true, 616 | "isSigner": false 617 | }, 618 | { 619 | "name": "collector", 620 | "isMut": true, 621 | "isSigner": false 622 | }, 623 | { 624 | "name": "tokenManagerProgram", 625 | "isMut": false, 626 | "isSigner": false 627 | }, 628 | { 629 | "name": "systemProgram", 630 | "isMut": false, 631 | "isSigner": false 632 | }, 633 | { 634 | "name": "tokenProgram", 635 | "isMut": false, 636 | "isSigner": false 637 | }, 638 | { 639 | "name": "associatedTokenProgram", 640 | "isMut": false, 641 | "isSigner": false 642 | }, 643 | { 644 | "name": "rent", 645 | "isMut": false, 646 | "isSigner": false 647 | }, 648 | { 649 | "name": "instructionSysvarAccount", 650 | "isMut": false, 651 | "isSigner": false 652 | }, 653 | { 654 | "name": "mplTokenMetadataProgram", 655 | "isMut": false, 656 | "isSigner": false 657 | }, 658 | { 659 | "name": "metadata", 660 | "isMut": true, 661 | "isSigner": false 662 | } 663 | ], 664 | "args": [ 665 | { 666 | "name": "editionNumber", 667 | "type": { 668 | "option": "u32" 669 | } 670 | }, 671 | { 672 | "name": "isProgrammable", 673 | "type": "bool" 674 | } 675 | ] 676 | }, 677 | { 678 | "name": "forecloseLoanEscrow", 679 | "docs": ["Forecloses on a taken lone that has met some condition"], 680 | "accounts": [ 681 | { 682 | "name": "loan", 683 | "isMut": true, 684 | "isSigner": false 685 | }, 686 | { 687 | "name": "escrow", 688 | "isMut": true, 689 | "isSigner": false 690 | }, 691 | { 692 | "name": "escrowCollateralTokenAccount", 693 | "isMut": true, 694 | "isSigner": false 695 | }, 696 | { 697 | "name": "collateralMint", 698 | "isMut": false, 699 | "isSigner": false 700 | }, 701 | { 702 | "name": "lender", 703 | "isMut": true, 704 | "isSigner": true 705 | }, 706 | { 707 | "name": "lenderCollateralAccount", 708 | "isMut": true, 709 | "isSigner": false 710 | }, 711 | { 712 | "name": "systemProgram", 713 | "isMut": false, 714 | "isSigner": false 715 | }, 716 | { 717 | "name": "tokenProgram", 718 | "isMut": false, 719 | "isSigner": false 720 | }, 721 | { 722 | "name": "associatedTokenProgram", 723 | "isMut": false, 724 | "isSigner": false 725 | }, 726 | { 727 | "name": "instructionSysvarAccount", 728 | "isMut": false, 729 | "isSigner": false 730 | }, 731 | { 732 | "name": "mplTokenMetadataProgram", 733 | "isMut": false, 734 | "isSigner": false 735 | }, 736 | { 737 | "name": "metadata", 738 | "isMut": true, 739 | "isSigner": false 740 | } 741 | ], 742 | "args": [ 743 | { 744 | "name": "editionNumber", 745 | "type": { 746 | "option": "u32" 747 | } 748 | }, 749 | { 750 | "name": "isProgrammable", 751 | "type": "bool" 752 | } 753 | ] 754 | }, 755 | { 756 | "name": "repayLoanEscrow", 757 | "docs": ["Repays a given loan in exchange for the NFT"], 758 | "accounts": [ 759 | { 760 | "name": "loan", 761 | "isMut": true, 762 | "isSigner": false 763 | }, 764 | { 765 | "name": "borrower", 766 | "isMut": true, 767 | "isSigner": true 768 | }, 769 | { 770 | "name": "borrowerCollateralAccount", 771 | "isMut": true, 772 | "isSigner": false 773 | }, 774 | { 775 | "name": "lender", 776 | "isMut": true, 777 | "isSigner": false 778 | }, 779 | { 780 | "name": "escrow", 781 | "isMut": true, 782 | "isSigner": false 783 | }, 784 | { 785 | "name": "escrowCollateralTokenAccount", 786 | "isMut": true, 787 | "isSigner": false 788 | }, 789 | { 790 | "name": "valueMint", 791 | "isMut": false, 792 | "isSigner": false 793 | }, 794 | { 795 | "name": "collateralMint", 796 | "isMut": false, 797 | "isSigner": false 798 | }, 799 | { 800 | "name": "orderBook", 801 | "isMut": false, 802 | "isSigner": false 803 | }, 804 | { 805 | "name": "feeAuthority", 806 | "isMut": true, 807 | "isSigner": false 808 | }, 809 | { 810 | "name": "systemProgram", 811 | "isMut": false, 812 | "isSigner": false 813 | }, 814 | { 815 | "name": "tokenProgram", 816 | "isMut": false, 817 | "isSigner": false 818 | }, 819 | { 820 | "name": "associatedTokenProgram", 821 | "isMut": false, 822 | "isSigner": false 823 | }, 824 | { 825 | "name": "rent", 826 | "isMut": false, 827 | "isSigner": false 828 | }, 829 | { 830 | "name": "instructionSysvarAccount", 831 | "isMut": false, 832 | "isSigner": false 833 | }, 834 | { 835 | "name": "mplTokenMetadataProgram", 836 | "isMut": false, 837 | "isSigner": false 838 | }, 839 | { 840 | "name": "metadata", 841 | "isMut": true, 842 | "isSigner": false 843 | } 844 | ], 845 | "args": [ 846 | { 847 | "name": "editionNumber", 848 | "type": { 849 | "option": "u32" 850 | } 851 | }, 852 | { 853 | "name": "isProgrammable", 854 | "type": "bool" 855 | } 856 | ] 857 | }, 858 | { 859 | "name": "createNftList", 860 | "accounts": [ 861 | { 862 | "name": "nftList", 863 | "isMut": true, 864 | "isSigner": false 865 | }, 866 | { 867 | "name": "payer", 868 | "isMut": false, 869 | "isSigner": true 870 | } 871 | ], 872 | "args": [ 873 | { 874 | "name": "collectionName", 875 | "type": "string" 876 | } 877 | ] 878 | }, 879 | { 880 | "name": "updateNftList", 881 | "accounts": [ 882 | { 883 | "name": "nftList", 884 | "isMut": true, 885 | "isSigner": false 886 | }, 887 | { 888 | "name": "payer", 889 | "isMut": false, 890 | "isSigner": true 891 | } 892 | ], 893 | "args": [ 894 | { 895 | "name": "mints", 896 | "type": { 897 | "vec": { 898 | "defined": "UpdateIndex" 899 | } 900 | } 901 | } 902 | ] 903 | }, 904 | { 905 | "name": "closeNftList", 906 | "accounts": [ 907 | { 908 | "name": "nftList", 909 | "isMut": true, 910 | "isSigner": false 911 | }, 912 | { 913 | "name": "payer", 914 | "isMut": false, 915 | "isSigner": true 916 | } 917 | ], 918 | "args": [] 919 | } 920 | ], 921 | "accounts": [ 922 | { 923 | "name": "OrderBook", 924 | "type": { 925 | "kind": "struct", 926 | "fields": [ 927 | { 928 | "name": "version", 929 | "type": "u8" 930 | }, 931 | { 932 | "name": "orderBookType", 933 | "type": { 934 | "defined": "OrderBookType" 935 | } 936 | }, 937 | { 938 | "name": "apy", 939 | "type": { 940 | "defined": "APY" 941 | } 942 | }, 943 | { 944 | "name": "loanTerms", 945 | "type": { 946 | "defined": "BookLoanTerms" 947 | } 948 | }, 949 | { 950 | "name": "feePermillicentage", 951 | "type": "u16" 952 | }, 953 | { 954 | "name": "feeAuthority", 955 | "type": "publicKey" 956 | } 957 | ] 958 | } 959 | }, 960 | { 961 | "name": "Loan", 962 | "type": { 963 | "kind": "struct", 964 | "fields": [ 965 | { 966 | "name": "version", 967 | "type": "u8" 968 | }, 969 | { 970 | "name": "principalLamports", 971 | "docs": ["amount in tokens, decimals included"], 972 | "type": "u64" 973 | }, 974 | { 975 | "name": "orderBook", 976 | "type": "publicKey" 977 | }, 978 | { 979 | "name": "valueTokenMint", 980 | "docs": ["Token mint for what the loan is in (spl address)"], 981 | "type": "publicKey" 982 | }, 983 | { 984 | "name": "escrowBumpSeed", 985 | "type": "u8" 986 | }, 987 | { 988 | "name": "loanState", 989 | "docs": ["stores start and duration"], 990 | "type": { 991 | "defined": "LoanState" 992 | } 993 | } 994 | ] 995 | } 996 | }, 997 | { 998 | "name": "NFTList", 999 | "type": { 1000 | "kind": "struct", 1001 | "fields": [ 1002 | { 1003 | "name": "version", 1004 | "type": "u8" 1005 | }, 1006 | { 1007 | "name": "collectionName", 1008 | "type": "string" 1009 | } 1010 | ] 1011 | } 1012 | } 1013 | ], 1014 | "types": [ 1015 | { 1016 | "name": "UpdateIndex", 1017 | "type": { 1018 | "kind": "struct", 1019 | "fields": [ 1020 | { 1021 | "name": "index", 1022 | "type": "u32" 1023 | }, 1024 | { 1025 | "name": "mint", 1026 | "type": "publicKey" 1027 | } 1028 | ] 1029 | } 1030 | }, 1031 | { 1032 | "name": "LoanOffer", 1033 | "type": { 1034 | "kind": "struct", 1035 | "fields": [ 1036 | { 1037 | "name": "lenderWallet", 1038 | "type": "publicKey" 1039 | }, 1040 | { 1041 | "name": "termsSpec", 1042 | "type": { 1043 | "defined": "LoanTermsSpec" 1044 | } 1045 | }, 1046 | { 1047 | "name": "offerTime", 1048 | "type": "i64" 1049 | } 1050 | ] 1051 | } 1052 | }, 1053 | { 1054 | "name": "TakenLoan", 1055 | "type": { 1056 | "kind": "struct", 1057 | "fields": [ 1058 | { 1059 | "name": "nftCollateralMint", 1060 | "type": "publicKey" 1061 | }, 1062 | { 1063 | "name": "lenderNoteMint", 1064 | "type": "publicKey" 1065 | }, 1066 | { 1067 | "name": "borrowerNoteMint", 1068 | "type": "publicKey" 1069 | }, 1070 | { 1071 | "name": "apy", 1072 | "docs": [ 1073 | "Thousandths of a percent (allows to have 3 decimal points of precision)" 1074 | ], 1075 | "type": { 1076 | "defined": "APY" 1077 | } 1078 | }, 1079 | { 1080 | "name": "terms", 1081 | "type": { 1082 | "defined": "LoanTerms" 1083 | } 1084 | } 1085 | ] 1086 | } 1087 | }, 1088 | { 1089 | "name": "APY", 1090 | "docs": ["APY settings on an [`OrderBook`]"], 1091 | "type": { 1092 | "kind": "enum", 1093 | "variants": [ 1094 | { 1095 | "name": "Fixed", 1096 | "fields": [ 1097 | { 1098 | "name": "apy", 1099 | "docs": ["Thousandths of a percent"], 1100 | "type": "u32" 1101 | } 1102 | ] 1103 | } 1104 | ] 1105 | } 1106 | }, 1107 | { 1108 | "name": "BookLoanTerms", 1109 | "type": { 1110 | "kind": "enum", 1111 | "variants": [ 1112 | { 1113 | "name": "Fixed", 1114 | "fields": [ 1115 | { 1116 | "name": "terms", 1117 | "type": { 1118 | "defined": "LoanTermsSpec" 1119 | } 1120 | } 1121 | ] 1122 | }, 1123 | { 1124 | "name": "LenderChooses" 1125 | } 1126 | ] 1127 | } 1128 | }, 1129 | { 1130 | "name": "LoanTermsSpec", 1131 | "type": { 1132 | "kind": "enum", 1133 | "variants": [ 1134 | { 1135 | "name": "Time", 1136 | "fields": [ 1137 | { 1138 | "name": "duration", 1139 | "type": "u64" 1140 | } 1141 | ] 1142 | } 1143 | ] 1144 | } 1145 | }, 1146 | { 1147 | "name": "OrderBookType", 1148 | "type": { 1149 | "kind": "enum", 1150 | "variants": [ 1151 | { 1152 | "name": "Collection", 1153 | "fields": [ 1154 | { 1155 | "name": "collection_key", 1156 | "type": "publicKey" 1157 | } 1158 | ] 1159 | }, 1160 | { 1161 | "name": "NFTList", 1162 | "fields": [ 1163 | { 1164 | "name": "list_account", 1165 | "type": "publicKey" 1166 | } 1167 | ] 1168 | } 1169 | ] 1170 | } 1171 | }, 1172 | { 1173 | "name": "LoanTerms", 1174 | "type": { 1175 | "kind": "enum", 1176 | "variants": [ 1177 | { 1178 | "name": "Time", 1179 | "fields": [ 1180 | { 1181 | "name": "start", 1182 | "docs": ["This is a [`UnixTimeStamp`]"], 1183 | "type": "i64" 1184 | }, 1185 | { 1186 | "name": "duration", 1187 | "type": "u64" 1188 | }, 1189 | { 1190 | "name": "total_owed_lamports", 1191 | "type": "u64" 1192 | } 1193 | ] 1194 | } 1195 | ] 1196 | } 1197 | }, 1198 | { 1199 | "name": "LoanState", 1200 | "type": { 1201 | "kind": "enum", 1202 | "variants": [ 1203 | { 1204 | "name": "Offer", 1205 | "fields": [ 1206 | { 1207 | "name": "offer", 1208 | "type": { 1209 | "defined": "LoanOffer" 1210 | } 1211 | } 1212 | ] 1213 | }, 1214 | { 1215 | "name": "Taken", 1216 | "fields": [ 1217 | { 1218 | "name": "taken", 1219 | "type": { 1220 | "defined": "TakenLoan" 1221 | } 1222 | } 1223 | ] 1224 | } 1225 | ] 1226 | } 1227 | } 1228 | ], 1229 | "errors": [ 1230 | { 1231 | "code": 6000, 1232 | "name": "Custom", 1233 | "msg": "Custom" 1234 | }, 1235 | { 1236 | "code": 6001, 1237 | "name": "InvalidArgument", 1238 | "msg": "InvalidArgument" 1239 | }, 1240 | { 1241 | "code": 6002, 1242 | "name": "InvalidAccountData", 1243 | "msg": "InvalidAccountData" 1244 | }, 1245 | { 1246 | "code": 6003, 1247 | "name": "IllegalOwner", 1248 | "msg": "IllegalOwner" 1249 | }, 1250 | { 1251 | "code": 6004, 1252 | "name": "LoanIsCardinal", 1253 | "msg": "Loan is cardinal when calling function that requires escrow" 1254 | }, 1255 | { 1256 | "code": 6005, 1257 | "name": "LoanIsEscrow", 1258 | "msg": "Loan is escrow when calling function that requires cardinal" 1259 | }, 1260 | { 1261 | "code": 6006, 1262 | "name": "InvalidMint", 1263 | "msg": "Mint is invalid" 1264 | }, 1265 | { 1266 | "code": 6007, 1267 | "name": "NumericalOverflowError", 1268 | "msg": "Numerical overflow error" 1269 | }, 1270 | { 1271 | "code": 6008, 1272 | "name": "MismatchedNftCollateralMint", 1273 | "msg": "Mismatched NFT collateral mint" 1274 | }, 1275 | { 1276 | "code": 6009, 1277 | "name": "MismatchedValueTokenMint", 1278 | "msg": "Mismatched value token mint" 1279 | }, 1280 | { 1281 | "code": 6010, 1282 | "name": "MismatchedLender", 1283 | "msg": "Mismatched lender" 1284 | }, 1285 | { 1286 | "code": 6011, 1287 | "name": "NotForeclosable", 1288 | "msg": "Loan is not foreclosable" 1289 | }, 1290 | { 1291 | "code": 6012, 1292 | "name": "FeeCalculationError", 1293 | "msg": "Fee calculation error" 1294 | }, 1295 | { 1296 | "code": 6013, 1297 | "name": "InvalidBookLoanTermsType", 1298 | "msg": "Invalid book loan terms type" 1299 | } 1300 | ] 1301 | } 1302 | -------------------------------------------------------------------------------- /idl/sharky-4.1.0.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "4.1.0", 3 | "name": "sharky", 4 | "instructions": [ 5 | { 6 | "name": "createOrderBook", 7 | "docs": ["Creates an order book, must be signed by sharky key"], 8 | "accounts": [ 9 | { 10 | "name": "orderBook", 11 | "isMut": true, 12 | "isSigner": true 13 | }, 14 | { 15 | "name": "payer", 16 | "isMut": true, 17 | "isSigner": true 18 | }, 19 | { 20 | "name": "systemProgram", 21 | "isMut": false, 22 | "isSigner": false 23 | } 24 | ], 25 | "args": [ 26 | { 27 | "name": "orderBookType", 28 | "type": { 29 | "defined": "OrderBookType" 30 | } 31 | }, 32 | { 33 | "name": "apy", 34 | "type": { 35 | "defined": "APY" 36 | } 37 | }, 38 | { 39 | "name": "loanTerms", 40 | "type": { 41 | "defined": "BookLoanTerms" 42 | } 43 | }, 44 | { 45 | "name": "feePermillicentage", 46 | "type": "u16" 47 | }, 48 | { 49 | "name": "feeAuthority", 50 | "type": "publicKey" 51 | } 52 | ] 53 | }, 54 | { 55 | "name": "updateOrderBook", 56 | "docs": ["Updates an order book, must be signed by sharky key"], 57 | "accounts": [ 58 | { 59 | "name": "orderBook", 60 | "isMut": true, 61 | "isSigner": false 62 | }, 63 | { 64 | "name": "payer", 65 | "isMut": false, 66 | "isSigner": true 67 | } 68 | ], 69 | "args": [ 70 | { 71 | "name": "orderBookType", 72 | "type": { 73 | "option": { 74 | "defined": "OrderBookType" 75 | } 76 | } 77 | }, 78 | { 79 | "name": "apy", 80 | "type": { 81 | "option": { 82 | "defined": "APY" 83 | } 84 | } 85 | }, 86 | { 87 | "name": "loanTerms", 88 | "type": { 89 | "option": { 90 | "defined": "BookLoanTerms" 91 | } 92 | } 93 | }, 94 | { 95 | "name": "feePermillicentage", 96 | "type": { 97 | "option": "u16" 98 | } 99 | }, 100 | { 101 | "name": "feeAuthority", 102 | "type": { 103 | "option": "publicKey" 104 | } 105 | } 106 | ] 107 | }, 108 | { 109 | "name": "closeOrderBook", 110 | "docs": ["Closes an order book, must be signed by sharky key"], 111 | "accounts": [ 112 | { 113 | "name": "orderBook", 114 | "isMut": true, 115 | "isSigner": false 116 | }, 117 | { 118 | "name": "payer", 119 | "isMut": false, 120 | "isSigner": true 121 | } 122 | ], 123 | "args": [] 124 | }, 125 | { 126 | "name": "offerLoan", 127 | "docs": ["Offers a loan for a given order book"], 128 | "accounts": [ 129 | { 130 | "name": "lender", 131 | "isMut": true, 132 | "isSigner": true 133 | }, 134 | { 135 | "name": "lenderValueTokenAccount", 136 | "isMut": true, 137 | "isSigner": false 138 | }, 139 | { 140 | "name": "valueMint", 141 | "isMut": false, 142 | "isSigner": false 143 | }, 144 | { 145 | "name": "loan", 146 | "isMut": true, 147 | "isSigner": true 148 | }, 149 | { 150 | "name": "escrow", 151 | "isMut": true, 152 | "isSigner": false 153 | }, 154 | { 155 | "name": "escrowTokenAccount", 156 | "isMut": true, 157 | "isSigner": false 158 | }, 159 | { 160 | "name": "orderBook", 161 | "isMut": false, 162 | "isSigner": false 163 | }, 164 | { 165 | "name": "systemProgram", 166 | "isMut": false, 167 | "isSigner": false 168 | }, 169 | { 170 | "name": "tokenProgram", 171 | "isMut": false, 172 | "isSigner": false 173 | }, 174 | { 175 | "name": "associatedTokenProgram", 176 | "isMut": false, 177 | "isSigner": false 178 | }, 179 | { 180 | "name": "rent", 181 | "isMut": false, 182 | "isSigner": false 183 | } 184 | ], 185 | "args": [ 186 | { 187 | "name": "escrowBump", 188 | "type": "u8" 189 | }, 190 | { 191 | "name": "principalLamports", 192 | "type": "u64" 193 | }, 194 | { 195 | "name": "termsChoice", 196 | "type": { 197 | "option": { 198 | "defined": "LoanTermsSpec" 199 | } 200 | } 201 | } 202 | ] 203 | }, 204 | { 205 | "name": "rescindLoan", 206 | "docs": ["Removes an offered but not taken loan"], 207 | "accounts": [ 208 | { 209 | "name": "loan", 210 | "isMut": true, 211 | "isSigner": false 212 | }, 213 | { 214 | "name": "lenderValueTokenAccount", 215 | "isMut": true, 216 | "isSigner": false 217 | }, 218 | { 219 | "name": "lender", 220 | "isMut": false, 221 | "isSigner": true 222 | }, 223 | { 224 | "name": "valueMint", 225 | "isMut": false, 226 | "isSigner": false 227 | }, 228 | { 229 | "name": "escrow", 230 | "isMut": true, 231 | "isSigner": false 232 | }, 233 | { 234 | "name": "escrowTokenAccount", 235 | "isMut": true, 236 | "isSigner": false 237 | }, 238 | { 239 | "name": "systemProgram", 240 | "isMut": false, 241 | "isSigner": false 242 | }, 243 | { 244 | "name": "tokenProgram", 245 | "isMut": false, 246 | "isSigner": false 247 | } 248 | ], 249 | "args": [] 250 | }, 251 | { 252 | "name": "takeLoan", 253 | "docs": ["Takes an offered loan in exchange for a valid NFT"], 254 | "accounts": [ 255 | { 256 | "name": "lender", 257 | "isMut": true, 258 | "isSigner": false 259 | }, 260 | { 261 | "name": "borrower", 262 | "isMut": true, 263 | "isSigner": true, 264 | "docs": [ 265 | "The borrower that will receive the tokens in exchange for collateral" 266 | ] 267 | }, 268 | { 269 | "name": "borrowerCollateralAccount", 270 | "isMut": true, 271 | "isSigner": false 272 | }, 273 | { 274 | "name": "valueMint", 275 | "isMut": false, 276 | "isSigner": false 277 | }, 278 | { 279 | "name": "collateralMint", 280 | "isMut": true, 281 | "isSigner": false, 282 | "docs": ["type of token"] 283 | }, 284 | { 285 | "name": "loan", 286 | "isMut": true, 287 | "isSigner": false, 288 | "docs": [ 289 | "Expected loan prevents a replacement attack where the loan is replaced between the", 290 | "user signing take_loan and it hitting the chain" 291 | ] 292 | }, 293 | { 294 | "name": "escrow", 295 | "isMut": true, 296 | "isSigner": false 297 | }, 298 | { 299 | "name": "escrowCollateralTokenAccount", 300 | "isMut": true, 301 | "isSigner": false 302 | }, 303 | { 304 | "name": "orderBook", 305 | "isMut": false, 306 | "isSigner": false 307 | }, 308 | { 309 | "name": "systemProgram", 310 | "isMut": false, 311 | "isSigner": false 312 | }, 313 | { 314 | "name": "tokenProgram", 315 | "isMut": false, 316 | "isSigner": false 317 | }, 318 | { 319 | "name": "associatedTokenProgram", 320 | "isMut": false, 321 | "isSigner": false 322 | }, 323 | { 324 | "name": "rent", 325 | "isMut": false, 326 | "isSigner": false 327 | }, 328 | { 329 | "name": "instructionSysvarAccount", 330 | "isMut": false, 331 | "isSigner": false 332 | }, 333 | { 334 | "name": "mplTokenMetadataProgram", 335 | "isMut": false, 336 | "isSigner": false 337 | }, 338 | { 339 | "name": "metadata", 340 | "isMut": true, 341 | "isSigner": false 342 | } 343 | ], 344 | "args": [ 345 | { 346 | "name": "expectedLoan", 347 | "type": "string" 348 | }, 349 | { 350 | "name": "nftListIndex", 351 | "type": { 352 | "option": "u32" 353 | } 354 | }, 355 | { 356 | "name": "editionNumber", 357 | "type": { 358 | "option": "u32" 359 | } 360 | }, 361 | { 362 | "name": "isProgrammable", 363 | "type": "bool" 364 | } 365 | ] 366 | }, 367 | { 368 | "name": "transferAndFreezeCollateral", 369 | "accounts": [ 370 | { 371 | "name": "borrower", 372 | "isMut": false, 373 | "isSigner": true, 374 | "docs": [ 375 | "The borrower that will receive the tokens in exchange for collateral" 376 | ] 377 | }, 378 | { 379 | "name": "borrowerCollateralAccount", 380 | "isMut": true, 381 | "isSigner": false 382 | }, 383 | { 384 | "name": "collateralMint", 385 | "isMut": true, 386 | "isSigner": false, 387 | "docs": ["type of token"] 388 | }, 389 | { 390 | "name": "loan", 391 | "isMut": true, 392 | "isSigner": false, 393 | "docs": [ 394 | "Expected loan prevents a replacement attack where the loan is replaced between the", 395 | "user signing take_loan and it hitting the chain" 396 | ] 397 | }, 398 | { 399 | "name": "escrow", 400 | "isMut": true, 401 | "isSigner": false 402 | }, 403 | { 404 | "name": "escrowCollateralTokenAccount", 405 | "isMut": false, 406 | "isSigner": false 407 | }, 408 | { 409 | "name": "tokenManager", 410 | "isMut": true, 411 | "isSigner": false 412 | }, 413 | { 414 | "name": "tokenManagerTokenAccount", 415 | "isMut": true, 416 | "isSigner": false 417 | }, 418 | { 419 | "name": "mintCounter", 420 | "isMut": true, 421 | "isSigner": false 422 | }, 423 | { 424 | "name": "tokenManagerProgram", 425 | "isMut": false, 426 | "isSigner": false 427 | }, 428 | { 429 | "name": "tokenProgram", 430 | "isMut": false, 431 | "isSigner": false 432 | }, 433 | { 434 | "name": "systemProgram", 435 | "isMut": false, 436 | "isSigner": false 437 | } 438 | ], 439 | "args": [ 440 | { 441 | "name": "isProgrammable", 442 | "type": "bool" 443 | } 444 | ] 445 | }, 446 | { 447 | "name": "forecloseLoan", 448 | "docs": ["Forecloses on a taken lone that has met some condition"], 449 | "accounts": [ 450 | { 451 | "name": "loan", 452 | "isMut": true, 453 | "isSigner": false 454 | }, 455 | { 456 | "name": "escrow", 457 | "isMut": true, 458 | "isSigner": false 459 | }, 460 | { 461 | "name": "escrowCollateralTokenAccount", 462 | "isMut": true, 463 | "isSigner": false 464 | }, 465 | { 466 | "name": "collateralMint", 467 | "isMut": true, 468 | "isSigner": false 469 | }, 470 | { 471 | "name": "lender", 472 | "isMut": true, 473 | "isSigner": true 474 | }, 475 | { 476 | "name": "lenderCollateralAccount", 477 | "isMut": true, 478 | "isSigner": false 479 | }, 480 | { 481 | "name": "tokenManager", 482 | "isMut": true, 483 | "isSigner": false 484 | }, 485 | { 486 | "name": "tokenManagerTokenAccount", 487 | "isMut": true, 488 | "isSigner": false 489 | }, 490 | { 491 | "name": "borrowerCollateralAccount", 492 | "isMut": true, 493 | "isSigner": false 494 | }, 495 | { 496 | "name": "collector", 497 | "isMut": true, 498 | "isSigner": false 499 | }, 500 | { 501 | "name": "tokenManagerProgram", 502 | "isMut": false, 503 | "isSigner": false 504 | }, 505 | { 506 | "name": "systemProgram", 507 | "isMut": false, 508 | "isSigner": false 509 | }, 510 | { 511 | "name": "tokenProgram", 512 | "isMut": false, 513 | "isSigner": false 514 | }, 515 | { 516 | "name": "associatedTokenProgram", 517 | "isMut": false, 518 | "isSigner": false 519 | }, 520 | { 521 | "name": "rent", 522 | "isMut": false, 523 | "isSigner": false 524 | }, 525 | { 526 | "name": "instructionSysvarAccount", 527 | "isMut": false, 528 | "isSigner": false 529 | }, 530 | { 531 | "name": "mplTokenMetadataProgram", 532 | "isMut": false, 533 | "isSigner": false 534 | }, 535 | { 536 | "name": "metadata", 537 | "isMut": true, 538 | "isSigner": false 539 | } 540 | ], 541 | "args": [ 542 | { 543 | "name": "editionNumber", 544 | "type": { 545 | "option": "u32" 546 | } 547 | }, 548 | { 549 | "name": "isProgrammable", 550 | "type": "bool" 551 | } 552 | ] 553 | }, 554 | { 555 | "name": "repayLoan", 556 | "docs": ["Repays a given loan in exchange for the NFT"], 557 | "accounts": [ 558 | { 559 | "name": "loan", 560 | "isMut": true, 561 | "isSigner": false 562 | }, 563 | { 564 | "name": "borrower", 565 | "isMut": true, 566 | "isSigner": true 567 | }, 568 | { 569 | "name": "borrowerCollateralAccount", 570 | "isMut": true, 571 | "isSigner": false 572 | }, 573 | { 574 | "name": "lender", 575 | "isMut": true, 576 | "isSigner": false 577 | }, 578 | { 579 | "name": "escrow", 580 | "isMut": true, 581 | "isSigner": false 582 | }, 583 | { 584 | "name": "escrowCollateralTokenAccount", 585 | "isMut": true, 586 | "isSigner": false 587 | }, 588 | { 589 | "name": "valueMint", 590 | "isMut": false, 591 | "isSigner": false 592 | }, 593 | { 594 | "name": "collateralMint", 595 | "isMut": true, 596 | "isSigner": false 597 | }, 598 | { 599 | "name": "orderBook", 600 | "isMut": false, 601 | "isSigner": false 602 | }, 603 | { 604 | "name": "feeAuthority", 605 | "isMut": true, 606 | "isSigner": false 607 | }, 608 | { 609 | "name": "tokenManager", 610 | "isMut": true, 611 | "isSigner": false 612 | }, 613 | { 614 | "name": "tokenManagerTokenAccount", 615 | "isMut": true, 616 | "isSigner": false 617 | }, 618 | { 619 | "name": "collector", 620 | "isMut": true, 621 | "isSigner": false 622 | }, 623 | { 624 | "name": "tokenManagerProgram", 625 | "isMut": false, 626 | "isSigner": false 627 | }, 628 | { 629 | "name": "systemProgram", 630 | "isMut": false, 631 | "isSigner": false 632 | }, 633 | { 634 | "name": "tokenProgram", 635 | "isMut": false, 636 | "isSigner": false 637 | }, 638 | { 639 | "name": "associatedTokenProgram", 640 | "isMut": false, 641 | "isSigner": false 642 | }, 643 | { 644 | "name": "rent", 645 | "isMut": false, 646 | "isSigner": false 647 | }, 648 | { 649 | "name": "instructionSysvarAccount", 650 | "isMut": false, 651 | "isSigner": false 652 | }, 653 | { 654 | "name": "mplTokenMetadataProgram", 655 | "isMut": false, 656 | "isSigner": false 657 | }, 658 | { 659 | "name": "metadata", 660 | "isMut": true, 661 | "isSigner": false 662 | } 663 | ], 664 | "args": [ 665 | { 666 | "name": "editionNumber", 667 | "type": { 668 | "option": "u32" 669 | } 670 | }, 671 | { 672 | "name": "isProgrammable", 673 | "type": "bool" 674 | } 675 | ] 676 | }, 677 | { 678 | "name": "forecloseLoanEscrow", 679 | "docs": ["Forecloses on a taken lone that has met some condition"], 680 | "accounts": [ 681 | { 682 | "name": "loan", 683 | "isMut": true, 684 | "isSigner": false 685 | }, 686 | { 687 | "name": "escrow", 688 | "isMut": true, 689 | "isSigner": false 690 | }, 691 | { 692 | "name": "escrowCollateralTokenAccount", 693 | "isMut": true, 694 | "isSigner": false 695 | }, 696 | { 697 | "name": "collateralMint", 698 | "isMut": false, 699 | "isSigner": false 700 | }, 701 | { 702 | "name": "lender", 703 | "isMut": true, 704 | "isSigner": true 705 | }, 706 | { 707 | "name": "lenderCollateralAccount", 708 | "isMut": true, 709 | "isSigner": false 710 | }, 711 | { 712 | "name": "systemProgram", 713 | "isMut": false, 714 | "isSigner": false 715 | }, 716 | { 717 | "name": "tokenProgram", 718 | "isMut": false, 719 | "isSigner": false 720 | }, 721 | { 722 | "name": "associatedTokenProgram", 723 | "isMut": false, 724 | "isSigner": false 725 | }, 726 | { 727 | "name": "instructionSysvarAccount", 728 | "isMut": false, 729 | "isSigner": false 730 | }, 731 | { 732 | "name": "mplTokenMetadataProgram", 733 | "isMut": false, 734 | "isSigner": false 735 | }, 736 | { 737 | "name": "metadata", 738 | "isMut": true, 739 | "isSigner": false 740 | } 741 | ], 742 | "args": [ 743 | { 744 | "name": "editionNumber", 745 | "type": { 746 | "option": "u32" 747 | } 748 | }, 749 | { 750 | "name": "isProgrammable", 751 | "type": "bool" 752 | } 753 | ] 754 | }, 755 | { 756 | "name": "repayLoanEscrow", 757 | "docs": ["Repays a given loan in exchange for the NFT"], 758 | "accounts": [ 759 | { 760 | "name": "loan", 761 | "isMut": true, 762 | "isSigner": false 763 | }, 764 | { 765 | "name": "borrower", 766 | "isMut": true, 767 | "isSigner": true 768 | }, 769 | { 770 | "name": "borrowerCollateralAccount", 771 | "isMut": true, 772 | "isSigner": false 773 | }, 774 | { 775 | "name": "lender", 776 | "isMut": true, 777 | "isSigner": false 778 | }, 779 | { 780 | "name": "escrow", 781 | "isMut": true, 782 | "isSigner": false 783 | }, 784 | { 785 | "name": "escrowCollateralTokenAccount", 786 | "isMut": true, 787 | "isSigner": false 788 | }, 789 | { 790 | "name": "valueMint", 791 | "isMut": false, 792 | "isSigner": false 793 | }, 794 | { 795 | "name": "collateralMint", 796 | "isMut": false, 797 | "isSigner": false 798 | }, 799 | { 800 | "name": "orderBook", 801 | "isMut": false, 802 | "isSigner": false 803 | }, 804 | { 805 | "name": "feeAuthority", 806 | "isMut": true, 807 | "isSigner": false 808 | }, 809 | { 810 | "name": "systemProgram", 811 | "isMut": false, 812 | "isSigner": false 813 | }, 814 | { 815 | "name": "tokenProgram", 816 | "isMut": false, 817 | "isSigner": false 818 | }, 819 | { 820 | "name": "associatedTokenProgram", 821 | "isMut": false, 822 | "isSigner": false 823 | }, 824 | { 825 | "name": "rent", 826 | "isMut": false, 827 | "isSigner": false 828 | }, 829 | { 830 | "name": "instructionSysvarAccount", 831 | "isMut": false, 832 | "isSigner": false 833 | }, 834 | { 835 | "name": "mplTokenMetadataProgram", 836 | "isMut": false, 837 | "isSigner": false 838 | }, 839 | { 840 | "name": "metadata", 841 | "isMut": true, 842 | "isSigner": false 843 | } 844 | ], 845 | "args": [ 846 | { 847 | "name": "editionNumber", 848 | "type": { 849 | "option": "u32" 850 | } 851 | }, 852 | { 853 | "name": "isProgrammable", 854 | "type": "bool" 855 | } 856 | ] 857 | }, 858 | { 859 | "name": "createNftList", 860 | "accounts": [ 861 | { 862 | "name": "nftList", 863 | "isMut": true, 864 | "isSigner": false 865 | }, 866 | { 867 | "name": "payer", 868 | "isMut": false, 869 | "isSigner": true 870 | } 871 | ], 872 | "args": [ 873 | { 874 | "name": "collectionName", 875 | "type": "string" 876 | } 877 | ] 878 | }, 879 | { 880 | "name": "updateNftList", 881 | "accounts": [ 882 | { 883 | "name": "nftList", 884 | "isMut": true, 885 | "isSigner": false 886 | }, 887 | { 888 | "name": "payer", 889 | "isMut": false, 890 | "isSigner": true 891 | } 892 | ], 893 | "args": [ 894 | { 895 | "name": "mints", 896 | "type": { 897 | "vec": { 898 | "defined": "UpdateIndex" 899 | } 900 | } 901 | } 902 | ] 903 | }, 904 | { 905 | "name": "closeNftList", 906 | "accounts": [ 907 | { 908 | "name": "nftList", 909 | "isMut": true, 910 | "isSigner": false 911 | }, 912 | { 913 | "name": "payer", 914 | "isMut": false, 915 | "isSigner": true 916 | } 917 | ], 918 | "args": [] 919 | }, 920 | { 921 | "name": "initEscrowPda", 922 | "accounts": [ 923 | { 924 | "name": "systemProgram", 925 | "isMut": false, 926 | "isSigner": false 927 | }, 928 | { 929 | "name": "rent", 930 | "isMut": false, 931 | "isSigner": false 932 | }, 933 | { 934 | "name": "payer", 935 | "isMut": true, 936 | "isSigner": true 937 | }, 938 | { 939 | "name": "loan", 940 | "isMut": false, 941 | "isSigner": false 942 | }, 943 | { 944 | "name": "escrow", 945 | "isMut": true, 946 | "isSigner": false 947 | } 948 | ], 949 | "args": [] 950 | } 951 | ], 952 | "accounts": [ 953 | { 954 | "name": "OrderBook", 955 | "type": { 956 | "kind": "struct", 957 | "fields": [ 958 | { 959 | "name": "version", 960 | "type": "u8" 961 | }, 962 | { 963 | "name": "orderBookType", 964 | "type": { 965 | "defined": "OrderBookType" 966 | } 967 | }, 968 | { 969 | "name": "apy", 970 | "type": { 971 | "defined": "APY" 972 | } 973 | }, 974 | { 975 | "name": "loanTerms", 976 | "type": { 977 | "defined": "BookLoanTerms" 978 | } 979 | }, 980 | { 981 | "name": "feePermillicentage", 982 | "type": "u16" 983 | }, 984 | { 985 | "name": "feeAuthority", 986 | "type": "publicKey" 987 | } 988 | ] 989 | } 990 | }, 991 | { 992 | "name": "Loan", 993 | "type": { 994 | "kind": "struct", 995 | "fields": [ 996 | { 997 | "name": "version", 998 | "type": "u8" 999 | }, 1000 | { 1001 | "name": "principalLamports", 1002 | "docs": ["amount in tokens, decimals included"], 1003 | "type": "u64" 1004 | }, 1005 | { 1006 | "name": "orderBook", 1007 | "type": "publicKey" 1008 | }, 1009 | { 1010 | "name": "valueTokenMint", 1011 | "docs": ["Token mint for what the loan is in (spl address)"], 1012 | "type": "publicKey" 1013 | }, 1014 | { 1015 | "name": "escrowBumpSeed", 1016 | "type": "u8" 1017 | }, 1018 | { 1019 | "name": "loanState", 1020 | "docs": ["stores start and duration"], 1021 | "type": { 1022 | "defined": "LoanState" 1023 | } 1024 | } 1025 | ] 1026 | } 1027 | }, 1028 | { 1029 | "name": "NFTList", 1030 | "type": { 1031 | "kind": "struct", 1032 | "fields": [ 1033 | { 1034 | "name": "version", 1035 | "type": "u8" 1036 | }, 1037 | { 1038 | "name": "collectionName", 1039 | "type": "string" 1040 | } 1041 | ] 1042 | } 1043 | }, 1044 | { 1045 | "name": "EscrowPDA", 1046 | "type": { 1047 | "kind": "struct", 1048 | "fields": [ 1049 | { 1050 | "name": "bump", 1051 | "type": "u8" 1052 | } 1053 | ] 1054 | } 1055 | } 1056 | ], 1057 | "types": [ 1058 | { 1059 | "name": "UpdateIndex", 1060 | "type": { 1061 | "kind": "struct", 1062 | "fields": [ 1063 | { 1064 | "name": "index", 1065 | "type": "u32" 1066 | }, 1067 | { 1068 | "name": "mint", 1069 | "type": "publicKey" 1070 | } 1071 | ] 1072 | } 1073 | }, 1074 | { 1075 | "name": "LoanOffer", 1076 | "type": { 1077 | "kind": "struct", 1078 | "fields": [ 1079 | { 1080 | "name": "lenderWallet", 1081 | "type": "publicKey" 1082 | }, 1083 | { 1084 | "name": "termsSpec", 1085 | "type": { 1086 | "defined": "LoanTermsSpec" 1087 | } 1088 | }, 1089 | { 1090 | "name": "offerTime", 1091 | "type": "i64" 1092 | } 1093 | ] 1094 | } 1095 | }, 1096 | { 1097 | "name": "TakenLoan", 1098 | "type": { 1099 | "kind": "struct", 1100 | "fields": [ 1101 | { 1102 | "name": "nftCollateralMint", 1103 | "type": "publicKey" 1104 | }, 1105 | { 1106 | "name": "lenderNoteMint", 1107 | "type": "publicKey" 1108 | }, 1109 | { 1110 | "name": "borrowerNoteMint", 1111 | "type": "publicKey" 1112 | }, 1113 | { 1114 | "name": "apy", 1115 | "docs": [ 1116 | "Thousandths of a percent (allows to have 3 decimal points of precision)" 1117 | ], 1118 | "type": { 1119 | "defined": "APY" 1120 | } 1121 | }, 1122 | { 1123 | "name": "terms", 1124 | "type": { 1125 | "defined": "LoanTerms" 1126 | } 1127 | } 1128 | ] 1129 | } 1130 | }, 1131 | { 1132 | "name": "APY", 1133 | "docs": ["APY settings on an [`OrderBook`]"], 1134 | "type": { 1135 | "kind": "enum", 1136 | "variants": [ 1137 | { 1138 | "name": "Fixed", 1139 | "fields": [ 1140 | { 1141 | "name": "apy", 1142 | "docs": ["Thousandths of a percent"], 1143 | "type": "u32" 1144 | } 1145 | ] 1146 | } 1147 | ] 1148 | } 1149 | }, 1150 | { 1151 | "name": "BookLoanTerms", 1152 | "type": { 1153 | "kind": "enum", 1154 | "variants": [ 1155 | { 1156 | "name": "Fixed", 1157 | "fields": [ 1158 | { 1159 | "name": "terms", 1160 | "type": { 1161 | "defined": "LoanTermsSpec" 1162 | } 1163 | } 1164 | ] 1165 | }, 1166 | { 1167 | "name": "LenderChooses" 1168 | } 1169 | ] 1170 | } 1171 | }, 1172 | { 1173 | "name": "LoanTermsSpec", 1174 | "type": { 1175 | "kind": "enum", 1176 | "variants": [ 1177 | { 1178 | "name": "Time", 1179 | "fields": [ 1180 | { 1181 | "name": "duration", 1182 | "type": "u64" 1183 | } 1184 | ] 1185 | } 1186 | ] 1187 | } 1188 | }, 1189 | { 1190 | "name": "OrderBookType", 1191 | "type": { 1192 | "kind": "enum", 1193 | "variants": [ 1194 | { 1195 | "name": "Collection", 1196 | "fields": [ 1197 | { 1198 | "name": "collection_key", 1199 | "type": "publicKey" 1200 | } 1201 | ] 1202 | }, 1203 | { 1204 | "name": "NFTList", 1205 | "fields": [ 1206 | { 1207 | "name": "list_account", 1208 | "type": "publicKey" 1209 | } 1210 | ] 1211 | } 1212 | ] 1213 | } 1214 | }, 1215 | { 1216 | "name": "LoanTerms", 1217 | "type": { 1218 | "kind": "enum", 1219 | "variants": [ 1220 | { 1221 | "name": "Time", 1222 | "fields": [ 1223 | { 1224 | "name": "start", 1225 | "docs": ["This is a [`UnixTimeStamp`]"], 1226 | "type": "i64" 1227 | }, 1228 | { 1229 | "name": "duration", 1230 | "type": "u64" 1231 | }, 1232 | { 1233 | "name": "total_owed_lamports", 1234 | "type": "u64" 1235 | } 1236 | ] 1237 | } 1238 | ] 1239 | } 1240 | }, 1241 | { 1242 | "name": "LoanState", 1243 | "type": { 1244 | "kind": "enum", 1245 | "variants": [ 1246 | { 1247 | "name": "Offer", 1248 | "fields": [ 1249 | { 1250 | "name": "offer", 1251 | "type": { 1252 | "defined": "LoanOffer" 1253 | } 1254 | } 1255 | ] 1256 | }, 1257 | { 1258 | "name": "Taken", 1259 | "fields": [ 1260 | { 1261 | "name": "taken", 1262 | "type": { 1263 | "defined": "TakenLoan" 1264 | } 1265 | } 1266 | ] 1267 | } 1268 | ] 1269 | } 1270 | } 1271 | ], 1272 | "errors": [ 1273 | { 1274 | "code": 6000, 1275 | "name": "Custom", 1276 | "msg": "Custom" 1277 | }, 1278 | { 1279 | "code": 6001, 1280 | "name": "InvalidArgument", 1281 | "msg": "InvalidArgument" 1282 | }, 1283 | { 1284 | "code": 6002, 1285 | "name": "InvalidAccountData", 1286 | "msg": "InvalidAccountData" 1287 | }, 1288 | { 1289 | "code": 6003, 1290 | "name": "IllegalOwner", 1291 | "msg": "IllegalOwner" 1292 | }, 1293 | { 1294 | "code": 6004, 1295 | "name": "LoanIsCardinal", 1296 | "msg": "Loan is cardinal when calling function that requires escrow" 1297 | }, 1298 | { 1299 | "code": 6005, 1300 | "name": "LoanIsEscrow", 1301 | "msg": "Loan is escrow when calling function that requires cardinal" 1302 | }, 1303 | { 1304 | "code": 6006, 1305 | "name": "InvalidMint", 1306 | "msg": "Mint is invalid" 1307 | }, 1308 | { 1309 | "code": 6007, 1310 | "name": "NumericalOverflowError", 1311 | "msg": "Numerical overflow error" 1312 | }, 1313 | { 1314 | "code": 6008, 1315 | "name": "MismatchedNftCollateralMint", 1316 | "msg": "Mismatched NFT collateral mint" 1317 | }, 1318 | { 1319 | "code": 6009, 1320 | "name": "MismatchedValueTokenMint", 1321 | "msg": "Mismatched value token mint" 1322 | }, 1323 | { 1324 | "code": 6010, 1325 | "name": "MismatchedLender", 1326 | "msg": "Mismatched lender" 1327 | }, 1328 | { 1329 | "code": 6011, 1330 | "name": "NotForeclosable", 1331 | "msg": "Loan is not foreclosable" 1332 | }, 1333 | { 1334 | "code": 6012, 1335 | "name": "FeeCalculationError", 1336 | "msg": "Fee calculation error" 1337 | }, 1338 | { 1339 | "code": 6013, 1340 | "name": "InvalidBookLoanTermsType", 1341 | "msg": "Invalid book loan terms type" 1342 | }, 1343 | { 1344 | "code": 6014, 1345 | "name": "InvalidEscrowBump", 1346 | "msg": "Invalid escrow bump" 1347 | } 1348 | ] 1349 | } 1350 | --------------------------------------------------------------------------------