1.0.6 • Published 2 years ago

@mithraic-labs/psyfi-sdk v1.0.6

Weekly downloads
-
License
MIT
Repository
-
Last release
2 years ago

Prerequisites

yarn

yarn add @solana/web3.js

Program IDs

Program IDMainnet Public KeyDevnet Public Key
PSYFI_V2PSYFiYqguvMXwpDooGdYV6mju92YEbFobbvW617VNcq95q3X9ADJv5hWt93oSaPqABPnP1rqfmjgrnto9v83LPK
PSYSTAKEpSystkitWgLkzprdAvraP8DSBiXwee715wiSXGJe8yr5LrZkBFgDkFiKEePeT2N9VuKfd2k8Rrad9PG6mKGbCRk

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"
1.0.5-rc1

2 years ago

1.0.5-rc2

2 years ago

1.0.6

2 years ago

1.0.5

2 years ago

1.0.4-rc1

2 years ago

1.0.6-rc1

2 years ago

1.0.2

2 years ago

1.0.1

2 years ago

1.0.4

2 years ago

1.0.3

2 years ago

1.0.2-rc1

2 years ago

1.0.3-rc1

2 years ago

1.0.3-rc0

2 years ago

1.0.3-rc3

2 years ago

1.0.3-rc2

2 years ago

1.0.1-rc1

2 years ago

1.0.0

2 years ago

0.0.1-rc13

2 years ago

0.0.1-rc12

2 years ago

0.0.1-rc11

2 years ago

0.0.1-rc10

2 years ago

0.0.1-rc9

2 years ago

0.0.1-rc8

2 years ago

0.0.1-rc7

2 years ago

0.0.1-rc6

2 years ago

0.0.1-rc5

2 years ago

0.0.1-rc4

2 years ago

0.0.1-rc3

2 years ago

0.0.1-rc2

2 years ago

0.0.1-rc1

2 years ago