From 0f34851c642470c54adf092174ccdf3d781c9e27 Mon Sep 17 00:00:00 2001 From: microwavedcola1 <89031858+microwavedcola1@users.noreply.github.com> Date: Sat, 18 Jun 2022 16:38:46 +0200 Subject: [PATCH] switchboard support (#67) * switchboard support Signed-off-by: microwavedcola1 * Fix from review Signed-off-by: microwavedcola1 --- Cargo.lock | 290 +- liquidator/src/liquidate.rs | 1 + programs/mango-v4/Cargo.toml | 21 +- ...b36oFJsjpCKpsXvg4cgBRoZtwNTc3EzG5Ttd2o.bin | Bin 0 -> 1000 bytes ...zN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR.bin | Bin 0 -> 3851 bytes .../src/instructions/perp_create_market.rs | 6 +- .../src/instructions/perp_place_order.rs | 1 + .../src/instructions/perp_update_funding.rs | 1 + .../src/instructions/token_register.rs | 2 + programs/mango-v4/src/lib.rs | 8 +- programs/mango-v4/src/state/bank.rs | 6 +- programs/mango-v4/src/state/health.rs | 14 +- programs/mango-v4/src/state/oracle.rs | 193 +- programs/mango-v4/src/state/oracle_config.rs | 0 programs/mango-v4/src/state/perp_market.rs | 6 +- .../tests/program_test/mango_client.rs | 6 + ts/client/src/client.ts | 13 + ts/client/src/mango_v4.ts | 8124 +++++++++-------- ts/client/src/scripts/example1-admin.ts | 5 + 19 files changed, 4552 insertions(+), 4145 deletions(-) create mode 100644 programs/mango-v4/resources/test/8k7F9Xb36oFJsjpCKpsXvg4cgBRoZtwNTc3EzG5Ttd2o.bin create mode 100644 programs/mango-v4/resources/test/GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR.bin create mode 100644 programs/mango-v4/src/state/oracle_config.rs diff --git a/Cargo.lock b/Cargo.lock index 2755a3481..53276351c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1894,9 +1894,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" [[package]] name = "globset" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd" +checksum = "0a1e17342619edbc21a964c2afbeb6c820c6a2560032872f397bb97ea127bd0a" dependencies = [ "aho-corasick", "bstr", @@ -2772,6 +2772,9 @@ dependencies = [ "spl-associated-token-account", "spl-token", "static_assertions", + "switchboard-program", + "switchboard-utils", + "switchboard-v2", ] [[package]] @@ -3145,9 +3148,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.73" +version = "0.9.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5fd19fb3e0a8191c1e34935718976a3e70c112ab9a24af6d7cadccd9d90bc0" +checksum = "835363342df5fba8354c5b453325b110ffd54044e588c539cf2f20a8014e4cb1" dependencies = [ "autocfg 1.1.0", "cc", @@ -3420,9 +3423,9 @@ checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" [[package]] name = "prettyplease" -version = "0.1.11" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f28f53e8b192565862cf99343194579a022eb9c7dd3a8d03134734803c7b3125" +checksum = "e5355b9d4fc0cc607db0c2e93c7a035a32226bfa770e0c6fec504f0018015bad" dependencies = [ "proc-macro2 1.0.39", "syn 1.0.95", @@ -3601,6 +3604,15 @@ dependencies = [ "percent-encoding 2.1.0", ] +[[package]] +name = "quick-protobuf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ca6639207ac869e31cca06b8adbc7676278f22b321e51115766009b4f192dbb" +dependencies = [ + "byteorder", +] + [[package]] name = "quinn" version = "0.8.3" @@ -4046,6 +4058,27 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "rust_decimal" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34a3bb58e85333f1ab191bf979104b586ebd77475bc6681882825f4532dfe87c" +dependencies = [ + "arrayvec", + "num-traits", + "serde", +] + +[[package]] +name = "rust_decimal_macros" +version = "1.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1467556c7c115165aa0346bcf45bc947203bcc880efad85a09ba24ea17926c4" +dependencies = [ + "quote 1.0.18", + "rust_decimal", +] + [[package]] name = "rustc-demangle" version = "0.1.21" @@ -4564,9 +4597,9 @@ dependencies = [ [[package]] name = "solana-account-decoder" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1f44cab8c5e96bf564577e5dbcf48479a8402148997b8b79d902662fdd849e0" +checksum = "58af714929674f4169ead69f746f590dbcf4d58cff217059454aa6b1f67888fb" dependencies = [ "Inflector", "base64 0.12.3", @@ -4587,9 +4620,9 @@ dependencies = [ [[package]] name = "solana-address-lookup-table-program" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb4ac8dddca3eb59d8cd0975a95c5f1783d7a187a95cd9bd19c85be445ca91" +checksum = "0dbb6239bc1d892cd84ed2f6005e5263701f60ab90662401766beabee605f824" dependencies = [ "bincode", "bytemuck", @@ -4607,9 +4640,9 @@ dependencies = [ [[package]] name = "solana-banks-client" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a7d3ac53f1dba56c618d33cca3232da0e63b69579d1e7b8ed73a6db39d84a1" +checksum = "61cb5cd2b94c2f69f6f1e7196ca9e40dcdbe3d03d481cf1a25ced9f66ae01261" dependencies = [ "borsh", "futures 0.3.21", @@ -4624,9 +4657,9 @@ dependencies = [ [[package]] name = "solana-banks-interface" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "013bc53394b83f34ee4618b964df4fca80656405707780b324f832dd55b0c13f" +checksum = "9066cc8cc3f358c1708aed8aafd362023008fceee7ce81f3a7389a5f3d934bca" dependencies = [ "serde", "solana-sdk", @@ -4635,9 +4668,9 @@ dependencies = [ [[package]] name = "solana-banks-server" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0737af9380c10daf6a62c648ce5e5c435fb040dbd01cc0d55a0a408a74d3864e" +checksum = "b5b0408d2b64e622dd3049f61db2f5f710a5af786b33130dc4fce3748421eac4" dependencies = [ "bincode", "futures 0.3.21", @@ -4653,9 +4686,9 @@ dependencies = [ [[package]] name = "solana-bloom" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0bb2c5edec0ab8952bf5ce7b58b77d4cc8b4868edeccd0cb40915cbf9562d2a" +checksum = "f54f09b054e371a7baa2dd2fba062d7d3ef11168b1147c6d03d65318f647f1ce" dependencies = [ "bv", "fnv", @@ -4672,9 +4705,9 @@ dependencies = [ [[package]] name = "solana-bpf-loader-program" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b253f81a066c80316d895e866735f17b98f839893908e0670699580c7541b042" +checksum = "54cc916788e21b79b142c98362bcc406bf76297f54975b53821e34789154d0e8" dependencies = [ "bincode", "byteorder", @@ -4690,9 +4723,9 @@ dependencies = [ [[package]] name = "solana-bucket-map" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd4261925fccec29326710a13d45503333c91caad4d7d8702499126c35205db7" +checksum = "9c9247b06b46f7567e69b61c1e34b077a9a88ee8dd9fe14414cb75ff007ec7b2" dependencies = [ "fs_extra", "log 0.4.17", @@ -4707,9 +4740,9 @@ dependencies = [ [[package]] name = "solana-clap-utils" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c43bd2fa7a7c1cc46b13e29075e58470deca1127e92a361246a83f5999ea7a8" +checksum = "4c127c7eadd27ba24ad924355cf5db1ea5224e685caee950f02afa36036b6e01" dependencies = [ "chrono", "clap 2.34.0", @@ -4725,9 +4758,9 @@ dependencies = [ [[package]] name = "solana-cli-config" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "754b0aed54477aa8025c61e1e73c6dd9cdcca81833b0bce02f9b37a4ee784069" +checksum = "0fdf509d5f3c475401bd38b92d493597dcf28988ca0db34cf53b805f4a9fe663" dependencies = [ "dirs-next", "lazy_static", @@ -4739,9 +4772,9 @@ dependencies = [ [[package]] name = "solana-client" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd8a592e6dd26d9b369559f148dcbf1c64dcc4cbe879b569fa717353f14601bd" +checksum = "76d750bbe7a0aaa58931a6e3e29fc05c37c3b0ff359e660fa2487758312a6d27" dependencies = [ "base64 0.13.0", "bincode", @@ -4773,9 +4806,9 @@ dependencies = [ [[package]] name = "solana-compute-budget-program" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f53cbd028709ad4885e11727989363e430c3ccdff0c77d24da10ed09c0511a" +checksum = "0c56cb979223df10c8f59d3baed67c10dc33282721871e7c0dbd7a15e4c7fd41" dependencies = [ "solana-program-runtime", "solana-sdk", @@ -4783,9 +4816,9 @@ dependencies = [ [[package]] name = "solana-config-program" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a6ab1d15c8fd26a38c971d32c5090004cbf6cfeefb59cef1faaf2e83862e9f7" +checksum = "f153fd92602ffd6941cb20ba59ed0a70401c0810c18c1cc3b09b4aca87b555cf" dependencies = [ "bincode", "chrono", @@ -4797,9 +4830,9 @@ dependencies = [ [[package]] name = "solana-entry" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41839f670c0d445f9566e91d643c4e55c4b6da2dfea88a41e5b2c6f4a2dee3ee" +checksum = "a0b4b96393ba20ce16dda568cf4be22f65f5bde27eba441758c0a3aa6ca0c5e2" dependencies = [ "bincode", "dlopen", @@ -4818,9 +4851,9 @@ dependencies = [ [[package]] name = "solana-faucet" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4338f04530e3ff5fe6eea72ea8bc1ce0ef78251ce319b0924af2841a49ec6a14" +checksum = "dfe5f0c2364a97ff75ef95654077fc908a0d623a064b11b5728871e57adf1814" dependencies = [ "bincode", "byteorder", @@ -4841,9 +4874,9 @@ dependencies = [ [[package]] name = "solana-frozen-abi" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a4169a72d1c598ee818859c040053e057dc1246e0be99eaff0221d3b067b096" +checksum = "2d4fcb89eb3d0f30bd4b4a31ad1825c9d95cd638509acead00969d7601713288" dependencies = [ "bs58 0.4.0", "bv", @@ -4861,9 +4894,9 @@ dependencies = [ [[package]] name = "solana-frozen-abi-macro" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60ac2476ec4845f069fd2f47edd7eac993dde05492fdaf724a28cd27c9775d56" +checksum = "d63ab101db88ecccd8da34065b9097b88367e0744fdfd05cb7de87b4ede3717f" dependencies = [ "proc-macro2 1.0.39", "quote 1.0.18", @@ -4873,9 +4906,9 @@ dependencies = [ [[package]] name = "solana-gossip" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fecb8bcf6b7536d5639195ca9e8a3d279f3ed78f5088d1806731c0cc1580003d" +checksum = "ececc968937ba83bb47bf8c2eedb7bb73c84336e6341b196a735efacaa8c2c55" dependencies = [ "bincode", "bv", @@ -4917,9 +4950,9 @@ dependencies = [ [[package]] name = "solana-ledger" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86a61d3858b01d1a30bfabc5fad4c8006ed23dca89273cb2783e0487d89d4664" +checksum = "2ff406fa83dd6aac9493c881b960d7216606977ad0006aa8342eabafa0875ee5" dependencies = [ "bincode", "byteorder", @@ -4969,9 +5002,9 @@ dependencies = [ [[package]] name = "solana-logger" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b5a3ee6f60aec46f2ec8319de82c28e3787cff983725026156f7578186f2ed" +checksum = "9ce1805d52fc8277a84c4803c7850c8f41471b57fb0dec7750338955ad6e43e2" dependencies = [ "env_logger 0.9.0", "lazy_static", @@ -4980,9 +5013,9 @@ dependencies = [ [[package]] name = "solana-measure" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3aa26a3f600c05d7e4c11859105aa13afa69e5fecf31ab031ea22f3a7d3b8f" +checksum = "a23ebcaacf30eef5093caac882b812b102e477e8dca326bd4ec058a7258203d9" dependencies = [ "log 0.4.17", "solana-sdk", @@ -4990,9 +5023,9 @@ dependencies = [ [[package]] name = "solana-merkle-tree" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9dd99f89611ef29b5b9f95ddc3662f056d78e08dcb8267313bfa801372d971d" +checksum = "b1284e53ba5b27364eb0f6ecbaf0e21b7fe9f37e2cedf23fb7b994504c109e89" dependencies = [ "fast-math", "matches", @@ -5001,9 +5034,9 @@ dependencies = [ [[package]] name = "solana-metrics" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "898f37a342c73ecdd9c01a34eac79c715d938545a5073d9dd7900b7ff86d77f6" +checksum = "96ade4cd1025dec8452198645aaa9215e01527a7fd981c0f9e838af3c73cc322" dependencies = [ "env_logger 0.9.0", "gethostname", @@ -5015,9 +5048,9 @@ dependencies = [ [[package]] name = "solana-net-utils" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f778f0f7e3dc3f1880681d1bf9df33a2f12bc9a9b93cbaca6a59917f4c6feeab" +checksum = "8aa4fe2bc5449cecf84128d109166164a186a23744bacf574e324baa47c58a03" dependencies = [ "bincode", "clap 2.34.0", @@ -5036,9 +5069,9 @@ dependencies = [ [[package]] name = "solana-perf" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa840c5318190c978865e11380a47c35c68c4f5133347733916ed65c8241a33f" +checksum = "45a484044f9a725f03580f9c37df15b3068c06da19c256db6afabe225fc1aeed" dependencies = [ "ahash", "bincode", @@ -5065,9 +5098,9 @@ dependencies = [ [[package]] name = "solana-poh" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b2e198f793115ae438d7dbd1f160c6b59c3c9fea7dd410235d56057289e44b4" +checksum = "ce6676b4de9505f4dd1e7c4ddc21fc1df2d84767f028d3bc48b0665cf88cdc76" dependencies = [ "core_affinity", "crossbeam-channel", @@ -5084,9 +5117,9 @@ dependencies = [ [[package]] name = "solana-program" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d0e33def9b079816b71431b2df1d56537bc081501f2c2c51c2f5e25cb2aee9" +checksum = "f5deafc4902425d40197f74166640300dd20b078e4ffd518c1bb56ceb7e01680" dependencies = [ "base64 0.13.0", "bincode", @@ -5127,9 +5160,9 @@ dependencies = [ [[package]] name = "solana-program-runtime" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2eca963c55fa23bd7cedfc2cd4d17828d4241bb20c6bf9edcb72fcd96f500cf" +checksum = "d8c19e461c990bf2976097a8fe1cdf8cbdded1cd73d15153abf495919529b403" dependencies = [ "base64 0.13.0", "bincode", @@ -5151,9 +5184,9 @@ dependencies = [ [[package]] name = "solana-program-test" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab16ff7b8bb37c13dca4387313aca7d29495bbe6154390793df46c77f4348baf" +checksum = "68d944137ef6ff8b2a2cddffc81153c874947e4f38b8f134a2330565cb664903" dependencies = [ "async-trait", "base64 0.12.3", @@ -5175,9 +5208,9 @@ dependencies = [ [[package]] name = "solana-rayon-threadlimit" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7384306ce6dfc0c814e4adc8927b07375b28ebcad730f348dd39d7ef7f679320" +checksum = "813c5ee551922504721e365fc1d3dd47370c179aea338f2aeddac0b8f60db6a8" dependencies = [ "lazy_static", "num_cpus", @@ -5185,9 +5218,9 @@ dependencies = [ [[package]] name = "solana-remote-wallet" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea408da42f964628381623a00a7d4b87d608558d54b1dce613b8cceb557e01fa" +checksum = "f285064f51bad825e71c59eeab5442c2e782fd4c32b6accbfe45a883b531c69a" dependencies = [ "base32", "console", @@ -5206,9 +5239,9 @@ dependencies = [ [[package]] name = "solana-rpc" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d45f2a88ec71ae52ce8dc5796b62f4a1674144a1235e4ac376be2ace23681b32" +checksum = "6bcf13d137b0c858204df91e6eeb183376da06dc895a408d9159c0ce24804e35" dependencies = [ "base64 0.12.3", "bincode", @@ -5258,9 +5291,9 @@ dependencies = [ [[package]] name = "solana-runtime" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13bb982c16a945820fc55f708f53cf487dfdb2de2853bf7bd0da5b7b934185ed" +checksum = "866eab25b383c30211ada934966fc8a68404022407aeaa514ca1db68143f2bc4" dependencies = [ "arrayref", "bincode", @@ -5313,9 +5346,9 @@ dependencies = [ [[package]] name = "solana-sdk" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e819de5e19c6ef5bb6982ae7c458fa5385b946cea9481fba88092325b337517" +checksum = "fee70c58dad3bb6554412017cb1b55a6a66b7b6362122d7e426c7375cc19a066" dependencies = [ "assert_matches", "base64 0.13.0", @@ -5364,9 +5397,9 @@ dependencies = [ [[package]] name = "solana-sdk-macro" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "863a4620043f4f95f7c9d13f4d257494248a46ccf54347197ff498e2c16749df" +checksum = "3db4c93bd43c91290ad54fe6ff86179a859954f196507c4789a4876d38a62f17" dependencies = [ "bs58 0.4.0", "proc-macro2 1.0.39", @@ -5377,9 +5410,9 @@ dependencies = [ [[package]] name = "solana-send-transaction-service" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b109ccc413fd47de0b8e7b835304eb9d399e623f5ec23b59c4c4786ddb543c97" +checksum = "9c0010ad47a78558184d19902e06c18477ffc4c8a6bb41ced891bdf5e7b13491" dependencies = [ "log 0.4.17", "solana-logger", @@ -5390,9 +5423,9 @@ dependencies = [ [[package]] name = "solana-stake-program" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f1e28c5f45dd0921f5305ac9962872e8f85f9db463193bc15414c0a5db14222" +checksum = "1a1b6053c5b70d2f5762772a850149d3dad0c33714a6bc76e82d7dc12e9d9e8e" dependencies = [ "bincode", "log 0.4.17", @@ -5413,9 +5446,9 @@ dependencies = [ [[package]] name = "solana-storage-bigtable" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f2dce557fd7e1649c3bcfdf59174bb717aca61d783abcf69da529c1add012a" +checksum = "fd301e0cea5e442757b05875befd168b853f7fd1b487fdf07a19f7569f2f7ce9" dependencies = [ "backoff", "bincode", @@ -5441,9 +5474,9 @@ dependencies = [ [[package]] name = "solana-storage-proto" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fec73002c83a674641f5e4753fface5a51c91661717c4b48b2fdab3940cf3d" +checksum = "57e7fd88b4a66b130f9f5cb9f175f5b9018a2f85e5100e02eabbfe3580c236ea" dependencies = [ "bincode", "bs58 0.4.0", @@ -5457,9 +5490,9 @@ dependencies = [ [[package]] name = "solana-streamer" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a8bbfd28bf997dbb562caf74fdbd167cfba28f93ea50fbfed8d1677ef7ab302" +checksum = "5e0f662ae8797bf548de8f7b3ddce837aaf6afd5e2b5fd1be27dff693b8c2856" dependencies = [ "crossbeam-channel", "futures-util", @@ -5484,9 +5517,9 @@ dependencies = [ [[package]] name = "solana-sys-tuner" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b245a20c7d48574c0741d3539ef2cc4ba08b8c8d7899f6a630be20619c0c82" +checksum = "c2c3e569d57d97f04de7c06f6b24680a418f423d82bd3f5c0edccea7672fb8a8" dependencies = [ "clap 2.34.0", "libc", @@ -5501,9 +5534,9 @@ dependencies = [ [[package]] name = "solana-transaction-status" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a033893989eb7c1d64b332010d2a642e7d09d70dec4731dcbbe53958edbcf4" +checksum = "bd8ccc04259f162e4a692e7fbd8f57344c4ac3ad6e01b213d5630bf72fd53d11" dependencies = [ "Inflector", "base64 0.12.3", @@ -5528,9 +5561,9 @@ dependencies = [ [[package]] name = "solana-version" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86535132eeb3ff093628760c7e263f25ad9ec8aaffc55d10bad1b319144cfb1c" +checksum = "2c3609ec652314f0ea308ea754f1afe66acd65d2443c67c669125df093db82f0" dependencies = [ "log 0.4.17", "rustc_version 0.4.0", @@ -5543,9 +5576,9 @@ dependencies = [ [[package]] name = "solana-vote-program" -version = "1.9.25" +version = "1.9.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5f294988bcd212317f9cdf8358de651d6c9857bef46def73fe4610eef9d1fb5" +checksum = "f67d16c4b8b195d4cbfc73c05516ba16de7fdcff19a502ddc4e6254611928c8d" dependencies = [ "bincode", "log 0.4.17", @@ -5736,6 +5769,71 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +[[package]] +name = "superslice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab16ced94dbd8a46c82fd81e3ed9a8727dac2977ea869d217bcc4ea1f122e81f" + +[[package]] +name = "switchboard-program" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534d4b2d45907427fc8d2cd151465cfaee3709c4742491734bc34e5a458ebd09" +dependencies = [ + "bincode", + "borsh", + "bytemuck", + "byteorder", + "quick-protobuf", + "solana-program", + "switchboard-protos", + "switchboard-utils", +] + +[[package]] +name = "switchboard-protos" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e2d89875ff72d12ea7918d6ccd82d1ac5eab54b3a9d1bd7356fa6905801aa72" +dependencies = [ + "bincode", + "borsh", + "byteorder", + "quick-protobuf", +] + +[[package]] +name = "switchboard-utils" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac1d68193aa1669e34d16087db0f96e6597d2f78868378aabc1387b8b29172e" +dependencies = [ + "bincode", + "borsh", + "bytemuck", + "byteorder", + "quick-protobuf", + "rust_decimal", + "rust_decimal_macros", + "solana-program", + "switchboard-protos", +] + +[[package]] +name = "switchboard-v2" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3031f4e296ae9d1d8c493f23ee94cbe96d6781826ac6ed03e01ea82af5dbaf49" +dependencies = [ + "anchor-lang", + "anchor-spl", + "bytemuck", + "rust_decimal", + "solana-program", + "superslice", +] + [[package]] name = "symlink" version = "0.1.0" @@ -6275,9 +6373,9 @@ dependencies = [ [[package]] name = "tower" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a89fd63ad6adf737582df5db40d286574513c69a11dac5214dc3b5603d6713e" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" dependencies = [ "futures-core", "futures-util", diff --git a/liquidator/src/liquidate.rs b/liquidator/src/liquidate.rs index fcc477678..918543483 100644 --- a/liquidator/src/liquidate.rs +++ b/liquidator/src/liquidate.rs @@ -154,6 +154,7 @@ pub fn process_accounts<'a>( let oracle = chain_data.account(&mint_info.oracle)?; let price = oracle_price( &KeyedAccountSharedData::new(mint_info.oracle, oracle.clone()), + bank.oracle_config.conf_filter, bank.mint_decimals, )?; Ok((token.token_index, bank, token.native(bank) * price)) diff --git a/programs/mango-v4/Cargo.toml b/programs/mango-v4/Cargo.toml index 0461eb490..50f933b25 100644 --- a/programs/mango-v4/Cargo.toml +++ b/programs/mango-v4/Cargo.toml @@ -23,21 +23,24 @@ client = ["solana-sdk"] # note: possibly need init-if-needed feature anchor-lang = { version = "0.24.2", features = [] } anchor-spl = { version = "0.24.2", features = [] } +arrayref = "0.3.6" +bincode = "1.3.3" bytemuck = "^1.7.2" -# todo: higher versions don't work -fixed = { version = "=1.11.0", features = ["serde", "borsh"] } +checked_math = { path = "../../lib/checked_math" } +fixed = { version = "=1.11.0", features = ["serde", "borsh"] } # todo: higher versions don't work fixed-macro = "^1.1.1" +mango-macro = { path = "../../mango-macro" } +num_enum = "0.5.1" pyth-sdk-solana = "0.1.0" serde = "^1.0" +serum_dex = { version = "0.4.0", git = "https://github.com/blockworks-foundation/serum-dex.git", default-features=false,features = ["no-entrypoint", "program"] } solana-program = "~1.9.13" -static_assertions = "1.1" -serum_dex = { version = "0.4.0", git = "https://github.com/blockworks-foundation/serum-dex.git", default-features=false, features = ["no-entrypoint", "program"] } -checked_math = { path = "../../lib/checked_math" } -arrayref = "0.3.6" -num_enum = "0.5.1" -bincode = "1.3.3" -mango-macro = { path = "../../mango-macro" } solana-sdk = { version = "~1.9.13", default-features = false, optional = true } +static_assertions = "1.1" +switchboard-program = ">=0.2.0" +switchboard-utils = ">=0.1.36" +switchboard-v2 = "0.1.10" + [dev-dependencies] solana-sdk = { version = "~1.9.13", default-features = false } diff --git a/programs/mango-v4/resources/test/8k7F9Xb36oFJsjpCKpsXvg4cgBRoZtwNTc3EzG5Ttd2o.bin b/programs/mango-v4/resources/test/8k7F9Xb36oFJsjpCKpsXvg4cgBRoZtwNTc3EzG5Ttd2o.bin new file mode 100644 index 0000000000000000000000000000000000000000..9219754a07080815e81f6fdce41b085854d5f865 GIT binary patch literal 1000 zcmZQwJZVngkBR$vO1nRON_g=7@q@^#;iq}ZzV8-2C2{zc?>Y_!2oSwx(>hUlrTx>| zIIxgi|B@t-j7DA0&TP(=_Fw*9sd%Zj(thAnL3a-1!ES0h-ZRGcj`?q2$dtce}+?|Hs9Pfn8`u;y( zM8e{wQ)Kf0$+@bv63+$u&j!v~?)_6|n`lY>-iO@F-rlG*WCnVS35Xein2k(Na?DGixRB^mJ^va1dDCaCT|MnNhul_81<{kUnr1V&f-D08M$F|}iram2*Q)up z%bE{{Ntsw*Fc&n_xUH#tU*vSDbX#n8uuA@#br1JyDEQh)8QV|V5WcOjR#W#G=k4WF z{`r6WqZN@J>TY=?+snS(MKMBt!80)#4ZbHyN;BWa7;SM`zbgDKiiM+`K^Fos9)B^? z6Sg#lO>EG4W&j*?#Q@b(bUvyq^?8hppz;VefXgOA3zGlPf&{k~RGHk|Yr5bP2rA48 zq$l&CssWWWgbD)Tgzp)q2Mm=iEZX&(YjPn+cHu_GOOoyS0XBc#-^acSiSes_r6#_4 zzWbY#3u+hdy6PHs_AA50JI{A|+%1~w;*o)B<0x+^gg|`^W`#2p+&v=Q2rntH`#w}( z&hHJw&t>YXui09-d=qt_Hv5ygeap-{ZCh21#4djA{w%QHJ9)p*7hN4qpTbR^+(&~B zI2pNR&UvBxxmV9U<%9I~m!HMf^)yGlp6(M@JN;p2ytv+kMl zC;6s?gt!8$&7TIBlL4NGE&hjD>U}St&i3Z#|5wUhriFn!{g>GV?z`sll=nx+%g9D4 zp4Glu<#EC6(_YVhwv#Wwzg_ zIt~6e2U&h#50#N4>M>D>P0+B8#pTXq-#1-?>KC#lF4wMl&|rIiw(8Uc+;`XQeR#M? zZ>i2z(b=-~d@-KpQZeEmEIyvNeuVvG3v+VH!&evPZxlWI|G?x}rUd&>CuU#0{aNI% zYmvd*Yu2jjzQGGAUk6x~R^*@gx zOrhOjUee~U@SY2c8<#}!`>e2&UZpbs;mhTVQa1>j@EvyAWO{3MI+G`p!-N^lEv0!rSDTd$jHM+wUw_Rc9*7bxN rm8d*wzSn+vwzdEF$rm0yog5_Fxb^83jk0Igu{APb9U$zk8eF0PEnMED literal 0 HcmV?d00001 diff --git a/programs/mango-v4/src/instructions/perp_create_market.rs b/programs/mango-v4/src/instructions/perp_create_market.rs index 6a739f07b..f7bf620e2 100644 --- a/programs/mango-v4/src/instructions/perp_create_market.rs +++ b/programs/mango-v4/src/instructions/perp_create_market.rs @@ -46,6 +46,7 @@ pub fn perp_create_market( ctx: Context, perp_market_index: PerpMarketIndex, name: String, + oracle_config: OracleConfig, base_token_index_opt: Option, base_token_decimals: u8, quote_token_index: TokenIndex, @@ -67,6 +68,7 @@ pub fn perp_create_market( name: fill16_from_str(name)?, group: ctx.accounts.group.key(), oracle: ctx.accounts.oracle.key(), + oracle_config, bids: ctx.accounts.bids.key(), asks: ctx.accounts.asks.key(), event_queue: ctx.accounts.event_queue.key(), @@ -88,11 +90,11 @@ pub fn perp_create_market( open_interest: 0, seq_num: 0, fees_accrued: I80F48::ZERO, - bump: *ctx.bumps.get("perp_market").ok_or(MangoError::SomeError)?, // Why optional - Perp could be based purely on an oracle - base_token_index: base_token_index_opt.ok_or(TokenIndex::MAX).unwrap(), + bump: *ctx.bumps.get("perp_market").ok_or(MangoError::SomeError)?, base_token_decimals, perp_market_index, + base_token_index: base_token_index_opt.ok_or(TokenIndex::MAX).unwrap(), quote_token_index, }; diff --git a/programs/mango-v4/src/instructions/perp_place_order.rs b/programs/mango-v4/src/instructions/perp_place_order.rs index deaf65bbd..908944cb3 100644 --- a/programs/mango-v4/src/instructions/perp_place_order.rs +++ b/programs/mango-v4/src/instructions/perp_place_order.rs @@ -92,6 +92,7 @@ pub fn perp_place_order( let oracle_price = oracle_price( &AccountInfoRef::borrow(ctx.accounts.oracle.as_ref())?, + perp_market.oracle_config.conf_filter, perp_market.base_token_decimals, )?; diff --git a/programs/mango-v4/src/instructions/perp_update_funding.rs b/programs/mango-v4/src/instructions/perp_update_funding.rs index 19262f059..f1fef539f 100644 --- a/programs/mango-v4/src/instructions/perp_update_funding.rs +++ b/programs/mango-v4/src/instructions/perp_update_funding.rs @@ -30,6 +30,7 @@ pub fn perp_update_funding(ctx: Context) -> Result<()> { let oracle_price = oracle_price( &AccountInfoRef::borrow(ctx.accounts.oracle.as_ref())?, + perp_market.oracle_config.conf_filter, perp_market.base_token_decimals, )?; diff --git a/programs/mango-v4/src/instructions/token_register.rs b/programs/mango-v4/src/instructions/token_register.rs index 7243c6bd3..08a6fc34f 100644 --- a/programs/mango-v4/src/instructions/token_register.rs +++ b/programs/mango-v4/src/instructions/token_register.rs @@ -90,6 +90,7 @@ pub fn token_register( ctx: Context, token_index: TokenIndex, name: String, + oracle_config: OracleConfig, interest_rate_params: InterestRateParams, loan_fee_rate: f32, loan_origination_fee_rate: f32, @@ -108,6 +109,7 @@ pub fn token_register( mint: ctx.accounts.mint.key(), vault: ctx.accounts.vault.key(), oracle: ctx.accounts.oracle.key(), + oracle_config, deposit_index: INDEX_START, borrow_index: INDEX_START, indexed_total_deposits: I80F48::ZERO, diff --git a/programs/mango-v4/src/lib.rs b/programs/mango-v4/src/lib.rs index cc19306a0..bf8aecd22 100644 --- a/programs/mango-v4/src/lib.rs +++ b/programs/mango-v4/src/lib.rs @@ -17,13 +17,15 @@ mod serum3_cpi; pub mod state; pub mod types; -use state::{OrderType, PerpMarketIndex, Serum3MarketIndex, Side, TokenIndex}; +use state::{OracleConfig, OrderType, PerpMarketIndex, Serum3MarketIndex, Side, TokenIndex}; declare_id!("m43thNJ58XCjL798ZSq6JGAG1BnWskhdq5or6kcnfsD"); #[program] pub mod mango_v4 { + use crate::state::OracleConfig; + use super::*; pub fn create_group(ctx: Context, group_num: u32, testing: u8) -> Result<()> { @@ -39,6 +41,7 @@ pub mod mango_v4 { ctx: Context, token_index: TokenIndex, name: String, + oracle_config: OracleConfig, interest_rate_params: InterestRateParams, loan_fee_rate: f32, loan_origination_fee_rate: f32, @@ -52,6 +55,7 @@ pub mod mango_v4 { ctx, token_index, name, + oracle_config, interest_rate_params, loan_fee_rate, loan_origination_fee_rate, @@ -224,6 +228,7 @@ pub mod mango_v4 { ctx: Context, perp_market_index: PerpMarketIndex, name: String, + oracle_config: OracleConfig, base_token_index_opt: Option, base_token_decimals: u8, quote_token_index: TokenIndex, @@ -244,6 +249,7 @@ pub mod mango_v4 { ctx, perp_market_index, name, + oracle_config, base_token_index_opt, base_token_decimals, quote_token_index, diff --git a/programs/mango-v4/src/state/bank.rs b/programs/mango-v4/src/state/bank.rs index 167a3161b..4fb0a8641 100644 --- a/programs/mango-v4/src/state/bank.rs +++ b/programs/mango-v4/src/state/bank.rs @@ -1,4 +1,4 @@ -use super::{TokenAccount, TokenIndex}; +use super::{OracleConfig, TokenAccount, TokenIndex}; use crate::error::MangoError; use crate::util::checked_math as cm; use anchor_lang::prelude::*; @@ -19,6 +19,8 @@ pub struct Bank { pub vault: Pubkey, pub oracle: Pubkey, + pub oracle_config: OracleConfig, + /// the index used to scale the value of an IndexedPosition /// TODO: should always be >= 0, add checks? pub deposit_index: I80F48, @@ -67,7 +69,7 @@ pub struct Bank { // TODO: add space for an oracle which services interest rate for the bank's mint // interest rate tied to oracle might help reduce spreads between deposits and borrows } -const_assert_eq!(size_of::(), 16 + 32 * 4 + 8 + 16 * 18 + 3 + 5); +const_assert_eq!(size_of::(), 16 + 32 * 4 + 8 + 16 * 19 + 2 + 1 + 1 + 4); const_assert_eq!(size_of::() % 8, 0); impl std::fmt::Debug for Bank { diff --git a/programs/mango-v4/src/state/health.rs b/programs/mango-v4/src/state/health.rs index 1fcbb8fae..a4c3ee9fd 100644 --- a/programs/mango-v4/src/state/health.rs +++ b/programs/mango-v4/src/state/health.rs @@ -62,7 +62,10 @@ impl AccountRetriever for FixedOrderAccountRetriever { require!(bank.token_index == token_index, MangoError::SomeError); let oracle = &self.ais[cm!(self.n_banks + account_index)]; require!(&bank.oracle == oracle.key(), MangoError::SomeError); - Ok((bank, oracle_price(oracle, bank.mint_decimals)?)) + Ok(( + bank, + oracle_price(oracle, bank.oracle_config.conf_filter, bank.mint_decimals)?, + )) } fn perp_market( @@ -203,8 +206,8 @@ impl<'a, 'info> ScanningAccountRetriever<'a, 'info> { require!(&bank2.oracle == oracle2.key, MangoError::SomeError); let mint_decimals1 = bank1.mint_decimals; let mint_decimals2 = bank2.mint_decimals; - let price1 = oracle_price(oracle1, mint_decimals1)?; - let price2 = oracle_price(oracle2, mint_decimals2)?; + let price1 = oracle_price(oracle1, bank1.oracle_config.conf_filter, mint_decimals1)?; + let price2 = oracle_price(oracle2, bank2.oracle_config.conf_filter, mint_decimals2)?; if swap { Ok((bank2, bank1, price2, price1)) } else { @@ -224,7 +227,10 @@ impl<'a, 'info> AccountRetriever for ScanningAccountRetriever<'a, 'info> { let bank = self.ais[index].load_fully_unchecked::()?; let oracle = &self.ais[cm!(self.n_banks() + index)]; require!(&bank.oracle == oracle.key, MangoError::SomeError); - Ok((bank, oracle_price(oracle, bank.mint_decimals)?)) + Ok(( + bank, + oracle_price(oracle, bank.oracle_config.conf_filter, bank.mint_decimals)?, + )) } fn perp_market( diff --git a/programs/mango-v4/src/state/oracle.rs b/programs/mango-v4/src/state/oracle.rs index db1c8b7b9..8995afb20 100644 --- a/programs/mango-v4/src/state/oracle.rs +++ b/programs/mango-v4/src/state/oracle.rs @@ -3,18 +3,70 @@ use std::mem::size_of; use anchor_lang::prelude::*; use anchor_lang::Discriminator; use fixed::types::I80F48; + use static_assertions::const_assert_eq; +use switchboard_program::FastRoundResultAccountData; +use switchboard_v2::AggregatorAccountData; use crate::accounts_zerocopy::*; use crate::checked_math as cm; use crate::error::MangoError; -pub const QUOTE_DECIMALS: i32 = 6; +pub const QUOTE_DECIMALS: i8 = 6; + +const LOOKUP_START: i8 = -12; +const LOOKUP: [I80F48; 25] = [ + I80F48::from_bits((1 << 48) / 10i128.pow(12u32)), + I80F48::from_bits((1 << 48) / 10i128.pow(11u32) + 1), + I80F48::from_bits((1 << 48) / 10i128.pow(10u32)), + I80F48::from_bits((1 << 48) / 10i128.pow(9u32) + 1), + I80F48::from_bits((1 << 48) / 10i128.pow(8u32) + 1), + I80F48::from_bits((1 << 48) / 10i128.pow(7u32) + 1), + I80F48::from_bits((1 << 48) / 10i128.pow(6u32) + 1), + I80F48::from_bits((1 << 48) / 10i128.pow(5u32)), + I80F48::from_bits((1 << 48) / 10i128.pow(4u32)), + I80F48::from_bits((1 << 48) / 10i128.pow(3u32) + 1), // 0.001 + I80F48::from_bits((1 << 48) / 10i128.pow(2u32) + 1), // 0.01 + I80F48::from_bits((1 << 48) / 10i128.pow(1u32) + 1), // 0.1 + I80F48::from_bits((1 << 48) * 10i128.pow(0u32)), // 1 + I80F48::from_bits((1 << 48) * 10i128.pow(1u32)), // 10 + I80F48::from_bits((1 << 48) * 10i128.pow(2u32)), // 100 + I80F48::from_bits((1 << 48) * 10i128.pow(3u32)), // 1000 + I80F48::from_bits((1 << 48) * 10i128.pow(4u32)), + I80F48::from_bits((1 << 48) * 10i128.pow(5u32)), + I80F48::from_bits((1 << 48) * 10i128.pow(6u32)), + I80F48::from_bits((1 << 48) * 10i128.pow(7u32)), + I80F48::from_bits((1 << 48) * 10i128.pow(8u32)), + I80F48::from_bits((1 << 48) * 10i128.pow(9u32)), + I80F48::from_bits((1 << 48) * 10i128.pow(10u32)), + I80F48::from_bits((1 << 48) * 10i128.pow(11u32)), + I80F48::from_bits((1 << 48) * 10i128.pow(12u32)), +]; +const LOOKUP_FN: fn(i8) -> usize = |decimals: i8| (decimals - LOOKUP_START) as usize; + +pub mod switchboard_v1_devnet_oracle { + use solana_program::declare_id; + declare_id!("7azgmy1pFXHikv36q1zZASvFq5vFa39TT9NweVugKKTU"); +} +pub mod switchboard_v2_mainnet_oracle { + use solana_program::declare_id; + declare_id!("DtmE9D2CSB4L5D6A15mraeEjrGMm6auWVzgaD8hK2tZM"); +} + +#[zero_copy] +#[derive(AnchorDeserialize, AnchorSerialize)] +pub struct OracleConfig { + pub conf_filter: I80F48, +} +const_assert_eq!(size_of::(), 16); +const_assert_eq!(size_of::() % 8, 0); #[derive(PartialEq)] pub enum OracleType { - Stub, Pyth, + Stub, + SwitchboardV1, + SwitchboardV2, } #[account(zero_copy)] @@ -28,36 +80,85 @@ pub struct StubOracle { const_assert_eq!(size_of::(), 32 + 32 + 16 + 8 + 8); const_assert_eq!(size_of::() % 8, 0); -pub fn determine_oracle_type(data: &[u8]) -> Result { +pub fn determine_oracle_type(acc_info: &impl KeyedAccountReader) -> Result { + let data = acc_info.data(); + if u32::from_le_bytes(data[0..4].try_into().unwrap()) == pyth_sdk_solana::state::MAGIC { return Ok(OracleType::Pyth); } else if data[0..8] == StubOracle::discriminator() { return Ok(OracleType::Stub); } + // https://github.com/switchboard-xyz/switchboard-v2/blob/main/libraries/rs/src/aggregator.rs#L114 + // note: disc is not public, hence the copy pasta + else if data[0..8] == [217, 230, 65, 101, 201, 162, 27, 125] { + return Ok(OracleType::SwitchboardV2); + } + // note: this is the only known way of checking this + else if acc_info.owner() == &switchboard_v1_devnet_oracle::ID + || acc_info.owner() == &switchboard_v2_mainnet_oracle::ID + { + return Ok(OracleType::SwitchboardV1); + } Err(MangoError::UnknownOracleType.into()) } -pub fn oracle_price(acc_info: &impl AccountReader, base_token_decimals: u8) -> Result { +pub fn oracle_price( + acc_info: &impl KeyedAccountReader, + oracle_conf_filter: I80F48, + base_token_decimals: u8, +) -> Result { let data = &acc_info.data(); - let oracle_type = determine_oracle_type(data)?; + let oracle_type = determine_oracle_type(acc_info)?; Ok(match oracle_type { OracleType::Stub => acc_info.load::()?.price, OracleType::Pyth => { - let price_struct = pyth_sdk_solana::load_price(data).unwrap(); - let price = I80F48::from_num(price_struct.price); - let decimals = (price_struct.expo as i32) + let price_account = pyth_sdk_solana::load_price(data).unwrap(); + let price = I80F48::from_num(price_account.price); + + // Filter out bad prices + if I80F48::from_num(price_account.conf) > oracle_conf_filter * price { + msg!( + "Pyth conf interval too high; pubkey {} price: {} price_account.conf: {}", + acc_info.key(), + price.to_num::(), + price_account.conf + ); + + // future: in v3, we had pricecache, and in case of luna, when there were no updates, we used last known value from cache + // we'll have to add a CachedOracle that is based on one of the oracle types, needs a separate keeper and supports + // maintaining this "last known good value" + return Err(MangoError::SomeError.into()); + } + + let decimals = (price_account.expo as i8) .checked_add(QUOTE_DECIMALS) .unwrap() - .checked_sub(base_token_decimals as i32) + .checked_sub(base_token_decimals as i8) .unwrap(); - let decimal_adj = I80F48::from_num(10_u32.pow(decimals.abs() as u32)); - if decimals < 0 { - cm!(price / decimal_adj) - } else { - cm!(price * decimal_adj) - } + let decimal_adj = LOOKUP[LOOKUP_FN(decimals)]; + cm!(price * decimal_adj) + } + OracleType::SwitchboardV2 => { + let feed_result = + bytemuck::from_bytes::(&data[8..]).get_result()?; + let decimal: f64 = feed_result.try_into()?; + let price = I80F48::from_num(decimal); + let decimals = QUOTE_DECIMALS + .checked_sub(base_token_decimals as i8) + .unwrap(); + let decimal_adj = LOOKUP[LOOKUP_FN(decimals)]; + cm!(price * decimal_adj) + } + OracleType::SwitchboardV1 => { + let result = FastRoundResultAccountData::deserialize(data).unwrap(); + let price = I80F48::from_num(result.result.result); + let decimals = QUOTE_DECIMALS + .checked_sub(base_token_decimals as i8) + .unwrap(); + let decimal_adj = LOOKUP[LOOKUP_FN(decimals)]; + cm!(price * decimal_adj) } }) } @@ -66,23 +167,67 @@ pub fn oracle_price(acc_info: &impl AccountReader, base_token_decimals: u8) -> R mod tests { use super::*; use solana_program_test::{find_file, read_file}; - use std::path::PathBuf; + use std::{cell::RefCell, path::PathBuf, str::FromStr}; #[test] - pub fn test_determine_oracle_type_from_pyth_price_ai() -> Result<()> { + pub fn test_oracles() -> Result<()> { // add ability to find fixtures let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR")); d.push("resources/test"); - // load fixture - // J83w4HKfqxwcq3BEMMkPFSppX3gqekLyLJBexebFVkix.bin is SOL_PYTH_PRICE - let filename = "resources/test/J83w4HKfqxwcq3BEMMkPFSppX3gqekLyLJBexebFVkix.bin"; - let pyth_price_data = read_file(find_file(filename).unwrap()); + let fixtures = vec![ + ( + "J83w4HKfqxwcq3BEMMkPFSppX3gqekLyLJBexebFVkix", + OracleType::Pyth, + Pubkey::default(), + ), + ( + "8k7F9Xb36oFJsjpCKpsXvg4cgBRoZtwNTc3EzG5Ttd2o", + OracleType::SwitchboardV1, + switchboard_v1_devnet_oracle::ID, + ), + ( + "GvDMxPzN1sCj7L26YDK2HnMRXEQmQ2aemov8YBtPS7vR", + OracleType::SwitchboardV2, + Pubkey::default(), + ), + ]; - assert!(determine_oracle_type(&pyth_price_data).unwrap() == OracleType::Pyth); - let price = pyth_sdk_solana::load_price(pyth_price_data.as_slice()).unwrap(); - assert_eq!(price.price, 32112500000); + for fixture in fixtures { + let filename = format!("resources/test/{}.bin", fixture.0); + let mut pyth_price_data = read_file(find_file(&filename).unwrap()); + let data = RefCell::new(&mut pyth_price_data[..]); + let ai = &AccountInfoRef { + key: &Pubkey::from_str(fixture.0).unwrap(), + owner: &fixture.2, + data: data.borrow(), + }; + assert!(determine_oracle_type(ai).unwrap() == fixture.1); + } Ok(()) } + + #[test] + pub fn lookup_test() { + for idx in -12..0 { + assert_eq!( + LOOKUP[LOOKUP_FN(idx)], + I80F48::from_str(&format!( + "0.{}1", + str::repeat("0", (idx.abs() as usize) - 1) + )) + .unwrap() + ) + } + + assert_eq!(LOOKUP[LOOKUP_FN(0)], I80F48::ONE); + + for idx in 1..=12 { + assert_eq!( + LOOKUP[LOOKUP_FN(idx)], + I80F48::from_str(&format!("1{}", str::repeat("0", idx.abs() as usize))).unwrap() + ) + } + } } diff --git a/programs/mango-v4/src/state/oracle_config.rs b/programs/mango-v4/src/state/oracle_config.rs new file mode 100644 index 000000000..e69de29bb diff --git a/programs/mango-v4/src/state/perp_market.rs b/programs/mango-v4/src/state/perp_market.rs index 5294d7861..e2353e6b6 100644 --- a/programs/mango-v4/src/state/perp_market.rs +++ b/programs/mango-v4/src/state/perp_market.rs @@ -9,7 +9,7 @@ use crate::state::orderbook::order_type::Side; use crate::state::{TokenIndex, DAY}; use crate::util::checked_math as cm; -use super::Book; +use super::{Book, OracleConfig}; pub type PerpMarketIndex = u16; @@ -21,6 +21,8 @@ pub struct PerpMarket { pub oracle: Pubkey, + pub oracle_config: OracleConfig, + pub bids: Pubkey, pub asks: Pubkey, @@ -84,7 +86,7 @@ pub struct PerpMarket { const_assert_eq!( size_of::(), - 16 + 32 * 5 + 8 * 2 + 16 * 11 + 8 * 2 + 8 * 2 + 16 + 8 + 16 + 32 * 2 + 16 + 32 * 3 + 8 * 2 + 16 * 11 + 8 * 2 + 8 * 2 + 16 + 8 ); const_assert_eq!(size_of::() % 8, 0); diff --git a/programs/mango-v4/tests/program_test/mango_client.rs b/programs/mango-v4/tests/program_test/mango_client.rs index 1b024be9a..90385a1ac 100644 --- a/programs/mango-v4/tests/program_test/mango_client.rs +++ b/programs/mango-v4/tests/program_test/mango_client.rs @@ -531,6 +531,9 @@ impl<'keypair> ClientInstruction for TokenRegisterInstruction<'keypair> { let instruction = Self::Instruction { name: "some_ticker".to_string(), token_index: self.token_index, + oracle_config: OracleConfig { + conf_filter: I80F48::from_num::(0.10), + }, interest_rate_params: InterestRateParams { util0: self.util0, rate0: self.rate0, @@ -1665,6 +1668,9 @@ impl<'keypair> ClientInstruction for PerpCreateMarketInstruction<'keypair> { let program_id = mango_v4::id(); let instruction = Self::Instruction { name: "UUU-PERP".to_string(), + oracle_config: OracleConfig { + conf_filter: I80F48::from_num::(0.10), + }, perp_market_index: self.perp_market_index, base_token_index_opt: Option::from(self.base_token_index), quote_token_index: self.quote_token_index, diff --git a/ts/client/src/client.ts b/ts/client/src/client.ts index 2916f61a7..5ebf51ff2 100644 --- a/ts/client/src/client.ts +++ b/ts/client/src/client.ts @@ -130,6 +130,7 @@ export class MangoClient { group: Group, mintPk: PublicKey, oraclePk: PublicKey, + oracleConfFilter: number, tokenIndex: number, name: string, util0: number, @@ -145,10 +146,16 @@ export class MangoClient { initLiabWeight: number, liquidationFee: number, ): Promise { + const bn = I80F48.fromNumber(oracleConfFilter).getData(); return await this.program.methods .tokenRegister( tokenIndex, name, + { + confFilter: { + val: I80F48.fromNumber(oracleConfFilter).getData(), + }, + } as any, // future: nested custom types dont typecheck, fix if possible? { util0, rate0, util1, rate1, maxRate }, loanFeeRate, loanOriginationFeeRate, @@ -850,6 +857,7 @@ export class MangoClient { oraclePk: PublicKey, perpMarketIndex: number, name: string, + oracleConfFilter: number, baseTokenIndex: number, baseTokenDecimals: number, quoteTokenIndex: number, @@ -874,6 +882,11 @@ export class MangoClient { .perpCreateMarket( perpMarketIndex, name, + { + confFilter: { + val: I80F48.fromNumber(oracleConfFilter).getData(), + }, + } as any, // future: nested custom types dont typecheck, fix if possible? baseTokenIndex, baseTokenDecimals, quoteTokenIndex, diff --git a/ts/client/src/mango_v4.ts b/ts/client/src/mango_v4.ts index c369b07a8..ec7660b5f 100644 --- a/ts/client/src/mango_v4.ts +++ b/ts/client/src/mango_v4.ts @@ -1,6263 +1,6377 @@ export type MangoV4 = { - version: '0.1.0'; - name: 'mango_v4'; - instructions: [ + "version": "0.1.0", + "name": "mango_v4", + "instructions": [ { - name: 'createGroup'; - accounts: [ + "name": "createGroup", + "accounts": [ { - name: 'group'; - isMut: true; - isSigner: false; - pda: { - seeds: [ + "name": "group", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'const'; - type: 'string'; - value: 'Group'; + "kind": "const", + "type": "string", + "value": "Group" }, { - kind: 'account'; - type: 'publicKey'; - path: 'admin'; + "kind": "account", + "type": "publicKey", + "path": "admin" }, { - kind: 'arg'; - type: 'u32'; - path: 'group_num'; - }, - ]; - }; + "kind": "arg", + "type": "u32", + "path": "group_num" + } + ] + } }, { - name: 'admin'; - isMut: false; - isSigner: true; + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'payer'; - isMut: true; - isSigner: true; + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: 'systemProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: [ + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ { - name: 'groupNum'; - type: 'u32'; + "name": "groupNum", + "type": "u32" }, { - name: 'testing'; - type: 'u8'; - }, - ]; + "name": "testing", + "type": "u8" + } + ] }, { - name: 'closeGroup'; - accounts: [ + "name": "closeGroup", + "accounts": [ { - name: 'group'; - isMut: true; - isSigner: false; + "name": "group", + "isMut": true, + "isSigner": false }, { - name: 'admin'; - isMut: false; - isSigner: true; + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'solDestination'; - isMut: true; - isSigner: false; + "name": "solDestination", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: []; + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] }, { - name: 'tokenRegister'; - accounts: [ + "name": "tokenRegister", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'admin'; - isMut: false; - isSigner: true; + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'mint'; - isMut: false; - isSigner: false; + "name": "mint", + "isMut": false, + "isSigner": false }, { - name: 'bank'; - isMut: true; - isSigner: false; - pda: { - seeds: [ + "name": "bank", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account'; - type: 'publicKey'; - path: 'group'; + "kind": "account", + "type": "publicKey", + "path": "group" }, { - kind: 'const'; - type: 'string'; - value: 'Bank'; + "kind": "const", + "type": "string", + "value": "Bank" }, { - kind: 'arg'; - type: 'u16'; - path: 'token_index'; - }, - ]; - }; + "kind": "arg", + "type": "u16", + "path": "token_index" + } + ] + } }, { - name: 'vault'; - isMut: true; - isSigner: false; - pda: { - seeds: [ + "name": "vault", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account'; - type: 'publicKey'; - path: 'group'; + "kind": "account", + "type": "publicKey", + "path": "group" }, { - kind: 'const'; - type: 'string'; - value: 'Vault'; + "kind": "const", + "type": "string", + "value": "Vault" }, { - kind: 'arg'; - type: 'u16'; - path: 'token_index'; - }, - ]; - }; + "kind": "arg", + "type": "u16", + "path": "token_index" + } + ] + } }, { - name: 'mintInfo'; - isMut: true; - isSigner: false; - pda: { - seeds: [ + "name": "mintInfo", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account'; - type: 'publicKey'; - path: 'group'; + "kind": "account", + "type": "publicKey", + "path": "group" }, { - kind: 'const'; - type: 'string'; - value: 'MintInfo'; + "kind": "const", + "type": "string", + "value": "MintInfo" }, { - kind: 'account'; - type: 'publicKey'; - account: 'Mint'; - path: 'mint'; - }, - ]; - }; + "kind": "account", + "type": "publicKey", + "account": "Mint", + "path": "mint" + } + ] + } }, { - name: 'oracle'; - isMut: false; - isSigner: false; + "name": "oracle", + "isMut": false, + "isSigner": false }, { - name: 'payer'; - isMut: true; - isSigner: true; + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: 'tokenProgram'; - isMut: false; - isSigner: false; + "name": "tokenProgram", + "isMut": false, + "isSigner": false }, { - name: 'systemProgram'; - isMut: false; - isSigner: false; + "name": "systemProgram", + "isMut": false, + "isSigner": false }, { - name: 'rent'; - isMut: false; - isSigner: false; - }, - ]; - args: [ + "name": "rent", + "isMut": false, + "isSigner": false + } + ], + "args": [ { - name: 'tokenIndex'; - type: 'u16'; + "name": "tokenIndex", + "type": "u16" }, { - name: 'name'; - type: 'string'; + "name": "name", + "type": "string" }, { - name: 'interestRateParams'; - type: { - defined: 'InterestRateParams'; - }; + "name": "interestRateParams", + "type": { + "defined": "InterestRateParams" + } }, { - name: 'loanFeeRate'; - type: 'f32'; + "name": "loanFeeRate", + "type": "f32" }, { - name: 'loanOriginationFeeRate'; - type: 'f32'; + "name": "loanOriginationFeeRate", + "type": "f32" }, { - name: 'maintAssetWeight'; - type: 'f32'; + "name": "maintAssetWeight", + "type": "f32" }, { - name: 'initAssetWeight'; - type: 'f32'; + "name": "initAssetWeight", + "type": "f32" }, { - name: 'maintLiabWeight'; - type: 'f32'; + "name": "maintLiabWeight", + "type": "f32" }, { - name: 'initLiabWeight'; - type: 'f32'; + "name": "initLiabWeight", + "type": "f32" }, { - name: 'liquidationFee'; - type: 'f32'; - }, - ]; + "name": "liquidationFee", + "type": "f32" + } + ] }, { - name: 'tokenDeregister'; - accounts: [ + "name": "tokenDeregister", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'admin'; - isMut: false; - isSigner: true; + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'bank'; - isMut: true; - isSigner: false; + "name": "bank", + "isMut": true, + "isSigner": false }, { - name: 'vault'; - isMut: true; - isSigner: false; + "name": "vault", + "isMut": true, + "isSigner": false }, { - name: 'mintInfo'; - isMut: true; - isSigner: false; + "name": "mintInfo", + "isMut": true, + "isSigner": false }, { - name: 'solDestination'; - isMut: true; - isSigner: false; + "name": "solDestination", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: []; + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] }, { - name: 'updateIndex'; - accounts: [ + "name": "updateIndex", + "accounts": [ { - name: 'bank'; - isMut: true; - isSigner: false; - }, - ]; - args: []; + "name": "bank", + "isMut": true, + "isSigner": false + } + ], + "args": [] }, { - name: 'createAccount'; - accounts: [ + "name": "createAccount", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; - pda: { - seeds: [ + "name": "account", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account'; - type: 'publicKey'; - path: 'group'; + "kind": "account", + "type": "publicKey", + "path": "group" }, { - kind: 'const'; - type: 'string'; - value: 'MangoAccount'; + "kind": "const", + "type": "string", + "value": "MangoAccount" }, { - kind: 'account'; - type: 'publicKey'; - path: 'owner'; + "kind": "account", + "type": "publicKey", + "path": "owner" }, { - kind: 'arg'; - type: 'u8'; - path: 'account_num'; - }, - ]; - }; + "kind": "arg", + "type": "u8", + "path": "account_num" + } + ] + } }, { - name: 'owner'; - isMut: false; - isSigner: true; + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'payer'; - isMut: true; - isSigner: true; + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: 'systemProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: [ + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ { - name: 'accountNum'; - type: 'u8'; + "name": "accountNum", + "type": "u8" }, { - name: 'name'; - type: 'string'; - }, - ]; + "name": "name", + "type": "string" + } + ] }, { - name: 'closeAccount'; - accounts: [ + "name": "closeAccount", + "accounts": [ { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner'; - isMut: false; - isSigner: true; + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'solDestination'; - isMut: true; - isSigner: false; + "name": "solDestination", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: []; + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] }, { - name: 'createStubOracle'; - accounts: [ + "name": "createStubOracle", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'oracle'; - isMut: true; - isSigner: false; - pda: { - seeds: [ + "name": "oracle", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account'; - type: 'publicKey'; - path: 'group'; + "kind": "account", + "type": "publicKey", + "path": "group" }, { - kind: 'const'; - type: 'string'; - value: 'StubOracle'; + "kind": "const", + "type": "string", + "value": "StubOracle" }, { - kind: 'account'; - type: 'publicKey'; - account: 'Mint'; - path: 'token_mint'; - }, - ]; - }; + "kind": "account", + "type": "publicKey", + "account": "Mint", + "path": "token_mint" + } + ] + } }, { - name: 'admin'; - isMut: false; - isSigner: true; + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'tokenMint'; - isMut: false; - isSigner: false; + "name": "tokenMint", + "isMut": false, + "isSigner": false }, { - name: 'payer'; - isMut: true; - isSigner: true; + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: 'systemProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: [ + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ { - name: 'price'; - type: { - defined: 'I80F48'; - }; - }, - ]; + "name": "price", + "type": { + "defined": "I80F48" + } + } + ] }, { - name: 'closeStubOracle'; - accounts: [ + "name": "closeStubOracle", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'admin'; - isMut: false; - isSigner: true; + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'oracle'; - isMut: true; - isSigner: false; + "name": "oracle", + "isMut": true, + "isSigner": false }, { - name: 'solDestination'; - isMut: true; - isSigner: false; + "name": "solDestination", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: []; + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] }, { - name: 'setStubOracle'; - accounts: [ + "name": "setStubOracle", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'admin'; - isMut: false; - isSigner: true; + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'oracle'; - isMut: true; - isSigner: false; + "name": "oracle", + "isMut": true, + "isSigner": false }, { - name: 'payer'; - isMut: true; - isSigner: true; - }, - ]; - args: [ + "name": "payer", + "isMut": true, + "isSigner": true + } + ], + "args": [ { - name: 'price'; - type: { - defined: 'I80F48'; - }; - }, - ]; + "name": "price", + "type": { + "defined": "I80F48" + } + } + ] }, { - name: 'tokenDeposit'; - accounts: [ + "name": "tokenDeposit", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'bank'; - isMut: true; - isSigner: false; + "name": "bank", + "isMut": true, + "isSigner": false }, { - name: 'vault'; - isMut: true; - isSigner: false; + "name": "vault", + "isMut": true, + "isSigner": false }, { - name: 'tokenAccount'; - isMut: true; - isSigner: false; + "name": "tokenAccount", + "isMut": true, + "isSigner": false }, { - name: 'tokenAuthority'; - isMut: false; - isSigner: true; + "name": "tokenAuthority", + "isMut": false, + "isSigner": true }, { - name: 'tokenProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: [ + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ { - name: 'amount'; - type: 'u64'; - }, - ]; + "name": "amount", + "type": "u64" + } + ] }, { - name: 'tokenWithdraw'; - accounts: [ + "name": "tokenWithdraw", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner'; - isMut: false; - isSigner: true; + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'bank'; - isMut: true; - isSigner: false; + "name": "bank", + "isMut": true, + "isSigner": false }, { - name: 'vault'; - isMut: true; - isSigner: false; + "name": "vault", + "isMut": true, + "isSigner": false }, { - name: 'tokenAccount'; - isMut: true; - isSigner: false; + "name": "tokenAccount", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: [ + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ { - name: 'amount'; - type: 'u64'; + "name": "amount", + "type": "u64" }, { - name: 'allowBorrow'; - type: 'bool'; - }, - ]; + "name": "allowBorrow", + "type": "bool" + } + ] }, { - name: 'marginTrade'; - accounts: [ + "name": "marginTrade", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner'; - isMut: false; - isSigner: true; + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'tokenProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: [ + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ { - name: 'numHealthAccounts'; - type: 'u64'; + "name": "withdraws", + "type": { + "vec": { + "defined": "MarginTradeWithdraw" + } + } }, { - name: 'withdraws'; - type: { - vec: { - defined: 'MarginTradeWithdraw'; - }; - }; - }, - { - name: 'cpiData'; - type: 'bytes'; - }, - ]; + "name": "cpiDatas", + "type": { + "vec": { + "defined": "(u8,Vec)" + } + } + } + ] }, { - name: 'serum3RegisterMarket'; - accounts: [ + "name": "serum3RegisterMarket", + "accounts": [ { - name: 'group'; - isMut: true; - isSigner: false; + "name": "group", + "isMut": true, + "isSigner": false }, { - name: 'admin'; - isMut: false; - isSigner: true; + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'serumProgram'; - isMut: false; - isSigner: false; + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal'; - isMut: false; - isSigner: false; + "name": "serumMarketExternal", + "isMut": false, + "isSigner": false }, { - name: 'serumMarket'; - isMut: true; - isSigner: false; - pda: { - seeds: [ + "name": "serumMarket", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account'; - type: 'publicKey'; - path: 'group'; + "kind": "account", + "type": "publicKey", + "path": "group" }, { - kind: 'const'; - type: 'string'; - value: 'Serum3Market'; + "kind": "const", + "type": "string", + "value": "Serum3Market" }, { - kind: 'account'; - type: 'publicKey'; - path: 'serum_market_external'; - }, - ]; - }; + "kind": "account", + "type": "publicKey", + "path": "serum_market_external" + } + ] + } }, { - name: 'quoteBank'; - isMut: false; - isSigner: false; + "name": "quoteBank", + "isMut": false, + "isSigner": false }, { - name: 'baseBank'; - isMut: false; - isSigner: false; + "name": "baseBank", + "isMut": false, + "isSigner": false }, { - name: 'payer'; - isMut: true; - isSigner: true; + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: 'systemProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: [ + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ { - name: 'marketIndex'; - type: 'u16'; + "name": "marketIndex", + "type": "u16" }, { - name: 'name'; - type: 'string'; - }, - ]; + "name": "name", + "type": "string" + } + ] }, { - name: 'serum3DeregisterMarket'; - accounts: [ + "name": "serum3DeregisterMarket", + "accounts": [ { - name: 'group'; - isMut: true; - isSigner: false; + "name": "group", + "isMut": true, + "isSigner": false }, { - name: 'admin'; - isMut: false; - isSigner: true; + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'serumMarket'; - isMut: true; - isSigner: false; + "name": "serumMarket", + "isMut": true, + "isSigner": false }, { - name: 'solDestination'; - isMut: true; - isSigner: false; + "name": "solDestination", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: []; + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] }, { - name: 'serum3CreateOpenOrders'; - accounts: [ + "name": "serum3CreateOpenOrders", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'serumMarket'; - isMut: false; - isSigner: false; + "name": "serumMarket", + "isMut": false, + "isSigner": false }, { - name: 'serumProgram'; - isMut: false; - isSigner: false; + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal'; - isMut: false; - isSigner: false; + "name": "serumMarketExternal", + "isMut": false, + "isSigner": false }, { - name: 'openOrders'; - isMut: true; - isSigner: false; - pda: { - seeds: [ + "name": "openOrders", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account'; - type: 'publicKey'; - path: 'account'; + "kind": "account", + "type": "publicKey", + "path": "account" }, { - kind: 'const'; - type: 'string'; - value: 'Serum3OO'; + "kind": "const", + "type": "string", + "value": "Serum3OO" }, { - kind: 'account'; - type: 'publicKey'; - path: 'serum_market'; - }, - ]; - }; + "kind": "account", + "type": "publicKey", + "path": "serum_market" + } + ] + } }, { - name: 'owner'; - isMut: false; - isSigner: true; + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'payer'; - isMut: true; - isSigner: true; + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: 'systemProgram'; - isMut: false; - isSigner: false; + "name": "systemProgram", + "isMut": false, + "isSigner": false }, { - name: 'rent'; - isMut: false; - isSigner: false; - }, - ]; - args: []; + "name": "rent", + "isMut": false, + "isSigner": false + } + ], + "args": [] }, { - name: 'serum3CloseOpenOrders'; - accounts: [ + "name": "serum3CloseOpenOrders", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner'; - isMut: false; - isSigner: true; + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'serumMarket'; - isMut: false; - isSigner: false; + "name": "serumMarket", + "isMut": false, + "isSigner": false }, { - name: 'serumProgram'; - isMut: false; - isSigner: false; + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal'; - isMut: false; - isSigner: false; + "name": "serumMarketExternal", + "isMut": false, + "isSigner": false }, { - name: 'openOrders'; - isMut: true; - isSigner: false; + "name": "openOrders", + "isMut": true, + "isSigner": false }, { - name: 'solDestination'; - isMut: true; - isSigner: false; - }, - ]; - args: []; + "name": "solDestination", + "isMut": true, + "isSigner": false + } + ], + "args": [] }, { - name: 'serum3PlaceOrder'; - accounts: [ + "name": "serum3PlaceOrder", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner'; - isMut: false; - isSigner: true; + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'openOrders'; - isMut: true; - isSigner: false; + "name": "openOrders", + "isMut": true, + "isSigner": false }, { - name: 'serumMarket'; - isMut: false; - isSigner: false; + "name": "serumMarket", + "isMut": false, + "isSigner": false }, { - name: 'serumProgram'; - isMut: false; - isSigner: false; + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal'; - isMut: true; - isSigner: false; + "name": "serumMarketExternal", + "isMut": true, + "isSigner": false }, { - name: 'marketBids'; - isMut: true; - isSigner: false; + "name": "marketBids", + "isMut": true, + "isSigner": false }, { - name: 'marketAsks'; - isMut: true; - isSigner: false; + "name": "marketAsks", + "isMut": true, + "isSigner": false }, { - name: 'marketEventQueue'; - isMut: true; - isSigner: false; + "name": "marketEventQueue", + "isMut": true, + "isSigner": false }, { - name: 'marketRequestQueue'; - isMut: true; - isSigner: false; + "name": "marketRequestQueue", + "isMut": true, + "isSigner": false }, { - name: 'marketBaseVault'; - isMut: true; - isSigner: false; + "name": "marketBaseVault", + "isMut": true, + "isSigner": false }, { - name: 'marketQuoteVault'; - isMut: true; - isSigner: false; + "name": "marketQuoteVault", + "isMut": true, + "isSigner": false }, { - name: 'marketVaultSigner'; - isMut: false; - isSigner: false; + "name": "marketVaultSigner", + "isMut": false, + "isSigner": false }, { - name: 'quoteBank'; - isMut: true; - isSigner: false; + "name": "quoteBank", + "isMut": true, + "isSigner": false }, { - name: 'quoteVault'; - isMut: true; - isSigner: false; + "name": "quoteVault", + "isMut": true, + "isSigner": false }, { - name: 'baseBank'; - isMut: true; - isSigner: false; + "name": "baseBank", + "isMut": true, + "isSigner": false }, { - name: 'baseVault'; - isMut: true; - isSigner: false; + "name": "baseVault", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: [ + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ { - name: 'side'; - type: { - defined: 'Serum3Side'; - }; + "name": "side", + "type": { + "defined": "Serum3Side" + } }, { - name: 'limitPrice'; - type: 'u64'; + "name": "limitPrice", + "type": "u64" }, { - name: 'maxBaseQty'; - type: 'u64'; + "name": "maxBaseQty", + "type": "u64" }, { - name: 'maxNativeQuoteQtyIncludingFees'; - type: 'u64'; + "name": "maxNativeQuoteQtyIncludingFees", + "type": "u64" }, { - name: 'selfTradeBehavior'; - type: { - defined: 'Serum3SelfTradeBehavior'; - }; + "name": "selfTradeBehavior", + "type": { + "defined": "Serum3SelfTradeBehavior" + } }, { - name: 'orderType'; - type: { - defined: 'Serum3OrderType'; - }; + "name": "orderType", + "type": { + "defined": "Serum3OrderType" + } }, { - name: 'clientOrderId'; - type: 'u64'; + "name": "clientOrderId", + "type": "u64" }, { - name: 'limit'; - type: 'u16'; - }, - ]; + "name": "limit", + "type": "u16" + } + ] }, { - name: 'serum3CancelOrder'; - accounts: [ + "name": "serum3CancelOrder", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner'; - isMut: false; - isSigner: true; + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'openOrders'; - isMut: true; - isSigner: false; + "name": "openOrders", + "isMut": true, + "isSigner": false }, { - name: 'serumMarket'; - isMut: false; - isSigner: false; + "name": "serumMarket", + "isMut": false, + "isSigner": false }, { - name: 'serumProgram'; - isMut: false; - isSigner: false; + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal'; - isMut: true; - isSigner: false; + "name": "serumMarketExternal", + "isMut": true, + "isSigner": false }, { - name: 'marketBids'; - isMut: true; - isSigner: false; + "name": "marketBids", + "isMut": true, + "isSigner": false }, { - name: 'marketAsks'; - isMut: true; - isSigner: false; + "name": "marketAsks", + "isMut": true, + "isSigner": false }, { - name: 'marketEventQueue'; - isMut: true; - isSigner: false; - }, - ]; - args: [ + "name": "marketEventQueue", + "isMut": true, + "isSigner": false + } + ], + "args": [ { - name: 'side'; - type: { - defined: 'Serum3Side'; - }; + "name": "side", + "type": { + "defined": "Serum3Side" + } }, { - name: 'orderId'; - type: 'u128'; - }, - ]; + "name": "orderId", + "type": "u128" + } + ] }, { - name: 'serum3CancelAllOrders'; - accounts: [ + "name": "serum3CancelAllOrders", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner'; - isMut: false; - isSigner: true; + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'openOrders'; - isMut: true; - isSigner: false; + "name": "openOrders", + "isMut": true, + "isSigner": false }, { - name: 'serumMarket'; - isMut: false; - isSigner: false; + "name": "serumMarket", + "isMut": false, + "isSigner": false }, { - name: 'serumProgram'; - isMut: false; - isSigner: false; + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal'; - isMut: true; - isSigner: false; + "name": "serumMarketExternal", + "isMut": true, + "isSigner": false }, { - name: 'marketBids'; - isMut: true; - isSigner: false; + "name": "marketBids", + "isMut": true, + "isSigner": false }, { - name: 'marketAsks'; - isMut: true; - isSigner: false; + "name": "marketAsks", + "isMut": true, + "isSigner": false }, { - name: 'marketEventQueue'; - isMut: true; - isSigner: false; - }, - ]; - args: [ + "name": "marketEventQueue", + "isMut": true, + "isSigner": false + } + ], + "args": [ { - name: 'limit'; - type: 'u8'; - }, - ]; + "name": "limit", + "type": "u8" + } + ] }, { - name: 'serum3SettleFunds'; - accounts: [ + "name": "serum3SettleFunds", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner'; - isMut: false; - isSigner: true; + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'openOrders'; - isMut: true; - isSigner: false; + "name": "openOrders", + "isMut": true, + "isSigner": false }, { - name: 'serumMarket'; - isMut: false; - isSigner: false; + "name": "serumMarket", + "isMut": false, + "isSigner": false }, { - name: 'serumProgram'; - isMut: false; - isSigner: false; + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal'; - isMut: true; - isSigner: false; + "name": "serumMarketExternal", + "isMut": true, + "isSigner": false }, { - name: 'marketBaseVault'; - isMut: true; - isSigner: false; + "name": "marketBaseVault", + "isMut": true, + "isSigner": false }, { - name: 'marketQuoteVault'; - isMut: true; - isSigner: false; + "name": "marketQuoteVault", + "isMut": true, + "isSigner": false }, { - name: 'marketVaultSigner'; - isMut: false; - isSigner: false; + "name": "marketVaultSigner", + "isMut": false, + "isSigner": false }, { - name: 'quoteBank'; - isMut: true; - isSigner: false; + "name": "quoteBank", + "isMut": true, + "isSigner": false }, { - name: 'quoteVault'; - isMut: true; - isSigner: false; + "name": "quoteVault", + "isMut": true, + "isSigner": false }, { - name: 'baseBank'; - isMut: true; - isSigner: false; + "name": "baseBank", + "isMut": true, + "isSigner": false }, { - name: 'baseVault'; - isMut: true; - isSigner: false; + "name": "baseVault", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: []; + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] }, { - name: 'serum3LiqForceCancelOrders'; - accounts: [ + "name": "serum3LiqForceCancelOrders", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'openOrders'; - isMut: true; - isSigner: false; + "name": "openOrders", + "isMut": true, + "isSigner": false }, { - name: 'serumMarket'; - isMut: false; - isSigner: false; + "name": "serumMarket", + "isMut": false, + "isSigner": false }, { - name: 'serumProgram'; - isMut: false; - isSigner: false; + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal'; - isMut: true; - isSigner: false; + "name": "serumMarketExternal", + "isMut": true, + "isSigner": false }, { - name: 'marketBids'; - isMut: true; - isSigner: false; + "name": "marketBids", + "isMut": true, + "isSigner": false }, { - name: 'marketAsks'; - isMut: true; - isSigner: false; + "name": "marketAsks", + "isMut": true, + "isSigner": false }, { - name: 'marketEventQueue'; - isMut: true; - isSigner: false; + "name": "marketEventQueue", + "isMut": true, + "isSigner": false }, { - name: 'marketBaseVault'; - isMut: true; - isSigner: false; + "name": "marketBaseVault", + "isMut": true, + "isSigner": false }, { - name: 'marketQuoteVault'; - isMut: true; - isSigner: false; + "name": "marketQuoteVault", + "isMut": true, + "isSigner": false }, { - name: 'marketVaultSigner'; - isMut: false; - isSigner: false; + "name": "marketVaultSigner", + "isMut": false, + "isSigner": false }, { - name: 'quoteBank'; - isMut: true; - isSigner: false; + "name": "quoteBank", + "isMut": true, + "isSigner": false }, { - name: 'quoteVault'; - isMut: true; - isSigner: false; + "name": "quoteVault", + "isMut": true, + "isSigner": false }, { - name: 'baseBank'; - isMut: true; - isSigner: false; + "name": "baseBank", + "isMut": true, + "isSigner": false }, { - name: 'baseVault'; - isMut: true; - isSigner: false; + "name": "baseVault", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: [ + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ { - name: 'limit'; - type: 'u8'; - }, - ]; + "name": "limit", + "type": "u8" + } + ] }, { - name: 'liqTokenWithToken'; - accounts: [ + "name": "liqTokenWithToken", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'liqor'; - isMut: true; - isSigner: false; + "name": "liqor", + "isMut": true, + "isSigner": false }, { - name: 'liqorOwner'; - isMut: false; - isSigner: true; + "name": "liqorOwner", + "isMut": false, + "isSigner": true }, { - name: 'liqee'; - isMut: true; - isSigner: false; - }, - ]; - args: [ + "name": "liqee", + "isMut": true, + "isSigner": false + } + ], + "args": [ { - name: 'assetTokenIndex'; - type: 'u16'; + "name": "assetTokenIndex", + "type": "u16" }, { - name: 'liabTokenIndex'; - type: 'u16'; + "name": "liabTokenIndex", + "type": "u16" }, { - name: 'maxLiabTransfer'; - type: { - defined: 'I80F48'; - }; - }, - ]; + "name": "maxLiabTransfer", + "type": { + "defined": "I80F48" + } + } + ] }, { - name: 'perpCreateMarket'; - accounts: [ + "name": "perpCreateMarket", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'admin'; - isMut: false; - isSigner: true; + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'oracle'; - isMut: false; - isSigner: false; + "name": "oracle", + "isMut": false, + "isSigner": false }, { - name: 'perpMarket'; - isMut: true; - isSigner: false; - pda: { - seeds: [ + "name": "perpMarket", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account'; - type: 'publicKey'; - path: 'group'; + "kind": "account", + "type": "publicKey", + "path": "group" }, { - kind: 'const'; - type: 'string'; - value: 'PerpMarket'; + "kind": "const", + "type": "string", + "value": "PerpMarket" }, { - kind: 'arg'; - type: 'u16'; - path: 'perp_market_index'; - }, - ]; - }; + "kind": "arg", + "type": "u16", + "path": "perp_market_index" + } + ] + } }, { - name: 'bids'; - isMut: true; - isSigner: false; + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'asks'; - isMut: true; - isSigner: false; + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'eventQueue'; - isMut: true; - isSigner: false; + "name": "eventQueue", + "isMut": true, + "isSigner": false }, { - name: 'payer'; - isMut: true; - isSigner: true; + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: 'systemProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: [ + "name": "systemProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [ { - name: 'perpMarketIndex'; - type: 'u16'; + "name": "perpMarketIndex", + "type": "u16" }, { - name: 'name'; - type: 'string'; + "name": "name", + "type": "string" }, { - name: 'baseTokenIndexOpt'; - type: { - option: 'u16'; - }; + "name": "baseTokenIndexOpt", + "type": { + "option": "u16" + } }, { - name: 'baseTokenDecimals'; - type: 'u8'; + "name": "baseTokenDecimals", + "type": "u8" }, { - name: 'quoteTokenIndex'; - type: 'u16'; + "name": "quoteTokenIndex", + "type": "u16" }, { - name: 'quoteLotSize'; - type: 'i64'; + "name": "quoteLotSize", + "type": "i64" }, { - name: 'baseLotSize'; - type: 'i64'; + "name": "baseLotSize", + "type": "i64" }, { - name: 'maintAssetWeight'; - type: 'f32'; + "name": "maintAssetWeight", + "type": "f32" }, { - name: 'initAssetWeight'; - type: 'f32'; + "name": "initAssetWeight", + "type": "f32" }, { - name: 'maintLiabWeight'; - type: 'f32'; + "name": "maintLiabWeight", + "type": "f32" }, { - name: 'initLiabWeight'; - type: 'f32'; + "name": "initLiabWeight", + "type": "f32" }, { - name: 'liquidationFee'; - type: 'f32'; + "name": "liquidationFee", + "type": "f32" }, { - name: 'makerFee'; - type: 'f32'; + "name": "makerFee", + "type": "f32" }, { - name: 'takerFee'; - type: 'f32'; + "name": "takerFee", + "type": "f32" }, { - name: 'minFunding'; - type: 'f32'; + "name": "minFunding", + "type": "f32" }, { - name: 'maxFunding'; - type: 'f32'; + "name": "maxFunding", + "type": "f32" }, { - name: 'impactQuantity'; - type: 'i64'; - }, - ]; + "name": "impactQuantity", + "type": "i64" + } + ] }, { - name: 'perpCloseMarket'; - accounts: [ + "name": "perpCloseMarket", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'admin'; - isMut: false; - isSigner: true; + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'perpMarket'; - isMut: true; - isSigner: false; + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'bids'; - isMut: true; - isSigner: false; + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'asks'; - isMut: true; - isSigner: false; + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'eventQueue'; - isMut: true; - isSigner: false; + "name": "eventQueue", + "isMut": true, + "isSigner": false }, { - name: 'solDestination'; - isMut: true; - isSigner: false; + "name": "solDestination", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram'; - isMut: false; - isSigner: false; - }, - ]; - args: []; + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } + ], + "args": [] }, { - name: 'perpPlaceOrder'; - accounts: [ + "name": "perpPlaceOrder", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'perpMarket'; - isMut: true; - isSigner: false; + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'asks'; - isMut: true; - isSigner: false; + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'bids'; - isMut: true; - isSigner: false; + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'eventQueue'; - isMut: true; - isSigner: false; + "name": "eventQueue", + "isMut": true, + "isSigner": false }, { - name: 'oracle'; - isMut: false; - isSigner: false; + "name": "oracle", + "isMut": false, + "isSigner": false }, { - name: 'owner'; - isMut: false; - isSigner: true; - }, - ]; - args: [ + "name": "owner", + "isMut": false, + "isSigner": true + } + ], + "args": [ { - name: 'side'; - type: { - defined: 'Side'; - }; + "name": "side", + "type": { + "defined": "Side" + } }, { - name: 'priceLots'; - type: 'i64'; + "name": "priceLots", + "type": "i64" }, { - name: 'maxBaseLots'; - type: 'i64'; + "name": "maxBaseLots", + "type": "i64" }, { - name: 'maxQuoteLots'; - type: 'i64'; + "name": "maxQuoteLots", + "type": "i64" }, { - name: 'clientOrderId'; - type: 'u64'; + "name": "clientOrderId", + "type": "u64" }, { - name: 'orderType'; - type: { - defined: 'OrderType'; - }; + "name": "orderType", + "type": { + "defined": "OrderType" + } }, { - name: 'expiryTimestamp'; - type: 'u64'; + "name": "expiryTimestamp", + "type": "u64" }, { - name: 'limit'; - type: 'u8'; - }, - ]; + "name": "limit", + "type": "u8" + } + ] }, { - name: 'perpCancelOrder'; - accounts: [ + "name": "perpCancelOrder", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'perpMarket'; - isMut: true; - isSigner: false; + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'asks'; - isMut: true; - isSigner: false; + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'bids'; - isMut: true; - isSigner: false; + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'owner'; - isMut: false; - isSigner: true; - }, - ]; - args: [ + "name": "owner", + "isMut": false, + "isSigner": true + } + ], + "args": [ { - name: 'orderId'; - type: 'i128'; - }, - ]; + "name": "orderId", + "type": "i128" + } + ] }, { - name: 'perpCancelOrderByClientOrderId'; - accounts: [ + "name": "perpCancelOrderByClientOrderId", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'perpMarket'; - isMut: true; - isSigner: false; + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'asks'; - isMut: true; - isSigner: false; + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'bids'; - isMut: true; - isSigner: false; + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'owner'; - isMut: false; - isSigner: true; - }, - ]; - args: [ + "name": "owner", + "isMut": false, + "isSigner": true + } + ], + "args": [ { - name: 'clientOrderId'; - type: 'u64'; - }, - ]; + "name": "clientOrderId", + "type": "u64" + } + ] }, { - name: 'perpCancelAllOrders'; - accounts: [ + "name": "perpCancelAllOrders", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'perpMarket'; - isMut: true; - isSigner: false; + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'asks'; - isMut: true; - isSigner: false; + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'bids'; - isMut: true; - isSigner: false; + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'owner'; - isMut: false; - isSigner: true; - }, - ]; - args: [ + "name": "owner", + "isMut": false, + "isSigner": true + } + ], + "args": [ { - name: 'limit'; - type: 'u8'; - }, - ]; + "name": "limit", + "type": "u8" + } + ] }, { - name: 'perpCancelAllOrdersBySide'; - accounts: [ + "name": "perpCancelAllOrdersBySide", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account'; - isMut: true; - isSigner: false; + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'perpMarket'; - isMut: true; - isSigner: false; + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'asks'; - isMut: true; - isSigner: false; + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'bids'; - isMut: true; - isSigner: false; + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'owner'; - isMut: false; - isSigner: true; - }, - ]; - args: [ + "name": "owner", + "isMut": false, + "isSigner": true + } + ], + "args": [ { - name: 'sideOption'; - type: { - option: { - defined: 'Side'; - }; - }; + "name": "sideOption", + "type": { + "option": { + "defined": "Side" + } + } }, { - name: 'limit'; - type: 'u8'; - }, - ]; + "name": "limit", + "type": "u8" + } + ] }, { - name: 'perpConsumeEvents'; - accounts: [ + "name": "perpConsumeEvents", + "accounts": [ { - name: 'group'; - isMut: false; - isSigner: false; + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'perpMarket'; - isMut: true; - isSigner: false; + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'eventQueue'; - isMut: true; - isSigner: false; - }, - ]; - args: [ + "name": "eventQueue", + "isMut": true, + "isSigner": false + } + ], + "args": [ { - name: 'limit'; - type: 'u64'; - }, - ]; + "name": "limit", + "type": "u64" + } + ] }, { - name: 'perpUpdateFunding'; - accounts: [ + "name": "perpUpdateFunding", + "accounts": [ { - name: 'perpMarket'; - isMut: true; - isSigner: false; + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'asks'; - isMut: true; - isSigner: false; + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'bids'; - isMut: true; - isSigner: false; + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'oracle'; - isMut: false; - isSigner: false; - }, - ]; - args: []; + "name": "oracle", + "isMut": false, + "isSigner": false + } + ], + "args": [] }, { - name: 'benchmark'; - accounts: []; - args: []; - }, - ]; - accounts: [ + "name": "benchmark", + "accounts": [], + "args": [] + } + ], + "accounts": [ { - name: 'bank'; - type: { - kind: 'struct'; - fields: [ + "name": "bank", + "type": { + "kind": "struct", + "fields": [ { - name: 'name'; - type: { - array: ['u8', 16]; - }; + "name": "name", + "type": { + "array": [ + "u8", + 16 + ] + } }, { - name: 'group'; - type: 'publicKey'; + "name": "group", + "type": "publicKey" }, { - name: 'mint'; - type: 'publicKey'; + "name": "mint", + "type": "publicKey" }, { - name: 'vault'; - type: 'publicKey'; + "name": "vault", + "type": "publicKey" }, { - name: 'oracle'; - type: 'publicKey'; + "name": "oracle", + "type": "publicKey" }, { - name: 'depositIndex'; - type: { - defined: 'I80F48'; - }; + "name": "depositIndex", + "type": { + "defined": "I80F48" + } }, { - name: 'borrowIndex'; - type: { - defined: 'I80F48'; - }; + "name": "borrowIndex", + "type": { + "defined": "I80F48" + } }, { - name: 'indexedTotalDeposits'; - type: { - defined: 'I80F48'; - }; + "name": "indexedTotalDeposits", + "type": { + "defined": "I80F48" + } }, { - name: 'indexedTotalBorrows'; - type: { - defined: 'I80F48'; - }; + "name": "indexedTotalBorrows", + "type": { + "defined": "I80F48" + } }, { - name: 'lastUpdated'; - type: 'i64'; + "name": "lastUpdated", + "type": "i64" }, { - name: 'util0'; - type: { - defined: 'I80F48'; - }; + "name": "util0", + "type": { + "defined": "I80F48" + } }, { - name: 'rate0'; - type: { - defined: 'I80F48'; - }; + "name": "rate0", + "type": { + "defined": "I80F48" + } }, { - name: 'util1'; - type: { - defined: 'I80F48'; - }; + "name": "util1", + "type": { + "defined": "I80F48" + } }, { - name: 'rate1'; - type: { - defined: 'I80F48'; - }; + "name": "rate1", + "type": { + "defined": "I80F48" + } }, { - name: 'maxRate'; - type: { - defined: 'I80F48'; - }; + "name": "maxRate", + "type": { + "defined": "I80F48" + } }, { - name: 'collectedFeesNative'; - type: { - defined: 'I80F48'; - }; + "name": "collectedFeesNative", + "type": { + "defined": "I80F48" + } }, { - name: 'loanOriginationFeeRate'; - type: { - defined: 'I80F48'; - }; + "name": "loanOriginationFeeRate", + "type": { + "defined": "I80F48" + } }, { - name: 'loanFeeRate'; - type: { - defined: 'I80F48'; - }; + "name": "loanFeeRate", + "type": { + "defined": "I80F48" + } }, { - name: 'maintAssetWeight'; - type: { - defined: 'I80F48'; - }; + "name": "maintAssetWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'initAssetWeight'; - type: { - defined: 'I80F48'; - }; + "name": "initAssetWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'maintLiabWeight'; - type: { - defined: 'I80F48'; - }; + "name": "maintLiabWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'initLiabWeight'; - type: { - defined: 'I80F48'; - }; + "name": "initLiabWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'liquidationFee'; - type: { - defined: 'I80F48'; - }; + "name": "liquidationFee", + "type": { + "defined": "I80F48" + } }, { - name: 'dust'; - type: { - defined: 'I80F48'; - }; + "name": "dust", + "type": { + "defined": "I80F48" + } }, { - name: 'tokenIndex'; - type: 'u16'; + "name": "tokenIndex", + "type": "u16" }, { - name: 'bump'; - type: 'u8'; + "name": "bump", + "type": "u8" }, { - name: 'mintDecimals'; - type: 'u8'; + "name": "mintDecimals", + "type": "u8" }, { - name: 'reserved'; - type: { - array: ['u8', 4]; - }; - }, - ]; - }; + "name": "reserved", + "type": { + "array": [ + "u8", + 4 + ] + } + } + ] + } }, { - name: 'group'; - type: { - kind: 'struct'; - fields: [ + "name": "group", + "type": { + "kind": "struct", + "fields": [ { - name: 'admin'; - type: 'publicKey'; + "name": "admin", + "type": "publicKey" }, { - name: 'bump'; - type: 'u8'; + "name": "bump", + "type": "u8" }, { - name: 'testing'; - type: 'u8'; + "name": "testing", + "type": "u8" }, { - name: 'padding'; - type: { - array: ['u8', 2]; - }; + "name": "padding", + "type": { + "array": [ + "u8", + 2 + ] + } }, { - name: 'groupNum'; - type: 'u32'; + "name": "groupNum", + "type": "u32" }, { - name: 'reserved'; - type: { - array: ['u8', 8]; - }; - }, - ]; - }; + "name": "reserved", + "type": { + "array": [ + "u8", + 8 + ] + } + } + ] + } }, { - name: 'mangoAccount'; - type: { - kind: 'struct'; - fields: [ + "name": "mangoAccount", + "type": { + "kind": "struct", + "fields": [ { - name: 'name'; - type: { - array: ['u8', 32]; - }; + "name": "name", + "type": { + "array": [ + "u8", + 32 + ] + } }, { - name: 'group'; - type: 'publicKey'; + "name": "group", + "type": "publicKey" }, { - name: 'owner'; - type: 'publicKey'; + "name": "owner", + "type": "publicKey" }, { - name: 'delegate'; - type: 'publicKey'; + "name": "delegate", + "type": "publicKey" }, { - name: 'tokens'; - type: { - defined: 'MangoAccountTokens'; - }; + "name": "tokens", + "type": { + "defined": "MangoAccountTokens" + } }, { - name: 'serum3'; - type: { - defined: 'MangoAccountSerum3'; - }; + "name": "serum3", + "type": { + "defined": "MangoAccountSerum3" + } }, { - name: 'perps'; - type: { - defined: 'MangoAccountPerps'; - }; + "name": "perps", + "type": { + "defined": "MangoAccountPerps" + } }, { - name: 'beingLiquidated'; - type: 'u8'; + "name": "beingLiquidated", + "type": "u8" }, { - name: 'isBankrupt'; - type: 'u8'; + "name": "isBankrupt", + "type": "u8" }, { - name: 'accountNum'; - type: 'u8'; + "name": "accountNum", + "type": "u8" }, { - name: 'bump'; - type: 'u8'; + "name": "bump", + "type": "u8" }, { - name: 'reserved'; - type: { - array: ['u8', 4]; - }; - }, - ]; - }; + "name": "reserved", + "type": { + "array": [ + "u8", + 4 + ] + } + } + ] + } }, { - name: 'mintInfo'; - type: { - kind: 'struct'; - fields: [ + "name": "mintInfo", + "type": { + "kind": "struct", + "fields": [ { - name: 'group'; - type: 'publicKey'; + "name": "group", + "type": "publicKey" }, { - name: 'mint'; - type: 'publicKey'; + "name": "mint", + "type": "publicKey" }, { - name: 'bank'; - type: 'publicKey'; + "name": "bank", + "type": "publicKey" }, { - name: 'vault'; - type: 'publicKey'; + "name": "vault", + "type": "publicKey" }, { - name: 'oracle'; - type: 'publicKey'; + "name": "oracle", + "type": "publicKey" }, { - name: 'addressLookupTable'; - type: 'publicKey'; + "name": "addressLookupTable", + "type": "publicKey" }, { - name: 'tokenIndex'; - type: 'u16'; + "name": "tokenIndex", + "type": "u16" }, { - name: 'addressLookupTableBankIndex'; - type: 'u8'; + "name": "addressLookupTableBankIndex", + "type": "u8" }, { - name: 'addressLookupTableOracleIndex'; - type: 'u8'; + "name": "addressLookupTableOracleIndex", + "type": "u8" }, { - name: 'reserved'; - type: { - array: ['u8', 4]; - }; - }, - ]; - }; + "name": "reserved", + "type": { + "array": [ + "u8", + 4 + ] + } + } + ] + } }, { - name: 'stubOracle'; - type: { - kind: 'struct'; - fields: [ + "name": "stubOracle", + "type": { + "kind": "struct", + "fields": [ { - name: 'group'; - type: 'publicKey'; + "name": "group", + "type": "publicKey" }, { - name: 'mint'; - type: 'publicKey'; + "name": "mint", + "type": "publicKey" }, { - name: 'price'; - type: { - defined: 'I80F48'; - }; + "name": "price", + "type": { + "defined": "I80F48" + } }, { - name: 'lastUpdated'; - type: 'i64'; + "name": "lastUpdated", + "type": "i64" }, { - name: 'reserved'; - type: { - array: ['u8', 8]; - }; - }, - ]; - }; + "name": "reserved", + "type": { + "array": [ + "u8", + 8 + ] + } + } + ] + } }, { - name: 'bookSide'; - type: { - kind: 'struct'; - fields: [ + "name": "bookSide", + "type": { + "kind": "struct", + "fields": [ { - name: 'bookSideType'; - type: { - defined: 'BookSideType'; - }; + "name": "bookSideType", + "type": { + "defined": "BookSideType" + } }, { - name: 'bumpIndex'; - type: 'u64'; + "name": "bumpIndex", + "type": "u64" }, { - name: 'freeListLen'; - type: 'u64'; + "name": "freeListLen", + "type": "u64" }, { - name: 'freeListHead'; - type: 'u32'; + "name": "freeListHead", + "type": "u32" }, { - name: 'rootNode'; - type: 'u32'; + "name": "rootNode", + "type": "u32" }, { - name: 'leafCount'; - type: 'u64'; + "name": "leafCount", + "type": "u64" }, { - name: 'nodes'; - type: { - array: [ + "name": "nodes", + "type": { + "array": [ { - defined: 'AnyNode'; + "defined": "AnyNode" }, - 1024, - ]; - }; - }, - ]; - }; + 1024 + ] + } + } + ] + } }, { - name: 'eventQueue'; - type: { - kind: 'struct'; - fields: [ + "name": "eventQueue", + "type": { + "kind": "struct", + "fields": [ { - name: 'header'; - type: { - defined: 'EventQueueHeader'; - }; + "name": "header", + "type": { + "defined": "EventQueueHeader" + } }, { - name: 'buf'; - type: { - array: [ + "name": "buf", + "type": { + "array": [ { - defined: 'AnyEvent'; + "defined": "AnyEvent" }, - 512, - ]; - }; - }, - ]; - }; + 512 + ] + } + } + ] + } }, { - name: 'perpMarket'; - type: { - kind: 'struct'; - fields: [ + "name": "perpMarket", + "type": { + "kind": "struct", + "fields": [ { - name: 'name'; - type: { - array: ['u8', 16]; - }; + "name": "name", + "type": { + "array": [ + "u8", + 16 + ] + } }, { - name: 'group'; - type: 'publicKey'; + "name": "group", + "type": "publicKey" }, { - name: 'oracle'; - type: 'publicKey'; + "name": "oracle", + "type": "publicKey" }, { - name: 'bids'; - type: 'publicKey'; + "name": "bids", + "type": "publicKey" }, { - name: 'asks'; - type: 'publicKey'; + "name": "asks", + "type": "publicKey" }, { - name: 'eventQueue'; - type: 'publicKey'; + "name": "eventQueue", + "type": "publicKey" }, { - name: 'quoteLotSize'; - type: 'i64'; + "name": "quoteLotSize", + "type": "i64" }, { - name: 'baseLotSize'; - type: 'i64'; + "name": "baseLotSize", + "type": "i64" }, { - name: 'maintAssetWeight'; - type: { - defined: 'I80F48'; - }; + "name": "maintAssetWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'initAssetWeight'; - type: { - defined: 'I80F48'; - }; + "name": "initAssetWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'maintLiabWeight'; - type: { - defined: 'I80F48'; - }; + "name": "maintLiabWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'initLiabWeight'; - type: { - defined: 'I80F48'; - }; + "name": "initLiabWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'liquidationFee'; - type: { - defined: 'I80F48'; - }; + "name": "liquidationFee", + "type": { + "defined": "I80F48" + } }, { - name: 'makerFee'; - type: { - defined: 'I80F48'; - }; + "name": "makerFee", + "type": { + "defined": "I80F48" + } }, { - name: 'takerFee'; - type: { - defined: 'I80F48'; - }; + "name": "takerFee", + "type": { + "defined": "I80F48" + } }, { - name: 'minFunding'; - type: { - defined: 'I80F48'; - }; + "name": "minFunding", + "type": { + "defined": "I80F48" + } }, { - name: 'maxFunding'; - type: { - defined: 'I80F48'; - }; + "name": "maxFunding", + "type": { + "defined": "I80F48" + } }, { - name: 'impactQuantity'; - type: 'i64'; + "name": "impactQuantity", + "type": "i64" }, { - name: 'longFunding'; - type: { - defined: 'I80F48'; - }; + "name": "longFunding", + "type": { + "defined": "I80F48" + } }, { - name: 'shortFunding'; - type: { - defined: 'I80F48'; - }; + "name": "shortFunding", + "type": { + "defined": "I80F48" + } }, { - name: 'fundingLastUpdated'; - type: 'i64'; + "name": "fundingLastUpdated", + "type": "i64" }, { - name: 'openInterest'; - type: 'i64'; + "name": "openInterest", + "type": "i64" }, { - name: 'seqNum'; - type: 'u64'; + "name": "seqNum", + "type": "u64" }, { - name: 'feesAccrued'; - type: { - defined: 'I80F48'; - }; + "name": "feesAccrued", + "type": { + "defined": "I80F48" + } }, { - name: 'bump'; - type: 'u8'; + "name": "bump", + "type": "u8" }, { - name: 'baseTokenDecimals'; - type: 'u8'; + "name": "baseTokenDecimals", + "type": "u8" }, { - name: 'perpMarketIndex'; - type: 'u16'; + "name": "perpMarketIndex", + "type": "u16" }, { - name: 'baseTokenIndex'; - type: 'u16'; + "name": "baseTokenIndex", + "type": "u16" }, { - name: 'quoteTokenIndex'; - type: 'u16'; - }, - ]; - }; + "name": "quoteTokenIndex", + "type": "u16" + } + ] + } }, { - name: 'serum3Market'; - type: { - kind: 'struct'; - fields: [ + "name": "serum3Market", + "type": { + "kind": "struct", + "fields": [ { - name: 'name'; - type: { - array: ['u8', 16]; - }; + "name": "name", + "type": { + "array": [ + "u8", + 16 + ] + } }, { - name: 'group'; - type: 'publicKey'; + "name": "group", + "type": "publicKey" }, { - name: 'serumProgram'; - type: 'publicKey'; + "name": "serumProgram", + "type": "publicKey" }, { - name: 'serumMarketExternal'; - type: 'publicKey'; + "name": "serumMarketExternal", + "type": "publicKey" }, { - name: 'marketIndex'; - type: 'u16'; + "name": "marketIndex", + "type": "u16" }, { - name: 'baseTokenIndex'; - type: 'u16'; + "name": "baseTokenIndex", + "type": "u16" }, { - name: 'quoteTokenIndex'; - type: 'u16'; + "name": "quoteTokenIndex", + "type": "u16" }, { - name: 'bump'; - type: 'u8'; + "name": "bump", + "type": "u8" }, { - name: 'reserved'; - type: { - array: ['u8', 1]; - }; - }, - ]; - }; - }, - ]; - types: [ + "name": "reserved", + "type": { + "array": [ + "u8", + 1 + ] + } + } + ] + } + } + ], + "types": [ { - name: 'MarginTradeWithdraw'; - type: { - kind: 'struct'; - fields: [ + "name": "MarginTradeWithdraw", + "type": { + "kind": "struct", + "fields": [ { - name: 'index'; - type: 'u8'; + "name": "index", + "type": "u8" }, { - name: 'amount'; - type: 'u64'; - }, - ]; - }; + "name": "amount", + "type": "u64" + } + ] + } }, { - name: 'InterestRateParams'; - type: { - kind: 'struct'; - fields: [ + "name": "InterestRateParams", + "type": { + "kind": "struct", + "fields": [ { - name: 'util0'; - type: 'f32'; + "name": "util0", + "type": "f32" }, { - name: 'rate0'; - type: 'f32'; + "name": "rate0", + "type": "f32" }, { - name: 'util1'; - type: 'f32'; + "name": "util1", + "type": "f32" }, { - name: 'rate1'; - type: 'f32'; + "name": "rate1", + "type": "f32" }, { - name: 'maxRate'; - type: 'f32'; - }, - ]; - }; + "name": "maxRate", + "type": "f32" + } + ] + } }, { - name: 'TokenAccount'; - type: { - kind: 'struct'; - fields: [ + "name": "TokenAccount", + "type": { + "kind": "struct", + "fields": [ { - name: 'indexedValue'; - type: { - defined: 'I80F48'; - }; + "name": "indexedValue", + "type": { + "defined": "I80F48" + } }, { - name: 'tokenIndex'; - type: 'u16'; + "name": "tokenIndex", + "type": "u16" }, { - name: 'inUseCount'; - type: 'u8'; + "name": "inUseCount", + "type": "u8" }, { - name: 'reserved'; - type: { - array: ['u8', 5]; - }; - }, - ]; - }; + "name": "reserved", + "type": { + "array": [ + "u8", + 5 + ] + } + } + ] + } }, { - name: 'MangoAccountTokens'; - type: { - kind: 'struct'; - fields: [ + "name": "MangoAccountTokens", + "type": { + "kind": "struct", + "fields": [ { - name: 'values'; - type: { - array: [ + "name": "values", + "type": { + "array": [ { - defined: 'TokenAccount'; + "defined": "TokenAccount" }, - 16, - ]; - }; - }, - ]; - }; + 16 + ] + } + } + ] + } }, { - name: 'Serum3Account'; - type: { - kind: 'struct'; - fields: [ + "name": "Serum3Account", + "type": { + "kind": "struct", + "fields": [ { - name: 'openOrders'; - type: 'publicKey'; + "name": "openOrders", + "type": "publicKey" }, { - name: 'marketIndex'; - type: 'u16'; + "name": "marketIndex", + "type": "u16" }, { - name: 'baseTokenIndex'; - type: 'u16'; + "name": "baseTokenIndex", + "type": "u16" }, { - name: 'quoteTokenIndex'; - type: 'u16'; + "name": "quoteTokenIndex", + "type": "u16" }, { - name: 'reserved'; - type: { - array: ['u8', 2]; - }; - }, - ]; - }; + "name": "reserved", + "type": { + "array": [ + "u8", + 2 + ] + } + } + ] + } }, { - name: 'MangoAccountSerum3'; - type: { - kind: 'struct'; - fields: [ + "name": "MangoAccountSerum3", + "type": { + "kind": "struct", + "fields": [ { - name: 'values'; - type: { - array: [ + "name": "values", + "type": { + "array": [ { - defined: 'Serum3Account'; + "defined": "Serum3Account" }, - 8, - ]; - }; - }, - ]; - }; + 8 + ] + } + } + ] + } }, { - name: 'PerpAccount'; - type: { - kind: 'struct'; - fields: [ + "name": "PerpAccount", + "type": { + "kind": "struct", + "fields": [ { - name: 'marketIndex'; - type: 'u16'; + "name": "marketIndex", + "type": "u16" }, { - name: 'reserved'; - type: { - array: ['u8', 6]; - }; + "name": "reserved", + "type": { + "array": [ + "u8", + 6 + ] + } }, { - name: 'basePositionLots'; - type: 'i64'; + "name": "basePositionLots", + "type": "i64" }, { - name: 'quotePositionNative'; - type: { - defined: 'I80F48'; - }; + "name": "quotePositionNative", + "type": { + "defined": "I80F48" + } }, { - name: 'longSettledFunding'; - type: { - defined: 'I80F48'; - }; + "name": "longSettledFunding", + "type": { + "defined": "I80F48" + } }, { - name: 'shortSettledFunding'; - type: { - defined: 'I80F48'; - }; + "name": "shortSettledFunding", + "type": { + "defined": "I80F48" + } }, { - name: 'bidsBaseLots'; - type: 'i64'; + "name": "bidsBaseLots", + "type": "i64" }, { - name: 'asksBaseLots'; - type: 'i64'; + "name": "asksBaseLots", + "type": "i64" }, { - name: 'takerBaseLots'; - type: 'i64'; + "name": "takerBaseLots", + "type": "i64" }, { - name: 'takerQuoteLots'; - type: 'i64'; - }, - ]; - }; + "name": "takerQuoteLots", + "type": "i64" + } + ] + } }, { - name: 'MangoAccountPerps'; - type: { - kind: 'struct'; - fields: [ + "name": "MangoAccountPerps", + "type": { + "kind": "struct", + "fields": [ { - name: 'accounts'; - type: { - array: [ + "name": "accounts", + "type": { + "array": [ { - defined: 'PerpAccount'; + "defined": "PerpAccount" }, - 8, - ]; - }; + 8 + ] + } }, { - name: 'orderMarket'; - type: { - array: ['u16', 8]; - }; + "name": "orderMarket", + "type": { + "array": [ + "u16", + 8 + ] + } }, { - name: 'orderSide'; - type: { - array: [ + "name": "orderSide", + "type": { + "array": [ { - defined: 'Side'; + "defined": "Side" }, - 8, - ]; - }; + 8 + ] + } }, { - name: 'orderId'; - type: { - array: ['i128', 8]; - }; + "name": "orderId", + "type": { + "array": [ + "i128", + 8 + ] + } }, { - name: 'clientOrderId'; - type: { - array: ['u64', 8]; - }; - }, - ]; - }; + "name": "clientOrderId", + "type": { + "array": [ + "u64", + 8 + ] + } + } + ] + } }, { - name: 'AnyNode'; - type: { - kind: 'struct'; - fields: [ + "name": "AnyNode", + "type": { + "kind": "struct", + "fields": [ { - name: 'tag'; - type: 'u32'; + "name": "tag", + "type": "u32" }, { - name: 'data'; - type: { - array: ['u8', 84]; - }; - }, - ]; - }; + "name": "data", + "type": { + "array": [ + "u8", + 84 + ] + } + } + ] + } }, { - name: 'EventQueueHeader'; - type: { - kind: 'struct'; - fields: [ + "name": "EventQueueHeader", + "type": { + "kind": "struct", + "fields": [ { - name: 'head'; - type: 'u64'; + "name": "head", + "type": "u64" }, { - name: 'count'; - type: 'u64'; + "name": "count", + "type": "u64" }, { - name: 'seqNum'; - type: 'u64'; - }, - ]; - }; + "name": "seqNum", + "type": "u64" + } + ] + } }, { - name: 'AnyEvent'; - type: { - kind: 'struct'; - fields: [ + "name": "AnyEvent", + "type": { + "kind": "struct", + "fields": [ { - name: 'eventType'; - type: 'u8'; + "name": "eventType", + "type": "u8" }, { - name: 'padding'; - type: { - array: ['u8', 199]; - }; - }, - ]; - }; + "name": "padding", + "type": { + "array": [ + "u8", + 199 + ] + } + } + ] + } }, { - name: 'TokenIndex'; - type: { - kind: 'struct'; - fields: [ + "name": "TokenIndex", + "type": { + "kind": "struct", + "fields": [ { - name: 'val'; - type: 'u16'; - }, - ]; - }; + "name": "val", + "type": "u16" + } + ] + } }, { - name: 'Serum3MarketIndex'; - type: { - kind: 'struct'; - fields: [ + "name": "Serum3MarketIndex", + "type": { + "kind": "struct", + "fields": [ { - name: 'val'; - type: 'u16'; - }, - ]; - }; + "name": "val", + "type": "u16" + } + ] + } }, { - name: 'PerpMarketIndex'; - type: { - kind: 'struct'; - fields: [ + "name": "PerpMarketIndex", + "type": { + "kind": "struct", + "fields": [ { - name: 'val'; - type: 'u16'; - }, - ]; - }; + "name": "val", + "type": "u16" + } + ] + } }, { - name: 'I80F48'; - type: { - kind: 'struct'; - fields: [ + "name": "I80F48", + "type": { + "kind": "struct", + "fields": [ { - name: 'val'; - type: 'i128'; - }, - ]; - }; + "name": "val", + "type": "i128" + } + ] + } }, { - name: 'ProgramInstruction'; - type: { - kind: 'enum'; - variants: [ + "name": "ProgramInstruction", + "type": { + "kind": "enum", + "variants": [ { - name: 'CreateLookupTable'; - fields: [ + "name": "CreateLookupTable", + "fields": [ { - name: 'recent_slot'; - type: { - defined: 'Slot'; - }; + "name": "recent_slot", + "type": { + "defined": "Slot" + } }, { - name: 'bump_seed'; - type: 'u8'; - }, - ]; + "name": "bump_seed", + "type": "u8" + } + ] }, { - name: 'FreezeLookupTable'; + "name": "FreezeLookupTable" }, { - name: 'ExtendLookupTable'; - fields: [ + "name": "ExtendLookupTable", + "fields": [ { - name: 'new_addresses'; - type: { - vec: 'publicKey'; - }; - }, - ]; + "name": "new_addresses", + "type": { + "vec": "publicKey" + } + } + ] }, { - name: 'DeactivateLookupTable'; + "name": "DeactivateLookupTable" }, { - name: 'CloseLookupTable'; - }, - ]; - }; + "name": "CloseLookupTable" + } + ] + } }, { - name: 'Serum3SelfTradeBehavior'; - type: { - kind: 'enum'; - variants: [ + "name": "Serum3SelfTradeBehavior", + "type": { + "kind": "enum", + "variants": [ { - name: 'DecrementTake'; + "name": "DecrementTake" }, { - name: 'CancelProvide'; + "name": "CancelProvide" }, { - name: 'AbortTransaction'; - }, - ]; - }; + "name": "AbortTransaction" + } + ] + } }, { - name: 'Serum3OrderType'; - type: { - kind: 'enum'; - variants: [ + "name": "Serum3OrderType", + "type": { + "kind": "enum", + "variants": [ { - name: 'Limit'; + "name": "Limit" }, { - name: 'ImmediateOrCancel'; + "name": "ImmediateOrCancel" }, { - name: 'PostOnly'; - }, - ]; - }; + "name": "PostOnly" + } + ] + } }, { - name: 'Serum3Side'; - type: { - kind: 'enum'; - variants: [ + "name": "Serum3Side", + "type": { + "kind": "enum", + "variants": [ { - name: 'Bid'; + "name": "Bid" }, { - name: 'Ask'; - }, - ]; - }; + "name": "Ask" + } + ] + } }, { - name: 'HealthType'; - type: { - kind: 'enum'; - variants: [ + "name": "HealthType", + "type": { + "kind": "enum", + "variants": [ { - name: 'Init'; + "name": "Init" }, { - name: 'Maint'; - }, - ]; - }; + "name": "Maint" + } + ] + } }, { - name: 'OracleType'; - type: { - kind: 'enum'; - variants: [ + "name": "OracleType", + "type": { + "kind": "enum", + "variants": [ { - name: 'Stub'; + "name": "Stub" }, { - name: 'Pyth'; - }, - ]; - }; + "name": "Pyth" + } + ] + } }, { - name: 'BookSideType'; - type: { - kind: 'enum'; - variants: [ + "name": "BookSideType", + "type": { + "kind": "enum", + "variants": [ { - name: 'Bids'; + "name": "Bids" }, { - name: 'Asks'; - }, - ]; - }; + "name": "Asks" + } + ] + } }, { - name: 'NodeTag'; - type: { - kind: 'enum'; - variants: [ + "name": "NodeTag", + "type": { + "kind": "enum", + "variants": [ { - name: 'Uninitialized'; + "name": "Uninitialized" }, { - name: 'InnerNode'; + "name": "InnerNode" }, { - name: 'LeafNode'; + "name": "LeafNode" }, { - name: 'FreeNode'; + "name": "FreeNode" }, { - name: 'LastFreeNode'; - }, - ]; - }; + "name": "LastFreeNode" + } + ] + } }, { - name: 'NodeRef'; - type: { - kind: 'enum'; - variants: [ + "name": "NodeRef", + "type": { + "kind": "enum", + "variants": [ { - name: 'Inner'; - fields: [ + "name": "Inner", + "fields": [ { - defined: "&'aInnerNode"; - }, - ]; + "defined": "&'aInnerNode" + } + ] }, { - name: 'Leaf'; - fields: [ + "name": "Leaf", + "fields": [ { - defined: "&'aLeafNode"; - }, - ]; - }, - ]; - }; + "defined": "&'aLeafNode" + } + ] + } + ] + } }, { - name: 'NodeRefMut'; - type: { - kind: 'enum'; - variants: [ + "name": "NodeRefMut", + "type": { + "kind": "enum", + "variants": [ { - name: 'Inner'; - fields: [ + "name": "Inner", + "fields": [ { - defined: "&'amutInnerNode"; - }, - ]; + "defined": "&'amutInnerNode" + } + ] }, { - name: 'Leaf'; - fields: [ + "name": "Leaf", + "fields": [ { - defined: "&'amutLeafNode"; - }, - ]; - }, - ]; - }; + "defined": "&'amutLeafNode" + } + ] + } + ] + } }, { - name: 'OrderType'; - type: { - kind: 'enum'; - variants: [ + "name": "OrderType", + "type": { + "kind": "enum", + "variants": [ { - name: 'Limit'; + "name": "Limit" }, { - name: 'ImmediateOrCancel'; + "name": "ImmediateOrCancel" }, { - name: 'PostOnly'; + "name": "PostOnly" }, { - name: 'Market'; + "name": "Market" }, { - name: 'PostOnlySlide'; - }, - ]; - }; + "name": "PostOnlySlide" + } + ] + } }, { - name: 'Side'; - type: { - kind: 'enum'; - variants: [ + "name": "Side", + "type": { + "kind": "enum", + "variants": [ { - name: 'Bid'; + "name": "Bid" }, { - name: 'Ask'; - }, - ]; - }; + "name": "Ask" + } + ] + } }, { - name: 'EventType'; - type: { - kind: 'enum'; - variants: [ + "name": "EventType", + "type": { + "kind": "enum", + "variants": [ { - name: 'Fill'; + "name": "Fill" }, { - name: 'Out'; + "name": "Out" }, { - name: 'Liquidate'; - }, - ]; - }; - }, - ]; - errors: [ + "name": "Liquidate" + } + ] + } + } + ], + "errors": [ { - code: 6000; - name: 'SomeError'; - msg: ''; + "code": 6000, + "name": "SomeError", + "msg": "" }, { - code: 6001; - name: 'MathError'; - msg: ''; + "code": 6001, + "name": "MathError", + "msg": "" }, { - code: 6002; - name: 'UnexpectedOracle'; - msg: ''; + "code": 6002, + "name": "UnexpectedOracle", + "msg": "" }, { - code: 6003; - name: 'UnknownOracleType'; - msg: ''; + "code": 6003, + "name": "UnknownOracleType", + "msg": "" }, { - code: 6004; - name: 'InvalidMarginTradeTargetCpiProgram'; - msg: ''; + "code": 6004, + "name": "InvalidMarginTradeTargetCpiProgram", + "msg": "" }, { - code: 6005; - name: 'HealthMustBePositive'; - msg: ''; + "code": 6005, + "name": "HealthMustBePositive", + "msg": "" }, { - code: 6006; - name: 'IsBankrupt'; - msg: 'The account is bankrupt'; - }, - ]; + "code": 6006, + "name": "IsBankrupt", + "msg": "The account is bankrupt" + } + ] }; export const IDL: MangoV4 = { - version: '0.1.0', - name: 'mango_v4', - instructions: [ + "version": "0.1.0", + "name": "mango_v4", + "instructions": [ { - name: 'createGroup', - accounts: [ + "name": "createGroup", + "accounts": [ { - name: 'group', - isMut: true, - isSigner: false, - pda: { - seeds: [ + "name": "group", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'const', - type: 'string', - value: 'Group', + "kind": "const", + "type": "string", + "value": "Group" }, { - kind: 'account', - type: 'publicKey', - path: 'admin', + "kind": "account", + "type": "publicKey", + "path": "admin" }, { - kind: 'arg', - type: 'u32', - path: 'group_num', - }, - ], - }, + "kind": "arg", + "type": "u32", + "path": "group_num" + } + ] + } }, { - name: 'admin', - isMut: false, - isSigner: true, + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'payer', - isMut: true, - isSigner: true, + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: 'systemProgram', - isMut: false, - isSigner: false, - }, + "name": "systemProgram", + "isMut": false, + "isSigner": false + } ], - args: [ + "args": [ { - name: 'groupNum', - type: 'u32', + "name": "groupNum", + "type": "u32" }, { - name: 'testing', - type: 'u8', - }, - ], + "name": "testing", + "type": "u8" + } + ] }, { - name: 'closeGroup', - accounts: [ + "name": "closeGroup", + "accounts": [ { - name: 'group', - isMut: true, - isSigner: false, + "name": "group", + "isMut": true, + "isSigner": false }, { - name: 'admin', - isMut: false, - isSigner: true, + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'solDestination', - isMut: true, - isSigner: false, + "name": "solDestination", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram', - isMut: false, - isSigner: false, - }, + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } ], - args: [], + "args": [] }, { - name: 'tokenRegister', - accounts: [ + "name": "tokenRegister", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'admin', - isMut: false, - isSigner: true, + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'mint', - isMut: false, - isSigner: false, + "name": "mint", + "isMut": false, + "isSigner": false }, { - name: 'bank', - isMut: true, - isSigner: false, - pda: { - seeds: [ + "name": "bank", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account', - type: 'publicKey', - path: 'group', + "kind": "account", + "type": "publicKey", + "path": "group" }, { - kind: 'const', - type: 'string', - value: 'Bank', + "kind": "const", + "type": "string", + "value": "Bank" }, { - kind: 'arg', - type: 'u16', - path: 'token_index', - }, - ], - }, + "kind": "arg", + "type": "u16", + "path": "token_index" + } + ] + } }, { - name: 'vault', - isMut: true, - isSigner: false, - pda: { - seeds: [ + "name": "vault", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account', - type: 'publicKey', - path: 'group', + "kind": "account", + "type": "publicKey", + "path": "group" }, { - kind: 'const', - type: 'string', - value: 'Vault', + "kind": "const", + "type": "string", + "value": "Vault" }, { - kind: 'arg', - type: 'u16', - path: 'token_index', - }, - ], - }, + "kind": "arg", + "type": "u16", + "path": "token_index" + } + ] + } }, { - name: 'mintInfo', - isMut: true, - isSigner: false, - pda: { - seeds: [ + "name": "mintInfo", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account', - type: 'publicKey', - path: 'group', + "kind": "account", + "type": "publicKey", + "path": "group" }, { - kind: 'const', - type: 'string', - value: 'MintInfo', + "kind": "const", + "type": "string", + "value": "MintInfo" }, { - kind: 'account', - type: 'publicKey', - account: 'Mint', - path: 'mint', - }, - ], - }, + "kind": "account", + "type": "publicKey", + "account": "Mint", + "path": "mint" + } + ] + } }, { - name: 'oracle', - isMut: false, - isSigner: false, + "name": "oracle", + "isMut": false, + "isSigner": false }, { - name: 'payer', - isMut: true, - isSigner: true, + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: 'tokenProgram', - isMut: false, - isSigner: false, + "name": "tokenProgram", + "isMut": false, + "isSigner": false }, { - name: 'systemProgram', - isMut: false, - isSigner: false, + "name": "systemProgram", + "isMut": false, + "isSigner": false }, { - name: 'rent', - isMut: false, - isSigner: false, - }, + "name": "rent", + "isMut": false, + "isSigner": false + } ], - args: [ + "args": [ { - name: 'tokenIndex', - type: 'u16', + "name": "tokenIndex", + "type": "u16" }, { - name: 'name', - type: 'string', + "name": "name", + "type": "string" }, { - name: 'interestRateParams', - type: { - defined: 'InterestRateParams', - }, + "name": "interestRateParams", + "type": { + "defined": "InterestRateParams" + } }, { - name: 'loanFeeRate', - type: 'f32', + "name": "loanFeeRate", + "type": "f32" }, { - name: 'loanOriginationFeeRate', - type: 'f32', + "name": "loanOriginationFeeRate", + "type": "f32" }, { - name: 'maintAssetWeight', - type: 'f32', + "name": "maintAssetWeight", + "type": "f32" }, { - name: 'initAssetWeight', - type: 'f32', + "name": "initAssetWeight", + "type": "f32" }, { - name: 'maintLiabWeight', - type: 'f32', + "name": "maintLiabWeight", + "type": "f32" }, { - name: 'initLiabWeight', - type: 'f32', + "name": "initLiabWeight", + "type": "f32" }, { - name: 'liquidationFee', - type: 'f32', - }, - ], + "name": "liquidationFee", + "type": "f32" + } + ] }, { - name: 'tokenDeregister', - accounts: [ + "name": "tokenDeregister", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'admin', - isMut: false, - isSigner: true, + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'bank', - isMut: true, - isSigner: false, + "name": "bank", + "isMut": true, + "isSigner": false }, { - name: 'vault', - isMut: true, - isSigner: false, + "name": "vault", + "isMut": true, + "isSigner": false }, { - name: 'mintInfo', - isMut: true, - isSigner: false, + "name": "mintInfo", + "isMut": true, + "isSigner": false }, { - name: 'solDestination', - isMut: true, - isSigner: false, + "name": "solDestination", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram', - isMut: false, - isSigner: false, - }, + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } ], - args: [], + "args": [] }, { - name: 'updateIndex', - accounts: [ + "name": "updateIndex", + "accounts": [ { - name: 'bank', - isMut: true, - isSigner: false, - }, + "name": "bank", + "isMut": true, + "isSigner": false + } ], - args: [], + "args": [] }, { - name: 'createAccount', - accounts: [ + "name": "createAccount", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, - pda: { - seeds: [ + "name": "account", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account', - type: 'publicKey', - path: 'group', + "kind": "account", + "type": "publicKey", + "path": "group" }, { - kind: 'const', - type: 'string', - value: 'MangoAccount', + "kind": "const", + "type": "string", + "value": "MangoAccount" }, { - kind: 'account', - type: 'publicKey', - path: 'owner', + "kind": "account", + "type": "publicKey", + "path": "owner" }, { - kind: 'arg', - type: 'u8', - path: 'account_num', - }, - ], - }, + "kind": "arg", + "type": "u8", + "path": "account_num" + } + ] + } }, { - name: 'owner', - isMut: false, - isSigner: true, + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'payer', - isMut: true, - isSigner: true, + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: 'systemProgram', - isMut: false, - isSigner: false, - }, + "name": "systemProgram", + "isMut": false, + "isSigner": false + } ], - args: [ + "args": [ { - name: 'accountNum', - type: 'u8', + "name": "accountNum", + "type": "u8" }, { - name: 'name', - type: 'string', - }, - ], + "name": "name", + "type": "string" + } + ] }, { - name: 'closeAccount', - accounts: [ + "name": "closeAccount", + "accounts": [ { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner', - isMut: false, - isSigner: true, + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'solDestination', - isMut: true, - isSigner: false, + "name": "solDestination", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram', - isMut: false, - isSigner: false, - }, + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } ], - args: [], + "args": [] }, { - name: 'createStubOracle', - accounts: [ + "name": "createStubOracle", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'oracle', - isMut: true, - isSigner: false, - pda: { - seeds: [ + "name": "oracle", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account', - type: 'publicKey', - path: 'group', + "kind": "account", + "type": "publicKey", + "path": "group" }, { - kind: 'const', - type: 'string', - value: 'StubOracle', + "kind": "const", + "type": "string", + "value": "StubOracle" }, { - kind: 'account', - type: 'publicKey', - account: 'Mint', - path: 'token_mint', - }, - ], - }, + "kind": "account", + "type": "publicKey", + "account": "Mint", + "path": "token_mint" + } + ] + } }, { - name: 'admin', - isMut: false, - isSigner: true, + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'tokenMint', - isMut: false, - isSigner: false, + "name": "tokenMint", + "isMut": false, + "isSigner": false }, { - name: 'payer', - isMut: true, - isSigner: true, + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: 'systemProgram', - isMut: false, - isSigner: false, - }, + "name": "systemProgram", + "isMut": false, + "isSigner": false + } ], - args: [ + "args": [ { - name: 'price', - type: { - defined: 'I80F48', - }, - }, - ], + "name": "price", + "type": { + "defined": "I80F48" + } + } + ] }, { - name: 'closeStubOracle', - accounts: [ + "name": "closeStubOracle", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'admin', - isMut: false, - isSigner: true, + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'oracle', - isMut: true, - isSigner: false, + "name": "oracle", + "isMut": true, + "isSigner": false }, { - name: 'solDestination', - isMut: true, - isSigner: false, + "name": "solDestination", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram', - isMut: false, - isSigner: false, - }, + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } ], - args: [], + "args": [] }, { - name: 'setStubOracle', - accounts: [ + "name": "setStubOracle", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'admin', - isMut: false, - isSigner: true, + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'oracle', - isMut: true, - isSigner: false, + "name": "oracle", + "isMut": true, + "isSigner": false }, { - name: 'payer', - isMut: true, - isSigner: true, - }, + "name": "payer", + "isMut": true, + "isSigner": true + } ], - args: [ + "args": [ { - name: 'price', - type: { - defined: 'I80F48', - }, - }, - ], + "name": "price", + "type": { + "defined": "I80F48" + } + } + ] }, { - name: 'tokenDeposit', - accounts: [ + "name": "tokenDeposit", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'bank', - isMut: true, - isSigner: false, + "name": "bank", + "isMut": true, + "isSigner": false }, { - name: 'vault', - isMut: true, - isSigner: false, + "name": "vault", + "isMut": true, + "isSigner": false }, { - name: 'tokenAccount', - isMut: true, - isSigner: false, + "name": "tokenAccount", + "isMut": true, + "isSigner": false }, { - name: 'tokenAuthority', - isMut: false, - isSigner: true, + "name": "tokenAuthority", + "isMut": false, + "isSigner": true }, { - name: 'tokenProgram', - isMut: false, - isSigner: false, - }, + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } ], - args: [ + "args": [ { - name: 'amount', - type: 'u64', - }, - ], + "name": "amount", + "type": "u64" + } + ] }, { - name: 'tokenWithdraw', - accounts: [ + "name": "tokenWithdraw", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner', - isMut: false, - isSigner: true, + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'bank', - isMut: true, - isSigner: false, + "name": "bank", + "isMut": true, + "isSigner": false }, { - name: 'vault', - isMut: true, - isSigner: false, + "name": "vault", + "isMut": true, + "isSigner": false }, { - name: 'tokenAccount', - isMut: true, - isSigner: false, + "name": "tokenAccount", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram', - isMut: false, - isSigner: false, - }, + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } ], - args: [ + "args": [ { - name: 'amount', - type: 'u64', + "name": "amount", + "type": "u64" }, { - name: 'allowBorrow', - type: 'bool', - }, - ], + "name": "allowBorrow", + "type": "bool" + } + ] }, { - name: 'marginTrade', - accounts: [ + "name": "marginTrade", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner', - isMut: false, - isSigner: true, + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'tokenProgram', - isMut: false, - isSigner: false, - }, + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } ], - args: [ + "args": [ { - name: 'numHealthAccounts', - type: 'u64', + "name": "withdraws", + "type": { + "vec": { + "defined": "MarginTradeWithdraw" + } + } }, { - name: 'withdraws', - type: { - vec: { - defined: 'MarginTradeWithdraw', - }, - }, - }, - { - name: 'cpiData', - type: 'bytes', - }, - ], + "name": "cpiDatas", + "type": { + "vec": { + "defined": "(u8,Vec)" + } + } + } + ] }, { - name: 'serum3RegisterMarket', - accounts: [ + "name": "serum3RegisterMarket", + "accounts": [ { - name: 'group', - isMut: true, - isSigner: false, + "name": "group", + "isMut": true, + "isSigner": false }, { - name: 'admin', - isMut: false, - isSigner: true, + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'serumProgram', - isMut: false, - isSigner: false, + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal', - isMut: false, - isSigner: false, + "name": "serumMarketExternal", + "isMut": false, + "isSigner": false }, { - name: 'serumMarket', - isMut: true, - isSigner: false, - pda: { - seeds: [ + "name": "serumMarket", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account', - type: 'publicKey', - path: 'group', + "kind": "account", + "type": "publicKey", + "path": "group" }, { - kind: 'const', - type: 'string', - value: 'Serum3Market', + "kind": "const", + "type": "string", + "value": "Serum3Market" }, { - kind: 'account', - type: 'publicKey', - path: 'serum_market_external', - }, - ], - }, + "kind": "account", + "type": "publicKey", + "path": "serum_market_external" + } + ] + } }, { - name: 'quoteBank', - isMut: false, - isSigner: false, + "name": "quoteBank", + "isMut": false, + "isSigner": false }, { - name: 'baseBank', - isMut: false, - isSigner: false, + "name": "baseBank", + "isMut": false, + "isSigner": false }, { - name: 'payer', - isMut: true, - isSigner: true, + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: 'systemProgram', - isMut: false, - isSigner: false, - }, + "name": "systemProgram", + "isMut": false, + "isSigner": false + } ], - args: [ + "args": [ { - name: 'marketIndex', - type: 'u16', + "name": "marketIndex", + "type": "u16" }, { - name: 'name', - type: 'string', - }, - ], + "name": "name", + "type": "string" + } + ] }, { - name: 'serum3DeregisterMarket', - accounts: [ + "name": "serum3DeregisterMarket", + "accounts": [ { - name: 'group', - isMut: true, - isSigner: false, + "name": "group", + "isMut": true, + "isSigner": false }, { - name: 'admin', - isMut: false, - isSigner: true, + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'serumMarket', - isMut: true, - isSigner: false, + "name": "serumMarket", + "isMut": true, + "isSigner": false }, { - name: 'solDestination', - isMut: true, - isSigner: false, + "name": "solDestination", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram', - isMut: false, - isSigner: false, - }, + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } ], - args: [], + "args": [] }, { - name: 'serum3CreateOpenOrders', - accounts: [ + "name": "serum3CreateOpenOrders", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'serumMarket', - isMut: false, - isSigner: false, + "name": "serumMarket", + "isMut": false, + "isSigner": false }, { - name: 'serumProgram', - isMut: false, - isSigner: false, + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal', - isMut: false, - isSigner: false, + "name": "serumMarketExternal", + "isMut": false, + "isSigner": false }, { - name: 'openOrders', - isMut: true, - isSigner: false, - pda: { - seeds: [ + "name": "openOrders", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account', - type: 'publicKey', - path: 'account', + "kind": "account", + "type": "publicKey", + "path": "account" }, { - kind: 'const', - type: 'string', - value: 'Serum3OO', + "kind": "const", + "type": "string", + "value": "Serum3OO" }, { - kind: 'account', - type: 'publicKey', - path: 'serum_market', - }, - ], - }, + "kind": "account", + "type": "publicKey", + "path": "serum_market" + } + ] + } }, { - name: 'owner', - isMut: false, - isSigner: true, + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'payer', - isMut: true, - isSigner: true, + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: 'systemProgram', - isMut: false, - isSigner: false, + "name": "systemProgram", + "isMut": false, + "isSigner": false }, { - name: 'rent', - isMut: false, - isSigner: false, - }, + "name": "rent", + "isMut": false, + "isSigner": false + } ], - args: [], + "args": [] }, { - name: 'serum3CloseOpenOrders', - accounts: [ + "name": "serum3CloseOpenOrders", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner', - isMut: false, - isSigner: true, + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'serumMarket', - isMut: false, - isSigner: false, + "name": "serumMarket", + "isMut": false, + "isSigner": false }, { - name: 'serumProgram', - isMut: false, - isSigner: false, + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal', - isMut: false, - isSigner: false, + "name": "serumMarketExternal", + "isMut": false, + "isSigner": false }, { - name: 'openOrders', - isMut: true, - isSigner: false, + "name": "openOrders", + "isMut": true, + "isSigner": false }, { - name: 'solDestination', - isMut: true, - isSigner: false, - }, + "name": "solDestination", + "isMut": true, + "isSigner": false + } ], - args: [], + "args": [] }, { - name: 'serum3PlaceOrder', - accounts: [ + "name": "serum3PlaceOrder", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner', - isMut: false, - isSigner: true, + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'openOrders', - isMut: true, - isSigner: false, + "name": "openOrders", + "isMut": true, + "isSigner": false }, { - name: 'serumMarket', - isMut: false, - isSigner: false, + "name": "serumMarket", + "isMut": false, + "isSigner": false }, { - name: 'serumProgram', - isMut: false, - isSigner: false, + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal', - isMut: true, - isSigner: false, + "name": "serumMarketExternal", + "isMut": true, + "isSigner": false }, { - name: 'marketBids', - isMut: true, - isSigner: false, + "name": "marketBids", + "isMut": true, + "isSigner": false }, { - name: 'marketAsks', - isMut: true, - isSigner: false, + "name": "marketAsks", + "isMut": true, + "isSigner": false }, { - name: 'marketEventQueue', - isMut: true, - isSigner: false, + "name": "marketEventQueue", + "isMut": true, + "isSigner": false }, { - name: 'marketRequestQueue', - isMut: true, - isSigner: false, + "name": "marketRequestQueue", + "isMut": true, + "isSigner": false }, { - name: 'marketBaseVault', - isMut: true, - isSigner: false, + "name": "marketBaseVault", + "isMut": true, + "isSigner": false }, { - name: 'marketQuoteVault', - isMut: true, - isSigner: false, + "name": "marketQuoteVault", + "isMut": true, + "isSigner": false }, { - name: 'marketVaultSigner', - isMut: false, - isSigner: false, + "name": "marketVaultSigner", + "isMut": false, + "isSigner": false }, { - name: 'quoteBank', - isMut: true, - isSigner: false, + "name": "quoteBank", + "isMut": true, + "isSigner": false }, { - name: 'quoteVault', - isMut: true, - isSigner: false, + "name": "quoteVault", + "isMut": true, + "isSigner": false }, { - name: 'baseBank', - isMut: true, - isSigner: false, + "name": "baseBank", + "isMut": true, + "isSigner": false }, { - name: 'baseVault', - isMut: true, - isSigner: false, + "name": "baseVault", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram', - isMut: false, - isSigner: false, - }, + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } ], - args: [ + "args": [ { - name: 'side', - type: { - defined: 'Serum3Side', - }, + "name": "side", + "type": { + "defined": "Serum3Side" + } }, { - name: 'limitPrice', - type: 'u64', + "name": "limitPrice", + "type": "u64" }, { - name: 'maxBaseQty', - type: 'u64', + "name": "maxBaseQty", + "type": "u64" }, { - name: 'maxNativeQuoteQtyIncludingFees', - type: 'u64', + "name": "maxNativeQuoteQtyIncludingFees", + "type": "u64" }, { - name: 'selfTradeBehavior', - type: { - defined: 'Serum3SelfTradeBehavior', - }, + "name": "selfTradeBehavior", + "type": { + "defined": "Serum3SelfTradeBehavior" + } }, { - name: 'orderType', - type: { - defined: 'Serum3OrderType', - }, + "name": "orderType", + "type": { + "defined": "Serum3OrderType" + } }, { - name: 'clientOrderId', - type: 'u64', + "name": "clientOrderId", + "type": "u64" }, { - name: 'limit', - type: 'u16', - }, - ], + "name": "limit", + "type": "u16" + } + ] }, { - name: 'serum3CancelOrder', - accounts: [ + "name": "serum3CancelOrder", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner', - isMut: false, - isSigner: true, + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'openOrders', - isMut: true, - isSigner: false, + "name": "openOrders", + "isMut": true, + "isSigner": false }, { - name: 'serumMarket', - isMut: false, - isSigner: false, + "name": "serumMarket", + "isMut": false, + "isSigner": false }, { - name: 'serumProgram', - isMut: false, - isSigner: false, + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal', - isMut: true, - isSigner: false, + "name": "serumMarketExternal", + "isMut": true, + "isSigner": false }, { - name: 'marketBids', - isMut: true, - isSigner: false, + "name": "marketBids", + "isMut": true, + "isSigner": false }, { - name: 'marketAsks', - isMut: true, - isSigner: false, + "name": "marketAsks", + "isMut": true, + "isSigner": false }, { - name: 'marketEventQueue', - isMut: true, - isSigner: false, - }, + "name": "marketEventQueue", + "isMut": true, + "isSigner": false + } ], - args: [ + "args": [ { - name: 'side', - type: { - defined: 'Serum3Side', - }, + "name": "side", + "type": { + "defined": "Serum3Side" + } }, { - name: 'orderId', - type: 'u128', - }, - ], + "name": "orderId", + "type": "u128" + } + ] }, { - name: 'serum3CancelAllOrders', - accounts: [ + "name": "serum3CancelAllOrders", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner', - isMut: false, - isSigner: true, + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'openOrders', - isMut: true, - isSigner: false, + "name": "openOrders", + "isMut": true, + "isSigner": false }, { - name: 'serumMarket', - isMut: false, - isSigner: false, + "name": "serumMarket", + "isMut": false, + "isSigner": false }, { - name: 'serumProgram', - isMut: false, - isSigner: false, + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal', - isMut: true, - isSigner: false, + "name": "serumMarketExternal", + "isMut": true, + "isSigner": false }, { - name: 'marketBids', - isMut: true, - isSigner: false, + "name": "marketBids", + "isMut": true, + "isSigner": false }, { - name: 'marketAsks', - isMut: true, - isSigner: false, + "name": "marketAsks", + "isMut": true, + "isSigner": false }, { - name: 'marketEventQueue', - isMut: true, - isSigner: false, - }, + "name": "marketEventQueue", + "isMut": true, + "isSigner": false + } ], - args: [ + "args": [ { - name: 'limit', - type: 'u8', - }, - ], + "name": "limit", + "type": "u8" + } + ] }, { - name: 'serum3SettleFunds', - accounts: [ + "name": "serum3SettleFunds", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'owner', - isMut: false, - isSigner: true, + "name": "owner", + "isMut": false, + "isSigner": true }, { - name: 'openOrders', - isMut: true, - isSigner: false, + "name": "openOrders", + "isMut": true, + "isSigner": false }, { - name: 'serumMarket', - isMut: false, - isSigner: false, + "name": "serumMarket", + "isMut": false, + "isSigner": false }, { - name: 'serumProgram', - isMut: false, - isSigner: false, + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal', - isMut: true, - isSigner: false, + "name": "serumMarketExternal", + "isMut": true, + "isSigner": false }, { - name: 'marketBaseVault', - isMut: true, - isSigner: false, + "name": "marketBaseVault", + "isMut": true, + "isSigner": false }, { - name: 'marketQuoteVault', - isMut: true, - isSigner: false, + "name": "marketQuoteVault", + "isMut": true, + "isSigner": false }, { - name: 'marketVaultSigner', - isMut: false, - isSigner: false, + "name": "marketVaultSigner", + "isMut": false, + "isSigner": false }, { - name: 'quoteBank', - isMut: true, - isSigner: false, + "name": "quoteBank", + "isMut": true, + "isSigner": false }, { - name: 'quoteVault', - isMut: true, - isSigner: false, + "name": "quoteVault", + "isMut": true, + "isSigner": false }, { - name: 'baseBank', - isMut: true, - isSigner: false, + "name": "baseBank", + "isMut": true, + "isSigner": false }, { - name: 'baseVault', - isMut: true, - isSigner: false, + "name": "baseVault", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram', - isMut: false, - isSigner: false, - }, + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } ], - args: [], + "args": [] }, { - name: 'serum3LiqForceCancelOrders', - accounts: [ + "name": "serum3LiqForceCancelOrders", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'openOrders', - isMut: true, - isSigner: false, + "name": "openOrders", + "isMut": true, + "isSigner": false }, { - name: 'serumMarket', - isMut: false, - isSigner: false, + "name": "serumMarket", + "isMut": false, + "isSigner": false }, { - name: 'serumProgram', - isMut: false, - isSigner: false, + "name": "serumProgram", + "isMut": false, + "isSigner": false }, { - name: 'serumMarketExternal', - isMut: true, - isSigner: false, + "name": "serumMarketExternal", + "isMut": true, + "isSigner": false }, { - name: 'marketBids', - isMut: true, - isSigner: false, + "name": "marketBids", + "isMut": true, + "isSigner": false }, { - name: 'marketAsks', - isMut: true, - isSigner: false, + "name": "marketAsks", + "isMut": true, + "isSigner": false }, { - name: 'marketEventQueue', - isMut: true, - isSigner: false, + "name": "marketEventQueue", + "isMut": true, + "isSigner": false }, { - name: 'marketBaseVault', - isMut: true, - isSigner: false, + "name": "marketBaseVault", + "isMut": true, + "isSigner": false }, { - name: 'marketQuoteVault', - isMut: true, - isSigner: false, + "name": "marketQuoteVault", + "isMut": true, + "isSigner": false }, { - name: 'marketVaultSigner', - isMut: false, - isSigner: false, + "name": "marketVaultSigner", + "isMut": false, + "isSigner": false }, { - name: 'quoteBank', - isMut: true, - isSigner: false, + "name": "quoteBank", + "isMut": true, + "isSigner": false }, { - name: 'quoteVault', - isMut: true, - isSigner: false, + "name": "quoteVault", + "isMut": true, + "isSigner": false }, { - name: 'baseBank', - isMut: true, - isSigner: false, + "name": "baseBank", + "isMut": true, + "isSigner": false }, { - name: 'baseVault', - isMut: true, - isSigner: false, + "name": "baseVault", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram', - isMut: false, - isSigner: false, - }, + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } ], - args: [ + "args": [ { - name: 'limit', - type: 'u8', - }, - ], + "name": "limit", + "type": "u8" + } + ] }, { - name: 'liqTokenWithToken', - accounts: [ + "name": "liqTokenWithToken", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'liqor', - isMut: true, - isSigner: false, + "name": "liqor", + "isMut": true, + "isSigner": false }, { - name: 'liqorOwner', - isMut: false, - isSigner: true, + "name": "liqorOwner", + "isMut": false, + "isSigner": true }, { - name: 'liqee', - isMut: true, - isSigner: false, - }, + "name": "liqee", + "isMut": true, + "isSigner": false + } ], - args: [ + "args": [ { - name: 'assetTokenIndex', - type: 'u16', + "name": "assetTokenIndex", + "type": "u16" }, { - name: 'liabTokenIndex', - type: 'u16', + "name": "liabTokenIndex", + "type": "u16" }, { - name: 'maxLiabTransfer', - type: { - defined: 'I80F48', - }, - }, - ], + "name": "maxLiabTransfer", + "type": { + "defined": "I80F48" + } + } + ] }, { - name: 'perpCreateMarket', - accounts: [ + "name": "perpCreateMarket", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'admin', - isMut: false, - isSigner: true, + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'oracle', - isMut: false, - isSigner: false, + "name": "oracle", + "isMut": false, + "isSigner": false }, { - name: 'perpMarket', - isMut: true, - isSigner: false, - pda: { - seeds: [ + "name": "perpMarket", + "isMut": true, + "isSigner": false, + "pda": { + "seeds": [ { - kind: 'account', - type: 'publicKey', - path: 'group', + "kind": "account", + "type": "publicKey", + "path": "group" }, { - kind: 'const', - type: 'string', - value: 'PerpMarket', + "kind": "const", + "type": "string", + "value": "PerpMarket" }, { - kind: 'arg', - type: 'u16', - path: 'perp_market_index', - }, - ], - }, + "kind": "arg", + "type": "u16", + "path": "perp_market_index" + } + ] + } }, { - name: 'bids', - isMut: true, - isSigner: false, + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'asks', - isMut: true, - isSigner: false, + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'eventQueue', - isMut: true, - isSigner: false, + "name": "eventQueue", + "isMut": true, + "isSigner": false }, { - name: 'payer', - isMut: true, - isSigner: true, + "name": "payer", + "isMut": true, + "isSigner": true }, { - name: 'systemProgram', - isMut: false, - isSigner: false, - }, + "name": "systemProgram", + "isMut": false, + "isSigner": false + } ], - args: [ + "args": [ { - name: 'perpMarketIndex', - type: 'u16', + "name": "perpMarketIndex", + "type": "u16" }, { - name: 'name', - type: 'string', + "name": "name", + "type": "string" }, { - name: 'baseTokenIndexOpt', - type: { - option: 'u16', - }, + "name": "baseTokenIndexOpt", + "type": { + "option": "u16" + } }, { - name: 'baseTokenDecimals', - type: 'u8', + "name": "baseTokenDecimals", + "type": "u8" }, { - name: 'quoteTokenIndex', - type: 'u16', + "name": "quoteTokenIndex", + "type": "u16" }, { - name: 'quoteLotSize', - type: 'i64', + "name": "quoteLotSize", + "type": "i64" }, { - name: 'baseLotSize', - type: 'i64', + "name": "baseLotSize", + "type": "i64" }, { - name: 'maintAssetWeight', - type: 'f32', + "name": "maintAssetWeight", + "type": "f32" }, { - name: 'initAssetWeight', - type: 'f32', + "name": "initAssetWeight", + "type": "f32" }, { - name: 'maintLiabWeight', - type: 'f32', + "name": "maintLiabWeight", + "type": "f32" }, { - name: 'initLiabWeight', - type: 'f32', + "name": "initLiabWeight", + "type": "f32" }, { - name: 'liquidationFee', - type: 'f32', + "name": "liquidationFee", + "type": "f32" }, { - name: 'makerFee', - type: 'f32', + "name": "makerFee", + "type": "f32" }, { - name: 'takerFee', - type: 'f32', + "name": "takerFee", + "type": "f32" }, { - name: 'minFunding', - type: 'f32', + "name": "minFunding", + "type": "f32" }, { - name: 'maxFunding', - type: 'f32', + "name": "maxFunding", + "type": "f32" }, { - name: 'impactQuantity', - type: 'i64', - }, - ], + "name": "impactQuantity", + "type": "i64" + } + ] }, { - name: 'perpCloseMarket', - accounts: [ + "name": "perpCloseMarket", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'admin', - isMut: false, - isSigner: true, + "name": "admin", + "isMut": false, + "isSigner": true }, { - name: 'perpMarket', - isMut: true, - isSigner: false, + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'bids', - isMut: true, - isSigner: false, + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'asks', - isMut: true, - isSigner: false, + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'eventQueue', - isMut: true, - isSigner: false, + "name": "eventQueue", + "isMut": true, + "isSigner": false }, { - name: 'solDestination', - isMut: true, - isSigner: false, + "name": "solDestination", + "isMut": true, + "isSigner": false }, { - name: 'tokenProgram', - isMut: false, - isSigner: false, - }, + "name": "tokenProgram", + "isMut": false, + "isSigner": false + } ], - args: [], + "args": [] }, { - name: 'perpPlaceOrder', - accounts: [ + "name": "perpPlaceOrder", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'perpMarket', - isMut: true, - isSigner: false, + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'asks', - isMut: true, - isSigner: false, + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'bids', - isMut: true, - isSigner: false, + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'eventQueue', - isMut: true, - isSigner: false, + "name": "eventQueue", + "isMut": true, + "isSigner": false }, { - name: 'oracle', - isMut: false, - isSigner: false, + "name": "oracle", + "isMut": false, + "isSigner": false }, { - name: 'owner', - isMut: false, - isSigner: true, - }, + "name": "owner", + "isMut": false, + "isSigner": true + } ], - args: [ + "args": [ { - name: 'side', - type: { - defined: 'Side', - }, + "name": "side", + "type": { + "defined": "Side" + } }, { - name: 'priceLots', - type: 'i64', + "name": "priceLots", + "type": "i64" }, { - name: 'maxBaseLots', - type: 'i64', + "name": "maxBaseLots", + "type": "i64" }, { - name: 'maxQuoteLots', - type: 'i64', + "name": "maxQuoteLots", + "type": "i64" }, { - name: 'clientOrderId', - type: 'u64', + "name": "clientOrderId", + "type": "u64" }, { - name: 'orderType', - type: { - defined: 'OrderType', - }, + "name": "orderType", + "type": { + "defined": "OrderType" + } }, { - name: 'expiryTimestamp', - type: 'u64', + "name": "expiryTimestamp", + "type": "u64" }, { - name: 'limit', - type: 'u8', - }, - ], + "name": "limit", + "type": "u8" + } + ] }, { - name: 'perpCancelOrder', - accounts: [ + "name": "perpCancelOrder", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'perpMarket', - isMut: true, - isSigner: false, + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'asks', - isMut: true, - isSigner: false, + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'bids', - isMut: true, - isSigner: false, + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'owner', - isMut: false, - isSigner: true, - }, + "name": "owner", + "isMut": false, + "isSigner": true + } ], - args: [ + "args": [ { - name: 'orderId', - type: 'i128', - }, - ], + "name": "orderId", + "type": "i128" + } + ] }, { - name: 'perpCancelOrderByClientOrderId', - accounts: [ + "name": "perpCancelOrderByClientOrderId", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'perpMarket', - isMut: true, - isSigner: false, + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'asks', - isMut: true, - isSigner: false, + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'bids', - isMut: true, - isSigner: false, + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'owner', - isMut: false, - isSigner: true, - }, + "name": "owner", + "isMut": false, + "isSigner": true + } ], - args: [ + "args": [ { - name: 'clientOrderId', - type: 'u64', - }, - ], + "name": "clientOrderId", + "type": "u64" + } + ] }, { - name: 'perpCancelAllOrders', - accounts: [ + "name": "perpCancelAllOrders", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'perpMarket', - isMut: true, - isSigner: false, + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'asks', - isMut: true, - isSigner: false, + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'bids', - isMut: true, - isSigner: false, + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'owner', - isMut: false, - isSigner: true, - }, + "name": "owner", + "isMut": false, + "isSigner": true + } ], - args: [ + "args": [ { - name: 'limit', - type: 'u8', - }, - ], + "name": "limit", + "type": "u8" + } + ] }, { - name: 'perpCancelAllOrdersBySide', - accounts: [ + "name": "perpCancelAllOrdersBySide", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'account', - isMut: true, - isSigner: false, + "name": "account", + "isMut": true, + "isSigner": false }, { - name: 'perpMarket', - isMut: true, - isSigner: false, + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'asks', - isMut: true, - isSigner: false, + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'bids', - isMut: true, - isSigner: false, + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'owner', - isMut: false, - isSigner: true, - }, + "name": "owner", + "isMut": false, + "isSigner": true + } ], - args: [ + "args": [ { - name: 'sideOption', - type: { - option: { - defined: 'Side', - }, - }, + "name": "sideOption", + "type": { + "option": { + "defined": "Side" + } + } }, { - name: 'limit', - type: 'u8', - }, - ], + "name": "limit", + "type": "u8" + } + ] }, { - name: 'perpConsumeEvents', - accounts: [ + "name": "perpConsumeEvents", + "accounts": [ { - name: 'group', - isMut: false, - isSigner: false, + "name": "group", + "isMut": false, + "isSigner": false }, { - name: 'perpMarket', - isMut: true, - isSigner: false, + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'eventQueue', - isMut: true, - isSigner: false, - }, + "name": "eventQueue", + "isMut": true, + "isSigner": false + } ], - args: [ + "args": [ { - name: 'limit', - type: 'u64', - }, - ], + "name": "limit", + "type": "u64" + } + ] }, { - name: 'perpUpdateFunding', - accounts: [ + "name": "perpUpdateFunding", + "accounts": [ { - name: 'perpMarket', - isMut: true, - isSigner: false, + "name": "perpMarket", + "isMut": true, + "isSigner": false }, { - name: 'asks', - isMut: true, - isSigner: false, + "name": "asks", + "isMut": true, + "isSigner": false }, { - name: 'bids', - isMut: true, - isSigner: false, + "name": "bids", + "isMut": true, + "isSigner": false }, { - name: 'oracle', - isMut: false, - isSigner: false, - }, + "name": "oracle", + "isMut": false, + "isSigner": false + } ], - args: [], + "args": [] }, { - name: 'benchmark', - accounts: [], - args: [], - }, + "name": "benchmark", + "accounts": [], + "args": [] + } ], - accounts: [ + "accounts": [ { - name: 'bank', - type: { - kind: 'struct', - fields: [ + "name": "bank", + "type": { + "kind": "struct", + "fields": [ { - name: 'name', - type: { - array: ['u8', 16], - }, + "name": "name", + "type": { + "array": [ + "u8", + 16 + ] + } }, { - name: 'group', - type: 'publicKey', + "name": "group", + "type": "publicKey" }, { - name: 'mint', - type: 'publicKey', + "name": "mint", + "type": "publicKey" }, { - name: 'vault', - type: 'publicKey', + "name": "vault", + "type": "publicKey" }, { - name: 'oracle', - type: 'publicKey', + "name": "oracle", + "type": "publicKey" }, { - name: 'depositIndex', - type: { - defined: 'I80F48', - }, + "name": "depositIndex", + "type": { + "defined": "I80F48" + } }, { - name: 'borrowIndex', - type: { - defined: 'I80F48', - }, + "name": "borrowIndex", + "type": { + "defined": "I80F48" + } }, { - name: 'indexedTotalDeposits', - type: { - defined: 'I80F48', - }, + "name": "indexedTotalDeposits", + "type": { + "defined": "I80F48" + } }, { - name: 'indexedTotalBorrows', - type: { - defined: 'I80F48', - }, + "name": "indexedTotalBorrows", + "type": { + "defined": "I80F48" + } }, { - name: 'lastUpdated', - type: 'i64', + "name": "lastUpdated", + "type": "i64" }, { - name: 'util0', - type: { - defined: 'I80F48', - }, + "name": "util0", + "type": { + "defined": "I80F48" + } }, { - name: 'rate0', - type: { - defined: 'I80F48', - }, + "name": "rate0", + "type": { + "defined": "I80F48" + } }, { - name: 'util1', - type: { - defined: 'I80F48', - }, + "name": "util1", + "type": { + "defined": "I80F48" + } }, { - name: 'rate1', - type: { - defined: 'I80F48', - }, + "name": "rate1", + "type": { + "defined": "I80F48" + } }, { - name: 'maxRate', - type: { - defined: 'I80F48', - }, + "name": "maxRate", + "type": { + "defined": "I80F48" + } }, { - name: 'collectedFeesNative', - type: { - defined: 'I80F48', - }, + "name": "collectedFeesNative", + "type": { + "defined": "I80F48" + } }, { - name: 'loanOriginationFeeRate', - type: { - defined: 'I80F48', - }, + "name": "loanOriginationFeeRate", + "type": { + "defined": "I80F48" + } }, { - name: 'loanFeeRate', - type: { - defined: 'I80F48', - }, + "name": "loanFeeRate", + "type": { + "defined": "I80F48" + } }, { - name: 'maintAssetWeight', - type: { - defined: 'I80F48', - }, + "name": "maintAssetWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'initAssetWeight', - type: { - defined: 'I80F48', - }, + "name": "initAssetWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'maintLiabWeight', - type: { - defined: 'I80F48', - }, + "name": "maintLiabWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'initLiabWeight', - type: { - defined: 'I80F48', - }, + "name": "initLiabWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'liquidationFee', - type: { - defined: 'I80F48', - }, + "name": "liquidationFee", + "type": { + "defined": "I80F48" + } }, { - name: 'dust', - type: { - defined: 'I80F48', - }, + "name": "dust", + "type": { + "defined": "I80F48" + } }, { - name: 'tokenIndex', - type: 'u16', + "name": "tokenIndex", + "type": "u16" }, { - name: 'bump', - type: 'u8', + "name": "bump", + "type": "u8" }, { - name: 'mintDecimals', - type: 'u8', + "name": "mintDecimals", + "type": "u8" }, { - name: 'reserved', - type: { - array: ['u8', 4], - }, - }, - ], - }, + "name": "reserved", + "type": { + "array": [ + "u8", + 4 + ] + } + } + ] + } }, { - name: 'group', - type: { - kind: 'struct', - fields: [ + "name": "group", + "type": { + "kind": "struct", + "fields": [ { - name: 'admin', - type: 'publicKey', + "name": "admin", + "type": "publicKey" }, { - name: 'bump', - type: 'u8', + "name": "bump", + "type": "u8" }, { - name: 'testing', - type: 'u8', + "name": "testing", + "type": "u8" }, { - name: 'padding', - type: { - array: ['u8', 2], - }, + "name": "padding", + "type": { + "array": [ + "u8", + 2 + ] + } }, { - name: 'groupNum', - type: 'u32', + "name": "groupNum", + "type": "u32" }, { - name: 'reserved', - type: { - array: ['u8', 8], - }, - }, - ], - }, + "name": "reserved", + "type": { + "array": [ + "u8", + 8 + ] + } + } + ] + } }, { - name: 'mangoAccount', - type: { - kind: 'struct', - fields: [ + "name": "mangoAccount", + "type": { + "kind": "struct", + "fields": [ { - name: 'name', - type: { - array: ['u8', 32], - }, + "name": "name", + "type": { + "array": [ + "u8", + 32 + ] + } }, { - name: 'group', - type: 'publicKey', + "name": "group", + "type": "publicKey" }, { - name: 'owner', - type: 'publicKey', + "name": "owner", + "type": "publicKey" }, { - name: 'delegate', - type: 'publicKey', + "name": "delegate", + "type": "publicKey" }, { - name: 'tokens', - type: { - defined: 'MangoAccountTokens', - }, + "name": "tokens", + "type": { + "defined": "MangoAccountTokens" + } }, { - name: 'serum3', - type: { - defined: 'MangoAccountSerum3', - }, + "name": "serum3", + "type": { + "defined": "MangoAccountSerum3" + } }, { - name: 'perps', - type: { - defined: 'MangoAccountPerps', - }, + "name": "perps", + "type": { + "defined": "MangoAccountPerps" + } }, { - name: 'beingLiquidated', - type: 'u8', + "name": "beingLiquidated", + "type": "u8" }, { - name: 'isBankrupt', - type: 'u8', + "name": "isBankrupt", + "type": "u8" }, { - name: 'accountNum', - type: 'u8', + "name": "accountNum", + "type": "u8" }, { - name: 'bump', - type: 'u8', + "name": "bump", + "type": "u8" }, { - name: 'reserved', - type: { - array: ['u8', 4], - }, - }, - ], - }, + "name": "reserved", + "type": { + "array": [ + "u8", + 4 + ] + } + } + ] + } }, { - name: 'mintInfo', - type: { - kind: 'struct', - fields: [ + "name": "mintInfo", + "type": { + "kind": "struct", + "fields": [ { - name: 'group', - type: 'publicKey', + "name": "group", + "type": "publicKey" }, { - name: 'mint', - type: 'publicKey', + "name": "mint", + "type": "publicKey" }, { - name: 'bank', - type: 'publicKey', + "name": "bank", + "type": "publicKey" }, { - name: 'vault', - type: 'publicKey', + "name": "vault", + "type": "publicKey" }, { - name: 'oracle', - type: 'publicKey', + "name": "oracle", + "type": "publicKey" }, { - name: 'addressLookupTable', - type: 'publicKey', + "name": "addressLookupTable", + "type": "publicKey" }, { - name: 'tokenIndex', - type: 'u16', + "name": "tokenIndex", + "type": "u16" }, { - name: 'addressLookupTableBankIndex', - type: 'u8', + "name": "addressLookupTableBankIndex", + "type": "u8" }, { - name: 'addressLookupTableOracleIndex', - type: 'u8', + "name": "addressLookupTableOracleIndex", + "type": "u8" }, { - name: 'reserved', - type: { - array: ['u8', 4], - }, - }, - ], - }, + "name": "reserved", + "type": { + "array": [ + "u8", + 4 + ] + } + } + ] + } }, { - name: 'stubOracle', - type: { - kind: 'struct', - fields: [ + "name": "stubOracle", + "type": { + "kind": "struct", + "fields": [ { - name: 'group', - type: 'publicKey', + "name": "group", + "type": "publicKey" }, { - name: 'mint', - type: 'publicKey', + "name": "mint", + "type": "publicKey" }, { - name: 'price', - type: { - defined: 'I80F48', - }, + "name": "price", + "type": { + "defined": "I80F48" + } }, { - name: 'lastUpdated', - type: 'i64', + "name": "lastUpdated", + "type": "i64" }, { - name: 'reserved', - type: { - array: ['u8', 8], - }, - }, - ], - }, + "name": "reserved", + "type": { + "array": [ + "u8", + 8 + ] + } + } + ] + } }, { - name: 'bookSide', - type: { - kind: 'struct', - fields: [ + "name": "bookSide", + "type": { + "kind": "struct", + "fields": [ { - name: 'bookSideType', - type: { - defined: 'BookSideType', - }, + "name": "bookSideType", + "type": { + "defined": "BookSideType" + } }, { - name: 'bumpIndex', - type: 'u64', + "name": "bumpIndex", + "type": "u64" }, { - name: 'freeListLen', - type: 'u64', + "name": "freeListLen", + "type": "u64" }, { - name: 'freeListHead', - type: 'u32', + "name": "freeListHead", + "type": "u32" }, { - name: 'rootNode', - type: 'u32', + "name": "rootNode", + "type": "u32" }, { - name: 'leafCount', - type: 'u64', + "name": "leafCount", + "type": "u64" }, { - name: 'nodes', - type: { - array: [ + "name": "nodes", + "type": { + "array": [ { - defined: 'AnyNode', + "defined": "AnyNode" }, - 1024, - ], - }, - }, - ], - }, + 1024 + ] + } + } + ] + } }, { - name: 'eventQueue', - type: { - kind: 'struct', - fields: [ + "name": "eventQueue", + "type": { + "kind": "struct", + "fields": [ { - name: 'header', - type: { - defined: 'EventQueueHeader', - }, + "name": "header", + "type": { + "defined": "EventQueueHeader" + } }, { - name: 'buf', - type: { - array: [ + "name": "buf", + "type": { + "array": [ { - defined: 'AnyEvent', + "defined": "AnyEvent" }, - 512, - ], - }, - }, - ], - }, + 512 + ] + } + } + ] + } }, { - name: 'perpMarket', - type: { - kind: 'struct', - fields: [ + "name": "perpMarket", + "type": { + "kind": "struct", + "fields": [ { - name: 'name', - type: { - array: ['u8', 16], - }, + "name": "name", + "type": { + "array": [ + "u8", + 16 + ] + } }, { - name: 'group', - type: 'publicKey', + "name": "group", + "type": "publicKey" }, { - name: 'oracle', - type: 'publicKey', + "name": "oracle", + "type": "publicKey" }, { - name: 'bids', - type: 'publicKey', + "name": "bids", + "type": "publicKey" }, { - name: 'asks', - type: 'publicKey', + "name": "asks", + "type": "publicKey" }, { - name: 'eventQueue', - type: 'publicKey', + "name": "eventQueue", + "type": "publicKey" }, { - name: 'quoteLotSize', - type: 'i64', + "name": "quoteLotSize", + "type": "i64" }, { - name: 'baseLotSize', - type: 'i64', + "name": "baseLotSize", + "type": "i64" }, { - name: 'maintAssetWeight', - type: { - defined: 'I80F48', - }, + "name": "maintAssetWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'initAssetWeight', - type: { - defined: 'I80F48', - }, + "name": "initAssetWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'maintLiabWeight', - type: { - defined: 'I80F48', - }, + "name": "maintLiabWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'initLiabWeight', - type: { - defined: 'I80F48', - }, + "name": "initLiabWeight", + "type": { + "defined": "I80F48" + } }, { - name: 'liquidationFee', - type: { - defined: 'I80F48', - }, + "name": "liquidationFee", + "type": { + "defined": "I80F48" + } }, { - name: 'makerFee', - type: { - defined: 'I80F48', - }, + "name": "makerFee", + "type": { + "defined": "I80F48" + } }, { - name: 'takerFee', - type: { - defined: 'I80F48', - }, + "name": "takerFee", + "type": { + "defined": "I80F48" + } }, { - name: 'minFunding', - type: { - defined: 'I80F48', - }, + "name": "minFunding", + "type": { + "defined": "I80F48" + } }, { - name: 'maxFunding', - type: { - defined: 'I80F48', - }, + "name": "maxFunding", + "type": { + "defined": "I80F48" + } }, { - name: 'impactQuantity', - type: 'i64', + "name": "impactQuantity", + "type": "i64" }, { - name: 'longFunding', - type: { - defined: 'I80F48', - }, + "name": "longFunding", + "type": { + "defined": "I80F48" + } }, { - name: 'shortFunding', - type: { - defined: 'I80F48', - }, + "name": "shortFunding", + "type": { + "defined": "I80F48" + } }, { - name: 'fundingLastUpdated', - type: 'i64', + "name": "fundingLastUpdated", + "type": "i64" }, { - name: 'openInterest', - type: 'i64', + "name": "openInterest", + "type": "i64" }, { - name: 'seqNum', - type: 'u64', + "name": "seqNum", + "type": "u64" }, { - name: 'feesAccrued', - type: { - defined: 'I80F48', - }, + "name": "feesAccrued", + "type": { + "defined": "I80F48" + } }, { - name: 'bump', - type: 'u8', + "name": "bump", + "type": "u8" }, { - name: 'baseTokenDecimals', - type: 'u8', + "name": "baseTokenDecimals", + "type": "u8" }, { - name: 'perpMarketIndex', - type: 'u16', + "name": "perpMarketIndex", + "type": "u16" }, { - name: 'baseTokenIndex', - type: 'u16', + "name": "baseTokenIndex", + "type": "u16" }, { - name: 'quoteTokenIndex', - type: 'u16', - }, - ], - }, + "name": "quoteTokenIndex", + "type": "u16" + } + ] + } }, { - name: 'serum3Market', - type: { - kind: 'struct', - fields: [ + "name": "serum3Market", + "type": { + "kind": "struct", + "fields": [ { - name: 'name', - type: { - array: ['u8', 16], - }, + "name": "name", + "type": { + "array": [ + "u8", + 16 + ] + } }, { - name: 'group', - type: 'publicKey', + "name": "group", + "type": "publicKey" }, { - name: 'serumProgram', - type: 'publicKey', + "name": "serumProgram", + "type": "publicKey" }, { - name: 'serumMarketExternal', - type: 'publicKey', + "name": "serumMarketExternal", + "type": "publicKey" }, { - name: 'marketIndex', - type: 'u16', + "name": "marketIndex", + "type": "u16" }, { - name: 'baseTokenIndex', - type: 'u16', + "name": "baseTokenIndex", + "type": "u16" }, { - name: 'quoteTokenIndex', - type: 'u16', + "name": "quoteTokenIndex", + "type": "u16" }, { - name: 'bump', - type: 'u8', + "name": "bump", + "type": "u8" }, { - name: 'reserved', - type: { - array: ['u8', 1], - }, - }, - ], - }, - }, + "name": "reserved", + "type": { + "array": [ + "u8", + 1 + ] + } + } + ] + } + } ], - types: [ + "types": [ { - name: 'MarginTradeWithdraw', - type: { - kind: 'struct', - fields: [ + "name": "MarginTradeWithdraw", + "type": { + "kind": "struct", + "fields": [ { - name: 'index', - type: 'u8', + "name": "index", + "type": "u8" }, { - name: 'amount', - type: 'u64', - }, - ], - }, + "name": "amount", + "type": "u64" + } + ] + } }, { - name: 'InterestRateParams', - type: { - kind: 'struct', - fields: [ + "name": "InterestRateParams", + "type": { + "kind": "struct", + "fields": [ { - name: 'util0', - type: 'f32', + "name": "util0", + "type": "f32" }, { - name: 'rate0', - type: 'f32', + "name": "rate0", + "type": "f32" }, { - name: 'util1', - type: 'f32', + "name": "util1", + "type": "f32" }, { - name: 'rate1', - type: 'f32', + "name": "rate1", + "type": "f32" }, { - name: 'maxRate', - type: 'f32', - }, - ], - }, + "name": "maxRate", + "type": "f32" + } + ] + } }, { - name: 'TokenAccount', - type: { - kind: 'struct', - fields: [ + "name": "TokenAccount", + "type": { + "kind": "struct", + "fields": [ { - name: 'indexedValue', - type: { - defined: 'I80F48', - }, + "name": "indexedValue", + "type": { + "defined": "I80F48" + } }, { - name: 'tokenIndex', - type: 'u16', + "name": "tokenIndex", + "type": "u16" }, { - name: 'inUseCount', - type: 'u8', + "name": "inUseCount", + "type": "u8" }, { - name: 'reserved', - type: { - array: ['u8', 5], - }, - }, - ], - }, + "name": "reserved", + "type": { + "array": [ + "u8", + 5 + ] + } + } + ] + } }, { - name: 'MangoAccountTokens', - type: { - kind: 'struct', - fields: [ + "name": "MangoAccountTokens", + "type": { + "kind": "struct", + "fields": [ { - name: 'values', - type: { - array: [ + "name": "values", + "type": { + "array": [ { - defined: 'TokenAccount', + "defined": "TokenAccount" }, - 16, - ], - }, - }, - ], - }, + 16 + ] + } + } + ] + } }, { - name: 'Serum3Account', - type: { - kind: 'struct', - fields: [ + "name": "Serum3Account", + "type": { + "kind": "struct", + "fields": [ { - name: 'openOrders', - type: 'publicKey', + "name": "openOrders", + "type": "publicKey" }, { - name: 'marketIndex', - type: 'u16', + "name": "marketIndex", + "type": "u16" }, { - name: 'baseTokenIndex', - type: 'u16', + "name": "baseTokenIndex", + "type": "u16" }, { - name: 'quoteTokenIndex', - type: 'u16', + "name": "quoteTokenIndex", + "type": "u16" }, { - name: 'reserved', - type: { - array: ['u8', 2], - }, - }, - ], - }, + "name": "reserved", + "type": { + "array": [ + "u8", + 2 + ] + } + } + ] + } }, { - name: 'MangoAccountSerum3', - type: { - kind: 'struct', - fields: [ + "name": "MangoAccountSerum3", + "type": { + "kind": "struct", + "fields": [ { - name: 'values', - type: { - array: [ + "name": "values", + "type": { + "array": [ { - defined: 'Serum3Account', + "defined": "Serum3Account" }, - 8, - ], - }, - }, - ], - }, + 8 + ] + } + } + ] + } }, { - name: 'PerpAccount', - type: { - kind: 'struct', - fields: [ + "name": "PerpAccount", + "type": { + "kind": "struct", + "fields": [ { - name: 'marketIndex', - type: 'u16', + "name": "marketIndex", + "type": "u16" }, { - name: 'reserved', - type: { - array: ['u8', 6], - }, + "name": "reserved", + "type": { + "array": [ + "u8", + 6 + ] + } }, { - name: 'basePositionLots', - type: 'i64', + "name": "basePositionLots", + "type": "i64" }, { - name: 'quotePositionNative', - type: { - defined: 'I80F48', - }, + "name": "quotePositionNative", + "type": { + "defined": "I80F48" + } }, { - name: 'longSettledFunding', - type: { - defined: 'I80F48', - }, + "name": "longSettledFunding", + "type": { + "defined": "I80F48" + } }, { - name: 'shortSettledFunding', - type: { - defined: 'I80F48', - }, + "name": "shortSettledFunding", + "type": { + "defined": "I80F48" + } }, { - name: 'bidsBaseLots', - type: 'i64', + "name": "bidsBaseLots", + "type": "i64" }, { - name: 'asksBaseLots', - type: 'i64', + "name": "asksBaseLots", + "type": "i64" }, { - name: 'takerBaseLots', - type: 'i64', + "name": "takerBaseLots", + "type": "i64" }, { - name: 'takerQuoteLots', - type: 'i64', - }, - ], - }, + "name": "takerQuoteLots", + "type": "i64" + } + ] + } }, { - name: 'MangoAccountPerps', - type: { - kind: 'struct', - fields: [ + "name": "MangoAccountPerps", + "type": { + "kind": "struct", + "fields": [ { - name: 'accounts', - type: { - array: [ + "name": "accounts", + "type": { + "array": [ { - defined: 'PerpAccount', + "defined": "PerpAccount" }, - 8, - ], - }, + 8 + ] + } }, { - name: 'orderMarket', - type: { - array: ['u16', 8], - }, + "name": "orderMarket", + "type": { + "array": [ + "u16", + 8 + ] + } }, { - name: 'orderSide', - type: { - array: [ + "name": "orderSide", + "type": { + "array": [ { - defined: 'Side', + "defined": "Side" }, - 8, - ], - }, + 8 + ] + } }, { - name: 'orderId', - type: { - array: ['i128', 8], - }, + "name": "orderId", + "type": { + "array": [ + "i128", + 8 + ] + } }, { - name: 'clientOrderId', - type: { - array: ['u64', 8], - }, - }, - ], - }, + "name": "clientOrderId", + "type": { + "array": [ + "u64", + 8 + ] + } + } + ] + } }, { - name: 'AnyNode', - type: { - kind: 'struct', - fields: [ + "name": "AnyNode", + "type": { + "kind": "struct", + "fields": [ { - name: 'tag', - type: 'u32', + "name": "tag", + "type": "u32" }, { - name: 'data', - type: { - array: ['u8', 84], - }, - }, - ], - }, + "name": "data", + "type": { + "array": [ + "u8", + 84 + ] + } + } + ] + } }, { - name: 'EventQueueHeader', - type: { - kind: 'struct', - fields: [ + "name": "EventQueueHeader", + "type": { + "kind": "struct", + "fields": [ { - name: 'head', - type: 'u64', + "name": "head", + "type": "u64" }, { - name: 'count', - type: 'u64', + "name": "count", + "type": "u64" }, { - name: 'seqNum', - type: 'u64', - }, - ], - }, + "name": "seqNum", + "type": "u64" + } + ] + } }, { - name: 'AnyEvent', - type: { - kind: 'struct', - fields: [ + "name": "AnyEvent", + "type": { + "kind": "struct", + "fields": [ { - name: 'eventType', - type: 'u8', + "name": "eventType", + "type": "u8" }, { - name: 'padding', - type: { - array: ['u8', 199], - }, - }, - ], - }, + "name": "padding", + "type": { + "array": [ + "u8", + 199 + ] + } + } + ] + } }, { - name: 'TokenIndex', - type: { - kind: 'struct', - fields: [ + "name": "TokenIndex", + "type": { + "kind": "struct", + "fields": [ { - name: 'val', - type: 'u16', - }, - ], - }, + "name": "val", + "type": "u16" + } + ] + } }, { - name: 'Serum3MarketIndex', - type: { - kind: 'struct', - fields: [ + "name": "Serum3MarketIndex", + "type": { + "kind": "struct", + "fields": [ { - name: 'val', - type: 'u16', - }, - ], - }, + "name": "val", + "type": "u16" + } + ] + } }, { - name: 'PerpMarketIndex', - type: { - kind: 'struct', - fields: [ + "name": "PerpMarketIndex", + "type": { + "kind": "struct", + "fields": [ { - name: 'val', - type: 'u16', - }, - ], - }, + "name": "val", + "type": "u16" + } + ] + } }, { - name: 'I80F48', - type: { - kind: 'struct', - fields: [ + "name": "I80F48", + "type": { + "kind": "struct", + "fields": [ { - name: 'val', - type: 'i128', - }, - ], - }, + "name": "val", + "type": "i128" + } + ] + } }, { - name: 'ProgramInstruction', - type: { - kind: 'enum', - variants: [ + "name": "ProgramInstruction", + "type": { + "kind": "enum", + "variants": [ { - name: 'CreateLookupTable', - fields: [ + "name": "CreateLookupTable", + "fields": [ { - name: 'recent_slot', - type: { - defined: 'Slot', - }, + "name": "recent_slot", + "type": { + "defined": "Slot" + } }, { - name: 'bump_seed', - type: 'u8', - }, - ], + "name": "bump_seed", + "type": "u8" + } + ] }, { - name: 'FreezeLookupTable', + "name": "FreezeLookupTable" }, { - name: 'ExtendLookupTable', - fields: [ + "name": "ExtendLookupTable", + "fields": [ { - name: 'new_addresses', - type: { - vec: 'publicKey', - }, - }, - ], + "name": "new_addresses", + "type": { + "vec": "publicKey" + } + } + ] }, { - name: 'DeactivateLookupTable', + "name": "DeactivateLookupTable" }, { - name: 'CloseLookupTable', - }, - ], - }, + "name": "CloseLookupTable" + } + ] + } }, { - name: 'Serum3SelfTradeBehavior', - type: { - kind: 'enum', - variants: [ + "name": "Serum3SelfTradeBehavior", + "type": { + "kind": "enum", + "variants": [ { - name: 'DecrementTake', + "name": "DecrementTake" }, { - name: 'CancelProvide', + "name": "CancelProvide" }, { - name: 'AbortTransaction', - }, - ], - }, + "name": "AbortTransaction" + } + ] + } }, { - name: 'Serum3OrderType', - type: { - kind: 'enum', - variants: [ + "name": "Serum3OrderType", + "type": { + "kind": "enum", + "variants": [ { - name: 'Limit', + "name": "Limit" }, { - name: 'ImmediateOrCancel', + "name": "ImmediateOrCancel" }, { - name: 'PostOnly', - }, - ], - }, + "name": "PostOnly" + } + ] + } }, { - name: 'Serum3Side', - type: { - kind: 'enum', - variants: [ + "name": "Serum3Side", + "type": { + "kind": "enum", + "variants": [ { - name: 'Bid', + "name": "Bid" }, { - name: 'Ask', - }, - ], - }, + "name": "Ask" + } + ] + } }, { - name: 'HealthType', - type: { - kind: 'enum', - variants: [ + "name": "HealthType", + "type": { + "kind": "enum", + "variants": [ { - name: 'Init', + "name": "Init" }, { - name: 'Maint', - }, - ], - }, + "name": "Maint" + } + ] + } }, { - name: 'OracleType', - type: { - kind: 'enum', - variants: [ + "name": "OracleType", + "type": { + "kind": "enum", + "variants": [ { - name: 'Stub', + "name": "Stub" }, { - name: 'Pyth', - }, - ], - }, + "name": "Pyth" + } + ] + } }, { - name: 'BookSideType', - type: { - kind: 'enum', - variants: [ + "name": "BookSideType", + "type": { + "kind": "enum", + "variants": [ { - name: 'Bids', + "name": "Bids" }, { - name: 'Asks', - }, - ], - }, + "name": "Asks" + } + ] + } }, { - name: 'NodeTag', - type: { - kind: 'enum', - variants: [ + "name": "NodeTag", + "type": { + "kind": "enum", + "variants": [ { - name: 'Uninitialized', + "name": "Uninitialized" }, { - name: 'InnerNode', + "name": "InnerNode" }, { - name: 'LeafNode', + "name": "LeafNode" }, { - name: 'FreeNode', + "name": "FreeNode" }, { - name: 'LastFreeNode', - }, - ], - }, + "name": "LastFreeNode" + } + ] + } }, { - name: 'NodeRef', - type: { - kind: 'enum', - variants: [ + "name": "NodeRef", + "type": { + "kind": "enum", + "variants": [ { - name: 'Inner', - fields: [ + "name": "Inner", + "fields": [ { - defined: "&'aInnerNode", - }, - ], + "defined": "&'aInnerNode" + } + ] }, { - name: 'Leaf', - fields: [ + "name": "Leaf", + "fields": [ { - defined: "&'aLeafNode", - }, - ], - }, - ], - }, + "defined": "&'aLeafNode" + } + ] + } + ] + } }, { - name: 'NodeRefMut', - type: { - kind: 'enum', - variants: [ + "name": "NodeRefMut", + "type": { + "kind": "enum", + "variants": [ { - name: 'Inner', - fields: [ + "name": "Inner", + "fields": [ { - defined: "&'amutInnerNode", - }, - ], + "defined": "&'amutInnerNode" + } + ] }, { - name: 'Leaf', - fields: [ + "name": "Leaf", + "fields": [ { - defined: "&'amutLeafNode", - }, - ], - }, - ], - }, + "defined": "&'amutLeafNode" + } + ] + } + ] + } }, { - name: 'OrderType', - type: { - kind: 'enum', - variants: [ + "name": "OrderType", + "type": { + "kind": "enum", + "variants": [ { - name: 'Limit', + "name": "Limit" }, { - name: 'ImmediateOrCancel', + "name": "ImmediateOrCancel" }, { - name: 'PostOnly', + "name": "PostOnly" }, { - name: 'Market', + "name": "Market" }, { - name: 'PostOnlySlide', - }, - ], - }, + "name": "PostOnlySlide" + } + ] + } }, { - name: 'Side', - type: { - kind: 'enum', - variants: [ + "name": "Side", + "type": { + "kind": "enum", + "variants": [ { - name: 'Bid', + "name": "Bid" }, { - name: 'Ask', - }, - ], - }, + "name": "Ask" + } + ] + } }, { - name: 'EventType', - type: { - kind: 'enum', - variants: [ + "name": "EventType", + "type": { + "kind": "enum", + "variants": [ { - name: 'Fill', + "name": "Fill" }, { - name: 'Out', + "name": "Out" }, { - name: 'Liquidate', - }, - ], - }, - }, + "name": "Liquidate" + } + ] + } + } ], - errors: [ + "errors": [ { - code: 6000, - name: 'SomeError', - msg: '', + "code": 6000, + "name": "SomeError", + "msg": "" }, { - code: 6001, - name: 'MathError', - msg: '', + "code": 6001, + "name": "MathError", + "msg": "" }, { - code: 6002, - name: 'UnexpectedOracle', - msg: '', + "code": 6002, + "name": "UnexpectedOracle", + "msg": "" }, { - code: 6003, - name: 'UnknownOracleType', - msg: '', + "code": 6003, + "name": "UnknownOracleType", + "msg": "" }, { - code: 6004, - name: 'InvalidMarginTradeTargetCpiProgram', - msg: '', + "code": 6004, + "name": "InvalidMarginTradeTargetCpiProgram", + "msg": "" }, { - code: 6005, - name: 'HealthMustBePositive', - msg: '', + "code": 6005, + "name": "HealthMustBePositive", + "msg": "" }, { - code: 6006, - name: 'IsBankrupt', - msg: 'The account is bankrupt', - }, - ], + "code": 6006, + "name": "IsBankrupt", + "msg": "The account is bankrupt" + } + ] }; diff --git a/ts/client/src/scripts/example1-admin.ts b/ts/client/src/scripts/example1-admin.ts index 0abec00e9..311496399 100644 --- a/ts/client/src/scripts/example1-admin.ts +++ b/ts/client/src/scripts/example1-admin.ts @@ -70,6 +70,7 @@ async function main() { group, btcDevnetMint, btcDevnetOracle, + 0.1, 0, 'BTC', 0.4, @@ -105,6 +106,7 @@ async function main() { group, usdcDevnetMint, usdcDevnetOracle.publicKey, + 0.1, 1, 'USDC', 0.4, @@ -132,6 +134,7 @@ async function main() { group, solDevnetMint, solDevnetOracle, + 0.1, 2, // tokenIndex 'SOL', 0.4, @@ -161,6 +164,7 @@ async function main() { group, orcaDevnetMint, orcaDevnetOracle, + 0.1, 3, // tokenIndex 'ORCA', 0.4, @@ -221,6 +225,7 @@ async function main() { btcDevnetOracle, 0, 'BTC/USDC', + 0.1, 0, 6, 1,