diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cdb19c07..1ffea4a66 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,18 +4,30 @@ Update this for each program release and mainnet deployment. ## not on mainnet +### v0.24.2, 2024-7- -### v0.24.1, 2024-7- +- Program: charge collateral fee directly on borrowed tokens (#973) -- Support for switchboard on demand oracle (#974) - -- Sip bad oracle in token update index and rate (#975) +- Program: fix TokenUpdateIndexAndRateResilient IX (#979) +- Program: add support for pyth v2 account (#980) ## mainnet +### v0.24.1, 2024-7-9 + +Deployment: Jul 9, 2024 at 15:46:15 Central European Summer Time, +https://explorer.solana.com/tx/5KYBSXV4uRCUK6vaQoZjipNFhTqEY1b1DHJeSh5jo87UUVGBBJj2xSkzTqGHZ8aTb4M88jwsTUi4KXjVWv71sxE5 + +- Support for switchboard on demand oracle (#974) + +- Sip bad oracle in token update index and rate (#975) + ### v0.24.0, 2024-4-18 +Deployment: Apr 18, 2024 at 14:53:24 Central European Summer Time, +https://explorer.solana.com/tx/2TFCGXQkUjRvkuuojxmiKefUtHPp6q6rM1frYvALByWMGfpWbiGH5hGq5suWEH7TUKoz4jb4KCGxu9DRw7YcXNdh + - Allow skipping banks and invalid oracles when computing health (#891) This is only possible when we know for sure that the operation would not put the account into negative health zone. diff --git a/Cargo.lock b/Cargo.lock index b79b4dbfc..dcb9cfa7d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -121,7 +121,7 @@ checksum = "faa5be5b72abea167f87c868379ba3c2be356bfca9e6f474fd055fa0f7eeb4f2" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "regex", "syn 1.0.109", @@ -136,7 +136,7 @@ dependencies = [ "anchor-syn", "anyhow", "bs58 0.5.0", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "rustversion", "syn 1.0.109", @@ -149,7 +149,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "59948e7f9ef8144c2aefb3f32a40c5fce2798baeec765ba038389e82301017ef" dependencies = [ "anchor-syn", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "syn 1.0.109", ] @@ -160,7 +160,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc753c9d1c7981cb8948cf7e162fb0f64558999c0413058e2d43df1df5448086" dependencies = [ "anchor-syn", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -173,7 +173,7 @@ checksum = "f38b4e172ba1b52078f53fdc9f11e3dc0668ad27997838a0aad2d148afac8c97" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -186,7 +186,7 @@ checksum = "4eebd21543606ab61e2d83d9da37d24d3886a49f390f9c43a1964735e8c0f0d5" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -218,7 +218,7 @@ checksum = "ec4720d899b3686396cced9508f23dab420f1308344456ec78ef76f98fda42af" dependencies = [ "anchor-syn", "anyhow", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -229,7 +229,7 @@ version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f495e85480bd96ddeb77b71d499247c7d4e8b501e75ecb234e9ef7ae7bd6552a" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -280,7 +280,7 @@ dependencies = [ "anyhow", "bs58 0.5.0", "heck 0.3.3", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "serde", "serde_json", @@ -391,7 +391,7 @@ checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ "num-bigint 0.4.5", "num-traits", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -427,7 +427,7 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -500,7 +500,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", "synstructure", @@ -512,7 +512,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -590,7 +590,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25f9db3b38af870bf7e5cc649167533b493928e50744e2c30ae350230b414670" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -601,9 +601,9 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -612,9 +612,9 @@ version = "0.1.80" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -800,12 +800,12 @@ dependencies = [ "lazycell", "peeking_take_while", "prettyplease 0.2.15", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "regex", "rustc-hash", "shlex", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -918,7 +918,7 @@ dependencies = [ "borsh-derive-internal 0.9.3", "borsh-schema-derive-internal 0.9.3", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "syn 1.0.109", ] @@ -931,7 +931,7 @@ dependencies = [ "borsh-derive-internal 0.10.3", "borsh-schema-derive-internal 0.10.3", "proc-macro-crate 0.1.5", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "syn 1.0.109", ] @@ -941,7 +941,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -952,7 +952,7 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -963,7 +963,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -974,7 +974,7 @@ version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -1068,9 +1068,9 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "965ab7eb5f8f97d2a083c799f3a1b994fc397b2fe2da5d1da1626ce15a39f2b1" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -1162,7 +1162,7 @@ name = "checked_math" version = "0.1.0" dependencies = [ "proc-macro-error", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", "trybuild", @@ -1252,7 +1252,7 @@ checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008" dependencies = [ "heck 0.4.1", "proc-macro-error", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -1536,7 +1536,7 @@ checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "strsim 0.10.0", "syn 1.0.109", @@ -1550,10 +1550,10 @@ checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" dependencies = [ "fnv", "ident_case", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "strsim 0.10.0", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -1575,7 +1575,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" dependencies = [ "darling_core 0.20.3", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -1647,7 +1647,7 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -1668,7 +1668,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f" dependencies = [ "darling 0.14.4", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -1690,7 +1690,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" dependencies = [ "convert_case", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "rustc_version 0.4.0", "syn 1.0.109", @@ -1793,9 +1793,9 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -1881,7 +1881,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" dependencies = [ "enum-ordinalize", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -1922,9 +1922,9 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eecf8589574ce9b895052fa12d69af7a233f99e6107f5cb8dd1044f2a17bfdcb" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -1935,9 +1935,9 @@ checksum = "e4f76552f53cefc9a7f64987c3701b99d982f7690606fd67de1d09712fbf52f1" dependencies = [ "num-bigint 0.4.5", "num-traits", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -1955,7 +1955,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -2256,9 +2256,9 @@ version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -2992,7 +2992,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b939a78fa820cdfcb7ee7484466746a7377760970f6f9c6fe19f9edcc8a38d2" dependencies = [ "proc-macro-crate 0.1.5", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -3467,7 +3467,7 @@ dependencies = [ [[package]] name = "mango-v4" -version = "0.24.1" +version = "0.24.2" dependencies = [ "anchor-lang", "anchor-spl", @@ -3490,6 +3490,7 @@ dependencies = [ "num_enum 0.5.11", "openbook-v2", "pyth-sdk-solana", + "pyth-solana-receiver-sdk", "rand 0.8.5", "regex", "serde", @@ -3519,6 +3520,7 @@ dependencies = [ "anyhow", "async-channel", "base64 0.21.7", + "chrono", "clap 3.2.25", "dotenv", "fixed 1.11.0 (git+https://github.com/blockworks-foundation/fixed.git?branch=v1.11.0-borsh0_10-mango)", @@ -3918,7 +3920,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a7d5f7076603ebc68de2dc6a650ec331a062a13abaa346975be747bbfa4b789" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -4173,7 +4175,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -4184,9 +4186,9 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e6a0fd4f737c707bd9086cc16c925f294943eb62eb71499e9fd4cf71f8b9f4e" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -4285,7 +4287,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -4297,9 +4299,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96667db765a921f7b295ffee8b60472b686a51d4f21c2ee4ffdb94c7013b65a6" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -4309,9 +4311,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56ea360eafe1022f7cc56cd7b869ed57330fb2453d0c7831d99b74c65d2f5597" dependencies = [ "proc-macro-crate 1.3.1", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -4398,9 +4400,9 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -4474,7 +4476,7 @@ checksum = "5f7d21ccd03305a674437ee1248f3ab5d4b1db095cf1caf49f1713ddf61956b7" dependencies = [ "Inflector", "proc-macro-error", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -4662,9 +4664,9 @@ version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -4727,9 +4729,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83145eba741b050ef981a9a1838c843fa7665e154383325aa8b440ae703180a2" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -4798,7 +4800,7 @@ version = "0.3.3" source = "git+https://github.com/nolanderc/rust-postgres-query?rev=b4422051c8a31fbba4a35f88004c1cefb1878dd5#b4422051c8a31fbba4a35f88004c1cefb1878dd5" dependencies = [ "proc-macro-hack", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -4815,7 +4817,7 @@ version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "syn 1.0.109", ] @@ -4825,8 +4827,8 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae005bd773ab59b4725093fd7df83fd7892f7d8eafb48dbd7de6e024e4215f9d" dependencies = [ - "proc-macro2 1.0.86", - "syn 2.0.68", + "proc-macro2 1.0.79", + "syn 2.0.58", ] [[package]] @@ -4865,7 +4867,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" dependencies = [ "proc-macro-error-attr", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", "version_check 0.9.4", @@ -4877,7 +4879,7 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "version_check 0.9.4", ] @@ -4899,9 +4901,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" dependencies = [ "unicode-ident", ] @@ -4991,7 +4993,7 @@ checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe" dependencies = [ "anyhow", "itertools", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -5004,7 +5006,7 @@ checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" dependencies = [ "anyhow", "itertools", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -5074,6 +5076,40 @@ dependencies = [ "thiserror", ] +[[package]] +name = "pyth-solana-receiver-sdk" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e6559643f0b377b6f293269251f6a804ae7332c37f7310371f50c833453cd0" +dependencies = [ + "anchor-lang", + "hex", + "pythnet-sdk", + "solana-program", +] + +[[package]] +name = "pythnet-sdk" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bbbc0456f9f27c9ad16b6c3bf1b2a7fea61eebf900f4d024a0468b9a84fe0c1" +dependencies = [ + "anchor-lang", + "bincode", + "borsh 0.10.3", + "bytemuck", + "byteorder", + "fast-math", + "hex", + "proc-macro2 1.0.79", + "rustc_version 0.4.0", + "serde", + "sha3 0.10.8", + "slow_primes", + "solana-program", + "thiserror", +] + [[package]] name = "qstring" version = "0.7.2" @@ -5157,7 +5193,7 @@ version = "1.0.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", ] [[package]] @@ -5795,7 +5831,7 @@ version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e85e2a16b12bdb763244c69ab79363d71db2b4b918a2def53f80b02e0574b13c" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "serde_derive_internals", "syn 1.0.109", @@ -5828,9 +5864,9 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -5911,9 +5947,9 @@ version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -5922,7 +5958,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85bf8229e7920a9f636479437026331ce11aa132b4dde37d121944a44d6e5f3c" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -5976,9 +6012,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" dependencies = [ "darling 0.20.3", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -6363,7 +6399,7 @@ version = "0.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63927d22a1e8b74bda98cc6e151fcdf178b7abb0dc6c4f81e0bbf5ffe2fc4ec8" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "shank_macro_impl", "syn 1.0.109", @@ -6376,7 +6412,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40ce03403df682f80f4dc1efafa87a4d0cb89b03726d0565e6364bdca5b9a441" dependencies = [ "anyhow", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "serde", "syn 1.0.109", @@ -6458,6 +6494,15 @@ dependencies = [ "autocfg 1.1.0", ] +[[package]] +name = "slow_primes" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58267dd2fbaa6dceecba9e3e106d2d90a2b02497c0e8b01b8759beccf5113938" +dependencies = [ + "num 0.4.3", +] + [[package]] name = "smallvec" version = "0.6.14" @@ -6859,10 +6904,10 @@ version = "1.16.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4dabde7fbd88a68eb083ae9d6d5f6855b7ba1bfc45d200c786b1b448ac49da5f" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "rustc_version 0.4.0", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -7538,10 +7583,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "760fdfd4b7edb02fd9173a6dcec899ffae06ac21b66b65f8c7c5f3d17b12fa64" dependencies = [ "bs58 0.4.0", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "rustversion", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -7934,7 +7979,7 @@ checksum = "b4fa8f409b5c5e0ac571df17c981ae1424b204743daa4428430627d38717caf5" dependencies = [ "quote 1.0.36", "spl-discriminator-syn", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -7943,10 +7988,10 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21968d7da2f0a624c509f24580c3fee70b364a6886d90709e679e64f572eca2f" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "solana-program", - "syn 2.0.68", + "syn 2.0.58", "thiserror", ] @@ -8000,10 +8045,10 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6709c5f41fefb730f2bd8464da741079cf0efd1d0f522e041224b98d431b9b3" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "solana-program", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -8189,7 +8234,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" dependencies = [ "heck 0.4.1", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "rustversion", "syn 1.0.109", @@ -8450,18 +8495,18 @@ version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "unicode-ident", ] [[package]] name = "syn" -version = "2.0.68" +version = "2.0.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "901fa70d88b9d6c98022e23b4136f9f3e54e4662c3bc1bd1d84a42a9a0f0c1e9" +checksum = "44cfb93f38070beee36b3fef7d4f5a16f27751d94b187b666a5cc5e9b0d30687" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "unicode-ident", ] @@ -8478,7 +8523,7 @@ version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", "unicode-xid 0.2.4", @@ -8525,7 +8570,7 @@ version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee42b4e559f17bce0385ebf511a7beb67d5cc33c12c96b7f4e9789919d9c10f" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -8582,9 +8627,9 @@ version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -8740,7 +8785,7 @@ version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", "syn 1.0.109", ] @@ -9064,7 +9109,7 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9403f1bafde247186684b230dc6f38b5cd514584e8bec1dd32514be4745fa757" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "prost-build 0.9.0", "quote 1.0.36", "syn 1.0.109", @@ -9077,7 +9122,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5bf5e9b9c0f7e0a7c027dcfaba7b2c60816c7049171f679d99ee2ff65d0de8c4" dependencies = [ "prettyplease 0.1.25", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "prost-build 0.11.9", "quote 1.0.36", "syn 1.0.109", @@ -9090,7 +9135,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a6fdaae4c2c638bb70fe42803a26fbd6fc6ac8c72f5c59f67ecc2a2dcabf4b07" dependencies = [ "prettyplease 0.1.25", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "prost-build 0.11.9", "quote 1.0.36", "syn 1.0.109", @@ -9160,9 +9205,9 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] @@ -9657,9 +9702,9 @@ dependencies = [ "bumpalo", "log 0.4.20", "once_cell", - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", "wasm-bindgen-shared", ] @@ -9691,9 +9736,9 @@ version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -10120,9 +10165,9 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ - "proc-macro2 1.0.86", + "proc-macro2 1.0.79", "quote 1.0.36", - "syn 2.0.68", + "syn 2.0.58", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index afb3f2adc..ca65ace73 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ anchor-lang = "0.28.0" anchor-spl = "0.28.0" fixed = { git = "https://github.com/blockworks-foundation/fixed.git", branch = "v1.11.0-borsh0_10-mango" } pyth-sdk-solana = "0.8.0" +pyth-solana-receiver-sdk = "0.3.0" # commit c85e56d (0.5.10 plus dependency updates) serum_dex = { git = "https://github.com/openbook-dex/program.git", default-features=false } mango-feeds-connector = "0.2.1" diff --git a/RELEASING.md b/RELEASING.md index 74703dd03..9d50e15c1 100644 --- a/RELEASING.md +++ b/RELEASING.md @@ -18,7 +18,7 @@ - Run the tests to double check there are no failures -- Tag (`git tag program-v0.xy.z HEAD`) and push it (`git push `) +- Tag (`git tag program-v0.xy.z HEAD`) and push it (`git push origin `) - Do a verifiable build diff --git a/bin/cli/Cargo.toml b/bin/cli/Cargo.toml index 5078f4190..129fe771d 100644 --- a/bin/cli/Cargo.toml +++ b/bin/cli/Cargo.toml @@ -28,3 +28,4 @@ solana-sdk = { workspace = true } tokio = { version = "1.14.1", features = ["rt-multi-thread", "time", "macros", "sync"] } itertools = "0.10.3" tracing = "0.1" +chrono = "0.4.31" diff --git a/bin/cli/src/main.rs b/bin/cli/src/main.rs index fe3f5562c..2ea90ff4d 100644 --- a/bin/cli/src/main.rs +++ b/bin/cli/src/main.rs @@ -11,6 +11,7 @@ use std::sync::Arc; use std::time::{SystemTime, UNIX_EPOCH}; mod save_snapshot; +mod test_collateral_fees; mod test_oracles; #[derive(Parser, Debug, Clone)] @@ -240,6 +241,13 @@ enum Command { #[clap(flatten)] rpc: Rpc, }, + TestCollateralFees { + #[clap(short, long)] + group: String, + + #[clap(flatten)] + rpc: Rpc, + }, SaveSnapshot { #[clap(short, long)] group: String, @@ -375,6 +383,11 @@ async fn main() -> Result<(), anyhow::Error> { let group = pubkey_from_cli(&group); test_oracles::run(&client, group).await?; } + Command::TestCollateralFees { group, rpc } => { + let client = rpc.client(None)?; + let group = pubkey_from_cli(&group); + test_collateral_fees::run(&client, group).await?; + } Command::SaveSnapshot { group, rpc, output } => { let mango_group = pubkey_from_cli(&group); let client = rpc.client(None)?; diff --git a/bin/cli/src/test_collateral_fees.rs b/bin/cli/src/test_collateral_fees.rs new file mode 100644 index 000000000..b758d09d6 --- /dev/null +++ b/bin/cli/src/test_collateral_fees.rs @@ -0,0 +1,224 @@ +use anchor_lang::prelude::AccountInfo; +use itertools::Itertools; +use mango_v4::accounts_zerocopy::LoadZeroCopy; +use mango_v4::instructions::token_charge_collateral_fees_internal; +use mango_v4::state::{DynamicAccount, Group}; +use mango_v4_client::snapshot_source::is_mango_account; +use mango_v4_client::{ + account_update_stream, chain_data, snapshot_source, websocket_source, Client, MangoGroupContext, +}; +use solana_sdk::account::ReadableAccount; +use solana_sdk::pubkey::Pubkey; +use std::cell::RefCell; +use std::collections::HashMap; +use std::rc::Rc; +use std::sync::{Arc, RwLock}; +use std::time::Duration; + +pub async fn run(client: &Client, mango_group: Pubkey) -> anyhow::Result<()> { + let rpc_async = client.rpc_async(); + let group_context = MangoGroupContext::new_from_rpc(&rpc_async, mango_group).await?; + + let rpc_url = client.config().cluster.url().to_string(); + let ws_url = client.config().cluster.ws_url().to_string(); + + let slot = client.rpc_async().get_slot().await?; + let ts = chrono::Utc::now().timestamp() as u64; + + let extra_accounts = group_context + .tokens + .values() + .map(|value| value.oracle) + .chain(group_context.perp_markets.values().map(|p| p.oracle)) + .chain(group_context.tokens.values().flat_map(|value| value.vaults)) + .chain(group_context.address_lookup_tables.iter().copied()) + .unique() + .filter(|pk| *pk != Pubkey::default()) + .collect::>(); + + let serum_programs = group_context + .serum3_markets + .values() + .map(|s3| s3.serum_program) + .unique() + .collect_vec(); + + let (account_update_sender, account_update_receiver) = + async_channel::unbounded::(); + + // Sourcing account and slot data from solana via websockets + websocket_source::start( + websocket_source::Config { + rpc_ws_url: ws_url.clone(), + serum_programs, + open_orders_authority: mango_group, + }, + extra_accounts.clone(), + account_update_sender.clone(), + ); + + let first_websocket_slot = websocket_source::get_next_create_bank_slot( + account_update_receiver.clone(), + Duration::from_secs(10), + ) + .await?; + + // Getting solana account snapshots via jsonrpc + snapshot_source::start( + snapshot_source::Config { + rpc_http_url: rpc_url.clone(), + mango_group, + get_multiple_accounts_count: 100, + parallel_rpc_requests: 10, + snapshot_interval: Duration::from_secs(6000), + min_slot: first_websocket_slot + 10, + }, + extra_accounts, + account_update_sender, + ); + + let mut chain_data = chain_data::ChainData::new(); + + use account_update_stream::Message; + loop { + let message = account_update_receiver + .recv() + .await + .expect("channel not closed"); + + message.update_chain_data(&mut chain_data); + + match message { + Message::Account(_) => {} + Message::Snapshot(snapshot) => { + for slot in snapshot.iter().map(|a| a.slot).unique() { + chain_data.update_slot(chain_data::SlotData { + slot, + parent: None, + status: chain_data::SlotStatus::Rooted, + chain: 0, + }); + } + break; + } + _ => {} + } + } + + let group = &chain_data.account(&mango_group).unwrap().account.clone(); + let group = group.load::()?; + + let chain_data = Arc::new(RwLock::new(chain_data)); + + let account_fetcher = Arc::new(chain_data::AccountFetcher { + chain_data: chain_data.clone(), + rpc: client.new_rpc_async(), + }); + + for (key, data) in chain_data.read().unwrap().iter_accounts() { + if let Some(account) = is_mango_account(&data.account, &mango_group) { + // let dyn_part = account.dynamic.clone(); + // let dyn_part = RefCell::new(*dyn_part); + let fixed = account.fixed.clone(); + let fixed_cell = RefCell::new(fixed); + let mut account = DynamicAccount { + header: account.header, + fixed: fixed_cell.borrow_mut(), + dynamic: account.dynamic.iter().map(|x| *x).collect::>(), + }; + + let acc = account_fetcher.fetch_mango_account(key)?; + + let (health_remaining_ams, _) = group_context + .derive_health_check_remaining_account_metas( + &acc, + vec![], + vec![], + vec![], + HashMap::new(), + ) + .unwrap(); + + let mut remaining_accounts: Vec<_> = health_remaining_ams + .into_iter() + .map(|x| { + let xx = account_fetcher.fetch_raw(&x.pubkey).unwrap(); + TestAccount::new( + xx.data().iter().map(|x| *x).collect(), + x.pubkey, + *xx.owner(), + ) + }) + .collect(); + + let remaining_accounts = remaining_accounts + .iter_mut() + .map(|x| return x.as_account_info()) + .collect::>(); + + let mut out = HashMap::new(); + + // Act like it was never charged, but not initial call (0) + account.borrow_mut().fixed.last_collateral_fee_charge = 1; + + match token_charge_collateral_fees_internal( + account, + group, + remaining_accounts.as_slice(), + mango_group, + *key, + (ts, slot), + Some(&mut out), + ) { + Ok(_) => { + for (x, fee) in out { + println!( + "{} -> Token: {} => {} ({} $)", + key, + group_context.tokens.get(&x).unwrap().name, + fee.0 / 2, + fee.1 / 2 + ); + } + } + Err(e) => { + println!("{} -> Error: {:?}", key, e); + } + } + } + } + + Ok(()) +} + +#[derive(Clone)] +pub struct TestAccount { + pub bytes: Vec, + pub pubkey: Pubkey, + pub owner: Pubkey, + pub lamports: u64, +} + +impl TestAccount { + pub fn new(bytes: Vec, pubkey: Pubkey, owner: Pubkey) -> Self { + Self { + bytes, + owner, + pubkey, + lamports: 0, + } + } + + pub fn as_account_info(&mut self) -> AccountInfo { + AccountInfo { + key: &self.pubkey, + owner: &self.owner, + lamports: Rc::new(RefCell::new(&mut self.lamports)), + data: Rc::new(RefCell::new(&mut self.bytes)), + is_signer: false, + is_writable: false, + executable: false, + rent_epoch: 0, + } + } +} diff --git a/bin/cli/src/test_oracles.rs b/bin/cli/src/test_oracles.rs index 5b07bed05..d2a5afe2b 100644 --- a/bin/cli/src/test_oracles.rs +++ b/bin/cli/src/test_oracles.rs @@ -1,11 +1,11 @@ -use std::collections::HashMap; - use itertools::Itertools; use mango_v4::accounts_zerocopy::KeyedAccount; use mango_v4::state::OracleAccountInfos; use mango_v4_client::{Client, MangoGroupContext}; use solana_sdk::commitment_config::CommitmentConfig; use solana_sdk::pubkey::Pubkey; +use std::collections::HashMap; +use std::time::{SystemTime, UNIX_EPOCH}; use tracing::*; pub async fn run(client: &Client, group: Pubkey) -> anyhow::Result<()> { @@ -44,6 +44,7 @@ pub async fn run(client: &Client, group: Pubkey) -> anyhow::Result<()> { } let response = response.unwrap(); let slot = response.context.slot; + let now = SystemTime::now().duration_since(UNIX_EPOCH)?.as_secs(); let accounts = response.value; for (pubkey, account_opt) in oracles.iter().zip(accounts.into_iter()) { @@ -60,9 +61,10 @@ pub async fn run(client: &Client, group: Pubkey) -> anyhow::Result<()> { let perp_opt = perp_markets.get(pubkey); let mut price = None; if let Some(bank) = bank_opt { - match bank - .oracle_price(&OracleAccountInfos::from_reader(&keyed_account), Some(slot)) - { + match bank.oracle_price( + &OracleAccountInfos::from_reader(&keyed_account), + Some((now, slot)), + ) { Ok(p) => price = Some(p), Err(e) => { error!("could not read bank oracle {}: {e:?}", keyed_account.key); @@ -70,9 +72,10 @@ pub async fn run(client: &Client, group: Pubkey) -> anyhow::Result<()> { } } if let Some(perp) = perp_opt { - match perp - .oracle_price(&OracleAccountInfos::from_reader(&keyed_account), Some(slot)) - { + match perp.oracle_price( + &OracleAccountInfos::from_reader(&keyed_account), + Some((now, slot)), + ) { Ok(p) => price = Some(p), Err(e) => { error!("could not read perp oracle {}: {e:?}", keyed_account.key); diff --git a/bin/keeper/src/crank.rs b/bin/keeper/src/crank.rs index 9f4d7ae26..10c1c5a13 100644 --- a/bin/keeper/src/crank.rs +++ b/bin/keeper/src/crank.rs @@ -491,7 +491,7 @@ pub async fn loop_charge_collateral_fees( collateral_fee_interval, max_cu_when_batching, ) - .await + .await { Ok(()) => {} Err(err) => { @@ -559,7 +559,7 @@ async fn charge_collateral_fees_inner( &ix_to_send, max_cu_when_batching, ) - .await; + .await; info!("charge collateral fees: {:?}", txsigs); Ok(()) diff --git a/bin/liquidator/src/unwrappable_oracle_error.rs b/bin/liquidator/src/unwrappable_oracle_error.rs index f27340eea..0ab05fc38 100644 --- a/bin/liquidator/src/unwrappable_oracle_error.rs +++ b/bin/liquidator/src/unwrappable_oracle_error.rs @@ -74,6 +74,7 @@ mod tests { price: Default::default(), deviation: Default::default(), last_update_slot: 0, + last_update_time: None, oracle_type: OracleType::Pyth, }, &OracleConfig { diff --git a/lib/client/src/context.rs b/lib/client/src/context.rs index d8f4c5d3f..a141ea7e8 100644 --- a/lib/client/src/context.rs +++ b/lib/client/src/context.rs @@ -1,6 +1,6 @@ -use std::collections::HashMap; - use anchor_client::ClientError; +use std::collections::HashMap; +use std::time::SystemTime; use anchor_lang::__private::bytemuck; @@ -683,6 +683,10 @@ impl MangoGroupContext { .fetch_multiple_accounts(&oracle_keys) .await?; let now_slot = account_fetcher.get_slot().await?; + let now_ts = SystemTime::now() + .duration_since(SystemTime::UNIX_EPOCH) + .expect("system time after epoch start") + .as_secs(); let mut stale_oracles_with_fallbacks = vec![]; for (key, acc) in oracle_accounts { @@ -691,8 +695,10 @@ impl MangoGroupContext { &OracleAccountInfos::from_reader(&KeyedAccountSharedData::new(key, acc)), token.decimals, )?; - let oracle_is_valid = state - .check_confidence_and_maybe_staleness(&token.oracle_config, Some(now_slot)); + let oracle_is_valid = state.check_confidence_and_maybe_staleness( + &token.oracle_config, + Some((now_ts, now_slot)), + ); if oracle_is_valid.is_err() && token.fallback_context.key != Pubkey::default() { stale_oracles_with_fallbacks .push((token.oracle, token.fallback_context.clone())); diff --git a/lib/client/src/health_cache.rs b/lib/client/src/health_cache.rs index 47a176f54..8f666c0af 100644 --- a/lib/client/src/health_cache.rs +++ b/lib/client/src/health_cache.rs @@ -43,7 +43,7 @@ pub async fn new( n_perps: active_perp_len, begin_perp: active_token_len * 2, begin_serum3: active_token_len * 2 + active_perp_len * 2, - staleness_slot: None, + now: None, begin_fallback_oracles: metas.len(), usdc_oracle_index: metas .iter() @@ -88,7 +88,7 @@ pub fn new_sync( n_perps: active_perp_len, begin_perp: active_token_len * 2, begin_serum3: active_token_len * 2 + active_perp_len * 2, - staleness_slot: None, + now: None, begin_fallback_oracles: metas.len(), usdc_oracle_index: None, sol_oracle_index: None, diff --git a/mango_v4.json b/mango_v4.json index 5f39a7fbb..9acc3ee05 100644 --- a/mango_v4.json +++ b/mango_v4.json @@ -1,5 +1,5 @@ { - "version": "0.24.1", + "version": "0.24.2", "name": "mango_v4", "instructions": [ { @@ -11166,6 +11166,9 @@ }, { "name": "SwitchboardOnDemand" + }, + { + "name": "PythV2" } ] } diff --git a/package.json b/package.json index de7edc6a3..f5025c384 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "@iarna/toml": "2.2.5", "@project-serum/serum": "0.13.65", "@pythnetwork/client": "~2.14.0", + "@pythnetwork/pyth-solana-receiver": "^0.8.0", "@raydium-io/raydium-sdk": "^1.3.1-beta.57", "@solana/spl-token": "0.3.7", "@solana/web3.js": "^1.78.2", @@ -91,6 +92,5 @@ "**/cross-fetch/node-fetch": "npm:@blockworks-foundation/node-fetch@2.6.11", "**/@blockworks-foundation/mangolana/node-fetch": "npm:@blockworks-foundation/node-fetch@2.6.11" }, - "license": "MIT", - "packageManager": "yarn@4.3.1" + "license": "MIT" } diff --git a/programs/mango-v4/Cargo.toml b/programs/mango-v4/Cargo.toml index 3729e5524..bd5fd56d9 100644 --- a/programs/mango-v4/Cargo.toml +++ b/programs/mango-v4/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mango-v4" -version = "0.24.1" +version = "0.24.2" description = "Created with Anchor" edition = "2021" @@ -39,6 +39,7 @@ fixed = { workspace = true, features = [ ] } num_enum = "0.5.1" pyth-sdk-solana = { workspace = true } +pyth-solana-receiver-sdk = { workspace = true } serde = "^1.0" serum_dex = { workspace = true, features = ["no-entrypoint", "program"] } solana-address-lookup-table-program = { workspace = true } diff --git a/programs/mango-v4/resources/test/7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE.bin b/programs/mango-v4/resources/test/7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE.bin new file mode 100644 index 000000000..f4f7ba9e5 Binary files /dev/null and b/programs/mango-v4/resources/test/7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE.bin differ diff --git a/programs/mango-v4/src/health/account_retriever.rs b/programs/mango-v4/src/health/account_retriever.rs index c88764def..763111218 100644 --- a/programs/mango-v4/src/health/account_retriever.rs +++ b/programs/mango-v4/src/health/account_retriever.rs @@ -61,7 +61,7 @@ pub struct FixedOrderAccountRetriever { pub n_perps: usize, pub begin_perp: usize, pub begin_serum3: usize, - pub staleness_slot: Option, + pub now: Option<(u64, u64)>, pub begin_fallback_oracles: usize, pub usdc_oracle_index: Option, pub sol_oracle_index: Option, @@ -74,7 +74,7 @@ pub struct FixedOrderAccountRetriever { pub fn new_fixed_order_account_retriever<'a, 'info>( ais: &'a [AccountInfo<'info>], account: &MangoAccountRef, - now_slot: u64, + now: (u64, u64), ) -> Result>> { let active_token_len = account.active_token_positions().count(); @@ -83,7 +83,7 @@ pub fn new_fixed_order_account_retriever<'a, 'info>( ai.load::()?; } - new_fixed_order_account_retriever_inner(ais, account, now_slot, active_token_len) + new_fixed_order_account_retriever_inner(ais, account, now, active_token_len) } /// A FixedOrderAccountRetriever with n_banks <= active_token_positions().count(), @@ -94,7 +94,7 @@ pub fn new_fixed_order_account_retriever<'a, 'info>( pub fn new_fixed_order_account_retriever_with_optional_banks<'a, 'info>( ais: &'a [AccountInfo<'info>], account: &MangoAccountRef, - now_slot: u64, + now: (u64, u64), ) -> Result>> { // Scan for the number of banks provided let mut n_banks = 0; @@ -110,13 +110,13 @@ pub fn new_fixed_order_account_retriever_with_optional_banks<'a, 'info>( let active_token_len = account.active_token_positions().count(); require_gte!(active_token_len, n_banks); - new_fixed_order_account_retriever_inner(ais, account, now_slot, n_banks) + new_fixed_order_account_retriever_inner(ais, account, now, n_banks) } pub fn new_fixed_order_account_retriever_inner<'a, 'info>( ais: &'a [AccountInfo<'info>], account: &MangoAccountRef, - now_slot: u64, + now: (u64, u64), n_banks: usize, ) -> Result>> { let active_serum3_len = account.active_serum3_orders().count(); @@ -142,7 +142,7 @@ pub fn new_fixed_order_account_retriever_inner<'a, 'info>( n_perps: active_perp_len, begin_perp: n_banks * 2, begin_serum3: n_banks * 2 + active_perp_len * 2, - staleness_slot: Some(now_slot), + now: Some(now), begin_fallback_oracles: expected_ais, usdc_oracle_index, sol_oracle_index, @@ -190,7 +190,7 @@ impl FixedOrderAccountRetriever { fn oracle_price_perp(&self, account_index: usize, perp_market: &PerpMarket) -> Result { let oracle = &self.ais[account_index]; let oracle_acc_infos = OracleAccountInfos::from_reader(oracle); - perp_market.oracle_price(&oracle_acc_infos, self.staleness_slot) + perp_market.oracle_price(&oracle_acc_infos, self.now) } #[inline(always)] @@ -234,7 +234,7 @@ impl AccountRetriever for FixedOrderAccountRetriever { let oracle_index = self.n_banks + bank_account_index; let oracle_acc_infos = &self.create_oracle_infos(oracle_index, &bank.fallback_oracle); - let oracle_price_result = bank.oracle_price(oracle_acc_infos, self.staleness_slot); + let oracle_price_result = bank.oracle_price(oracle_acc_infos, self.now); let oracle_price = oracle_price_result.with_context(|| { format!( "getting oracle for bank with health account index {} and token index {}, passed account {}", @@ -299,7 +299,7 @@ pub struct ScannedBanksAndOracles<'a, 'info> { oracles: Vec>, fallback_oracles: Vec>, index_map: HashMap, - staleness_slot: Option, + staleness_slot: Option<(u64, u64)>, /// index in fallback_oracles usd_oracle_index: Option, /// index in fallback_oracles @@ -432,13 +432,17 @@ fn can_load_as<'a, T: ZeroCopy + Owner>( impl<'a, 'info> ScanningAccountRetriever<'a, 'info> { pub fn new(ais: &'a [AccountInfo<'info>], group: &Pubkey) -> Result { - Self::new_with_staleness(ais, group, Some(Clock::get()?.slot)) + Self::new_with_staleness( + ais, + group, + Some(Clock::get().map(|c| (c.unix_timestamp as u64, c.slot as u64))?), + ) } pub fn new_with_staleness( ais: &'a [AccountInfo<'info>], group: &Pubkey, - staleness_slot: Option, + staleness_slot: Option<(u64, u64)>, ) -> Result { // find all Bank accounts let mut token_index_map = HashMap::with_capacity(ais.len() / 2); @@ -755,9 +759,12 @@ mod tests { perp1.as_account_info(), oracle2_clone.as_account_info(), ]; - let retriever = - new_fixed_order_account_retriever_with_optional_banks(&ais, &account.borrow(), 0) - .unwrap(); + let retriever = new_fixed_order_account_retriever_with_optional_banks( + &ais, + &account.borrow(), + (0, 0), + ) + .unwrap(); assert_eq!(retriever.available_banks(), Ok(vec![10, 20, 30])); let (i, bank) = retriever.bank(&group, 0, 10).unwrap(); @@ -785,9 +792,12 @@ mod tests { perp1.as_account_info(), oracle2_clone.as_account_info(), ]; - let retriever = - new_fixed_order_account_retriever_with_optional_banks(&ais, &account.borrow(), 0) - .unwrap(); + let retriever = new_fixed_order_account_retriever_with_optional_banks( + &ais, + &account.borrow(), + (0, 0), + ) + .unwrap(); assert_eq!(retriever.available_banks(), Ok(vec![10, 30])); let (i, bank) = retriever.bank(&group, 0, 10).unwrap(); @@ -806,9 +816,12 @@ mod tests { // skip all { let ais = vec![perp1.as_account_info(), oracle2_clone.as_account_info()]; - let retriever = - new_fixed_order_account_retriever_with_optional_banks(&ais, &account.borrow(), 0) - .unwrap(); + let retriever = new_fixed_order_account_retriever_with_optional_banks( + &ais, + &account.borrow(), + (0, 0), + ) + .unwrap(); assert_eq!(retriever.available_banks(), Ok(vec![])); assert!(retriever.bank(&group, 0, 10).is_err()); diff --git a/programs/mango-v4/src/health/cache.rs b/programs/mango-v4/src/health/cache.rs index 21f8cf289..5c92525b8 100644 --- a/programs/mango-v4/src/health/cache.rs +++ b/programs/mango-v4/src/health/cache.rs @@ -96,7 +96,11 @@ pub fn compute_health_from_fixed_accounts( ais: &[AccountInfo], now_ts: u64, ) -> Result { - let retriever = new_fixed_order_account_retriever(ais, account, Clock::get()?.slot)?; + let retriever = new_fixed_order_account_retriever( + ais, + account, + Clock::get().map(|c| (c.unix_timestamp as u64, c.slot as u64))?, + )?; Ok(new_health_cache(account, &retriever, now_ts)?.health(health_type)) } @@ -2007,7 +2011,7 @@ mod tests { let retriever = new_fixed_order_account_retriever_with_optional_banks( &ais, &account.borrow(), - 0, + (0, 0), ) .unwrap(); new_health_cache_skipping_missing_banks_and_bad_oracles( diff --git a/programs/mango-v4/src/instructions/account_buyback_fees_with_mngo.rs b/programs/mango-v4/src/instructions/account_buyback_fees_with_mngo.rs index f876fd470..75c7d24cd 100644 --- a/programs/mango-v4/src/instructions/account_buyback_fees_with_mngo.rs +++ b/programs/mango-v4/src/instructions/account_buyback_fees_with_mngo.rs @@ -41,14 +41,14 @@ pub fn account_buyback_fees_with_mngo( let mngo_oracle_ref = &AccountInfoRef::borrow(&ctx.accounts.mngo_oracle.as_ref())?; let mngo_oracle_price = mngo_bank.oracle_price( &OracleAccountInfos::from_reader(mngo_oracle_ref), - Some(slot), + Some((now_ts, slot)), )?; let mngo_asset_price = mngo_oracle_price.min(mngo_bank.stable_price()); let fees_oracle_ref = &AccountInfoRef::borrow(&ctx.accounts.fees_oracle.as_ref())?; let fees_oracle_price = fees_bank.oracle_price( &OracleAccountInfos::from_reader(fees_oracle_ref), - Some(slot), + Some((now_ts, slot)), )?; let fees_liab_price = fees_oracle_price.max(fees_bank.stable_price()); diff --git a/programs/mango-v4/src/instructions/flash_loan.rs b/programs/mango-v4/src/instructions/flash_loan.rs index 09defac67..1d6705999 100644 --- a/programs/mango-v4/src/instructions/flash_loan.rs +++ b/programs/mango-v4/src/instructions/flash_loan.rs @@ -394,7 +394,7 @@ pub fn flash_loan_end<'key, 'accounts, 'remaining, 'info>( let retriever = new_fixed_order_account_retriever_with_optional_banks( health_ais, &account.borrow(), - now_slot, + (now_ts, now_slot), )?; let health_cache = new_health_cache_skipping_missing_banks_and_bad_oracles( &account.borrow(), @@ -523,7 +523,7 @@ pub fn flash_loan_end<'key, 'accounts, 'remaining, 'info>( let retriever = new_fixed_order_account_retriever_with_optional_banks( health_ais, &account.borrow(), - now_slot, + (now_ts, now_slot), )?; let health_cache = new_health_cache_skipping_missing_banks_and_bad_oracles( &account.borrow(), diff --git a/programs/mango-v4/src/instructions/perp_force_close_position.rs b/programs/mango-v4/src/instructions/perp_force_close_position.rs index 494136dc0..1f4aa13bb 100644 --- a/programs/mango-v4/src/instructions/perp_force_close_position.rs +++ b/programs/mango-v4/src/instructions/perp_force_close_position.rs @@ -33,10 +33,13 @@ pub fn perp_force_close_position(ctx: Context) -> Result .base_position_lots() .min(account_b_perp_position.base_position_lots().abs()) .max(0); - let now_slot = Clock::get()?.slot; + let clock = Clock::get()?; + let (now_ts, now_slot) = (clock.unix_timestamp as u64, clock.slot); let oracle_ref = &AccountInfoRef::borrow(ctx.accounts.oracle.as_ref())?; - let oracle_price = - perp_market.oracle_price(&OracleAccountInfos::from_reader(oracle_ref), Some(now_slot))?; + let oracle_price = perp_market.oracle_price( + &OracleAccountInfos::from_reader(oracle_ref), + Some((now_ts, now_slot)), + )?; let quote_transfer = I80F48::from(base_transfer * perp_market.base_lot_size) * oracle_price; account_a_perp_position.record_trade(&mut perp_market, -base_transfer, quote_transfer); diff --git a/programs/mango-v4/src/instructions/perp_liq_force_cancel_orders.rs b/programs/mango-v4/src/instructions/perp_liq_force_cancel_orders.rs index 37bfdc6d5..8d4637e36 100644 --- a/programs/mango-v4/src/instructions/perp_liq_force_cancel_orders.rs +++ b/programs/mango-v4/src/instructions/perp_liq_force_cancel_orders.rs @@ -14,8 +14,11 @@ pub fn perp_liq_force_cancel_orders( let (now_ts, now_slot) = clock_now(); let mut health_cache = { - let retriever = - new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow(), now_slot)?; + let retriever = new_fixed_order_account_retriever( + ctx.remaining_accounts, + &account.borrow(), + (now_ts, now_slot), + )?; new_health_cache(&account.borrow(), &retriever, now_ts).context("create health cache")? }; diff --git a/programs/mango-v4/src/instructions/perp_liq_negative_pnl_or_bankruptcy.rs b/programs/mango-v4/src/instructions/perp_liq_negative_pnl_or_bankruptcy.rs index 49b8416f9..604310a33 100644 --- a/programs/mango-v4/src/instructions/perp_liq_negative_pnl_or_bankruptcy.rs +++ b/programs/mango-v4/src/instructions/perp_liq_negative_pnl_or_bankruptcy.rs @@ -34,14 +34,16 @@ pub fn perp_liq_negative_pnl_or_bankruptcy( perp_market_index = perp_market.perp_market_index; settle_token_index = perp_market.settle_token_index; let oracle_ref = &AccountInfoRef::borrow(ctx.accounts.oracle.as_ref())?; - perp_oracle_price = perp_market - .oracle_price(&OracleAccountInfos::from_reader(oracle_ref), Some(now_slot))?; + perp_oracle_price = perp_market.oracle_price( + &OracleAccountInfos::from_reader(oracle_ref), + Some((now_ts, now_slot)), + )?; let settle_bank = ctx.accounts.settle_bank.load()?; let settle_oracle_ref = &AccountInfoRef::borrow(ctx.accounts.settle_oracle.as_ref())?; settle_token_oracle_price = settle_bank.oracle_price( &OracleAccountInfos::from_reader(settle_oracle_ref), - Some(now_slot), + Some((now_ts, now_slot)), )?; drop(settle_bank); // could be the same as insurance_bank @@ -51,7 +53,7 @@ pub fn perp_liq_negative_pnl_or_bankruptcy( // the liqee isn't guaranteed to have an insurance fund token position. insurance_token_oracle_price = insurance_bank.oracle_price( &OracleAccountInfos::from_reader(insurance_oracle_ref), - Some(now_slot), + Some((now_ts, now_slot)), )?; } diff --git a/programs/mango-v4/src/instructions/perp_place_order.rs b/programs/mango-v4/src/instructions/perp_place_order.rs index 36e3b9579..6d96687d7 100644 --- a/programs/mango-v4/src/instructions/perp_place_order.rs +++ b/programs/mango-v4/src/instructions/perp_place_order.rs @@ -70,7 +70,7 @@ pub fn perp_place_order( let retriever = new_fixed_order_account_retriever_with_optional_banks( ctx.remaining_accounts, &account.borrow(), - now_slot, + (now_ts, now_slot), )?; let health_cache = new_health_cache_skipping_missing_banks_and_bad_oracles( &account.borrow(), diff --git a/programs/mango-v4/src/instructions/perp_settle_fees.rs b/programs/mango-v4/src/instructions/perp_settle_fees.rs index 627f484c5..87449f55d 100644 --- a/programs/mango-v4/src/instructions/perp_settle_fees.rs +++ b/programs/mango-v4/src/instructions/perp_settle_fees.rs @@ -125,8 +125,11 @@ pub fn perp_settle_fees(ctx: Context, max_settle_amount: u64) -> // Verify that the result of settling did not violate the health of the account that lost money let (now_ts, now_slot) = clock_now(); - let retriever = - new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow(), now_slot)?; + let retriever = new_fixed_order_account_retriever( + ctx.remaining_accounts, + &account.borrow(), + (now_ts, now_slot), + )?; let health = compute_health(&account.borrow(), HealthType::Init, &retriever, now_ts)?; require!(health >= 0, MangoError::HealthMustBePositive); diff --git a/programs/mango-v4/src/instructions/perp_update_funding.rs b/programs/mango-v4/src/instructions/perp_update_funding.rs index 890864c22..a83eacba0 100644 --- a/programs/mango-v4/src/instructions/perp_update_funding.rs +++ b/programs/mango-v4/src/instructions/perp_update_funding.rs @@ -15,8 +15,10 @@ pub fn perp_update_funding(ctx: Context) -> Result<()> { let now_slot = Clock::get()?.slot; let oracle_ref = &AccountInfoRef::borrow(ctx.accounts.oracle.as_ref())?; - let oracle_state = - perp_market.oracle_state(&OracleAccountInfos::from_reader(oracle_ref), Some(now_slot))?; + let oracle_state = perp_market.oracle_state( + &OracleAccountInfos::from_reader(oracle_ref), + Some((now_ts, now_slot)), + )?; perp_market.update_funding_and_stable_price(&book, &oracle_state, now_ts)?; diff --git a/programs/mango-v4/src/instructions/serum3_liq_force_cancel_orders.rs b/programs/mango-v4/src/instructions/serum3_liq_force_cancel_orders.rs index 5a508b183..269698c77 100644 --- a/programs/mango-v4/src/instructions/serum3_liq_force_cancel_orders.rs +++ b/programs/mango-v4/src/instructions/serum3_liq_force_cancel_orders.rs @@ -58,8 +58,11 @@ pub fn serum3_liq_force_cancel_orders( // let mut health_cache = { let mut account = ctx.accounts.account.load_full_mut()?; - let retriever = - new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow(), now_slot)?; + let retriever = new_fixed_order_account_retriever( + ctx.remaining_accounts, + &account.borrow(), + (now_ts, now_slot), + )?; let health_cache = new_health_cache(&account.borrow(), &retriever, now_ts) .context("create health cache")?; diff --git a/programs/mango-v4/src/instructions/serum3_place_order.rs b/programs/mango-v4/src/instructions/serum3_place_order.rs index 80d43fb18..b51daf73d 100644 --- a/programs/mango-v4/src/instructions/serum3_place_order.rs +++ b/programs/mango-v4/src/instructions/serum3_place_order.rs @@ -82,7 +82,7 @@ pub fn serum3_place_order( let retriever = new_fixed_order_account_retriever_with_optional_banks( ctx.remaining_accounts, &account.borrow(), - now_slot, + (now_ts, now_slot), )?; let mut health_cache = new_health_cache_skipping_missing_banks_and_bad_oracles( &account.borrow(), @@ -610,7 +610,7 @@ pub fn apply_settle_changes( let quote_oracle_ref = &AccountInfoRef::borrow(quote_oracle_ai)?; let quote_oracle_price = quote_bank.oracle_price( &OracleAccountInfos::from_reader(quote_oracle_ref), - Some(clock.slot), + Some((now_ts, clock.slot)), )?; let quote_asset_price = quote_oracle_price.min(quote_bank.stable_price()); account diff --git a/programs/mango-v4/src/instructions/serum3_settle_funds.rs b/programs/mango-v4/src/instructions/serum3_settle_funds.rs index 761b43d72..2689895fc 100644 --- a/programs/mango-v4/src/instructions/serum3_settle_funds.rs +++ b/programs/mango-v4/src/instructions/serum3_settle_funds.rs @@ -188,7 +188,7 @@ pub fn charge_loan_origination_fees( let ai_ref = &AccountInfoRef::borrow(ai)?; base_bank.oracle_price( &OracleAccountInfos::from_reader(ai_ref), - Some(Clock::get()?.slot), + Some(Clock::get().map(|c| (c.unix_timestamp as u64, c.slot as u64))?), ) }) .transpose()?; @@ -228,7 +228,7 @@ pub fn charge_loan_origination_fees( let ai_ref = &AccountInfoRef::borrow(ai)?; quote_bank.oracle_price( &OracleAccountInfos::from_reader(ai_ref), - Some(Clock::get()?.slot), + Some(Clock::get().map(|c| (c.unix_timestamp as u64, c.slot as u64))?), ) }) .transpose()?; diff --git a/programs/mango-v4/src/instructions/token_charge_collateral_fees.rs b/programs/mango-v4/src/instructions/token_charge_collateral_fees.rs index 944c2722d..acf435b05 100644 --- a/programs/mango-v4/src/instructions/token_charge_collateral_fees.rs +++ b/programs/mango-v4/src/instructions/token_charge_collateral_fees.rs @@ -4,14 +4,40 @@ use crate::state::*; use crate::util::clock_now; use anchor_lang::prelude::*; use fixed::types::I80F48; +use std::collections::HashMap; +use std::ops::{Deref, Div}; use crate::accounts_ix::*; use crate::logs::{emit_stack, TokenBalanceLog, TokenCollateralFeeLog}; pub fn token_charge_collateral_fees(ctx: Context) -> Result<()> { - let group = ctx.accounts.group.load()?; - let mut account = ctx.accounts.account.load_full_mut()?; - let (now_ts, now_slot) = clock_now(); + token_charge_collateral_fees_internal( + ctx.accounts.account.load_full_mut()?, + ctx.accounts.group.load()?.deref(), + &ctx.remaining_accounts, + ctx.accounts.group.key(), + ctx.accounts.account.key(), + clock_now(), + None, + ) +} + +pub fn token_charge_collateral_fees_internal( + mut account: DynamicAccount, + group: &Group, + remaining_accounts: &[AccountInfo], + group_key: Pubkey, + account_key: Pubkey, + now: (u64, u64), + mut out_fees: Option<&mut HashMap>, +) -> Result<()> +where + Header: DerefOrBorrowMut + DerefOrBorrow, + Fixed: DerefOrBorrowMut + DerefOrBorrow, + Dynamic: DerefOrBorrowMut<[u8]> + DerefOrBorrow<[u8]>, +{ + let mut account = account.borrow_mut(); + let (now_ts, now_slot) = now; if group.collateral_fee_interval == 0 { // By resetting, a new enabling of collateral fees will not immediately create a charge @@ -42,11 +68,21 @@ pub fn token_charge_collateral_fees(ctx: Context) -> let time_scaling = I80F48::from(charge_seconds) * inv_seconds_per_day; let health_cache = { - let retriever = - new_fixed_order_account_retriever(ctx.remaining_accounts, &account.borrow(), now_slot)?; + let retriever = new_fixed_order_account_retriever( + remaining_accounts, + &account.borrow(), + (now_ts, now_slot), + )?; new_health_cache(&account.borrow(), &retriever, now_ts)? }; + let (_, liabs) = health_cache.assets_and_liabs(); + // Account with liabs below ~100$ should not be charged any collateral fees + if liabs < 100_000_000 { + // msg!("liabs {}, below threshold to charge collateral fees", liabs); + return Ok(()); + } + // We want to find the total asset health and total liab health, but don't want // to treat borrows that moved into open orders accounts as realized. Hence we // pretend all spot orders are closed and settled and add their funds back to @@ -80,15 +116,21 @@ pub fn token_charge_collateral_fees(ctx: Context) -> let scaling = asset_usage_scaling * time_scaling; + let mut total_collateral_fees_in_usd = I80F48::ZERO; + let token_position_count = account.active_token_positions().count(); - for bank_ai in &ctx.remaining_accounts[0..token_position_count] { + for bank_ai in &remaining_accounts[0..token_position_count] { let mut bank = bank_ai.load_mut::()?; if bank.collateral_fee_per_day <= 0.0 || bank.maint_asset_weight.is_zero() { continue; } - let (token_position, raw_token_index) = account.token_position_mut(bank.token_index)?; - let token_balance = token_position.native(&bank); + let token_index_in_health_cache = health_cache + .token_infos + .iter() + .position(|x| x.token_index == bank.token_index) + .expect("missing token in health"); + let token_balance = token_balances[token_index_in_health_cache].spot_and_perp; if token_balance <= 0 { continue; } @@ -96,29 +138,66 @@ pub fn token_charge_collateral_fees(ctx: Context) -> let fee = token_balance * scaling * I80F48::from_num(bank.collateral_fee_per_day); assert!(fee <= token_balance); - let is_active = bank.withdraw_without_fee(token_position, fee, now_ts)?; - if !is_active { - account.deactivate_token_position_and_log(raw_token_index, ctx.accounts.account.key()); - } + let token_info = health_cache.token_info(bank.token_index)?; + + total_collateral_fees_in_usd += fee * token_info.prices.oracle; - bank.collected_fees_native += fee; bank.collected_collateral_fees += fee; - let token_info = health_cache.token_info(bank.token_index)?; - let token_position = account.token_position(bank.token_index)?; - emit_stack(TokenCollateralFeeLog { - mango_group: ctx.accounts.group.key(), - mango_account: ctx.accounts.account.key(), + mango_group: group_key, + mango_account: account_key, token_index: bank.token_index, fee: fee.to_bits(), asset_usage_fraction: asset_usage_scaling.to_bits(), price: token_info.prices.oracle.to_bits(), }); + } + + for bank_ai in &remaining_accounts[0..token_position_count] { + let mut bank = bank_ai.load_mut::()?; + + let token_info = health_cache.token_info(bank.token_index)?; + + let token_index_in_health_cache = health_cache + .token_infos + .iter() + .position(|x| x.token_index == bank.token_index) + .expect("missing token in health"); + + let token_balance = token_balances[token_index_in_health_cache].spot_and_perp; + let health = token_info.health_contribution(HealthType::Maint, token_balance); + + if health >= 0 { + continue; + } + + let (token_position, raw_token_index) = account.token_position_mut(bank.token_index)?; + + let borrow_scaling = (health / total_liab_health).abs(); + let fee = borrow_scaling * total_collateral_fees_in_usd / token_info.prices.oracle; + + if let Some(ref mut output) = out_fees { + output.insert( + token_info.token_index, + ( + fee, + (fee * token_info.prices.oracle).div(I80F48::from_num(1_000_000)), + ), + ); + } + + let is_active = bank.withdraw_without_fee(token_position, fee, now_ts)?; + if !is_active { + account.deactivate_token_position_and_log(raw_token_index, account_key); + } + + bank.collected_fees_native += fee; + let token_position = account.token_position(bank.token_index)?; emit_stack(TokenBalanceLog { - mango_group: ctx.accounts.group.key(), - mango_account: ctx.accounts.account.key(), + mango_group: group_key, + mango_account: account_key, token_index: bank.token_index, indexed_position: token_position.indexed_position.to_bits(), deposit_index: bank.deposit_index.to_bits(), diff --git a/programs/mango-v4/src/instructions/token_deposit.rs b/programs/mango-v4/src/instructions/token_deposit.rs index 1155cd7d9..8acf4d4d9 100644 --- a/programs/mango-v4/src/instructions/token_deposit.rs +++ b/programs/mango-v4/src/instructions/token_deposit.rs @@ -124,7 +124,7 @@ impl<'a, 'info> DepositCommon<'a, 'info> { let retriever = new_fixed_order_account_retriever_with_optional_banks( remaining_accounts, &account.borrow(), - now_slot, + (now_ts, now_slot), )?; // We only compute health to check if the account leaves the being_liquidated state. @@ -208,12 +208,15 @@ pub fn token_deposit(ctx: Context, amount: u64, reduce_only: bool) // Activating a new token position requires that the oracle is in a good state. // Otherwise users could abuse oracle staleness to delay liquidation. if !token_position_exists { - let now_slot = Clock::get()?.slot; + let (now_ts, now_slot) = + Clock::get().map(|c| (c.unix_timestamp as u64, c.slot as u64))?; let bank = ctx.accounts.bank.load()?; let oracle_ref = &AccountInfoRef::borrow(ctx.accounts.oracle.as_ref())?; - let oracle_result = - bank.oracle_price(&OracleAccountInfos::from_reader(oracle_ref), Some(now_slot)); + let oracle_result = bank.oracle_price( + &OracleAccountInfos::from_reader(oracle_ref), + Some((now_ts, now_slot)), + ); if let Err(e) = oracle_result { msg!("oracle must be valid when creating a new token position"); return Err(e); diff --git a/programs/mango-v4/src/instructions/token_update_index_and_rate.rs b/programs/mango-v4/src/instructions/token_update_index_and_rate.rs index 6df830b34..c2ba89b32 100644 --- a/programs/mango-v4/src/instructions/token_update_index_and_rate.rs +++ b/programs/mango-v4/src/instructions/token_update_index_and_rate.rs @@ -40,9 +40,11 @@ pub fn token_update_index_and_rate( // 2. we want to forbid cpi, since ix we would like to blacklist could just be called from cpi require!( (ix.program_id == crate::id() - && ix.data[0..8] - == crate::instruction::TokenUpdateIndexAndRate::discriminator()) - || (ix.program_id == compute_budget::id()), + && (ix.data[0..8] + == crate::instruction::TokenUpdateIndexAndRate::discriminator() + || ix.data[0..8] + == crate::instruction::TokenUpdateIndexAndRateResilient::discriminator( + ))) || (ix.program_id == compute_budget::id()), MangoError::SomeError ); @@ -77,7 +79,7 @@ pub fn token_update_index_and_rate( let oracle_ref = &AccountInfoRef::borrow(ctx.accounts.oracle.as_ref())?; let price = some_bank.oracle_price( &OracleAccountInfos::from_reader(oracle_ref), - Some(clock.slot), + Some((clock.unix_timestamp as u64, clock.slot)), ); // Early exit if oracle is invalid diff --git a/programs/mango-v4/src/instructions/token_withdraw.rs b/programs/mango-v4/src/instructions/token_withdraw.rs index cf0dfbc36..eb3161c9e 100644 --- a/programs/mango-v4/src/instructions/token_withdraw.rs +++ b/programs/mango-v4/src/instructions/token_withdraw.rs @@ -31,7 +31,7 @@ pub fn token_withdraw(ctx: Context, amount: u64, allow_borrow: bo let retriever = new_fixed_order_account_retriever_with_optional_banks( ctx.remaining_accounts, &account.borrow(), - now_slot, + (now_ts, now_slot), )?; let health_cache = new_health_cache_skipping_missing_banks_and_bad_oracles( &account.borrow(), @@ -217,15 +217,15 @@ pub fn token_withdraw(ctx: Context, amount: u64, allow_borrow: bo // When borrowing the price has be trustworthy, so we can do a reasonable // net borrow check. - let slot_opt = Some(Clock::get()?.slot); + let now_opt = Some(Clock::get().map(|c| (c.unix_timestamp as u64, c.slot as u64))?); unsafe_oracle_state - .check_confidence_and_maybe_staleness(&bank.oracle_config, slot_opt) + .check_confidence_and_maybe_staleness(&bank.oracle_config, now_opt) .with_context(|| { oracle_log_context( bank.name(), &unsafe_oracle_state, &bank.oracle_config, - slot_opt, + now_opt, ) })?; bank.check_net_borrows(unsafe_oracle_state.price)?; diff --git a/programs/mango-v4/src/state/bank.rs b/programs/mango-v4/src/state/bank.rs index cfc6aea3d..40d889bbb 100644 --- a/programs/mango-v4/src/state/bank.rs +++ b/programs/mango-v4/src/state/bank.rs @@ -1184,45 +1184,30 @@ impl Bank { pub fn oracle_price( &self, oracle_acc_infos: &OracleAccountInfos, - staleness_slot: Option, + now: Option<(u64, u64)>, // (now_ts, now_slot) ) -> Result { require_keys_eq!(self.oracle, *oracle_acc_infos.oracle.key()); let primary_state = oracle::oracle_state_unchecked(oracle_acc_infos, self.mint_decimals)?; let primary_ok = - primary_state.check_confidence_and_maybe_staleness(&self.oracle_config, staleness_slot); + primary_state.check_confidence_and_maybe_staleness(&self.oracle_config, now); if primary_ok.is_oracle_error() && oracle_acc_infos.fallback_opt.is_some() { let fallback_oracle_acc = oracle_acc_infos.fallback_opt.unwrap(); require_keys_eq!(self.fallback_oracle, *fallback_oracle_acc.key()); let fallback_state = oracle::fallback_oracle_state_unchecked(&oracle_acc_infos, self.mint_decimals)?; - let fallback_ok = fallback_state - .check_confidence_and_maybe_staleness(&self.oracle_config, staleness_slot); + let fallback_ok = + fallback_state.check_confidence_and_maybe_staleness(&self.oracle_config, now); fallback_ok.with_context(|| { format!( "{} {}", - oracle_log_context( - self.name(), - &primary_state, - &self.oracle_config, - staleness_slot - ), - oracle_log_context( - self.name(), - &fallback_state, - &self.oracle_config, - staleness_slot - ) + oracle_log_context(self.name(), &primary_state, &self.oracle_config, now), + oracle_log_context(self.name(), &fallback_state, &self.oracle_config, now) ) })?; Ok(fallback_state.price) } else { primary_ok.with_context(|| { - oracle_log_context( - self.name(), - &primary_state, - &self.oracle_config, - staleness_slot, - ) + oracle_log_context(self.name(), &primary_state, &self.oracle_config, now) })?; Ok(primary_state.price) } diff --git a/programs/mango-v4/src/state/oracle.rs b/programs/mango-v4/src/state/oracle.rs index 34d55b688..c7e24c772 100644 --- a/programs/mango-v4/src/state/oracle.rs +++ b/programs/mango-v4/src/state/oracle.rs @@ -1,5 +1,6 @@ use std::mem::size_of; +use super::{load_raydium_pool_state, orca_mainnet_whirlpool, raydium_mainnet}; use crate::accounts_zerocopy::*; use crate::error::*; use crate::state::load_orca_pool_state; @@ -7,13 +8,12 @@ use anchor_lang::prelude::*; use anchor_lang::{AnchorDeserialize, Discriminator}; use derivative::Derivative; use fixed::types::I80F48; +use pyth_solana_receiver_sdk::price_update::VerificationLevel; use static_assertions::const_assert_eq; use switchboard_on_demand::PullFeedAccountData; use switchboard_program::FastRoundResultAccountData; use switchboard_v2::AggregatorAccountData; -use super::{load_raydium_pool_state, orca_mainnet_whirlpool, raydium_mainnet}; - const DECIMAL_CONSTANT_ZERO_INDEX: i8 = 12; const DECIMAL_CONSTANTS: [I80F48; 25] = [ I80F48::from_bits((1 << 48) / 10i128.pow(12u32)), @@ -126,12 +126,14 @@ pub enum OracleType { OrcaCLMM, RaydiumCLMM, SwitchboardOnDemand, + PythV2, } pub struct OracleState { pub price: I80F48, pub deviation: I80F48, pub last_update_slot: u64, + pub last_update_time: Option, pub oracle_type: OracleType, } @@ -140,23 +142,41 @@ impl OracleState { pub fn check_confidence_and_maybe_staleness( &self, config: &OracleConfig, - staleness_slot: Option, + now: Option<(u64, u64)>, // (now_ts, now_slot) ) -> Result<()> { - if let Some(now_slot) = staleness_slot { - self.check_staleness(config, now_slot)?; + if let Some((now_ts, now_slot)) = now { + self.check_staleness(config, now_slot, now_ts)?; } self.check_confidence(config) } - pub fn check_staleness(&self, config: &OracleConfig, now_slot: u64) -> Result<()> { - if config.max_staleness_slots >= 0 - && self - .last_update_slot - .saturating_add(config.max_staleness_slots as u64) - < now_slot + pub fn check_staleness(&self, config: &OracleConfig, now_slot: u64, now_ts: u64) -> Result<()> { + if config.max_staleness_slots < 0 { + return Ok(()); + } + + if self + .last_update_slot + .saturating_add(config.max_staleness_slots as u64) + < now_slot { return Err(MangoError::OracleStale.into()); } + + if self.last_update_time.is_some() { + let current_time_in_msecs = now_ts * 1000; + let last_update_time_in_msecs = self.last_update_time.unwrap() * 1000; + let max_acceptable_update_age_in_ms = (config.max_staleness_slots as u64) * 450; + + let oldest_acceptable_time = + current_time_in_msecs.saturating_sub(max_acceptable_update_age_in_ms); + + if last_update_time_in_msecs < oldest_acceptable_time { + msg!("Oracle stale (using time fallback method: current time: {} vs published time: {})", current_time_in_msecs, last_update_time_in_msecs); + return Err(MangoError::OracleStale.into()); + } + } + Ok(()) } @@ -210,6 +230,8 @@ pub fn determine_oracle_type(acc_info: &impl KeyedAccountReader) -> Result Result { + let mut data = acc_info.data(); + data = &data[8..]; + let price_account = + pyth_solana_receiver_sdk::price_update::PriceUpdateV2::deserialize(&mut data).unwrap(); + if price_account.verification_level != VerificationLevel::Full { + return Err(MangoError::OracleConfidence.into()); + } + + let decimals = + (price_account.price_message.exponent as i8) + QUOTE_DECIMALS - (base_decimals as i8); + let decimal_adj = power_of_ten(decimals); + let price = I80F48::from_num(price_account.price_message.price) * decimal_adj; + let deviation = I80F48::from_num(price_account.price_message.conf) * decimal_adj; + let last_update_slot = price_account.posted_slot; + + let price_timestamp = price_account.price_message.publish_time; + + require_gte!(price, 0); + Ok(OracleState { + price, + last_update_slot, + deviation, + oracle_type: OracleType::PythV2, + last_update_time: Some(price_timestamp as u64), }) } @@ -366,9 +420,11 @@ fn oracle_state_unchecked_inner( last_update_slot, deviation, oracle_type: OracleType::Stub, + last_update_time: None, } } OracleType::Pyth => get_pyth_state(oracle_info, base_decimals)?, + OracleType::PythV2 => get_pyth_on_demand_state(oracle_info, base_decimals)?, OracleType::SwitchboardV2 => { fn from_foreign_error(e: impl std::fmt::Display) -> Error { error_msg!("{}", e) @@ -397,6 +453,7 @@ fn oracle_state_unchecked_inner( last_update_slot, deviation, oracle_type: OracleType::SwitchboardV2, + last_update_time: None, } } OracleType::SwitchboardV1 => { @@ -417,6 +474,7 @@ fn oracle_state_unchecked_inner( last_update_slot, deviation, oracle_type: OracleType::SwitchboardV1, + last_update_time: None, } } OracleType::SwitchboardOnDemand => { @@ -446,6 +504,7 @@ fn oracle_state_unchecked_inner( last_update_slot, deviation, oracle_type: OracleType::SwitchboardOnDemand, + last_update_time: None, } } OracleType::OrcaCLMM => { @@ -458,6 +517,7 @@ fn oracle_state_unchecked_inner( last_update_slot: quote_oracle_state.last_update_slot, deviation: quote_oracle_state.deviation, oracle_type: OracleType::OrcaCLMM, + last_update_time: None, } } OracleType::RaydiumCLMM => { @@ -470,6 +530,7 @@ fn oracle_state_unchecked_inner( last_update_slot: quote_oracle_state.last_update_slot, deviation: quote_oracle_state.deviation, oracle_type: OracleType::RaydiumCLMM, + last_update_time: None, } } }) @@ -479,15 +540,15 @@ pub fn oracle_log_context( name: &str, state: &OracleState, oracle_config: &OracleConfig, - staleness_slot: Option, + now: Option<(u64, u64)>, ) -> String { format!( - "name: {}, price: {}, deviation: {}, last_update_slot: {}, now_slot: {}, conf_filter: {:#?}", + "name: {}, price: {}, deviation: {}, last_update_slot: {}, now: {:?}, conf_filter: {:#?}", name, state.price.to_num::(), state.deviation.to_num::(), state.last_update_slot, - staleness_slot.unwrap_or_else(|| u64::MAX), + now.unwrap_or_else(|| (u64::MAX, u64::MAX)), oracle_config.conf_filter.to_num::(), ) } @@ -530,6 +591,11 @@ mod tests { OracleType::SwitchboardOnDemand, switchboard_on_demand_mainnet_oracle::ID, ), + ( + "7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE", + OracleType::PythV2, + pyth_solana_receiver_sdk::ID, + ), ]; for fixture in fixtures { @@ -613,6 +679,49 @@ mod tests { Ok(()) } + #[test] + pub fn test_pyth_on_demand_price() -> Result<()> { + // add ability to find fixtures + let mut d = PathBuf::from(env!("CARGO_MANIFEST_DIR")); + d.push("resources/test"); + + let fixtures = vec![( + "7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE", + OracleType::PythV2, + pyth_solana_receiver_sdk::ID, + 6, + )]; + + for fixture in fixtures { + let file = format!("resources/test/{}.bin", fixture.0); + let mut data = read_file(find_file(&file).unwrap()); + let data = RefCell::new(&mut data[..]); + let ai = &AccountInfoRef { + key: &Pubkey::from_str(fixture.0).unwrap(), + owner: &fixture.2, + data: data.borrow(), + }; + let base_decimals = fixture.3; + + let sw_ais = OracleAccountInfos { + oracle: ai, + fallback_opt: None, + usdc_opt: None, + sol_opt: None, + }; + let state = oracle_state_unchecked(&sw_ais, base_decimals).unwrap(); + + match fixture.1 { + OracleType::PythV2 => { + assert_eq!(state.price, I80F48::from_num(140.615948634614796)) + } + _ => unimplemented!(), + } + } + + Ok(()) + } + #[test] pub fn test_clmm_prices() -> Result<()> { // add ability to find fixtures @@ -780,4 +889,40 @@ mod tests { } Ok(()) } + + #[test] + fn use_time_for_max_staleness_check() { + let fixtures = vec![ + (100_000, 100_000, false), + (100_000, 50_000, true), + (100_000, 150_000, false), + (100_000, 100_000 - 44, false), + (100_000, 100_000 - 46, true), + (100_000, 100_000 + 45, false), + (100_000, 100_000 + 300, false), + ]; + + let config = OracleConfig { + conf_filter: Default::default(), + max_staleness_slots: 100, + reserved: [0; 72], + }; + for (now_ts, publish_ts, expect_error) in fixtures { + let now_slot = 0; + + let state = OracleState { + price: Default::default(), + deviation: Default::default(), + last_update_slot: now_slot, + last_update_time: Some(publish_ts), + oracle_type: OracleType::Pyth, + }; + + println!("test case: {}, {} => {}", now_ts, publish_ts, expect_error); + assert_eq!( + expect_error, + state.check_staleness(&config, now_slot, now_ts).is_err() + ); + } + } } diff --git a/programs/mango-v4/src/state/perp_market.rs b/programs/mango-v4/src/state/perp_market.rs index 2b1c795a3..0c295049e 100644 --- a/programs/mango-v4/src/state/perp_market.rs +++ b/programs/mango-v4/src/state/perp_market.rs @@ -277,23 +277,21 @@ impl PerpMarket { pub fn oracle_price( &self, oracle_acc_infos: &OracleAccountInfos, - staleness_slot: Option, + now: Option<(u64, u64)>, ) -> Result { - Ok(self.oracle_state(oracle_acc_infos, staleness_slot)?.price) + Ok(self.oracle_state(oracle_acc_infos, now)?.price) } pub fn oracle_state( &self, oracle_acc_infos: &OracleAccountInfos, - staleness_slot: Option, + now: Option<(u64, u64)>, ) -> Result { require_keys_eq!(self.oracle, *oracle_acc_infos.oracle.key()); let state = oracle::oracle_state_unchecked(oracle_acc_infos, self.base_decimals)?; state - .check_confidence_and_maybe_staleness(&self.oracle_config, staleness_slot) - .with_context(|| { - oracle_log_context(self.name(), &state, &self.oracle_config, staleness_slot) - })?; + .check_confidence_and_maybe_staleness(&self.oracle_config, now) + .with_context(|| oracle_log_context(self.name(), &state, &self.oracle_config, now))?; Ok(state) } diff --git a/programs/mango-v4/tests/cases/test_collateral_fees.rs b/programs/mango-v4/tests/cases/test_collateral_fees.rs index 1ee9d8fa5..c60ac5fc2 100644 --- a/programs/mango-v4/tests/cases/test_collateral_fees.rs +++ b/programs/mango-v4/tests/cases/test_collateral_fees.rs @@ -1,5 +1,11 @@ #![allow(unused_assignments)] + use super::*; +use crate::cases::test_serum::SerumOrderPlacer; +use num::ToPrimitive; +use std::collections::HashMap; +use std::str::FromStr; +use std::sync::Arc; #[tokio::test] async fn test_collateral_fees() -> Result<(), TransportError> { @@ -10,11 +16,17 @@ async fn test_collateral_fees() -> Result<(), TransportError> { let owner = context.users[0].key; let payer = context.users[1].key; let mints = &context.mints[0..2]; + let mut prices = HashMap::new(); + + // 1 unit = 1$ + prices.insert(mints[0].pubkey, 1_000_000f64); + prices.insert(mints[1].pubkey, 1_000_000f64); let mango_setup::GroupWithTokens { group, tokens, .. } = mango_setup::GroupWithTokensConfig { admin, payer, mints: mints.to_vec(), + prices: prices, ..mango_setup::GroupWithTokensConfig::default() } .create(solana) @@ -73,37 +85,8 @@ async fn test_collateral_fees() -> Result<(), TransportError> { .await .unwrap(); - send_tx( - solana, - TokenEdit { - group, - admin, - mint: mints[0].pubkey, - fallback_oracle: Pubkey::default(), - options: mango_v4::instruction::TokenEdit { - collateral_fee_per_day_opt: Some(0.1), - ..token_edit_instruction_default() - }, - }, - ) - .await - .unwrap(); - - send_tx( - solana, - TokenEdit { - group, - admin, - mint: mints[1].pubkey, - fallback_oracle: Pubkey::default(), - options: mango_v4::instruction::TokenEdit { - loan_origination_fee_rate_opt: Some(0.0), - ..token_edit_instruction_default() - }, - }, - ) - .await - .unwrap(); + set_collateral_fees(solana, admin, mints, group, 0, 0.1).await; + set_loan_orig_fee(solana, admin, mints, group, 1, 0.0).await; // // TEST: It works on empty accounts @@ -157,19 +140,7 @@ async fn test_collateral_fees() -> Result<(), TransportError> { // TEST: With borrows, there's an effect depending on the time that has passed // - send_tx( - solana, - TokenWithdrawInstruction { - amount: 500, // maint: -1.2 * 500 = -600 (half of 1200) - allow_borrow: true, - account, - owner, - token_account: context.users[1].token_accounts[1], - bank_index: 0, - }, - ) - .await - .unwrap(); + withdraw(&context, solana, owner, account, 500, 1).await; // maint: -1.2 * 500 = -600 (half of 1200) solana.set_clock_timestamp(last_time + 9 * hour).await; @@ -177,30 +148,26 @@ async fn test_collateral_fees() -> Result<(), TransportError> { .await .unwrap(); last_time = solana.clock_timestamp().await; + + let fee = 1500.0 * (0.1 * (9.0 / 24.0) * (600.0 / 1200.0)); + println!("fee -> {}", fee); assert_eq_f64!( account_position_f64(solana, account, tokens[0].bank).await, - 1500.0 * (1.0 - 0.1 * (9.0 / 24.0) * (600.0 / 1200.0)), + 1500.0, 0.01 ); - let last_balance = account_position_f64(solana, account, tokens[0].bank).await; + assert_eq_f64!( + account_position_f64(solana, account, tokens[1].bank).await, + -500.0 - fee, + 0.01 + ); + let last_balance = account_position_f64(solana, account, tokens[1].bank).await; // // TEST: More borrows // - send_tx( - solana, - TokenWithdrawInstruction { - amount: 100, // maint: -1.2 * 600 = -720 - allow_borrow: true, - account, - owner, - token_account: context.users[1].token_accounts[1], - bank_index: 0, - }, - ) - .await - .unwrap(); + withdraw(&context, solana, owner, account, 100, 1).await; // maint: -1.2 * 600 = -720 solana.set_clock_timestamp(last_time + 7 * hour).await; @@ -208,11 +175,554 @@ async fn test_collateral_fees() -> Result<(), TransportError> { .await .unwrap(); //last_time = solana.clock_timestamp().await; + let fee = 1500.0 * 0.1 * (7.0 / 24.0) * ((last_balance.abs() + 100.0) * 1.2 / (1500.0 * 0.8)); + println!("fee -> {}", fee); assert_eq_f64!( account_position_f64(solana, account, tokens[0].bank).await, - last_balance * (1.0 - 0.1 * (7.0 / 24.0) * (720.0 / (last_balance * 0.8))), + 1500.0, + 0.01 + ); + assert_eq_f64!( + account_position_f64(solana, account, tokens[1].bank).await, + -(last_balance.abs() + 100.0) - fee, 0.01 ); Ok(()) } + +#[tokio::test] +async fn test_collateral_fees_multi() -> Result<(), TransportError> { + let context = TestContext::new().await; + let solana = &context.solana.clone(); + + let admin = TestKeypair::new(); + let owner = context.users[0].key; + let payer = context.users[1].key; + let mints = &context.mints[0..4]; + let mut prices = HashMap::new(); + + prices.insert(mints[0].pubkey, 1_000_000f64); // 1 unit = 1$ + prices.insert(mints[1].pubkey, 3_000_000f64); // 1 unit = 3$ + prices.insert(mints[2].pubkey, 5_000_000f64); // 1 unit = 5$ + prices.insert(mints[3].pubkey, 20_000_000f64); // 1 unit = 20$ + + let mango_setup::GroupWithTokens { group, tokens, .. } = mango_setup::GroupWithTokensConfig { + admin, + payer, + mints: mints.to_vec(), + prices, + ..mango_setup::GroupWithTokensConfig::default() + } + .create(solana) + .await; + + // fund the vaults to allow borrowing + create_funded_account( + &solana, + group, + owner, + 0, + &context.users[1], + mints, + 1_000_000, + 0, + ) + .await; + + let account = create_funded_account( + &solana, + group, + owner, + 1, + &context.users[1], + &mints[0..2], + 1_500, // maint: 0.8 * 1500 = 1200 + 0, + ) + .await; + + let hour = 60 * 60; + + send_tx( + solana, + GroupEdit { + group, + admin, + options: mango_v4::instruction::GroupEdit { + collateral_fee_interval_opt: Some(6 * hour), + ..group_edit_instruction_default() + }, + }, + ) + .await + .unwrap(); + + // Set fees + + set_collateral_fees(solana, admin, mints, group, 0, 0.1).await; + set_collateral_fees(solana, admin, mints, group, 1, 0.2).await; + set_loan_orig_fee(solana, admin, mints, group, 2, 0.0).await; + set_loan_orig_fee(solana, admin, mints, group, 3, 0.0).await; + + // + // TEST: With borrows, there's an effect depending on the time that has passed + // + + withdraw(&context, solana, owner, account, 50, 2).await; // maint: -1.2 * 50 = -60 (250$ -> 300$) + withdraw(&context, solana, owner, account, 100, 3).await; // maint: -1.2 * 100 = -120 (2000$ -> 2400$) + + send_tx(solana, TokenChargeCollateralFeesInstruction { account }) + .await + .unwrap(); + let mut last_time = solana.clock_timestamp().await; + solana.set_clock_timestamp(last_time + 9 * hour).await; + + // send it twice, because the first time will never charge anything + send_tx(solana, TokenChargeCollateralFeesInstruction { account }) + .await + .unwrap(); + last_time = solana.clock_timestamp().await; + + let usage_factor = (60.0 * 5.0 + 120.0 * 20.0) / ((1500.0 + 1500.0 * 3.0) * 0.8); + let time_factor = 9.0 / 24.0; + let collateral_fee_factor = 1500.0 * 0.1 + 1500.0 * 3.0 * 0.2; + let collateral_fee = collateral_fee_factor * time_factor * usage_factor; + // println!("fee -> {}", collateral_fee); + assert_eq_f64!( + account_position_f64(solana, account, tokens[0].bank).await, + 1500.0, + 0.01 + ); + assert_eq_f64!( + account_position_f64(solana, account, tokens[1].bank).await, + 1500.0, + 0.01 + ); + assert_eq_f64!( + account_position_f64(solana, account, tokens[2].bank).await, + -50.0 - (300.0 / 2700.0) * collateral_fee / 5.0, + 0.01 + ); + assert_eq_f64!( + account_position_f64(solana, account, tokens[3].bank).await, + -100.0 - (2400.0 / 2700.0) * collateral_fee / 20.0, + 0.01 + ); + + Ok(()) +} + +// Test convention +// +// T = Token without collateral fee +// Tc = Token with collateral fee +// B_x = Balance of x +// O_x = Amount in OO for x (market will be x/T1) +// F_x = Collateral Fee charged on x +// +// Asset weight = 0.8 +// Liab weight = 1.2 +// All amounts in USD +// Base lot is 100 + +#[tokio::test] +async fn test_basics() -> Result<(), TransportError> { + let test_cases = parse_test_cases("\ + B_T1 ; B_T2 ; B_Tc1 ; B_Tc2 ; B_Tc3 ; B_Tc4 ; O_T1 ; O_T2 ; O_Tc1 ; O_Tc2 ; O_Tc3 ; O_Tc4 ; CF_T1 ; CF_T2 ; CF_Tc1 ; CF_Tc2 ; CF_Tc3 ; CF_Tc4 \r\n \ + -2000 ; 0 ; 10000 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; -300 ; 0 ; 0 ; 0 ; 0 ; 0 \r\n \ + -2000 ; 0 ; 5000 ; 5000 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; -300 ; 0 ; 0 ; 0 ; 0 ; 0 \r\n \ + -500 ; -1500 ; 10000 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; 0 ; -75 ; -225 ; 0 ; 0 ; 0 ; 0 \r\n \ + "); + + run_scenario(test_cases).await +} + +#[tokio::test] +async fn test_creating_borrow_from_oo() -> Result<(), TransportError> { + let test_cases = parse_test_cases("\ + B_T1 ; B_T2 ; B_Tc1 ; B_Tc2 ; B_Tc3 ; B_Tc4 ; O_T1 ; O_T2 ; O_Tc1 ; O_Tc2 ; O_Tc3 ; O_Tc4 ; CF_T1 ; CF_T2 ; CF_Tc1 ; CF_Tc2 ; CF_Tc3 ; CF_Tc4 \r\n \ + -2000 ; 0 ; 10000 ; 0 ; 0 ; 0 ; 0 ; 200 ; 0 ; 0 ; 0 ; 0 ; -300 ; 0 ; 0 ; 0 ; 0 ; 0 \r\n \ + -2000 ; 0 ; 10000 ; 0 ; 0 ; 0 ; 0 ; 0 ; 300 ; 0 ; 0 ; 0 ; -300 ; 0 ; 0 ; 0 ; 0 ; 0 \r\n \ + "); + + run_scenario(test_cases).await +} + +#[tokio::test] +async fn test_hiding_collateral_using_oo() -> Result<(), TransportError> { + let test_cases = parse_test_cases("\ + B_T1 ; B_T2 ; B_Tc1 ; B_Tc2 ; B_Tc3 ; B_Tc4 ; O_T1 ; O_T2 ; O_Tc1 ; O_Tc2 ; O_Tc3 ; O_Tc4 ; CF_T1 ; CF_T2 ; CF_Tc1 ; CF_Tc2 ; CF_Tc3 ; CF_Tc4 \r\n \ + -2000 ; 0 ; 10000 ; 0 ; 0 ; 0 ; 0 ; -200 ; 0 ; 0 ; 0 ; 0 ; -300 ; 0 ; 0 ; 0 ; 0 ; 0 \r\n \ + -2000 ; 0 ; 10000 ; 0 ; 0 ; 0 ; 0 ; 0 ; -300 ; 0 ; 0 ; 0 ; -300 ; 0 ; 0 ; 0 ; 0 ; 0 \r\n \ + "); + + run_scenario(test_cases).await +} + +async fn run_scenario(test_cases: Vec>) -> Result<(), TransportError> { + for test_case in test_cases { + if test_case.len() == 0 { + continue; + } + + let mut test_builder = TestContextBuilder::new(); + test_builder.test().set_compute_max_units(200_000); + let context = test_builder.start_default().await; + let solana = &context.solana.clone(); + + let admin = TestKeypair::new(); + let owner = context.users[0].key; + let payer = context.users[1].key; + let mints = &context.mints[0..6]; + let mut prices = HashMap::new(); + + // Setup prices + for i in 0..6 { + prices.insert(mints[i].pubkey, (i as f64 + 1.0) * 1_000_000f64); // 1 unit = i$ + } + + let mango_setup::GroupWithTokens { group, tokens, .. } = + mango_setup::GroupWithTokensConfig { + admin, + payer, + mints: mints.to_vec(), + prices, + ..mango_setup::GroupWithTokensConfig::default() + } + .create(solana) + .await; + + // Setup fees + set_collateral_fees(solana, admin, mints, group, 2, 0.1).await; + set_collateral_fees(solana, admin, mints, group, 3, 0.1).await; + set_collateral_fees(solana, admin, mints, group, 4, 0.1).await; + set_collateral_fees(solana, admin, mints, group, 5, 0.1).await; + for i in 0..6 { + set_loan_orig_fee(solana, admin, mints, group, i, 0.0).await; + } + + // fund the vaults to allow borrowing + create_funded_account( + &solana, + group, + owner, + 0, + &context.users[1], + mints, + 9_000_000_000, + 0, + ) + .await; + + let account = send_tx( + solana, + AccountCreateInstruction { + account_num: 1, + group, + owner, + payer: context.users[1].key, + ..Default::default() + }, + ) + .await + .unwrap() + .account; + + // For Spot order + + let hour = 60 * 60; + + send_tx( + solana, + GroupEdit { + group, + admin, + options: mango_v4::instruction::GroupEdit { + collateral_fee_interval_opt: Some(24 * hour), + ..group_edit_instruction_default() + }, + }, + ) + .await + .unwrap(); + + // Setup balance + for (index, balance) in test_case[0..6].iter().enumerate() { + if *balance > 0.0 { + deposit( + solana, + owner, + &context.users[1], + account, + ((*balance as f64) / (index + 1) as f64).ceil() as u64, + index, + ) + .await; + } + } + for (index, balance) in test_case[0..6].iter().enumerate() { + if *balance < 0.0 { + withdraw( + &context, + solana, + owner, + account, + ((balance.abs() as f64) / (index + 1) as f64).ceil() as u64, + index, + ) + .await; + } + } + + // Setup orders + for (index, order) in test_case[6..12].iter().enumerate() { + if *order == 0.0 { + continue; + } + + create_order( + solana, + &context, + group, + admin, + owner, + &context.users[0], + account, + (index + 1) as f64, + (order / (index + 1) as f64).floor() as i64, + &tokens[index], + &tokens[0], + ) + .await; + } + + // + // TEST + // + + let mut balances = vec![]; + for i in 0..6 { + if test_case[i] == 0.0 { + balances.push(0f64); + } else { + balances.push(account_position_f64(solana, account, tokens[i].bank).await); + } + } + + send_tx(solana, TokenChargeCollateralFeesInstruction { account }) + .await + .unwrap(); + let mut last_time = solana.clock_timestamp().await; + solana.set_clock_timestamp(last_time + 24 * hour).await; + + // send it twice, because the first time will never charge anything + send_tx(solana, TokenChargeCollateralFeesInstruction { account }) + .await + .unwrap(); + last_time = solana.clock_timestamp().await; + + // Assert balance change + for (index, expected_fee) in test_case[12..].iter().enumerate() { + if test_case[index] == 0.0 { + continue; + } + + let current_balance = account_position_f64(solana, account, tokens[index].bank).await; + let previous_balance = balances[index]; + let actual_fee = (current_balance - previous_balance) * (index + 1) as f64; + + assert_eq_f64!(actual_fee, expected_fee.to_f64().unwrap(), 0.01); + } + } + + Ok(()) +} + +fn parse_test_cases(test_cases: &str) -> Vec> { + test_cases + .split("\r\n") + .skip(1) + .map(|x| { + x.split(";") + .filter_map(|y| { + let y = y.trim(); + if y.len() == 0 { + return None; + } + Some(f64::from_str(y).unwrap()) + }) + .collect_vec() + }) + .collect_vec() +} + +async fn create_order( + solana: &Arc, + context: &TestContext, + group: Pubkey, + admin: TestKeypair, + owner: TestKeypair, + payer: &UserCookie, + account: Pubkey, + price: f64, + quantity: i64, + base_token: &Token, + quote_token: &Token, +) -> Option<(u128, u64)> { + let serum_market_cookie = context + .serum + .list_spot_market(&base_token.mint, "e_token.mint) + .await; + + // + // TEST: Register a serum market + // + let serum_market = send_tx( + solana, + Serum3RegisterMarketInstruction { + group, + admin, + serum_program: context.serum.program_id, + serum_market_external: serum_market_cookie.market, + market_index: 0, + base_bank: base_token.bank, + quote_bank: quote_token.bank, + payer: payer.key, + }, + ) + .await + .unwrap() + .serum_market; + + // + // TEST: Create an open orders account + // + let open_orders = send_tx( + solana, + Serum3CreateOpenOrdersInstruction { + account, + serum_market, + owner, + payer: payer.key, + }, + ) + .await + .unwrap() + .open_orders; + + let mut order_placer = SerumOrderPlacer { + solana: solana.clone(), + serum: context.serum.clone(), + account, + owner: owner.clone(), + serum_market, + open_orders, + next_client_order_id: 0, + }; + + if quantity > 0 { + order_placer.bid_maker(price, quantity as u64).await + } else { + order_placer.ask(price, quantity.abs() as u64).await + } +} + +async fn withdraw( + context: &TestContext, + solana: &Arc, + owner: TestKeypair, + account: Pubkey, + amount: u64, + token_index: usize, +) { + // println!("WITHDRAWING {} - token index {}", amount, token_index); + send_tx( + solana, + TokenWithdrawInstruction { + amount: amount, + allow_borrow: true, + account, + owner, + token_account: context.users[1].token_accounts[token_index], + bank_index: 0, + }, + ) + .await + .unwrap(); +} + +async fn deposit( + solana: &Arc, + owner: TestKeypair, + payer: &UserCookie, + account: Pubkey, + amount: u64, + token_index: usize, +) { + // println!("DEPOSITING {} - token index {}", amount, token_index); + send_tx( + solana, + TokenDepositInstruction { + amount: amount, + reduce_only: false, + account, + owner, + token_account: payer.token_accounts[token_index], + token_authority: payer.key, + bank_index: 0, + }, + ) + .await + .unwrap(); +} + +async fn set_loan_orig_fee( + solana: &Arc, + admin: TestKeypair, + mints: &[MintCookie], + group: Pubkey, + token_index: usize, + rate: f32, +) { + send_tx( + solana, + TokenEdit { + group, + admin, + mint: mints[token_index].pubkey, + fallback_oracle: Pubkey::default(), + options: mango_v4::instruction::TokenEdit { + loan_origination_fee_rate_opt: Some(rate), + ..token_edit_instruction_default() + }, + }, + ) + .await + .unwrap(); +} + +async fn set_collateral_fees( + solana: &Arc, + admin: TestKeypair, + mints: &[MintCookie], + group: Pubkey, + token_index: usize, + rate: f32, +) { + send_tx( + solana, + TokenEdit { + group, + admin, + mint: mints[token_index].pubkey, + fallback_oracle: Pubkey::default(), + options: mango_v4::instruction::TokenEdit { + collateral_fee_per_day_opt: Some(rate), + ..token_edit_instruction_default() + }, + }, + ) + .await + .unwrap(); +} diff --git a/programs/mango-v4/tests/cases/test_health_compute.rs b/programs/mango-v4/tests/cases/test_health_compute.rs index f72eaba49..297ed95a1 100644 --- a/programs/mango-v4/tests/cases/test_health_compute.rs +++ b/programs/mango-v4/tests/cases/test_health_compute.rs @@ -335,7 +335,7 @@ async fn test_health_compute_tokens_fallback_oracles() -> Result<(), TransportEr println!("average success increase: {avg_success_increase}"); println!("average failure increase: {avg_failure_increase}"); assert!(avg_success_increase < 2_050); - assert!(avg_failure_increase < 19_500); + assert!(avg_failure_increase < 19_900); Ok(()) } diff --git a/programs/mango-v4/tests/cases/test_serum.rs b/programs/mango-v4/tests/cases/test_serum.rs index 27613a830..ec8129bc5 100644 --- a/programs/mango-v4/tests/cases/test_serum.rs +++ b/programs/mango-v4/tests/cases/test_serum.rs @@ -6,14 +6,14 @@ use mango_v4::accounts_ix::{Serum3OrderType, Serum3SelfTradeBehavior, Serum3Side use mango_v4::serum3_cpi::{load_open_orders_bytes, OpenOrdersSlim}; use std::sync::Arc; -struct SerumOrderPlacer { - solana: Arc, - serum: Arc, - account: Pubkey, - owner: TestKeypair, - serum_market: Pubkey, - open_orders: Pubkey, - next_client_order_id: u64, +pub struct SerumOrderPlacer { + pub solana: Arc, + pub serum: Arc, + pub account: Pubkey, + pub owner: TestKeypair, + pub serum_market: Pubkey, + pub open_orders: Pubkey, + pub next_client_order_id: u64, } impl SerumOrderPlacer { @@ -71,7 +71,7 @@ impl SerumOrderPlacer { send_tx(&self.solana, ix).await } - async fn bid_maker(&mut self, limit_price: f64, max_base: u64) -> Option<(u128, u64)> { + pub async fn bid_maker(&mut self, limit_price: f64, max_base: u64) -> Option<(u128, u64)> { self.try_bid(limit_price, max_base, false).await.unwrap(); self.find_order_id_for_client_order_id(self.next_client_order_id - 1) .await @@ -108,7 +108,7 @@ impl SerumOrderPlacer { .await } - async fn ask(&mut self, limit_price: f64, max_base: u64) -> Option<(u128, u64)> { + pub async fn ask(&mut self, limit_price: f64, max_base: u64) -> Option<(u128, u64)> { self.try_ask(limit_price, max_base).await.unwrap(); self.find_order_id_for_client_order_id(self.next_client_order_id - 1) .await diff --git a/programs/mango-v4/tests/cases/test_token_update_index_and_rate.rs b/programs/mango-v4/tests/cases/test_token_update_index_and_rate.rs index 242125c42..aa79b3b6d 100644 --- a/programs/mango-v4/tests/cases/test_token_update_index_and_rate.rs +++ b/programs/mango-v4/tests/cases/test_token_update_index_and_rate.rs @@ -98,6 +98,104 @@ async fn test_token_update_index_and_rate() -> Result<(), TransportError> { Ok(()) } +#[tokio::test] +async fn test_token_update_index_and_rate_resilient_ix() -> Result<(), TransportError> { + let context = TestContext::new().await; + let solana = &context.solana.clone(); + + let admin = TestKeypair::new(); + let owner = context.users[0].key; + let payer = context.users[1].key; + let mints = &context.mints[0..2]; + + // + // SETUP: Create a group and an account to fill the vaults + // + + let GroupWithTokens { group, tokens, .. } = GroupWithTokensConfig { + admin, + payer, + mints: mints.to_vec(), + ..GroupWithTokensConfig::default() + } + .create(solana) + .await; + + // deposit some funds, to the vaults aren't empty + create_funded_account(&solana, group, owner, 0, &context.users[1], mints, 10000, 0).await; + let withdraw_account = create_funded_account( + &solana, + group, + owner, + 1, + &context.users[1], + &mints[1..2], + 100000, + 0, + ) + .await; + + send_tx( + solana, + TokenWithdrawInstruction { + amount: 5000, + allow_borrow: true, + account: withdraw_account, + owner, + token_account: context.users[0].token_accounts[0], + bank_index: 0, + }, + ) + .await + .unwrap(); + + let bank_before = solana.get_account::(tokens[0].bank).await; + + let time_before = solana.clock().await.unix_timestamp; + solana.advance_clock().await; + let time_after = solana.clock().await.unix_timestamp; + + send_tx( + solana, + TokenUpdateIndexAndRateResilientInstruction { + mint_info: tokens[0].mint_info, + }, + ) + .await + .unwrap(); + + let bank_after = solana.get_account::(tokens[0].bank).await; + dbg!(bank_after); + dbg!(bank_after); + + let utilization = 0.5; // 10000 deposits / 5000 borrows + let diff_ts = (time_after - time_before) as f64; + let year = 31536000.0; + let loan_fee_rate = 0.0005; + let dynamic_rate = 0.07 + 0.9 * (utilization - 0.4) / (0.8 - 0.4); + let interest_change = 5000.0 * (dynamic_rate + loan_fee_rate) * diff_ts / year; + let fee_change = 5000.0 * loan_fee_rate * diff_ts / year; + + assert_eq_fixed_f64!( + bank_after.native_borrows() - bank_before.native_borrows(), + interest_change, + 0.1 + ); + assert_eq_fixed_f64!( + bank_after.native_deposits() - bank_before.native_deposits(), + interest_change, + 0.1 + ); + assert_eq_fixed_f64!( + bank_after.collected_fees_native - bank_before.collected_fees_native, + fee_change, + 0.1 + ); + assert_eq_fixed_f64!(bank_after.avg_utilization, utilization, 0.01); + + Ok(()) +} + #[tokio::test] async fn test_token_rates_migrate() -> Result<(), TransportError> { let context = TestContext::new().await; diff --git a/programs/mango-v4/tests/program_test/mango_client.rs b/programs/mango-v4/tests/program_test/mango_client.rs index 2efa8967a..649084e43 100644 --- a/programs/mango-v4/tests/program_test/mango_client.rs +++ b/programs/mango-v4/tests/program_test/mango_client.rs @@ -4464,6 +4464,49 @@ impl ClientInstruction for TokenUpdateIndexAndRateInstruction { } } +pub struct TokenUpdateIndexAndRateResilientInstruction { + pub mint_info: Pubkey, +} +#[async_trait::async_trait(?Send)] +impl ClientInstruction for TokenUpdateIndexAndRateResilientInstruction { + type Accounts = mango_v4::accounts::TokenUpdateIndexAndRate; + type Instruction = mango_v4::instruction::TokenUpdateIndexAndRateResilient; + async fn to_instruction( + &self, + loader: &(impl ClientAccountLoader + 'async_trait), + ) -> (Self::Accounts, instruction::Instruction) { + let program_id = mango_v4::id(); + let instruction = Self::Instruction {}; + + let mint_info: MintInfo = loader.load(&self.mint_info).await.unwrap(); + + let accounts = Self::Accounts { + group: mint_info.group, + mint_info: self.mint_info, + oracle: mint_info.oracle, + instructions: solana_program::sysvar::instructions::id(), + }; + + let mut instruction = make_instruction(program_id, &accounts, &instruction); + let mut bank_ams = mint_info + .banks() + .iter() + .map(|bank| AccountMeta { + pubkey: *bank, + is_signer: false, + is_writable: true, + }) + .collect::>(); + instruction.accounts.append(&mut bank_ams); + + (accounts, instruction) + } + + fn signers(&self) -> Vec { + vec![] + } +} + pub struct ComputeAccountDataInstruction { pub account: Pubkey, } diff --git a/programs/mango-v4/tests/program_test/mango_setup.rs b/programs/mango-v4/tests/program_test/mango_setup.rs index 6afeff4f3..cf05c1d0f 100644 --- a/programs/mango-v4/tests/program_test/mango_setup.rs +++ b/programs/mango-v4/tests/program_test/mango_setup.rs @@ -1,16 +1,18 @@ #![allow(dead_code)] use anchor_lang::prelude::*; +use std::collections::HashMap; use super::mango_client::*; use super::solana::SolanaCookie; -use super::{send_tx, MintCookie, TestKeypair, UserCookie}; +use super::{MintCookie, TestKeypair, UserCookie}; #[derive(Default)] pub struct GroupWithTokensConfig { pub admin: TestKeypair, pub payer: TestKeypair, pub mints: Vec, + pub prices: HashMap, pub zero_token_is_quote: bool, } @@ -38,6 +40,7 @@ impl<'a> GroupWithTokensConfig { admin, payer, mints, + prices, zero_token_is_quote, } = self; let create_group_accounts = send_tx( @@ -74,7 +77,7 @@ impl<'a> GroupWithTokensConfig { group, admin, mint: mint.pubkey, - price: 1.0, + price: prices.get(&mint.pubkey).copied().unwrap_or(1.0f64), oracle, }, ) diff --git a/release-to-devnet.sh b/release-to-devnet.sh index b28821bb6..681884f01 100755 --- a/release-to-devnet.sh +++ b/release-to-devnet.sh @@ -17,9 +17,9 @@ cp -v ./target/types/mango_v4.ts ./ts/client/src/mango_v4.ts (cd ./ts/client && yarn tsc) # publish program -solana --url https://mango.devnet.rpcpool.com program deploy --program-id $PROGRAM_ID \ +solana --url $CLUSTER_URL program deploy --program-id $PROGRAM_ID \ -k $WALLET_WITH_FUNDS target/deploy/mango_v4.so --skip-fee-check # publish idl -anchor idl upgrade --provider.cluster https://mango.devnet.rpcpool.com --provider.wallet $WALLET_WITH_FUNDS \ +anchor idl upgrade --provider.cluster $CLUSTER_URL --provider.wallet $WALLET_WITH_FUNDS \ --filepath target/idl/mango_v4_no_docs.json $PROGRAM_ID diff --git a/ts/client/scripts/archive/mb-oracle-inspect.ts b/ts/client/scripts/archive/mb-oracle-inspect.ts index 21e63731a..205df7fe7 100644 --- a/ts/client/scripts/archive/mb-oracle-inspect.ts +++ b/ts/client/scripts/archive/mb-oracle-inspect.ts @@ -1,64 +1,91 @@ -import { parsePriceData } from '@pythnetwork/client'; -import { Connection, PublicKey } from '@solana/web3.js'; +import { + Connection, + ParsedAccountData, + PublicKey, + SYSVAR_CLOCK_PUBKEY, +} from '@solana/web3.js'; import { isPythOracle, isSwitchboardOracle, + parsePythOracle, parseSwitchboardOracle, } from '../../src/accounts/oracle'; -import { toNativeI80F48 } from '../../src/utils'; +import { + PYTH_SPONSORED_ORACLES, + SB_ON_DEMAND_TESTING_ORACLES, +} from '../governanceInstructions/constants'; const { MB_CLUSTER_URL } = process.env; -async function decodePrice(conn, ai, pk): Promise { - let uiPrice, price, lastUpdatedSlot, type; +async function decodePrice( + slot, + name, + conn: Connection, + ai, + pk, +): Promise { + let uiPrice, price, lastUpdatedSlot, type, uiDeviation, publishedTime; + if (isPythOracle(ai!)) { - const priceData = parsePriceData(ai!.data); - uiPrice = priceData.previousPrice; - price = toNativeI80F48(uiPrice, 6 - 5); - lastUpdatedSlot = parseInt(priceData.lastSlot.toString()); + const priceData = parsePythOracle(ai!, conn); + uiPrice = priceData.price; + lastUpdatedSlot = priceData.lastUpdatedSlot; + uiDeviation = priceData.uiDeviation; + publishedTime = (priceData as any).publishedTime; type = 'pyth'; } else if (isSwitchboardOracle(ai!)) { const priceData = await parseSwitchboardOracle(pk, ai!, conn); uiPrice = priceData.price; - price = toNativeI80F48(uiPrice, 6 - 5); + uiDeviation = priceData.uiDeviation; lastUpdatedSlot = priceData.lastUpdatedSlot; type = 'sb'; } + // console.log( + // `${name.toString().padStart(10)}, ${type.padStart(4)}, ${uiPrice + // .toString() + // .padStart(10)}, ${(slot - lastUpdatedSlot) / 2}s ${uiDeviation + // .toString() + // .padStart(10)}`, + // ); - const currentSlot = await conn.getSlot(); + const localUnixTime = Math.floor(Date.now() / 1000); - console.log(`type ${type}`); - console.log(`uiPrice ${uiPrice}`); - console.log(`price ${price}`); - console.log(`currentSlot ${currentSlot}`); - console.log(`lastUpdatedSlot ${lastUpdatedSlot}`); - console.log(`Slot diff ${currentSlot - lastUpdatedSlot}`); + const parsedClock = await conn.getParsedAccountInfo(SYSVAR_CLOCK_PUBKEY); + const parsedClockAccount = (parsedClock.value!.data as ParsedAccountData) + .parsed; + const solanaUnixTime = parsedClockAccount.info.unixTimestamp; + + console.log( + `${name}, ${localUnixTime - solanaUnixTime}, ${ + localUnixTime - publishedTime + }`, + ); } async function main(): Promise { try { - // { - // const oraclePk1 = new PublicKey( - // '4SZ1qb4MtSUrZcoeaeQ3BDzVCyqxw3VwSFpPiMTmn4GE', - // ); - // const conn = new Connection(MB_CLUSTER_URL!); - // let ai = await conn.getAccountInfo(oraclePk1); - // decodePrice(conn, ai, oraclePk1); + const conn = new Connection(MB_CLUSTER_URL!); - // const oraclePk2 = new PublicKey( - // '8ihFLu5FimgTQ1Unh4dVyEHUGodJ5gJQCrQf4KUVB9bN', - // ); - // ai = await conn.getAccountInfo(oraclePk2); - // decodePrice(conn, ai, oraclePk2); - // } + // eslint-disable-next-line no-constant-condition + if (false) { + // https://ondemand.switchboard.xyz/solana/mainnet/user/DrnFiKkbyC5ga7LJDfDF8FzVcj6aoSUhsgirLjDMrBHH - { - // https://ondemand.switchboard.xyz/solana/devnet/feed/23QLa7R2hDhcXDVKyUSt2rvBPtuAAbY44TrqMVoPpk1C - const oraclePk3 = new PublicKey( - 'AZcoqpWhMJUaKEDUfKsfzCr3Y96gSQwv43KSQ6KpeyQ1', - ); - const conn = new Connection(MB_CLUSTER_URL!); - const ai = await conn.getAccountInfo(oraclePk3); - decodePrice(conn, ai, oraclePk3); + for (const item of SB_ON_DEMAND_TESTING_ORACLES) { + const oraclePk = new PublicKey(item[1]); + const slot = await conn.getSlot(); + const ai = await conn.getAccountInfo(oraclePk); + decodePrice(slot, item[0], conn, ai, oraclePk); + } + } + + // eslint-disable-next-line no-constant-condition + if (true) { + // https://docs.pyth.network/price-feeds/sponsored-feeds + for (const item of PYTH_SPONSORED_ORACLES) { + const oraclePk = new PublicKey(item[1]); + const slot = await conn.getSlot(); + const ai = await conn.getAccountInfo(oraclePk); + decodePrice(slot, item[0], conn, ai, oraclePk); + } } } catch (error) { console.log(error); diff --git a/ts/client/scripts/deposit-into.ts b/ts/client/scripts/deposit-into.ts index 31ea65144..603227fa9 100644 --- a/ts/client/scripts/deposit-into.ts +++ b/ts/client/scripts/deposit-into.ts @@ -4,6 +4,8 @@ import { Connection, Keypair, PublicKey } from '@solana/web3.js'; import fs from 'fs'; import { MangoClient } from '../src/client'; import { MANGO_V4_ID } from '../src/constants'; +import { ZERO_I80F48 } from '../src/numbers/I80F48'; +import { toUiDecimalsForQuote } from '../src/utils'; const { MB_CLUSTER_URL, MB_PAYER_KEYPAIR, MANGO_ACCOUNT, MINT, NATIVE_AMOUNT } = process.env; @@ -34,21 +36,60 @@ async function buildClient(): Promise { async function main(): Promise { const client = await buildClient(); - const mangoAccount = await client.getMangoAccount( - new PublicKey(MANGO_ACCOUNT!), - ); const group = await client.getGroup(new PublicKey(GROUP_PK)); - const mintPk = new PublicKey(MINT!); + const mangoAccounts = await client.getAllMangoAccounts(group, true); - const rs = await client.tokenDepositNative( - group, - mangoAccount, - mintPk, - new BN(NATIVE_AMOUNT!), - false, - true, - ); - console.log(rs.signature); + for (const bank of Array.from(group.banksMapByName.values()).flat()) { + if (bank.uiDeposits() * bank.uiPrice > 10) continue; + + if (bank.nativeDeposits().eq(ZERO_I80F48())) continue; + + if (bank.reduceOnly != 1) continue; + + console.log(`${bank.name}, ${bank.uiDeposits()}`); + for (const mangoAccount of mangoAccounts) { + if (mangoAccount.getTokenBalance(bank).lt(ZERO_I80F48())) { + console.log( + `${bank.name}, ${toUiDecimalsForQuote( + mangoAccount.getEquity(group), + )} ${mangoAccount.publicKey}, ${mangoAccount.getTokenBalance( + bank, + )}, ${mangoAccount.getTokenBalance(bank).ceil().toNumber()}`, + ); + + const rs = await client.tokenDepositNative( + group, + mangoAccount, + bank.mint, + new BN(mangoAccount.getTokenBalance(bank).ceil().toNumber()), + false, + true, + ); + console.log(rs.signature); + } + + if (mangoAccount.getTokenBalance(bank).gt(ZERO_I80F48())) { + console.log( + `${bank.name}, ${toUiDecimalsForQuote( + mangoAccount.getEquity(group), + )} ${mangoAccount.publicKey}, ${mangoAccount.getTokenBalance( + bank, + )}, ${mangoAccount.getTokenBalance(bank).ceil().toNumber()}, ${ + mangoAccount.getToken(bank.tokenIndex)?.inUseCount + }`, + ); + + const rs = await client.tokenForceWithdraw( + group, + mangoAccount, + bank.tokenIndex, + ); + console.log(rs.signature); + } + } + console.log(''); + } + process.exit(); } try { diff --git a/ts/client/scripts/force-withdraw-token.ts b/ts/client/scripts/force-withdraw-token.ts index 12a18a5ee..5da4f1ac2 100644 --- a/ts/client/scripts/force-withdraw-token.ts +++ b/ts/client/scripts/force-withdraw-token.ts @@ -45,6 +45,17 @@ async function forceWithdrawTokens(): Promise { ).filter((a) => a.getTokenBalanceUi(forceWithdrawBank) > 0); for (const mangoAccount of mangoAccountsWithDeposits) { +<<<<<<< HEAD +======= + + const sig = await client.serum3LiqForceCancelOrders(group,mangoAccount) + + const sig = await client.tokenForceWithdraw( + group, + mangoAccount, + TOKEN_INDEX, + ); +>>>>>>> main console.log( `Withdrawing ${mangoAccount.getTokenBalanceUi(forceWithdrawBank)} for ${ mangoAccount.publicKey diff --git a/ts/client/scripts/governanceInstructions/constants.ts b/ts/client/scripts/governanceInstructions/constants.ts index b7e81ad1f..21ae90335 100644 --- a/ts/client/scripts/governanceInstructions/constants.ts +++ b/ts/client/scripts/governanceInstructions/constants.ts @@ -32,3 +32,218 @@ export const MAINNET_PYTH_PROGRAM = new PublicKey( export const DEVNET_PYTH_PROGRAM = new PublicKey( 'gSbePebfvPy7tRqimPoVecS2UsBvYv46ynrzWocc92s', ); + +export const SB_ON_DEMAND_TESTING_ORACLES = [ + ['DIGITSOL', '2A7aqNLy26ZBSMWP2Ekxv926hj16tCA47W1sHWVqaLii'], + ['JLP', '65J9bVEMhNbtbsNgArNV1K4krzcsomjho4bgR51sZXoj'], + ['INF', 'AZcoqpWhMJUaKEDUfKsfzCr3Y96gSQwv43KSQ6KpeyQ1'], + ['GUAC', 'Ai2GsLRioGKwVgWX8dtbLF5rJJEZX17SteGEDqrpzBv3'], + ['RAY', 'AJkAFiXdbMonys8rTXZBrRnuUiLcDFdkyoPuvrVKXhex'], + ['JUP', '2F9M59yYc28WMrAymNWceaBEk8ZmDAjUAKULp8seAJF3'], +]; + +export const SB_ORACLES = [ + ['RENDER', '94rcvEktGTwCr2uZ6UGq7GPwwkb5BXWox942pGqJPMW3'], + ['MNGO', '9AhK6J5bNWBkBEqC9ix5K4bVSgwh9uMEoJvq8Ad2mKZZ'], + ['BLZE', 'p8WhggEpj4bTQJpGqPANiqG2CWUxooxWBWzi5qhrdzy'], + ['DAI', 'GXRCfroqu9k4ZoS5MyjUSiuoRb1bhps7nacEQLkLBVgr'], + ['CHAI', 'GXRCfroqu9k4ZoS5MyjUSiuoRb1bhps7nacEQLkLBVgr'], +]; + +export const SB_LST_ORACLES = [ + ['JSOL', '91yrNSV8mofYcP6NCsHNi2YgNxwukBenv5MCRFD92Rgp'], + ['HUBSOL', '318uRUE2RuYpvv1VwxC4eJwViDrRrxUTTqoUBV1cgUYi'], + ['DUALSOL', '6zBkSKhAqLT2SNRbzTbrom2siKhVZ6SLQcFPnvyexdTE'], + ['DIGITSOL', 'Am5rswhcxQhqviDXuaiZnLvkpmB4iJEdxmhqMMZDV3KJ'], + ['MANGOSOL', 'FLroEBBA4Fa8ENqfBmqyypq8U6ai2mD7c5k6Vfb2PWzv'], + ['COMPASSSOL', '9gFehBozPdWafFfPiZRbub2yUmwYJrGMvguKHii7cMTA'], +]; + +export const PYTH_SPONSORED_ORACLES = [ + ['SOL/USD', '7UVimffxr9ow1uXYxsr4LHAcV58mLzhmwaeKvJ1pjLiE'], + ['JITOSOL/USD', 'AxaxyeDT8JnWERSaTKvFXvPKkEdxnamKSqpWbsSjYg1g'], + ['MSOL/USD', '5CKzb9j4ChgLUt8Gfm5CNGLN6khXKiqMbnGAW4cgXgxK'], + ['BSOL/USD', '5cN76Xm2Dtx9MnrQqBDeZZRsWruTTcw37UruznAdSvvE'], + ['BONK/USD', 'DBE3N8uNjhKPRHfANdwGvCZghWXyLPdqdSbEW2XFwBiX'], + ['W/USD', 'BEMsCSQEGi2kwPA4mKnGjxnreijhMki7L4eeb96ypzF9'], + ['KMNO/USD', 'ArjngUHXrQPr1wH9Bqrji9hdDQirM6ijbzc1Jj1fXUk7'], + ['MEW/USD', 'EF6U755BdHMXim8RBw6XSC6Yk6XaouTKpwcBZ7QkcanB'], + ['TNSR/USD', '9TSGDwcPQX4JpAvZbu2Wp5b68wSYkQvHCvfeBjYcCyC'], + ['USDC/USD', 'Dpw1EAVrSB1ibxiDQyTAW6Zip3J4Btk2x4SgApQCeFbX'], + ['BTC/USD', '4cSM2e6rvbGQUFiJbqytoVMi5GgghSMr8LwVrT9VPSPo'], + ['JTO/USD', '7ajR2zA4MGMMTqRAVjghTKqPPn4kbrj3pYkAVRVwTGzP'], + ['USDT/USD', 'HT2PLQBcG5EiCcNSaMHAjSgd9F98ecpATbk4Sk5oYuM'], + ['JUP/USD', '7dbob1psH1iZBS7qPsm3Kwbf5DzSXK8Jyg31CTgTnxH5'], + ['ETH/USD', '42amVS4KgzR9rA28tkVYqVXjq9Qa8dcZQMbH5EYFX6XC'], + ['PYTH/USD', '8vjchtMuJNY4oFQdTi8yCe6mhCaNBFaUbktT482TpLPS'], + ['HNT/USD', '4DdmDswskDxXGpwHrXUfn2CNUm9rt21ac79GHNTN3J33'], + ['RNDR/USD', 'GbgH1oen3Ne1RY4LwDgh8kEeA1KywHvs5x8zsx6uNV5M'], + ['ORCA/USD', '4CBshVeNBEXz24GZpoj8SrqP5L7VGG3qjGd6tCST1pND'], + ['SAMO/USD', '2eUVzcYccqXzsDU1iBuatUaDCbRKBjegEaPPeChzfocG'], + ['WIF/USD', '6B23K3tkb51vLZA14jcEQVCA1pfHptzEHFA93V5dYwbT'], + ['LST/USD', '7aT9A5knp62jVvnEW33xaWopaPHa3Y7ggULyYiUsDhu8'], + ['INF/USD', 'Ceg5oePJv1a6RR541qKeQaTepvERA3i8SvyueX9tT8Sq'], + ['PRCL/USD', '6a9HN13ZFf57WZd4msn85KWLe5iTayqS8Ee8gstQkxqm'], + ['RAY/USD', 'Hhipna3EoWR7u8pDruUg8RxhP5F6XLh6SEHMVDmZhWi8'], + ['FIDA/USD', '2cfmeuVBf7bvBJcjKBQgAwfvpUvdZV7K8NZxUEuccrub'], + ['MNDE/USD', 'GHKcxocPyzSjy7tWApQjKRkDNuVXd4Kk624zhuaR7xhC'], + ['MOBILE/USD', 'DQ4C1tzvu28cwo1roN1Wm6TW35sfJEjLh517k3ZeWevx'], + ['IOT/USD', '8UYEn5Weq7toHwgcmctvcAxaNJo3SJxXEayM57rpoXr9'], + ['GOFX/USD', '2WS7DByXgzmsGD1QfDyvY2pwAmxjsPDrF2DijwpRBxr7'], + ['NEON/USD', 'F2VfCymdNQiCa8Vyg5E7BwEv9UPwfm8cVN6eqQLqXiGo'], + ['AUD/USD', '6pPXqXcgFFoLEcXfedWJy3ypNZVJ1F3mgipaDFsvZ1co'], + ['GBP/USD', 'G25Tm7UkVruTJ7mcbCxFm45XGWwsH72nJKNGcHEQw1tU'], + ['EUR/USD', 'Fu76ChamBDjE8UuGLV6GP2AcPPSU6gjhkNhAyuoPm7ny'], + ['XAG/USD', 'H9JxsWwtDZxjSL6m7cdCVsWibj3JBMD9sxqLjadoZnot'], + ['XAU/USD', '2uPQGpm8X4ZkxMHxrAW1QuhXcse1AHEgPih6Xp9NuEWW'], + ['INJ/USD', 'GwXYEfmPdgHcowF9GZwbb1WiTGTn1fuT3hbSLneoBKK6'], + ['SLND/USD', '6vPfd6612huknxXaDapfj6cVmB8NvCwKm3BHKFxzo1EZ'], + ['WEN/USD', 'CsG7wXoqZKNxx4UnFtvozfwXQ9RgpKe7zSJa4LWh5MT9'], +]; + +export const SB_FEEDS_TO_MIGRATE = [ + { + name: 'STEP/USD', + pk: '2MW4RK9a7omGDswjLvAmWc75r8zHNdneVwtgqpU1nK3v', + newPk: '5anCm1isKCEyBaiLB4MXL4Q1XDAWgTyfT9i5knQsaZTJ', + pythFeed: 'usd', + }, + { + name: 'POPCAT/USD', + pk: '2stQe1XLGkuTZ22gQrgZKsb93iG9mWXSLfANMPRjs5Ky', + newPk: 'G7yd9DdEDjb1ynTTmG2hZhPtenz5DVSzwvwtHf8T6JeW', + pythFeed: 'usd', + }, + { + name: 'USDH/USD', + pk: 'B2iwUqbK6ksAsD21SPUUjjx3EwdswpVWFGkeWPHaYd81', + newPk: 'J2KP4GcXaC16fEB2vne1HsKxtNxsiAGS1geMUFuNpLuo', + pythFeed: 'usd', + }, + { + name: 'NOS/USD', + pk: 'ED844qf2K6M3JFD9RJCqEVaJ9zP2i9B5Rag5YzVw8Tav', + newPk: 'DmAmYWwGQjHy6JY6EKW9fUNs2Bdaj1WNrjVgKEvuaNvL', + pythFeed: 'usd', + }, + { + name: 'GUAC/USD', + pk: '2kbaLTLTovQxkVzmwTXt5ddJKGgmpEAfx9ZNxZMspy8s', + newPk: 'GBTqdMpJ3uJjzdhcCf9JYAwE2fXSSyPdJU1PL41PKZ1k', + pythFeed: 'usd', + }, + { + name: 'CORN/USD', + pk: 'BBZWtK26bnwnC6gtyEy2Z5XdrqGJTj4aEevkphuzA5Q8', + newPk: 'CfXTvsF6E7ysLg6HnnmNpnaoYSa59rHuDcupqeKdy5aJ', + pythFeed: 'usd', + }, + { + name: 'SLCL/USD', + pk: '5aX5yToaDTkWz6mWKTfC5M9HxwWDSrTopU3UHEVRwp6Y', + newPk: 'BcL5gWHvG5Kmw9okPcAq3ccFm1f3vBUeyvjXwzLLJcd4', + pythFeed: 'usd', + }, + { + name: 'JLP/USD', + pk: 'pmHEXBam7kbmCCg5ED5V7RNMN8e34sKu338KeuFAGof', + newPk: 'ASAKdrSoMew3GerohdwFp3bT6HJPUVt3bZgN3JKFvinS', + pythFeed: 'usd', + }, + { + name: 'SLERF/USD', + pk: '8LxP1juSh9RPMECQiTocqk8bZcrhhtqgUEk76y4AmE2K', + newPk: 'Cewh5ybWrXDxBJ2s7ZVmQsJRXR3DdKKik9P91ymT4MQe', + pythFeed: 'usd', + }, + { + name: 'BOME/USD', + pk: 'JDj6n1iBeJUB54rNsmKw9ty2psAnkcXySLRshBWrYfGD', + newPk: 'DNChSQVXuefoZzeQURJ3JE7r8MsQ2aB8f1TSV75BEGmX', + pythFeed: 'usd', + }, + { + name: 'WEN/USD', + pk: 'DzGXTYWCAsQhZbP3KGPeA8G8SA7ynTNntrtDWZ2kPE8n', + newPk: '4ctjNHu5xTrurB4wFCiZs8puC5UmQ4bFfAKVUuUG7E9Z', + pythFeed: 'usd', + }, + { + name: 'MEW/USD', + pk: 'BogEXWj8YcrXV31D7FzzUmTCS1hFHfRGZN7rnVN1Vcqe', + newPk: '2GNGnpmku4Aw7ku3Xa3fZyPugcDg1GADSzu2C1pWXB7E', + pythFeed: 'usd', + }, + { + name: 'MOTHER/USD', + pk: '273kfU17iwVVgYCRrRR9rFmT2R8FysSPQ2jETuix2gpd', + newPk: 'HcWVxt6fwp2i149GunKohiZCi9jz3tqXyD31drn9USoX', + pythFeed: 'usd', + }, + { + name: 'USDY/USD', + pk: '5RKJ9unGQQhHezsNg7wshfJD4c5jJ64iXYu1nk6PJ5fb', + newPk: '234oAERsti3gMYH8DNXxawKm7jGLwqgSsGB5Cz72KeXU', + pythFeed: 'usd', + }, + { + name: 'PUPS/USD', + pk: 'ApF6hz2W7FSKMgmmpWxLm6ijA2J5vU2XDBaBLvjbyMbm', + newPk: 'zH9ZpmU6xb6G2NzbujZthvUVdFxwAmbAgRrVX93gUX1', + pythFeed: 'usd', + }, + { + name: 'GECKO/USD', + pk: 'ERWF6PnFCVPWeDM9VGCQDC7pASvVrCUwv9Tk3Mh3oXGG', + newPk: 'CseiaHZ8rT2MaD2RFb924huBpkQhd5Gvxd8egmbKBqeK', + pythFeed: 'usd', + }, + { + name: 'KMNO/USD', + pk: 'H8oLEoDyvABEDmGmXQuuzvSPWAkr2f2GKytbXiGX9YUm', + newPk: 'ELMSj3w18giUcfU7XHDwxQn8A4At4Ao8aadopP2ZvWpn', + pythFeed: 'usd', + }, + { + name: 'INF/USD', + pk: '6AQHz9mpGNjyVafcWdqzzgsJq14Cs8gG6MiQKmdAgCuP', + newPk: '6dM4Wppuz8GtpAqd5xgd1abtXCd1VBfqJAkkhTYW3JpZ', + pythFeed: 'usd', + }, + { + name: 'GME/USD', + pk: 'B9BzQ6hBBFn3C6fsGsVwcFd1v5cdbAwi8bUNmL58Bx8z', + newPk: '3zz1k5dcKVSkiFh3DRaTMsZbAckEk1DNiJrWUJKJw2Nr', + pythFeed: 'usd', + }, + { + name: 'BILLY/USD', + pk: 'DKt5kYg2wcY3SpbMZrYcJUg23mwEEQ2PsCioyPfcX633', + newPk: 'BvNyTAZp8P1KXXxb8U28Za8XAJGR4CGagexcPoYYr3BE', + pythFeed: 'usd', + }, + { + name: 'LNGCAT/USD', + pk: 'H5DimRdrm4xjMMEzg574QKkfaHZcraGLqC85JJ4PBm58', + newPk: '4CgXzP6uCV829KtrvaXY6UuBJz6M4YjHy4YWzo4hanb9', + pythFeed: 'usd', + }, + { + name: 'CROWN/USD', + pk: 'RMy7j7BUNxhE4Njgq69KC6ZLzZEpKWoKSp4Y5JQPQLE', + newPk: 'HJQfdAcZGgo9eJXkzPebcARe7Ptxv1G5xjcucZMvNSpt', + pythFeed: 'usd', + }, + { + name: 'OPOS/USD', + pk: '3nM4m9FX1ENp3vfbJKMK6mELH7PSPQX5apzonHB9VZeL', + newPk: '59rJDd4xxZFsouZ73sTj3ysnNPCTmunTiThS21NHEazz', + pythFeed: 'usd', + }, + { + name: 'KIN/USD', + pk: 'FS4pE37HCGtwjrf4g3G4YfdfRN64nTm1z8iFNHyjZHB5', + newPk: 'HHkJVKgbueG4eoeHf3WCXSuG3MVAqq2MwAaeiZBkTc1g', + pythFeed: 'usd', + }, +]; diff --git a/ts/client/scripts/governanceInstructions/createProposal.ts b/ts/client/scripts/governanceInstructions/createProposal.ts index c22ce47dd..e3512edb5 100644 --- a/ts/client/scripts/governanceInstructions/createProposal.ts +++ b/ts/client/scripts/governanceInstructions/createProposal.ts @@ -1,3 +1,5 @@ +import { SequenceType } from '@blockworks-foundation/mangolana/lib/globalTypes'; +import { sendSignAndConfirmTransactions } from '@blockworks-foundation/mangolana/lib/transactions'; import { getGovernanceProgramVersion, getInstructionDataFromBase64, @@ -12,18 +14,11 @@ import { withInsertTransaction, withSignOffProposal, } from '@solana/spl-governance'; -import { - Connection, - PublicKey, - Transaction, - TransactionInstruction, -} from '@solana/web3.js'; +import { Connection, PublicKey, TransactionInstruction } from '@solana/web3.js'; import { chunk } from 'lodash'; +import { createComputeBudgetIx } from '../../src/utils/rpc'; import { updateVoterWeightRecord } from './updateVoteWeightRecord'; import { VsrClient } from './voteStakeRegistryClient'; -import { createComputeBudgetIx } from '../../src/utils/rpc'; -import { sendSignAndConfirmTransactions } from '@blockworks-foundation/mangolana/lib/transactions'; -import { SequenceType } from '@blockworks-foundation/mangolana/lib/globalTypes'; export const MANGO_MINT = 'MangoCzJ36AjZyKwVj3VnYU4GTonjfVEnJmvvWaxLac'; export const MANGO_REALM_PK = new PublicKey( @@ -142,8 +137,32 @@ export const createProposal = async ( ); } - const txChunks = chunk([...instructions, ...insertInstructions], 2); + let txChunks = chunk([...instructions], 2); + await sendSignAndConfirmTransactions({ + connection, + wallet, + transactionInstructions: txChunks.map((txChunk) => ({ + instructionsSet: [ + { + signers: [], + transactionInstruction: createComputeBudgetIx(80000), + }, + ...txChunk.map((tx) => ({ + signers: [], + transactionInstruction: tx, + })), + ], + sequenceType: SequenceType.Sequential, + })), + config: { + maxRetries: 5, + autoRetry: true, + maxTxesInBatch: 20, + logFlowInfo: true, + }, + }); + txChunks = chunk([...insertInstructions], 1); await sendSignAndConfirmTransactions({ connection, wallet, diff --git a/ts/client/scripts/perp-funding-debug.ts b/ts/client/scripts/perp-funding-debug.ts new file mode 100644 index 000000000..1b1d37eff --- /dev/null +++ b/ts/client/scripts/perp-funding-debug.ts @@ -0,0 +1,44 @@ +import { PublicKey } from '@solana/web3.js'; +import { MangoClient } from '../src/client'; + +async function main(): Promise { + const client = await MangoClient.connectDefault(process.env.MB_CLUSTER_URL!); + + // eslint-disable-next-line no-constant-condition + while (true) { + const group = await client.getGroup( + new PublicKey('78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX'), + ); + + const perpMarket = Array.from(group.perpMarketsMapByName.values()).filter( + (pm) => pm.name == 'SOL-PERP', + )[0]; + + console.log(`Long funding ${perpMarket.longFunding.toNumber().toLocaleString()}`); + console.log(`Short funding ${perpMarket.shortFunding.toNumber().toLocaleString()}`); + const bids = await perpMarket.loadBids(client); + const asks = await perpMarket.loadAsks(client); + console.log(`FR ${perpMarket.getInstantaneousFundingRateUi(bids, asks)}`); + + const mangoAccount = await client.getMangoAccount( + new PublicKey('BLgb4NFwhpurMrGX5LQfb8D8dBpGSGtBqqew2Em8uyRT'), + false, + ); + const perpPosition = mangoAccount.getPerpPosition(perpMarket.perpMarketIndex); + console.log( + `Long settled funding ${perpPosition?.longSettledFunding + .toNumber() + .toLocaleString()}`, + ); + console.log( + `Short settled funding ${perpPosition?.shortSettledFunding + .toNumber() + .toLocaleString()}`, + ); + console.log(`Unsettled funding ui ${perpPosition?.getUnsettledFundingUi(perpMarket)}`); + console.log(''); + await new Promise((r) => setTimeout(r, 5 * 1000)); + } +} + +main(); diff --git a/ts/client/scripts/template.ts b/ts/client/scripts/template.ts new file mode 100644 index 000000000..77724939c --- /dev/null +++ b/ts/client/scripts/template.ts @@ -0,0 +1,43 @@ +import { PublicKey } from '@solana/web3.js'; +import { SB_ON_DEMAND_PID } from '@switchboard-xyz/on-demand'; +import { isSwitchboardOracle } from '../src/accounts/oracle'; +import { MangoClient } from '../src/client'; + +async function main(): Promise { + const client = await MangoClient.connectDefault(process.env.MB_CLUSTER_URL!); + const group = await client.getGroup( + new PublicKey('78b8f4cGCwmZ9ysPFMWLaLTkkaYnUjwMJYStWe5RTSSX'), + ); + + const allOracles = Array.from(group.banksMapByName.values()) + .flat() + .map((b) => [b.name, b.oracle]) + .concat( + Array.from(group.banksMapByName.values()) + .flat() + .map((b) => [b.name, b.fallbackOracle]) + .filter( + (item) => + item[1] instanceof PublicKey && !item[1].equals(PublicKey.default), + ), + ); + + const oraclePublicKeys = allOracles.map((item) => item[1] as PublicKey); + const ais = await client.program.provider.connection.getMultipleAccountsInfo( + oraclePublicKeys, + ); + + const result = ais + .map((ai, idx) => { + return [ + isSwitchboardOracle(ai!) && !ai?.owner.equals(SB_ON_DEMAND_PID), + allOracles[idx], + ]; + }) + .filter((item) => item[0]) + .map((item) => item[1]); + + console.log(result); +} + +main(); diff --git a/ts/client/scripts/update-risk-params.ts b/ts/client/scripts/update-risk-params.ts index 5873fc060..130d2fec5 100644 --- a/ts/client/scripts/update-risk-params.ts +++ b/ts/client/scripts/update-risk-params.ts @@ -1,7 +1,6 @@ import { LISTING_PRESETS, MidPriceImpact, - getMidPriceImpacts, } from '@blockworks-foundation/mango-v4-settings/lib/helpers/listingTools'; import { AnchorProvider, Wallet } from '@coral-xyz/anchor'; import { BN } from '@project-serum/anchor'; @@ -27,11 +26,7 @@ import { MangoAccount } from '../src/accounts/mangoAccount'; import { MangoClient } from '../src/client'; import { NullTokenEditParams } from '../src/clientIxParamBuilder'; import { MANGO_V4_MAIN_GROUP as MANGO_V4_PRIMARY_GROUP } from '../src/constants'; -import { - LiqorPriceImpact, - buildGroupGrid, - getEquityForMangoAccounts, -} from '../src/risk'; +import { getEquityForMangoAccounts } from '../src/risk'; import { buildFetch, toNativeI80F48ForQuote, @@ -58,6 +53,30 @@ const { DRY_RUN, } = process.env; +function wrapWithForwarder( + ix: TransactionInstruction, + signer: PublicKey, + timeout: BN, +): TransactionInstruction { + return new TransactionInstruction({ + keys: [ + { + pubkey: signer, + isSigner: true, + isWritable: false, + }, + { + pubkey: ix.programId, + isSigner: false, + isWritable: false, + }, + ...ix.keys, + ], + programId: new PublicKey('ixFPGCPYEp5GzhoahhHFVL8VVzkq1kc2eeFZh3qpYca'), + data: Buffer.concat([timeout.toArrayLike(Buffer, 'le', 8), ix.data]), + }); +} + const getApiTokenName = (bankName: string): string => { if (bankName === 'ETH (Portal)') { return 'ETH'; @@ -142,27 +161,27 @@ async function updateTokenParams(): Promise { const instructions: TransactionInstruction[] = []; - const allMangoAccounts = await client.getAllMangoAccounts(group, true); + // const allMangoAccounts = await client.getAllMangoAccounts(group, true); - const stepSize = 1; + // const stepSize = 1; - const ttlLiqorEquityUi = await getTotalLiqorEquity( - client, - group, - allMangoAccounts, - ); + // const ttlLiqorEquityUi = await getTotalLiqorEquity( + // client, + // group, + // allMangoAccounts, + // ); - const midPriceImpacts = getMidPriceImpacts(group.pis); + // const midPriceImpacts = getMidPriceImpacts(group.pis); - const pisForLiqor: LiqorPriceImpact[][] = []; - // eslint-disable-next-line no-constant-condition - if (false) { - const pisForLiqor: LiqorPriceImpact[][] = await buildGroupGrid( - group, - allMangoAccounts, - stepSize, - ); - } + // const pisForLiqor: LiqorPriceImpact[][] = []; + // // eslint-disable-next-line no-constant-condition + // if (false) { + // const pisForLiqor: LiqorPriceImpact[][] = await buildGroupGrid( + // group, + // allMangoAccounts, + // stepSize, + // ); + // } // eslint-disable-next-line no-constant-condition // if (false) { @@ -180,6 +199,8 @@ async function updateTokenParams(): Promise { // ); // } + console.log(Array.from(group.banksMapByTokenIndex.values()).length); + Array.from(group.banksMapByTokenIndex.values()) .map((banks) => banks[0]) .sort((a, b) => a.name.localeCompare(b.name)) @@ -187,6 +208,7 @@ async function updateTokenParams(): Promise { const builder = Builder(NullTokenEditParams); let change = false; + // try { const tier = Object.values(LISTING_PRESETS).find((x) => x.initLiabWeight.toFixed(1) === '1.8' ? x.initLiabWeight.toFixed(1) === @@ -196,27 +218,73 @@ async function updateTokenParams(): Promise { bank?.initLiabWeight.toNumber().toFixed(1), ); - if (!tier) { - console.log(`Cant estimate tier for ${bank.name}!`); - return; - } + // const maybeSbOracle = SB_FEEDS_TO_MIGRATE.filter( + // (x) => x.name.replace('/USD', '') === bank.name.toLocaleUpperCase(), + // ); + // if (maybeSbOracle.length > 0) { + // console.log(` - ${bank.name} ${maybeSbOracle[0].name}`); + // builder.oracle(new PublicKey(maybeSbOracle[0].newPk)); + // change = true; + // } else { + // return; + // } + + // if (bank.oracleProvider != OracleProvider.Pyth) { + // console.log(`Skipping ${bank.name}, since not pyth`); + // return; + // } + // if (bank.reduceOnly == 1) { + // console.log(`Skipping ${bank.name}, since reduceOnly`); + // return; + // } + // const maybePythV2Feed = PYTH_SPONSORED_ORACLES.filter( + // (x) => + // x[0].replace('/USD', '') == + // (bank.name.includes('BTC') + // ? 'BTC' + // : bank.name.includes('ETH') + // ? 'ETH' + // : bank.name.toUpperCase()), + // ); + // if (maybePythV2Feed.length > 0) { + // console.log(` - ${bank.name} ${bank.oracle} ${maybePythV2Feed[0][0]}`); + // builder.oracle(new PublicKey(maybePythV2Feed[0][1])); + // change = true; + // } else { + // console.log(`Skipping ${bank.name}, cant find pyth feed`); + // } + // if ( + // bank.reduceOnly != 1 && + // maybePythV2Feed.length == 0 && + // bank.oracleProvider == OracleProvider.Pyth && + // !['CHAI', 'DAI', 'BLZE', 'MNGO', 'RENDER'].some( + // (item) => item == bank.name, + // ) + // ) { + // throw new Error(`No pyth feed for ${bank.name}`); + // } // eslint-disable-next-line no-constant-condition - // if (true) { - // if ( - // bank.uiBorrows() == 0 && - // bank.reduceOnly == 2 && - // bank.initAssetWeight.toNumber() == 0 && - // bank.maintAssetWeight.toNumber() == 0 - // ) { - // builder.disableAssetLiquidation(true); - // builder.oracleConfig({ - // confFilter: 1000, - // maxStalenessSlots: -1, - // }); - // change = true; - // } - // } + if (true) { + if ( + bank.uiBorrows() == 0 && + bank.reduceOnly == 2 && + bank.initAssetWeight.toNumber() == 0 && + bank.maintAssetWeight.toNumber() == 0 + ) { + builder.disableAssetLiquidation(true); + builder.oracleConfig({ + confFilter: 1000, + maxStalenessSlots: -1, + }); + change = true; + console.log( + ` - ${bank.name}, ${( + bank.uiDeposits() * bank.uiPrice + ).toLocaleString()} disabled asset liquidation`, + ); + } + } // // eslint-disable-next-line no-constant-condition // if (true) { @@ -279,15 +347,13 @@ async function updateTokenParams(): Promise { // ); // eslint-disable-next-line no-constant-condition - if (!bank.areBorrowsReduceOnly()) { + if (false) { // Net borrow limits - let netBorrowLimitPerWindowQuote = Math.max( - toUiDecimalsForQuote(tier!.netBorrowLimitPerWindowQuote), + const netBorrowLimitPerWindowQuote = Math.max( + 10_000, Math.min(bank.uiDeposits() * bank.uiPrice, 300_000) / 3 + Math.max(0, bank.uiDeposits() * bank.uiPrice - 300_000) / 5, ); - netBorrowLimitPerWindowQuote = - Math.round(netBorrowLimitPerWindowQuote / 10_000) * 10_000; builder.netBorrowLimitPerWindowQuote( toNativeI80F48ForQuote(netBorrowLimitPerWindowQuote).toNumber(), ); @@ -297,21 +363,17 @@ async function updateTokenParams(): Promise { toUiDecimalsForQuote(bank.netBorrowLimitPerWindowQuote) ) { console.log( - `${bank.name}, ${bank.uiDeposits() * bank.uiPrice}$ (${ - Math.min(bank.uiDeposits() * bank.uiPrice, 300_000) / 3 - }, ${ - Math.max(0, bank.uiDeposits() * bank.uiPrice - 300_000) / 5 - }), ${ - tier?.netBorrowLimitPerWindowQuote - } , new - ${netBorrowLimitPerWindowQuote}, old - ${toUiDecimalsForQuote( + `${ + bank.name + } new - ${netBorrowLimitPerWindowQuote.toLocaleString()}, old - ${toUiDecimalsForQuote( bank.netBorrowLimitPerWindowQuote, - )}`, + ).toLocaleString()}`, ); } } - // Deposit limits - // eslint-disable-next-line no-constant-condition + // // Deposit limits + // // eslint-disable-next-line no-constant-condition // if (false) { // if (bank.maintAssetWeight.toNumber() > 0) { // { @@ -375,8 +437,14 @@ async function updateTokenParams(): Promise { // } const params = builder.build(); + if (change) { + // console.log( + // `${bank.name}, ${params.disableAssetLiquidation} ${params.oracleConfig?.maxStalenessSlots} ${params.oracleConfig?.confFilter}`, + // ); + // console.log(`${bank.name}, ${bank.oracle} ${params.oracle}`); + } - const ix = await client.program.methods + let ix = await client.program.methods .tokenEdit( params.oracle, params.oracleConfig, @@ -441,6 +509,12 @@ async function updateTokenParams(): Promise { ]) .instruction(); + ix = wrapWithForwarder( + ix, + new PublicKey('8SSLjXBEVk9nesbhi9UMCA32uijbVBUqWoKPPQPTekzt'), + new BN(new Date().getTime() / 1000 + 60 * 60 * 24 * 2 * 7), // 2 weeks + ); + const tx = new Transaction({ feePayer: wallet.publicKey }).add(ix); const simulated = await client.connection.simulateTransaction(tx); @@ -452,6 +526,10 @@ async function updateTokenParams(): Promise { if (change) { instructions.push(ix); } + // } catch (error) { + // // console.log(error.stack); + // console.log(`....Skipping ${bank.name}, ${error}`); + // } }); const tokenOwnerRecordPk = await getTokenOwnerRecordAddress( @@ -480,7 +558,7 @@ async function updateTokenParams(): Promise { tokenOwnerRecord, PROPOSAL_TITLE ? PROPOSAL_TITLE - : 'Update net borrow limits for tokens in mango-v4', + : 'Switch remaining switchboard oracles mango-v4', PROPOSAL_LINK ?? '', Object.values(proposals).length, instructions, diff --git a/ts/client/src/accounts/group.ts b/ts/client/src/accounts/group.ts index c3997569a..96015d4d0 100644 --- a/ts/client/src/accounts/group.ts +++ b/ts/client/src/accounts/group.ts @@ -1,6 +1,5 @@ import { BorshAccountsCoder } from '@coral-xyz/anchor'; import { Market, Orderbook } from '@project-serum/serum'; -import { parsePriceData } from '@pythnetwork/client'; import { TOKEN_PROGRAM_ID, unpackAccount } from '@solana/spl-token'; import { AccountInfo, @@ -26,6 +25,7 @@ import { OracleProvider, isPythOracle, isSwitchboardOracle, + parsePythOracle, parseSwitchboardOracle, } from './oracle'; import { BookSide, PerpMarket, PerpMarketIndex } from './perp'; @@ -493,15 +493,14 @@ export class Group { provider = OracleProvider.Stub; deviation = stubOracle.deviation; } else if (isPythOracle(ai)) { - const priceData = parsePriceData(ai.data); - uiPrice = priceData.previousPrice; + const priceData = parsePythOracle(ai, client.program.provider.connection); + uiPrice = priceData.price; price = this.toNativePrice(uiPrice, baseDecimals); - lastUpdatedSlot = parseInt(priceData.lastSlot.toString()); + lastUpdatedSlot = priceData.lastUpdatedSlot; deviation = - priceData.previousConfidence !== undefined - ? this.toNativePrice(priceData.previousConfidence, baseDecimals) + priceData.uiDeviation !== undefined + ? this.toNativePrice(priceData.uiDeviation, baseDecimals) : undefined; - provider = OracleProvider.Pyth; } else if (isSwitchboardOracle(ai)) { const priceData = await parseSwitchboardOracle( diff --git a/ts/client/src/accounts/oracle.ts b/ts/client/src/accounts/oracle.ts index 8804a600c..95076f183 100644 --- a/ts/client/src/accounts/oracle.ts +++ b/ts/client/src/accounts/oracle.ts @@ -1,5 +1,5 @@ -import { AnchorProvider, Wallet } from '@coral-xyz/anchor'; -import { Magic as PythMagic } from '@pythnetwork/client'; +import { AnchorProvider, Program, Wallet } from '@coral-xyz/anchor'; +import { parsePriceData, Magic as PythMagic } from '@pythnetwork/client'; import { AccountInfo, Connection, Keypair, PublicKey } from '@solana/web3.js'; import { SB_ON_DEMAND_PID } from '@switchboard-xyz/on-demand'; import SwitchboardProgram from '@switchboard-xyz/sbv2-lite'; @@ -7,7 +7,13 @@ import Big from 'big.js'; import BN from 'bn.js'; import { Program as Anchor30Program } from 'switchboard-anchor'; +import { + DEFAULT_RECEIVER_PROGRAM_ID, + PythSolanaReceiverProgram, +} from '@pythnetwork/pyth-solana-receiver'; +import { IDL } from '@pythnetwork/pyth-solana-receiver/lib/idl/pyth_solana_receiver'; import { I80F48, I80F48Dto } from '../numbers/I80F48'; +import { toUiDecimals } from '../utils'; const SBV1_DEVNET_PID = new PublicKey( '7azgmy1pFXHikv36q1zZASvFq5vFa39TT9NweVugKKTU', @@ -38,6 +44,7 @@ export const SOL_MINT_MAINNET = new PublicKey( let sbv2DevnetProgram; let sbv2MainnetProgram; let sbOnDemandProgram; +let pythSolanaReceiverProgram; export enum OracleProvider { Pyth, @@ -263,6 +270,9 @@ export function isSwitchboardOracle(accountInfo: AccountInfo): boolean { } export function isPythOracle(accountInfo: AccountInfo): boolean { + if (accountInfo.owner.equals(DEFAULT_RECEIVER_PROGRAM_ID)) { + return true; + } return accountInfo.data.readUInt32LE(0) === PythMagic; } @@ -296,6 +306,60 @@ export function isClmmOracle(accountInfo: AccountInfo): boolean { return isOrcaOracle(accountInfo) || isRaydiumOracle(accountInfo); } +export function parsePythOracle( + accountInfo: AccountInfo, + connection: Connection, +): { + price: number; + lastUpdatedSlot: number; + uiDeviation: number; +} { + if (accountInfo.owner.equals(DEFAULT_RECEIVER_PROGRAM_ID)) { + if (!pythSolanaReceiverProgram) { + const options = AnchorProvider.defaultOptions(); + const provider = new AnchorProvider( + connection, + new Wallet(new Keypair()), + options, + ); + pythSolanaReceiverProgram = new Program( + IDL as PythSolanaReceiverProgram, + DEFAULT_RECEIVER_PROGRAM_ID, + provider, + ); + } + + const decoded = pythSolanaReceiverProgram.coder.accounts.decode( + 'priceUpdateV2', + accountInfo.data, + ); + + return { + price: toUiDecimals( + decoded.priceMessage.price.toNumber(), + -decoded.priceMessage.exponent, + ), + publishedTime: decoded.priceMessage.publishTime.toNumber(), + lastUpdatedSlot: decoded.postedSlot.toNumber(), + uiDeviation: toUiDecimals( + decoded.priceMessage.conf.toNumber(), + -decoded.priceMessage.exponent, + ), + } as any; + } + + if (accountInfo.data.readUInt32LE(0) === PythMagic) { + const priceData = parsePriceData(accountInfo.data); + return { + price: priceData.previousPrice, + lastUpdatedSlot: parseInt(priceData.lastSlot.toString()), + uiDeviation: priceData.previousConfidence, + }; + } + + throw new Error('Unknown Pyth oracle!'); +} + export function isOracleStaleOrUnconfident( nowSlot: number, maxStalenessSlots: number, diff --git a/ts/client/src/mango_v4.ts b/ts/client/src/mango_v4.ts index 659bc56e9..31233e3d9 100644 --- a/ts/client/src/mango_v4.ts +++ b/ts/client/src/mango_v4.ts @@ -1,5 +1,5 @@ export type MangoV4 = { - "version": "0.24.1", + "version": "0.24.2", "name": "mango_v4", "instructions": [ { @@ -11166,6 +11166,9 @@ export type MangoV4 = { }, { "name": "SwitchboardOnDemand" + }, + { + "name": "PythV2" } ] } @@ -14485,7 +14488,7 @@ export type MangoV4 = { }; export const IDL: MangoV4 = { - "version": "0.24.1", + "version": "0.24.2", "name": "mango_v4", "instructions": [ { @@ -25652,6 +25655,9 @@ export const IDL: MangoV4 = { }, { "name": "SwitchboardOnDemand" + }, + { + "name": "PythV2" } ] } diff --git a/tsconfig.json b/tsconfig.json index 631e5ede3..51a6f69f1 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -8,15 +8,7 @@ "resolveJsonModule": true, "skipLibCheck": true, "strictNullChecks": true, - "target": "esnext", - // "paths": { - // "C-v1": [ - // "node_modules/C@1.0.0" - // ], - // "C-v2": [ - // "node_modules/C@2.0.0" - // ] - // } + "target": "esnext" }, "ts-node": { // these options are overrides used only by ts-node @@ -25,7 +17,6 @@ "module": "commonjs" } }, - "include": [ - "ts/client/src" - ] -} \ No newline at end of file + "include": ["ts/client/src"], + "exclude": ["ts/client/scripts"] +} diff --git a/yarn.lock b/yarn.lock index 5508f48eb..236f25bba 100644 --- a/yarn.lock +++ b/yarn.lock @@ -24,10 +24,10 @@ js-tokens "^4.0.0" picocolors "^1.0.0" -"@babel/runtime@^7.10.5", "@babel/runtime@^7.24.7": - version "7.24.7" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12" - integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw== +"@babel/runtime@^7.10.5", "@babel/runtime@^7.12.5", "@babel/runtime@^7.24.8": + version "7.25.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.0.tgz#3af9a91c1b739c569d5d80cc917280919c544ecb" + integrity sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw== dependencies: regenerator-runtime "^0.14.0" @@ -55,6 +55,27 @@ resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== +"@coral-xyz/anchor-30@npm:@coral-xyz/anchor@0.30.1": + version "0.30.1" + resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.30.1.tgz#17f3e9134c28cd0ea83574c6bab4e410bcecec5d" + integrity sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ== + dependencies: + "@coral-xyz/anchor-errors" "^0.30.1" + "@coral-xyz/borsh" "^0.30.1" + "@noble/hashes" "^1.3.1" + "@solana/web3.js" "^1.68.0" + bn.js "^5.1.2" + bs58 "^4.0.1" + buffer-layout "^1.2.2" + camelcase "^6.3.0" + cross-fetch "^3.1.5" + crypto-hash "^1.3.0" + eventemitter3 "^4.0.7" + pako "^2.0.3" + snake-case "^3.0.4" + superstruct "^0.15.4" + toml "^3.0.0" + "@coral-xyz/anchor-errors@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@coral-xyz/anchor-errors/-/anchor-errors-0.30.1.tgz#bdfd3a353131345244546876eb4afc0e125bec30" @@ -123,13 +144,12 @@ superstruct "^0.15.4" toml "^3.0.0" -"@coral-xyz/anchor@^0.30.0": - version "0.30.1" - resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.30.1.tgz#17f3e9134c28cd0ea83574c6bab4e410bcecec5d" - integrity sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ== +"@coral-xyz/anchor@^0.29.0": + version "0.29.0" + resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.29.0.tgz#bd0be95bedfb30a381c3e676e5926124c310ff12" + integrity sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA== dependencies: - "@coral-xyz/anchor-errors" "^0.30.1" - "@coral-xyz/borsh" "^0.30.1" + "@coral-xyz/borsh" "^0.29.0" "@noble/hashes" "^1.3.1" "@solana/web3.js" "^1.68.0" bn.js "^5.1.2" @@ -160,6 +180,14 @@ bn.js "^5.1.2" buffer-layout "^1.2.0" +"@coral-xyz/borsh@^0.29.0": + version "0.29.0" + resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.29.0.tgz#79f7045df2ef66da8006d47f5399c7190363e71f" + integrity sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ== + dependencies: + bn.js "^5.1.2" + buffer-layout "^1.2.0" + "@coral-xyz/borsh@^0.30.0", "@coral-xyz/borsh@^0.30.1": version "0.30.1" resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.30.1.tgz#869d8833abe65685c72e9199b8688477a4f6b0e3" @@ -180,116 +208,236 @@ resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f" integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ== +"@esbuild/aix-ppc64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz#145b74d5e4a5223489cabdc238d8dad902df5259" + integrity sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ== + "@esbuild/android-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052" integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A== +"@esbuild/android-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz#453bbe079fc8d364d4c5545069e8260228559832" + integrity sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ== + "@esbuild/android-arm@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28" integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg== +"@esbuild/android-arm@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.23.0.tgz#26c806853aa4a4f7e683e519cd9d68e201ebcf99" + integrity sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g== + "@esbuild/android-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e" integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA== +"@esbuild/android-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.23.0.tgz#1e51af9a6ac1f7143769f7ee58df5b274ed202e6" + integrity sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ== + "@esbuild/darwin-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a" integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ== +"@esbuild/darwin-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz#d996187a606c9534173ebd78c58098a44dd7ef9e" + integrity sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow== + "@esbuild/darwin-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22" integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw== +"@esbuild/darwin-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz#30c8f28a7ef4e32fe46501434ebe6b0912e9e86c" + integrity sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ== + "@esbuild/freebsd-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e" integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g== +"@esbuild/freebsd-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz#30f4fcec8167c08a6e8af9fc14b66152232e7fb4" + integrity sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw== + "@esbuild/freebsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261" integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ== +"@esbuild/freebsd-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz#1003a6668fe1f5d4439e6813e5b09a92981bc79d" + integrity sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ== + "@esbuild/linux-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b" integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q== +"@esbuild/linux-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz#3b9a56abfb1410bb6c9138790f062587df3e6e3a" + integrity sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw== + "@esbuild/linux-arm@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9" integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA== +"@esbuild/linux-arm@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz#237a8548e3da2c48cd79ae339a588f03d1889aad" + integrity sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw== + "@esbuild/linux-ia32@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2" integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg== +"@esbuild/linux-ia32@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz#4269cd19cb2de5de03a7ccfc8855dde3d284a238" + integrity sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA== + "@esbuild/linux-loong64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df" integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg== +"@esbuild/linux-loong64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz#82b568f5658a52580827cc891cb69d2cb4f86280" + integrity sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A== + "@esbuild/linux-mips64el@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe" integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg== +"@esbuild/linux-mips64el@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz#9a57386c926262ae9861c929a6023ed9d43f73e5" + integrity sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w== + "@esbuild/linux-ppc64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4" integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w== +"@esbuild/linux-ppc64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz#f3a79fd636ba0c82285d227eb20ed8e31b4444f6" + integrity sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw== + "@esbuild/linux-riscv64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc" integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA== +"@esbuild/linux-riscv64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz#f9d2ef8356ce6ce140f76029680558126b74c780" + integrity sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw== + "@esbuild/linux-s390x@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de" integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A== +"@esbuild/linux-s390x@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz#45390f12e802201f38a0229e216a6aed4351dfe8" + integrity sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg== + "@esbuild/linux-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0" integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ== +"@esbuild/linux-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz#c8409761996e3f6db29abcf9b05bee8d7d80e910" + integrity sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ== + "@esbuild/netbsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047" integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg== +"@esbuild/netbsd-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz#ba70db0114380d5f6cfb9003f1d378ce989cd65c" + integrity sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw== + +"@esbuild/openbsd-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz#72fc55f0b189f7a882e3cf23f332370d69dfd5db" + integrity sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ== + "@esbuild/openbsd-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70" integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow== +"@esbuild/openbsd-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz#b6ae7a0911c18fe30da3db1d6d17a497a550e5d8" + integrity sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg== + "@esbuild/sunos-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b" integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg== +"@esbuild/sunos-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz#58f0d5e55b9b21a086bfafaa29f62a3eb3470ad8" + integrity sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA== + "@esbuild/win32-arm64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d" integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A== +"@esbuild/win32-arm64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz#b858b2432edfad62e945d5c7c9e5ddd0f528ca6d" + integrity sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ== + "@esbuild/win32-ia32@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b" integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA== +"@esbuild/win32-ia32@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz#167ef6ca22a476c6c0c014a58b4f43ae4b80dec7" + integrity sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA== + "@esbuild/win32-x64@0.21.5": version "0.21.5" resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c" integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw== +"@esbuild/win32-x64@0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz#db44a6a08520b5f25bbe409f34a59f2d4bcc7ced" + integrity sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -342,6 +490,24 @@ lodash.isundefined "^3.0.1" lodash.uniq "^4.5.0" +"@grpc/grpc-js@^1.8.13": + version "1.11.1" + resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.11.1.tgz#a92f33e98f1959feffcd1b25a33b113d2c977b70" + integrity sha512-gyt/WayZrVPH2w/UTLansS7F9Nwld472JxxaETamrM8HNlsa+jSLNyKAZmhxI2Me4c3mQHFiS1wWHDY1g1Kthw== + dependencies: + "@grpc/proto-loader" "^0.7.13" + "@js-sdsl/ordered-map" "^4.4.2" + +"@grpc/proto-loader@^0.7.13": + version "0.7.13" + resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.13.tgz#f6a44b2b7c9f7b609f5748c6eac2d420e37670cf" + integrity sha512-AiXO/bfe9bmxBjxxtYxFAXGZvMaN5s8kO+jBHAJCON8rJoB5YS/D6X7ZNc6XQkuHNmyl4CYaMI1fJ/Gn27RGGw== + dependencies: + lodash.camelcase "^4.3.0" + long "^5.0.0" + protobufjs "^7.2.5" + yargs "^17.7.2" + "@humanwhocodes/config-array@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" @@ -361,12 +527,38 @@ resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.5.tgz#b32366c89b43c6f8cefbdefac778b9c828e3ba8c" integrity sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg== -"@jridgewell/resolve-uri@^3.0.3": +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@jridgewell/gen-mapping@^0.3.2": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.5.0" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== @@ -379,14 +571,32 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@noble/curves@^1.4.2": +"@jridgewell/trace-mapping@^0.3.24": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@js-sdsl/ordered-map@^4.4.2": + version "4.4.2" + resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" + integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== + +"@noble/curves@^1.0.0", "@noble/curves@^1.4.2": version "1.4.2" resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.2.tgz#40309198c76ed71bc6dbf7ba24e81ceb4d0d1fe9" integrity sha512-TavHr8qycMChk8UwMld0ZDRvatedkzWfH8IiaeGCfymOP5i0hSCozz9vHOL0nkwk7HRMlFnAiKpS2jrUmSybcw== dependencies: "@noble/hashes" "1.4.0" -"@noble/hashes@1.4.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.4.0": +"@noble/ed25519@^1.7.1": + version "1.7.3" + resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.3.tgz#57e1677bf6885354b466c38e2b620c62f45a7123" + integrity sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ== + +"@noble/hashes@1.4.0", "@noble/hashes@^1.3.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== @@ -412,6 +622,11 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + "@project-serum/anchor@^0.11.1": version "0.11.1" resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.11.1.tgz#155bff2c70652eafdcfd5559c81a83bb19cec9ff" @@ -532,10 +747,38 @@ "@coral-xyz/anchor" "^0.26.0" buffer "^6.0.1" +"@pythnetwork/price-service-sdk@>=1.6.0": + version "1.7.1" + resolved "https://registry.yarnpkg.com/@pythnetwork/price-service-sdk/-/price-service-sdk-1.7.1.tgz#dbfc8a8c2189f526346c1f79ec3995e89b690700" + integrity sha512-xr2boVXTyv1KUt/c6llUTfbv2jpud99pWlMJbFaHGUBoygQsByuy7WbjIJKZ+0Blg1itLZl0Lp/pJGGg8SdJoQ== + dependencies: + bn.js "^5.2.1" + +"@pythnetwork/pyth-solana-receiver@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@pythnetwork/pyth-solana-receiver/-/pyth-solana-receiver-0.8.0.tgz#d7bf3c5c97a0f0eab8ac19f53b11664117e1152d" + integrity sha512-5lhLtggAqsiHtffTPM8vcKJmhBdxzidBmiNNUlqPyg9XmhZ4Z+roY0dfzluEoX5xer9rEA1ThsBpX0bG1DRIGA== + dependencies: + "@coral-xyz/anchor" "^0.29.0" + "@noble/hashes" "^1.4.0" + "@pythnetwork/price-service-sdk" ">=1.6.0" + "@pythnetwork/solana-utils" "*" + "@solana/web3.js" "^1.90.0" + +"@pythnetwork/solana-utils@*": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@pythnetwork/solana-utils/-/solana-utils-0.4.2.tgz#3e220eed518c02ad702ebb023488afd7c5649a87" + integrity sha512-hKo7Bcs/kDWA5Fnqhg9zJSB94NMoUDIDjHjSi/uvZOzwizISUQI6oY3LWd2CXzNh4f8djjY2BS5iNHaM4cm8Bw== + dependencies: + "@coral-xyz/anchor" "^0.29.0" + "@solana/web3.js" "^1.90.0" + bs58 "^5.0.0" + jito-ts "^3.0.1" + "@raydium-io/raydium-sdk@^1.3.1-beta.57": - version "1.3.1-beta.57" - resolved "https://registry.yarnpkg.com/@raydium-io/raydium-sdk/-/raydium-sdk-1.3.1-beta.57.tgz#ca498a2b0c54454cc444e9a55d7ac690f9ba094a" - integrity sha512-oHp9/N4CUEUmxxupaYr+gbrgGiZci9QJ/UX146G2jd0tSkcXu046EV1SE2HSJRnQfMFiJUoxwZi7qzENWH6dDQ== + version "1.3.1-beta.58" + resolved "https://registry.yarnpkg.com/@raydium-io/raydium-sdk/-/raydium-sdk-1.3.1-beta.58.tgz#cd251bdf58a15b5aa231a0a6e16a86617c06abcc" + integrity sha512-9SMneQktR6CvxOJ6C3PxW8aMtBsg28+OViaSDwNHgZ/gJP47bvUgUTsFSmnut4Mv9blsnYFxyc5eVoIfPdXeJg== dependencies: "@solana/buffer-layout" "^4.0.1" "@solana/spl-token" "^0.3.9" @@ -547,6 +790,87 @@ fecha "^4.2.3" lodash "^4.17.21" toformat "^2.0.0" + tsup "^8.1.0" + +"@rollup/rollup-android-arm-eabi@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.19.1.tgz#7746deb85e4a8fb54fbfda8ac5c102692f102476" + integrity sha512-XzqSg714++M+FXhHfXpS1tDnNZNpgxxuGZWlRG/jSj+VEPmZ0yg6jV4E0AL3uyBKxO8mO3xtOsP5mQ+XLfrlww== + +"@rollup/rollup-android-arm64@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.19.1.tgz#93de4d867709d3313794723b5afd91e1e174f906" + integrity sha512-thFUbkHteM20BGShD6P08aungq4irbIZKUNbG70LN8RkO7YztcGPiKTTGZS7Kw+x5h8hOXs0i4OaHwFxlpQN6A== + +"@rollup/rollup-darwin-arm64@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.19.1.tgz#e41e6a81673260ab196e0f59462b9940a6ac03cd" + integrity sha512-8o6eqeFZzVLia2hKPUZk4jdE3zW7LCcZr+MD18tXkgBBid3lssGVAYuox8x6YHoEPDdDa9ixTaStcmx88lio5Q== + +"@rollup/rollup-darwin-x64@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.19.1.tgz#2b0a0aef6e8c5317d494cfc9076d7a16b099bdcb" + integrity sha512-4T42heKsnbjkn7ovYiAdDVRRWZLU9Kmhdt6HafZxFcUdpjlBlxj4wDrt1yFWLk7G4+E+8p2C9tcmSu0KA6auGA== + +"@rollup/rollup-linux-arm-gnueabihf@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.19.1.tgz#e22319deb5367384ef315e66bc6de80d2bf2b3ae" + integrity sha512-MXg1xp+e5GhZ3Vit1gGEyoC+dyQUBy2JgVQ+3hUrD9wZMkUw/ywgkpK7oZgnB6kPpGrxJ41clkPPnsknuD6M2Q== + +"@rollup/rollup-linux-arm-musleabihf@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.19.1.tgz#d5dd68f5d7ae21b345a5c87208c94e5c813f54b8" + integrity sha512-DZNLwIY4ftPSRVkJEaxYkq7u2zel7aah57HESuNkUnz+3bZHxwkCUkrfS2IWC1sxK6F2QNIR0Qr/YXw7nkF3Pw== + +"@rollup/rollup-linux-arm64-gnu@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.19.1.tgz#1703d3a418d33f8f025acaf93f39ca1efcd5b645" + integrity sha512-C7evongnjyxdngSDRRSQv5GvyfISizgtk9RM+z2biV5kY6S/NF/wta7K+DanmktC5DkuaJQgoKGf7KUDmA7RUw== + +"@rollup/rollup-linux-arm64-musl@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.19.1.tgz#3f59c2c6e60f75ce8b1090bd841c555e3bb01f0e" + integrity sha512-89tFWqxfxLLHkAthAcrTs9etAoBFRduNfWdl2xUs/yLV+7XDrJ5yuXMHptNqf1Zw0UCA3cAutkAiAokYCkaPtw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.19.1.tgz#3f99a0921596a6f539121a312df29af52a205f15" + integrity sha512-PromGeV50sq+YfaisG8W3fd+Cl6mnOOiNv2qKKqKCpiiEke2KiKVyDqG/Mb9GWKbYMHj5a01fq/qlUR28PFhCQ== + +"@rollup/rollup-linux-riscv64-gnu@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.19.1.tgz#c08fb3e629d50d2eac31329347cfc559a1cf81d1" + integrity sha512-/1BmHYh+iz0cNCP0oHCuF8CSiNj0JOGf0jRlSo3L/FAyZyG2rGBuKpkZVH9YF+x58r1jgWxvm1aRg3DHrLDt6A== + +"@rollup/rollup-linux-s390x-gnu@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.19.1.tgz#173722cd745779d730d4b24d21386185e0e12de8" + integrity sha512-0cYP5rGkQWRZKy9/HtsWVStLXzCF3cCBTRI+qRL8Z+wkYlqN7zrSYm6FuY5Kd5ysS5aH0q5lVgb/WbG4jqXN1Q== + +"@rollup/rollup-linux-x64-gnu@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.19.1.tgz#0af2b6541ab0f4954d2c4f96bcdc7947420dd28c" + integrity sha512-XUXeI9eM8rMP8aGvii/aOOiMvTs7xlCosq9xCjcqI9+5hBxtjDpD+7Abm1ZhVIFE1J2h2VIg0t2DX/gjespC2Q== + +"@rollup/rollup-linux-x64-musl@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.19.1.tgz#f973f9552744764b221128f7c3629222216ace69" + integrity sha512-V7cBw/cKXMfEVhpSvVZhC+iGifD6U1zJ4tbibjjN+Xi3blSXaj/rJynAkCFFQfoG6VZrAiP7uGVzL440Q6Me2Q== + +"@rollup/rollup-win32-arm64-msvc@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.19.1.tgz#21ac5ed84d914bc31821fec3dd909f7257cfb17b" + integrity sha512-88brja2vldW/76jWATlBqHEoGjJLRnP0WOEKAUbMcXaAZnemNhlAHSyj4jIwMoP2T750LE9lblvD4e2jXleZsA== + +"@rollup/rollup-win32-ia32-msvc@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.19.1.tgz#0cfe740063b35dcd5a62c4e243226631a846ce11" + integrity sha512-LdxxcqRVSXi6k6JUrTah1rHuaupoeuiv38du8Mt4r4IPer3kwlTo+RuvfE8KzZ/tL6BhaPlzJ3835i6CxrFIRQ== + +"@rollup/rollup-win32-x64-msvc@4.19.1": + version "4.19.1" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.19.1.tgz#5f2c40d3f1b53ede80fb4e6964f840c0f8936832" + integrity sha512-2bIrL28PcK3YCqD9anGxDxamxdiJAxA+l7fWIwM5o8UqNy1t3d1NdAweO2XhA0KTDJ5aH1FsuiT5+7VhtHliXg== "@solana/buffer-layout-utils@^0.2.0": version "0.2.0" @@ -684,12 +1008,12 @@ dependencies: buffer "^6.0.3" -"@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.22.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.54.0", "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.78.2", "@solana/web3.js@^1.78.3", "@solana/web3.js@^1.91.1", "@solana/web3.js@^1.91.6", "@solana/web3.js@^1.93.0": - version "1.95.0" - resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.95.0.tgz#9cf08383e7dcba212a73d78349cf9b25bc34764f" - integrity sha512-iHwJ/HcWrF9qbnI1ctwI1UXHJ0vZXRpnt+lI5UcQIk8WvJNuQ5gV06icxzM6B7ojUES85Q1/FM4jZ49UQ8yZZQ== +"@solana/web3.js@^1.17.0", "@solana/web3.js@^1.21.0", "@solana/web3.js@^1.22.0", "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.36.0", "@solana/web3.js@^1.54.0", "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.78.2", "@solana/web3.js@^1.78.3", "@solana/web3.js@^1.90.0", "@solana/web3.js@^1.91.6", "@solana/web3.js@^1.93.0", "@solana/web3.js@^1.95.0": + version "1.95.2" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.95.2.tgz#6f8a0362fa75886a21550dbec49aad54481463a6" + integrity sha512-SjlHp0G4qhuhkQQc+YXdGkI8EerCqwxvgytMgBpzMUQTafrkNant3e7pgilBGgjy/iM40ICvWBLgASTPMrQU7w== dependencies: - "@babel/runtime" "^7.24.7" + "@babel/runtime" "^7.24.8" "@noble/curves" "^1.4.2" "@noble/hashes" "^1.4.0" "@solana/buffer-layout" "^4.0.1" @@ -700,11 +1024,32 @@ bs58 "^4.0.1" buffer "6.0.3" fast-stable-stringify "^1.0.0" - jayson "^4.1.0" + jayson "^4.1.1" node-fetch "^2.7.0" rpc-websockets "^9.0.2" superstruct "^2.0.2" +"@solana/web3.js@~1.77.3": + version "1.77.4" + resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.77.4.tgz#aad8c44a02ced319493308ef765a2b36a9e9fa8c" + integrity sha512-XdN0Lh4jdY7J8FYMyucxCwzn6Ga2Sr1DHDWRbqVzk7ZPmmpSPOVWHzO67X1cVT+jNi1D6gZi2tgjHgDPuj6e9Q== + dependencies: + "@babel/runtime" "^7.12.5" + "@noble/curves" "^1.0.0" + "@noble/hashes" "^1.3.0" + "@solana/buffer-layout" "^4.0.0" + agentkeepalive "^4.2.1" + bigint-buffer "^1.1.5" + bn.js "^5.0.0" + borsh "^0.7.0" + bs58 "^4.0.1" + buffer "6.0.3" + fast-stable-stringify "^1.0.0" + jayson "^4.1.0" + node-fetch "^2.6.7" + rpc-websockets "^7.5.1" + superstruct "^0.14.2" + "@solworks/soltoolkit-sdk@^0.0.23": version "0.0.23" resolved "https://registry.yarnpkg.com/@solworks/soltoolkit-sdk/-/soltoolkit-sdk-0.0.23.tgz#ef32d0aa79f888bcf0f639d280005b2e97cdc624" @@ -721,16 +1066,16 @@ typescript "^4.8.2" "@swc/helpers@^0.5.11": - version "0.5.11" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.11.tgz#5bab8c660a6e23c13b2d23fcd1ee44a2db1b0cb7" - integrity sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A== + version "0.5.12" + resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.12.tgz#37aaca95284019eb5d2207101249435659709f4b" + integrity sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g== dependencies: tslib "^2.4.0" "@switchboard-xyz/common@^2.3.6", "@switchboard-xyz/common@^2.4.2": - version "2.4.3" - resolved "https://registry.yarnpkg.com/@switchboard-xyz/common/-/common-2.4.3.tgz#3411374cafa230c010b03a5669ddace8a46f3e17" - integrity sha512-0Ucvk753Co48qcWBRRME28zcYIhQgZgIuFUE5kXxq7zSf1k9dFVUOwgcoQVr6LhsK3YAvJdGo1n8JzcxEzCBZQ== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@switchboard-xyz/common/-/common-2.4.4.tgz#4896d526d67c10a8131e5ea4044a2e43a7a8b999" + integrity sha512-Pcny+VzenXPCuCOj1W8lBm/S7bDSc1CU6T35Tt0o2bTDnzHgVGtYJ/OLqgPhqGhZ/fjMwrRiCPPIkuavK0Ik3Q== dependencies: "@solana/web3.js" "^1.93.0" axios "^1.7.2" @@ -739,18 +1084,16 @@ bs58 "^5.0.0" cron-validator "^1.3.1" decimal.js "^10.4.3" - form-data "^4.0.0" lodash "^4.17.21" protobufjs "^7.2.6" - yaml "^2.2.1" "@switchboard-xyz/on-demand@^1.1.34": - version "1.1.34" - resolved "https://registry.yarnpkg.com/@switchboard-xyz/on-demand/-/on-demand-1.1.34.tgz#bae40618d13ebdd156694cb3e3135a6b0c3a0dbd" - integrity sha512-mU20Kcgayv0l/USnQgL5wBGsZrobUDOAOW/vtjug5uTJGJsmHIUIRjyxa6dx1VseGHqUdkCWKz7vHK10T4kdbw== + version "1.2.11" + resolved "https://registry.yarnpkg.com/@switchboard-xyz/on-demand/-/on-demand-1.2.11.tgz#2271a67cdb62cf24f3b84ea1372511b3c42ac27e" + integrity sha512-ngdaBdHKyj35K6qgWlsHxGC9wKMDRNnqVH2gLWz1gCJkAiqfjGTM1QQKgxPNV3GhPrjb5Ov0jT34h6DLlgGmMw== dependencies: - "@coral-xyz/anchor" "^0.30.0" - "@solana/web3.js" "^1.91.1" + "@coral-xyz/anchor-30" "npm:@coral-xyz/anchor@0.30.1" + "@solana/web3.js" "^1.95.0" "@solworks/soltoolkit-sdk" "^0.0.23" "@switchboard-xyz/common" "^2.4.2" axios "^1.2.0" @@ -759,7 +1102,6 @@ js-yaml "^4.1.0" node-cache "^5.1.2" protobufjs "^7.2.6" - shelljs "^0.8.5" "@switchboard-xyz/sbv2-lite@^0.1.6": version "0.1.6" @@ -842,6 +1184,11 @@ dependencies: "@types/node" "*" +"@types/estree@1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" + integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== + "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" @@ -866,11 +1213,11 @@ form-data "^4.0.0" "@types/node@*", "@types/node@>=13.7.0": - version "20.14.10" - resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a" - integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ== + version "22.0.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.0.0.tgz#04862a2a71e62264426083abe1e27e87cac05a30" + integrity sha512-VT7KSYudcPOzP5Q0wfbowyNLaVR8QWUdw+088uFWwfvpY6uCWaXpqV6ieLAu9WBcnTa7H4Z5RLK8I5t2FuOcqw== dependencies: - undici-types "~5.26.4" + undici-types "~6.11.1" "@types/node@^12.12.54": version "12.20.55" @@ -883,9 +1230,9 @@ integrity sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ== "@types/node@^18.11.18", "@types/node@^18.7.13": - version "18.19.39" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.39.tgz#c316340a5b4adca3aee9dcbf05de385978590593" - integrity sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ== + version "18.19.42" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.42.tgz#b54ed4752c85427906aab40917b0f7f3d724bf72" + integrity sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg== dependencies: undici-types "~5.26.4" @@ -907,9 +1254,9 @@ "@types/node" "*" "@types/ws@^8.2.2": - version "8.5.10" - resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.10.tgz#4acfb517970853fa6574a3a6886791d04a396787" - integrity sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A== + version "8.5.12" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" + integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== dependencies: "@types/node" "*" @@ -1039,7 +1386,7 @@ agent-base@6: dependencies: debug "4" -agentkeepalive@^4.5.0: +agentkeepalive@^4.2.1, agentkeepalive@^4.3.0, agentkeepalive@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== @@ -1057,14 +1404,14 @@ ajv@^6.10.0, ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.0.1: - version "8.16.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.16.0.tgz#22e2a92b94f005f7e0f9c9d39652ef0b8f6f0cb4" - integrity sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw== + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" require-from-string "^2.0.2" - uri-js "^4.4.1" ansi-colors@4.1.1: version "4.1.1" @@ -1081,6 +1428,11 @@ ansi-regex@^5.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" @@ -1095,6 +1447,16 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0: dependencies: color-convert "^2.0.1" +ansi-styles@^6.1.0: + version "6.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" + integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + anymatch@~3.1.2: version "3.1.3" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" @@ -1318,6 +1680,18 @@ bufferutil@^4.0.1, bufferutil@^4.0.6: dependencies: node-gyp-build "^4.3.0" +bundle-require@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/bundle-require/-/bundle-require-5.0.0.tgz#071521bdea6534495cf23e92a83f889f91729e93" + integrity sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w== + dependencies: + load-tsconfig "^0.2.3" + +cac@^6.7.14: + version "6.7.14" + resolved "https://registry.yarnpkg.com/cac/-/cac-6.7.14.tgz#804e1e6f506ee363cb0e3ccbb09cad5dd9870959" + integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== + callsites@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" @@ -1334,9 +1708,9 @@ camelcase@^6.0.0, camelcase@^6.3.0: integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== chai@^4.3.4: - version "4.4.1" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.4.1.tgz#3603fa6eba35425b0f2ac91a009fe924106e50d1" - integrity sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g== + version "4.5.0" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" + integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== dependencies: assertion-error "^1.1.0" check-error "^1.0.3" @@ -1344,7 +1718,7 @@ chai@^4.3.4: get-func-name "^2.0.2" loupe "^2.3.6" pathval "^1.1.1" - type-detect "^4.0.8" + type-detect "^4.1.0" chalk@^2.4.2: version "2.4.2" @@ -1390,6 +1764,21 @@ chokidar@3.5.3: optionalDependencies: fsevents "~2.3.2" +chokidar@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + cli-table3@^0.6.3: version "0.6.5" resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.5.tgz#013b91351762739c16a9567c21a04632e449bf2f" @@ -1408,6 +1797,15 @@ cliui@^7.0.2: strip-ansi "^6.0.0" wrap-ansi "^7.0.0" +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + clone@2.x: version "2.1.2" resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" @@ -1454,11 +1852,21 @@ commander@^2.20.3: resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== +consola@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/consola/-/consola-3.2.3.tgz#0741857aa88cfa0d6fd53f1cff0375136e98502f" + integrity sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ== + console-table-printer@^2.11.1: version "2.12.1" resolved "https://registry.yarnpkg.com/console-table-printer/-/console-table-printer-2.12.1.tgz#4a9646537a246a6d8de57075d4fae1e08abae267" @@ -1488,7 +1896,7 @@ cross-fetch@^3.1.5: dependencies: node-fetch "^2.6.12" -cross-spawn@^7.0.2: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -1502,10 +1910,10 @@ crypto-hash@^1.3.0: resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== -debug@4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.4: - version "4.3.5" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e" - integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg== +debug@4, debug@^4.0.1, debug@^4.1.1, debug@^4.3.4, debug@^4.3.5: + version "4.3.6" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== dependencies: ms "2.1.2" @@ -1600,10 +2008,15 @@ dotenv@^16.0.3, dotenv@^16.3.1: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + elliptic@^6.5.4: - version "6.5.5" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.5.tgz#c715e09f78b6923977610d4c2346d6ce22e6dded" - integrity sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw== + version "6.5.6" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.6.tgz#ee5f7c3a00b98a2144ac84d67d01f04d438fa53e" + integrity sha512-mpzdtpeCLuS3BmE3pO3Cpp5bbjlOPY2Q0PgoF+Od1XZrHLYI28Xe3ossCmYCQt11FQKEYd9+PF8jymTvtWJSHQ== dependencies: bn.js "^4.11.9" brorand "^1.1.0" @@ -1618,6 +2031,11 @@ emoji-regex@^8.0.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + enquirer@^2.3.5: version "2.4.1" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56" @@ -1638,6 +2056,36 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +esbuild@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.23.0.tgz#de06002d48424d9fdb7eb52dbe8e95927f852599" + integrity sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA== + optionalDependencies: + "@esbuild/aix-ppc64" "0.23.0" + "@esbuild/android-arm" "0.23.0" + "@esbuild/android-arm64" "0.23.0" + "@esbuild/android-x64" "0.23.0" + "@esbuild/darwin-arm64" "0.23.0" + "@esbuild/darwin-x64" "0.23.0" + "@esbuild/freebsd-arm64" "0.23.0" + "@esbuild/freebsd-x64" "0.23.0" + "@esbuild/linux-arm" "0.23.0" + "@esbuild/linux-arm64" "0.23.0" + "@esbuild/linux-ia32" "0.23.0" + "@esbuild/linux-loong64" "0.23.0" + "@esbuild/linux-mips64el" "0.23.0" + "@esbuild/linux-ppc64" "0.23.0" + "@esbuild/linux-riscv64" "0.23.0" + "@esbuild/linux-s390x" "0.23.0" + "@esbuild/linux-x64" "0.23.0" + "@esbuild/netbsd-x64" "0.23.0" + "@esbuild/openbsd-arm64" "0.23.0" + "@esbuild/openbsd-x64" "0.23.0" + "@esbuild/sunos-x64" "0.23.0" + "@esbuild/win32-arm64" "0.23.0" + "@esbuild/win32-ia32" "0.23.0" + "@esbuild/win32-x64" "0.23.0" + esbuild@~0.21.5: version "0.21.5" resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d" @@ -1821,6 +2269,21 @@ eventemitter3@^5.0.1: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== +execa@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + eyes@^0.1.8: version "0.1.8" resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" @@ -1870,6 +2333,11 @@ fast-stable-stringify@^1.0.0: resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== +fast-uri@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.1.tgz#cddd2eecfc83a71c1be2cc2ef2061331be8a7134" + integrity sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw== + fastq@^1.6.0: version "1.17.1" resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" @@ -1940,6 +2408,14 @@ follow-redirects@^1.15.6: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b" integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== +foreground-child@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7" + integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^4.0.1" + form-data@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" @@ -1959,11 +2435,6 @@ fsevents@~2.3.2, fsevents@~2.3.3: resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - functional-red-black-tree@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" @@ -1979,10 +2450,15 @@ get-func-name@^2.0.1, get-func-name@^2.0.2: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + get-tsconfig@^4.7.5: - version "4.7.5" - resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.5.tgz#5e012498579e9a6947511ed0cd403272c7acbbaf" - integrity sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw== + version "4.7.6" + resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.7.6.tgz#118fd5b7b9bae234cc7705a00cd771d7eb65d62a" + integrity sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA== dependencies: resolve-pkg-maps "^1.0.0" @@ -2005,7 +2481,19 @@ glob@7.2.0: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.1.3: +glob@^10.3.10: + version "10.4.5" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956" + integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +glob@^7.1.3: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -2075,13 +2563,6 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - he@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" @@ -2104,6 +2585,11 @@ https-proxy-agent@^5.0.0: agent-base "6" debug "4" +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + humanize-ms@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" @@ -2152,11 +2638,6 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -2164,13 +2645,6 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" -is-core-module@^2.13.0: - version "2.14.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1" - integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A== - dependencies: - hasown "^2.0.2" - is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" @@ -2198,6 +2672,11 @@ is-plain-obj@^2.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" @@ -2226,7 +2705,16 @@ isomorphic-ws@^5.0.0: resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz#e5529148912ecb9b451b46ed44d53dae1ce04bbf" integrity sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw== -jayson@^4.1.0: +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +jayson@^4.0.0, jayson@^4.1.0, jayson@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.1.tgz#282ff13d3cea09776db684b7eeca98c47b2fa99a" integrity sha512-5ZWm4Q/0DHPyeMfAsrwViwUS2DMVsQgWh8bEEIVTkfb3DzHZ2L3G5WUnF+AKmGjjM9r1uAv73SaqC1/U4RL45w== @@ -2244,6 +2732,25 @@ jayson@^4.1.0: uuid "^8.3.2" ws "^7.5.10" +jito-ts@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/jito-ts/-/jito-ts-3.0.1.tgz#24126389896e042c26d303c4e802064b249ed27e" + integrity sha512-TSofF7KqcwyaWGjPaSYC8RDoNBY1TPRNBHdrw24bdIi7mQ5bFEDdYK3D//llw/ml8YDvcZlgd644WxhjLTS9yg== + dependencies: + "@grpc/grpc-js" "^1.8.13" + "@noble/ed25519" "^1.7.1" + "@solana/web3.js" "~1.77.3" + agentkeepalive "^4.3.0" + dotenv "^16.0.3" + jayson "^4.0.0" + node-fetch "^2.6.7" + superstruct "^1.0.3" + +joycon@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/joycon/-/joycon-3.1.1.tgz#bce8596d6ae808f8b68168f5fc69280996894f03" + integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== + js-sha256@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" @@ -2338,6 +2845,21 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" +lilconfig@^3.1.1: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.2.tgz#e4a7c3cb549e3a606c8dcc32e5ae1005e62c05cb" + integrity sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +load-tsconfig@^0.2.3: + version "0.2.5" + resolved "https://registry.yarnpkg.com/load-tsconfig/-/load-tsconfig-0.2.5.tgz#453b8cd8961bfb912dea77eb6c168fe8cca3d3a1" + integrity sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg== + locate-path@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" @@ -2345,6 +2867,11 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== + lodash.escaperegexp@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" @@ -2385,6 +2912,11 @@ lodash.merge@^4.6.2: resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + lodash.truncate@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" @@ -2432,6 +2964,11 @@ lower-case@^2.0.2: dependencies: tslib "^2.0.3" +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + lunr@^2.3.9: version "2.3.9" resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" @@ -2447,6 +2984,11 @@ marked@^4.0.16: resolved "https://registry.yarnpkg.com/marked/-/marked-4.3.0.tgz#796362821b019f734054582038b116481b456cf3" integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + merge2@^1.3.0, merge2@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -2472,6 +3014,11 @@ mime-types@^2.1.12: dependencies: mime-db "1.52.0" +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" @@ -2503,11 +3050,23 @@ minimatch@^5.0.1, minimatch@^5.1.0: dependencies: brace-expansion "^2.0.1" +minimatch@^9.0.4: + version "9.0.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.5.tgz#d74f9dd6b57d83d8e98cfb82133b03978bc929e5" + integrity sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.0, minimist@^1.2.6: version "1.2.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -2555,6 +3114,15 @@ ms@2.1.3, ms@^2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + nanoid@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" @@ -2597,7 +3165,7 @@ node-fetch@3.3.2, node-fetch@^2.6.12, node-fetch@^2.7.0, "node-fetch@npm:@blockw dependencies: whatwg-url "^5.0.0" -node-fetch@^2.6.1: +node-fetch@^2.6.1, node-fetch@^2.6.7: version "2.7.0" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== @@ -2626,6 +3194,18 @@ normalize-path@^3.0.0, normalize-path@~3.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" @@ -2633,6 +3213,13 @@ once@^1.3.0: dependencies: wrappy "1" +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + optionator@^0.9.1: version "0.9.4" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" @@ -2659,6 +3246,11 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +package-json-from-dist@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00" + integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== + pako@^2.0.3: version "2.1.0" resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" @@ -2681,15 +3273,18 @@ path-is-absolute@^1.0.0: resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== -path-key@^3.1.0: +path-key@^3.0.0, path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-type@^4.0.0: version "4.0.0" @@ -2701,7 +3296,7 @@ pathval@^1.1.1: resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== -picocolors@^1.0.0: +picocolors@^1.0.0, picocolors@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== @@ -2711,6 +3306,18 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +pirates@^4.0.1: + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +postcss-load-config@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-6.0.1.tgz#6fd7dcd8ae89badcf1b2d644489cbabf83aa8096" + integrity sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g== + dependencies: + lilconfig "^3.1.1" + prelude-ls@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" @@ -2726,7 +3333,7 @@ progress@^2.0.0: resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== -protobufjs@^7.2.6: +protobufjs@^7.2.5, protobufjs@^7.2.6: version "7.3.2" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.3.2.tgz#60f3b7624968868f6f739430cfbc8c9370e26df4" integrity sha512-RXyHaACeqXeqAKGLDl68rQKbmObRsTIn4TYVUUug1KfS47YWCo5MacGITEryugIgZqORCvJWEk4l449POg5Txg== @@ -2773,13 +3380,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - reconnecting-websocket@^4.2.0: version "4.4.0" resolved "https://registry.yarnpkg.com/reconnecting-websocket/-/reconnecting-websocket-4.4.0.tgz#3b0e5b96ef119e78a03135865b8bb0af1b948783" @@ -2810,20 +3410,16 @@ resolve-from@^4.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + resolve-pkg-maps@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz#616b3dc2c57056b5588c31cdf4b3d64db133720f" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== -resolve@^1.1.6: - version "1.22.8" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" - integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== - dependencies: - is-core-module "^2.13.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -2836,6 +3432,43 @@ rimraf@^3.0.2: dependencies: glob "^7.1.3" +rollup@^4.19.0: + version "4.19.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.19.1.tgz#21d865cd60d4a325172ce8b082e60caccd97b309" + integrity sha512-K5vziVlg7hTpYfFBI+91zHBEMo6jafYXpkMlqZjg7/zhIG9iHqazBf4xz9AVdjS9BruRn280ROqLI7G3OFRIlw== + dependencies: + "@types/estree" "1.0.5" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.19.1" + "@rollup/rollup-android-arm64" "4.19.1" + "@rollup/rollup-darwin-arm64" "4.19.1" + "@rollup/rollup-darwin-x64" "4.19.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.19.1" + "@rollup/rollup-linux-arm-musleabihf" "4.19.1" + "@rollup/rollup-linux-arm64-gnu" "4.19.1" + "@rollup/rollup-linux-arm64-musl" "4.19.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.19.1" + "@rollup/rollup-linux-riscv64-gnu" "4.19.1" + "@rollup/rollup-linux-s390x-gnu" "4.19.1" + "@rollup/rollup-linux-x64-gnu" "4.19.1" + "@rollup/rollup-linux-x64-musl" "4.19.1" + "@rollup/rollup-win32-arm64-msvc" "4.19.1" + "@rollup/rollup-win32-ia32-msvc" "4.19.1" + "@rollup/rollup-win32-x64-msvc" "4.19.1" + fsevents "~2.3.2" + +rpc-websockets@^7.5.1: + version "7.11.2" + resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.11.2.tgz#582910c425b9f2c860327481c1d1e0e431bf4a6d" + integrity sha512-pL9r5N6AVHlMN/vT98+fcO+5+/UcPLf/4tq+WUaid/PPUGS/ttJ3y8e9IqmaWKtShNAysMSjkczuEA49NuV7UQ== + dependencies: + eventemitter3 "^4.0.7" + uuid "^8.3.2" + ws "^8.5.0" + optionalDependencies: + bufferutil "^4.0.1" + utf-8-validate "^5.0.2" + rpc-websockets@^9.0.2: version "9.0.2" resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-9.0.2.tgz#4c1568d00b8100f997379a363478f41f8f4b242c" @@ -2874,9 +3507,9 @@ secp256k1@5.0.0: node-gyp-build "^4.2.0" semver@^7.2.1, semver@^7.3.7: - version "7.6.2" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13" - integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w== + version "7.6.3" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" + integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== serialize-javascript@6.0.0: version "6.0.0" @@ -2897,15 +3530,6 @@ shebang-regex@^3.0.0: resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.5.tgz#de055408d8361bed66c669d2f000538ced8ee20c" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - shiki@^0.10.1: version "0.10.1" resolved "https://registry.yarnpkg.com/shiki/-/shiki-0.10.1.tgz#6f9a16205a823b56c072d0f1a0bcd0f2646bef14" @@ -2915,6 +3539,16 @@ shiki@^0.10.1: vscode-oniguruma "^1.6.1" vscode-textmate "5.2.0" +signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + simple-wcswidth@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/simple-wcswidth/-/simple-wcswidth-1.0.1.tgz#8ab18ac0ae342f9d9b629604e54d2aa1ecb018b2" @@ -2950,6 +3584,13 @@ source-map-support@^0.5.6: buffer-from "^1.0.0" source-map "^0.6.0" +source-map@0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.8.0-beta.0.tgz#d4c1bb42c3f7ee925f005927ba10709e0d1d1f11" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + source-map@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -2960,7 +3601,7 @@ sprintf-js@~1.0.2: resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -2969,28 +3610,72 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== dependencies: ansi-regex "^5.0.1" +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== +sucrase@^3.35.0: + version "3.35.0" + resolved "https://registry.yarnpkg.com/sucrase/-/sucrase-3.35.0.tgz#57f17a3d7e19b36d8995f06679d121be914ae263" + integrity sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA== + dependencies: + "@jridgewell/gen-mapping" "^0.3.2" + commander "^4.0.0" + glob "^10.3.10" + lines-and-columns "^1.1.6" + mz "^2.7.0" + pirates "^4.0.1" + ts-interface-checker "^0.1.9" + +superstruct@^0.14.2: + version "0.14.2" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" + integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== + superstruct@^0.15.2, superstruct@^0.15.4: version "0.15.5" resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.5.tgz#0f0a8d3ce31313f0d84c6096cd4fa1bfdedc9dab" integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== +superstruct@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-1.0.4.tgz#0adb99a7578bd2f1c526220da6571b2d485d91ca" + integrity sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ== + superstruct@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-2.0.2.tgz#3f6d32fbdc11c357deff127d591a39b996300c54" @@ -3017,11 +3702,6 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - "switchboard-anchor@npm:@coral-xyz/anchor@0.30.0": version "0.30.0" resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.30.0.tgz#52acdba504b0008f1026d3a4bbbcb2d4feb5c69e" @@ -3063,6 +3743,20 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +thenify-all@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726" + integrity sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.1.tgz#8932e686a4066038a016dd9e2ca46add9838a95f" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + "through@>=2.2.7 <3": version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -3085,6 +3779,13 @@ toml@^3.0.0: resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -3095,11 +3796,21 @@ traverse-chain@~0.1.0: resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" integrity sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg== +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + ts-ev@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/ts-ev/-/ts-ev-0.4.0.tgz#b30bbab35bd57516efba7ab89b6417424a1ebf0e" integrity sha512-rLX6QdkC1/jA9sS4y9/DxHABTcOussp33J90h+TxHmya9CWvbGc9uLqdM4c/N4pNRmSdtq9zqhz7sB9KcN1NFQ== +ts-interface-checker@^0.1.9: + version "0.1.13" + resolved "https://registry.yarnpkg.com/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz#784fd3d679722bc103b1b4b8030bcddb5db2a699" + integrity sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA== + ts-mocha@^10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-10.0.0.tgz#41a8d099ac90dbbc64b06976c5025ffaebc53cb9" @@ -3162,6 +3873,28 @@ tslib@^2.0.3, tslib@^2.4.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0" integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ== +tsup@^8.1.0: + version "8.2.3" + resolved "https://registry.yarnpkg.com/tsup/-/tsup-8.2.3.tgz#4a1ff2962a4d7c8265fea661b0dd9668de58916d" + integrity sha512-6YNT44oUfXRbZuSMNmN36GzwPPIlD2wBccY7looM2fkTcxkf2NEmwr3OZuDZoySklnrIG4hoEtzy8yUXYOqNcg== + dependencies: + bundle-require "^5.0.0" + cac "^6.7.14" + chokidar "^3.6.0" + consola "^3.2.3" + debug "^4.3.5" + esbuild "^0.23.0" + execa "^5.1.1" + globby "^11.1.0" + joycon "^3.1.1" + picocolors "^1.0.1" + postcss-load-config "^6.0.1" + resolve-from "^5.0.0" + rollup "^4.19.0" + source-map "0.8.0-beta.0" + sucrase "^3.35.0" + tree-kill "^1.2.2" + tsutils@^3.21.0: version "3.21.0" resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.21.0.tgz#b48717d394cea6c1e096983eed58e9d61715b623" @@ -3191,10 +3924,10 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" -type-detect@^4.0.0, type-detect@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== +type-detect@^4.0.0, type-detect@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" + integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== type-fest@^0.20.2: version "0.20.2" @@ -3218,16 +3951,21 @@ typescript@^4.8.2: integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== typescript@^5.4.5: - version "5.5.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.3.tgz#e1b0a3c394190838a0b168e771b0ad56a0af0faa" - integrity sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ== + version "5.5.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" + integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== undici-types@~5.26.4: version "5.26.5" resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== -uri-js@^4.2.2, uri-js@^4.4.1: +undici-types@~6.11.1: + version "6.11.1" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.11.1.tgz#432ea6e8efd54a48569705a699e62d8f4981b197" + integrity sha512-mIDEX2ek50x0OlRgxryxsenE5XaQD4on5U2inY7RApK3SOJpofyw7uW2AyfMKkhAxXIceo2DeWGVGwyvng1GNQ== + +uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== @@ -3271,6 +4009,11 @@ webidl-conversions@^3.0.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + whatwg-fetch@^3.4.1: version "3.6.20" resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz#580ce6d791facec91d37c72890995a0b48d31c70" @@ -3284,6 +4027,15 @@ whatwg-url@^5.0.0: tr46 "~0.0.3" webidl-conversions "^3.0.0" +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-7.1.0.tgz#c2c492f1eca612988efd3d2266be1b9fc6170d06" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + which@2.0.2, which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -3301,7 +4053,7 @@ workerpool@6.2.0: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.0.tgz#827d93c9ba23ee2019c3ffaff5c27fccea289e8b" integrity sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A== -wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -3310,6 +4062,15 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -3330,11 +4091,6 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yaml@^2.2.1: - version "2.4.5" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" - integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== - yargs-parser@20.2.4: version "20.2.4" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" @@ -3345,6 +4101,11 @@ yargs-parser@^20.2.2: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + yargs-unparser@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" @@ -3368,6 +4129,19 @@ yargs@16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + dependencies: + cliui "^8.0.1" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"