PsyFi Documentation
  • Welcome to PsyFi
    • Why use PsyFi?
    • PsyFi Product Suite
    • PsyVaults - Vaults Product
      • 🏗️Covered Calls & Secured Puts Vaults Architecture
      • 📶Leveraged Strategy Vaults (Call Spreads & Put Spreads) - Currently Paused
      • 💹Market Making Vaults - Currently Paused
      • 📚PsyVaults Resources
        • PsyFi Vault Contracts
      • 👩‍🏫PsyVaults Tutorials
        • 💵Weekly Bidding on V2 Vaults
        • 💰PsyVault Rewards
          • Auto-Deposit into PsyLend to Earn Rewards
          • Understanding Staking Rewards
          • Boosting your Staking Rewards
      • ❓PsyVaults FAQs
    • PsyLend - Structured Products Lending
      • 👩‍🎓Tutorials - Supplying & Borrowing
      • 🎰Supply & Interest Rate Calculations
      • 🅿️Lending Parameters
      • ⚒️Liquidations
      • 💰Rewards
      • ⚡Fees
      • *️Risks & Insurance Fund
      • PsyLend FAQs
      • PsyLend Glossary
  • PsyFi DAO Audits
    • Audits
  • Build with PsyFi
    • Options Protocol
      • American Style Options
      • Tokenized European Style Options
      • Under-Collateralized European Style Options
      • PsyOptions FAQ
    • Fusion - Airdropping Options - Deprecated
      • 👩‍🏫Fusion Tutorials
        • Users: Option Rewards and What You Can Do With Them
        • Users: Claiming Airdrops Through Fusion
    • Developers
      • Program Integration
      • Client Integration
        • Namespace: instructions
        • Namespace: serumInstructions
        • Namespace: serum utils
        • Enumeration: ClusterName
        • Enumeration: ProgramVersions
        • Class: Validation
      • PsyFi DAO Contributor Support
    • Designers
      • Logos
      • Fonts
  • Options Education
    • Styles of Options
    • Calls & Puts
    • Option Strategies
    • Glossary
  • PSY Token & DAO
    • PSY Tokenomics
      • PSY Token Unlock Schedule
    • Governance Infrastructure & Tokenomics
    • Governance Parameters
    • PSY 2.0: PSY Stake and DeMux Overview [RFC]
    • Governance Tutorials
      • Governance Overview & Walkthrough
      • Initializing a Proposal Using Poseidon [RFC]
      • PsyOptions Protocol Governance Actions
      • Voter Stake Registry Set Up
        • How to Lock Your Own Tokens
        • How to Propose Issuing Locked Tokens
        • How to Propose Clawing Back Granted Tokens
      • PSY 2.0 - How to Stake Your PSY to Start Participating in PSY 2.0 Governance
      • PSY 2.0 - How to Claim Rewards For Staked PSY
      • PSY 2.0 - How to Setup a RewardPool
      • PSY 2.0 - How to perform DeMuX Actions on Reward Pools [RFC]
      • PSY 2.0 - How to view tokens that are sent to DeMux [RFC]
    • Governance FAQ
      • 🐛PSY DAO Bug Bounty
    • Poseidon [RFC]
    • PsyFi DAO Contributors
Powered by GitBook
On this page
  • Public packages
  • Rust
  • Javascript
  • American Style Options
  • Namespaces
  • Enumerations
  • Type aliases
  • Variables
  • Functions
  1. Build with PsyFi
  2. Developers

Client Integration

PreviousProgram IntegrationNextNamespace: instructions

Last updated 3 years ago

Public packages

Javascript instruction bindings can be found under

A Rust crate will be supported soon to help with Cross Program Invocations!

Rust

Coming soon.

Javascript

American Style Options

@mithraic-labs/psy-american

Installation

yarn add @mithraic-labs/psy-american

Namespaces

Enumerations

Type aliases

NetworkInfo

Ƭ NetworkInfo: Object

Type declaration

Name
Type

feeOwnerKey

PublicKey

serumReferrerId

PublicKey

Defined in

OptionMarket

Ƭ OptionMarket: Object

Type declaration

Name
Type

bumpSeed

number

exerciseFeeAccount

PublicKey

expirationUnixTimestamp

anchor.BN

expired

boolean

mintFeeAccount

PublicKey

optionMint

PublicKey

quoteAmountPerContract

anchor.BN

quoteAssetMint

PublicKey

quoteAssetPool

PublicKey

underlyingAmountPerContract

anchor.BN

underlyingAssetMint

PublicKey

underlyingAssetPool

PublicKey

writerTokenMint

PublicKey

Defined in


OptionMarketWithKey

Defined in


OrderParamsWithFeeRate

Ƭ OrderParamsWithFeeRate<T>: OrderParams<T> & { feeRate?: number }

Type parameters

Name

T

Defined in


PsyAmerican

Ƭ PsyAmerican: Object

Type declaration

Name
Type

accounts

[{ name: "optionMarket" ; type: { fields: [{ name: "optionMint" ; type: "publicKey" }, { name: "writerTokenMint" ; type: "publicKey" }, { name: "underlyingAssetMint" ; type: "publicKey" }, { name: "quoteAssetMint" ; type: "publicKey" }, { name: "underlyingAmountPerContract" ; type: "u64" }, { name: "quoteAmountPerContract" ; type: "u64" }, { name: "expirationUnixTimestamp" ; type: "i64" }, { name: "underlyingAssetPool" ; type: "publicKey" }, { name: "quoteAssetPool" ; type: "publicKey" }, { name: "mintFeeAccount" ; type: "publicKey" }, { name: "exerciseFeeAccount" ; type: "publicKey" }, { name: "expired" ; type: "bool" }, { name: "bumpSeed" ; type: "u8" }] ; kind: "struct" } }]

errors

[{ code: 300 ; msg: "Expiration must be in the future" ; name: "ExpirationIsInThePast" }, { code: 301 ; msg: "Same quote and underlying asset, cannot create market" ; name: "QuoteAndUnderlyingAssetMustDiffer" }, { code: 302 ; msg: "Quote amount and underlying amount per contract must be > 0" ; name: "QuoteOrUnderlyingAmountCannotBe0" }, { code: 303 ; msg: "OptionMarket must be the mint authority" ; name: "OptionMarketMustBeMintAuthority" }, { code: 304 ; msg: "OptionMarket must own the underlying asset pool" ; name: "OptionMarketMustOwnUnderlyingAssetPool" }, { code: 305 ; msg: "OptionMarket must own the quote asset pool" ; name: "OptionMarketMustOwnQuoteAssetPool" }, { code: 306 ; msg: "Stop trying to spoof the SPL Token program! Shame on you" ; name: "ExpectedSPLTokenProgramId" }, { code: 307 ; msg: "Mint fee account must be owned by the FEE_OWNER" ; name: "MintFeeMustBeOwnedByFeeOwner" }, { code: 308 ; msg: "Exercise fee account must be owned by the FEE_OWNER" ; name: "ExerciseFeeMustBeOwnedByFeeOwner" }, { code: 309 ; msg: "Mint fee token must be the same as the underlying asset" ; name: "MintFeeTokenMustMatchUnderlyingAsset" }, { code: 310 ; msg: "Exercise fee token must be the same as the quote asset" ; name: "ExerciseFeeTokenMustMatchQuoteAsset" }, { code: 311 ; msg: "OptionMarket is expired, can't mint" ; name: "OptionMarketExpiredCantMint" }, { code: 312 ; msg: "Underlying pool account does not match the value on the OptionMarket" ; name: "UnderlyingPoolAccountDoesNotMatchMarket" }, { code: 313 ; msg: "OptionToken mint does not match the value on the OptionMarket" ; name: "OptionTokenMintDoesNotMatchMarket" }, { code: 314 ; msg: "WriterToken mint does not match the value on the OptionMarket" ; name: "WriterTokenMintDoesNotMatchMarket" }, { code: 315 ; msg: "MintFee key does not match the value on the OptionMarket" ; name: "MintFeeKeyDoesNotMatchOptionMarket" }, { code: 316 ; msg: "The size argument must be > 0" ; name: "SizeCantBeLessThanEqZero" }, { code: 317 ; msg: "exerciseFee key does not match the value on the OptionMarket" ; name: "ExerciseFeeKeyDoesNotMatchOptionMarket" }, { code: 318 ; msg: "Quote pool account does not match the value on the OptionMarket" ; name: "QuotePoolAccountDoesNotMatchMarket" }, { code: 319 ; msg: "Underlying destination mint must match underlying asset mint address" ; name: "UnderlyingDestMintDoesNotMatchUnderlyingAsset" }, { code: 320 ; msg: "Fee owner does not match the program's fee owner" ; name: "FeeOwnerDoesNotMatchProgram" }, { code: 321 ; msg: "OptionMarket is expired, can't exercise" ; name: "OptionMarketExpiredCantExercise" }, { code: 322 ; msg: "OptionMarket has not expired, can't close" ; name: "OptionMarketNotExpiredCantClose" }, { code: 323 ; msg: "Not enough assets in the quote asset pool" ; name: "NotEnoughQuoteAssetsInPool" }, { code: 324 ; msg: "Invalid auth token provided" ; name: "InvalidAuth" }, { code: 325 ; msg: "Coin mint must match option mint" ; name: "CoinMintIsNotOptionMint" }, { code: 326 ; msg: "Cannot prune the market while it's still active" ; name: "CannotPruneActiveMarket" }, { code: 327 ; msg: "Numberical overflow" ; name: "NumberOverflow" }]

instructions

[{ accounts: [{ isMut: true ; isSigner: true ; name: "authority" }, { isMut: false ; isSigner: false ; name: "underlyingAssetMint" }, { isMut: false ; isSigner: false ; name: "quoteAssetMint" }, { isMut: true ; isSigner: false ; name: "optionMint" }, { isMut: true ; isSigner: false ; name: "writerTokenMint" }, { isMut: true ; isSigner: false ; name: "quoteAssetPool" }, { isMut: true ; isSigner: false ; name: "underlyingAssetPool" }, { isMut: true ; isSigner: false ; name: "optionMarket" }, { isMut: false ; isSigner: false ; name: "feeOwner" }, { isMut: false ; isSigner: false ; name: "tokenProgram" }, { isMut: false ; isSigner: false ; name: "associatedTokenProgram" }, { isMut: false ; isSigner: false ; name: "rent" }, { isMut: false ; isSigner: false ; name: "systemProgram" }, { isMut: false ; isSigner: false ; name: "clock" }] ; args: [{ name: "underlyingAmountPerContract" ; type: "u64" }, { name: "quoteAmountPerContract" ; type: "u64" }, { name: "expirationUnixTimestamp" ; type: "i64" }, { name: "bumpSeed" ; type: "u8" }] ; name: "initializeMarket" }, { accounts: [{ isMut: true ; isSigner: true ; name: "userAuthority" }, { isMut: false ; isSigner: false ; name: "underlyingAssetMint" }, { isMut: true ; isSigner: false ; name: "underlyingAssetPool" }, { isMut: true ; isSigner: false ; name: "underlyingAssetSrc" }, { isMut: true ; isSigner: false ; name: "optionMint" }, { isMut: true ; isSigner: false ; name: "mintedOptionDest" }, { isMut: true ; isSigner: false ; name: "writerTokenMint" }, { isMut: true ; isSigner: false ; name: "mintedWriterTokenDest" }, { isMut: false ; isSigner: false ; name: "optionMarket" }, { isMut: true ; isSigner: false ; name: "feeOwner" }, { isMut: false ; isSigner: false ; name: "tokenProgram" }, { isMut: false ; isSigner: false ; name: "associatedTokenProgram" }, { isMut: false ; isSigner: false ; name: "clock" }, { isMut: false ; isSigner: false ; name: "rent" }, { isMut: false ; isSigner: false ; name: "systemProgram" }] ; args: [{ name: "size" ; type: "u64" }] ; name: "mintOption" }, { accounts: [{ isMut: true ; isSigner: true ; name: "userAuthority" }, { isMut: false ; isSigner: false ; name: "underlyingAssetMint" }, { isMut: true ; isSigner: false ; name: "underlyingAssetPool" }, { isMut: true ; isSigner: false ; name: "underlyingAssetSrc" }, { isMut: true ; isSigner: false ; name: "optionMint" }, { isMut: true ; isSigner: false ; name: "mintedOptionDest" }, { isMut: true ; isSigner: false ; name: "writerTokenMint" }, { isMut: true ; isSigner: false ; name: "mintedWriterTokenDest" }, { isMut: false ; isSigner: false ; name: "optionMarket" }, { isMut: false ; isSigner: false ; name: "tokenProgram" }] ; args: [{ name: "size" ; type: "u64" }] ; name: "mintOptionV2" }, { accounts: [{ isMut: true ; isSigner: true ; name: "userAuthority" }, { isMut: true ; isSigner: true ; name: "optionAuthority" }, { isMut: false ; isSigner: false ; name: "optionMarket" }, { isMut: true ; isSigner: false ; name: "optionMint" }, { isMut: true ; isSigner: false ; name: "exerciserOptionTokenSrc" }, { isMut: true ; isSigner: false ; name: "underlyingAssetPool" }, { isMut: true ; isSigner: false ; name: "underlyingAssetDest" }, { isMut: true ; isSigner: false ; name: "quoteAssetPool" }, { isMut: true ; isSigner: false ; name: "quoteAssetSrc" }, { isMut: true ; isSigner: false ; name: "feeOwner" }, { isMut: false ; isSigner: false ; name: "tokenProgram" }, { isMut: false ; isSigner: false ; name: "systemProgram" }, { isMut: false ; isSigner: false ; name: "clock" }] ; args: [{ name: "size" ; type: "u64" }] ; name: "exerciseOption" }, { accounts: [{ isMut: true ; isSigner: true ; name: "userAuthority" }, { isMut: true ; isSigner: true ; name: "optionAuthority" }, { isMut: false ; isSigner: false ; name: "optionMarket" }, { isMut: true ; isSigner: false ; name: "optionMint" }, { isMut: true ; isSigner: false ; name: "exerciserOptionTokenSrc" }, { isMut: true ; isSigner: false ; name: "underlyingAssetPool" }, { isMut: true ; isSigner: false ; name: "underlyingAssetDest" }, { isMut: true ; isSigner: false ; name: "quoteAssetPool" }, { isMut: true ; isSigner: false ; name: "quoteAssetSrc" }, { isMut: false ; isSigner: false ; name: "tokenProgram" }] ; args: [{ name: "size" ; type: "u64" }] ; name: "exerciseOptionV2" }, { accounts: [{ isMut: false ; isSigner: true ; name: "userAuthority" }, { isMut: false ; isSigner: false ; name: "optionMarket" }, { isMut: true ; isSigner: false ; name: "writerTokenMint" }, { isMut: true ; isSigner: false ; name: "writerTokenSrc" }, { isMut: true ; isSigner: false ; name: "underlyingAssetPool" }, { isMut: true ; isSigner: false ; name: "underlyingAssetDest" }, { isMut: false ; isSigner: false ; name: "tokenProgram" }, { isMut: false ; isSigner: false ; name: "clock" }] ; args: [{ name: "size" ; type: "u64" }] ; name: "closePostExpiration" }, { accounts: [{ isMut: false ; isSigner: true ; name: "userAuthority" }, { isMut: false ; isSigner: false ; name: "optionMarket" }, { isMut: true ; isSigner: false ; name: "writerTokenMint" }, { isMut: true ; isSigner: false ; name: "writerTokenSrc" }, { isMut: true ; isSigner: false ; name: "optionTokenMint" }, { isMut: true ; isSigner: false ; name: "optionTokenSrc" }, { isMut: true ; isSigner: false ; name: "underlyingAssetPool" }, { isMut: true ; isSigner: false ; name: "underlyingAssetDest" }, { isMut: false ; isSigner: false ; name: "tokenProgram" }] ; args: [{ name: "size" ; type: "u64" }] ; name: "closeOptionPosition" }, { accounts: [{ isMut: false ; isSigner: true ; name: "userAuthority" }, { isMut: false ; isSigner: false ; name: "optionMarket" }, { isMut: true ; isSigner: false ; name: "writerTokenMint" }, { isMut: true ; isSigner: false ; name: "writerTokenSrc" }, { isMut: true ; isSigner: false ; name: "quoteAssetPool" }, { isMut: true ; isSigner: false ; name: "writerQuoteDest" }, { isMut: false ; isSigner: false ; name: "tokenProgram" }] ; args: [{ name: "size" ; type: "u64" }] ; name: "burnWriterForQuote" }, { accounts: [{ isMut: true ; isSigner: true ; name: "userAuthority" }, { isMut: true ; isSigner: false ; name: "optionMarket" }, { isMut: true ; isSigner: false ; name: "serumMarket" }, { isMut: false ; isSigner: false ; name: "systemProgram" }, { isMut: false ; isSigner: false ; name: "tokenProgram" }, { isMut: false ; isSigner: false ; name: "dexProgram" }, { isMut: false ; isSigner: false ; name: "rent" }, { isMut: false ; isSigner: false ; name: "pcMint" }, { isMut: false ; isSigner: false ; name: "optionMint" }, { isMut: true ; isSigner: false ; name: "requestQueue" }, { isMut: true ; isSigner: false ; name: "eventQueue" }, { isMut: true ; isSigner: false ; name: "bids" }, { isMut: true ; isSigner: false ; name: "asks" }, { isMut: true ; isSigner: false ; name: "coinVault" }, { isMut: true ; isSigner: false ; name: "pcVault" }, { isMut: false ; isSigner: false ; name: "vaultSigner" }, { isMut: false ; isSigner: false ; name: "marketAuthority" }] ; args: [{ name: "marketSpace" ; type: "u64" }, { name: "vaultSignerNonce" ; type: "u64" }, { name: "coinLotSize" ; type: "u64" }, { name: "pcLotSize" ; type: "u64" }, { name: "pcDustThreshold" ; type: "u64" }] ; name: "initSerumMarket" }]

name

"psy_american"

version

"0.0.0"

Defined in

Variables

FEE_OWNER_KEY

• FEE_OWNER_KEY: PublicKey

The fee owner key for the Psy American program

Defined in

NFT_MINT_LAMPORTS

• NFT_MINT_LAMPORTS: number

The number of lamports the protocol takes as a fee when minting or exercising an option on an asset that cannot take a 5bps fee. E.g a minting a call option on an NFT

Defined in

PSY_AMERICAN_PROGRAM_IDS

• PSY_AMERICAN_PROGRAM_IDS: Object

All prior Psy American programIds for all networks so clients that require backwards compatability can maintain it.

Type declaration

Name
Type

3KAqLcLAY8W7ZxGT1MJcFPDMNJKJsXaE1m9i1JPahfmH

AAcHauRu6eUDePN3hDDAUTbgyRq5xFbRZJCLsUdpBCJb

GDvqQy3FkDB2wyNwgZGp5YkmRMUmWbhNNWDMYKbLSZ5N

Defined in

PsyAmericanIdl

• PsyAmericanIdl: Idl

The Anchor IDL for the Psy American program. Used when creating an Anchor Program.

const program = new Program(PsyAmericanIdl, psyAmericanProgramId, provider);

Copy

Defined in

Functions

chunkArray

▸ Const chunkArray(myArray, chunkSize): any[][]

Returns an array with arrays of the given size.

Parameters

Name
Type
Description

myArray

any[]

Array to split

chunkSize

number

Size of every group

Returns

any[][]

Defined in

deriveOptionKeyFromParams

▸ Const deriveOptionKeyFromParams(__namedParameters): Promise<[PublicKey, number]>

Get the deterministic address for an Option based on its properties.

Parameters

Name
Type
Description

__namedParameters

Object

-

__namedParameters.expirationUnixTimestamp

BN

The OptionMarket expiration timestamp in seconds

__namedParameters.programId

PublicKey

The Psy American program ID

__namedParameters.quoteAmountPerContract

BN

The quote asset amount per option contract

__namedParameters.quoteMint

PublicKey

The quote asset mint address

__namedParameters.underlyingAmountPerContract

BN

The underlying asset amount per option contract

__namedParameters.underlyingMint

PublicKey

The underlying asset mint address

Returns

Promise<[PublicKey, number]>

Defined in

feeAmountPerContract

▸ Const feeAmountPerContract(assetQuantity): BN

Get the protocol's fee amount when minting or exercising. When minting this should be the underlingAmountPerContract. When exercising this should be the quoteAmountPerContract.

Parameters

Name
Type
Description

assetQuantity

BN

Quantity of the asset being used to mint or exercise

Returns

BN

Defined in

getAllOptionAccounts

Load all OptionMarkets owned by the given program from the blockchain.

Name
Type
Description

program

Anchor Psy American program

Returns

Defined in

getOptionByKey

Parameters

Name
Type

program

key

PublicKey

Returns

Defined in

getOrAddAssociatedTokenAccountTx

▸ Const getOrAddAssociatedTokenAccountTx(associatedAddress, mintKey, provider, owner?): Promise<TransactionInstruction>

Returns a TransactionInstruction for creating the associated token account if one deos not exist.

Parameters

Name
Type
Description

associatedAddress

PublicKey

The associated token account address

mintKey

PublicKey

The SPL token mint address

provider

default

The Anchor provider that has the wallet

owner

PublicKey

The user's address that owns the associated token account

Returns

Promise<TransactionInstruction>

Defined in

getVaultOwnerAndNonce

▸ Const getVaultOwnerAndNonce(marketPublicKey, dexProgramId): Promise<[PublicKey, BN]>

This is needed for the permissioned serum markets.

TODO can we replace this with PublicKey.findProgramAddress

Parameters

Name
Type

marketPublicKey

PublicKey

dexProgramId

PublicKey

Returns

Promise<[PublicKey, BN]>

Defined in

parseTransactionError

▸ Const parseTransactionError(error): ProgramError

Parameters

Name
Type

error

any

Returns

ProgramError

Defined in

Ƭ OptionMarketWithKey: & { key: PublicKey }

▸ Const getAllOptionAccounts(program): Promise<[]>

Parameters

Program<>

Promise<[]>

▸ Const getOptionByKey(program, key): Promise<>

Program<>

Promise<>

@mithraic-labs/psyoptions
instructions
serumInstructions
serumUtils
ClusterName
ProgramVersions
types.ts:14
types.ts:19
types.ts:35
types.ts:39
psyAmericanTypes.ts:1
fees.ts:6
fees.ts:13
programIds.ts:7
index.ts:25
utils/chunkArray.ts:7
utils/deriveOptionKeyFromParams.ts:8
fees.ts:23
#
OptionMarket.ts:11
utils/getOptionByKey.ts:6
utils/getOrAddAssociatedTokenAccountTx.ts:20
utils/getVaultOwnerAndNonce.ts:13
utils/parseTransactionErrors.ts:6
OptionMarket
OptionMarketWithKey
OptionMarketWithKey
OptionMarketWithKey
OptionMarketWithKey
ProgramVersions
ProgramVersions
ProgramVersions
PsyAmerican
PsyAmerican