├── .eslintrc.js ├── .gitignore ├── Anchor.toml ├── Cargo.lock ├── Cargo.toml ├── README.md ├── crates └── solana-conditional-liquidity │ ├── Cargo.toml │ ├── LICENSE │ ├── README.md │ └── src │ ├── lib.rs │ ├── origin.rs │ └── registry.rs ├── migrations └── deploy.ts ├── package.json ├── programs └── segmenter-registry │ ├── Cargo.toml │ ├── README.md │ ├── Xargo.toml │ └── src │ ├── errors.rs │ ├── instructions │ ├── add_segmenter.rs │ ├── change_admin.rs │ ├── create_registry.rs │ ├── initialize.rs │ ├── mod.rs │ └── remove_segmenter.rs │ ├── lib.rs │ └── state │ ├── config.rs │ ├── mod.rs │ └── registry.rs ├── rust-toolchain.toml ├── tests ├── helpers.ts ├── mock │ └── mockWallet.ts ├── segmenterRegistry.spec.ts └── transaction.ts ├── tsconfig.json └── yarn.lock /.eslintrc.js: -------------------------------------------------------------------------------- 1 | const path = require("path"); 2 | 3 | module.exports = exports = { 4 | "parser": "@typescript-eslint/parser", 5 | "plugins": [ 6 | "@typescript-eslint" 7 | ], 8 | "extends": [ 9 | "eslint:recommended", 10 | "plugin:@typescript-eslint/recommended", 11 | ], 12 | "parserOptions": { 13 | "project": path.join(__dirname, "tsconfig.json"), 14 | }, 15 | "rules": { 16 | "max-len": [ 17 | "error", 18 | { 19 | "code": 100 20 | } 21 | ], 22 | "quotes": [ 23 | "error", 24 | "double", 25 | { 26 | "avoidEscape": true, 27 | "allowTemplateLiterals": true, 28 | } 29 | ], 30 | "@typescript-eslint/no-unused-vars": [ 31 | "warn", 32 | { 33 | "argsIgnorePattern": "^_", 34 | "varsIgnorePattern": "^_", 35 | } 36 | ], 37 | "@typescript-eslint/await-thenable": "error", 38 | "@typescript-eslint/no-floating-promises": "error", 39 | "@typescript-eslint/no-misused-promises": [ 40 | "error", 41 | { 42 | "checksVoidReturn": false, 43 | } 44 | ], 45 | "require-await": "off", 46 | "@typescript-eslint/require-await": "warn", 47 | "@typescript-eslint/switch-exhaustiveness-check": "error", 48 | }, 49 | }; 50 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .anchor 2 | .DS_Store 3 | target 4 | **/*.rs.bk 5 | dist 6 | node_modules 7 | test-ledger 8 | .yarn 9 | -------------------------------------------------------------------------------- /Anchor.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | anchor_version = "0.30.1" 3 | solana_version = "1.18.22" 4 | 5 | [features] 6 | seeds = false 7 | skip-lint = false 8 | 9 | [programs.localnet] 10 | segmenter_registry = "SRegZsVZDDqwc7W5iMUSsmKNnXzgfczKzFpimRp5iWw" 11 | 12 | [registry] 13 | url = "https://api.apr.dev" 14 | 15 | [provider] 16 | cluster = "localnet" 17 | wallet = "~/.config/solana/id.json" 18 | 19 | [scripts] 20 | test = "yarn test" 21 | -------------------------------------------------------------------------------- /Cargo.lock: -------------------------------------------------------------------------------- 1 | # This file is automatically @generated by Cargo. 2 | # It is not intended for manual editing. 3 | version = 3 4 | 5 | [[package]] 6 | name = "ahash" 7 | version = "0.7.8" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" 10 | dependencies = [ 11 | "getrandom 0.2.15", 12 | "once_cell", 13 | "version_check", 14 | ] 15 | 16 | [[package]] 17 | name = "ahash" 18 | version = "0.8.11" 19 | source = "registry+https://github.com/rust-lang/crates.io-index" 20 | checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" 21 | dependencies = [ 22 | "cfg-if", 23 | "once_cell", 24 | "version_check", 25 | "zerocopy", 26 | ] 27 | 28 | [[package]] 29 | name = "aho-corasick" 30 | version = "1.1.3" 31 | source = "registry+https://github.com/rust-lang/crates.io-index" 32 | checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" 33 | dependencies = [ 34 | "memchr", 35 | ] 36 | 37 | [[package]] 38 | name = "anchor-attribute-access-control" 39 | version = "0.30.1" 40 | source = "registry+https://github.com/rust-lang/crates.io-index" 41 | checksum = "47fe28365b33e8334dd70ae2f34a43892363012fe239cf37d2ee91693575b1f8" 42 | dependencies = [ 43 | "anchor-syn", 44 | "proc-macro2", 45 | "quote", 46 | "syn 1.0.109", 47 | ] 48 | 49 | [[package]] 50 | name = "anchor-attribute-account" 51 | version = "0.30.1" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "3c288d496168268d198d9b53ee9f4f9d260a55ba4df9877ea1d4486ad6109e0f" 54 | dependencies = [ 55 | "anchor-syn", 56 | "bs58 0.5.1", 57 | "proc-macro2", 58 | "quote", 59 | "syn 1.0.109", 60 | ] 61 | 62 | [[package]] 63 | name = "anchor-attribute-constant" 64 | version = "0.30.1" 65 | source = "registry+https://github.com/rust-lang/crates.io-index" 66 | checksum = "49b77b6948d0eeaaa129ce79eea5bbbb9937375a9241d909ca8fb9e006bb6e90" 67 | dependencies = [ 68 | "anchor-syn", 69 | "quote", 70 | "syn 1.0.109", 71 | ] 72 | 73 | [[package]] 74 | name = "anchor-attribute-error" 75 | version = "0.30.1" 76 | source = "registry+https://github.com/rust-lang/crates.io-index" 77 | checksum = "4d20bb569c5a557c86101b944721d865e1fd0a4c67c381d31a44a84f07f84828" 78 | dependencies = [ 79 | "anchor-syn", 80 | "quote", 81 | "syn 1.0.109", 82 | ] 83 | 84 | [[package]] 85 | name = "anchor-attribute-event" 86 | version = "0.30.1" 87 | source = "registry+https://github.com/rust-lang/crates.io-index" 88 | checksum = "4cebd8d0671a3a9dc3160c48598d652c34c77de6be4d44345b8b514323284d57" 89 | dependencies = [ 90 | "anchor-syn", 91 | "proc-macro2", 92 | "quote", 93 | "syn 1.0.109", 94 | ] 95 | 96 | [[package]] 97 | name = "anchor-attribute-program" 98 | version = "0.30.1" 99 | source = "registry+https://github.com/rust-lang/crates.io-index" 100 | checksum = "efb2a5eb0860e661ab31aff7bb5e0288357b176380e985bade4ccb395981b42d" 101 | dependencies = [ 102 | "anchor-lang-idl", 103 | "anchor-syn", 104 | "anyhow", 105 | "bs58 0.5.1", 106 | "heck", 107 | "proc-macro2", 108 | "quote", 109 | "serde_json", 110 | "syn 1.0.109", 111 | ] 112 | 113 | [[package]] 114 | name = "anchor-derive-accounts" 115 | version = "0.30.1" 116 | source = "registry+https://github.com/rust-lang/crates.io-index" 117 | checksum = "04368b5abef4266250ca8d1d12f4dff860242681e4ec22b885dcfe354fd35aa1" 118 | dependencies = [ 119 | "anchor-syn", 120 | "quote", 121 | "syn 1.0.109", 122 | ] 123 | 124 | [[package]] 125 | name = "anchor-derive-serde" 126 | version = "0.30.1" 127 | source = "registry+https://github.com/rust-lang/crates.io-index" 128 | checksum = "e0bb0e0911ad4a70cab880cdd6287fe1e880a1a9d8e4e6defa8e9044b9796a6c" 129 | dependencies = [ 130 | "anchor-syn", 131 | "borsh-derive-internal 0.10.4", 132 | "proc-macro2", 133 | "quote", 134 | "syn 1.0.109", 135 | ] 136 | 137 | [[package]] 138 | name = "anchor-derive-space" 139 | version = "0.30.1" 140 | source = "registry+https://github.com/rust-lang/crates.io-index" 141 | checksum = "5ef415ff156dc82e9ecb943189b0cb241b3a6bfc26a180234dc21bd3ef3ce0cb" 142 | dependencies = [ 143 | "proc-macro2", 144 | "quote", 145 | "syn 1.0.109", 146 | ] 147 | 148 | [[package]] 149 | name = "anchor-lang" 150 | version = "0.30.1" 151 | source = "registry+https://github.com/rust-lang/crates.io-index" 152 | checksum = "6620c9486d9d36a4389cab5e37dc34a42ed0bfaa62e6a75a2999ce98f8f2e373" 153 | dependencies = [ 154 | "anchor-attribute-access-control", 155 | "anchor-attribute-account", 156 | "anchor-attribute-constant", 157 | "anchor-attribute-error", 158 | "anchor-attribute-event", 159 | "anchor-attribute-program", 160 | "anchor-derive-accounts", 161 | "anchor-derive-serde", 162 | "anchor-derive-space", 163 | "anchor-lang-idl", 164 | "arrayref", 165 | "base64 0.21.7", 166 | "bincode", 167 | "borsh 0.10.4", 168 | "bytemuck", 169 | "getrandom 0.2.15", 170 | "solana-program", 171 | "thiserror", 172 | ] 173 | 174 | [[package]] 175 | name = "anchor-lang-idl" 176 | version = "0.1.1" 177 | source = "registry+https://github.com/rust-lang/crates.io-index" 178 | checksum = "31cf97b4e6f7d6144a05e435660fcf757dbc3446d38d0e2b851d11ed13625bba" 179 | dependencies = [ 180 | "anchor-lang-idl-spec", 181 | "anyhow", 182 | "heck", 183 | "regex", 184 | "serde", 185 | "serde_json", 186 | "sha2 0.10.8", 187 | ] 188 | 189 | [[package]] 190 | name = "anchor-lang-idl-spec" 191 | version = "0.1.0" 192 | source = "registry+https://github.com/rust-lang/crates.io-index" 193 | checksum = "2bdf143115440fe621bdac3a29a1f7472e09f6cd82b2aa569429a0c13f103838" 194 | dependencies = [ 195 | "anyhow", 196 | "serde", 197 | ] 198 | 199 | [[package]] 200 | name = "anchor-syn" 201 | version = "0.30.1" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "f99daacb53b55cfd37ce14d6c9905929721137fd4c67bbab44a19802aecb622f" 204 | dependencies = [ 205 | "anyhow", 206 | "bs58 0.5.1", 207 | "cargo_toml", 208 | "heck", 209 | "proc-macro2", 210 | "quote", 211 | "serde", 212 | "serde_json", 213 | "sha2 0.10.8", 214 | "syn 1.0.109", 215 | "thiserror", 216 | ] 217 | 218 | [[package]] 219 | name = "anyhow" 220 | version = "1.0.90" 221 | source = "registry+https://github.com/rust-lang/crates.io-index" 222 | checksum = "37bf3594c4c988a53154954629820791dde498571819ae4ca50ca811e060cc95" 223 | 224 | [[package]] 225 | name = "ark-bn254" 226 | version = "0.4.0" 227 | source = "registry+https://github.com/rust-lang/crates.io-index" 228 | checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" 229 | dependencies = [ 230 | "ark-ec", 231 | "ark-ff", 232 | "ark-std", 233 | ] 234 | 235 | [[package]] 236 | name = "ark-ec" 237 | version = "0.4.2" 238 | source = "registry+https://github.com/rust-lang/crates.io-index" 239 | checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" 240 | dependencies = [ 241 | "ark-ff", 242 | "ark-poly", 243 | "ark-serialize", 244 | "ark-std", 245 | "derivative", 246 | "hashbrown 0.13.2", 247 | "itertools", 248 | "num-traits", 249 | "zeroize", 250 | ] 251 | 252 | [[package]] 253 | name = "ark-ff" 254 | version = "0.4.2" 255 | source = "registry+https://github.com/rust-lang/crates.io-index" 256 | checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" 257 | dependencies = [ 258 | "ark-ff-asm", 259 | "ark-ff-macros", 260 | "ark-serialize", 261 | "ark-std", 262 | "derivative", 263 | "digest 0.10.7", 264 | "itertools", 265 | "num-bigint", 266 | "num-traits", 267 | "paste", 268 | "rustc_version", 269 | "zeroize", 270 | ] 271 | 272 | [[package]] 273 | name = "ark-ff-asm" 274 | version = "0.4.2" 275 | source = "registry+https://github.com/rust-lang/crates.io-index" 276 | checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" 277 | dependencies = [ 278 | "quote", 279 | "syn 1.0.109", 280 | ] 281 | 282 | [[package]] 283 | name = "ark-ff-macros" 284 | version = "0.4.2" 285 | source = "registry+https://github.com/rust-lang/crates.io-index" 286 | checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" 287 | dependencies = [ 288 | "num-bigint", 289 | "num-traits", 290 | "proc-macro2", 291 | "quote", 292 | "syn 1.0.109", 293 | ] 294 | 295 | [[package]] 296 | name = "ark-poly" 297 | version = "0.4.2" 298 | source = "registry+https://github.com/rust-lang/crates.io-index" 299 | checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" 300 | dependencies = [ 301 | "ark-ff", 302 | "ark-serialize", 303 | "ark-std", 304 | "derivative", 305 | "hashbrown 0.13.2", 306 | ] 307 | 308 | [[package]] 309 | name = "ark-serialize" 310 | version = "0.4.2" 311 | source = "registry+https://github.com/rust-lang/crates.io-index" 312 | checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" 313 | dependencies = [ 314 | "ark-serialize-derive", 315 | "ark-std", 316 | "digest 0.10.7", 317 | "num-bigint", 318 | ] 319 | 320 | [[package]] 321 | name = "ark-serialize-derive" 322 | version = "0.4.2" 323 | source = "registry+https://github.com/rust-lang/crates.io-index" 324 | checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" 325 | dependencies = [ 326 | "proc-macro2", 327 | "quote", 328 | "syn 1.0.109", 329 | ] 330 | 331 | [[package]] 332 | name = "ark-std" 333 | version = "0.4.0" 334 | source = "registry+https://github.com/rust-lang/crates.io-index" 335 | checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" 336 | dependencies = [ 337 | "num-traits", 338 | "rand 0.8.5", 339 | ] 340 | 341 | [[package]] 342 | name = "arrayref" 343 | version = "0.3.9" 344 | source = "registry+https://github.com/rust-lang/crates.io-index" 345 | checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" 346 | 347 | [[package]] 348 | name = "arrayvec" 349 | version = "0.7.6" 350 | source = "registry+https://github.com/rust-lang/crates.io-index" 351 | checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" 352 | 353 | [[package]] 354 | name = "autocfg" 355 | version = "1.4.0" 356 | source = "registry+https://github.com/rust-lang/crates.io-index" 357 | checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" 358 | 359 | [[package]] 360 | name = "base64" 361 | version = "0.12.3" 362 | source = "registry+https://github.com/rust-lang/crates.io-index" 363 | checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" 364 | 365 | [[package]] 366 | name = "base64" 367 | version = "0.21.7" 368 | source = "registry+https://github.com/rust-lang/crates.io-index" 369 | checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" 370 | 371 | [[package]] 372 | name = "base64" 373 | version = "0.22.1" 374 | source = "registry+https://github.com/rust-lang/crates.io-index" 375 | checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" 376 | 377 | [[package]] 378 | name = "bincode" 379 | version = "1.3.3" 380 | source = "registry+https://github.com/rust-lang/crates.io-index" 381 | checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" 382 | dependencies = [ 383 | "serde", 384 | ] 385 | 386 | [[package]] 387 | name = "bitflags" 388 | version = "2.6.0" 389 | source = "registry+https://github.com/rust-lang/crates.io-index" 390 | checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" 391 | dependencies = [ 392 | "serde", 393 | ] 394 | 395 | [[package]] 396 | name = "bitmaps" 397 | version = "2.1.0" 398 | source = "registry+https://github.com/rust-lang/crates.io-index" 399 | checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" 400 | dependencies = [ 401 | "typenum", 402 | ] 403 | 404 | [[package]] 405 | name = "blake3" 406 | version = "1.5.1" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" 409 | dependencies = [ 410 | "arrayref", 411 | "arrayvec", 412 | "cc", 413 | "cfg-if", 414 | "constant_time_eq", 415 | "digest 0.10.7", 416 | ] 417 | 418 | [[package]] 419 | name = "block-buffer" 420 | version = "0.9.0" 421 | source = "registry+https://github.com/rust-lang/crates.io-index" 422 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 423 | dependencies = [ 424 | "generic-array", 425 | ] 426 | 427 | [[package]] 428 | name = "block-buffer" 429 | version = "0.10.4" 430 | source = "registry+https://github.com/rust-lang/crates.io-index" 431 | checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" 432 | dependencies = [ 433 | "generic-array", 434 | ] 435 | 436 | [[package]] 437 | name = "borsh" 438 | version = "0.9.3" 439 | source = "registry+https://github.com/rust-lang/crates.io-index" 440 | checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa" 441 | dependencies = [ 442 | "borsh-derive 0.9.3", 443 | "hashbrown 0.11.2", 444 | ] 445 | 446 | [[package]] 447 | name = "borsh" 448 | version = "0.10.4" 449 | source = "registry+https://github.com/rust-lang/crates.io-index" 450 | checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" 451 | dependencies = [ 452 | "borsh-derive 0.10.4", 453 | "hashbrown 0.13.2", 454 | ] 455 | 456 | [[package]] 457 | name = "borsh" 458 | version = "1.5.1" 459 | source = "registry+https://github.com/rust-lang/crates.io-index" 460 | checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" 461 | dependencies = [ 462 | "borsh-derive 1.5.1", 463 | "cfg_aliases", 464 | ] 465 | 466 | [[package]] 467 | name = "borsh-derive" 468 | version = "0.9.3" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775" 471 | dependencies = [ 472 | "borsh-derive-internal 0.9.3", 473 | "borsh-schema-derive-internal 0.9.3", 474 | "proc-macro-crate 0.1.5", 475 | "proc-macro2", 476 | "syn 1.0.109", 477 | ] 478 | 479 | [[package]] 480 | name = "borsh-derive" 481 | version = "0.10.4" 482 | source = "registry+https://github.com/rust-lang/crates.io-index" 483 | checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" 484 | dependencies = [ 485 | "borsh-derive-internal 0.10.4", 486 | "borsh-schema-derive-internal 0.10.4", 487 | "proc-macro-crate 0.1.5", 488 | "proc-macro2", 489 | "syn 1.0.109", 490 | ] 491 | 492 | [[package]] 493 | name = "borsh-derive" 494 | version = "1.5.1" 495 | source = "registry+https://github.com/rust-lang/crates.io-index" 496 | checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" 497 | dependencies = [ 498 | "once_cell", 499 | "proc-macro-crate 3.2.0", 500 | "proc-macro2", 501 | "quote", 502 | "syn 2.0.82", 503 | "syn_derive", 504 | ] 505 | 506 | [[package]] 507 | name = "borsh-derive-internal" 508 | version = "0.9.3" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065" 511 | dependencies = [ 512 | "proc-macro2", 513 | "quote", 514 | "syn 1.0.109", 515 | ] 516 | 517 | [[package]] 518 | name = "borsh-derive-internal" 519 | version = "0.10.4" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" 522 | dependencies = [ 523 | "proc-macro2", 524 | "quote", 525 | "syn 1.0.109", 526 | ] 527 | 528 | [[package]] 529 | name = "borsh-schema-derive-internal" 530 | version = "0.9.3" 531 | source = "registry+https://github.com/rust-lang/crates.io-index" 532 | checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0" 533 | dependencies = [ 534 | "proc-macro2", 535 | "quote", 536 | "syn 1.0.109", 537 | ] 538 | 539 | [[package]] 540 | name = "borsh-schema-derive-internal" 541 | version = "0.10.4" 542 | source = "registry+https://github.com/rust-lang/crates.io-index" 543 | checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" 544 | dependencies = [ 545 | "proc-macro2", 546 | "quote", 547 | "syn 1.0.109", 548 | ] 549 | 550 | [[package]] 551 | name = "bs58" 552 | version = "0.4.0" 553 | source = "registry+https://github.com/rust-lang/crates.io-index" 554 | checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" 555 | 556 | [[package]] 557 | name = "bs58" 558 | version = "0.5.1" 559 | source = "registry+https://github.com/rust-lang/crates.io-index" 560 | checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" 561 | dependencies = [ 562 | "tinyvec", 563 | ] 564 | 565 | [[package]] 566 | name = "bumpalo" 567 | version = "3.16.0" 568 | source = "registry+https://github.com/rust-lang/crates.io-index" 569 | checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" 570 | 571 | [[package]] 572 | name = "bv" 573 | version = "0.11.1" 574 | source = "registry+https://github.com/rust-lang/crates.io-index" 575 | checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" 576 | dependencies = [ 577 | "feature-probe", 578 | "serde", 579 | ] 580 | 581 | [[package]] 582 | name = "bytemuck" 583 | version = "1.19.0" 584 | source = "registry+https://github.com/rust-lang/crates.io-index" 585 | checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" 586 | dependencies = [ 587 | "bytemuck_derive", 588 | ] 589 | 590 | [[package]] 591 | name = "bytemuck_derive" 592 | version = "1.8.0" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" 595 | dependencies = [ 596 | "proc-macro2", 597 | "quote", 598 | "syn 2.0.82", 599 | ] 600 | 601 | [[package]] 602 | name = "byteorder" 603 | version = "1.5.0" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" 606 | 607 | [[package]] 608 | name = "cargo_toml" 609 | version = "0.19.2" 610 | source = "registry+https://github.com/rust-lang/crates.io-index" 611 | checksum = "a98356df42a2eb1bd8f1793ae4ee4de48e384dd974ce5eac8eee802edb7492be" 612 | dependencies = [ 613 | "serde", 614 | "toml 0.8.19", 615 | ] 616 | 617 | [[package]] 618 | name = "cc" 619 | version = "1.1.31" 620 | source = "registry+https://github.com/rust-lang/crates.io-index" 621 | checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" 622 | dependencies = [ 623 | "jobserver", 624 | "libc", 625 | "shlex", 626 | ] 627 | 628 | [[package]] 629 | name = "cfg-if" 630 | version = "1.0.0" 631 | source = "registry+https://github.com/rust-lang/crates.io-index" 632 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 633 | 634 | [[package]] 635 | name = "cfg_aliases" 636 | version = "0.2.1" 637 | source = "registry+https://github.com/rust-lang/crates.io-index" 638 | checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" 639 | 640 | [[package]] 641 | name = "console_error_panic_hook" 642 | version = "0.1.7" 643 | source = "registry+https://github.com/rust-lang/crates.io-index" 644 | checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" 645 | dependencies = [ 646 | "cfg-if", 647 | "wasm-bindgen", 648 | ] 649 | 650 | [[package]] 651 | name = "console_log" 652 | version = "0.2.2" 653 | source = "registry+https://github.com/rust-lang/crates.io-index" 654 | checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" 655 | dependencies = [ 656 | "log", 657 | "web-sys", 658 | ] 659 | 660 | [[package]] 661 | name = "constant_time_eq" 662 | version = "0.3.1" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" 665 | 666 | [[package]] 667 | name = "cpufeatures" 668 | version = "0.2.14" 669 | source = "registry+https://github.com/rust-lang/crates.io-index" 670 | checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" 671 | dependencies = [ 672 | "libc", 673 | ] 674 | 675 | [[package]] 676 | name = "crossbeam-deque" 677 | version = "0.8.5" 678 | source = "registry+https://github.com/rust-lang/crates.io-index" 679 | checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" 680 | dependencies = [ 681 | "crossbeam-epoch", 682 | "crossbeam-utils", 683 | ] 684 | 685 | [[package]] 686 | name = "crossbeam-epoch" 687 | version = "0.9.18" 688 | source = "registry+https://github.com/rust-lang/crates.io-index" 689 | checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" 690 | dependencies = [ 691 | "crossbeam-utils", 692 | ] 693 | 694 | [[package]] 695 | name = "crossbeam-utils" 696 | version = "0.8.20" 697 | source = "registry+https://github.com/rust-lang/crates.io-index" 698 | checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" 699 | 700 | [[package]] 701 | name = "crunchy" 702 | version = "0.2.2" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 705 | 706 | [[package]] 707 | name = "crypto-common" 708 | version = "0.1.6" 709 | source = "registry+https://github.com/rust-lang/crates.io-index" 710 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 711 | dependencies = [ 712 | "generic-array", 713 | "typenum", 714 | ] 715 | 716 | [[package]] 717 | name = "crypto-mac" 718 | version = "0.8.0" 719 | source = "registry+https://github.com/rust-lang/crates.io-index" 720 | checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" 721 | dependencies = [ 722 | "generic-array", 723 | "subtle", 724 | ] 725 | 726 | [[package]] 727 | name = "curve25519-dalek" 728 | version = "3.2.1" 729 | source = "registry+https://github.com/rust-lang/crates.io-index" 730 | checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" 731 | dependencies = [ 732 | "byteorder", 733 | "digest 0.9.0", 734 | "rand_core 0.5.1", 735 | "serde", 736 | "subtle", 737 | "zeroize", 738 | ] 739 | 740 | [[package]] 741 | name = "derivative" 742 | version = "2.2.0" 743 | source = "registry+https://github.com/rust-lang/crates.io-index" 744 | checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" 745 | dependencies = [ 746 | "proc-macro2", 747 | "quote", 748 | "syn 1.0.109", 749 | ] 750 | 751 | [[package]] 752 | name = "digest" 753 | version = "0.9.0" 754 | source = "registry+https://github.com/rust-lang/crates.io-index" 755 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 756 | dependencies = [ 757 | "generic-array", 758 | ] 759 | 760 | [[package]] 761 | name = "digest" 762 | version = "0.10.7" 763 | source = "registry+https://github.com/rust-lang/crates.io-index" 764 | checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" 765 | dependencies = [ 766 | "block-buffer 0.10.4", 767 | "crypto-common", 768 | "subtle", 769 | ] 770 | 771 | [[package]] 772 | name = "either" 773 | version = "1.13.0" 774 | source = "registry+https://github.com/rust-lang/crates.io-index" 775 | checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" 776 | 777 | [[package]] 778 | name = "equivalent" 779 | version = "1.0.1" 780 | source = "registry+https://github.com/rust-lang/crates.io-index" 781 | checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" 782 | 783 | [[package]] 784 | name = "feature-probe" 785 | version = "0.1.1" 786 | source = "registry+https://github.com/rust-lang/crates.io-index" 787 | checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" 788 | 789 | [[package]] 790 | name = "generic-array" 791 | version = "0.14.7" 792 | source = "registry+https://github.com/rust-lang/crates.io-index" 793 | checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" 794 | dependencies = [ 795 | "serde", 796 | "typenum", 797 | "version_check", 798 | ] 799 | 800 | [[package]] 801 | name = "getrandom" 802 | version = "0.1.16" 803 | source = "registry+https://github.com/rust-lang/crates.io-index" 804 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 805 | dependencies = [ 806 | "cfg-if", 807 | "js-sys", 808 | "libc", 809 | "wasi 0.9.0+wasi-snapshot-preview1", 810 | "wasm-bindgen", 811 | ] 812 | 813 | [[package]] 814 | name = "getrandom" 815 | version = "0.2.15" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" 818 | dependencies = [ 819 | "cfg-if", 820 | "js-sys", 821 | "libc", 822 | "wasi 0.11.0+wasi-snapshot-preview1", 823 | "wasm-bindgen", 824 | ] 825 | 826 | [[package]] 827 | name = "hashbrown" 828 | version = "0.11.2" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" 831 | dependencies = [ 832 | "ahash 0.7.8", 833 | ] 834 | 835 | [[package]] 836 | name = "hashbrown" 837 | version = "0.13.2" 838 | source = "registry+https://github.com/rust-lang/crates.io-index" 839 | checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" 840 | dependencies = [ 841 | "ahash 0.8.11", 842 | ] 843 | 844 | [[package]] 845 | name = "hashbrown" 846 | version = "0.15.0" 847 | source = "registry+https://github.com/rust-lang/crates.io-index" 848 | checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" 849 | 850 | [[package]] 851 | name = "heck" 852 | version = "0.3.3" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 855 | dependencies = [ 856 | "unicode-segmentation", 857 | ] 858 | 859 | [[package]] 860 | name = "hmac" 861 | version = "0.8.1" 862 | source = "registry+https://github.com/rust-lang/crates.io-index" 863 | checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" 864 | dependencies = [ 865 | "crypto-mac", 866 | "digest 0.9.0", 867 | ] 868 | 869 | [[package]] 870 | name = "hmac-drbg" 871 | version = "0.3.0" 872 | source = "registry+https://github.com/rust-lang/crates.io-index" 873 | checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" 874 | dependencies = [ 875 | "digest 0.9.0", 876 | "generic-array", 877 | "hmac", 878 | ] 879 | 880 | [[package]] 881 | name = "im" 882 | version = "15.1.0" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" 885 | dependencies = [ 886 | "bitmaps", 887 | "rand_core 0.6.4", 888 | "rand_xoshiro", 889 | "rayon", 890 | "serde", 891 | "sized-chunks", 892 | "typenum", 893 | "version_check", 894 | ] 895 | 896 | [[package]] 897 | name = "indexmap" 898 | version = "2.6.0" 899 | source = "registry+https://github.com/rust-lang/crates.io-index" 900 | checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" 901 | dependencies = [ 902 | "equivalent", 903 | "hashbrown 0.15.0", 904 | ] 905 | 906 | [[package]] 907 | name = "itertools" 908 | version = "0.10.5" 909 | source = "registry+https://github.com/rust-lang/crates.io-index" 910 | checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" 911 | dependencies = [ 912 | "either", 913 | ] 914 | 915 | [[package]] 916 | name = "itoa" 917 | version = "1.0.11" 918 | source = "registry+https://github.com/rust-lang/crates.io-index" 919 | checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" 920 | 921 | [[package]] 922 | name = "jobserver" 923 | version = "0.1.32" 924 | source = "registry+https://github.com/rust-lang/crates.io-index" 925 | checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" 926 | dependencies = [ 927 | "libc", 928 | ] 929 | 930 | [[package]] 931 | name = "js-sys" 932 | version = "0.3.72" 933 | source = "registry+https://github.com/rust-lang/crates.io-index" 934 | checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" 935 | dependencies = [ 936 | "wasm-bindgen", 937 | ] 938 | 939 | [[package]] 940 | name = "keccak" 941 | version = "0.1.5" 942 | source = "registry+https://github.com/rust-lang/crates.io-index" 943 | checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" 944 | dependencies = [ 945 | "cpufeatures", 946 | ] 947 | 948 | [[package]] 949 | name = "lazy_static" 950 | version = "1.5.0" 951 | source = "registry+https://github.com/rust-lang/crates.io-index" 952 | checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" 953 | 954 | [[package]] 955 | name = "libc" 956 | version = "0.2.161" 957 | source = "registry+https://github.com/rust-lang/crates.io-index" 958 | checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" 959 | 960 | [[package]] 961 | name = "libsecp256k1" 962 | version = "0.6.0" 963 | source = "registry+https://github.com/rust-lang/crates.io-index" 964 | checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" 965 | dependencies = [ 966 | "arrayref", 967 | "base64 0.12.3", 968 | "digest 0.9.0", 969 | "hmac-drbg", 970 | "libsecp256k1-core", 971 | "libsecp256k1-gen-ecmult", 972 | "libsecp256k1-gen-genmult", 973 | "rand 0.7.3", 974 | "serde", 975 | "sha2 0.9.9", 976 | "typenum", 977 | ] 978 | 979 | [[package]] 980 | name = "libsecp256k1-core" 981 | version = "0.2.2" 982 | source = "registry+https://github.com/rust-lang/crates.io-index" 983 | checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" 984 | dependencies = [ 985 | "crunchy", 986 | "digest 0.9.0", 987 | "subtle", 988 | ] 989 | 990 | [[package]] 991 | name = "libsecp256k1-gen-ecmult" 992 | version = "0.2.1" 993 | source = "registry+https://github.com/rust-lang/crates.io-index" 994 | checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" 995 | dependencies = [ 996 | "libsecp256k1-core", 997 | ] 998 | 999 | [[package]] 1000 | name = "libsecp256k1-gen-genmult" 1001 | version = "0.2.1" 1002 | source = "registry+https://github.com/rust-lang/crates.io-index" 1003 | checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" 1004 | dependencies = [ 1005 | "libsecp256k1-core", 1006 | ] 1007 | 1008 | [[package]] 1009 | name = "light-poseidon" 1010 | version = "0.2.0" 1011 | source = "registry+https://github.com/rust-lang/crates.io-index" 1012 | checksum = "3c9a85a9752c549ceb7578064b4ed891179d20acd85f27318573b64d2d7ee7ee" 1013 | dependencies = [ 1014 | "ark-bn254", 1015 | "ark-ff", 1016 | "num-bigint", 1017 | "thiserror", 1018 | ] 1019 | 1020 | [[package]] 1021 | name = "lock_api" 1022 | version = "0.4.12" 1023 | source = "registry+https://github.com/rust-lang/crates.io-index" 1024 | checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" 1025 | dependencies = [ 1026 | "autocfg", 1027 | "scopeguard", 1028 | ] 1029 | 1030 | [[package]] 1031 | name = "log" 1032 | version = "0.4.22" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" 1035 | 1036 | [[package]] 1037 | name = "memchr" 1038 | version = "2.7.4" 1039 | source = "registry+https://github.com/rust-lang/crates.io-index" 1040 | checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" 1041 | 1042 | [[package]] 1043 | name = "memmap2" 1044 | version = "0.5.10" 1045 | source = "registry+https://github.com/rust-lang/crates.io-index" 1046 | checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" 1047 | dependencies = [ 1048 | "libc", 1049 | ] 1050 | 1051 | [[package]] 1052 | name = "memoffset" 1053 | version = "0.9.1" 1054 | source = "registry+https://github.com/rust-lang/crates.io-index" 1055 | checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" 1056 | dependencies = [ 1057 | "autocfg", 1058 | ] 1059 | 1060 | [[package]] 1061 | name = "num-bigint" 1062 | version = "0.4.6" 1063 | source = "registry+https://github.com/rust-lang/crates.io-index" 1064 | checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" 1065 | dependencies = [ 1066 | "num-integer", 1067 | "num-traits", 1068 | ] 1069 | 1070 | [[package]] 1071 | name = "num-derive" 1072 | version = "0.4.2" 1073 | source = "registry+https://github.com/rust-lang/crates.io-index" 1074 | checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" 1075 | dependencies = [ 1076 | "proc-macro2", 1077 | "quote", 1078 | "syn 2.0.82", 1079 | ] 1080 | 1081 | [[package]] 1082 | name = "num-integer" 1083 | version = "0.1.46" 1084 | source = "registry+https://github.com/rust-lang/crates.io-index" 1085 | checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" 1086 | dependencies = [ 1087 | "num-traits", 1088 | ] 1089 | 1090 | [[package]] 1091 | name = "num-traits" 1092 | version = "0.2.19" 1093 | source = "registry+https://github.com/rust-lang/crates.io-index" 1094 | checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" 1095 | dependencies = [ 1096 | "autocfg", 1097 | ] 1098 | 1099 | [[package]] 1100 | name = "once_cell" 1101 | version = "1.20.2" 1102 | source = "registry+https://github.com/rust-lang/crates.io-index" 1103 | checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" 1104 | 1105 | [[package]] 1106 | name = "opaque-debug" 1107 | version = "0.3.1" 1108 | source = "registry+https://github.com/rust-lang/crates.io-index" 1109 | checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" 1110 | 1111 | [[package]] 1112 | name = "parking_lot" 1113 | version = "0.12.3" 1114 | source = "registry+https://github.com/rust-lang/crates.io-index" 1115 | checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" 1116 | dependencies = [ 1117 | "lock_api", 1118 | "parking_lot_core", 1119 | ] 1120 | 1121 | [[package]] 1122 | name = "parking_lot_core" 1123 | version = "0.9.10" 1124 | source = "registry+https://github.com/rust-lang/crates.io-index" 1125 | checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" 1126 | dependencies = [ 1127 | "cfg-if", 1128 | "libc", 1129 | "redox_syscall", 1130 | "smallvec", 1131 | "windows-targets", 1132 | ] 1133 | 1134 | [[package]] 1135 | name = "paste" 1136 | version = "1.0.15" 1137 | source = "registry+https://github.com/rust-lang/crates.io-index" 1138 | checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" 1139 | 1140 | [[package]] 1141 | name = "pbkdf2" 1142 | version = "0.4.0" 1143 | source = "registry+https://github.com/rust-lang/crates.io-index" 1144 | checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" 1145 | dependencies = [ 1146 | "crypto-mac", 1147 | ] 1148 | 1149 | [[package]] 1150 | name = "ppv-lite86" 1151 | version = "0.2.20" 1152 | source = "registry+https://github.com/rust-lang/crates.io-index" 1153 | checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" 1154 | dependencies = [ 1155 | "zerocopy", 1156 | ] 1157 | 1158 | [[package]] 1159 | name = "proc-macro-crate" 1160 | version = "0.1.5" 1161 | source = "registry+https://github.com/rust-lang/crates.io-index" 1162 | checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" 1163 | dependencies = [ 1164 | "toml 0.5.11", 1165 | ] 1166 | 1167 | [[package]] 1168 | name = "proc-macro-crate" 1169 | version = "3.2.0" 1170 | source = "registry+https://github.com/rust-lang/crates.io-index" 1171 | checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" 1172 | dependencies = [ 1173 | "toml_edit", 1174 | ] 1175 | 1176 | [[package]] 1177 | name = "proc-macro-error" 1178 | version = "1.0.4" 1179 | source = "registry+https://github.com/rust-lang/crates.io-index" 1180 | checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" 1181 | dependencies = [ 1182 | "proc-macro-error-attr", 1183 | "proc-macro2", 1184 | "quote", 1185 | "version_check", 1186 | ] 1187 | 1188 | [[package]] 1189 | name = "proc-macro-error-attr" 1190 | version = "1.0.4" 1191 | source = "registry+https://github.com/rust-lang/crates.io-index" 1192 | checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" 1193 | dependencies = [ 1194 | "proc-macro2", 1195 | "quote", 1196 | "version_check", 1197 | ] 1198 | 1199 | [[package]] 1200 | name = "proc-macro2" 1201 | version = "1.0.88" 1202 | source = "registry+https://github.com/rust-lang/crates.io-index" 1203 | checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9" 1204 | dependencies = [ 1205 | "unicode-ident", 1206 | ] 1207 | 1208 | [[package]] 1209 | name = "quote" 1210 | version = "1.0.37" 1211 | source = "registry+https://github.com/rust-lang/crates.io-index" 1212 | checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" 1213 | dependencies = [ 1214 | "proc-macro2", 1215 | ] 1216 | 1217 | [[package]] 1218 | name = "rand" 1219 | version = "0.7.3" 1220 | source = "registry+https://github.com/rust-lang/crates.io-index" 1221 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 1222 | dependencies = [ 1223 | "getrandom 0.1.16", 1224 | "libc", 1225 | "rand_chacha 0.2.2", 1226 | "rand_core 0.5.1", 1227 | "rand_hc", 1228 | ] 1229 | 1230 | [[package]] 1231 | name = "rand" 1232 | version = "0.8.5" 1233 | source = "registry+https://github.com/rust-lang/crates.io-index" 1234 | checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" 1235 | dependencies = [ 1236 | "libc", 1237 | "rand_chacha 0.3.1", 1238 | "rand_core 0.6.4", 1239 | ] 1240 | 1241 | [[package]] 1242 | name = "rand_chacha" 1243 | version = "0.2.2" 1244 | source = "registry+https://github.com/rust-lang/crates.io-index" 1245 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 1246 | dependencies = [ 1247 | "ppv-lite86", 1248 | "rand_core 0.5.1", 1249 | ] 1250 | 1251 | [[package]] 1252 | name = "rand_chacha" 1253 | version = "0.3.1" 1254 | source = "registry+https://github.com/rust-lang/crates.io-index" 1255 | checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" 1256 | dependencies = [ 1257 | "ppv-lite86", 1258 | "rand_core 0.6.4", 1259 | ] 1260 | 1261 | [[package]] 1262 | name = "rand_core" 1263 | version = "0.5.1" 1264 | source = "registry+https://github.com/rust-lang/crates.io-index" 1265 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 1266 | dependencies = [ 1267 | "getrandom 0.1.16", 1268 | ] 1269 | 1270 | [[package]] 1271 | name = "rand_core" 1272 | version = "0.6.4" 1273 | source = "registry+https://github.com/rust-lang/crates.io-index" 1274 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 1275 | dependencies = [ 1276 | "getrandom 0.2.15", 1277 | ] 1278 | 1279 | [[package]] 1280 | name = "rand_hc" 1281 | version = "0.2.0" 1282 | source = "registry+https://github.com/rust-lang/crates.io-index" 1283 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 1284 | dependencies = [ 1285 | "rand_core 0.5.1", 1286 | ] 1287 | 1288 | [[package]] 1289 | name = "rand_xoshiro" 1290 | version = "0.6.0" 1291 | source = "registry+https://github.com/rust-lang/crates.io-index" 1292 | checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" 1293 | dependencies = [ 1294 | "rand_core 0.6.4", 1295 | ] 1296 | 1297 | [[package]] 1298 | name = "rayon" 1299 | version = "1.10.0" 1300 | source = "registry+https://github.com/rust-lang/crates.io-index" 1301 | checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" 1302 | dependencies = [ 1303 | "either", 1304 | "rayon-core", 1305 | ] 1306 | 1307 | [[package]] 1308 | name = "rayon-core" 1309 | version = "1.12.1" 1310 | source = "registry+https://github.com/rust-lang/crates.io-index" 1311 | checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" 1312 | dependencies = [ 1313 | "crossbeam-deque", 1314 | "crossbeam-utils", 1315 | ] 1316 | 1317 | [[package]] 1318 | name = "redox_syscall" 1319 | version = "0.5.7" 1320 | source = "registry+https://github.com/rust-lang/crates.io-index" 1321 | checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" 1322 | dependencies = [ 1323 | "bitflags", 1324 | ] 1325 | 1326 | [[package]] 1327 | name = "regex" 1328 | version = "1.11.0" 1329 | source = "registry+https://github.com/rust-lang/crates.io-index" 1330 | checksum = "38200e5ee88914975b69f657f0801b6f6dccafd44fd9326302a4aaeecfacb1d8" 1331 | dependencies = [ 1332 | "aho-corasick", 1333 | "memchr", 1334 | "regex-automata", 1335 | "regex-syntax", 1336 | ] 1337 | 1338 | [[package]] 1339 | name = "regex-automata" 1340 | version = "0.4.8" 1341 | source = "registry+https://github.com/rust-lang/crates.io-index" 1342 | checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" 1343 | dependencies = [ 1344 | "aho-corasick", 1345 | "memchr", 1346 | "regex-syntax", 1347 | ] 1348 | 1349 | [[package]] 1350 | name = "regex-syntax" 1351 | version = "0.8.5" 1352 | source = "registry+https://github.com/rust-lang/crates.io-index" 1353 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" 1354 | 1355 | [[package]] 1356 | name = "rustc-hash" 1357 | version = "1.1.0" 1358 | source = "registry+https://github.com/rust-lang/crates.io-index" 1359 | checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" 1360 | 1361 | [[package]] 1362 | name = "rustc_version" 1363 | version = "0.4.1" 1364 | source = "registry+https://github.com/rust-lang/crates.io-index" 1365 | checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" 1366 | dependencies = [ 1367 | "semver", 1368 | ] 1369 | 1370 | [[package]] 1371 | name = "rustversion" 1372 | version = "1.0.18" 1373 | source = "registry+https://github.com/rust-lang/crates.io-index" 1374 | checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" 1375 | 1376 | [[package]] 1377 | name = "ryu" 1378 | version = "1.0.18" 1379 | source = "registry+https://github.com/rust-lang/crates.io-index" 1380 | checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" 1381 | 1382 | [[package]] 1383 | name = "scopeguard" 1384 | version = "1.2.0" 1385 | source = "registry+https://github.com/rust-lang/crates.io-index" 1386 | checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" 1387 | 1388 | [[package]] 1389 | name = "segmenter-registry" 1390 | version = "1.0.0" 1391 | dependencies = [ 1392 | "anchor-lang", 1393 | "bytemuck", 1394 | ] 1395 | 1396 | [[package]] 1397 | name = "semver" 1398 | version = "1.0.23" 1399 | source = "registry+https://github.com/rust-lang/crates.io-index" 1400 | checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" 1401 | 1402 | [[package]] 1403 | name = "serde" 1404 | version = "1.0.210" 1405 | source = "registry+https://github.com/rust-lang/crates.io-index" 1406 | checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" 1407 | dependencies = [ 1408 | "serde_derive", 1409 | ] 1410 | 1411 | [[package]] 1412 | name = "serde_bytes" 1413 | version = "0.11.15" 1414 | source = "registry+https://github.com/rust-lang/crates.io-index" 1415 | checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" 1416 | dependencies = [ 1417 | "serde", 1418 | ] 1419 | 1420 | [[package]] 1421 | name = "serde_derive" 1422 | version = "1.0.210" 1423 | source = "registry+https://github.com/rust-lang/crates.io-index" 1424 | checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" 1425 | dependencies = [ 1426 | "proc-macro2", 1427 | "quote", 1428 | "syn 2.0.82", 1429 | ] 1430 | 1431 | [[package]] 1432 | name = "serde_json" 1433 | version = "1.0.132" 1434 | source = "registry+https://github.com/rust-lang/crates.io-index" 1435 | checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" 1436 | dependencies = [ 1437 | "itoa", 1438 | "memchr", 1439 | "ryu", 1440 | "serde", 1441 | ] 1442 | 1443 | [[package]] 1444 | name = "serde_spanned" 1445 | version = "0.6.8" 1446 | source = "registry+https://github.com/rust-lang/crates.io-index" 1447 | checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" 1448 | dependencies = [ 1449 | "serde", 1450 | ] 1451 | 1452 | [[package]] 1453 | name = "sha2" 1454 | version = "0.9.9" 1455 | source = "registry+https://github.com/rust-lang/crates.io-index" 1456 | checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" 1457 | dependencies = [ 1458 | "block-buffer 0.9.0", 1459 | "cfg-if", 1460 | "cpufeatures", 1461 | "digest 0.9.0", 1462 | "opaque-debug", 1463 | ] 1464 | 1465 | [[package]] 1466 | name = "sha2" 1467 | version = "0.10.8" 1468 | source = "registry+https://github.com/rust-lang/crates.io-index" 1469 | checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" 1470 | dependencies = [ 1471 | "cfg-if", 1472 | "cpufeatures", 1473 | "digest 0.10.7", 1474 | ] 1475 | 1476 | [[package]] 1477 | name = "sha3" 1478 | version = "0.10.8" 1479 | source = "registry+https://github.com/rust-lang/crates.io-index" 1480 | checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" 1481 | dependencies = [ 1482 | "digest 0.10.7", 1483 | "keccak", 1484 | ] 1485 | 1486 | [[package]] 1487 | name = "shlex" 1488 | version = "1.3.0" 1489 | source = "registry+https://github.com/rust-lang/crates.io-index" 1490 | checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" 1491 | 1492 | [[package]] 1493 | name = "sized-chunks" 1494 | version = "0.6.5" 1495 | source = "registry+https://github.com/rust-lang/crates.io-index" 1496 | checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" 1497 | dependencies = [ 1498 | "bitmaps", 1499 | "typenum", 1500 | ] 1501 | 1502 | [[package]] 1503 | name = "smallvec" 1504 | version = "1.13.2" 1505 | source = "registry+https://github.com/rust-lang/crates.io-index" 1506 | checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" 1507 | 1508 | [[package]] 1509 | name = "solana-conditional-liquidity" 1510 | version = "1.0.0" 1511 | dependencies = [ 1512 | "base64 0.22.1", 1513 | "bytemuck", 1514 | "solana-program", 1515 | ] 1516 | 1517 | [[package]] 1518 | name = "solana-frozen-abi" 1519 | version = "1.18.26" 1520 | source = "registry+https://github.com/rust-lang/crates.io-index" 1521 | checksum = "03ab2c30c15311b511c0d1151e4ab6bc9a3e080a37e7c6e7c2d96f5784cf9434" 1522 | dependencies = [ 1523 | "block-buffer 0.10.4", 1524 | "bs58 0.4.0", 1525 | "bv", 1526 | "either", 1527 | "generic-array", 1528 | "im", 1529 | "lazy_static", 1530 | "log", 1531 | "memmap2", 1532 | "rustc_version", 1533 | "serde", 1534 | "serde_bytes", 1535 | "serde_derive", 1536 | "sha2 0.10.8", 1537 | "solana-frozen-abi-macro", 1538 | "subtle", 1539 | "thiserror", 1540 | ] 1541 | 1542 | [[package]] 1543 | name = "solana-frozen-abi-macro" 1544 | version = "1.18.26" 1545 | source = "registry+https://github.com/rust-lang/crates.io-index" 1546 | checksum = "c142f779c3633ac83c84d04ff06c70e1f558c876f13358bed77ba629c7417932" 1547 | dependencies = [ 1548 | "proc-macro2", 1549 | "quote", 1550 | "rustc_version", 1551 | "syn 2.0.82", 1552 | ] 1553 | 1554 | [[package]] 1555 | name = "solana-program" 1556 | version = "1.18.26" 1557 | source = "registry+https://github.com/rust-lang/crates.io-index" 1558 | checksum = "c10f4588cefd716b24a1a40dd32c278e43a560ab8ce4de6b5805c9d113afdfa1" 1559 | dependencies = [ 1560 | "ark-bn254", 1561 | "ark-ec", 1562 | "ark-ff", 1563 | "ark-serialize", 1564 | "base64 0.21.7", 1565 | "bincode", 1566 | "bitflags", 1567 | "blake3", 1568 | "borsh 0.10.4", 1569 | "borsh 0.9.3", 1570 | "borsh 1.5.1", 1571 | "bs58 0.4.0", 1572 | "bv", 1573 | "bytemuck", 1574 | "cc", 1575 | "console_error_panic_hook", 1576 | "console_log", 1577 | "curve25519-dalek", 1578 | "getrandom 0.2.15", 1579 | "itertools", 1580 | "js-sys", 1581 | "lazy_static", 1582 | "libc", 1583 | "libsecp256k1", 1584 | "light-poseidon", 1585 | "log", 1586 | "memoffset", 1587 | "num-bigint", 1588 | "num-derive", 1589 | "num-traits", 1590 | "parking_lot", 1591 | "rand 0.8.5", 1592 | "rustc_version", 1593 | "rustversion", 1594 | "serde", 1595 | "serde_bytes", 1596 | "serde_derive", 1597 | "serde_json", 1598 | "sha2 0.10.8", 1599 | "sha3", 1600 | "solana-frozen-abi", 1601 | "solana-frozen-abi-macro", 1602 | "solana-sdk-macro", 1603 | "thiserror", 1604 | "tiny-bip39", 1605 | "wasm-bindgen", 1606 | "zeroize", 1607 | ] 1608 | 1609 | [[package]] 1610 | name = "solana-sdk-macro" 1611 | version = "1.18.26" 1612 | source = "registry+https://github.com/rust-lang/crates.io-index" 1613 | checksum = "1b75d0f193a27719257af19144fdaebec0415d1c9e9226ae4bd29b791be5e9bd" 1614 | dependencies = [ 1615 | "bs58 0.4.0", 1616 | "proc-macro2", 1617 | "quote", 1618 | "rustversion", 1619 | "syn 2.0.82", 1620 | ] 1621 | 1622 | [[package]] 1623 | name = "subtle" 1624 | version = "2.6.1" 1625 | source = "registry+https://github.com/rust-lang/crates.io-index" 1626 | checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" 1627 | 1628 | [[package]] 1629 | name = "syn" 1630 | version = "1.0.109" 1631 | source = "registry+https://github.com/rust-lang/crates.io-index" 1632 | checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" 1633 | dependencies = [ 1634 | "proc-macro2", 1635 | "quote", 1636 | "unicode-ident", 1637 | ] 1638 | 1639 | [[package]] 1640 | name = "syn" 1641 | version = "2.0.82" 1642 | source = "registry+https://github.com/rust-lang/crates.io-index" 1643 | checksum = "83540f837a8afc019423a8edb95b52a8effe46957ee402287f4292fae35be021" 1644 | dependencies = [ 1645 | "proc-macro2", 1646 | "quote", 1647 | "unicode-ident", 1648 | ] 1649 | 1650 | [[package]] 1651 | name = "syn_derive" 1652 | version = "0.1.8" 1653 | source = "registry+https://github.com/rust-lang/crates.io-index" 1654 | checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" 1655 | dependencies = [ 1656 | "proc-macro-error", 1657 | "proc-macro2", 1658 | "quote", 1659 | "syn 2.0.82", 1660 | ] 1661 | 1662 | [[package]] 1663 | name = "thiserror" 1664 | version = "1.0.64" 1665 | source = "registry+https://github.com/rust-lang/crates.io-index" 1666 | checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" 1667 | dependencies = [ 1668 | "thiserror-impl", 1669 | ] 1670 | 1671 | [[package]] 1672 | name = "thiserror-impl" 1673 | version = "1.0.64" 1674 | source = "registry+https://github.com/rust-lang/crates.io-index" 1675 | checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" 1676 | dependencies = [ 1677 | "proc-macro2", 1678 | "quote", 1679 | "syn 2.0.82", 1680 | ] 1681 | 1682 | [[package]] 1683 | name = "tiny-bip39" 1684 | version = "0.8.2" 1685 | source = "registry+https://github.com/rust-lang/crates.io-index" 1686 | checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" 1687 | dependencies = [ 1688 | "anyhow", 1689 | "hmac", 1690 | "once_cell", 1691 | "pbkdf2", 1692 | "rand 0.7.3", 1693 | "rustc-hash", 1694 | "sha2 0.9.9", 1695 | "thiserror", 1696 | "unicode-normalization", 1697 | "wasm-bindgen", 1698 | "zeroize", 1699 | ] 1700 | 1701 | [[package]] 1702 | name = "tinyvec" 1703 | version = "1.8.0" 1704 | source = "registry+https://github.com/rust-lang/crates.io-index" 1705 | checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" 1706 | dependencies = [ 1707 | "tinyvec_macros", 1708 | ] 1709 | 1710 | [[package]] 1711 | name = "tinyvec_macros" 1712 | version = "0.1.1" 1713 | source = "registry+https://github.com/rust-lang/crates.io-index" 1714 | checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" 1715 | 1716 | [[package]] 1717 | name = "toml" 1718 | version = "0.5.11" 1719 | source = "registry+https://github.com/rust-lang/crates.io-index" 1720 | checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" 1721 | dependencies = [ 1722 | "serde", 1723 | ] 1724 | 1725 | [[package]] 1726 | name = "toml" 1727 | version = "0.8.19" 1728 | source = "registry+https://github.com/rust-lang/crates.io-index" 1729 | checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" 1730 | dependencies = [ 1731 | "serde", 1732 | "serde_spanned", 1733 | "toml_datetime", 1734 | "toml_edit", 1735 | ] 1736 | 1737 | [[package]] 1738 | name = "toml_datetime" 1739 | version = "0.6.8" 1740 | source = "registry+https://github.com/rust-lang/crates.io-index" 1741 | checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" 1742 | dependencies = [ 1743 | "serde", 1744 | ] 1745 | 1746 | [[package]] 1747 | name = "toml_edit" 1748 | version = "0.22.22" 1749 | source = "registry+https://github.com/rust-lang/crates.io-index" 1750 | checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" 1751 | dependencies = [ 1752 | "indexmap", 1753 | "serde", 1754 | "serde_spanned", 1755 | "toml_datetime", 1756 | "winnow", 1757 | ] 1758 | 1759 | [[package]] 1760 | name = "typenum" 1761 | version = "1.17.0" 1762 | source = "registry+https://github.com/rust-lang/crates.io-index" 1763 | checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" 1764 | 1765 | [[package]] 1766 | name = "unicode-ident" 1767 | version = "1.0.13" 1768 | source = "registry+https://github.com/rust-lang/crates.io-index" 1769 | checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" 1770 | 1771 | [[package]] 1772 | name = "unicode-normalization" 1773 | version = "0.1.24" 1774 | source = "registry+https://github.com/rust-lang/crates.io-index" 1775 | checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956" 1776 | dependencies = [ 1777 | "tinyvec", 1778 | ] 1779 | 1780 | [[package]] 1781 | name = "unicode-segmentation" 1782 | version = "1.12.0" 1783 | source = "registry+https://github.com/rust-lang/crates.io-index" 1784 | checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" 1785 | 1786 | [[package]] 1787 | name = "version_check" 1788 | version = "0.9.5" 1789 | source = "registry+https://github.com/rust-lang/crates.io-index" 1790 | checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" 1791 | 1792 | [[package]] 1793 | name = "wasi" 1794 | version = "0.9.0+wasi-snapshot-preview1" 1795 | source = "registry+https://github.com/rust-lang/crates.io-index" 1796 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 1797 | 1798 | [[package]] 1799 | name = "wasi" 1800 | version = "0.11.0+wasi-snapshot-preview1" 1801 | source = "registry+https://github.com/rust-lang/crates.io-index" 1802 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" 1803 | 1804 | [[package]] 1805 | name = "wasm-bindgen" 1806 | version = "0.2.95" 1807 | source = "registry+https://github.com/rust-lang/crates.io-index" 1808 | checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" 1809 | dependencies = [ 1810 | "cfg-if", 1811 | "once_cell", 1812 | "wasm-bindgen-macro", 1813 | ] 1814 | 1815 | [[package]] 1816 | name = "wasm-bindgen-backend" 1817 | version = "0.2.95" 1818 | source = "registry+https://github.com/rust-lang/crates.io-index" 1819 | checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" 1820 | dependencies = [ 1821 | "bumpalo", 1822 | "log", 1823 | "once_cell", 1824 | "proc-macro2", 1825 | "quote", 1826 | "syn 2.0.82", 1827 | "wasm-bindgen-shared", 1828 | ] 1829 | 1830 | [[package]] 1831 | name = "wasm-bindgen-macro" 1832 | version = "0.2.95" 1833 | source = "registry+https://github.com/rust-lang/crates.io-index" 1834 | checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" 1835 | dependencies = [ 1836 | "quote", 1837 | "wasm-bindgen-macro-support", 1838 | ] 1839 | 1840 | [[package]] 1841 | name = "wasm-bindgen-macro-support" 1842 | version = "0.2.95" 1843 | source = "registry+https://github.com/rust-lang/crates.io-index" 1844 | checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" 1845 | dependencies = [ 1846 | "proc-macro2", 1847 | "quote", 1848 | "syn 2.0.82", 1849 | "wasm-bindgen-backend", 1850 | "wasm-bindgen-shared", 1851 | ] 1852 | 1853 | [[package]] 1854 | name = "wasm-bindgen-shared" 1855 | version = "0.2.95" 1856 | source = "registry+https://github.com/rust-lang/crates.io-index" 1857 | checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" 1858 | 1859 | [[package]] 1860 | name = "web-sys" 1861 | version = "0.3.72" 1862 | source = "registry+https://github.com/rust-lang/crates.io-index" 1863 | checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" 1864 | dependencies = [ 1865 | "js-sys", 1866 | "wasm-bindgen", 1867 | ] 1868 | 1869 | [[package]] 1870 | name = "windows-targets" 1871 | version = "0.52.6" 1872 | source = "registry+https://github.com/rust-lang/crates.io-index" 1873 | checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" 1874 | dependencies = [ 1875 | "windows_aarch64_gnullvm", 1876 | "windows_aarch64_msvc", 1877 | "windows_i686_gnu", 1878 | "windows_i686_gnullvm", 1879 | "windows_i686_msvc", 1880 | "windows_x86_64_gnu", 1881 | "windows_x86_64_gnullvm", 1882 | "windows_x86_64_msvc", 1883 | ] 1884 | 1885 | [[package]] 1886 | name = "windows_aarch64_gnullvm" 1887 | version = "0.52.6" 1888 | source = "registry+https://github.com/rust-lang/crates.io-index" 1889 | checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" 1890 | 1891 | [[package]] 1892 | name = "windows_aarch64_msvc" 1893 | version = "0.52.6" 1894 | source = "registry+https://github.com/rust-lang/crates.io-index" 1895 | checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" 1896 | 1897 | [[package]] 1898 | name = "windows_i686_gnu" 1899 | version = "0.52.6" 1900 | source = "registry+https://github.com/rust-lang/crates.io-index" 1901 | checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" 1902 | 1903 | [[package]] 1904 | name = "windows_i686_gnullvm" 1905 | version = "0.52.6" 1906 | source = "registry+https://github.com/rust-lang/crates.io-index" 1907 | checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" 1908 | 1909 | [[package]] 1910 | name = "windows_i686_msvc" 1911 | version = "0.52.6" 1912 | source = "registry+https://github.com/rust-lang/crates.io-index" 1913 | checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" 1914 | 1915 | [[package]] 1916 | name = "windows_x86_64_gnu" 1917 | version = "0.52.6" 1918 | source = "registry+https://github.com/rust-lang/crates.io-index" 1919 | checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" 1920 | 1921 | [[package]] 1922 | name = "windows_x86_64_gnullvm" 1923 | version = "0.52.6" 1924 | source = "registry+https://github.com/rust-lang/crates.io-index" 1925 | checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" 1926 | 1927 | [[package]] 1928 | name = "windows_x86_64_msvc" 1929 | version = "0.52.6" 1930 | source = "registry+https://github.com/rust-lang/crates.io-index" 1931 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" 1932 | 1933 | [[package]] 1934 | name = "winnow" 1935 | version = "0.6.20" 1936 | source = "registry+https://github.com/rust-lang/crates.io-index" 1937 | checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" 1938 | dependencies = [ 1939 | "memchr", 1940 | ] 1941 | 1942 | [[package]] 1943 | name = "zerocopy" 1944 | version = "0.7.35" 1945 | source = "registry+https://github.com/rust-lang/crates.io-index" 1946 | checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" 1947 | dependencies = [ 1948 | "byteorder", 1949 | "zerocopy-derive", 1950 | ] 1951 | 1952 | [[package]] 1953 | name = "zerocopy-derive" 1954 | version = "0.7.35" 1955 | source = "registry+https://github.com/rust-lang/crates.io-index" 1956 | checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" 1957 | dependencies = [ 1958 | "proc-macro2", 1959 | "quote", 1960 | "syn 2.0.82", 1961 | ] 1962 | 1963 | [[package]] 1964 | name = "zeroize" 1965 | version = "1.3.0" 1966 | source = "registry+https://github.com/rust-lang/crates.io-index" 1967 | checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" 1968 | dependencies = [ 1969 | "zeroize_derive", 1970 | ] 1971 | 1972 | [[package]] 1973 | name = "zeroize_derive" 1974 | version = "1.4.2" 1975 | source = "registry+https://github.com/rust-lang/crates.io-index" 1976 | checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" 1977 | dependencies = [ 1978 | "proc-macro2", 1979 | "quote", 1980 | "syn 2.0.82", 1981 | ] 1982 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | members = [ 3 | "crates/*", 4 | "programs/*" 5 | ] 6 | 7 | [profile.release] 8 | overflow-checks = true 9 | lto = "fat" 10 | codegen-units = 1 11 | [profile.release.build-override] 12 | opt-level = 3 13 | incremental = false 14 | codegen-units = 1 15 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Conditional Liquidity 2 | 3 | Conditional liquidity is an LP framework for Solana DEXs. 4 | 5 | ## Segmenter Registry 6 | 7 | The Segmenter Registry is an on-chain registry that tracks segmenter public keys. 8 | 9 | Each registry account maintains a list of segmenter public keys that have been elected to the registry. 10 | 11 | ### Deployments 12 | | Environment | Address | Version | 13 | | ----------- | ------- | ------- | 14 | | Solana Mainnet | [SRegZsVZDDqwc7W5iMUSsmKNnXzgfczKzFpimRp5iWw](https://explorer.solana.com/address/SRegZsVZDDqwc7W5iMUSsmKNnXzgfczKzFpimRp5iWw) | 1.0.0 | 15 | 16 | ### Usage 17 | 18 | #### Initialize the program 19 | The config account must be initialized before segmenters can be added. To initialize the registry, use 20 | the `initialize` instruction. This instruction can only be processed once. 21 | 22 | #### Create a registry 23 | To create a registry, use the `create_registry` instruction, signed by any signer. 24 | 25 | #### Add a segmenter 26 | To add a segmenter, use the `add_segmenter` instruction with the public key of the segmenter as a parameter, signed by the admin. If the registry has reached it's max capacity of 64 keys or if the key already exists in it, the transaction will fail. 27 | 28 | #### Remove a segmenter 29 | To remove a segmenter, use the `remove_segmenter` instruction with the public key of the segmenter as a parameter, signed by the admin. 30 | 31 | #### Change the admin 32 | To change the admin, use the `change_admin` instruction with the public key of the new admin as a parameter, signed by the current admin. 33 | 34 | ### Developing 35 | 1. Install Anchor (https://www.anchor-lang.com/docs/installation). Use the version specified in `Anchor.toml`. 36 | 2. Run `yarn install`. This will install Node.js dependencies that are needed to run the integration tests. 37 | 3. Run `anchor test`. This will build the program and run the integration tests. 38 | -------------------------------------------------------------------------------- /crates/solana-conditional-liquidity/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "solana-conditional-liquidity" 3 | version = "1.0.0" 4 | description = "LP framework for Solana DEXs" 5 | edition = "2021" 6 | license-file = "LICENSE" 7 | repository = "https://github.com/DFlowProtocol/conditional-liquidity" 8 | 9 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 10 | 11 | [dependencies] 12 | bytemuck = { version = "1", features = ["derive"] } 13 | solana-program = ">=1, <=2" 14 | 15 | [dev-dependencies] 16 | base64 = "0.22.1" 17 | -------------------------------------------------------------------------------- /crates/solana-conditional-liquidity/LICENSE: -------------------------------------------------------------------------------- 1 | Business Source License 1.1 2 | 3 | License text copyright © 2025 MariaDB plc, All Rights Reserved. “Business Source License” is a trademark of MariaDB plc. 4 | 5 | Parameters 6 | 7 | Licensor: DFlow Inc. 8 | Licensed Work: The Licensed Work is © 2025 DFlow Inc. 9 | Additional Use Grant: The Licensed Work may be used in production contexts, provided that any such use does not compete 10 | with DFlow Inc.'s products. 11 | Change Date: 2029-10-11 12 | Change License: GNU General Public License v2.0 13 | 14 | Terms 15 | 16 | The Licensor hereby grants you the right to copy, modify, create derivative works, redistribute, and make non-production 17 | use of the Licensed Work. The Licensor may make an Additional Use Grant, above, permitting limited production use. 18 | 19 | Effective on the Change Date, or the fourth anniversary of the first publicly available distribution of a specific version 20 | of the Licensed Work under this License, whichever comes first, the Licensor hereby grants you rights under the terms of 21 | the Change License, and the rights granted in the paragraph above terminate. 22 | 23 | If your use of the Licensed Work does not comply with the requirements currently in effect as described in this License, 24 | you must purchase a commercial license from the Licensor, its affiliated entities, or authorized resellers, or you must 25 | refrain from using the Licensed Work. 26 | 27 | All copies of the original and modified Licensed Work, and derivative works of the Licensed Work, are subject to this 28 | License. This License applies separately for each version of the Licensed Work and the Change Date may vary for each 29 | version of the Licensed Work released by Licensor. 30 | 31 | You must conspicuously display this License on each original or modified copy of the Licensed Work. If you receive the 32 | Licensed Work in original or modified form from a third party, the terms and conditions set forth in this License apply 33 | to your use of that work. 34 | 35 | Any use of the Licensed Work in violation of this License will automatically terminate your rights under this License for 36 | the current and all other versions of the Licensed Work. 37 | 38 | This License does not grant you any right in any trademark or logo of Licensor or its affiliates (provided that you may 39 | use a trademark or logo of Licensor as expressly required by this License).TO THE EXTENT PERMITTED BY APPLICABLE LAW, THE 40 | LICENSED WORK IS PROVIDED ON AN “AS IS” BASIS. LICENSOR HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS OR IMPLIED, 41 | INCLUDING (WITHOUT LIMITATION) WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT, AND TITLE. 42 | 43 | MariaDB hereby grants you permission to use this License’s text to license your works, and to refer to it using the trademark 44 | “Business Source License”, as long as you comply with the Covenants of Licensor below. 45 | 46 | Covenants of Licensor 47 | 48 | In consideration of the right to use this License’s text and the “Business Source License” name and trademark, Licensor 49 | covenants to MariaDB, and to all other recipients of the licensed work to be provided by Licensor: 50 | 51 | To specify as the Change License the GPL Version 2.0 or any later version, or a license that is compatible with GPL Version 2.0 52 | or a later version, where “compatible” means that software provided under the Change License can be included in a program 53 | with software provided under GPL Version 2.0 or a later version. Licensor may specify additional Change Licenses without 54 | limitation. 55 | 56 | To either: (a) specify an additional grant of rights to use that does not impose any additional restriction on the right granted 57 | in this License, as the Additional Use Grant; or (b) insert the text “None” to specify a Change Date. Not to modify this License 58 | in any other way. 59 | 60 | Notice 61 | 62 | The Business Source License (this document, or the “License”) is not an Open Source license. However, the Licensed Work will 63 | eventually be made available under an Open Source License, as stated in this License. 64 | 65 | -------------------------------------------------------------------------------- /crates/solana-conditional-liquidity/README.md: -------------------------------------------------------------------------------- 1 | # Solana Conditional Liquidity 2 | 3 | This crate contains tooling for Solana DEXs to support conditional liquidity. The primary functions 4 | it exposes are `is_invoked_by_segmenter` and `verify_origin`, which can be used to branch based on 5 | whether an instruction invocation was signed by a segmenter and based on the application or frontend 6 | that originated the invocation. 7 | 8 | ### `is_invoked_by_segmenter` 9 | Checks whether the invocation was signed by a segmenter. Use this if you don't need to branch on the 10 | origin of the invocation. 11 | ```rs 12 | use solana_conditional_liquidity::is_invoked_by_segmenter; 13 | use solana_program::account_info::AccountInfo; 14 | 15 | fn handler(registry: &AccountInfo<'_>, segmenter: &AccountInfo<'_>) { 16 | if !is_invoked_by_segmenter(registry, segmenter) { 17 | // The invocation wasn't signed by a segmenter 18 | return; 19 | } 20 | 21 | // Do stuff that you only allow when the invocation was signed by a segmenter 22 | // ... 23 | } 24 | ``` 25 | 26 | ### `verify_origin` 27 | Checks whether the invocation was signed by a segmenter and verifies the origin of the 28 | invocation. Use this if you want to branch on the origin of the invocation. 29 | ```rs 30 | use solana_conditional_liquidity::{origin_identity, verify_origin, Origin, VerifyOriginResult}; 31 | use solana_program::account_info::AccountInfo; 32 | 33 | fn handler( 34 | registry: &AccountInfo<'_>, 35 | segmenter: &AccountInfo<'_>, 36 | claimed_origin: Origin, 37 | ) { 38 | let VerifyOriginResult::InvokedBySegmenter(origin) = 39 | verify_origin(claimed_origin, registry, segmenter) 40 | else { 41 | // The invocation wasn't signed by a segmenter 42 | return; 43 | }; 44 | 45 | // Branch on the origin here 46 | match origin { 47 | // Add special logic for specific origins here... 48 | origin_identity::UNKNOWN => { 49 | // Origin is unknown or could not be verified 50 | } 51 | // These identifiers are just examples, but you get the idea... 52 | // origin_identity::DFLOW_MOBILE => {} 53 | // origin_identity::DFLOW_WEB => {} 54 | // origin_identity::PHANTOM_MOBILE => {} 55 | // origin_identity::PHANTOM_EXTENSION => {} 56 | // origin_identity::SOLFLARE_MOBILE => {} 57 | // origin_identity::SOLFLARE_EXTENSION => {} 58 | _ => { 59 | // Fallback for any other origin. This is different than the origin being unknown. 60 | } 61 | }; 62 | } 63 | ``` 64 | -------------------------------------------------------------------------------- /crates/solana-conditional-liquidity/src/lib.rs: -------------------------------------------------------------------------------- 1 | mod origin; 2 | mod registry; 3 | 4 | pub use origin::*; 5 | pub use registry::*; 6 | -------------------------------------------------------------------------------- /crates/solana-conditional-liquidity/src/origin.rs: -------------------------------------------------------------------------------- 1 | use solana_program::{account_info::AccountInfo, pubkey, pubkey::Pubkey}; 2 | 3 | use crate::is_invoked_by_segmenter; 4 | 5 | /// The identifier for the origin of an invocation. This identifies the application or frontend from 6 | /// which the invocation originated. 7 | pub type Origin = u16; 8 | 9 | pub mod origin_identity { 10 | use super::Origin; 11 | 12 | /// Origin when the application or frontend is unknown or could not be verified 13 | pub const UNKNOWN: Origin = 0; 14 | } 15 | 16 | #[derive(Debug, Clone, Copy, PartialEq, Eq)] 17 | pub enum VerifyOriginResult { 18 | /// The invocation was signed by a segmenter 19 | InvokedBySegmenter(Origin), 20 | /// The invocation was not signed by a segmenter 21 | NotInvokedBySegmenter, 22 | } 23 | 24 | /// Checks whether the invocation was signed by a segmenter and verifies the origin of the 25 | /// invocation. Use this if you want to branch on the origin of the invocation. 26 | /// 27 | /// Examples 28 | /// 29 | /// ``` 30 | /// use solana_conditional_liquidity::{origin_identity, verify_origin, Origin, VerifyOriginResult}; 31 | /// use solana_program::account_info::AccountInfo; 32 | /// 33 | /// fn handler( 34 | /// registry: &AccountInfo<'_>, 35 | /// segmenter: &AccountInfo<'_>, 36 | /// claimed_origin: Origin, 37 | /// ) { 38 | /// let VerifyOriginResult::InvokedBySegmenter(origin) = 39 | /// verify_origin(claimed_origin, registry, segmenter) 40 | /// else { 41 | /// // The invocation wasn't signed by a segmenter 42 | /// return; 43 | /// }; 44 | /// 45 | /// // Branch on the origin here 46 | /// match origin { 47 | /// // Add special logic for specific origins here... 48 | /// origin_identity::UNKNOWN => { 49 | /// // Origin is unknown or could not be verified 50 | /// } 51 | /// // These identifiers are just examples, but you get the idea... 52 | /// // origin_identity::DFLOW_MOBILE => {} 53 | /// // origin_identity::DFLOW_WEB => {} 54 | /// // origin_identity::PHANTOM_MOBILE => {} 55 | /// // origin_identity::PHANTOM_EXTENSION => {} 56 | /// // origin_identity::SOLFLARE_MOBILE => {} 57 | /// // origin_identity::SOLFLARE_EXTENSION => {} 58 | /// _ => { 59 | /// // Fallback for any other origin. This is different than the origin being unknown. 60 | /// } 61 | /// }; 62 | /// } 63 | /// ``` 64 | pub fn verify_origin( 65 | claimed_origin: Origin, 66 | registry: &AccountInfo<'_>, 67 | segmenter: &AccountInfo<'_>, 68 | ) -> VerifyOriginResult { 69 | if !is_invoked_by_segmenter(registry, segmenter) { 70 | return VerifyOriginResult::NotInvokedBySegmenter; 71 | } 72 | 73 | if registry.key != &ORIGIN_VERIFYING_SEGMENTER_REGISTRY { 74 | return VerifyOriginResult::InvokedBySegmenter(origin_identity::UNKNOWN); 75 | } 76 | 77 | // If one of the DFlow segmenters signed the invocation, we can trust the origin 78 | VerifyOriginResult::InvokedBySegmenter(claimed_origin) 79 | } 80 | 81 | /// The origin-verifying registry is a special registry that contains segmenters that verify the 82 | /// origin of the invocation 83 | pub const ORIGIN_VERIFYING_SEGMENTER_REGISTRY: Pubkey = 84 | pubkey!("Reg1Y127DNKYUTf3LinfEs3oiSiywJsyAobJMjqYqDE"); 85 | 86 | #[cfg(test)] 87 | mod tests { 88 | use std::{cell::RefCell, rc::Rc}; 89 | 90 | use base64::Engine; 91 | use solana_program::system_program; 92 | 93 | use crate::Registry; 94 | 95 | use super::*; 96 | 97 | #[test] 98 | fn test_verify_origin() { 99 | let mut registry_data = base64::engine::general_purpose::STANDARD 100 | .decode("L65u9ri2/NoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmpy9pZ0kSP2HFqsTSMjxFxburQjxQioc8A4BaVKbWtBAWsWrJs+pByyagNT2RTZ5E/wZAQB0FNhQpY/WTUev0FyJOST1AtAGCROxwJ16TmEm/91X11Lmzcymw9zcmibQnqAzYRp+mQPsmo+2htSt8O7nGFhRpTDQdq9qCtx9jA==") 101 | .unwrap(); 102 | 103 | // Registry is the origin-verifying registry 104 | let mut registry_lamports = 15200640; 105 | let registry = AccountInfo { 106 | key: &pubkey!("Reg1Y127DNKYUTf3LinfEs3oiSiywJsyAobJMjqYqDE"), 107 | is_signer: false, 108 | is_writable: false, 109 | lamports: Rc::new(RefCell::new(&mut registry_lamports)), 110 | data: Rc::new(RefCell::new(&mut registry_data)), 111 | owner: &Registry::PROGRAM_ID, 112 | executable: false, 113 | rent_epoch: 18446744073709551615, 114 | }; 115 | 116 | // Signed and exists in origin-verifying registry 117 | let mut segmenter_lamports = 0; 118 | let mut segmenter_data = []; 119 | let segmenter = AccountInfo { 120 | key: &pubkey!("F2Me9XknvkPYjvoEgTXXKqARg58Ezo6ZmGhpYdS3UTmF"), 121 | is_signer: true, 122 | is_writable: false, 123 | lamports: Rc::new(RefCell::new(&mut segmenter_lamports)), 124 | data: Rc::new(RefCell::new(&mut segmenter_data)), 125 | owner: &system_program::id(), 126 | executable: false, 127 | rent_epoch: 18446744073709551615, 128 | }; 129 | assert_eq!( 130 | verify_origin(1, ®istry, &segmenter), 131 | VerifyOriginResult::InvokedBySegmenter(1) 132 | ); 133 | 134 | // Didn't sign but exists in origin-verifying registry 135 | let mut segmenter_lamports = 0; 136 | let mut segmenter_data = []; 137 | let segmenter = AccountInfo { 138 | key: &pubkey!("F2Me9XknvkPYjvoEgTXXKqARg58Ezo6ZmGhpYdS3UTmF"), 139 | is_signer: false, 140 | is_writable: false, 141 | lamports: Rc::new(RefCell::new(&mut segmenter_lamports)), 142 | data: Rc::new(RefCell::new(&mut segmenter_data)), 143 | owner: &system_program::id(), 144 | executable: false, 145 | rent_epoch: 18446744073709551615, 146 | }; 147 | assert_eq!( 148 | verify_origin(1, ®istry, &segmenter), 149 | VerifyOriginResult::NotInvokedBySegmenter 150 | ); 151 | 152 | // Signed but doesn't exist in origin-verifying registry 153 | let mut segmenter_lamports = 0; 154 | let mut segmenter_data = []; 155 | let segmenter = AccountInfo { 156 | key: &Pubkey::new_unique(), 157 | is_signer: true, 158 | is_writable: false, 159 | lamports: Rc::new(RefCell::new(&mut segmenter_lamports)), 160 | data: Rc::new(RefCell::new(&mut segmenter_data)), 161 | owner: &system_program::id(), 162 | executable: false, 163 | rent_epoch: 18446744073709551615, 164 | }; 165 | assert_eq!( 166 | verify_origin(1, ®istry, &segmenter), 167 | VerifyOriginResult::NotInvokedBySegmenter 168 | ); 169 | } 170 | 171 | #[test] 172 | fn test_verify_origin_non_verifying_registry() { 173 | let mut registry_data = base64::engine::general_purpose::STANDARD 174 | .decode("L65u9ri2/NoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmpy9pZ0kSP2HFqsTSMjxFxburQjxQioc8A4BaVKbWtBAWsWrJs+pByyagNT2RTZ5E/wZAQB0FNhQpY/WTUev0FyJOST1AtAGCROxwJ16TmEm/91X11Lmzcymw9zcmibQnqAzYRp+mQPsmo+2htSt8O7nGFhRpTDQdq9qCtx9jA==") 175 | .unwrap(); 176 | 177 | // Registry is valid but isn't the origin-verifying registry 178 | let mut registry_lamports = 15200640; 179 | let registry = AccountInfo { 180 | key: &Pubkey::new_unique(), 181 | is_signer: false, 182 | is_writable: false, 183 | lamports: Rc::new(RefCell::new(&mut registry_lamports)), 184 | data: Rc::new(RefCell::new(&mut registry_data)), 185 | owner: &Registry::PROGRAM_ID, 186 | executable: false, 187 | rent_epoch: 18446744073709551615, 188 | }; 189 | 190 | // Segmenter signed and exists in non-origin-verifying registry 191 | let mut segmenter_lamports = 0; 192 | let mut segmenter_data = []; 193 | let segmenter = AccountInfo { 194 | key: &pubkey!("F2Me9XknvkPYjvoEgTXXKqARg58Ezo6ZmGhpYdS3UTmF"), 195 | is_signer: true, 196 | is_writable: false, 197 | lamports: Rc::new(RefCell::new(&mut segmenter_lamports)), 198 | data: Rc::new(RefCell::new(&mut segmenter_data)), 199 | owner: &system_program::id(), 200 | executable: false, 201 | rent_epoch: 18446744073709551615, 202 | }; 203 | assert_eq!( 204 | verify_origin(1, ®istry, &segmenter), 205 | VerifyOriginResult::InvokedBySegmenter(origin_identity::UNKNOWN) 206 | ); 207 | 208 | // Segmenter didn't sign but exists in non-origin-verifying registry 209 | let mut segmenter_lamports = 0; 210 | let mut segmenter_data = []; 211 | let segmenter = AccountInfo { 212 | key: &pubkey!("F2Me9XknvkPYjvoEgTXXKqARg58Ezo6ZmGhpYdS3UTmF"), 213 | is_signer: false, 214 | is_writable: false, 215 | lamports: Rc::new(RefCell::new(&mut segmenter_lamports)), 216 | data: Rc::new(RefCell::new(&mut segmenter_data)), 217 | owner: &system_program::id(), 218 | executable: false, 219 | rent_epoch: 18446744073709551615, 220 | }; 221 | assert_eq!( 222 | verify_origin(1, ®istry, &segmenter), 223 | VerifyOriginResult::NotInvokedBySegmenter 224 | ); 225 | 226 | // Segmenter signed but doesn't exist in non-origin-verifying registry 227 | let mut segmenter_lamports = 0; 228 | let mut segmenter_data = []; 229 | let segmenter = AccountInfo { 230 | key: &Pubkey::new_unique(), 231 | is_signer: true, 232 | is_writable: false, 233 | lamports: Rc::new(RefCell::new(&mut segmenter_lamports)), 234 | data: Rc::new(RefCell::new(&mut segmenter_data)), 235 | owner: &system_program::id(), 236 | executable: false, 237 | rent_epoch: 18446744073709551615, 238 | }; 239 | assert_eq!( 240 | verify_origin(1, ®istry, &segmenter), 241 | VerifyOriginResult::NotInvokedBySegmenter 242 | ); 243 | } 244 | } 245 | -------------------------------------------------------------------------------- /crates/solana-conditional-liquidity/src/registry.rs: -------------------------------------------------------------------------------- 1 | use bytemuck::{Pod, Zeroable}; 2 | use solana_program::{account_info::AccountInfo, pubkey, pubkey::Pubkey}; 3 | 4 | const MAX_ITEMS: usize = 64; 5 | 6 | /// A registry account stores segmenter public keys 7 | #[derive(Pod, Zeroable, Copy, Clone)] 8 | #[repr(C)] 9 | pub struct Registry { 10 | pub registered_segmenters: [Pubkey; MAX_ITEMS], 11 | } 12 | 13 | impl Registry { 14 | pub const PROGRAM_ID: Pubkey = pubkey!("SRegZsVZDDqwc7W5iMUSsmKNnXzgfczKzFpimRp5iWw"); 15 | pub const DISCRIMINATOR: [u8; 8] = [47, 174, 110, 246, 184, 182, 252, 218]; 16 | 17 | pub fn is_segmenter_registered(&self, key: &Pubkey) -> bool { 18 | self.registered_segmenters.binary_search(key).is_ok() 19 | } 20 | 21 | pub fn deserialize(bytes: &[u8]) -> &Self { 22 | bytemuck::from_bytes(&bytes[8..]) 23 | } 24 | } 25 | 26 | /// Checks whether the invocation was signed by a segmenter. Use this if you don't need to branch on 27 | /// the origin of the invocation. 28 | /// 29 | /// Examples 30 | /// 31 | /// ``` 32 | /// use solana_conditional_liquidity::is_invoked_by_segmenter; 33 | /// use solana_program::account_info::AccountInfo; 34 | /// 35 | /// fn handler(registry: &AccountInfo<'_>, segmenter: &AccountInfo<'_>) { 36 | /// if !is_invoked_by_segmenter(registry, segmenter) { 37 | /// // The invocation wasn't signed by a segmenter 38 | /// return; 39 | /// } 40 | /// 41 | /// // Do stuff that you only allow when the invocation was signed by a segmenter 42 | /// // ... 43 | /// } 44 | /// ``` 45 | pub fn is_invoked_by_segmenter(registry: &AccountInfo<'_>, segmenter: &AccountInfo<'_>) -> bool { 46 | if *registry.owner != Registry::PROGRAM_ID { 47 | return false; 48 | } 49 | if !segmenter.is_signer { 50 | return false; 51 | } 52 | 53 | let registry_account_data = registry.data.borrow(); 54 | if registry_account_data[..8] != Registry::DISCRIMINATOR { 55 | return false; 56 | } 57 | 58 | let registry_state = Registry::deserialize(®istry_account_data); 59 | registry_state.is_segmenter_registered(segmenter.key) 60 | } 61 | 62 | #[cfg(test)] 63 | mod tests { 64 | use std::{cell::RefCell, rc::Rc}; 65 | 66 | use base64::Engine; 67 | use solana_program::system_program; 68 | 69 | use super::*; 70 | 71 | #[test] 72 | fn test_deserialize_registry_account() { 73 | let mut registry_data = base64::engine::general_purpose::STANDARD 74 | .decode("L65u9ri2/NoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmpy9pZ0kSP2HFqsTSMjxFxburQjxQioc8A4BaVKbWtBAWsWrJs+pByyagNT2RTZ5E/wZAQB0FNhQpY/WTUev0FyJOST1AtAGCROxwJ16TmEm/91X11Lmzcymw9zcmibQnqAzYRp+mQPsmo+2htSt8O7nGFhRpTDQdq9qCtx9jA==") 75 | .unwrap(); 76 | 77 | let mut registry_lamports = 15200640; 78 | let registry = AccountInfo { 79 | key: &pubkey!("Reg1Y127DNKYUTf3LinfEs3oiSiywJsyAobJMjqYqDE"), 80 | is_signer: false, 81 | is_writable: false, 82 | lamports: Rc::new(RefCell::new(&mut registry_lamports)), 83 | data: Rc::new(RefCell::new(&mut registry_data)), 84 | owner: &Registry::PROGRAM_ID, 85 | executable: false, 86 | rent_epoch: 18446744073709551615, 87 | }; 88 | 89 | let data = registry.data.borrow(); 90 | Registry::deserialize(&data); 91 | } 92 | 93 | #[test] 94 | #[should_panic] 95 | fn test_deserialize_invalid_registry_account() { 96 | let mut registry_data = base64::engine::general_purpose::STANDARD 97 | .decode("L65u9ri2/NoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmpy9pZ0kSP2HFqsTSMjxFxburQjxQioc8A4BaVKbWtBAWsWrJs+pByyagNT2RTZ5E/wZAQB0FNhQpY/WTUev0FyJOST1AtAGCROxwJ16TmEm/91X11Lmzcymw9zcmibQnqAzYRp+mQPsmo+2htSt8O7nGFhRpTDQdq9qCtx9jA==") 98 | .unwrap(); 99 | 100 | let mut registry_lamports = 15200640; 101 | let registry = AccountInfo { 102 | key: &pubkey!("Reg1Y127DNKYUTf3LinfEs3oiSiywJsyAobJMjqYqDE"), 103 | is_signer: false, 104 | is_writable: false, 105 | lamports: Rc::new(RefCell::new(&mut registry_lamports)), 106 | data: Rc::new(RefCell::new(&mut registry_data)), 107 | owner: &Registry::PROGRAM_ID, 108 | executable: false, 109 | rent_epoch: 18446744073709551615, 110 | }; 111 | 112 | let data = registry.data.borrow(); 113 | Registry::deserialize(&data); 114 | } 115 | 116 | #[test] 117 | fn test_is_invoked_by_segmenter() { 118 | let mut registry_data = base64::engine::general_purpose::STANDARD 119 | .decode("L65u9ri2/NoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmpy9pZ0kSP2HFqsTSMjxFxburQjxQioc8A4BaVKbWtBAWsWrJs+pByyagNT2RTZ5E/wZAQB0FNhQpY/WTUev0FyJOST1AtAGCROxwJ16TmEm/91X11Lmzcymw9zcmibQnqAzYRp+mQPsmo+2htSt8O7nGFhRpTDQdq9qCtx9jA==") 120 | .unwrap(); 121 | 122 | let mut registry_lamports = 15200640; 123 | let registry = AccountInfo { 124 | key: &Pubkey::new_unique(), 125 | is_signer: false, 126 | is_writable: false, 127 | lamports: Rc::new(RefCell::new(&mut registry_lamports)), 128 | data: Rc::new(RefCell::new(&mut registry_data)), 129 | owner: &Registry::PROGRAM_ID, 130 | executable: false, 131 | rent_epoch: 18446744073709551615, 132 | }; 133 | 134 | // Signed and exists in registry 135 | let mut segmenter_lamports = 0; 136 | let mut segmenter_data = []; 137 | let segmenter = AccountInfo { 138 | key: &pubkey!("F2Me9XknvkPYjvoEgTXXKqARg58Ezo6ZmGhpYdS3UTmF"), 139 | is_signer: true, 140 | is_writable: false, 141 | lamports: Rc::new(RefCell::new(&mut segmenter_lamports)), 142 | data: Rc::new(RefCell::new(&mut segmenter_data)), 143 | owner: &system_program::id(), 144 | executable: false, 145 | rent_epoch: 18446744073709551615, 146 | }; 147 | assert!(is_invoked_by_segmenter(®istry, &segmenter)); 148 | 149 | // Didn't sign but exists in registry 150 | let mut segmenter_lamports = 0; 151 | let mut segmenter_data = []; 152 | let segmenter = AccountInfo { 153 | key: &pubkey!("F2Me9XknvkPYjvoEgTXXKqARg58Ezo6ZmGhpYdS3UTmF"), 154 | is_signer: false, 155 | is_writable: false, 156 | lamports: Rc::new(RefCell::new(&mut segmenter_lamports)), 157 | data: Rc::new(RefCell::new(&mut segmenter_data)), 158 | owner: &system_program::id(), 159 | executable: false, 160 | rent_epoch: 18446744073709551615, 161 | }; 162 | assert!(!is_invoked_by_segmenter(®istry, &segmenter)); 163 | 164 | // Signed but doesn't exist in registry 165 | let mut segmenter_lamports = 0; 166 | let mut segmenter_data = []; 167 | let segmenter = AccountInfo { 168 | key: &Pubkey::new_unique(), 169 | is_signer: true, 170 | is_writable: false, 171 | lamports: Rc::new(RefCell::new(&mut segmenter_lamports)), 172 | data: Rc::new(RefCell::new(&mut segmenter_data)), 173 | owner: &system_program::id(), 174 | executable: false, 175 | rent_epoch: 18446744073709551615, 176 | }; 177 | assert!(!is_invoked_by_segmenter(®istry, &segmenter)); 178 | } 179 | 180 | #[test] 181 | fn test_is_invoked_by_segmenter_invalid_registry() { 182 | let mut registry_data = base64::engine::general_purpose::STANDARD 183 | .decode("L65u9ri2/NoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADmpy9pZ0kSP2HFqsTSMjxFxburQjxQioc8A4BaVKbWtBAWsWrJs+pByyagNT2RTZ5E/wZAQB0FNhQpY/WTUev0FyJOST1AtAGCROxwJ16TmEm/91X11Lmzcymw9zcmibQnqAzYRp+mQPsmo+2htSt8O7nGFhRpTDQdq9qCtx9jA==") 184 | .unwrap(); 185 | 186 | let mut registry_lamports = 15200640; 187 | let registry = AccountInfo { 188 | key: &Pubkey::new_unique(), 189 | is_signer: false, 190 | is_writable: false, 191 | lamports: Rc::new(RefCell::new(&mut registry_lamports)), 192 | data: Rc::new(RefCell::new(&mut registry_data)), 193 | owner: &Pubkey::new_unique(), 194 | executable: false, 195 | rent_epoch: 18446744073709551615, 196 | }; 197 | 198 | // Signed and exists in registry 199 | let mut segmenter_lamports = 0; 200 | let mut segmenter_data = []; 201 | let segmenter = AccountInfo { 202 | key: &pubkey!("F2Me9XknvkPYjvoEgTXXKqARg58Ezo6ZmGhpYdS3UTmF"), 203 | is_signer: true, 204 | is_writable: false, 205 | lamports: Rc::new(RefCell::new(&mut segmenter_lamports)), 206 | data: Rc::new(RefCell::new(&mut segmenter_data)), 207 | owner: &system_program::id(), 208 | executable: false, 209 | rent_epoch: 18446744073709551615, 210 | }; 211 | assert!(!is_invoked_by_segmenter(®istry, &segmenter)); 212 | 213 | // Didn't sign but exists in registry 214 | let mut segmenter_lamports = 0; 215 | let mut segmenter_data = []; 216 | let segmenter = AccountInfo { 217 | key: &pubkey!("F2Me9XknvkPYjvoEgTXXKqARg58Ezo6ZmGhpYdS3UTmF"), 218 | is_signer: false, 219 | is_writable: false, 220 | lamports: Rc::new(RefCell::new(&mut segmenter_lamports)), 221 | data: Rc::new(RefCell::new(&mut segmenter_data)), 222 | owner: &system_program::id(), 223 | executable: false, 224 | rent_epoch: 18446744073709551615, 225 | }; 226 | assert!(!is_invoked_by_segmenter(®istry, &segmenter)); 227 | 228 | // Signed but doesn't exist in registry 229 | let mut segmenter_lamports = 0; 230 | let mut segmenter_data = []; 231 | let segmenter = AccountInfo { 232 | key: &Pubkey::new_unique(), 233 | is_signer: true, 234 | is_writable: false, 235 | lamports: Rc::new(RefCell::new(&mut segmenter_lamports)), 236 | data: Rc::new(RefCell::new(&mut segmenter_data)), 237 | owner: &system_program::id(), 238 | executable: false, 239 | rent_epoch: 18446744073709551615, 240 | }; 241 | assert!(!is_invoked_by_segmenter(®istry, &segmenter)); 242 | } 243 | } 244 | -------------------------------------------------------------------------------- /migrations/deploy.ts: -------------------------------------------------------------------------------- 1 | // Migrations are an early feature. Currently, they're nothing more than this 2 | // single deploy script that's invoked from the CLI, injecting a provider 3 | // configured from the workspace's Anchor.toml. 4 | 5 | const anchor = require("@coral-xyz/anchor"); 6 | 7 | module.exports = async function (provider) { 8 | // Configure client to use the provider. 9 | anchor.setProvider(provider); 10 | 11 | // Add your deploy script here. 12 | }; 13 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "scripts": { 3 | "build": "rm -rf dist && tsc", 4 | "test": "ts-mocha --timeout 1000000 --require source-map-support/register --recursive tests/*.spec.ts", 5 | "lint": "eslint tests" 6 | }, 7 | "devDependencies": { 8 | "@coral-xyz/anchor": "^0.30.1", 9 | "@solana/web3.js": "^1.95.4", 10 | "@types/chai": "^4.3.11", 11 | "@types/chai-as-promised": "^7.1.8", 12 | "@types/mocha": "^10.0.6", 13 | "@typescript-eslint/eslint-plugin": "^6.17.0", 14 | "@typescript-eslint/parser": "^6.17.0", 15 | "chai": "^4.3.4", 16 | "chai-as-promised": "^7.1.1", 17 | "eslint": "^8.56.0", 18 | "mocha": "^10.2.0", 19 | "source-map-support": "^0.5.21", 20 | "ts-mocha": "^10.0.0", 21 | "typescript": "^5.3.3" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /programs/segmenter-registry/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "segmenter-registry" 3 | version = "1.0.0" 4 | description = "Created with Anchor" 5 | edition = "2021" 6 | 7 | [lib] 8 | crate-type = ["cdylib", "lib"] 9 | name = "segmenter_registry" 10 | 11 | [features] 12 | no-entrypoint = [] 13 | no-idl = [] 14 | no-log-ix-name = [] 15 | cpi = ["no-entrypoint"] 16 | default = [] 17 | idl-build = ["anchor-lang/idl-build"] 18 | 19 | [dependencies] 20 | anchor-lang = "0.30.1" 21 | bytemuck = "1.19.0" 22 | -------------------------------------------------------------------------------- /programs/segmenter-registry/README.md: -------------------------------------------------------------------------------- 1 | # Segmenter Registry 2 | 3 | The Segmenter Registry is an on-chain registry that tracks segmenter public keys. 4 | 5 | Each registry account maintains a list of segmenter public keys that have been elected to the registry. 6 | 7 | ### Deployments 8 | | Environment | Address | Version | 9 | | ----------- | ------- | ------- | 10 | | Solana Mainnet | [SRegZsVZDDqwc7W5iMUSsmKNnXzgfczKzFpimRp5iWw](https://explorer.solana.com/address/SRegZsVZDDqwc7W5iMUSsmKNnXzgfczKzFpimRp5iWw) | 1.0.0 | 11 | 12 | ### Usage 13 | 14 | #### Initialize the program 15 | The config account must be initialized before segmenters can be added. To initialize the registry, use 16 | the `initialize` instruction. This instruction can only be processed once. 17 | 18 | #### Create a registry 19 | To create a registry, use the `create_registry` instruction, signed by any signer. 20 | 21 | #### Add a segmenter 22 | To add a segmenter, use the `add_segmenter` instruction with the public key of the segmenter as a parameter, signed by the admin. If the registry has reached it's max capacity of 64 keys or if the key already exists in it, the transaction will fail. 23 | 24 | #### Remove a segmenter 25 | To remove a segmenter, use the `remove_segmenter` instruction with the public key of the segmenter as a parameter, signed by the admin. 26 | 27 | #### Change the admin 28 | To change the admin, use the `change_admin` instruction with the public key of the new admin as a parameter, signed by the current admin. 29 | 30 | ### Developing 31 | 1. Install Anchor (https://www.anchor-lang.com/docs/installation). Use the version specified in `Anchor.toml`. 32 | 2. From the top level of the repository, run `yarn install`. This will install Node.js dependencies that are needed to run the integration tests. 33 | 3. From the top level of the repository, run `anchor test`. This will build the program and run the integration tests. 34 | -------------------------------------------------------------------------------- /programs/segmenter-registry/Xargo.toml: -------------------------------------------------------------------------------- 1 | [target.bpfel-unknown-unknown.dependencies.std] 2 | features = [] 3 | -------------------------------------------------------------------------------- /programs/segmenter-registry/src/errors.rs: -------------------------------------------------------------------------------- 1 | use anchor_lang::prelude::*; 2 | 3 | #[error_code] 4 | pub enum SegmenterRegistryError { 5 | #[msg("The registry is at capacity")] 6 | RegistrySaturated = 9000, 7 | #[msg("Segmenter already exists in the registry")] 8 | DuplicateEntry = 9001, 9 | #[msg("The admin specified is not authorized to invoke this instruction")] 10 | InvalidAdminSpecified = 9002, 11 | } 12 | -------------------------------------------------------------------------------- /programs/segmenter-registry/src/instructions/add_segmenter.rs: -------------------------------------------------------------------------------- 1 | use anchor_lang::prelude::*; 2 | 3 | use crate::errors::SegmenterRegistryError; 4 | use crate::state::*; 5 | 6 | #[derive(Accounts)] 7 | pub struct AddSegmenter<'info> { 8 | #[account(mut)] 9 | pub registry: AccountLoader<'info, Registry>, 10 | 11 | #[account(has_one = admin @ SegmenterRegistryError::InvalidAdminSpecified)] 12 | pub config: Account<'info, Config>, 13 | 14 | /// The admin for the deployment 15 | pub admin: Signer<'info>, 16 | } 17 | 18 | pub fn handler(ctx: Context, new_segmenter: Pubkey) -> Result<()> { 19 | ctx.accounts.registry.load_mut()?.add(new_segmenter)?; 20 | Ok(()) 21 | } 22 | -------------------------------------------------------------------------------- /programs/segmenter-registry/src/instructions/change_admin.rs: -------------------------------------------------------------------------------- 1 | use anchor_lang::prelude::*; 2 | 3 | use crate::errors::SegmenterRegistryError; 4 | use crate::state::*; 5 | 6 | #[derive(Accounts)] 7 | pub struct ChangeAdmin<'info> { 8 | #[account(mut, has_one = admin @ SegmenterRegistryError::InvalidAdminSpecified)] 9 | pub config: Account<'info, Config>, 10 | 11 | /// The current admin 12 | pub admin: Signer<'info>, 13 | } 14 | 15 | pub fn handler(ctx: Context, new_admin: Pubkey) -> Result<()> { 16 | ctx.accounts.config.admin = new_admin; 17 | 18 | Ok(()) 19 | } 20 | -------------------------------------------------------------------------------- /programs/segmenter-registry/src/instructions/create_registry.rs: -------------------------------------------------------------------------------- 1 | use anchor_lang::prelude::*; 2 | 3 | use crate::state::*; 4 | 5 | #[derive(Accounts)] 6 | pub struct CreateRegistry<'info> { 7 | #[account(init, payer = payer, space = Registry::LEN)] 8 | pub registry: AccountLoader<'info, Registry>, 9 | 10 | /// The payer for the registry account creation 11 | #[account(mut)] 12 | pub payer: Signer<'info>, 13 | 14 | pub system_program: Program<'info, System>, 15 | } 16 | 17 | pub fn handler(ctx: Context) -> Result<()> { 18 | *ctx.accounts.registry.load_init()? = Registry::new(); 19 | Ok(()) 20 | } 21 | -------------------------------------------------------------------------------- /programs/segmenter-registry/src/instructions/initialize.rs: -------------------------------------------------------------------------------- 1 | use anchor_lang::prelude::*; 2 | 3 | use crate::state::*; 4 | 5 | #[derive(Accounts)] 6 | pub struct Initialize<'info> { 7 | #[account( 8 | init, 9 | payer = admin, 10 | space = Config::LEN, 11 | seeds = [ 12 | Config::SEED, 13 | ], 14 | bump, 15 | )] 16 | pub config: Account<'info, Config>, 17 | 18 | /// The admin for the deployment 19 | #[account(mut)] 20 | pub admin: Signer<'info>, 21 | 22 | pub system_program: Program<'info, System>, 23 | } 24 | 25 | pub fn handler(ctx: Context) -> Result<()> { 26 | ctx.accounts.config.admin = ctx.accounts.admin.key(); 27 | Ok(()) 28 | } 29 | -------------------------------------------------------------------------------- /programs/segmenter-registry/src/instructions/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod add_segmenter; 2 | pub mod change_admin; 3 | pub mod create_registry; 4 | pub mod initialize; 5 | pub mod remove_segmenter; 6 | 7 | pub use add_segmenter::*; 8 | pub use change_admin::*; 9 | pub use create_registry::*; 10 | pub use initialize::*; 11 | pub use remove_segmenter::*; 12 | -------------------------------------------------------------------------------- /programs/segmenter-registry/src/instructions/remove_segmenter.rs: -------------------------------------------------------------------------------- 1 | use anchor_lang::prelude::*; 2 | 3 | use crate::errors::SegmenterRegistryError; 4 | use crate::state::*; 5 | 6 | #[derive(Accounts)] 7 | pub struct RemoveSegmenter<'info> { 8 | #[account(mut)] 9 | pub registry: AccountLoader<'info, Registry>, 10 | 11 | #[account(has_one = admin @ SegmenterRegistryError::InvalidAdminSpecified)] 12 | pub config: Account<'info, Config>, 13 | 14 | /// The admin for the deployment 15 | pub admin: Signer<'info>, 16 | } 17 | 18 | pub fn handler(ctx: Context, key: Pubkey) -> Result<()> { 19 | if ctx.accounts.registry.load_mut()?.remove(key).is_none() { 20 | msg!("Registry does not contain key: {}", key); 21 | }; 22 | Ok(()) 23 | } 24 | -------------------------------------------------------------------------------- /programs/segmenter-registry/src/lib.rs: -------------------------------------------------------------------------------- 1 | use anchor_lang::prelude::*; 2 | 3 | use instructions::*; 4 | 5 | pub mod errors; 6 | pub mod instructions; 7 | pub mod state; 8 | 9 | declare_id!("SRegZsVZDDqwc7W5iMUSsmKNnXzgfczKzFpimRp5iWw"); 10 | 11 | #[program] 12 | pub mod segmenter_registry { 13 | use super::*; 14 | 15 | /// Initializes the deployment with an admin 16 | pub fn initialize(ctx: Context) -> Result<()> { 17 | instructions::initialize::handler(ctx) 18 | } 19 | 20 | /// Creates a new registry 21 | pub fn create_registry(ctx: Context) -> Result<()> { 22 | instructions::create_registry::handler(ctx) 23 | } 24 | 25 | /// Allows the admin to add a new segmenter to a registry 26 | pub fn add_segmenter(ctx: Context, new_segmenter: Pubkey) -> Result<()> { 27 | instructions::add_segmenter::handler(ctx, new_segmenter) 28 | } 29 | 30 | /// Allows the admin to remove an existing segmenter from a registry 31 | pub fn remove_segmenter(ctx: Context, key: Pubkey) -> Result<()> { 32 | instructions::remove_segmenter::handler(ctx, key) 33 | } 34 | 35 | /// Allows the admin to appoint a new admin 36 | pub fn change_admin(ctx: Context, new_admin: Pubkey) -> Result<()> { 37 | instructions::change_admin::handler(ctx, new_admin) 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /programs/segmenter-registry/src/state/config.rs: -------------------------------------------------------------------------------- 1 | use anchor_lang::prelude::*; 2 | 3 | /// The global config for the registry. 4 | #[account] 5 | pub struct Config { 6 | /// The public key of the account that has permission to modify the Registry accounts. 7 | pub admin: Pubkey, 8 | } 9 | 10 | impl Config { 11 | pub const LEN: usize = 8 + 32; 12 | pub const SEED: &'static [u8] = b"config"; 13 | } 14 | -------------------------------------------------------------------------------- /programs/segmenter-registry/src/state/mod.rs: -------------------------------------------------------------------------------- 1 | pub mod config; 2 | pub mod registry; 3 | 4 | pub use config::*; 5 | pub use registry::*; 6 | -------------------------------------------------------------------------------- /programs/segmenter-registry/src/state/registry.rs: -------------------------------------------------------------------------------- 1 | use anchor_lang::prelude::*; 2 | 3 | use crate::errors::SegmenterRegistryError; 4 | 5 | const MAX_ITEMS: usize = 64; 6 | 7 | /// A registry account stores segmenter public keys 8 | #[account(zero_copy)] 9 | pub struct Registry { 10 | pub registered_segmenters: [Pubkey; MAX_ITEMS], 11 | } 12 | 13 | impl Registry { 14 | pub const LEN: usize = 8 + std::mem::size_of::(); 15 | pub const SEED: &'static [u8] = b"registry"; 16 | 17 | #[allow(clippy::new_without_default)] 18 | pub fn new() -> Self { 19 | Self { 20 | registered_segmenters: [Pubkey::default(); MAX_ITEMS], 21 | } 22 | } 23 | 24 | pub fn add(&mut self, key: Pubkey) -> Result<()> { 25 | if self.is_segmenter_registered(&key) { 26 | return Err(error!(SegmenterRegistryError::DuplicateEntry)); 27 | } 28 | 29 | let Some(insert_idx) = self 30 | .registered_segmenters 31 | .iter() 32 | .position(|item| item == &Pubkey::default()) 33 | else { 34 | return Err(error!(SegmenterRegistryError::RegistrySaturated)); 35 | }; 36 | 37 | self.registered_segmenters[insert_idx] = key; 38 | self.registered_segmenters.sort_unstable(); 39 | Ok(()) 40 | } 41 | 42 | pub fn is_segmenter_registered(&self, key: &Pubkey) -> bool { 43 | self.registered_segmenters.binary_search(key).is_ok() 44 | } 45 | 46 | pub fn remove(&mut self, key: Pubkey) -> Option { 47 | let maybe_idx = self.registered_segmenters.binary_search(&key); 48 | if let Ok(idx) = maybe_idx { 49 | self.registered_segmenters[idx] = Pubkey::default(); 50 | self.registered_segmenters.sort_unstable(); 51 | Some(key) 52 | } else { 53 | None 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /rust-toolchain.toml: -------------------------------------------------------------------------------- 1 | [toolchain] 2 | channel = "1.79.0" 3 | -------------------------------------------------------------------------------- /tests/helpers.ts: -------------------------------------------------------------------------------- 1 | import * as anchor from "@coral-xyz/anchor"; 2 | import { PublicKey, TransactionInstruction } from "@solana/web3.js"; 3 | import { assert } from "chai"; 4 | import { SegmenterRegistry } from "../target/types/segmenter_registry"; 5 | 6 | type Config = Awaited< 7 | ReturnType["account"]["config"]["fetch"]> 8 | >; 9 | 10 | type Registry = Awaited< 11 | ReturnType["account"]["registry"]["fetch"]> 12 | >; 13 | 14 | type InitializeInstructionArgs = { 15 | program: anchor.Program; 16 | admin: PublicKey; 17 | }; 18 | 19 | export async function initializeInstruction({ 20 | program, 21 | admin, 22 | }: InitializeInstructionArgs): Promise { 23 | return await program.methods 24 | .initialize() 25 | .accounts({ 26 | config: getConfigAccount(program.programId), 27 | admin, 28 | }) 29 | .instruction(); 30 | } 31 | 32 | type CreateRegistryInstructionArgs = { 33 | program: anchor.Program; 34 | payer: PublicKey; 35 | registry: PublicKey; 36 | }; 37 | 38 | export async function createRegistryInstruction({ 39 | program, 40 | registry, 41 | payer, 42 | }: CreateRegistryInstructionArgs): Promise { 43 | return await program.methods 44 | .createRegistry() 45 | .accounts({ 46 | registry, 47 | payer, 48 | }) 49 | .instruction(); 50 | } 51 | 52 | type AddSegmenterInstructionArgs = { 53 | program: anchor.Program; 54 | admin: PublicKey; 55 | registry: PublicKey; 56 | addKey: PublicKey; 57 | }; 58 | 59 | export async function addSegmenterInstruction({ 60 | program, 61 | admin, 62 | registry, 63 | addKey, 64 | }: AddSegmenterInstructionArgs): Promise { 65 | return await program.methods 66 | .addSegmenter(addKey) 67 | .accounts({ 68 | registry, 69 | admin, 70 | config: getConfigAccount(program.programId), 71 | }) 72 | .instruction(); 73 | } 74 | 75 | type RemoveSegmenterInstructionArgs = { 76 | program: anchor.Program; 77 | admin: PublicKey; 78 | registry: PublicKey; 79 | removeKey: PublicKey; 80 | }; 81 | 82 | export async function removeSegmenterInstruction({ 83 | program, 84 | admin, 85 | registry, 86 | removeKey, 87 | }: RemoveSegmenterInstructionArgs): Promise { 88 | return await program.methods 89 | .removeSegmenter(removeKey) 90 | .accounts({ 91 | registry, 92 | admin, 93 | config: getConfigAccount(program.programId), 94 | }) 95 | .instruction(); 96 | } 97 | 98 | type ChangeAdminInstructionArgs = { 99 | program: anchor.Program; 100 | admin: PublicKey; 101 | newAdmin: PublicKey; 102 | }; 103 | 104 | export async function changeAdminInstruction({ 105 | program, 106 | admin, 107 | newAdmin, 108 | }: ChangeAdminInstructionArgs): Promise { 109 | return await program.methods 110 | .changeAdmin(newAdmin) 111 | .accounts({ 112 | config: getConfigAccount(program.programId), 113 | admin, 114 | }) 115 | .instruction(); 116 | } 117 | 118 | export function getConfigAccount(programId: PublicKey): PublicKey { 119 | return PublicKey.findProgramAddressSync( 120 | [Buffer.from("config")], 121 | programId 122 | )[0]; 123 | } 124 | 125 | export async function getRegistryState( 126 | program: anchor.Program, 127 | registry: PublicKey 128 | ): Promise { 129 | return await program.account.registry.fetch(registry); 130 | } 131 | 132 | export async function getConfigState( 133 | program: anchor.Program 134 | ): Promise { 135 | return await program.account.config.fetch( 136 | getConfigAccount(program.programId) 137 | ); 138 | } 139 | 140 | const EXPECTED_REGISTRY_LENGTH = 64; 141 | const DEFAULT_PUBKEY = new PublicKey("11111111111111111111111111111111"); 142 | 143 | /** `expected` need not contain the default pubkey entries. This will check that the `actual` array 144 | * contains the expected default pubkey entries regardless of whether the specified `expected` array 145 | * contains them. */ 146 | export function checkRegistry(actual: PublicKey[], expected: PublicKey[]) { 147 | const expectedWithDefaults = [...expected]; 148 | while (expectedWithDefaults.length < EXPECTED_REGISTRY_LENGTH) { 149 | expectedWithDefaults.push(DEFAULT_PUBKEY); 150 | } 151 | expectedWithDefaults.sort((a, b) => a.toBuffer().compare(b.toBuffer())); 152 | 153 | checkArraysEqual( 154 | actual, 155 | expectedWithDefaults, 156 | "registeredSegmenters", 157 | (a, b) => a.equals(b), 158 | (x) => x.toBase58() 159 | ); 160 | } 161 | 162 | export function checkConfig( 163 | actual: any, 164 | expected: Config, 165 | ) { 166 | checkPublicKey(actual.admin, expected.admin, "admin"); 167 | } 168 | 169 | export function checkPublicKey( 170 | actual: any, 171 | expected: PublicKey, 172 | propertyName: string 173 | ) { 174 | const expectedStr = expected.toBase58(); 175 | assert.isNotNull( 176 | actual, 177 | `expected ${propertyName} to be ${expectedStr} but was null` 178 | ); 179 | assert.isDefined( 180 | actual, 181 | `expected ${propertyName} to be ${expectedStr} but was undefined` 182 | ); 183 | assert.strictEqual(actual.toBase58(), expectedStr, propertyName); 184 | } 185 | 186 | export function checkArrayContains( 187 | actual: T[], 188 | expected: T, 189 | propertyName: string, 190 | isEqual: (expected: T, actual: T) => boolean, 191 | asString: (x: T) => string 192 | ) { 193 | assert.isNotNull(actual, `actual ${propertyName} is null, expected array`); 194 | assert.isDefined( 195 | actual, 196 | `actual ${propertyName} is undefined, expected array` 197 | ); 198 | assert( 199 | actual.find((item) => isEqual(expected, item)), 200 | `actual ${propertyName} does not contain expected ${asString(expected)}` 201 | ); 202 | } 203 | 204 | export function checkArraysEqual( 205 | actual: T[], 206 | expected: T[], 207 | propertyName: string, 208 | isEqual: (expected: T, actual: T) => boolean, 209 | asString: (x: T) => string 210 | ) { 211 | assert.isNotNull(actual, `actual ${propertyName} is null, expected array`); 212 | assert.isDefined( 213 | actual, 214 | `actual ${propertyName} is undefined, expected array` 215 | ); 216 | assert.strictEqual( 217 | actual.length, 218 | expected.length, 219 | `actual ${propertyName} length ${actual.length}` + 220 | ` != expected ${expected.length}` 221 | ); 222 | 223 | for (const [idx, actualElem] of actual.entries()) { 224 | const expectedElem = expected[idx]; 225 | assert.ok( 226 | isEqual(expectedElem, actualElem), 227 | `actual ${propertyName} ${asString(actualElem)} at index ${idx}` + 228 | ` != expected ${asString(expectedElem)}` 229 | ); 230 | } 231 | } 232 | -------------------------------------------------------------------------------- /tests/mock/mockWallet.ts: -------------------------------------------------------------------------------- 1 | import { Wallet } from "@coral-xyz/anchor"; 2 | import { 3 | Connection, 4 | Keypair, 5 | LAMPORTS_PER_SOL, 6 | RpcResponseAndContext, 7 | SignatureResult, 8 | Transaction, 9 | VersionedTransaction, 10 | } from "@solana/web3.js"; 11 | 12 | 13 | export class MockWallet implements Wallet { 14 | readonly connection: Connection 15 | readonly keypair: Keypair 16 | get publicKey() { return this.keypair.publicKey } 17 | get secretKey() { return this.keypair.secretKey } 18 | get payer() { return this.keypair } 19 | 20 | constructor(connection: Connection, keypair: Keypair) { 21 | this.connection = connection; 22 | this.keypair = keypair; 23 | } 24 | 25 | signTransaction(tx: T): Promise { 26 | if (tx instanceof Transaction) { 27 | tx.partialSign(this.keypair); 28 | } else { 29 | tx.sign([this.keypair]); 30 | } 31 | return Promise.resolve(tx); 32 | } 33 | 34 | signAllTransactions(txs: T[]): Promise { 35 | return Promise.resolve(txs.map((tx) => { 36 | if (tx instanceof Transaction) { 37 | tx.partialSign(this.keypair); 38 | } else { 39 | tx.sign([this.keypair]); 40 | } 41 | return tx; 42 | })); 43 | } 44 | 45 | async requestAirdrop(sol = 1): Promise> { 46 | const sig = await this.connection.requestAirdrop( 47 | this.publicKey, 48 | Math.round(sol * LAMPORTS_PER_SOL), 49 | ); 50 | return await this.connection.confirmTransaction(sig); 51 | } 52 | 53 | async getLamportsBalance(): Promise { 54 | const accountInfo = await this.connection.getAccountInfo(this.publicKey); 55 | if (accountInfo === null) { 56 | throw new Error("Couldn't get balance - wallet account is closed"); 57 | } 58 | return accountInfo.lamports; 59 | } 60 | 61 | static create(connection: Connection): MockWallet { 62 | const keypair = new Keypair(); 63 | return new MockWallet(connection, keypair); 64 | } 65 | 66 | static async createWithBalance(connection: Connection, sol = 1): Promise { 67 | const wallet = MockWallet.create(connection); 68 | await wallet.requestAirdrop(sol); 69 | return wallet; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /tests/segmenterRegistry.spec.ts: -------------------------------------------------------------------------------- 1 | import { Idl, Program } from "@coral-xyz/anchor"; 2 | import { 3 | Connection, 4 | Keypair, 5 | PublicKey, 6 | Transaction, 7 | TransactionInstruction, 8 | } from "@solana/web3.js"; 9 | import chai from "chai"; 10 | import { expect } from "chai"; 11 | import chaiAsPromised from "chai-as-promised"; 12 | import { 13 | addSegmenterInstruction, 14 | changeAdminInstruction, 15 | checkConfig, 16 | checkRegistry, 17 | createRegistryInstruction, 18 | getConfigState, 19 | getRegistryState, 20 | initializeInstruction, 21 | removeSegmenterInstruction, 22 | } from "./helpers"; 23 | import { MockWallet } from "./mock/mockWallet"; 24 | import { SegmenterRegistry } from "../target/types/segmenter_registry"; 25 | import idl from "../target/idl/segmenter_registry.json"; 26 | import { sendAndConfirm } from "./transaction"; 27 | 28 | chai.config.includeStack = true; 29 | chai.use(chaiAsPromised); 30 | 31 | describe("Segmenter Registry", () => { 32 | const program = new Program(idl as Idl) as unknown as Program; 33 | const connection = new Connection("http://localhost:8899", "confirmed"); 34 | 35 | let admin: MockWallet; 36 | 37 | const segmenterA = Keypair.generate(); 38 | const segmenterB = Keypair.generate(); 39 | 40 | const registryAccount = Keypair.generate(); 41 | 42 | before(async () => { 43 | admin = await MockWallet.createWithBalance(connection); 44 | }); 45 | 46 | it("initialize", async () => { 47 | const tx = new Transaction().add( 48 | await initializeInstruction({ program, admin: admin.publicKey }) 49 | ); 50 | await sendAndConfirm(tx, { 51 | feePayer: admin, 52 | signers: [admin], 53 | connection, 54 | }); 55 | const config = await getConfigState(program); 56 | checkConfig(config, { admin: admin.publicKey }); 57 | }); 58 | 59 | it("initialize cannot be invoked more than once", async () => { 60 | const tx = new Transaction().add( 61 | await initializeInstruction({ program: program, admin: admin.publicKey }) 62 | ); 63 | const reinitialize = sendAndConfirm(tx, { 64 | feePayer: admin, 65 | signers: [admin], 66 | connection, 67 | }); 68 | await expect(reinitialize).to.eventually.be.rejectedWith( 69 | `{"InstructionError":[0,{"Custom":0}]}` 70 | ); 71 | }); 72 | 73 | it("create registry", async () => { 74 | // Anyone should be able to create a registry 75 | const anyRandomPayer = await MockWallet.createWithBalance(connection); 76 | const tx = new Transaction().add( 77 | await createRegistryInstruction({ 78 | program: program, 79 | payer: anyRandomPayer.publicKey, 80 | registry: registryAccount.publicKey, 81 | }) 82 | ); 83 | await sendAndConfirm(tx, { 84 | feePayer: anyRandomPayer, 85 | signers: [anyRandomPayer, registryAccount], 86 | connection, 87 | }); 88 | const registry = await getRegistryState(program, registryAccount.publicKey); 89 | checkRegistry(registry.registeredSegmenters, []); 90 | }); 91 | 92 | it("admin can add segmenter A", async () => { 93 | const tx = new Transaction().add( 94 | await addSegmenterInstruction({ 95 | program: program, 96 | admin: admin.publicKey, 97 | registry: registryAccount.publicKey, 98 | addKey: segmenterA.publicKey, 99 | }) 100 | ); 101 | await sendAndConfirm(tx, { 102 | feePayer: admin, 103 | signers: [admin], 104 | connection, 105 | }); 106 | const registry = await getRegistryState(program, registryAccount.publicKey); 107 | checkRegistry(registry.registeredSegmenters, [ 108 | segmenterA.publicKey, 109 | ]); 110 | }); 111 | 112 | it("admin cannot add segmenter A again", async () => { 113 | const tx = new Transaction().add( 114 | await addSegmenterInstruction({ 115 | program: program, 116 | admin: admin.publicKey, 117 | registry: registryAccount.publicKey, 118 | addKey: segmenterA.publicKey, 119 | }) 120 | ); 121 | const addSegmenterDuplicate = sendAndConfirm(tx, { 122 | feePayer: admin, 123 | signers: [admin], 124 | connection, 125 | }); 126 | await expect(addSegmenterDuplicate).to.eventually.be.rejectedWith( 127 | `{"InstructionError":[0,{"Custom":15001}]}` 128 | ); 129 | }); 130 | 131 | it("non admin cannot add segmenter B", async () => { 132 | const nonAdmin = await MockWallet.createWithBalance(connection); 133 | const tx = new Transaction().add( 134 | await addSegmenterInstruction({ 135 | program: program, 136 | admin: nonAdmin.publicKey, 137 | registry: registryAccount.publicKey, 138 | addKey: segmenterB.publicKey, 139 | }) 140 | ); 141 | const addSegmenter = sendAndConfirm(tx, { 142 | feePayer: nonAdmin.publicKey, 143 | signers: [nonAdmin], 144 | connection, 145 | }); 146 | await expect(addSegmenter).to.eventually.be.rejectedWith( 147 | `{"InstructionError":[0,{"Custom":15002}]}` 148 | ); 149 | }); 150 | 151 | it("non admin cannot remove segmenter A", async () => { 152 | const nonAdmin = await MockWallet.createWithBalance(connection); 153 | const tx = new Transaction().add( 154 | await removeSegmenterInstruction({ 155 | program: program, 156 | admin: nonAdmin.publicKey, 157 | registry: registryAccount.publicKey, 158 | removeKey: segmenterA.publicKey, 159 | }) 160 | ); 161 | const removeSegmenter = sendAndConfirm(tx, { 162 | feePayer: nonAdmin, 163 | signers: [nonAdmin], 164 | connection, 165 | }); 166 | await expect(removeSegmenter).to.eventually.be.rejectedWith( 167 | `{"InstructionError":[0,{"Custom":15002}]}` 168 | ); 169 | }); 170 | 171 | it("admin can remove segmenter A", async () => { 172 | const tx = new Transaction().add( 173 | await removeSegmenterInstruction({ 174 | program: program, 175 | admin: admin.publicKey, 176 | registry: registryAccount.publicKey, 177 | removeKey: segmenterA.publicKey, 178 | }) 179 | ); 180 | await sendAndConfirm(tx, { 181 | feePayer: admin, 182 | signers: [admin], 183 | connection, 184 | }); 185 | const registry = await getRegistryState(program, registryAccount.publicKey); 186 | checkRegistry(registry.registeredSegmenters, []); 187 | }); 188 | 189 | it("admin can add and remove multiple segmenters", async () => { 190 | const segmenter1 = Keypair.generate(); 191 | const segmenter2 = Keypair.generate(); 192 | const segmenter3 = Keypair.generate(); 193 | const segmenter4 = Keypair.generate(); 194 | 195 | const sendTxAndCheckRegistry = async ( 196 | ix: Promise, 197 | expected: PublicKey[], 198 | ) => { 199 | const tx = new Transaction().add(await ix); 200 | await sendAndConfirm(tx, { 201 | feePayer: admin, 202 | signers: [admin], 203 | connection, 204 | }); 205 | const registry = await getRegistryState(program, registryAccount.publicKey); 206 | checkRegistry(registry.registeredSegmenters, expected); 207 | }; 208 | 209 | const add = async (segmenter: Keypair): Promise => { 210 | return await addSegmenterInstruction({ 211 | program: program, 212 | admin: admin.publicKey, 213 | registry: registryAccount.publicKey, 214 | addKey: segmenter.publicKey, 215 | }); 216 | }; 217 | 218 | const remove = async (segmenter: Keypair): Promise => { 219 | return await removeSegmenterInstruction({ 220 | program: program, 221 | admin: admin.publicKey, 222 | registry: registryAccount.publicKey, 223 | removeKey: segmenter.publicKey, 224 | }); 225 | }; 226 | 227 | await sendTxAndCheckRegistry( 228 | add(segmenter1), 229 | [segmenter1.publicKey], 230 | ); 231 | await sendTxAndCheckRegistry( 232 | add(segmenter2), 233 | [segmenter1.publicKey, segmenter2.publicKey], 234 | ); 235 | await sendTxAndCheckRegistry( 236 | add(segmenter3), 237 | [segmenter1.publicKey, segmenter2.publicKey, segmenter3.publicKey], 238 | ); 239 | await sendTxAndCheckRegistry( 240 | add(segmenter4), 241 | [segmenter1.publicKey, segmenter2.publicKey, segmenter3.publicKey, segmenter4.publicKey], 242 | ); 243 | await sendTxAndCheckRegistry( 244 | remove(segmenter2), 245 | [segmenter1.publicKey, segmenter3.publicKey, segmenter4.publicKey], 246 | ); 247 | await sendTxAndCheckRegistry( 248 | remove(segmenter4), 249 | [segmenter1.publicKey, segmenter3.publicKey], 250 | ); 251 | await sendTxAndCheckRegistry( 252 | remove(segmenter1), 253 | [segmenter3.publicKey], 254 | ); 255 | await sendTxAndCheckRegistry( 256 | add(segmenter2), 257 | [segmenter2.publicKey, segmenter3.publicKey], 258 | ); 259 | await sendTxAndCheckRegistry( 260 | add(segmenter4), 261 | [segmenter2.publicKey, segmenter3.publicKey, segmenter4.publicKey], 262 | ); 263 | await sendTxAndCheckRegistry( 264 | remove(segmenter3), 265 | [segmenter2.publicKey, segmenter4.publicKey], 266 | ); 267 | await sendTxAndCheckRegistry( 268 | remove(segmenter2), 269 | [segmenter4.publicKey], 270 | ); 271 | await sendTxAndCheckRegistry( 272 | remove(segmenter4), 273 | [], 274 | ); 275 | }); 276 | 277 | it("current admin can change admin", async () => { 278 | const newAdmin = await MockWallet.createWithBalance(connection); 279 | const tx = new Transaction().add( 280 | await changeAdminInstruction({ 281 | program: program, 282 | admin: admin.publicKey, 283 | newAdmin: newAdmin.publicKey, 284 | }) 285 | ); 286 | await sendAndConfirm(tx, { 287 | feePayer: admin, 288 | signers: [admin], 289 | connection, 290 | }); 291 | { 292 | const config = await getConfigState(program); 293 | checkConfig(config, { admin: newAdmin.publicKey }); 294 | } 295 | 296 | // Change admin back to original admin 297 | const tx2 = new Transaction().add( 298 | await changeAdminInstruction({ 299 | program: program, 300 | admin: newAdmin.publicKey, 301 | newAdmin: admin.publicKey, 302 | }) 303 | ); 304 | await sendAndConfirm(tx2, { 305 | feePayer: newAdmin, 306 | signers: [newAdmin], 307 | connection, 308 | }); 309 | { 310 | const config = await getConfigState(program); 311 | checkConfig(config, { admin: admin.publicKey }); 312 | } 313 | }); 314 | 315 | it("non admin cannot change admin", async () => { 316 | const nonAdmin = await MockWallet.createWithBalance(connection); 317 | const tx = new Transaction().add( 318 | await changeAdminInstruction({ 319 | program: program, 320 | admin: nonAdmin.publicKey, 321 | newAdmin: nonAdmin.publicKey, 322 | }) 323 | ); 324 | const changeAdmin = sendAndConfirm(tx, { 325 | feePayer: nonAdmin, 326 | signers: [nonAdmin], 327 | connection, 328 | }); 329 | await expect(changeAdmin).to.eventually.be.rejectedWith( 330 | `{"InstructionError":[0,{"Custom":15002}]}` 331 | ); 332 | }); 333 | 334 | it("non admin cannot change admin without current admin's signature", async () => { 335 | const nonAdmin = await MockWallet.createWithBalance(connection); 336 | const tx = new Transaction().add( 337 | await changeAdminInstruction({ 338 | program: program, 339 | admin: admin.publicKey, 340 | newAdmin: nonAdmin.publicKey, 341 | }) 342 | ); 343 | const changeAdmin = sendAndConfirm(tx, { 344 | feePayer: nonAdmin, 345 | signers: [nonAdmin], 346 | connection, 347 | }); 348 | await expect(changeAdmin).to.eventually.be.rejectedWith( 349 | `Signature verification failed` 350 | ); 351 | }); 352 | }); 353 | -------------------------------------------------------------------------------- /tests/transaction.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Connection, 3 | PublicKey, 4 | Signer, 5 | Transaction, 6 | VersionedTransactionResponse, 7 | } from "@solana/web3.js"; 8 | 9 | export type SendAndConfirmOpts = { 10 | feePayer: PublicKey | Signer; 11 | blockhash?: { blockhash: string; lastValidBlockHeight: number }; 12 | signers?: Signer[]; 13 | connection: Connection; 14 | }; 15 | 16 | export async function sendAndConfirm( 17 | tx: Transaction, 18 | opts: SendAndConfirmOpts 19 | ): Promise { 20 | const { blockhash, lastValidBlockHeight } = opts.blockhash 21 | ? opts.blockhash 22 | : await opts.connection.getLatestBlockhash(); 23 | tx.recentBlockhash = blockhash; 24 | tx.feePayer = 25 | opts.feePayer instanceof PublicKey 26 | ? opts.feePayer 27 | : opts.feePayer.publicKey; 28 | tx.sign(...(opts.signers ?? [])); 29 | const serializedTx = tx.serialize(); 30 | const signature = await opts.connection.sendRawTransaction(serializedTx, { 31 | skipPreflight: true, 32 | }); 33 | const confirmResult = await opts.connection.confirmTransaction({ 34 | signature, 35 | blockhash, 36 | lastValidBlockHeight, 37 | }); 38 | const transactionResult = await opts.connection.getTransaction(signature, { 39 | maxSupportedTransactionVersion: undefined, 40 | }); 41 | if (confirmResult.value.err) { 42 | const errorDetails = 43 | `Error: ${JSON.stringify(confirmResult.value.err)}` + 44 | `\nTransaction details: ${JSON.stringify(transactionResult)}`; 45 | throw new Error(`Transaction failed\n${errorDetails}`); 46 | } 47 | if (!transactionResult) { 48 | throw new Error(`Failed to get transaction ${signature}`); 49 | } 50 | return transactionResult; 51 | } 52 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "types": ["mocha", "chai"], 4 | "target": "ES2022", 5 | "module": "commonjs", 6 | "declaration": true, 7 | "declarationMap": true, 8 | "sourceMap": true, 9 | "outDir": "dist", 10 | "strict": true, 11 | "baseUrl": "./", 12 | "esModuleInterop": true, 13 | "skipLibCheck": true, 14 | "forceConsistentCasingInFileNames": true, 15 | "resolveJsonModule": true, 16 | }, 17 | "include": [ 18 | "tests", 19 | ], 20 | } 21 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime@^7.25.0": 6 | version "7.25.7" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6" 8 | integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== 9 | dependencies: 10 | regenerator-runtime "^0.14.0" 11 | 12 | "@coral-xyz/anchor-errors@^0.30.1": 13 | version "0.30.1" 14 | resolved "https://registry.yarnpkg.com/@coral-xyz/anchor-errors/-/anchor-errors-0.30.1.tgz#bdfd3a353131345244546876eb4afc0e125bec30" 15 | integrity sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ== 16 | 17 | "@coral-xyz/anchor@^0.30.1": 18 | version "0.30.1" 19 | resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.30.1.tgz#17f3e9134c28cd0ea83574c6bab4e410bcecec5d" 20 | integrity sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ== 21 | dependencies: 22 | "@coral-xyz/anchor-errors" "^0.30.1" 23 | "@coral-xyz/borsh" "^0.30.1" 24 | "@noble/hashes" "^1.3.1" 25 | "@solana/web3.js" "^1.68.0" 26 | bn.js "^5.1.2" 27 | bs58 "^4.0.1" 28 | buffer-layout "^1.2.2" 29 | camelcase "^6.3.0" 30 | cross-fetch "^3.1.5" 31 | crypto-hash "^1.3.0" 32 | eventemitter3 "^4.0.7" 33 | pako "^2.0.3" 34 | snake-case "^3.0.4" 35 | superstruct "^0.15.4" 36 | toml "^3.0.0" 37 | 38 | "@coral-xyz/borsh@^0.30.1": 39 | version "0.30.1" 40 | resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.30.1.tgz#869d8833abe65685c72e9199b8688477a4f6b0e3" 41 | integrity sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ== 42 | dependencies: 43 | bn.js "^5.1.2" 44 | buffer-layout "^1.2.0" 45 | 46 | "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": 47 | version "4.4.0" 48 | resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" 49 | integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== 50 | dependencies: 51 | eslint-visitor-keys "^3.3.0" 52 | 53 | "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": 54 | version "4.11.1" 55 | resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f" 56 | integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== 57 | 58 | "@eslint/eslintrc@^2.1.4": 59 | version "2.1.4" 60 | resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz#388a269f0f25c1b6adc317b5a2c55714894c70ad" 61 | integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== 62 | dependencies: 63 | ajv "^6.12.4" 64 | debug "^4.3.2" 65 | espree "^9.6.0" 66 | globals "^13.19.0" 67 | ignore "^5.2.0" 68 | import-fresh "^3.2.1" 69 | js-yaml "^4.1.0" 70 | minimatch "^3.1.2" 71 | strip-json-comments "^3.1.1" 72 | 73 | "@eslint/js@8.57.1": 74 | version "8.57.1" 75 | resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2" 76 | integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== 77 | 78 | "@humanwhocodes/config-array@^0.13.0": 79 | version "0.13.0" 80 | resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748" 81 | integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== 82 | dependencies: 83 | "@humanwhocodes/object-schema" "^2.0.3" 84 | debug "^4.3.1" 85 | minimatch "^3.0.5" 86 | 87 | "@humanwhocodes/module-importer@^1.0.1": 88 | version "1.0.1" 89 | resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" 90 | integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== 91 | 92 | "@humanwhocodes/object-schema@^2.0.3": 93 | version "2.0.3" 94 | resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" 95 | integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== 96 | 97 | "@noble/curves@^1.4.2": 98 | version "1.6.0" 99 | resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.6.0.tgz#be5296ebcd5a1730fccea4786d420f87abfeb40b" 100 | integrity sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ== 101 | dependencies: 102 | "@noble/hashes" "1.5.0" 103 | 104 | "@noble/hashes@1.5.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.4.0": 105 | version "1.5.0" 106 | resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.5.0.tgz#abadc5ca20332db2b1b2aa3e496e9af1213570b0" 107 | integrity sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA== 108 | 109 | "@nodelib/fs.scandir@2.1.5": 110 | version "2.1.5" 111 | resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" 112 | integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== 113 | dependencies: 114 | "@nodelib/fs.stat" "2.0.5" 115 | run-parallel "^1.1.9" 116 | 117 | "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": 118 | version "2.0.5" 119 | resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" 120 | integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== 121 | 122 | "@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": 123 | version "1.2.8" 124 | resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" 125 | integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== 126 | dependencies: 127 | "@nodelib/fs.scandir" "2.1.5" 128 | fastq "^1.6.0" 129 | 130 | "@solana/buffer-layout@^4.0.1": 131 | version "4.0.1" 132 | resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" 133 | integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== 134 | dependencies: 135 | buffer "~6.0.3" 136 | 137 | "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.95.4": 138 | version "1.95.4" 139 | resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.95.4.tgz#771603f60d75cf7556ad867e1fd2efae32f9ad09" 140 | integrity sha512-sdewnNEA42ZSMxqkzdwEWi6fDgzwtJHaQa5ndUGEJYtoOnM6X5cvPmjoTUp7/k7bRrVAxfBgDnvQQHD6yhlLYw== 141 | dependencies: 142 | "@babel/runtime" "^7.25.0" 143 | "@noble/curves" "^1.4.2" 144 | "@noble/hashes" "^1.4.0" 145 | "@solana/buffer-layout" "^4.0.1" 146 | agentkeepalive "^4.5.0" 147 | bigint-buffer "^1.1.5" 148 | bn.js "^5.2.1" 149 | borsh "^0.7.0" 150 | bs58 "^4.0.1" 151 | buffer "6.0.3" 152 | fast-stable-stringify "^1.0.0" 153 | jayson "^4.1.1" 154 | node-fetch "^2.7.0" 155 | rpc-websockets "^9.0.2" 156 | superstruct "^2.0.2" 157 | 158 | "@swc/helpers@^0.5.11": 159 | version "0.5.13" 160 | resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.13.tgz#33e63ff3cd0cade557672bd7888a39ce7d115a8c" 161 | integrity sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w== 162 | dependencies: 163 | tslib "^2.4.0" 164 | 165 | "@types/chai-as-promised@^7.1.8": 166 | version "7.1.8" 167 | resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.8.tgz#f2b3d82d53c59626b5d6bbc087667ccb4b677fe9" 168 | integrity sha512-ThlRVIJhr69FLlh6IctTXFkmhtP3NpMZ2QGq69StYLyKZFp/HOp1VdKZj7RvfNWYYcJ1xlbLGLLWj1UvP5u/Gw== 169 | dependencies: 170 | "@types/chai" "*" 171 | 172 | "@types/chai@*": 173 | version "5.0.0" 174 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.0.0.tgz#7f981e71e69c9b2d422f58f78de1c59179782133" 175 | integrity sha512-+DwhEHAaFPPdJ2ral3kNHFQXnTfscEEFsUxzD+d7nlcLrFK23JtNjH71RGasTcHb88b4vVi4mTyfpf8u2L8bdA== 176 | 177 | "@types/chai@^4.3.11": 178 | version "4.3.20" 179 | resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.3.20.tgz#cb291577ed342ca92600430841a00329ba05cecc" 180 | integrity sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ== 181 | 182 | "@types/connect@^3.4.33": 183 | version "3.4.38" 184 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" 185 | integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== 186 | dependencies: 187 | "@types/node" "*" 188 | 189 | "@types/json-schema@^7.0.12": 190 | version "7.0.15" 191 | resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" 192 | integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== 193 | 194 | "@types/json5@^0.0.29": 195 | version "0.0.29" 196 | resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" 197 | integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== 198 | 199 | "@types/mocha@^10.0.6": 200 | version "10.0.9" 201 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.9.tgz#101e9da88d2c02e5ac8952982c23b224524d662a" 202 | integrity sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q== 203 | 204 | "@types/node@*": 205 | version "22.7.7" 206 | resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.7.tgz#6cd9541c3dccb4f7e8b141b491443f4a1570e307" 207 | integrity sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q== 208 | dependencies: 209 | undici-types "~6.19.2" 210 | 211 | "@types/node@^12.12.54": 212 | version "12.20.55" 213 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" 214 | integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== 215 | 216 | "@types/semver@^7.5.0": 217 | version "7.5.8" 218 | resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e" 219 | integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== 220 | 221 | "@types/uuid@^8.3.4": 222 | version "8.3.4" 223 | resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.4.tgz#bd86a43617df0594787d38b735f55c805becf1bc" 224 | integrity sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw== 225 | 226 | "@types/ws@^7.4.4": 227 | version "7.4.7" 228 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" 229 | integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== 230 | dependencies: 231 | "@types/node" "*" 232 | 233 | "@types/ws@^8.2.2": 234 | version "8.5.12" 235 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" 236 | integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== 237 | dependencies: 238 | "@types/node" "*" 239 | 240 | "@typescript-eslint/eslint-plugin@^6.17.0": 241 | version "6.21.0" 242 | resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz#30830c1ca81fd5f3c2714e524c4303e0194f9cd3" 243 | integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== 244 | dependencies: 245 | "@eslint-community/regexpp" "^4.5.1" 246 | "@typescript-eslint/scope-manager" "6.21.0" 247 | "@typescript-eslint/type-utils" "6.21.0" 248 | "@typescript-eslint/utils" "6.21.0" 249 | "@typescript-eslint/visitor-keys" "6.21.0" 250 | debug "^4.3.4" 251 | graphemer "^1.4.0" 252 | ignore "^5.2.4" 253 | natural-compare "^1.4.0" 254 | semver "^7.5.4" 255 | ts-api-utils "^1.0.1" 256 | 257 | "@typescript-eslint/parser@^6.17.0": 258 | version "6.21.0" 259 | resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-6.21.0.tgz#af8fcf66feee2edc86bc5d1cf45e33b0630bf35b" 260 | integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== 261 | dependencies: 262 | "@typescript-eslint/scope-manager" "6.21.0" 263 | "@typescript-eslint/types" "6.21.0" 264 | "@typescript-eslint/typescript-estree" "6.21.0" 265 | "@typescript-eslint/visitor-keys" "6.21.0" 266 | debug "^4.3.4" 267 | 268 | "@typescript-eslint/scope-manager@6.21.0": 269 | version "6.21.0" 270 | resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz#ea8a9bfc8f1504a6ac5d59a6df308d3a0630a2b1" 271 | integrity sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg== 272 | dependencies: 273 | "@typescript-eslint/types" "6.21.0" 274 | "@typescript-eslint/visitor-keys" "6.21.0" 275 | 276 | "@typescript-eslint/type-utils@6.21.0": 277 | version "6.21.0" 278 | resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz#6473281cfed4dacabe8004e8521cee0bd9d4c01e" 279 | integrity sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag== 280 | dependencies: 281 | "@typescript-eslint/typescript-estree" "6.21.0" 282 | "@typescript-eslint/utils" "6.21.0" 283 | debug "^4.3.4" 284 | ts-api-utils "^1.0.1" 285 | 286 | "@typescript-eslint/types@6.21.0": 287 | version "6.21.0" 288 | resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-6.21.0.tgz#205724c5123a8fef7ecd195075fa6e85bac3436d" 289 | integrity sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg== 290 | 291 | "@typescript-eslint/typescript-estree@6.21.0": 292 | version "6.21.0" 293 | resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz#c47ae7901db3b8bddc3ecd73daff2d0895688c46" 294 | integrity sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ== 295 | dependencies: 296 | "@typescript-eslint/types" "6.21.0" 297 | "@typescript-eslint/visitor-keys" "6.21.0" 298 | debug "^4.3.4" 299 | globby "^11.1.0" 300 | is-glob "^4.0.3" 301 | minimatch "9.0.3" 302 | semver "^7.5.4" 303 | ts-api-utils "^1.0.1" 304 | 305 | "@typescript-eslint/utils@6.21.0": 306 | version "6.21.0" 307 | resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-6.21.0.tgz#4714e7a6b39e773c1c8e97ec587f520840cd8134" 308 | integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== 309 | dependencies: 310 | "@eslint-community/eslint-utils" "^4.4.0" 311 | "@types/json-schema" "^7.0.12" 312 | "@types/semver" "^7.5.0" 313 | "@typescript-eslint/scope-manager" "6.21.0" 314 | "@typescript-eslint/types" "6.21.0" 315 | "@typescript-eslint/typescript-estree" "6.21.0" 316 | semver "^7.5.4" 317 | 318 | "@typescript-eslint/visitor-keys@6.21.0": 319 | version "6.21.0" 320 | resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz#87a99d077aa507e20e238b11d56cc26ade45fe47" 321 | integrity sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A== 322 | dependencies: 323 | "@typescript-eslint/types" "6.21.0" 324 | eslint-visitor-keys "^3.4.1" 325 | 326 | "@ungap/structured-clone@^1.2.0": 327 | version "1.2.0" 328 | resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" 329 | integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== 330 | 331 | JSONStream@^1.3.5: 332 | version "1.3.5" 333 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" 334 | integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== 335 | dependencies: 336 | jsonparse "^1.2.0" 337 | through ">=2.2.7 <3" 338 | 339 | acorn-jsx@^5.3.2: 340 | version "5.3.2" 341 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" 342 | integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== 343 | 344 | acorn@^8.9.0: 345 | version "8.13.0" 346 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.13.0.tgz#2a30d670818ad16ddd6a35d3842dacec9e5d7ca3" 347 | integrity sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w== 348 | 349 | agentkeepalive@^4.5.0: 350 | version "4.5.0" 351 | resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" 352 | integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== 353 | dependencies: 354 | humanize-ms "^1.2.1" 355 | 356 | ajv@^6.12.4: 357 | version "6.12.6" 358 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" 359 | integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== 360 | dependencies: 361 | fast-deep-equal "^3.1.1" 362 | fast-json-stable-stringify "^2.0.0" 363 | json-schema-traverse "^0.4.1" 364 | uri-js "^4.2.2" 365 | 366 | ansi-colors@^4.1.3: 367 | version "4.1.3" 368 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b" 369 | integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== 370 | 371 | ansi-regex@^5.0.1: 372 | version "5.0.1" 373 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 374 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 375 | 376 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 377 | version "4.3.0" 378 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 379 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 380 | dependencies: 381 | color-convert "^2.0.1" 382 | 383 | anymatch@~3.1.2: 384 | version "3.1.3" 385 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" 386 | integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== 387 | dependencies: 388 | normalize-path "^3.0.0" 389 | picomatch "^2.0.4" 390 | 391 | argparse@^2.0.1: 392 | version "2.0.1" 393 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 394 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 395 | 396 | array-union@^2.1.0: 397 | version "2.1.0" 398 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" 399 | integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== 400 | 401 | arrify@^1.0.0: 402 | version "1.0.1" 403 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 404 | integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== 405 | 406 | assertion-error@^1.1.0: 407 | version "1.1.0" 408 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 409 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 410 | 411 | balanced-match@^1.0.0: 412 | version "1.0.2" 413 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 414 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 415 | 416 | base-x@^3.0.2: 417 | version "3.0.10" 418 | resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.10.tgz#62de58653f8762b5d6f8d9fe30fa75f7b2585a75" 419 | integrity sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ== 420 | dependencies: 421 | safe-buffer "^5.0.1" 422 | 423 | base64-js@^1.3.1: 424 | version "1.5.1" 425 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 426 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 427 | 428 | bigint-buffer@^1.1.5: 429 | version "1.1.5" 430 | resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" 431 | integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== 432 | dependencies: 433 | bindings "^1.3.0" 434 | 435 | binary-extensions@^2.0.0: 436 | version "2.3.0" 437 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" 438 | integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== 439 | 440 | bindings@^1.3.0: 441 | version "1.5.0" 442 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" 443 | integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== 444 | dependencies: 445 | file-uri-to-path "1.0.0" 446 | 447 | bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: 448 | version "5.2.1" 449 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" 450 | integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== 451 | 452 | borsh@^0.7.0: 453 | version "0.7.0" 454 | resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" 455 | integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== 456 | dependencies: 457 | bn.js "^5.2.0" 458 | bs58 "^4.0.0" 459 | text-encoding-utf-8 "^1.0.2" 460 | 461 | brace-expansion@^1.1.7: 462 | version "1.1.11" 463 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 464 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 465 | dependencies: 466 | balanced-match "^1.0.0" 467 | concat-map "0.0.1" 468 | 469 | brace-expansion@^2.0.1: 470 | version "2.0.1" 471 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 472 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 473 | dependencies: 474 | balanced-match "^1.0.0" 475 | 476 | braces@^3.0.3, braces@~3.0.2: 477 | version "3.0.3" 478 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" 479 | integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== 480 | dependencies: 481 | fill-range "^7.1.1" 482 | 483 | browser-stdout@^1.3.1: 484 | version "1.3.1" 485 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 486 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 487 | 488 | bs58@^4.0.0, bs58@^4.0.1: 489 | version "4.0.1" 490 | resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" 491 | integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== 492 | dependencies: 493 | base-x "^3.0.2" 494 | 495 | buffer-from@^1.0.0, buffer-from@^1.1.0: 496 | version "1.1.2" 497 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 498 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 499 | 500 | buffer-layout@^1.2.0, buffer-layout@^1.2.2: 501 | version "1.2.2" 502 | resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" 503 | integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== 504 | 505 | buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: 506 | version "6.0.3" 507 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" 508 | integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== 509 | dependencies: 510 | base64-js "^1.3.1" 511 | ieee754 "^1.2.1" 512 | 513 | bufferutil@^4.0.1: 514 | version "4.0.8" 515 | resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" 516 | integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== 517 | dependencies: 518 | node-gyp-build "^4.3.0" 519 | 520 | callsites@^3.0.0: 521 | version "3.1.0" 522 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 523 | integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 524 | 525 | camelcase@^6.0.0, camelcase@^6.3.0: 526 | version "6.3.0" 527 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 528 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 529 | 530 | chai-as-promised@^7.1.1: 531 | version "7.1.2" 532 | resolved "https://registry.yarnpkg.com/chai-as-promised/-/chai-as-promised-7.1.2.tgz#70cd73b74afd519754161386421fb71832c6d041" 533 | integrity sha512-aBDHZxRzYnUYuIAIPBH2s511DjlKPzXNlXSGFC8CwmroWQLfrW0LtE1nK3MAwwNhJPa9raEjNCmRoFpG0Hurdw== 534 | dependencies: 535 | check-error "^1.0.2" 536 | 537 | chai@^4.3.4: 538 | version "4.5.0" 539 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.5.0.tgz#707e49923afdd9b13a8b0b47d33d732d13812fd8" 540 | integrity sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw== 541 | dependencies: 542 | assertion-error "^1.1.0" 543 | check-error "^1.0.3" 544 | deep-eql "^4.1.3" 545 | get-func-name "^2.0.2" 546 | loupe "^2.3.6" 547 | pathval "^1.1.1" 548 | type-detect "^4.1.0" 549 | 550 | chalk@^4.0.0, chalk@^4.1.0: 551 | version "4.1.2" 552 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 553 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 554 | dependencies: 555 | ansi-styles "^4.1.0" 556 | supports-color "^7.1.0" 557 | 558 | check-error@^1.0.2, check-error@^1.0.3: 559 | version "1.0.3" 560 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.3.tgz#a6502e4312a7ee969f646e83bb3ddd56281bd694" 561 | integrity sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg== 562 | dependencies: 563 | get-func-name "^2.0.2" 564 | 565 | chokidar@^3.5.3: 566 | version "3.6.0" 567 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" 568 | integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== 569 | dependencies: 570 | anymatch "~3.1.2" 571 | braces "~3.0.2" 572 | glob-parent "~5.1.2" 573 | is-binary-path "~2.1.0" 574 | is-glob "~4.0.1" 575 | normalize-path "~3.0.0" 576 | readdirp "~3.6.0" 577 | optionalDependencies: 578 | fsevents "~2.3.2" 579 | 580 | cliui@^7.0.2: 581 | version "7.0.4" 582 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 583 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 584 | dependencies: 585 | string-width "^4.2.0" 586 | strip-ansi "^6.0.0" 587 | wrap-ansi "^7.0.0" 588 | 589 | color-convert@^2.0.1: 590 | version "2.0.1" 591 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 592 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 593 | dependencies: 594 | color-name "~1.1.4" 595 | 596 | color-name@~1.1.4: 597 | version "1.1.4" 598 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 599 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 600 | 601 | commander@^2.20.3: 602 | version "2.20.3" 603 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 604 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 605 | 606 | concat-map@0.0.1: 607 | version "0.0.1" 608 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 609 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 610 | 611 | cross-fetch@^3.1.5: 612 | version "3.1.8" 613 | resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" 614 | integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== 615 | dependencies: 616 | node-fetch "^2.6.12" 617 | 618 | cross-spawn@^7.0.2: 619 | version "7.0.3" 620 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 621 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 622 | dependencies: 623 | path-key "^3.1.0" 624 | shebang-command "^2.0.0" 625 | which "^2.0.1" 626 | 627 | crypto-hash@^1.3.0: 628 | version "1.3.0" 629 | resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" 630 | integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== 631 | 632 | debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: 633 | version "4.3.7" 634 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52" 635 | integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== 636 | dependencies: 637 | ms "^2.1.3" 638 | 639 | decamelize@^4.0.0: 640 | version "4.0.0" 641 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 642 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 643 | 644 | deep-eql@^4.1.3: 645 | version "4.1.4" 646 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-4.1.4.tgz#d0d3912865911bb8fac5afb4e3acfa6a28dc72b7" 647 | integrity sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg== 648 | dependencies: 649 | type-detect "^4.0.0" 650 | 651 | deep-is@^0.1.3: 652 | version "0.1.4" 653 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" 654 | integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== 655 | 656 | delay@^5.0.0: 657 | version "5.0.0" 658 | resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" 659 | integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== 660 | 661 | diff@^3.1.0: 662 | version "3.5.0" 663 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 664 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 665 | 666 | diff@^5.2.0: 667 | version "5.2.0" 668 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.2.0.tgz#26ded047cd1179b78b9537d5ef725503ce1ae531" 669 | integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== 670 | 671 | dir-glob@^3.0.1: 672 | version "3.0.1" 673 | resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" 674 | integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== 675 | dependencies: 676 | path-type "^4.0.0" 677 | 678 | doctrine@^3.0.0: 679 | version "3.0.0" 680 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961" 681 | integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== 682 | dependencies: 683 | esutils "^2.0.2" 684 | 685 | dot-case@^3.0.4: 686 | version "3.0.4" 687 | resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" 688 | integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== 689 | dependencies: 690 | no-case "^3.0.4" 691 | tslib "^2.0.3" 692 | 693 | emoji-regex@^8.0.0: 694 | version "8.0.0" 695 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 696 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 697 | 698 | es6-promise@^4.0.3: 699 | version "4.2.8" 700 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" 701 | integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== 702 | 703 | es6-promisify@^5.0.0: 704 | version "5.0.0" 705 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 706 | integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== 707 | dependencies: 708 | es6-promise "^4.0.3" 709 | 710 | escalade@^3.1.1: 711 | version "3.2.0" 712 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" 713 | integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== 714 | 715 | escape-string-regexp@^4.0.0: 716 | version "4.0.0" 717 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 718 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 719 | 720 | eslint-scope@^7.2.2: 721 | version "7.2.2" 722 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" 723 | integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== 724 | dependencies: 725 | esrecurse "^4.3.0" 726 | estraverse "^5.2.0" 727 | 728 | eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: 729 | version "3.4.3" 730 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" 731 | integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== 732 | 733 | eslint@^8.56.0: 734 | version "8.57.1" 735 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9" 736 | integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== 737 | dependencies: 738 | "@eslint-community/eslint-utils" "^4.2.0" 739 | "@eslint-community/regexpp" "^4.6.1" 740 | "@eslint/eslintrc" "^2.1.4" 741 | "@eslint/js" "8.57.1" 742 | "@humanwhocodes/config-array" "^0.13.0" 743 | "@humanwhocodes/module-importer" "^1.0.1" 744 | "@nodelib/fs.walk" "^1.2.8" 745 | "@ungap/structured-clone" "^1.2.0" 746 | ajv "^6.12.4" 747 | chalk "^4.0.0" 748 | cross-spawn "^7.0.2" 749 | debug "^4.3.2" 750 | doctrine "^3.0.0" 751 | escape-string-regexp "^4.0.0" 752 | eslint-scope "^7.2.2" 753 | eslint-visitor-keys "^3.4.3" 754 | espree "^9.6.1" 755 | esquery "^1.4.2" 756 | esutils "^2.0.2" 757 | fast-deep-equal "^3.1.3" 758 | file-entry-cache "^6.0.1" 759 | find-up "^5.0.0" 760 | glob-parent "^6.0.2" 761 | globals "^13.19.0" 762 | graphemer "^1.4.0" 763 | ignore "^5.2.0" 764 | imurmurhash "^0.1.4" 765 | is-glob "^4.0.0" 766 | is-path-inside "^3.0.3" 767 | js-yaml "^4.1.0" 768 | json-stable-stringify-without-jsonify "^1.0.1" 769 | levn "^0.4.1" 770 | lodash.merge "^4.6.2" 771 | minimatch "^3.1.2" 772 | natural-compare "^1.4.0" 773 | optionator "^0.9.3" 774 | strip-ansi "^6.0.1" 775 | text-table "^0.2.0" 776 | 777 | espree@^9.6.0, espree@^9.6.1: 778 | version "9.6.1" 779 | resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" 780 | integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== 781 | dependencies: 782 | acorn "^8.9.0" 783 | acorn-jsx "^5.3.2" 784 | eslint-visitor-keys "^3.4.1" 785 | 786 | esquery@^1.4.2: 787 | version "1.6.0" 788 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" 789 | integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== 790 | dependencies: 791 | estraverse "^5.1.0" 792 | 793 | esrecurse@^4.3.0: 794 | version "4.3.0" 795 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" 796 | integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== 797 | dependencies: 798 | estraverse "^5.2.0" 799 | 800 | estraverse@^5.1.0, estraverse@^5.2.0: 801 | version "5.3.0" 802 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" 803 | integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== 804 | 805 | esutils@^2.0.2: 806 | version "2.0.3" 807 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" 808 | integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== 809 | 810 | eventemitter3@^4.0.7: 811 | version "4.0.7" 812 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" 813 | integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== 814 | 815 | eventemitter3@^5.0.1: 816 | version "5.0.1" 817 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" 818 | integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== 819 | 820 | eyes@^0.1.8: 821 | version "0.1.8" 822 | resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" 823 | integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== 824 | 825 | fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: 826 | version "3.1.3" 827 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" 828 | integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== 829 | 830 | fast-glob@^3.2.9: 831 | version "3.3.2" 832 | resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" 833 | integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== 834 | dependencies: 835 | "@nodelib/fs.stat" "^2.0.2" 836 | "@nodelib/fs.walk" "^1.2.3" 837 | glob-parent "^5.1.2" 838 | merge2 "^1.3.0" 839 | micromatch "^4.0.4" 840 | 841 | fast-json-stable-stringify@^2.0.0: 842 | version "2.1.0" 843 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" 844 | integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== 845 | 846 | fast-levenshtein@^2.0.6: 847 | version "2.0.6" 848 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 849 | integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== 850 | 851 | fast-stable-stringify@^1.0.0: 852 | version "1.0.0" 853 | resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" 854 | integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== 855 | 856 | fastq@^1.6.0: 857 | version "1.17.1" 858 | resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.17.1.tgz#2a523f07a4e7b1e81a42b91b8bf2254107753b47" 859 | integrity sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w== 860 | dependencies: 861 | reusify "^1.0.4" 862 | 863 | file-entry-cache@^6.0.1: 864 | version "6.0.1" 865 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" 866 | integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== 867 | dependencies: 868 | flat-cache "^3.0.4" 869 | 870 | file-uri-to-path@1.0.0: 871 | version "1.0.0" 872 | resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" 873 | integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== 874 | 875 | fill-range@^7.1.1: 876 | version "7.1.1" 877 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" 878 | integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== 879 | dependencies: 880 | to-regex-range "^5.0.1" 881 | 882 | find-up@^5.0.0: 883 | version "5.0.0" 884 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 885 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 886 | dependencies: 887 | locate-path "^6.0.0" 888 | path-exists "^4.0.0" 889 | 890 | flat-cache@^3.0.4: 891 | version "3.2.0" 892 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" 893 | integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== 894 | dependencies: 895 | flatted "^3.2.9" 896 | keyv "^4.5.3" 897 | rimraf "^3.0.2" 898 | 899 | flat@^5.0.2: 900 | version "5.0.2" 901 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 902 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 903 | 904 | flatted@^3.2.9: 905 | version "3.3.1" 906 | resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.3.1.tgz#21db470729a6734d4997002f439cb308987f567a" 907 | integrity sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw== 908 | 909 | fs.realpath@^1.0.0: 910 | version "1.0.0" 911 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 912 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 913 | 914 | fsevents@~2.3.2: 915 | version "2.3.3" 916 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 917 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 918 | 919 | get-caller-file@^2.0.5: 920 | version "2.0.5" 921 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 922 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 923 | 924 | get-func-name@^2.0.1, get-func-name@^2.0.2: 925 | version "2.0.2" 926 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.2.tgz#0d7cf20cd13fda808669ffa88f4ffc7a3943fc41" 927 | integrity sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ== 928 | 929 | glob-parent@^5.1.2, glob-parent@~5.1.2: 930 | version "5.1.2" 931 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 932 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 933 | dependencies: 934 | is-glob "^4.0.1" 935 | 936 | glob-parent@^6.0.2: 937 | version "6.0.2" 938 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" 939 | integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== 940 | dependencies: 941 | is-glob "^4.0.3" 942 | 943 | glob@^7.1.3: 944 | version "7.2.3" 945 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 946 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 947 | dependencies: 948 | fs.realpath "^1.0.0" 949 | inflight "^1.0.4" 950 | inherits "2" 951 | minimatch "^3.1.1" 952 | once "^1.3.0" 953 | path-is-absolute "^1.0.0" 954 | 955 | glob@^8.1.0: 956 | version "8.1.0" 957 | resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" 958 | integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== 959 | dependencies: 960 | fs.realpath "^1.0.0" 961 | inflight "^1.0.4" 962 | inherits "2" 963 | minimatch "^5.0.1" 964 | once "^1.3.0" 965 | 966 | globals@^13.19.0: 967 | version "13.24.0" 968 | resolved "https://registry.yarnpkg.com/globals/-/globals-13.24.0.tgz#8432a19d78ce0c1e833949c36adb345400bb1171" 969 | integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== 970 | dependencies: 971 | type-fest "^0.20.2" 972 | 973 | globby@^11.1.0: 974 | version "11.1.0" 975 | resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" 976 | integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== 977 | dependencies: 978 | array-union "^2.1.0" 979 | dir-glob "^3.0.1" 980 | fast-glob "^3.2.9" 981 | ignore "^5.2.0" 982 | merge2 "^1.4.1" 983 | slash "^3.0.0" 984 | 985 | graphemer@^1.4.0: 986 | version "1.4.0" 987 | resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" 988 | integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== 989 | 990 | has-flag@^4.0.0: 991 | version "4.0.0" 992 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 993 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 994 | 995 | he@^1.2.0: 996 | version "1.2.0" 997 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 998 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 999 | 1000 | humanize-ms@^1.2.1: 1001 | version "1.2.1" 1002 | resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" 1003 | integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== 1004 | dependencies: 1005 | ms "^2.0.0" 1006 | 1007 | ieee754@^1.2.1: 1008 | version "1.2.1" 1009 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 1010 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 1011 | 1012 | ignore@^5.2.0, ignore@^5.2.4: 1013 | version "5.3.2" 1014 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5" 1015 | integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== 1016 | 1017 | import-fresh@^3.2.1: 1018 | version "3.3.0" 1019 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" 1020 | integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== 1021 | dependencies: 1022 | parent-module "^1.0.0" 1023 | resolve-from "^4.0.0" 1024 | 1025 | imurmurhash@^0.1.4: 1026 | version "0.1.4" 1027 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 1028 | integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== 1029 | 1030 | inflight@^1.0.4: 1031 | version "1.0.6" 1032 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 1033 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 1034 | dependencies: 1035 | once "^1.3.0" 1036 | wrappy "1" 1037 | 1038 | inherits@2: 1039 | version "2.0.4" 1040 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 1041 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 1042 | 1043 | is-binary-path@~2.1.0: 1044 | version "2.1.0" 1045 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 1046 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 1047 | dependencies: 1048 | binary-extensions "^2.0.0" 1049 | 1050 | is-extglob@^2.1.1: 1051 | version "2.1.1" 1052 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 1053 | integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== 1054 | 1055 | is-fullwidth-code-point@^3.0.0: 1056 | version "3.0.0" 1057 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 1058 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 1059 | 1060 | is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: 1061 | version "4.0.3" 1062 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 1063 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 1064 | dependencies: 1065 | is-extglob "^2.1.1" 1066 | 1067 | is-number@^7.0.0: 1068 | version "7.0.0" 1069 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 1070 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 1071 | 1072 | is-path-inside@^3.0.3: 1073 | version "3.0.3" 1074 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" 1075 | integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== 1076 | 1077 | is-plain-obj@^2.1.0: 1078 | version "2.1.0" 1079 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 1080 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 1081 | 1082 | is-unicode-supported@^0.1.0: 1083 | version "0.1.0" 1084 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 1085 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 1086 | 1087 | isexe@^2.0.0: 1088 | version "2.0.0" 1089 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 1090 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 1091 | 1092 | isomorphic-ws@^4.0.1: 1093 | version "4.0.1" 1094 | resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" 1095 | integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== 1096 | 1097 | jayson@^4.1.1: 1098 | version "4.1.2" 1099 | resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.2.tgz#443c26a8658703e0b2e881117b09395d88b6982e" 1100 | integrity sha512-5nzMWDHy6f+koZOuYsArh2AXs73NfWYVlFyJJuCedr93GpY+Ku8qq10ropSXVfHK+H0T6paA88ww+/dV+1fBNA== 1101 | dependencies: 1102 | "@types/connect" "^3.4.33" 1103 | "@types/node" "^12.12.54" 1104 | "@types/ws" "^7.4.4" 1105 | JSONStream "^1.3.5" 1106 | commander "^2.20.3" 1107 | delay "^5.0.0" 1108 | es6-promisify "^5.0.0" 1109 | eyes "^0.1.8" 1110 | isomorphic-ws "^4.0.1" 1111 | json-stringify-safe "^5.0.1" 1112 | uuid "^8.3.2" 1113 | ws "^7.5.10" 1114 | 1115 | js-yaml@^4.1.0: 1116 | version "4.1.0" 1117 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 1118 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 1119 | dependencies: 1120 | argparse "^2.0.1" 1121 | 1122 | json-buffer@3.0.1: 1123 | version "3.0.1" 1124 | resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" 1125 | integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== 1126 | 1127 | json-schema-traverse@^0.4.1: 1128 | version "0.4.1" 1129 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 1130 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 1131 | 1132 | json-stable-stringify-without-jsonify@^1.0.1: 1133 | version "1.0.1" 1134 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 1135 | integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== 1136 | 1137 | json-stringify-safe@^5.0.1: 1138 | version "5.0.1" 1139 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 1140 | integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== 1141 | 1142 | json5@^1.0.2: 1143 | version "1.0.2" 1144 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" 1145 | integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== 1146 | dependencies: 1147 | minimist "^1.2.0" 1148 | 1149 | jsonparse@^1.2.0: 1150 | version "1.3.1" 1151 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" 1152 | integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== 1153 | 1154 | keyv@^4.5.3: 1155 | version "4.5.4" 1156 | resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" 1157 | integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== 1158 | dependencies: 1159 | json-buffer "3.0.1" 1160 | 1161 | levn@^0.4.1: 1162 | version "0.4.1" 1163 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" 1164 | integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== 1165 | dependencies: 1166 | prelude-ls "^1.2.1" 1167 | type-check "~0.4.0" 1168 | 1169 | locate-path@^6.0.0: 1170 | version "6.0.0" 1171 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 1172 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 1173 | dependencies: 1174 | p-locate "^5.0.0" 1175 | 1176 | lodash.merge@^4.6.2: 1177 | version "4.6.2" 1178 | resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a" 1179 | integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== 1180 | 1181 | log-symbols@^4.1.0: 1182 | version "4.1.0" 1183 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 1184 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 1185 | dependencies: 1186 | chalk "^4.1.0" 1187 | is-unicode-supported "^0.1.0" 1188 | 1189 | loupe@^2.3.6: 1190 | version "2.3.7" 1191 | resolved "https://registry.yarnpkg.com/loupe/-/loupe-2.3.7.tgz#6e69b7d4db7d3ab436328013d37d1c8c3540c697" 1192 | integrity sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA== 1193 | dependencies: 1194 | get-func-name "^2.0.1" 1195 | 1196 | lower-case@^2.0.2: 1197 | version "2.0.2" 1198 | resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" 1199 | integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== 1200 | dependencies: 1201 | tslib "^2.0.3" 1202 | 1203 | make-error@^1.1.1: 1204 | version "1.3.6" 1205 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 1206 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 1207 | 1208 | merge2@^1.3.0, merge2@^1.4.1: 1209 | version "1.4.1" 1210 | resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" 1211 | integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== 1212 | 1213 | micromatch@^4.0.4: 1214 | version "4.0.8" 1215 | resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202" 1216 | integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA== 1217 | dependencies: 1218 | braces "^3.0.3" 1219 | picomatch "^2.3.1" 1220 | 1221 | minimatch@9.0.3: 1222 | version "9.0.3" 1223 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" 1224 | integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== 1225 | dependencies: 1226 | brace-expansion "^2.0.1" 1227 | 1228 | minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: 1229 | version "3.1.2" 1230 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 1231 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 1232 | dependencies: 1233 | brace-expansion "^1.1.7" 1234 | 1235 | minimatch@^5.0.1, minimatch@^5.1.6: 1236 | version "5.1.6" 1237 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" 1238 | integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== 1239 | dependencies: 1240 | brace-expansion "^2.0.1" 1241 | 1242 | minimist@^1.2.0, minimist@^1.2.6: 1243 | version "1.2.8" 1244 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" 1245 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 1246 | 1247 | mkdirp@^0.5.1: 1248 | version "0.5.6" 1249 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" 1250 | integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== 1251 | dependencies: 1252 | minimist "^1.2.6" 1253 | 1254 | mocha@^10.2.0: 1255 | version "10.7.3" 1256 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.7.3.tgz#ae32003cabbd52b59aece17846056a68eb4b0752" 1257 | integrity sha512-uQWxAu44wwiACGqjbPYmjo7Lg8sFrS3dQe7PP2FQI+woptP4vZXSMcfMyFL/e1yFEeEpV4RtyTpZROOKmxis+A== 1258 | dependencies: 1259 | ansi-colors "^4.1.3" 1260 | browser-stdout "^1.3.1" 1261 | chokidar "^3.5.3" 1262 | debug "^4.3.5" 1263 | diff "^5.2.0" 1264 | escape-string-regexp "^4.0.0" 1265 | find-up "^5.0.0" 1266 | glob "^8.1.0" 1267 | he "^1.2.0" 1268 | js-yaml "^4.1.0" 1269 | log-symbols "^4.1.0" 1270 | minimatch "^5.1.6" 1271 | ms "^2.1.3" 1272 | serialize-javascript "^6.0.2" 1273 | strip-json-comments "^3.1.1" 1274 | supports-color "^8.1.1" 1275 | workerpool "^6.5.1" 1276 | yargs "^16.2.0" 1277 | yargs-parser "^20.2.9" 1278 | yargs-unparser "^2.0.0" 1279 | 1280 | ms@^2.0.0, ms@^2.1.3: 1281 | version "2.1.3" 1282 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1283 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1284 | 1285 | natural-compare@^1.4.0: 1286 | version "1.4.0" 1287 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 1288 | integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== 1289 | 1290 | no-case@^3.0.4: 1291 | version "3.0.4" 1292 | resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" 1293 | integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== 1294 | dependencies: 1295 | lower-case "^2.0.2" 1296 | tslib "^2.0.3" 1297 | 1298 | node-fetch@^2.6.12, node-fetch@^2.7.0: 1299 | version "2.7.0" 1300 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" 1301 | integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== 1302 | dependencies: 1303 | whatwg-url "^5.0.0" 1304 | 1305 | node-gyp-build@^4.3.0: 1306 | version "4.8.2" 1307 | resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.2.tgz#4f802b71c1ab2ca16af830e6c1ea7dd1ad9496fa" 1308 | integrity sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw== 1309 | 1310 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1311 | version "3.0.0" 1312 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1313 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1314 | 1315 | once@^1.3.0: 1316 | version "1.4.0" 1317 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1318 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1319 | dependencies: 1320 | wrappy "1" 1321 | 1322 | optionator@^0.9.3: 1323 | version "0.9.4" 1324 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.4.tgz#7ea1c1a5d91d764fb282139c88fe11e182a3a734" 1325 | integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== 1326 | dependencies: 1327 | deep-is "^0.1.3" 1328 | fast-levenshtein "^2.0.6" 1329 | levn "^0.4.1" 1330 | prelude-ls "^1.2.1" 1331 | type-check "^0.4.0" 1332 | word-wrap "^1.2.5" 1333 | 1334 | p-limit@^3.0.2: 1335 | version "3.1.0" 1336 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1337 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1338 | dependencies: 1339 | yocto-queue "^0.1.0" 1340 | 1341 | p-locate@^5.0.0: 1342 | version "5.0.0" 1343 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1344 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1345 | dependencies: 1346 | p-limit "^3.0.2" 1347 | 1348 | pako@^2.0.3: 1349 | version "2.1.0" 1350 | resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" 1351 | integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== 1352 | 1353 | parent-module@^1.0.0: 1354 | version "1.0.1" 1355 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" 1356 | integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== 1357 | dependencies: 1358 | callsites "^3.0.0" 1359 | 1360 | path-exists@^4.0.0: 1361 | version "4.0.0" 1362 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1363 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1364 | 1365 | path-is-absolute@^1.0.0: 1366 | version "1.0.1" 1367 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1368 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1369 | 1370 | path-key@^3.1.0: 1371 | version "3.1.1" 1372 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1373 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1374 | 1375 | path-type@^4.0.0: 1376 | version "4.0.0" 1377 | resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" 1378 | integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== 1379 | 1380 | pathval@^1.1.1: 1381 | version "1.1.1" 1382 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" 1383 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 1384 | 1385 | picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: 1386 | version "2.3.1" 1387 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1388 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1389 | 1390 | prelude-ls@^1.2.1: 1391 | version "1.2.1" 1392 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" 1393 | integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== 1394 | 1395 | punycode@^2.1.0: 1396 | version "2.3.1" 1397 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" 1398 | integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== 1399 | 1400 | queue-microtask@^1.2.2: 1401 | version "1.2.3" 1402 | resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" 1403 | integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== 1404 | 1405 | randombytes@^2.1.0: 1406 | version "2.1.0" 1407 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1408 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1409 | dependencies: 1410 | safe-buffer "^5.1.0" 1411 | 1412 | readdirp@~3.6.0: 1413 | version "3.6.0" 1414 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1415 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1416 | dependencies: 1417 | picomatch "^2.2.1" 1418 | 1419 | regenerator-runtime@^0.14.0: 1420 | version "0.14.1" 1421 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" 1422 | integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== 1423 | 1424 | require-directory@^2.1.1: 1425 | version "2.1.1" 1426 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1427 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 1428 | 1429 | resolve-from@^4.0.0: 1430 | version "4.0.0" 1431 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 1432 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 1433 | 1434 | reusify@^1.0.4: 1435 | version "1.0.4" 1436 | resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" 1437 | integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== 1438 | 1439 | rimraf@^3.0.2: 1440 | version "3.0.2" 1441 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" 1442 | integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== 1443 | dependencies: 1444 | glob "^7.1.3" 1445 | 1446 | rpc-websockets@^9.0.2: 1447 | version "9.0.4" 1448 | resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-9.0.4.tgz#9d8ee82533b5d1e13d9ded729e3e38d0d8fa083f" 1449 | integrity sha512-yWZWN0M+bivtoNLnaDbtny4XchdAIF5Q4g/ZsC5UC61Ckbp0QczwO8fg44rV3uYmY4WHd+EZQbn90W1d8ojzqQ== 1450 | dependencies: 1451 | "@swc/helpers" "^0.5.11" 1452 | "@types/uuid" "^8.3.4" 1453 | "@types/ws" "^8.2.2" 1454 | buffer "^6.0.3" 1455 | eventemitter3 "^5.0.1" 1456 | uuid "^8.3.2" 1457 | ws "^8.5.0" 1458 | optionalDependencies: 1459 | bufferutil "^4.0.1" 1460 | utf-8-validate "^5.0.2" 1461 | 1462 | run-parallel@^1.1.9: 1463 | version "1.2.0" 1464 | resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" 1465 | integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== 1466 | dependencies: 1467 | queue-microtask "^1.2.2" 1468 | 1469 | safe-buffer@^5.0.1, safe-buffer@^5.1.0: 1470 | version "5.2.1" 1471 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1472 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1473 | 1474 | semver@^7.5.4: 1475 | version "7.6.3" 1476 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" 1477 | integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== 1478 | 1479 | serialize-javascript@^6.0.2: 1480 | version "6.0.2" 1481 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" 1482 | integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== 1483 | dependencies: 1484 | randombytes "^2.1.0" 1485 | 1486 | shebang-command@^2.0.0: 1487 | version "2.0.0" 1488 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1489 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1490 | dependencies: 1491 | shebang-regex "^3.0.0" 1492 | 1493 | shebang-regex@^3.0.0: 1494 | version "3.0.0" 1495 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1496 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1497 | 1498 | slash@^3.0.0: 1499 | version "3.0.0" 1500 | resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" 1501 | integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== 1502 | 1503 | snake-case@^3.0.4: 1504 | version "3.0.4" 1505 | resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" 1506 | integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== 1507 | dependencies: 1508 | dot-case "^3.0.4" 1509 | tslib "^2.0.3" 1510 | 1511 | source-map-support@^0.5.21, source-map-support@^0.5.6: 1512 | version "0.5.21" 1513 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" 1514 | integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== 1515 | dependencies: 1516 | buffer-from "^1.0.0" 1517 | source-map "^0.6.0" 1518 | 1519 | source-map@^0.6.0: 1520 | version "0.6.1" 1521 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1522 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1523 | 1524 | string-width@^4.1.0, string-width@^4.2.0: 1525 | version "4.2.3" 1526 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1527 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1528 | dependencies: 1529 | emoji-regex "^8.0.0" 1530 | is-fullwidth-code-point "^3.0.0" 1531 | strip-ansi "^6.0.1" 1532 | 1533 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1534 | version "6.0.1" 1535 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1536 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1537 | dependencies: 1538 | ansi-regex "^5.0.1" 1539 | 1540 | strip-bom@^3.0.0: 1541 | version "3.0.0" 1542 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1543 | integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== 1544 | 1545 | strip-json-comments@^3.1.1: 1546 | version "3.1.1" 1547 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1548 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1549 | 1550 | superstruct@^0.15.4: 1551 | version "0.15.5" 1552 | resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.5.tgz#0f0a8d3ce31313f0d84c6096cd4fa1bfdedc9dab" 1553 | integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== 1554 | 1555 | superstruct@^2.0.2: 1556 | version "2.0.2" 1557 | resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-2.0.2.tgz#3f6d32fbdc11c357deff127d591a39b996300c54" 1558 | integrity sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A== 1559 | 1560 | supports-color@^7.1.0: 1561 | version "7.2.0" 1562 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1563 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1564 | dependencies: 1565 | has-flag "^4.0.0" 1566 | 1567 | supports-color@^8.1.1: 1568 | version "8.1.1" 1569 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1570 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1571 | dependencies: 1572 | has-flag "^4.0.0" 1573 | 1574 | text-encoding-utf-8@^1.0.2: 1575 | version "1.0.2" 1576 | resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" 1577 | integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== 1578 | 1579 | text-table@^0.2.0: 1580 | version "0.2.0" 1581 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 1582 | integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== 1583 | 1584 | "through@>=2.2.7 <3": 1585 | version "2.3.8" 1586 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1587 | integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== 1588 | 1589 | to-regex-range@^5.0.1: 1590 | version "5.0.1" 1591 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1592 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1593 | dependencies: 1594 | is-number "^7.0.0" 1595 | 1596 | toml@^3.0.0: 1597 | version "3.0.0" 1598 | resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" 1599 | integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== 1600 | 1601 | tr46@~0.0.3: 1602 | version "0.0.3" 1603 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 1604 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 1605 | 1606 | ts-api-utils@^1.0.1: 1607 | version "1.3.0" 1608 | resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz#4b490e27129f1e8e686b45cc4ab63714dc60eea1" 1609 | integrity sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== 1610 | 1611 | ts-mocha@^10.0.0: 1612 | version "10.0.0" 1613 | resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-10.0.0.tgz#41a8d099ac90dbbc64b06976c5025ffaebc53cb9" 1614 | integrity sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw== 1615 | dependencies: 1616 | ts-node "7.0.1" 1617 | optionalDependencies: 1618 | tsconfig-paths "^3.5.0" 1619 | 1620 | ts-node@7.0.1: 1621 | version "7.0.1" 1622 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" 1623 | integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== 1624 | dependencies: 1625 | arrify "^1.0.0" 1626 | buffer-from "^1.1.0" 1627 | diff "^3.1.0" 1628 | make-error "^1.1.1" 1629 | minimist "^1.2.0" 1630 | mkdirp "^0.5.1" 1631 | source-map-support "^0.5.6" 1632 | yn "^2.0.0" 1633 | 1634 | tsconfig-paths@^3.5.0: 1635 | version "3.15.0" 1636 | resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz#5299ec605e55b1abb23ec939ef15edaf483070d4" 1637 | integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== 1638 | dependencies: 1639 | "@types/json5" "^0.0.29" 1640 | json5 "^1.0.2" 1641 | minimist "^1.2.6" 1642 | strip-bom "^3.0.0" 1643 | 1644 | tslib@^2.0.3, tslib@^2.4.0: 1645 | version "2.8.0" 1646 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.0.tgz#d124c86c3c05a40a91e6fdea4021bd31d377971b" 1647 | integrity sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA== 1648 | 1649 | type-check@^0.4.0, type-check@~0.4.0: 1650 | version "0.4.0" 1651 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" 1652 | integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== 1653 | dependencies: 1654 | prelude-ls "^1.2.1" 1655 | 1656 | type-detect@^4.0.0, type-detect@^4.1.0: 1657 | version "4.1.0" 1658 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.1.0.tgz#deb2453e8f08dcae7ae98c626b13dddb0155906c" 1659 | integrity sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw== 1660 | 1661 | type-fest@^0.20.2: 1662 | version "0.20.2" 1663 | resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" 1664 | integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== 1665 | 1666 | typescript@^5.3.3: 1667 | version "5.6.3" 1668 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" 1669 | integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== 1670 | 1671 | undici-types@~6.19.2: 1672 | version "6.19.8" 1673 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" 1674 | integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== 1675 | 1676 | uri-js@^4.2.2: 1677 | version "4.4.1" 1678 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" 1679 | integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== 1680 | dependencies: 1681 | punycode "^2.1.0" 1682 | 1683 | utf-8-validate@^5.0.2: 1684 | version "5.0.10" 1685 | resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" 1686 | integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== 1687 | dependencies: 1688 | node-gyp-build "^4.3.0" 1689 | 1690 | uuid@^8.3.2: 1691 | version "8.3.2" 1692 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 1693 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 1694 | 1695 | webidl-conversions@^3.0.0: 1696 | version "3.0.1" 1697 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 1698 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== 1699 | 1700 | whatwg-url@^5.0.0: 1701 | version "5.0.0" 1702 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 1703 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 1704 | dependencies: 1705 | tr46 "~0.0.3" 1706 | webidl-conversions "^3.0.0" 1707 | 1708 | which@^2.0.1: 1709 | version "2.0.2" 1710 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1711 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1712 | dependencies: 1713 | isexe "^2.0.0" 1714 | 1715 | word-wrap@^1.2.5: 1716 | version "1.2.5" 1717 | resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" 1718 | integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== 1719 | 1720 | workerpool@^6.5.1: 1721 | version "6.5.1" 1722 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.5.1.tgz#060f73b39d0caf97c6db64da004cd01b4c099544" 1723 | integrity sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA== 1724 | 1725 | wrap-ansi@^7.0.0: 1726 | version "7.0.0" 1727 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1728 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1729 | dependencies: 1730 | ansi-styles "^4.0.0" 1731 | string-width "^4.1.0" 1732 | strip-ansi "^6.0.0" 1733 | 1734 | wrappy@1: 1735 | version "1.0.2" 1736 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1737 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1738 | 1739 | ws@^7.5.10: 1740 | version "7.5.10" 1741 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" 1742 | integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== 1743 | 1744 | ws@^8.5.0: 1745 | version "8.18.0" 1746 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" 1747 | integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== 1748 | 1749 | y18n@^5.0.5: 1750 | version "5.0.8" 1751 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1752 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1753 | 1754 | yargs-parser@^20.2.2, yargs-parser@^20.2.9: 1755 | version "20.2.9" 1756 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1757 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1758 | 1759 | yargs-unparser@^2.0.0: 1760 | version "2.0.0" 1761 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1762 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1763 | dependencies: 1764 | camelcase "^6.0.0" 1765 | decamelize "^4.0.0" 1766 | flat "^5.0.2" 1767 | is-plain-obj "^2.1.0" 1768 | 1769 | yargs@^16.2.0: 1770 | version "16.2.0" 1771 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1772 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1773 | dependencies: 1774 | cliui "^7.0.2" 1775 | escalade "^3.1.1" 1776 | get-caller-file "^2.0.5" 1777 | require-directory "^2.1.1" 1778 | string-width "^4.2.0" 1779 | y18n "^5.0.5" 1780 | yargs-parser "^20.2.2" 1781 | 1782 | yn@^2.0.0: 1783 | version "2.0.0" 1784 | resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" 1785 | integrity sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ== 1786 | 1787 | yocto-queue@^0.1.0: 1788 | version "0.1.0" 1789 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1790 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1791 | --------------------------------------------------------------------------------