{
  "version": "0.0.2",
  "name": "dual_market",
  "instructions": [
    {
      "name": "initPremiumAccount",
      "accounts": [
        {
          "name": "authority",
          "isMut": true,
          "isSigner": true
        },
        {
          "name": "premiumUsdcTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "Account that will pay premiums for all DIP. Owned by this program."
          ]
        },
        {
          "name": "usdcMint",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "systemProgram",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "rent",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": []
    },
    {
      "name": "depositPremiums",
      "accounts": [
        {
          "name": "authority",
          "isMut": true,
          "isSigner": true,
          "docs": ["Authority should be RM reloading premiums."]
        },
        {
          "name": "premiumUsdcTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "Account to deposit the premiums into. The owner is a PDA of this program"
          ]
        },
        {
          "name": "userUsdcTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": ["Account that the usdc is coming from"]
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "systemProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "amount",
          "type": "u64"
        }
      ]
    },
    {
      "name": "initDip",
      "accounts": [
        {
          "name": "authority",
          "isMut": true,
          "isSigner": true
        },
        {
          "name": "vaultMint",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "Vault mint is the mint of vault tokens which can be redeemed back for the",
            "Base tokens."
          ]
        },
        {
          "name": "optionMint",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "Option mint makes the option tokens which are used as options contracts."
          ]
        },
        {
          "name": "vaultBaseTokenAccount",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "baseMint",
          "isMut": false,
          "isSigner": false,
          "docs": ["Base mint is just needed here for generating PDAs"]
        },
        {
          "name": "vaultQuoteTokenAccount",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "quoteMint",
          "isMut": false,
          "isSigner": false,
          "docs": ["Quote mint is used for generating PDAs"]
        },
        {
          "name": "dipState",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "optionMintMetadataAccount",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "vaultMintMetadataAccount",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "tokenMetadataProgram",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "systemProgram",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "rent",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "strike",
          "type": "u64"
        },
        {
          "name": "expiration",
          "type": "u64"
        },
        {
          "name": "tokenName",
          "type": "string"
        }
      ]
    },
    {
      "name": "depositStreaming",
      "accounts": [
        {
          "name": "authority",
          "isMut": true,
          "isSigner": true,
          "docs": ["Authority is the person making the deposit"]
        },
        {
          "name": "userBaseTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": ["Depositor Base token account"]
        },
        {
          "name": "vaultBaseTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "Vault account holding Base tokens. This is owned by a PDA of this program."
          ]
        },
        {
          "name": "userVaultTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "User account of vault tokens. This is going to receive #`amount` tokens."
          ]
        },
        {
          "name": "vaultTokenMint",
          "isMut": true,
          "isSigner": false,
          "docs": ["Mint of vault tokens. It is owned by itself which is a PDA"]
        },
        {
          "name": "premiumTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "This is loaded by MM before the user interacts with the program."
          ]
        },
        {
          "name": "userUsdcTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "Where to send the option premiums. This is always USDC, no matter",
            "whether it is upside or downside."
          ]
        },
        {
          "name": "daoUsdcTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": ["DAO USDC"]
        },
        {
          "name": "optionTokenMint",
          "isMut": true,
          "isSigner": false,
          "docs": ["Mint for option tokens."]
        },
        {
          "name": "mmOptionTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": ["Token account where the option tokens are sent."]
        },
        {
          "name": "pythPrice",
          "isMut": false,
          "isSigner": false,
          "docs": ["Pricing used for option pricing"]
        },
        {
          "name": "dipState",
          "isMut": false,
          "isSigner": false,
          "docs": ["State for the current DIP."]
        },
        {
          "name": "mmPricing",
          "isMut": false,
          "isSigner": false,
          "docs": [
            "These are for the pricing that the protocol gets from a MM. We only",
            "speculatively will look for one MM's DMS with this request, if that one",
            "is not active, then use the backstop price. Use the backstop price if it",
            "is better than the mm price."
          ]
        },
        {
          "name": "mmDms",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "systemProgram",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "amount",
          "type": "u64"
        },
        {
          "name": "minPremium",
          "type": "u64"
        }
      ]
    },
    {
      "name": "depositStreamingWithLso",
      "accounts": [
        {
          "name": "authority",
          "isMut": true,
          "isSigner": true,
          "docs": ["Authority is the person making the deposit"]
        },
        {
          "name": "userBaseTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": ["Depositor Base token account"]
        },
        {
          "name": "vaultBaseTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "Vault account holding Base tokens. This is owned by a PDA of this program."
          ]
        },
        {
          "name": "userVaultTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "User account of vault tokens. This is going to receive #`amount` tokens."
          ]
        },
        {
          "name": "vaultTokenMint",
          "isMut": true,
          "isSigner": false,
          "docs": ["Mint of vault tokens. It is owned by itself which is a PDA"]
        },
        {
          "name": "premiumTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "This is loaded by MM before the user interacts with the program."
          ]
        },
        {
          "name": "userUsdcTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "Where to send the option premiums. This is always USDC, no matter",
            "whether it is upside or downside."
          ]
        },
        {
          "name": "daoUsdcTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": ["DAO USDC"]
        },
        {
          "name": "optionTokenMint",
          "isMut": true,
          "isSigner": false,
          "docs": ["Mint for option tokens."]
        },
        {
          "name": "mmOptionTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": ["Token account where the option tokens are sent."]
        },
        {
          "name": "pythPrice",
          "isMut": false,
          "isSigner": false,
          "docs": ["Pricing used for option pricing"]
        },
        {
          "name": "dipState",
          "isMut": false,
          "isSigner": false,
          "docs": ["State for the current DIP."]
        },
        {
          "name": "mmPricing",
          "isMut": false,
          "isSigner": false,
          "docs": [
            "These are for the pricing that the protocol gets from a MM. We only",
            "speculatively will look for one MM's DMS with this request, if that one",
            "is not active, then use the backstop price. Use the backstop price if it",
            "is better than the mm price."
          ]
        },
        {
          "name": "mmDms",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "issueAuthority",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "soOptionMint",
          "isMut": true,
          "isSigner": false,
          "docs": ["The so_option_mint is verified inside the SO CPI."]
        },
        {
          "name": "soUserOptionAccount",
          "isMut": true,
          "isSigner": false
        },
        {
          "name": "soState",
          "isMut": true,
          "isSigner": false,
          "docs": ["Seeds are verified in the CPI."]
        },
        {
          "name": "stakingOptionsProgram",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "systemProgram",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "amount",
          "type": "u64"
        },
        {
          "name": "issueAuthorityBump",
          "type": "u8"
        },
        {
          "name": "minPremium",
          "type": "u64"
        }
      ]
    },
    {
      "name": "withdraw",
      "accounts": [
        {
          "name": "authority",
          "isMut": true,
          "isSigner": true,
          "docs": ["Authority is the wallet that is withdrawing"]
        },
        {
          "name": "userBaseTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": ["User account for receiving the Base tokens back."]
        },
        {
          "name": "vaultBaseTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": ["Vault account holding Base tokens."]
        },
        {
          "name": "userVaultTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "User account holding vault tokens that are redeemed for the Base tokens",
            "back."
          ]
        },
        {
          "name": "vaultTokenMint",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "Mint for vault tokens. This is used for burning them when returned."
          ]
        },
        {
          "name": "vaultQuoteTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "Vault Quote account is used if the option has been exercised."
          ]
        },
        {
          "name": "userQuoteTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "Depositor account used for returning funds if the option is exercised."
          ]
        },
        {
          "name": "dipState",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "systemProgram",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": []
    },
    {
      "name": "exerciseOption",
      "accounts": [
        {
          "name": "authority",
          "isMut": true,
          "isSigner": true,
          "docs": ["This should be the MM wallet."]
        },
        {
          "name": "vaultQuoteTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": ["Account to send money to for exercising option"]
        },
        {
          "name": "mmQuoteTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "MM Quote account for paying to exercise the buy of Base tokens in the vault."
          ]
        },
        {
          "name": "mmOptionTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": ["Account holding the option tokens to be redeemed."]
        },
        {
          "name": "optionMint",
          "isMut": true,
          "isSigner": false,
          "docs": ["Mint for burning the option tokens when returned."]
        },
        {
          "name": "mmBaseTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": ["Where to send the Base tokens to."]
        },
        {
          "name": "vaultBaseTokenAccount",
          "isMut": true,
          "isSigner": false,
          "docs": [
            "Vault Base tokens that are going to be used in the exercise."
          ]
        },
        {
          "name": "dipState",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "tokenProgram",
          "isMut": false,
          "isSigner": false
        },
        {
          "name": "systemProgram",
          "isMut": false,
          "isSigner": false
        }
      ],
      "args": [
        {
          "name": "amount",
          "type": "u64"
        }
      ]
    }
  ],
  "accounts": [
    {
      "name": "DIPState",
      "type": {
        "kind": "struct",
        "fields": [
          {
            "name": "strike",
            "type": "u64"
          },
          {
            "name": "expiration",
            "type": "u64"
          },
          {
            "name": "baseMint",
            "type": "publicKey"
          },
          {
            "name": "vaultMint",
            "type": "publicKey"
          },
          {
            "name": "vaultMintBump",
            "type": "u8"
          },
          {
            "name": "vaultBase",
            "type": "publicKey"
          },
          {
            "name": "vaultBaseBump",
            "type": "u8"
          },
          {
            "name": "optionMint",
            "type": "publicKey"
          },
          {
            "name": "optionBump",
            "type": "u8"
          },
          {
            "name": "vaultQuote",
            "type": "publicKey"
          },
          {
            "name": "vaultQuoteBump",
            "type": "u8"
          },
          {
            "name": "quoteMint",
            "type": "publicKey"
          },
          {
            "name": "dipStateBump",
            "type": "u8"
          }
        ]
      }
    }
  ],
  "errors": [
    {
      "code": 6000,
      "name": "TokensStillLocked",
      "msg": "Tokens are still locked until contract expiration"
    },
    {
      "code": 6001,
      "name": "DepositExpired",
      "msg": "The expiration for the attempted deposit has already happened"
    },
    {
      "code": 6002,
      "name": "ExerciseExpired",
      "msg": "The expiration for the attempted exercise has already happened"
    },
    {
      "code": 6003,
      "name": "IncorrectAddressForOption",
      "msg": "Attempted to send options to an account not owned by protocol"
    },
    {
      "code": 6004,
      "name": "WrongLSOMint",
      "msg": "LSO Mint computed and the argument do not match"
    },
    {
      "code": 6005,
      "name": "IncorrectMM",
      "msg": "Wrong MM when trying to deposit"
    },
    {
      "code": 6006,
      "name": "InvalidToken",
      "msg": "Unexpected token"
    },
    {
      "code": 6007,
      "name": "InvalidCaller",
      "msg": "Invalid Caller"
    },
    {
      "code": 6008,
      "name": "InvalidQuote",
      "msg": "Invalid quote"
    },
    {
      "code": 6009,
      "name": "InvalidBase",
      "msg": "Invalid base"
    },
    {
      "code": 6010,
      "name": "WrongAuthority",
      "msg": "The signer of transaction did not match user accounts"
    },
    {
      "code": 6011,
      "name": "WrongFee",
      "msg": "Fee account for the DAO was incorrect"
    },
    {
      "code": 6012,
      "name": "DIPBaseVault",
      "msg": "Failed Base vault check on DIP"
    },
    {
      "code": 6013,
      "name": "DIPVaultMint",
      "msg": "Failed vault mint check on DIP"
    },
    {
      "code": 6014,
      "name": "DIPOptionMint",
      "msg": "Failed option mint check on DIP"
    },
    {
      "code": 6015,
      "name": "PythAddress",
      "msg": "Invalid pyth address"
    },
    {
      "code": 6016,
      "name": "DIPAddress",
      "msg": "Invalid dip address"
    },
    {
      "code": 6017,
      "name": "InsufficientPremium",
      "msg": "Insufficient premium"
    }
  ],
  "metadata": {
    "address": "DiPbvUUJkDhV9jFtQsDFnMEMRJyjW5iS6NMwoySiW8ki"
  }
}
