From caae0eed2fb05e86d94b73a85fd91c349c651cef Mon Sep 17 00:00:00 2001 From: Britt Cyr Date: Fri, 2 Jun 2023 17:45:25 -0400 Subject: [PATCH] Staking Options --- Cargo.lock | 137 +++++ mango_v4.json | 471 ++++++++++++++++-- programs/mango-v4/Cargo.toml | 1 + programs/mango-v4/src/accounts_ix/mod.rs | 4 + .../accounts_ix/staking_options_exercise.rs | 63 +++ .../src/accounts_ix/staking_options_liq.rs | 34 ++ programs/mango-v4/src/error.rs | 2 + programs/mango-v4/src/health/cache.rs | 20 +- .../mango-v4/src/instructions/ix_gate_set.rs | 2 + programs/mango-v4/src/instructions/mod.rs | 4 + .../instructions/staking_options_exercise.rs | 195 ++++++++ .../src/instructions/staking_options_liq.rs | 283 +++++++++++ .../mango-v4/src/instructions/token_edit.rs | 29 ++ .../src/instructions/token_register.rs | 7 +- .../instructions/token_register_trustless.rs | 4 +- programs/mango-v4/src/lib.rs | 33 ++ programs/mango-v4/src/logs.rs | 21 + programs/mango-v4/src/state/bank.rs | 20 +- programs/mango-v4/src/state/group.rs | 2 + programs/mango-v4/tests/cases/mod.rs | 1 + .../tests/cases/test_staking_options.rs | 419 ++++++++++++++++ .../tests/fixtures/staking_options.so | Bin 0 -> 589744 bytes .../tests/program_test/mango_client.rs | 210 ++++++++ programs/mango-v4/tests/program_test/mod.rs | 15 + .../mango-v4/tests/program_test/solana.rs | 43 ++ .../program_test/staking_options_helper.rs | 153 ++++++ 26 files changed, 2117 insertions(+), 56 deletions(-) create mode 100644 programs/mango-v4/src/accounts_ix/staking_options_exercise.rs create mode 100644 programs/mango-v4/src/accounts_ix/staking_options_liq.rs create mode 100644 programs/mango-v4/src/instructions/staking_options_exercise.rs create mode 100644 programs/mango-v4/src/instructions/staking_options_liq.rs create mode 100644 programs/mango-v4/tests/cases/test_staking_options.rs create mode 100644 programs/mango-v4/tests/fixtures/staking_options.so create mode 100644 programs/mango-v4/tests/program_test/staking_options_helper.rs diff --git a/Cargo.lock b/Cargo.lock index 53565103d..0c4fc69ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2959,6 +2959,7 @@ dependencies = [ "solana-security-txt", "spl-associated-token-account", "spl-token", + "staking_options", "static_assertions", "switchboard-program", "switchboard-v2", @@ -3331,6 +3332,66 @@ dependencies = [ "syn 1.0.105", ] +[[package]] +name = "mpl-token-auth-rules" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24dcb2b0ec0e9246f6f035e0336ba3359c21f6928dfd90281999e2c8e8ab53eb" +dependencies = [ + "borsh", + "mpl-token-metadata-context-derive", + "num-derive", + "num-traits", + "rmp-serde", + "serde", + "shank", + "solana-program", + "solana-zk-token-sdk", + "thiserror", +] + +[[package]] +name = "mpl-token-metadata" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6527274dc245c7516244eec69ba28e0fef4b754c26238cf8a570038ab1ca73" +dependencies = [ + "arrayref", + "borsh", + "mpl-token-auth-rules", + "mpl-token-metadata-context-derive", + "mpl-utils", + "num-derive", + "num-traits", + "shank", + "solana-program", + "spl-associated-token-account", + "spl-token", + "thiserror", +] + +[[package]] +name = "mpl-token-metadata-context-derive" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12989bc45715b0ee91944855130131479f9c772e198a910c3eb0ea327d5bffc3" +dependencies = [ + "quote 1.0.27", + "syn 1.0.105", +] + +[[package]] +name = "mpl-utils" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "822133b6cba8f9a43e5e0e189813be63dd795858f54155c729833be472ffdb51" +dependencies = [ + "arrayref", + "borsh", + "solana-program", + "spl-token", +] + [[package]] name = "multimap" version = "0.8.3" @@ -3790,6 +3851,12 @@ dependencies = [ "windows-sys 0.42.0", ] +[[package]] +name = "paste" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" + [[package]] name = "pbkdf2" version = "0.4.0" @@ -4583,6 +4650,28 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "rmp" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44519172358fd6d58656c86ab8e7fbc9e1490c3e8f14d35ed78ca0dd07403c9f" +dependencies = [ + "byteorder", + "num-traits", + "paste", +] + +[[package]] +name = "rmp-serde" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5b13be192e0220b8afb7222aa5813cb62cc269ebb5cac346ca6487681d2913e" +dependencies = [ + "byteorder", + "rmp", + "serde", +] + [[package]] name = "rocksdb" version = "0.19.0" @@ -5087,6 +5176,40 @@ dependencies = [ "keccak", ] +[[package]] +name = "shank" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63e565b5e95ad88ab38f312e89444c749360641c509ef2de0093b49f55974a5" +dependencies = [ + "shank_macro", +] + +[[package]] +name = "shank_macro" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63927d22a1e8b74bda98cc6e151fcdf178b7abb0dc6c4f81e0bbf5ffe2fc4ec8" +dependencies = [ + "proc-macro2 1.0.56", + "quote 1.0.27", + "shank_macro_impl", + "syn 1.0.105", +] + +[[package]] +name = "shank_macro_impl" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40ce03403df682f80f4dc1efafa87a4d0cb89b03726d0565e6364bdca5b9a441" +dependencies = [ + "anyhow", + "proc-macro2 1.0.56", + "quote 1.0.27", + "serde", + "syn 1.0.105", +] + [[package]] name = "sharded-slab" version = "0.1.4" @@ -6455,6 +6578,20 @@ dependencies = [ "thiserror", ] +[[package]] +name = "staking_options" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53bdd80c759acf7edbf9e231a50082c67ca1c53ee8a348a41d8085a8cbe559eb" +dependencies = [ + "anchor-lang", + "anchor-spl", + "mpl-token-metadata", + "solana-program", + "solana-security-txt", + "spl-token", +] + [[package]] name = "static_assertions" version = "1.1.0" diff --git a/mango_v4.json b/mango_v4.json index fdbd80dd0..f1414a281 100644 --- a/mango_v4.json +++ b/mango_v4.json @@ -169,7 +169,9 @@ { "name": "mngoTokenIndexOpt", "type": { - "option": "u16" + "option": { + "defined": "TokenIndex" + } } }, { @@ -315,7 +317,9 @@ }, { "kind": "arg", - "type": "u16", + "type": { + "defined": "TokenIndex" + }, "path": "token_index" }, { @@ -344,7 +348,9 @@ }, { "kind": "arg", - "type": "u16", + "type": { + "defined": "TokenIndex" + }, "path": "token_index" }, { @@ -409,7 +415,9 @@ "args": [ { "name": "tokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "name", @@ -505,7 +513,9 @@ }, { "kind": "arg", - "type": "u16", + "type": { + "defined": "TokenIndex" + }, "path": "token_index" }, { @@ -534,7 +544,9 @@ }, { "kind": "arg", - "type": "u16", + "type": { + "defined": "TokenIndex" + }, "path": "token_index" }, { @@ -599,7 +611,9 @@ "args": [ { "name": "tokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "name", @@ -782,6 +796,18 @@ "type": { "option": "bool" } + }, + { + "name": "stakingOptionsStateOpt", + "type": { + "option": "publicKey" + } + }, + { + "name": "stakingOptionsExpirationOpt", + "type": { + "option": "u64" + } } ] }, @@ -833,7 +859,9 @@ }, { "kind": "arg", - "type": "u16", + "type": { + "defined": "TokenIndex" + }, "path": "token_index" }, { @@ -862,7 +890,9 @@ }, { "kind": "arg", - "type": "u16", + "type": { + "defined": "TokenIndex" + }, "path": "token_index" }, { @@ -906,7 +936,9 @@ "args": [ { "name": "tokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "bankNum", @@ -1828,7 +1860,9 @@ }, { "kind": "arg", - "type": "u16", + "type": { + "defined": "Serum3MarketIndex" + }, "path": "market_index" } ] @@ -1864,7 +1898,9 @@ "args": [ { "name": "marketIndex", - "type": "u16" + "type": { + "defined": "Serum3MarketIndex" + } }, { "name": "name", @@ -2763,11 +2799,15 @@ "args": [ { "name": "assetTokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "liabTokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "maxLiabTransfer", @@ -2875,11 +2915,15 @@ "args": [ { "name": "assetTokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "liabTokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "maxLiabTransfer", @@ -2922,11 +2966,15 @@ "args": [ { "name": "assetTokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "liabTokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "maxLiabTransfer", @@ -3043,7 +3091,9 @@ }, { "kind": "arg", - "type": "u16", + "type": { + "defined": "PerpMarketIndex" + }, "path": "perp_market_index" } ] @@ -3082,7 +3132,9 @@ "args": [ { "name": "perpMarketIndex", - "type": "u16" + "type": { + "defined": "PerpMarketIndex" + } }, { "name": "name", @@ -3176,7 +3228,9 @@ }, { "name": "settleTokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "settlePnlLimitFactor", @@ -4151,7 +4205,9 @@ "args": [ { "name": "limit", - "type": "u64" + "type": { + "defined": "usize" + } } ] }, @@ -4753,6 +4809,177 @@ } ], "args": [] + }, + { + "name": "stakingOptionsExercise", + "docs": [ + "", + "Staking options", + "" + ], + "accounts": [ + { + "name": "group", + "isMut": false, + "isSigner": false + }, + { + "name": "account", + "isMut": true, + "isSigner": false, + "relations": [ + "group" + ] + }, + { + "name": "owner", + "isMut": false, + "isSigner": true + }, + { + "name": "soAuthority", + "isMut": false, + "isSigner": false, + "docs": [ + "Accounts for the CPI into StakingOptions." + ] + }, + { + "name": "stakingOptionsState", + "isMut": true, + "isSigner": false + }, + { + "name": "optionVault", + "isMut": true, + "isSigner": false + }, + { + "name": "optionMint", + "isMut": true, + "isSigner": false + }, + { + "name": "quoteVault", + "isMut": true, + "isSigner": false + }, + { + "name": "stakingOptionsProjectQuoteAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "stakingOptionsFeeQuoteAccount", + "isMut": true, + "isSigner": false + }, + { + "name": "stakingOptionsBaseVault", + "isMut": true, + "isSigner": false + }, + { + "name": "baseVault", + "isMut": true, + "isSigner": false + }, + { + "name": "baseBank", + "isMut": true, + "isSigner": false, + "relations": [ + "group" + ] + }, + { + "name": "quoteBank", + "isMut": true, + "isSigner": false, + "relations": [ + "group" + ] + }, + { + "name": "optionBank", + "isMut": true, + "isSigner": false, + "relations": [ + "group" + ] + }, + { + "name": "tokenProgram", + "isMut": false, + "isSigner": false + }, + { + "name": "stakingOptionsProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ + { + "name": "amount", + "type": "u64" + }, + { + "name": "strike", + "type": "u64" + } + ] + }, + { + "name": "stakingOptionsLiq", + "accounts": [ + { + "name": "group", + "isMut": false, + "isSigner": false + }, + { + "name": "liqor", + "isMut": true, + "isSigner": false, + "relations": [ + "group" + ] + }, + { + "name": "liqorOwner", + "isMut": false, + "isSigner": true + }, + { + "name": "liqee", + "isMut": true, + "isSigner": false, + "relations": [ + "group" + ] + } + ], + "args": [ + { + "name": "assetTokenIndex", + "type": { + "defined": "TokenIndex" + } + }, + { + "name": "liabTokenIndex", + "type": { + "defined": "TokenIndex" + } + }, + { + "name": "maxLiabTransfer", + "type": { + "defined": "I80F48" + } + } + ] } ], "accounts": [ @@ -4951,7 +5178,9 @@ }, { "name": "tokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "bump", @@ -5025,6 +5254,14 @@ ], "type": "f64" }, + { + "name": "stakingOptionsState", + "type": "publicKey" + }, + { + "name": "stakingOptionsExpiration", + "type": "u64" + }, { "name": "reduceOnly", "type": "u8" @@ -5038,7 +5275,7 @@ "type": { "array": [ "u8", - 2118 + 2078 ] } } @@ -5068,7 +5305,9 @@ }, { "name": "mngoTokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "padding", @@ -5348,7 +5587,9 @@ }, { "name": "tokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "groupInsuranceFund", @@ -5536,7 +5777,9 @@ "Currently required to be 0, USDC. In the future settlement", "may be allowed to happen in other tokens." ], - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "perpMarketIndex", @@ -5544,7 +5787,9 @@ "Index of this perp market. Other data, like the MangoAccount's PerpPosition", "reference this market via this index. Unique for this group's perp markets." ], - "type": "u16" + "type": { + "defined": "PerpMarketIndex" + } }, { "name": "blocked1", @@ -5932,11 +6177,15 @@ }, { "name": "baseTokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "quoteTokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "reduceOnly", @@ -5974,7 +6223,9 @@ }, { "name": "marketIndex", - "type": "u16" + "type": { + "defined": "Serum3MarketIndex" + } }, { "name": "bump", @@ -6016,7 +6267,9 @@ }, { "name": "marketIndex", - "type": "u16" + "type": { + "defined": "Serum3MarketIndex" + } }, { "name": "reserved", @@ -6095,7 +6348,9 @@ "fields": [ { "name": "tokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "value", @@ -6113,7 +6368,9 @@ "fields": [ { "name": "perpMarketIndex", - "type": "u16" + "type": { + "defined": "PerpMarketIndex" + } }, { "name": "value", @@ -6160,7 +6417,9 @@ "fields": [ { "name": "tokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "maintAssetWeight", @@ -6245,16 +6504,22 @@ } }, { - "name": "baseInfoIndex", - "type": "u64" + "name": "baseIndex", + "type": { + "defined": "usize" + } }, { - "name": "quoteInfoIndex", - "type": "u64" + "name": "quoteIndex", + "type": { + "defined": "usize" + } }, { "name": "marketIndex", - "type": "u16" + "type": { + "defined": "Serum3MarketIndex" + } }, { "name": "hasZeroFunds", @@ -6279,7 +6544,9 @@ "fields": [ { "name": "perpMarketIndex", - "type": "u16" + "type": { + "defined": "PerpMarketIndex" + } }, { "name": "settleTokenIndex", @@ -6466,7 +6733,9 @@ "docs": [ "index into Group.tokens" ], - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "inUseCount", @@ -6535,7 +6804,9 @@ }, { "name": "marketIndex", - "type": "u16" + "type": { + "defined": "Serum3MarketIndex" + } }, { "name": "baseTokenIndex", @@ -6544,11 +6815,15 @@ "to get passed the static SerumMarket to find which tokens a market", "uses and look up the correct oracles." ], - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "quoteTokenIndex", - "type": "u16" + "type": { + "defined": "TokenIndex" + } }, { "name": "padding", @@ -6578,7 +6853,9 @@ "fields": [ { "name": "marketIndex", - "type": "u16" + "type": { + "defined": "PerpMarketIndex" + } }, { "name": "padding", @@ -6826,7 +7103,9 @@ }, { "name": "market", - "type": "u16" + "type": { + "defined": "PerpMarketIndex" + } }, { "name": "padding2", @@ -7040,7 +7319,9 @@ ], "type": { "array": [ - "u32", + { + "defined": "NodeHandle" + }, 2 ] } @@ -7212,7 +7493,9 @@ "fields": [ { "name": "maybeNode", - "type": "u32" + "type": { + "defined": "NodeHandle" + } }, { "name": "leafCount", @@ -7254,7 +7537,9 @@ }, { "name": "freeListHead", - "type": "u32" + "type": { + "defined": "NodeHandle" + } }, { "name": "reserved", @@ -7951,6 +8236,12 @@ }, { "name": "GroupWithdrawInsuranceFund" + }, + { + "name": "StakingOptionsExercise" + }, + { + "name": "StakingOptionsLiq" } ] } @@ -9708,6 +9999,81 @@ "index": false } ] + }, + { + "name": "StakingOptionExerciseLog", + "fields": [ + { + "name": "mangoGroup", + "type": "publicKey", + "index": false + }, + { + "name": "mangoAccount", + "type": "publicKey", + "index": false + }, + { + "name": "amount", + "type": "u64", + "index": false + }, + { + "name": "stakingOptionsState", + "type": "publicKey", + "index": false + } + ] + }, + { + "name": "StakingOptionsLiqLog", + "fields": [ + { + "name": "mangoGroup", + "type": "publicKey", + "index": false + }, + { + "name": "liqee", + "type": "publicKey", + "index": false + }, + { + "name": "liqor", + "type": "publicKey", + "index": false + }, + { + "name": "assetTokenIndex", + "type": "u16", + "index": false + }, + { + "name": "liabTokenIndex", + "type": "u16", + "index": false + }, + { + "name": "assetTransfer", + "type": "i128", + "index": false + }, + { + "name": "liabTransfer", + "type": "i128", + "index": false + }, + { + "name": "assetPrice", + "type": "i128", + "index": false + }, + { + "name": "liabPrice", + "type": "i128", + "index": false + } + ] } ], "errors": [ @@ -9955,6 +10321,11 @@ "code": 6048, "name": "WouldSelfTrade", "msg": "would self trade" + }, + { + "code": 6049, + "name": "StakingOptionsError", + "msg": "staking options invariant violated" } ] } \ No newline at end of file diff --git a/programs/mango-v4/Cargo.toml b/programs/mango-v4/Cargo.toml index f6440faf4..f75c70d84 100644 --- a/programs/mango-v4/Cargo.toml +++ b/programs/mango-v4/Cargo.toml @@ -43,6 +43,7 @@ solana-program = { workspace = true } solana-sdk = { workspace = true, default-features = false, optional = true } solana-security-txt = "1.1.0" static_assertions = "1.1" +staking_options = { version = "0.1.0", features = [ "no-entrypoint", "cpi"] } switchboard-program = ">=0.2.0" switchboard-v2 = "0.1.17" diff --git a/programs/mango-v4/src/accounts_ix/mod.rs b/programs/mango-v4/src/accounts_ix/mod.rs index ba9bc3258..e698d60f4 100644 --- a/programs/mango-v4/src/accounts_ix/mod.rs +++ b/programs/mango-v4/src/accounts_ix/mod.rs @@ -42,6 +42,8 @@ pub use serum3_liq_force_cancel_orders::*; pub use serum3_place_order::*; pub use serum3_register_market::*; pub use serum3_settle_funds::*; +pub use staking_options_exercise::*; +pub use staking_options_liq::*; pub use stub_oracle_close::*; pub use stub_oracle_create::*; pub use stub_oracle_set::*; @@ -101,6 +103,8 @@ mod serum3_liq_force_cancel_orders; mod serum3_place_order; mod serum3_register_market; mod serum3_settle_funds; +mod staking_options_exercise; +mod staking_options_liq; mod stub_oracle_close; mod stub_oracle_create; mod stub_oracle_set; diff --git a/programs/mango-v4/src/accounts_ix/staking_options_exercise.rs b/programs/mango-v4/src/accounts_ix/staking_options_exercise.rs new file mode 100644 index 000000000..16a2557c6 --- /dev/null +++ b/programs/mango-v4/src/accounts_ix/staking_options_exercise.rs @@ -0,0 +1,63 @@ +/// Exercises a staking option inside of a user's account. +/// +/// Takes tokens from the banks for quote and options and calls a CPI into +/// StakingOptions program to get tokens and deposit them in the base bank. +/// Does health check to verify that this exercise is ITM or at least does not +/// drop health past maint threshold. +use crate::error::*; +use crate::state::*; +use anchor_lang::prelude::*; +use anchor_spl::token::Token; +use anchor_spl::token::TokenAccount; +use staking_options::program::StakingOptions as StakingOptionsProgram; + +#[derive(Accounts)] +pub struct StakingOptionsExercise<'info> { + #[account( + constraint = group.load()?.is_ix_enabled(IxGate::StakingOptionsExercise) @ MangoError::IxIsDisabled, + )] + pub group: AccountLoader<'info, Group>, + + #[account( + mut, + has_one = group, + constraint = account.load()?.is_operational() @ MangoError::AccountIsFrozen + )] + pub account: AccountLoader<'info, MangoAccountFixed>, + pub owner: Signer<'info>, + + /// Accounts for the CPI into StakingOptions. + /// CHECK: cpi + pub so_authority: AccountInfo<'info>, + #[account(mut)] + pub staking_options_state: Box>, + + #[account(mut)] + pub option_vault: Account<'info, TokenAccount>, + #[account(mut)] + /// CHECK: cpi + pub option_mint: AccountInfo<'info>, + #[account(mut)] + pub quote_vault: Account<'info, TokenAccount>, + #[account(mut)] + /// CHECK: cpi + pub staking_options_project_quote_account: AccountInfo<'info>, + #[account(mut)] + /// CHECK: cpi + pub staking_options_fee_quote_account: AccountInfo<'info>, + #[account(mut)] + /// CHECK: cpi + pub staking_options_base_vault: AccountInfo<'info>, + #[account(mut)] + pub base_vault: Account<'info, TokenAccount>, + + #[account(mut, has_one = group)] + pub base_bank: AccountLoader<'info, Bank>, + #[account(mut, has_one = group)] + pub quote_bank: AccountLoader<'info, Bank>, + #[account(mut, has_one = group)] + pub option_bank: AccountLoader<'info, Bank>, + + pub token_program: Program<'info, Token>, + pub staking_options_program: Program<'info, StakingOptionsProgram>, +} diff --git a/programs/mango-v4/src/accounts_ix/staking_options_liq.rs b/programs/mango-v4/src/accounts_ix/staking_options_liq.rs new file mode 100644 index 000000000..c0af54005 --- /dev/null +++ b/programs/mango-v4/src/accounts_ix/staking_options_liq.rs @@ -0,0 +1,34 @@ +/// Liquidates an ITM staking option in a user's account in the last 1 hour. +/// +/// Any liquidator can call this and receive a fee. This protects the system +/// from allowing ITM options to expire unexercised which is a sudden 1->0 +/// health drop. To address this, the liquidator gets to pretend that health +/// drop has already happened and liquidate, while the option is still not yet +/// expired and exercisable for value. This is similar to token_liq_with_token +/// except the circumstances and health thresholds. +use crate::error::*; +use crate::state::*; +use anchor_lang::prelude::*; + +#[derive(Accounts)] +pub struct StakingOptionsLiq<'info> { + #[account( + constraint = group.load()?.is_ix_enabled(IxGate::StakingOptionsLiq) @ MangoError::IxIsDisabled, + )] + pub group: AccountLoader<'info, Group>, + + #[account( + mut, + has_one = group, + constraint = liqor.load()?.is_operational() @ MangoError::AccountIsFrozen + )] + pub liqor: AccountLoader<'info, MangoAccountFixed>, + pub liqor_owner: Signer<'info>, + + #[account( + mut, + has_one = group, + constraint = liqee.load()?.is_operational() @ MangoError::AccountIsFrozen + )] + pub liqee: AccountLoader<'info, MangoAccountFixed>, +} diff --git a/programs/mango-v4/src/error.rs b/programs/mango-v4/src/error.rs index 901a5117b..995874562 100644 --- a/programs/mango-v4/src/error.rs +++ b/programs/mango-v4/src/error.rs @@ -103,6 +103,8 @@ pub enum MangoError { InvalidHealthAccountCount, #[msg("would self trade")] WouldSelfTrade, + #[msg("staking option invariant violated")] + StakingOptionsError, } impl MangoError { diff --git a/programs/mango-v4/src/health/cache.rs b/programs/mango-v4/src/health/cache.rs index 0c5fb9feb..8bbcc7fef 100644 --- a/programs/mango-v4/src/health/cache.rs +++ b/programs/mango-v4/src/health/cache.rs @@ -1105,14 +1105,32 @@ pub fn new_health_cache( oracle: oracle_price, stable: bank.stable_price(), }; + // Use the liab price for computing weight scaling, because it's pessimistic and // causes the most unfavorable scaling. let liab_price = prices.liab(HealthType::Init); + let mut scaled_init_asset_weight = bank.scaled_init_asset_weight(liab_price); + + // Check if it is a StakingOption and if so, drop init weight to zero in + // the last hour. Use init weight because that is what the staking + // options liquidation uses. Do not need to adjust scaled asset weight + // because there is no max collateral on these tokens. + if bank.staking_options_expiration > 0 { + let now_ts: u64 = Clock::get()?.unix_timestamp.try_into().unwrap(); + if bank.staking_options_expiration < now_ts { + continue; + } + let time_remaining: u64 = bank.staking_options_expiration - now_ts; + if time_remaining < 60 * 60 { + scaled_init_asset_weight = I80F48::from_num(0); + } + } + token_infos.push(TokenInfo { token_index: bank.token_index, maint_asset_weight: bank.maint_asset_weight, init_asset_weight: bank.init_asset_weight, - init_scaled_asset_weight: bank.scaled_init_asset_weight(liab_price), + init_scaled_asset_weight: scaled_init_asset_weight, maint_liab_weight: bank.maint_liab_weight, init_liab_weight: bank.init_liab_weight, init_scaled_liab_weight: bank.scaled_init_liab_weight(liab_price), diff --git a/programs/mango-v4/src/instructions/ix_gate_set.rs b/programs/mango-v4/src/instructions/ix_gate_set.rs index 706bb013b..9616e0dc7 100644 --- a/programs/mango-v4/src/instructions/ix_gate_set.rs +++ b/programs/mango-v4/src/instructions/ix_gate_set.rs @@ -51,6 +51,8 @@ pub fn ix_gate_set(ctx: Context, ix_gate: u128) -> Result<()> { log_if_changed(&group, ix_gate, IxGate::Serum3PlaceOrder); log_if_changed(&group, ix_gate, IxGate::Serum3RegisterMarket); log_if_changed(&group, ix_gate, IxGate::Serum3SettleFunds); + log_if_changed(&group, ix_gate, IxGate::StakingOptionsExercise); + log_if_changed(&group, ix_gate, IxGate::StakingOptionsLiq); log_if_changed(&group, ix_gate, IxGate::StubOracleClose); log_if_changed(&group, ix_gate, IxGate::StubOracleCreate); log_if_changed(&group, ix_gate, IxGate::StubOracleSet); diff --git a/programs/mango-v4/src/instructions/mod.rs b/programs/mango-v4/src/instructions/mod.rs index ba9bc3258..e698d60f4 100644 --- a/programs/mango-v4/src/instructions/mod.rs +++ b/programs/mango-v4/src/instructions/mod.rs @@ -42,6 +42,8 @@ pub use serum3_liq_force_cancel_orders::*; pub use serum3_place_order::*; pub use serum3_register_market::*; pub use serum3_settle_funds::*; +pub use staking_options_exercise::*; +pub use staking_options_liq::*; pub use stub_oracle_close::*; pub use stub_oracle_create::*; pub use stub_oracle_set::*; @@ -101,6 +103,8 @@ mod serum3_liq_force_cancel_orders; mod serum3_place_order; mod serum3_register_market; mod serum3_settle_funds; +mod staking_options_exercise; +mod staking_options_liq; mod stub_oracle_close; mod stub_oracle_create; mod stub_oracle_set; diff --git a/programs/mango-v4/src/instructions/staking_options_exercise.rs b/programs/mango-v4/src/instructions/staking_options_exercise.rs new file mode 100644 index 000000000..58587cb24 --- /dev/null +++ b/programs/mango-v4/src/instructions/staking_options_exercise.rs @@ -0,0 +1,195 @@ +use anchor_lang::prelude::*; + +use crate::accounts_ix::*; +use crate::error::*; +use crate::health::*; +use crate::logs::{StakingOptionExerciseLog, TokenBalanceLog}; +use crate::state::*; +use fixed::types::I80F48; + +// Amount is in native of options. Note that staking options are zero decimals, +// so native is number of tokens. +pub fn staking_options_exercise( + ctx: Context, + amount: u64, + strike: u64, +) -> Result<()> { + let group_pk = &ctx.accounts.group.key(); + let mut account = ctx.accounts.account.load_full_mut()?; + + let pre_health_opt = if !account.fixed.is_in_health_region() { + let retriever = + new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow())?; + let health_cache = + new_health_cache(&account.borrow(), &retriever).context("pre-exercise init health")?; + let pre_init_health = account.check_health_pre(&health_cache)?; + Some((health_cache, pre_init_health)) + } else { + None + }; + + let mut base_bank = ctx.accounts.base_bank.load_mut()?; + let mut quote_bank = ctx.accounts.quote_bank.load_mut()?; + let mut option_bank = ctx.accounts.option_bank.load_mut()?; + let base_token_index = base_bank.token_index; + let quote_token_index = quote_bank.token_index; + let option_token_index = option_bank.token_index; + + // Verify the staking_options_state. CPI will fail if incorrect, so not a + // security concern, just a sanity check. + require_keys_neq!(option_bank.staking_options_state, Pubkey::default()); + require_keys_eq!( + option_bank.staking_options_state, + ctx.accounts.staking_options_state.key() + ); + + // Verify that the given token accounts for the exercise match what is on the banks. + require_keys_eq!(ctx.accounts.base_vault.key(), base_bank.vault); + require_keys_eq!(ctx.accounts.option_vault.key(), option_bank.vault); + require_keys_eq!(ctx.accounts.quote_vault.key(), quote_bank.vault); + + // Get the amounts from before exercise, this is a safety to verify that the + // StakingOptions program is properly handling the exercise. + let bank_base_native_amount_before = ctx.accounts.base_vault.amount; + let bank_quote_native_amount_before = ctx.accounts.quote_vault.amount; + let bank_option_native_amount_before = ctx.accounts.option_vault.amount; + + // Do the staking options exercise CPI. + let so_exercise_accounts = staking_options::cpi::accounts::Exercise { + authority: ctx.accounts.so_authority.to_account_info(), + state: ctx.accounts.staking_options_state.to_account_info(), + user_so_account: ctx.accounts.option_vault.to_account_info(), + option_mint: ctx.accounts.option_mint.to_account_info(), + user_quote_account: ctx.accounts.quote_vault.to_account_info(), + project_quote_account: ctx + .accounts + .staking_options_project_quote_account + .to_account_info(), + fee_quote_account: ctx + .accounts + .staking_options_fee_quote_account + .to_account_info(), + base_vault: ctx.accounts.staking_options_base_vault.to_account_info(), + user_base_account: ctx.accounts.base_vault.to_account_info(), + token_program: ctx.accounts.token_program.to_account_info(), + }; + let cpi_program_config = ctx.accounts.staking_options_program.to_account_info(); + + let group = ctx.accounts.group.load()?; + let group_seeds = group_seeds!(group); + staking_options::cpi::exercise( + CpiContext::new(cpi_program_config, so_exercise_accounts).with_signer(&[group_seeds]), + amount, + strike, + )?; + + // Verify that the CPI changed token amounts as expected. This protects + // mango from a malicious change in the staking options program. + ctx.accounts.base_vault.reload()?; + ctx.accounts.quote_vault.reload()?; + ctx.accounts.option_vault.reload()?; + let bank_base_native_amount_after = ctx.accounts.base_vault.amount; + let bank_quote_native_amount_after = ctx.accounts.quote_vault.amount; + let bank_option_native_amount_after = ctx.accounts.option_vault.amount; + let base_atoms_per_option = ctx.accounts.staking_options_state.lot_size; + + require!( + bank_base_native_amount_after - bank_base_native_amount_before + == amount * base_atoms_per_option, + MangoError::StakingOptionsError + ); + require!( + bank_quote_native_amount_before - bank_quote_native_amount_after == amount * strike, + MangoError::StakingOptionsError + ); + require!( + bank_option_native_amount_before - bank_option_native_amount_after == amount, + MangoError::StakingOptionsError + ); + + // Update the banks and account token positions + let (base_position, base_raw_index) = account.token_position_mut(base_token_index)?; + base_bank.deposit( + base_position, + I80F48::from(amount * base_atoms_per_option), + Clock::get()?.unix_timestamp.try_into().unwrap(), + )?; + let base_indexed_position = base_position.indexed_position; + + let (quote_position, quote_raw_index) = account.token_position_mut(quote_token_index)?; + require!(quote_position.is_active(), MangoError::SomeError); + let (quote_position_is_active, _quote_loan_origination_fee) = { + quote_bank.withdraw_with_fee( + quote_position, + I80F48::from(amount * strike), + Clock::get()?.unix_timestamp.try_into().unwrap(), + )? + }; + let quote_indexed_position = quote_position.indexed_position; + if !quote_position_is_active { + account.deactivate_token_position_and_log(quote_raw_index, ctx.accounts.account.key()); + } + + let (option_position, option_raw_index) = account.token_position_mut(option_token_index)?; + require!(option_position.is_active(), MangoError::SomeError); + // Use without_fee because no loans can happen for option bank. + let option_position_is_active = { + option_bank.withdraw_without_fee_with_dusting( + option_position, + I80F48::from(amount), + Clock::get()?.unix_timestamp.try_into().unwrap(), + )? + }; + let option_indexed_position = option_position.indexed_position; + if !option_position_is_active { + account.deactivate_token_position_and_log(option_raw_index, ctx.accounts.account.key()); + } + + // + // Health check after exercise. Note that health may decrease if the user + // makes a bad exercise, but that is their choice as long as the account + // stays healthy enough. Use the pre health because an exercise can still + // have negative but closer to zero health. + // + if let Some((mut health_cache, pre_init_health)) = pre_health_opt { + health_cache + .adjust_token_balance(&base_bank, I80F48::from(amount * base_atoms_per_option))?; + health_cache.adjust_token_balance("e_bank, -I80F48::from(amount * strike))?; + health_cache.adjust_token_balance(&option_bank, -I80F48::from(amount))?; + account.check_health_post(&health_cache, pre_init_health)?; + } + + // Emit logs + emit!(TokenBalanceLog { + mango_group: ctx.accounts.group.key(), + mango_account: ctx.accounts.account.key(), + token_index: base_token_index, + indexed_position: base_indexed_position.to_bits(), + deposit_index: base_bank.deposit_index.to_bits(), + borrow_index: base_bank.borrow_index.to_bits(), + }); + emit!(TokenBalanceLog { + mango_group: ctx.accounts.group.key(), + mango_account: ctx.accounts.account.key(), + token_index: quote_token_index, + indexed_position: quote_indexed_position.to_bits(), + deposit_index: quote_bank.deposit_index.to_bits(), + borrow_index: quote_bank.borrow_index.to_bits(), + }); + emit!(TokenBalanceLog { + mango_group: ctx.accounts.group.key(), + mango_account: ctx.accounts.account.key(), + token_index: option_token_index, + indexed_position: option_indexed_position.to_bits(), + deposit_index: option_bank.deposit_index.to_bits(), + borrow_index: option_bank.borrow_index.to_bits(), + }); + emit!(StakingOptionExerciseLog { + mango_group: ctx.accounts.group.key(), + mango_account: ctx.accounts.account.key(), + amount: amount, + staking_options_state: ctx.accounts.staking_options_state.key(), + }); + + Ok(()) +} diff --git a/programs/mango-v4/src/instructions/staking_options_liq.rs b/programs/mango-v4/src/instructions/staking_options_liq.rs new file mode 100644 index 000000000..a98ebc522 --- /dev/null +++ b/programs/mango-v4/src/instructions/staking_options_liq.rs @@ -0,0 +1,283 @@ +use anchor_lang::prelude::*; +use fixed::types::I80F48; +use std::cmp::min; + +use crate::accounts_ix::*; +use crate::error::*; +use crate::health::*; +use crate::logs::{StakingOptionsLiqLog, TokenBalanceLog}; +use crate::state::*; + +pub fn staking_options_liq( + ctx: Context, + asset_token_index: TokenIndex, + liab_token_index: TokenIndex, + max_liab_transfer: I80F48, +) -> Result<()> { + // Differences with token_liq_with_token: + // Liquor can only receive staking options from the last hour of expiration. + // Do not set is_liquidating. + // Liqee does not need to have a negative native position. + + let group_pk = &ctx.accounts.group.key(); + + require!(asset_token_index != liab_token_index, MangoError::SomeError); + let mut account_retriever = ScanningAccountRetriever::new(ctx.remaining_accounts, group_pk) + .context("create account retriever")?; + + require_keys_neq!(ctx.accounts.liqor.key(), ctx.accounts.liqee.key()); + let mut liqor = ctx.accounts.liqor.load_full_mut()?; + require!( + liqor + .fixed + .is_owner_or_delegate(ctx.accounts.liqor_owner.key()), + MangoError::SomeError + ); + + let mut liqee = ctx.accounts.liqee.load_full_mut()?; + + // Initial liqee health check. Uses init health. Because the health + // contribution drops to zero, this could result in just one liquidation, + // rather than a continuous stream of them all the way to Init threshold. + let mut liqee_health_cache = new_health_cache(&liqee.borrow(), &account_retriever) + .context("create liqee health cache")?; + let liqee_liq_end_health = liqee_health_cache.health(HealthType::Init); + + // + // Transfer some liab_token from liqor to liqee and + // transfer some asset_token from liqee to liqor. + // + let now_ts = Clock::get()?.unix_timestamp.try_into().unwrap(); + liquidation_action( + &mut account_retriever, + liab_token_index, + asset_token_index, + &mut liqor.borrow_mut(), + ctx.accounts.liqor.key(), + &mut liqee.borrow_mut(), + ctx.accounts.liqee.key(), + &mut liqee_health_cache, + liqee_liq_end_health, + now_ts, + max_liab_transfer, + )?; + + // Check liqor's health + if !liqor.fixed.is_in_health_region() { + let liqor_health = compute_health(&liqor.borrow(), HealthType::Init, &account_retriever) + .context("compute liqor health")?; + require!(liqor_health >= 0, MangoError::HealthMustBePositive); + } + + Ok(()) +} + +pub(crate) fn liquidation_action( + account_retriever: &mut ScanningAccountRetriever, + liab_token_index: TokenIndex, + asset_token_index: TokenIndex, + liqor: &mut MangoAccountRefMut, + liqor_key: Pubkey, + liqee: &mut MangoAccountRefMut, + liqee_key: Pubkey, + liqee_health_cache: &mut HealthCache, + liqee_liq_end_health: I80F48, + now_ts: u64, + max_liab_transfer: I80F48, +) -> Result<()> { + let (asset_bank, asset_oracle_price, opt_liab_bank_and_price) = + account_retriever.banks_mut_and_oracles(asset_token_index, liab_token_index)?; + let (liab_bank, liab_oracle_price) = opt_liab_bank_and_price.unwrap(); + + // Verify that the asset bank is for a staking option that expires in + // the next hour. The liab bank should be USDC, likely caused from a short + // perp position that is negative but has been collateralized with the long + // staking option. + require!( + asset_bank.staking_options_expiration > 0, + MangoError::StakingOptionsError + ); + let time_remaining: u64 = asset_bank.staking_options_expiration - now_ts; + require!(time_remaining < 60 * 60, MangoError::StakingOptionsError); + + // The main complication here is that we can't keep the liqee_asset_position and liqee_liab_position + // borrows alive at the same time. Possibly adding get_mut_pair() would be helpful. + let (liqee_asset_position, liqee_asset_raw_index) = + liqee.token_position_and_raw_index(asset_token_index)?; + let liqee_asset_native = liqee_asset_position.native(asset_bank); + require!(liqee_asset_native.is_positive(), MangoError::SomeError); + + let (liqee_liab_position, liqee_liab_raw_index) = + liqee.token_position_and_raw_index(liab_token_index)?; + let liqee_liab_native = liqee_liab_position.native(liab_bank); + require!(liqee_liab_native.is_negative(), MangoError::SomeError); + + // Liquidation fees work by giving the liqor more assets than the oracle price would + // indicate. Specifically we choose + // assets = + // liabs * liab_oracle_price/asset_oracle_price * (1 + liab_liq_fee) + // Which means that we use a increased liab oracle price for the conversion. + // For simplicity we write + // assets = liabs * liab_oracle_price / asset_oracle_price * fee_factor + // assets = liabs * liab_oracle_price_adjusted / asset_oracle_price + // = liabs * lopa / aop + let fee_factor = I80F48::ONE + liab_bank.liquidation_fee; + let liab_oracle_price_adjusted = liab_oracle_price * fee_factor; + + let init_asset_weight = 0; + let init_liab_weight = liab_bank.init_liab_weight; + + // The price the Init health computation uses for a liability of one native liab token + let liab_liq_end_price = liqee_health_cache + .token_info(liab_token_index) + .unwrap() + .prices + .liab(HealthType::Init); + // Health price for an asset of one native asset token + let asset_liq_end_price = liqee_health_cache + .token_info(asset_token_index) + .unwrap() + .prices + .asset(HealthType::Init); + + // How much asset would need to be exchanged to liab in order to bring health to 0? + // This is the same as token_liq_with_token except there is no health gain + // from reducing borrow because they have no health contribution in the last + // hour. + // + // That means: what is x (unit: native liab tokens) such that + // init_health + // + x * ilw * llep health gain from reducing liabs + // = 0 + // where + // ilw = init_liab_weight, + // llep = liab_liq_end_price, + // lopa = liab_oracle_price_adjusted, (see above) + // aop = asset_oracle_price + // ff = fee_factor + // and the asset cost of getting x native units of liab is: + // y = x * lopa / aop (native asset tokens, see above) + // + // Result: x = -init_health / (ilw * llep) + let liab_needed = -liqee_liq_end_health / (liab_liq_end_price * init_liab_weight); + + // How much liab can we get at most for the asset balance? + let liab_possible = liqee_asset_native * asset_oracle_price / liab_oracle_price_adjusted; + + // The amount of liab native tokens we will transfer + let liab_transfer = min( + min(min(liab_needed, -liqee_liab_native), liab_possible), + max_liab_transfer, + ); + + // The amount of asset native tokens we will give up for them + let asset_transfer = liab_transfer * liab_oracle_price_adjusted / asset_oracle_price; + + // During liquidation, we mustn't leave small positive balances in the liqee. Those + // could break bankruptcy-detection. Thus we dust them even if the token position + // is nominally in-use. + + // Apply the balance changes to the liqor and liqee accounts + let liqee_liab_position = liqee.token_position_mut_by_raw_index(liqee_liab_raw_index); + let liqee_liab_active = + liab_bank.deposit_with_dusting(liqee_liab_position, liab_transfer, now_ts)?; + let liqee_liab_indexed_position = liqee_liab_position.indexed_position; + + let (liqor_liab_position, liqor_liab_raw_index, _) = + liqor.ensure_token_position(liab_token_index)?; + let (liqor_liab_active, loan_origination_fee) = + liab_bank.withdraw_with_fee(liqor_liab_position, liab_transfer, now_ts)?; + let liqor_liab_indexed_position = liqor_liab_position.indexed_position; + let liqee_liab_native_after = liqee_liab_position.native(liab_bank); + + let (liqor_asset_position, liqor_asset_raw_index, _) = + liqor.ensure_token_position(asset_token_index)?; + let liqor_asset_active = asset_bank.deposit(liqor_asset_position, asset_transfer, now_ts)?; + let liqor_asset_indexed_position = liqor_asset_position.indexed_position; + + let liqee_asset_position = liqee.token_position_mut_by_raw_index(liqee_asset_raw_index); + let liqee_asset_active = asset_bank.withdraw_without_fee_with_dusting( + liqee_asset_position, + asset_transfer, + now_ts, + )?; + let liqee_asset_indexed_position = liqee_asset_position.indexed_position; + let liqee_assets_native_after = liqee_asset_position.native(asset_bank); + + // Update the health cache + liqee_health_cache + .adjust_token_balance(liab_bank, liqee_liab_native_after - liqee_liab_native)?; + liqee_health_cache + .adjust_token_balance(asset_bank, liqee_assets_native_after - liqee_asset_native)?; + + msg!( + "liquidated {} liab for {} asset", + liab_transfer, + asset_transfer + ); + + // liqee asset + emit!(TokenBalanceLog { + mango_group: liqee.fixed.group, + mango_account: liqee_key, + token_index: asset_token_index, + indexed_position: liqee_asset_indexed_position.to_bits(), + deposit_index: asset_bank.deposit_index.to_bits(), + borrow_index: asset_bank.borrow_index.to_bits(), + }); + // liqee liab + emit!(TokenBalanceLog { + mango_group: liqee.fixed.group, + mango_account: liqee_key, + token_index: liab_token_index, + indexed_position: liqee_liab_indexed_position.to_bits(), + deposit_index: liab_bank.deposit_index.to_bits(), + borrow_index: liab_bank.borrow_index.to_bits(), + }); + // liqor asset + emit!(TokenBalanceLog { + mango_group: liqee.fixed.group, + mango_account: liqor_key, + token_index: asset_token_index, + indexed_position: liqor_asset_indexed_position.to_bits(), + deposit_index: asset_bank.deposit_index.to_bits(), + borrow_index: asset_bank.borrow_index.to_bits(), + }); + // liqor liab + emit!(TokenBalanceLog { + mango_group: liqee.fixed.group, + mango_account: liqor_key, + token_index: liab_token_index, + indexed_position: liqor_liab_indexed_position.to_bits(), + deposit_index: liab_bank.deposit_index.to_bits(), + borrow_index: liab_bank.borrow_index.to_bits(), + }); + + // Since we use a scanning account retriever, it's safe to deactivate inactive token positions + if !liqee_asset_active { + liqee.deactivate_token_position_and_log(liqee_asset_raw_index, liqee_key); + } + if !liqee_liab_active { + liqee.deactivate_token_position_and_log(liqee_liab_raw_index, liqee_key); + } + if !liqor_asset_active { + liqor.deactivate_token_position_and_log(liqor_asset_raw_index, liqor_key); + } + if !liqor_liab_active { + liqor.deactivate_token_position_and_log(liqor_liab_raw_index, liqor_key) + } + + emit!(StakingOptionsLiqLog { + mango_group: liqee.fixed.group, + liqee: liqee_key, + liqor: liqor_key, + asset_token_index, + liab_token_index, + asset_transfer: asset_transfer.to_bits(), + liab_transfer: liab_transfer.to_bits(), + asset_price: asset_oracle_price.to_bits(), + liab_price: liab_oracle_price.to_bits(), + }); + + Ok(()) +} diff --git a/programs/mango-v4/src/instructions/token_edit.rs b/programs/mango-v4/src/instructions/token_edit.rs index d0ede5921..3b519510a 100644 --- a/programs/mango-v4/src/instructions/token_edit.rs +++ b/programs/mango-v4/src/instructions/token_edit.rs @@ -39,6 +39,8 @@ pub fn token_edit( reduce_only_opt: Option, name_opt: Option, force_close_opt: Option, + staking_options_state_opt: Option, + staking_options_expiration_opt: Option, ) -> Result<()> { let group = ctx.accounts.group.load()?; @@ -284,6 +286,12 @@ pub fn token_edit( require_group_admin = true; } bank.reduce_only = reduce_only; + + // Staking options cannot be borrowed, so enforce reduce only. + require!( + bank.reduce_only == 2 || bank.staking_options_state == Pubkey::default(), + MangoError::StakingOptionsError + ); }; if let Some(name) = name_opt.as_ref() { @@ -304,6 +312,27 @@ pub fn token_edit( bank.force_close = u8::from(force_close); require_group_admin = true; }; + + if let Some(staking_options_state) = staking_options_state_opt { + msg!( + "Staking Options State: old - {:?}, new - {:?}", + bank.staking_options_state, + staking_options_state + ); + bank.staking_options_state = staking_options_state; + require!(bank.reduce_only == 2, MangoError::StakingOptionsError); + }; + + if let Some(staking_options_expiration) = staking_options_expiration_opt { + msg!( + "Staking Options Expiration: old - {:?}, new - {:?}", + bank.staking_options_expiration, + staking_options_expiration + ); + bank.staking_options_expiration = staking_options_expiration; + require!(bank.reduce_only == 2, MangoError::StakingOptionsError); + require_group_admin = true; + }; } // account constraint #1 diff --git a/programs/mango-v4/src/instructions/token_register.rs b/programs/mango-v4/src/instructions/token_register.rs index dff98e00a..dc7a5a72e 100644 --- a/programs/mango-v4/src/instructions/token_register.rs +++ b/programs/mango-v4/src/instructions/token_register.rs @@ -89,8 +89,13 @@ pub fn token_register( deposit_weight_scale_start_quote: f64::MAX, reduce_only: 0, force_close: 0, - reserved: [0; 2118], + // Can only set something to be a staking option when editing because + // that is when reduce_only is set. + staking_options_state: Pubkey::default(), + staking_options_expiration: 0, + reserved: [0; 2078], }; + require_gt!(bank.max_rate, MINIMUM_MAX_RATE); let oracle_price = diff --git a/programs/mango-v4/src/instructions/token_register_trustless.rs b/programs/mango-v4/src/instructions/token_register_trustless.rs index a198284aa..14febb9f3 100644 --- a/programs/mango-v4/src/instructions/token_register_trustless.rs +++ b/programs/mango-v4/src/instructions/token_register_trustless.rs @@ -75,7 +75,9 @@ pub fn token_register_trustless( deposit_weight_scale_start_quote: 5_000_000_000.0, // $5k reduce_only: 2, // deposit-only force_close: 0, - reserved: [0; 2118], + staking_options_state: Pubkey::default(), + staking_options_expiration: 0, + reserved: [0; 2078], }; require_gt!(bank.max_rate, MINIMUM_MAX_RATE); diff --git a/programs/mango-v4/src/lib.rs b/programs/mango-v4/src/lib.rs index 120008ceb..b83d5ad43 100644 --- a/programs/mango-v4/src/lib.rs +++ b/programs/mango-v4/src/lib.rs @@ -184,6 +184,8 @@ pub mod mango_v4 { reduce_only_opt: Option, name_opt: Option, force_close_opt: Option, + staking_options_state_opt: Option, + staking_options_expiration_opt: Option, ) -> Result<()> { #[cfg(feature = "enable-gpl")] instructions::token_edit( @@ -212,6 +214,8 @@ pub mod mango_v4 { reduce_only_opt, name_opt, force_close_opt, + staking_options_state_opt, + staking_options_expiration_opt, )?; Ok(()) } @@ -1143,6 +1147,35 @@ pub mod mango_v4 { instructions::benchmark(ctx)?; Ok(()) } + + /// + /// Staking options + /// + pub fn staking_options_exercise( + ctx: Context, + amount: u64, + strike: u64, + ) -> Result<()> { + #[cfg(feature = "enable-gpl")] + instructions::staking_options_exercise(ctx, amount, strike)?; + Ok(()) + } + + pub fn staking_options_liq( + ctx: Context, + asset_token_index: TokenIndex, + liab_token_index: TokenIndex, + max_liab_transfer: I80F48, + ) -> Result<()> { + #[cfg(feature = "enable-gpl")] + instructions::staking_options_liq( + ctx, + asset_token_index, + liab_token_index, + max_liab_transfer, + )?; + Ok(()) + } } #[derive(Clone)] diff --git a/programs/mango-v4/src/logs.rs b/programs/mango-v4/src/logs.rs index d4e0c4760..3305b7d67 100644 --- a/programs/mango-v4/src/logs.rs +++ b/programs/mango-v4/src/logs.rs @@ -435,3 +435,24 @@ pub struct TokenForceCloseBorrowsWithTokenLog { pub liab_price: i128, pub fee_factor: i128, } + +#[event] +pub struct StakingOptionExerciseLog { + pub mango_group: Pubkey, + pub mango_account: Pubkey, + pub amount: u64, + pub staking_options_state: Pubkey, +} + +#[event] +pub struct StakingOptionsLiqLog { + pub mango_group: Pubkey, + pub liqee: Pubkey, + pub liqor: Pubkey, + pub asset_token_index: u16, + pub liab_token_index: u16, + pub asset_transfer: i128, // I80F48 + pub liab_transfer: i128, // I80F48 + pub asset_price: i128, // I80F48 + pub liab_price: i128, // I80F48 +} diff --git a/programs/mango-v4/src/state/bank.rs b/programs/mango-v4/src/state/bank.rs index 05d4a4158..4dc8833ec 100644 --- a/programs/mango-v4/src/state/bank.rs +++ b/programs/mango-v4/src/state/bank.rs @@ -127,6 +127,16 @@ pub struct Bank { /// See scaled_init_asset_weight(). pub deposit_weight_scale_start_quote: f64, + // If included, this bank is for a staking option and this is the + // SOState which will contain info on the option like expiration and display name. + // Pubkey::default() means no staking_options_state. Primarily included here + // to make UI able to display more information. The expiration is used in + // this program to help determine conditions around ITM option expiration. + pub staking_options_state: Pubkey, + + // Expiration is in seconds since epoch. + pub staking_options_expiration: u64, + // We have 3 modes // 0 - Off, // 1 - ReduceDepositsReduceBorrows - standard @@ -136,7 +146,7 @@ pub struct Bank { pub force_close: u8, #[derivative(Debug = "ignore")] - pub reserved: [u8; 2118], + pub reserved: [u8; 2078], } const_assert_eq!( size_of::(), @@ -165,7 +175,9 @@ const_assert_eq!( + 8 + 1 + 1 - + 2118 + + 32 + + 8 + + 2078 ); const_assert_eq!(size_of::(), 3064); const_assert_eq!(size_of::() % 8, 0); @@ -227,7 +239,9 @@ impl Bank { deposit_weight_scale_start_quote: f64::MAX, reduce_only: 0, force_close: 0, - reserved: [0; 2118], + staking_options_state: existing_bank.staking_options_state, + staking_options_expiration: existing_bank.staking_options_expiration, + reserved: [0; 2078], } } diff --git a/programs/mango-v4/src/state/group.rs b/programs/mango-v4/src/state/group.rs index 06fc2846e..d14c793c5 100644 --- a/programs/mango-v4/src/state/group.rs +++ b/programs/mango-v4/src/state/group.rs @@ -190,6 +190,8 @@ pub enum IxGate { TokenForceCloseBorrowsWithToken = 49, PerpForceClosePosition = 50, GroupWithdrawInsuranceFund = 51, + StakingOptionsExercise = 52, + StakingOptionsLiq = 53, // NOTE: Adding new variants requires matching changes in ts and the ix_gate_set instruction. } diff --git a/programs/mango-v4/tests/cases/mod.rs b/programs/mango-v4/tests/cases/mod.rs index bca3aff8c..ed3f42214 100644 --- a/programs/mango-v4/tests/cases/mod.rs +++ b/programs/mango-v4/tests/cases/mod.rs @@ -34,4 +34,5 @@ mod test_perp_settle_fees; mod test_position_lifetime; mod test_reduce_only; mod test_serum; +mod test_staking_options; mod test_token_update_index_and_rate; diff --git a/programs/mango-v4/tests/cases/test_staking_options.rs b/programs/mango-v4/tests/cases/test_staking_options.rs new file mode 100644 index 000000000..d8e55a9c4 --- /dev/null +++ b/programs/mango-v4/tests/cases/test_staking_options.rs @@ -0,0 +1,419 @@ +use super::*; +use anchor_lang::Id; +use anchor_spl::token::Token; +use solana_sdk::instruction; +use solana_sdk::signature::Signer; + +#[tokio::test] +async fn test_staking_options_exercise() -> Result<(), TransportError> { + let mut test_builder = TestContextBuilder::new(); + test_builder.test().set_compute_max_units(170_000); // StakingOptionsExercise needs 162k + let context = test_builder.start_default().await; + let solana = &context.solana.clone(); + let initial_token_deposit = 1_000_000; + + let admin = TestKeypair::new(); + let owner = context.users[0].key; + let payer = context.users[1].key; + + let mut user = context.users[1].clone(); + + // + // SETUP: Create staking options state and mints associated with it. + // + let staking_options_state_cookie = context.staking_options.create_staking_options().await; + + let mint_authority = solana.context.borrow().payer.pubkey(); + + let user_quote_account = solana + .create_token_account(&payer.pubkey(), staking_options_state_cookie.quote_mint_key) + .await; + let user_base_account = solana + .create_token_account(&payer.pubkey(), staking_options_state_cookie.base_mint_key) + .await; + let user_option_account = solana + .create_token_account( + &payer.pubkey(), + staking_options_state_cookie.option_mint_key, + ) + .await; + user.token_accounts.push(user_quote_account); + user.token_accounts.push(user_base_account); + user.token_accounts.push(user_option_account); + + solana + .mint_to( + &staking_options_state_cookie.quote_mint_key, + &user_quote_account, + initial_token_deposit, + ) + .await; + solana + .mint_to( + &staking_options_state_cookie.base_mint_key, + &user_base_account, + initial_token_deposit, + ) + .await; + + // Amount is in tokens, but gets converted to lots, so multiply by lot size. + let issue_so_data = staking_options::instruction::Issue { + amount: initial_token_deposit * 1_000_000, + strike: 1_000_000, + }; + let issue_so_accounts = staking_options::accounts::Issue { + authority: mint_authority, + state: staking_options_state_cookie.state_address, + option_mint: staking_options_state_cookie.option_mint_key, + user_so_account: user_option_account, + token_program: Token::id(), + }; + + let issue_so_instruction = instruction::Instruction { + program_id: staking_options::id(), + accounts: anchor_lang::ToAccountMetas::to_account_metas(&issue_so_accounts, None), + data: anchor_lang::InstructionData::data(&issue_so_data), + }; + + solana + .process_transaction(&[issue_so_instruction], None) + .await + .unwrap(); + + // Authority isnt used, so fill with a default value. + let mints = vec![ + MintCookie { + index: 10, + decimals: 6, + unit: 10u64.pow(6) as f64, + base_lot: 100 as f64, + quote_lot: 10 as f64, + pubkey: staking_options_state_cookie.quote_mint_key, + authority: TestKeypair::default(), + }, // Quote + MintCookie { + index: 11, + decimals: 6, + unit: 10u64.pow(6) as f64, + base_lot: 100 as f64, + quote_lot: 10 as f64, + pubkey: staking_options_state_cookie.base_mint_key, + authority: TestKeypair::new(), + }, // Base + MintCookie { + index: 12, + decimals: 6, + unit: 10u64.pow(6) as f64, + base_lot: 100 as f64, + quote_lot: 10 as f64, + pubkey: staking_options_state_cookie.option_mint_key, + authority: TestKeypair::new(), + }, // StakingOption + ]; + + // + // SETUP: Create a group and an account. Also initialize oracles and + // insurance vault. + // + let GroupWithTokens { group, tokens, .. } = GroupWithTokensConfig { + admin, + payer, + mints: (&mints[..]).to_vec(), + ..GroupWithTokensConfig::default() + } + .create(solana) + .await; + + send_tx( + solana, + TokenMakeReduceOnly { + admin, + group, + mint: mints[2].pubkey, + reduce_only: 2, + force_close: false, + }, + ) + .await + .unwrap(); + + let now = solana.get_clock().await.unix_timestamp as u64; + send_tx( + solana, + TokenEditStakingOptions { + group, + admin, + mint: mints[2].pubkey, + staking_options_state: staking_options_state_cookie.state_address, + staking_options_expiration: now + 60 * 10, + }, + ) + .await + .unwrap(); + + // + // SETUP: Prepare mango accounts + // + let account_0 = send_tx( + &solana, + AccountCreateInstruction { + account_num: 0, + token_count: 16, + serum3_count: 8, + perp_count: 8, + perp_oo_count: 8, + group, + owner, + payer: payer, + }, + ) + .await + .unwrap() + .account; + + for mint in &mints[..] { + send_tx( + solana, + TokenDepositInstruction { + amount: initial_token_deposit, + reduce_only: false, + account: account_0, + owner, + token_account: user.token_accounts[mint.index], + token_authority: user.key, + bank_index: 0, + }, + ) + .await + .unwrap(); + } + + send_tx( + solana, + StakingOptionsExerciseInstruction { + amount: 1, + strike: 1_000_000, + group: group, + account: account_0, + owner: owner, + so_authority: mint_authority, + staking_options_state: staking_options_state_cookie.state_address, + option_mint: staking_options_state_cookie.option_mint_key, + quote_mint: staking_options_state_cookie.quote_mint_key, + staking_options_project_quote_account: staking_options_state_cookie + .project_quote_account, + staking_options_fee_quote_account: staking_options_state_cookie.fee_quote_account, + staking_options_base_vault: staking_options_state_cookie.base_vault, + base_mint: staking_options_state_cookie.base_mint_key, + quote_bank: tokens[0].bank, + base_bank: tokens[1].bank, + option_bank: tokens[2].bank, + }, + ) + .await + .unwrap(); + + let mango_account = solana.get_account::(account_0).await; + let bank = solana.get_account::(tokens[0].bank).await; + // All the quote is used. + assert_eq!(mango_account.tokens[0].native(&bank).to_num::(), 0); + // Paid the base tokens from the exercise. + assert_eq!( + mango_account.tokens[1].native(&bank).to_num::(), + initial_token_deposit * 2 + ); + // Use 1 option. + assert_eq!( + mango_account.tokens[2].native(&bank).to_num::(), + initial_token_deposit - 1 + ); + + Ok(()) +} + +// Note that because the liquidation does not interact with the staking options +// program, do not actually need to make real staking options, just TokenEdit so +// that the bank believes that it has staking options. +#[tokio::test] +async fn test_staking_options_liq() -> Result<(), TransportError> { + let mut test_builder = TestContextBuilder::new(); + test_builder.test().set_compute_max_units(85_000); // StakingOptionsLiq needs 79k + let context = test_builder.start_default().await; + let solana = &context.solana.clone(); + + let admin = TestKeypair::new(); + let owner = context.users[0].key; + let payer = context.users[1].key; + let mints = &context.mints[0..2]; + let payer_mint_accounts = &context.users[1].token_accounts[0..2]; + + // + // SETUP: Create a group and an account to fill the vaults + // + + let mango_setup::GroupWithTokens { group, tokens, .. } = mango_setup::GroupWithTokensConfig { + admin, + payer, + mints: mints.to_vec(), + ..GroupWithTokensConfig::default() + } + .create(solana) + .await; + let borrow_token1 = &tokens[0]; + let collateral_token1 = &tokens[1]; + + // deposit some funds, to the vaults aren't empty + let liquor = send_tx( + solana, + AccountCreateInstruction { + account_num: 2, + token_count: 16, + serum3_count: 8, + perp_count: 8, + perp_oo_count: 8, + group, + owner, + payer, + }, + ) + .await + .unwrap() + .account; + for &token_account in payer_mint_accounts { + send_tx( + solana, + TokenDepositInstruction { + amount: 100000, + reduce_only: false, + account: liquor, + owner, + token_account, + token_authority: payer.clone(), + bank_index: 0, + }, + ) + .await + .unwrap(); + } + + // + // SETUP: Make an account with some collateral and some borrows + // + let liqee = send_tx( + solana, + AccountCreateInstruction { + account_num: 0, + token_count: 16, + serum3_count: 8, + perp_count: 8, + perp_oo_count: 8, + group, + owner, + payer, + }, + ) + .await + .unwrap() + .account; + + let deposit1_amount = 1000; + send_tx( + solana, + TokenDepositInstruction { + amount: deposit1_amount, + reduce_only: false, + account: liqee, + owner, + token_account: payer_mint_accounts[1], + token_authority: payer.clone(), + bank_index: 0, + }, + ) + .await + .unwrap(); + + let borrow1_amount = 350; + send_tx( + solana, + TokenWithdrawInstruction { + amount: borrow1_amount, + allow_borrow: true, + account: liqee, + owner, + token_account: payer_mint_accounts[0], + bank_index: 0, + }, + ) + .await + .unwrap(); + + // + // SETUP: Do not need to change oracle price since health contribution goes + // to zero. Setup the staking options. It must be first made into reduce only. + // + send_tx( + solana, + TokenMakeReduceOnly { + admin, + group, + mint: mints[1].pubkey, + reduce_only: 2, + force_close: false, + }, + ) + .await + .unwrap(); + + let now = solana.get_clock().await.unix_timestamp as u64; + send_tx( + solana, + TokenEditStakingOptions { + group, + admin, + mint: mints[1].pubkey, + staking_options_state: Pubkey::new_unique(), + staking_options_expiration: now + 60 * 10, + }, + ) + .await + .unwrap(); + + // + // TEST: StakingOptionsLiq + // + send_tx( + solana, + StakingOptionsLiqInstruction { + liqee: liqee, + liqor: liquor, + liqor_owner: owner, + asset_token_index: collateral_token1.index, + liab_token_index: borrow_token1.index, + asset_bank_index: 0, + liab_bank_index: 0, + max_liab_transfer: I80F48::from_num(1000.0), + }, + ) + .await + .unwrap(); + + // No more borrow. That got dusted so only a collateral position remains. + let liqee_account = get_mango_account(solana, liqee).await; + assert_eq!(liqee_account.active_token_positions().count(), 1); + // 1000 - 350 * fee = 643 + assert_eq!( + account_position(solana, liqee, collateral_token1.bank).await, + 643 + ); + + assert_eq!( + account_position(solana, liquor, borrow_token1.bank).await, + 99650 + ); + assert_eq!( + account_position(solana, liquor, collateral_token1.bank).await, + 100357 + ); + + Ok(()) +} diff --git a/programs/mango-v4/tests/fixtures/staking_options.so b/programs/mango-v4/tests/fixtures/staking_options.so new file mode 100644 index 0000000000000000000000000000000000000000..684634c767a5f878ea373fdbb08df75edad0d197 GIT binary patch literal 589744 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⁡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 z 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 Q{%e`}#?{91Hn;zO04lQVz5oCK literal 0 HcmV?d00001 diff --git a/programs/mango-v4/tests/program_test/mango_client.rs b/programs/mango-v4/tests/program_test/mango_client.rs index 9bc845d83..ebb458e6e 100644 --- a/programs/mango-v4/tests/program_test/mango_client.rs +++ b/programs/mango-v4/tests/program_test/mango_client.rs @@ -1082,6 +1082,8 @@ fn token_edit_instruction_default() -> mango_v4::instruction::TokenEdit { reduce_only_opt: None, name_opt: None, force_close_opt: None, + staking_options_state_opt: None, + staking_options_expiration_opt: None, } } @@ -1148,6 +1150,65 @@ impl ClientInstruction for TokenEditWeights { } } +pub struct TokenEditStakingOptions { + pub group: Pubkey, + pub admin: TestKeypair, + pub mint: Pubkey, + + pub staking_options_state: Pubkey, + pub staking_options_expiration: u64, +} + +#[async_trait::async_trait(?Send)] +impl ClientInstruction for TokenEditStakingOptions { + type Accounts = mango_v4::accounts::TokenEdit; + type Instruction = mango_v4::instruction::TokenEdit; + async fn to_instruction( + &self, + account_loader: impl ClientAccountLoader + 'async_trait, + ) -> (Self::Accounts, instruction::Instruction) { + let program_id = mango_v4::id(); + + let mint_info_key = Pubkey::find_program_address( + &[ + b"MintInfo".as_ref(), + self.group.as_ref(), + self.mint.as_ref(), + ], + &program_id, + ) + .0; + let mint_info: MintInfo = account_loader.load(&mint_info_key).await.unwrap(); + + let instruction = Self::Instruction { + staking_options_state_opt: Some(self.staking_options_state), + staking_options_expiration_opt: Some(self.staking_options_expiration), + ..token_edit_instruction_default() + }; + + let accounts = Self::Accounts { + group: self.group, + admin: self.admin.pubkey(), + mint_info: mint_info_key, + oracle: mint_info.oracle, + }; + + let mut instruction = make_instruction(program_id, &accounts, &instruction); + instruction + .accounts + .extend(mint_info.banks().iter().map(|&k| AccountMeta { + pubkey: k, + is_signer: false, + is_writable: true, + })); + (accounts, instruction) + } + + fn signers(&self) -> Vec { + vec![self.admin] + } +} + pub struct TokenResetStablePriceModel { pub group: Pubkey, pub admin: TestKeypair, @@ -4201,3 +4262,152 @@ impl ClientInstruction for AltExtendInstruction { vec![self.admin, self.payer] } } + +pub struct StakingOptionsExerciseInstruction { + pub amount: u64, + pub strike: u64, + + pub group: Pubkey, + pub account: Pubkey, + pub owner: TestKeypair, + pub so_authority: Pubkey, + pub staking_options_state: Pubkey, + pub option_mint: Pubkey, + pub quote_mint: Pubkey, + pub staking_options_project_quote_account: Pubkey, + pub staking_options_fee_quote_account: Pubkey, + pub staking_options_base_vault: Pubkey, + pub base_mint: Pubkey, + pub base_bank: Pubkey, + pub quote_bank: Pubkey, + pub option_bank: Pubkey, +} +#[async_trait::async_trait(?Send)] +impl ClientInstruction for StakingOptionsExerciseInstruction { + type Accounts = mango_v4::accounts::StakingOptionsExercise; + type Instruction = mango_v4::instruction::StakingOptionsExercise; + async fn to_instruction( + &self, + account_loader: impl ClientAccountLoader + 'async_trait, + ) -> (Self::Accounts, instruction::Instruction) { + let program_id = mango_v4::id(); + + let account = account_loader + .load_mango_account(&self.account) + .await + .unwrap(); + + let base_mint_info: MintInfo = + get_mint_info_by_mint(&account_loader, &account, self.base_mint).await; + let quote_mint_info: MintInfo = + get_mint_info_by_mint(&account_loader, &account, self.quote_mint).await; + let option_mint_info: MintInfo = + get_mint_info_by_mint(&account_loader, &account, self.option_mint).await; + + let health_check_metas = derive_health_check_remaining_account_metas( + &account_loader, + &account, + Some(self.base_bank), + true, + None, + ) + .await; + + let instruction = Self::Instruction { + amount: self.amount, + strike: self.strike, + }; + + let accounts = Self::Accounts { + group: self.group, + account: self.account, + owner: self.owner.pubkey(), + so_authority: self.group, + staking_options_state: self.staking_options_state, + option_vault: option_mint_info.vaults[0], + option_mint: self.option_mint, + quote_vault: quote_mint_info.vaults[0], + staking_options_project_quote_account: self.staking_options_project_quote_account, + staking_options_fee_quote_account: self.staking_options_fee_quote_account, + staking_options_base_vault: self.staking_options_base_vault, + base_vault: base_mint_info.vaults[0], + base_bank: self.base_bank, + quote_bank: self.quote_bank, + option_bank: self.option_bank, + token_program: Token::id(), + staking_options_program: staking_options::id(), + }; + + let mut instruction = make_instruction(program_id, &accounts, &instruction); + // Add oracles and banks for health checking. + instruction.accounts.extend(health_check_metas.into_iter()); + (accounts, instruction) + } + + fn signers(&self) -> Vec { + vec![self.owner] + } +} + +pub struct StakingOptionsLiqInstruction { + pub liqee: Pubkey, + pub liqor: Pubkey, + pub liqor_owner: TestKeypair, + + pub asset_token_index: TokenIndex, + pub asset_bank_index: usize, + pub liab_token_index: TokenIndex, + pub liab_bank_index: usize, + pub max_liab_transfer: I80F48, +} +#[async_trait::async_trait(?Send)] +impl ClientInstruction for StakingOptionsLiqInstruction { + type Accounts = mango_v4::accounts::StakingOptionsLiq; + type Instruction = mango_v4::instruction::StakingOptionsLiq; + async fn to_instruction( + &self, + account_loader: impl ClientAccountLoader + 'async_trait, + ) -> (Self::Accounts, instruction::Instruction) { + let program_id = mango_v4::id(); + let instruction = Self::Instruction { + asset_token_index: self.asset_token_index, + liab_token_index: self.liab_token_index, + max_liab_transfer: self.max_liab_transfer, + }; + + let liqee = account_loader + .load_mango_account(&self.liqee) + .await + .unwrap(); + let liqor = account_loader + .load_mango_account(&self.liqor) + .await + .unwrap(); + let health_check_metas = derive_liquidation_remaining_account_metas( + &account_loader, + &liqee, + &liqor, + self.asset_token_index, + self.asset_bank_index, + self.liab_token_index, + self.liab_bank_index, + ) + .await; + + let accounts = Self::Accounts { + group: liqee.fixed.group, + liqee: self.liqee, + liqor: self.liqor, + liqor_owner: self.liqor_owner.pubkey(), + }; + + let mut instruction = make_instruction(program_id, &accounts, &instruction); + instruction.accounts.extend(health_check_metas.into_iter()); + + (accounts, instruction) + } + + fn signers(&self) -> Vec { + vec![self.liqor_owner] + } +} diff --git a/programs/mango-v4/tests/program_test/mod.rs b/programs/mango-v4/tests/program_test/mod.rs index a35cadc25..e49fddf9e 100644 --- a/programs/mango-v4/tests/program_test/mod.rs +++ b/programs/mango-v4/tests/program_test/mod.rs @@ -14,6 +14,7 @@ pub use cookies::*; pub use mango_client::*; pub use serum::*; pub use solana::*; +pub use staking_options_helper::*; pub use utils::*; pub mod cookies; @@ -21,6 +22,7 @@ pub mod mango_client; pub mod mango_setup; pub mod serum; pub mod solana; +pub mod staking_options_helper; pub mod utils; trait AddPacked { @@ -223,6 +225,12 @@ impl TestContextBuilder { serum_program_id } + pub fn add_staking_options_program(&mut self) -> Pubkey { + self.test + .add_program("staking_options", staking_options::id(), None); + staking_options::id() + } + pub fn add_margin_trade_program(&mut self) -> MarginTradeCookie { let program = Pubkey::from_str("J83w4HKfqxwcq3BEMMkPFSppX3gqekLyLJBexebFVkix").unwrap(); let token_account = TestKeypair::new(); @@ -257,6 +265,7 @@ impl TestContextBuilder { let mints = self.create_mints(); let users = self.create_users(&mints); let serum_program_id = self.add_serum_program(); + let staking_options_program_id = self.add_staking_options_program(); let solana = self.start().await; @@ -264,12 +273,17 @@ impl TestContextBuilder { solana: solana.clone(), program_id: serum_program_id, }); + let staking_options = Arc::new(StakingOptionsCookie { + solana: solana.clone(), + program_id: staking_options_program_id, + }); TestContext { solana: solana.clone(), mints, users, serum, + staking_options, } } @@ -294,6 +308,7 @@ pub struct TestContext { pub mints: Vec, pub users: Vec, pub serum: Arc, + pub staking_options: Arc, } impl TestContext { diff --git a/programs/mango-v4/tests/program_test/solana.rs b/programs/mango-v4/tests/program_test/solana.rs index 8f9a6db58..ea9ea3c96 100644 --- a/programs/mango-v4/tests/program_test/solana.rs +++ b/programs/mango-v4/tests/program_test/solana.rs @@ -194,6 +194,49 @@ impl SolanaCookie { return keypair.pubkey(); } + pub async fn create_mint(&self, authority: &Pubkey) -> Pubkey { + let keypair = TestKeypair::new(); + let rent = self.rent.minimum_balance(spl_token::state::Mint::LEN); + + let instructions = [ + system_instruction::create_account( + &self.context.borrow().payer.pubkey(), + &keypair.pubkey(), + rent, + spl_token::state::Mint::LEN as u64, + &spl_token::id(), + ), + spl_token::instruction::initialize_mint( + &spl_token::id(), + &keypair.pubkey(), + authority, + None, // freeze_authority_pubkey + 6, // decimals + ) + .unwrap(), + ]; + + self.process_transaction(&instructions, Some(&[keypair])) + .await + .unwrap(); + return keypair.pubkey(); + } + + // Requires that the authority for the mint is the default payer. + pub async fn mint_to(&self, mint: &Pubkey, token_account: &Pubkey, amount: u64) { + let instructions = [spl_token::instruction::mint_to( + &spl_token::id(), + mint, + token_account, + &self.context.borrow().payer.pubkey(), + &[&self.context.borrow().payer.pubkey()], + amount, + ) + .unwrap()]; + + self.process_transaction(&instructions, None).await.unwrap(); + } + // Note: Only one table can be created per authority per slot! pub async fn create_address_lookup_table( &self, diff --git a/programs/mango-v4/tests/program_test/staking_options_helper.rs b/programs/mango-v4/tests/program_test/staking_options_helper.rs new file mode 100644 index 000000000..daf25f679 --- /dev/null +++ b/programs/mango-v4/tests/program_test/staking_options_helper.rs @@ -0,0 +1,153 @@ +#![allow(dead_code)] + +use std::sync::Arc; + +use anchor_lang::prelude::System; +use anchor_lang::Id; +use anchor_spl::token::Token; +use solana_program::sysvar::rent::Rent; +use solana_program::sysvar::SysvarId; +use solana_sdk::instruction; +use solana_sdk::pubkey::Pubkey; +use solana_sdk::signature::Signer; + +use super::*; + +#[derive(Clone, Debug)] +pub struct StakingOptionsStateCookie { + pub state_address: Pubkey, + pub base_vault: Pubkey, + pub project_base_account: Pubkey, + pub project_quote_account: Pubkey, + pub base_mint_key: Pubkey, + pub quote_mint_key: Pubkey, + pub option_mint_key: Pubkey, + pub fee_quote_account: Pubkey, +} + +pub struct StakingOptionsCookie { + pub solana: Arc, + pub program_id: Pubkey, +} + +impl StakingOptionsCookie { + pub async fn create_staking_options(&self) -> StakingOptionsStateCookie { + // For simplicity, the authority over all the mints and the staking options is the context payer. + let authority = self.solana.context.borrow().payer.pubkey(); + let base_mint_key = self.solana.create_mint(&authority).await; + let quote_mint_key = self.solana.create_mint(&authority).await; + + let project_base_account = self + .solana + .create_token_account(&authority, base_mint_key) + .await; + let project_quote_account = self + .solana + .create_token_account(&authority, quote_mint_key) + .await; + + let dual_dao = Pubkey::from_str("7Z36Efbt7a4nLiV7s5bY7J2e4TJ6V9JEKGccsy2od2bE").unwrap(); + let fee_quote_account = self + .solana + .create_token_account(&dual_dao, quote_mint_key) + .await; + + let instructions = [spl_token::instruction::mint_to( + &spl_token::id(), + &base_mint_key, + &project_base_account, + &authority, + &[&authority], + 1_000_000_000_000, + ) + .unwrap()]; + + self.solana + .process_transaction(&instructions, None) + .await + .unwrap(); + + let name = "SO_STATE"; + // Initialize staking options state with expiration in the next hour. + let (state_address, _state_address_bump) = Pubkey::find_program_address( + &[b"so-config", name.as_bytes(), &base_mint_key.to_bytes()], + &staking_options::id(), + ); + let (base_vault, _base_vault_bump) = Pubkey::find_program_address( + &[b"so-vault", name.as_bytes(), &base_mint_key.to_bytes()], + &staking_options::id(), + ); + + // 1 hour from now. + let expiration = self.solana.get_clock().await.unix_timestamp + 60 * 60 * 1; + let configure_so_data = staking_options::instruction::ConfigV2 { + option_expiration: expiration as u64, + subscription_period_end: expiration as u64, + num_tokens: 1_000_000_000_000, + lot_size: 1_000_000, + so_name: name.to_string(), + }; + let configure_so_accounts = staking_options::accounts::ConfigV2 { + authority: authority, + so_authority: authority, + issue_authority: None, + state: state_address, + base_vault: base_vault, + base_account: project_base_account, + quote_account: project_quote_account, + base_mint: base_mint_key, + quote_mint: quote_mint_key, + token_program: Token::id(), + system_program: System::id(), + rent: Rent::id(), + }; + + let instruction = instruction::Instruction { + program_id: staking_options::id(), + accounts: anchor_lang::ToAccountMetas::to_account_metas(&configure_so_accounts, None), + data: anchor_lang::InstructionData::data(&configure_so_data), + }; + + self.solana + .process_transaction(&[instruction], None) + .await + .unwrap(); + + let strike: u64 = 1_000_000; + let (option_mint_key, _option_mint_key_bump) = Pubkey::find_program_address( + &[b"so-mint", &state_address.to_bytes(), &strike.to_be_bytes()], + &staking_options::id(), + ); + + let init_strike_data = staking_options::instruction::InitStrike { strike: strike }; + let init_strike_accounts = staking_options::accounts::InitStrike { + authority: authority, + state: state_address, + option_mint: option_mint_key, + token_program: Token::id(), + system_program: System::id(), + rent: Rent::id(), + }; + + let instruction = instruction::Instruction { + program_id: staking_options::id(), + accounts: anchor_lang::ToAccountMetas::to_account_metas(&init_strike_accounts, None), + data: anchor_lang::InstructionData::data(&init_strike_data), + }; + self.solana + .process_transaction(&[instruction], None) + .await + .unwrap(); + + StakingOptionsStateCookie { + state_address: state_address, + base_vault: base_vault, + project_base_account: project_base_account, + project_quote_account: project_quote_account, + base_mint_key: base_mint_key, + quote_mint_key: quote_mint_key, + option_mint_key: option_mint_key, + fee_quote_account: fee_quote_account, + } + } +}