npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@mithraic-labs/psyfi-sdk

v1.0.6

Published

yarn

Downloads

264

Readme

Prerequisites

yarn

yarn add @solana/web3.js

Program IDs

| Program ID | Mainnet Public Key | Devnet Public Key | | ---------- | ------------------------------------------- | -------------------------------------------- | | PSYFI_V2 | PSYFiYqguvMXwpDooGdYV6mju92YEbFobbvW617VNcq | 95q3X9ADJv5hWt93oSaPqABPnP1rqfmjgrnto9v83LPK | | PSYSTAKE | pSystkitWgLkzprdAvraP8DSBiXwee715wiSXGJe8yr | 5LrZkBFgDkFiKEePeT2N9VuKfd2k8Rrad9PG6mKGbCRk |

Installation

yarn add @mithraic-labs/psyfi-sdk

Publishing a new version

yarn publish --public

Usage

Vaults Information

const getVaultsInfo(isMainnet: boolean);

Example

import { getVaultsInfo } from "psyfi-sdk";

const data = await getVaultsInfo(true);

Response Scheme

|-- vaults
   |-- id: ID of the vault
      |-- name: Name of the vault
      |-- staking
         |-- metadata
            |-- isValuePerVaultToken: Price of each vault token
         |-- stakePoolKey: Staking Key of vault tokens
         |-- stakingApr: Annual percentage rate (0, 30, 60, 180, 360) days.
         |-- poolRewards
            |-- rewardTokensPerWeek: Amount of reward tokens given out by the vault each week.
            |-- multiplier
            |-- metadata
               |-- usdValuePerRewardToken: Price of the reward token
               |-- rewardInUsdPerYearPerRewardUnit: Number of unit rewards staker is eligible for (size of their position * lock up period selected)
               |-- rewardPoolApr: Annual percentage rate (0, 30, 60, 180, 360) days.
               |-- rewardPoolKey: Vault pool reward address
               |-- rewardMintAddress: Reward token address
               |-- tokenSymbol: Short form of the token name
               |-- poolId: Unique identifier for the pool
      |-- deposits
         |-- current: Deposit amount in vault
         |-- max: Max deposit amount for the vault
      |-- strategyType: 0 (Covered Call), 1 (Secured Put)
      |-- accounts
         |-- optionsUnderlyingMint: SPL token address used as underlying asset for options minted
         |-- collateralAssetMint:  SPL token address of asset used as collateral for options minted
         |-- feeTokenAccount: Solana account for fee collection
         |-- vaultOwnershipTokenMint: SPL token address of vault ownership token
         |-- vaultAddress: Solana account address for the vault
         |-- pythPriceOracle: Price oracle address used for settlement
      |-- status
         |-- optionsActive: If any option are minted from vault
         |-- currentEpoch: Epoch number
         |-- nextOptionMintTime: Time for next option mint
         |-- nextEpochStartTime: Next epoch start time
         |-- isDeprecated: If the vault is deprecated
      |-- visibility: 0 - production, 1 - staging, 2 - development
      |-- selectedStrike: Strike price for options minted
      |-- fees
         |-- performance: Performance fee in percentage
         |-- withdrawal: Withdrawal fee in percentage
      |-- id: Unique identifier for the vault
      |-- version: Version of the vaults
      |-- valuePerVaultToken: Current value of vault token in collateral asset
      |-- apy:
         |-- stakingApy: Apy from SOL staking (When collateral asset is a liquid staking token)
         |-- weightedApy:
            |-- targetDelta: Delta used for strike selection
            |-- epochsCounted: Number of epochs included in the calculation
            |-- apyAfterFees: Apy after fee deductions
            |-- averageSaleYield: Average yield generated from option sale
            |-- apyBeforeFees: Apy before fee deductions
            |-- averageHistoricalLoss: Average percentage loss when option expire in the money
         |-- currentEpochApy: Apy based on projected current epoch yield
         |-- movingAverageApy:
            |-- apyAfterFees: Apy after fee deductions
            |-- epochsCounted: Number of epochs included in the calculation
            |-- averageEpochYield: Average yield generated from option sale
            |-- apyBeforeFees: Apy before fee deductions
   |-- vaultHistory: Array of each epoch's history
      |-- epoch: Epoch Number
      |-- endingValuePerVaultToken: Value of token at the end of epoch in collateral asset
      |-- saleAmount: Amount option was sold for in collateral asset.
      |-- percentageLossOnCollateral: Percentage loss on collateral at the end of epoch.
      |-- epochHistoryKey: Account storing epoch history
      |-- startDate: Epoch start date
      |-- optionMinted: Formatted string of option minted with strike price
      |-- priceAtExpiry: Price of underlying at expiry
      |-- strikePrice: Strike price of option minted
      |-- overallYield: Overall yield earned from epoch
      |-- saleYield: Yield earned from option sale

Response Object

{
   "vaults":{
      "btc-put":{
         "name":"BTC SECURED PUT",
         "staking":{
            "metadata":{
               "usdValuePerVaultToken":0.8799150861566609
            },
            "stakePoolKey":"7waRUqnzcLopivSH3FCBrTPXij63XY4qGnFJ99XjVRaB",
            "stakingApr":[
               13.623659938287103,
               15.667208929030169,
               18.663123213214559,
               22,
               901231231232142
            ],
            "poolRewards":[
               {
                  "rewardTokensPerWeek":1470,
                  "multiplier":1,
                  "metadata":{
                     "usdValuePerRewardToken":1.051,
                     "rewardInUsdPerYearPerRewardUnit":1.1987663908366946e-7,
                     "rewardPoolApr":[
                        13.623659938287103,
                        15.667208929030169,
                        18.663123213214559,
                        22,
                        901231231232142
                     ]
                  },
                  "rewardPoolKey":"33LYcoXVPWzvj4jpihfX5bLMw4irfx614jGoeENF3VTa",
                  "rewardMintAddress":"SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt",
                  "tokenSymbol":"SRM",
                  "poolId":1
               }
            ]
         },
         "deposits":{
            "current":528072.232153,
            "max":850000
         },
         "strategyType":1,
         "accounts":{
            "optionsUnderlyingMint":"9n4nbM75f5Ui33ZbPYXn59EwSgE8CGsHtAeTH5YFeJ9E",
            "collateralAssetMint":"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",
            "feeTokenAccount":"EfNdRWbRU6NpNd3KZq85PDsdTdsp1SBiG1S6Pebo9yA2",
            "vaultOwnershipTokenMint":"Df312h5rL4LxGBmUGvRxD1F5gTUwVbsezNKYMRQteeg4",
            "vaultAddress":"792ELQdQ6nZBSBrKjRiJXxH1ZFpNjHktnpMdp2auyXMF",
            "pythPriceOracle":"GVXRSBjFk6e6J3NbVPXohDJetcTjaeeuykUpbQF8UoMU"
         },
         "status":{
            "optionsActive":true,
            "currentEpoch":9,
            "nextOptionMintTime":1659083400,
            "nextEpochStartTime":1659081600,
            "isDeprecated":false
         },
         "visibility":0,
         "selectedStrike":18500,
         "fees":{
            "performance":10,
            "withdrawal":0.1
         },
         "id":"btc-put",
         "version":2,
         "valuePerVaultToken":0.8803702375694843,
         "apy":{
            "weightedApy":{
               "targetDelta":0.075,
               "epochsCounted":5,
               "apyAfterFees":9.160780173655736,
               "averageSaleYield":0.16870302234227325,
               "apyBeforeFees":10.22809414018675,
               "averageHistoricalLoss":0
            },
            "currentEpochApy":13.55016666193871,
            "stakingApy":0,
            "movingAverageApy":{
               "apyAfterFees":10.171200641996037,
               "epochsCounted":4,
               "averageEpochYield":0.20717011873986652,
               "apyBeforeFees":11.362117467964561
            }
         },
         "vaultHistory":[
            {
               "epoch":3,
               "endingValuePerVaultToken":0.862161239511,
               "saleAmount":429.3282,
               "percentageLossOnCollateral":13.997020408163266,
               "epochHistoryKey":"EfsEWATN4LL7hhMedinKxaayH4rPGzK6WhKDxMmYGYmT",
               "startDate":1654848000,
               "optionMinted":"17 JUN EXP - BTC PUT STRIKE $24500",
               "priceAtExpiry":21070.73,
               "strikePrice":24500,
               "overallYield":-13.783876048900002,
               "saleYield":0.21314435926326425
            },
            {
               "strikePrice":15000,
               "saleAmount":2437.82448,
               "optionMinted":"24 JUN EXP - BTC PUT STRIKE $15000",
               "priceAtExpiry":20911.0525,
               "epoch":4,
               "startDate":1655452800,
               "overallYield":0.8392309928133335,
               "saleYield":0.8392309928133335,
               "endingValuePerVaultToken":0.869396763841,
               "percentageLossOnCollateral":0,
               "epochHistoryKey":"68u71YZfA3msFjvRwrAKV7eC2JQstevzYyGjGs7MAWgD"
            }
         ]
      }
   }
}

Retrieve wallet positions for all vaults

const getAllUserVaultPositions = async (
    userWallet: PublicKey,
    connection: Connection,
    isMainnet = true
)

Example

import { getAllUserVaultPositions } from "psyfi-sdk";

const userWallet = new PublicKey(
   "Fbhqzu1S9x9dik7Sjxt3iWZbUXUU2WSfFyeqGcKuBoR7"
);
const connection = new Connection("https://ssc-dao.genesysgo.net/");
const userPosition = await getAllUserVaultPositions(
   userWallet,
   connection,
);

Response Object

{
    scnsol-sol-call': {
        totalUserVaultTokens: 0,
        valuePerVaultToken: 1.0251216147403115,
        rewardMultiplier: 1,
        pendingWithdrawalInVaultTokens: 0,
        claimableRewards: {
            SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt: {
                totalClaimableAmount: 0.186569,
                tokenSymbol: 'SRM',
                epochsToClaim: { '1': [Array] }
            }
        },
        vaultTokensInWallet: 0,
        vaultTokensStaked: 0,
        remainingLockupInSeconds: 0,
        vaultTokenDecimals: 9,
        pendingCollateralAssetDeposits: 0
    },
    'stsol-call': {
        totalUserVaultTokens: 8403485,
        valuePerVaultToken: 1.0251216147403115,
        rewardMultiplier: 1,
        pendingWithdrawalInVaultTokens: 0,
        claimableRewards: {
            SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt: {
                totalClaimableAmount: 0.186569,
                tokenSymbol: 'SRM',
                epochsToClaim: { '1': [Array] }
            }
        },
        vaultTokensInWallet: 0,
        vaultTokensStaked: 8403485,
        remainingLockupInSeconds: 86400, // Staked tokes are locked up 1 more day.
        vaultTokenDecimals: 9,
        pendingCollateralAssetDeposits: 0
    }
}

Retrieve wallet position for a single vault

const getUserVaultPosition = async (
    walletAddress: PublicKey,
    vaultName: string,
    connection: Connection,
    isMainnet = true
)

Example

import { getUserVaultPosition } from "psyfi-sdk";
import { Connection, PublicKey } from "@solana/web3.js";

const connection = new Connection("https://ssc-dao.genesysgo.net/");

const userWallet = new PublicKey(
   "Fbhqzu1S9x9dik7Sjxt3iWZbUXUU2WSfFyeqGcKuBoR7"
);

const userPosition = await getUserVaultPosition(
  userWallet,
  "sol-call",
  connection,
);

Response Object

 {
    totalUserVaultTokens: 8403485,
    valuePerVaultToken: 1.0251216147403115,
    rewardMultiplier: 1,
    pendingWithdrawalInVaultTokens: 0,
    claimableRewards: {
        SRMuApVNdxXokk5GT7XD5cUUgXMBCoAz2LHeuAoKWRt: {
            totalClaimableAmount: 0.186569,
            tokenSymbol: 'SRM',
            epochsToClaim: { '1': [Array] }
        }
    },
    vaultTokensInWallet: 0,
    vaultTokensStaked: 8403485,
    remainingLockupInSeconds: 0,
    vaultTokenDecimals: 9,
    pendingCollateralAssetDeposits: 0
}

PDAS

Example

import { pdas } from "psyfi-sdk";

const userAuthority = pdas.derivePoolAuthority();

Retrieve underlying pool key

const deriveUnderlyingPoolKey = (underlyingMint: PublicKey)

Retrieve stable pool key

const deriveStablePoolKey = (stableMint: PublicKey)

Retrieve call option mint

const deriveCallOptionMint = (euroMetaKey: PublicKey)

Retrieve call writer mint

const deriveCallWriterMint = (euroMetaKey: PublicKey)

Retrieve put option mint

const derivePutOptionMint = (euroMetaKey: PublicKey)

Retrieve put writer mint

const derivePutWriterMint = (euroMetaKey: PublicKey)

Retrieve pool authority

const derivePoolAuthority();

Retrieve staking record

const deriveStakingRecord = async (
  programId: PublicKey,
  recordOwner: PublicKey,
  stakePool: PublicKey
)

Retrieve reward record

const deriveRewardRecord = async (
  programId: PublicKey,
  rewardPool: PublicKey,
  rewardEpoch: number
)

Retrieve vault account

const deriveVaultAccount = async (
  programKey: PublicKey,
  collateralAssetMint: PublicKey,
  quoteAssetMint: PublicKey,
  uniqueSeed: number,
  strategyType: number
)

Retrieve epoch history

const deriveEpochHistory = async (
  programKey: PublicKey,
  vaultAccount: PublicKey,
  epoch: number
)

Retrieve vault authority

const deriveVaultAuthority = async (
  programKey: PublicKey,
  vaultAccount: PublicKey
)

Retrieve collateral account

const deriveVaultCollateralAccount = async (
  programKey: PublicKey,
  vaultAccount: PublicKey
)

Retrieve vault token mint

const deriveVaultTokenMint = async (
  programKey: PublicKey,
  vaultAccount: PublicKey
)

Retrieve vault token account

const deriveVaultTokenAccount = async (
  programKey: PublicKey,
  vaultAccount: PublicKey
)

Retrieve withdrawal collateral account

const deriveWithdrawalCollateralAccount = async (
  programKey: PublicKey,
  vaultAccount: PublicKey
)

Retrieve deposit receipt

const deriveDepositReceipt = async (
  programKey: PublicKey,
  userAuthority: PublicKey,
  vaultAccount: PublicKey,
  epoch: number
)

Retrieve withdrawal receipt

const deriveWithdrawalReceipt = async (
  programKey: PublicKey,
  userAuthority: PublicKey,
  vaultAccount: PublicKey,
  epoch: number
)

Retrieve open orders address

const deriveOpenOrdersAddress = async (
  serumMarket: PublicKey,
  authority: PublicKey,
  serumDexProgramKey: PublicKey
)

Retrieve market authority

const deriveMarketAuthority = async (
  serumMarketKey: PublicKey,
  serumDexProgramKey: PublicKey
)

Retrieve request queue

const deriveRequestQueue = (
  optionMintKey: PublicKey,
  priceCurrencyKey: PublicKey
)

Retrieve coin vault

const deriveCoinVault = (
  optionMintKey: PublicKey,
  priceCurrencyKey: PublicKey
)

Retrieve PC vault

const derivePCVault = (
  optionMintKey: PublicKey,
  priceCurrencyKey: PublicKey
)

Retrieve serum market address

const deriveSerumMarketAddress = (
  optionMintKey: PublicKey,
  priceCurrencyKey: PublicKey
)

Retrieve serum vault owner

const deriveSerumVaultOwner = async (
  serumMarket: PublicKey,
  serumDexProgramKey: PublicKey
)

Retrieve active markets for vault bidding

const getActiveVaultMarkets = async (
    isMainnet = true
)

Example

import { vaultBidding } from "psyfi-sdk";

const activeVaultBiddingMarkets = await vaultBidding.getActiveVaultMarkets(true);

Response Object

[
    {
        "isCall": true,
        "amount": 3.8,
        "serumMarketKey": "GAzxTQhujhitUt36TWkPuxxR7o9CN2qPSFMKJrgkZeCn",
        "expirationTimestamp": 1664687098000,
        "strike": 30000,
        "endTimestamp": 1664601637000,
        "collateralKey": "E6Z6zLzk8MWY3TY8E87mr88FhGowEPJTeMWzkqtL6qkF",
        "optionMintKey": "BtqTXRHhLLkqM2fibfqg4fRBpGpTXU4x8PajFpzBfoH4",
        "euroMetaAddress": "XsoQc96WEBai5TJpFFUMZEYTSBomo3YZWGZys4bciuU",
        "underlyingMint": "C6kYXcaRUMqeBF5fhg165RWU7AnpT9z92fvKNoMqjmz6",
        "stableMint": "E6Z6zLzk8MWY3TY8E87mr88FhGowEPJTeMWzkqtL6qkF"
    },
    {
        "isCall": true,
        "amount": 3.8,
        "serumMarketKey": "BnLsvJa9SmpQXqawKaR7C8mrW4EbGwqkmhfXYfpXWtTB",
        "expirationTimestamp": 1664687098000,
        "strike": 30000,
        "endTimestamp": 1664601637000,
        "euroMetaAddress": "XsoQc96WEBai5TJpFFUMZEYTSBomo3YZWGZys4bciuU",
        "collateralKey": "C6kYXcaRUMqeBF5fhg165RWU7AnpT9z92fvKNoMqjmz6",
        "optionMintKey": "BtqTXRHhLLkqM2fibfqg4fRBpGpTXU4x8PajFpzBfoH4",
        "underlyingMint": "C6kYXcaRUMqeBF5fhg165RWU7AnpT9z92fvKNoMqjmz6",
        "stableMint": "E6Z6zLzk8MWY3TY8E87mr88FhGowEPJTeMWzkqtL6qkF"
    },
    {
        "isCall": false,
        "amount": 50,
        "serumMarketKey": "BNw1rt21EZQw5KfZLaAUCAziQ9vecvMh1JNdvdz6TfHW",
        "expirationTimestamp": 1672387300000,
        "strike": 20,
        "endTimestamp": 1672387200000,
        "collateralKey": "E6Z6zLzk8MWY3TY8E87mr88FhGowEPJTeMWzkqtL6qkF",
        "optionMintKey": "58nC3yncBnir2p9CDeAPzezR9rfVmmzpWym53svxeTq6",
        "euroMetaAddress": "3CykuF8d1FrQYTfANZzZSCmmQUdkkJFj7ZZzTdxpwS7o",
        "underlyingMint": "So11111111111111111111111111111111111111112",
        "stableMint": "E6Z6zLzk8MWY3TY8E87mr88FhGowEPJTeMWzkqtL6qkF"
    }
]

Place bid for an active vault bidding market

const placeBid = async (
  euroMetaAddress: string,
  collateralKey: string,
  optionMintKey: string,
  price: number,
  size: number,
  wallet: AnchorWallet,
  isMainnet: boolean,
)

Example

import { vaultBidding } from "psyfi-sdk";
import { useAnchorWallet } from '@solana/wallet-adapter-react';

const wallet = useAnchorWallet();

await vaultBidding.placeBid(
   "3CykuF8d1FrQYTfANZzZSCmmQUdkkJFj7ZZzTdxpwS7o", // euroMeta address
   "E6Z6zLzk8MWY3TY8E87mr88FhGowEPJTeMWzkqtL6qkF", // collateralKey
   "58nC3yncBnir2p9CDeAPzezR9rfVmmzpWym53svxeTq6", // optionMintKey
   200, // price per contract
   2, // contract quantity
   wallet,
   true // mainnet
)

Response Object

Calling the function will prompt the user to sign the transaction with their connected wallet Once the transaction is confirmed, the function returns the transaction signature:

   "3Nhc34rD1aiZNj6XHjVezXp9anPumDhm9ZErFSsEp3SfwPgds94Sjnb3ugUzdDjF425KsDxi16sZ1uGh9Dcspbkp"

Cancel all bids for vault bidding market

const cancelAllBidsForMarket = async (
  serumMarketKey: string,
  euroMetaAddress: string,
  collateralKey: string,
  optionMintKey: string
  wallet: AnchorWallet,
  isMainnet = true,
)

Example

import { vaultBidding } from "psyfi-sdk";
import { useAnchorWallet } from '@solana/wallet-adapter-react';

const wallet = useAnchorWallet();

await vaultBidding.cancelAllBidsForMarket(
   "BNw1rt21EZQw5KfZLaAUCAziQ9vecvMh1JNdvdz6TfHW",
   "3CykuF8d1FrQYTfANZzZSCmmQUdkkJFj7ZZzTdxpwS7o",
   "E6Z6zLzk8MWY3TY8E87mr88FhGowEPJTeMWzkqtL6qkF",
   "58nC3yncBnir2p9CDeAPzezR9rfVmmzpWym53svxeTq6"
   wallet,
   false,
)

Response Object

Calling the function will prompt the user to sign the transaction with their connected wallet Once the transaction is confirmed, the function returns the transaction signature:

   "3Nhc34rD1aiZNj6XHjVezXp9anPumDhm9ZErFSsEp3SfwPgds94Sjnb3ugUzdDjF425KsDxi16sZ1uGh9Dcspbkp"