├── .gitignore ├── .travis.yml ├── Anchor.toml ├── Cargo.lock ├── Cargo.toml ├── LICENSE ├── README.md ├── SECURITY_AUDIT_REPORT.pdf ├── migrations └── deploy.js ├── package-lock.json ├── package.json ├── programs └── multisig │ ├── Cargo.toml │ ├── Xargo.toml │ └── src │ └── lib.rs └── tests └── multisig.js /.gitignore: -------------------------------------------------------------------------------- 1 | .anchor 2 | node_modules 3 | target 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | dist: bionic 2 | language: rust 3 | rust: 4 | - stable 5 | env: 6 | global: 7 | - NODE_VERSION="v14.7.0" 8 | - SOLANA_VERSION="v1.10.29" 9 | - ANCHOR_VERSION="v0.25.0" 10 | 11 | cache: 12 | directories: 13 | # solana 14 | - $HOME/.cache/solana/ 15 | - $HOME/.local/share/solana/ 16 | # Cargo 17 | - $HOME/.cargo/bin/ 18 | - $HOME/.cargo/registry/index/ 19 | - $HOME/.cargo/registry/cache/ 20 | - $HOME/.cargo/git/db/ 21 | - $TRAVIS_BUILD_DIR/target 22 | # npm 23 | - $HOME/.npm 24 | # - $TRAVIS_BUILD_DIR/node_modules 25 | 26 | before_deploy: 27 | - anchor build --verifiable 28 | - echo "### SHA256 Checksums" > release_notes.md 29 | - sha256sum target/deploy/coral_multisig.so > binary.txt 30 | - sha256sum target/idl/coral_multisig.json > idl.txt 31 | - cat *.txt >> release_notes.md 32 | - echo "" >> release_notes.md 33 | - echo "Built with Anchor [${ANCHOR_VERSION}](https://github.com/coral-xyz/anchor/releases/tag/${ANCHOR_VERSION})." >> release_notes.md 34 | 35 | deploy: 36 | provider: releases 37 | edge: true 38 | file: 39 | - "target/deploy/coral_multisig.so" 40 | - "target/idl/coral_multisig.json" 41 | release_notes_file: release_notes.md 42 | skip_cleanup: true 43 | on: 44 | tags: true 45 | api_key: 46 | secure: MRahuKj/FhxUwkkvqiI3wJYWKzJ0PVl25ZfFhp5lA7xyYYj/heQOdX1rE8I3MkyBOWlSNAN89JXKQ61czOrkpjK/vjBt7/49iCkWuBd+ZQ0SOjrdFubAMl4ypd3C56v28Q/Rh5bAgm8IiJNeCidfWjiu36ibjAHMAxkwAssp76AV0hboWMJx6i4i8W/iFC8hQhiFa4npkTkrCtL4Vt8qY0fwqNRRpMZBIz22ZglYbhWpkaPMeikFun7Fjn9dvT0PM/xtcjTYOf4sxdjItpYjR0fUF+thuR+z4McgeYko3AZG9Sv8RMvw6yU1Hpq/Okk1wXcxNHyDtz/YriwiPgVzcIW2SGW2YxXh8YZEQFJuVodM8udYjFuNHy+qcNDiCvcoNIj2zYP3iWEVpiv4a3Hr33T/+iGTqLkjlnHcLKI8m2ykbHFtmNEmg6P4faayYkDSeEKRMZSDuA+CKh07LVlBQFyIRB3tfw3+tdBGQXQojgxAwuxnfANhScMpSdjZtdJCS912ijzVeSGa6C33+/fpAqQtCQqwJx+Bl6Bytvq+nBSjojWJZUqvE53IFwD5/bSd6FUIyAQMnQ6t8dOF+OWx0a1rFtpfLYYKZwei8kZlWNd4BLs+V0jkyHTzy0Cztre/EcmXdAHxAX8XrcrWt9sC1gwpApdrtZ20zZhEHsdgY/k= 47 | 48 | _defaults: &defaults 49 | before_install: 50 | - nvm install $NODE_VERSION 51 | - npm ci 52 | - sudo apt-get install -y pkg-config build-essential libudev-dev 53 | - sh -c "$(curl -sSfL https://release.solana.com/${SOLANA_VERSION}/install)" 54 | - export PATH="/home/travis/.local/share/solana/install/active_release/bin:$PATH" 55 | - export NODE_PATH="/home/travis/.nvm/versions/node/${NODE_VERSION}/lib/node_modules/:${NODE_PATH}" 56 | - yes | solana-keygen new 57 | 58 | jobs: 59 | include: 60 | - <<: *defaults 61 | name: Runs the tests 62 | script: 63 | - npx anchor build 64 | - npx anchor test 65 | - <<: *defaults 66 | name: Linting & clippy 67 | script: 68 | - npm run lint 69 | - rustup component add rustfmt clippy 70 | - cargo-fmt --all -- --check 71 | - cargo clippy --all-targets 72 | -------------------------------------------------------------------------------- /Anchor.toml: -------------------------------------------------------------------------------- 1 | [features] 2 | seeds = true 3 | 4 | [programs.mainnet] 5 | coral_multisig = "msigUdDBsR4zSUYqYEDrc1LcgtmuSDDM7KxpRUXNC6U" 6 | 7 | [programs.devnet] 8 | coral_multisig = "msigUdDBsR4zSUYqYEDrc1LcgtmuSDDM7KxpRUXNC6U" 9 | 10 | [programs.localnet] 11 | coral_multisig = "msigUdDBsR4zSUYqYEDrc1LcgtmuSDDM7KxpRUXNC6U" 12 | 13 | [registry] 14 | url = "https://api.apr.dev" 15 | 16 | [provider] 17 | cluster = "localnet" 18 | wallet = "~/.config/solana/id.json" 19 | 20 | [scripts] 21 | test = "npx mocha -t 1000000 tests/" 22 | -------------------------------------------------------------------------------- /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.4.7" 8 | source = "registry+https://github.com/rust-lang/crates.io-index" 9 | checksum = "739f4a8db6605981345c5654f3a85b056ce52f37a39d34da03f25bf2151ea16e" 10 | 11 | [[package]] 12 | name = "aho-corasick" 13 | version = "0.7.15" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" 16 | dependencies = [ 17 | "memchr", 18 | ] 19 | 20 | [[package]] 21 | name = "anchor-attribute-access-control" 22 | version = "0.25.0" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "70f6ee9518f50ff4d434471ccf569186022bdd5ef65a21d14da3ea5231af944f" 25 | dependencies = [ 26 | "anchor-syn", 27 | "anyhow", 28 | "proc-macro2", 29 | "quote", 30 | "regex", 31 | "syn", 32 | ] 33 | 34 | [[package]] 35 | name = "anchor-attribute-account" 36 | version = "0.25.0" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | checksum = "32c92bcf5388b52676d990f85bbfd838a8f5672393135063a50dc79b2b837c79" 39 | dependencies = [ 40 | "anchor-syn", 41 | "anyhow", 42 | "bs58 0.4.0", 43 | "proc-macro2", 44 | "quote", 45 | "rustversion", 46 | "syn", 47 | ] 48 | 49 | [[package]] 50 | name = "anchor-attribute-constant" 51 | version = "0.25.0" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "0844974ac35e8ced62056b0d63777ebcdc5807438b8b189c881e2b647450b70a" 54 | dependencies = [ 55 | "anchor-syn", 56 | "proc-macro2", 57 | "syn", 58 | ] 59 | 60 | [[package]] 61 | name = "anchor-attribute-error" 62 | version = "0.25.0" 63 | source = "registry+https://github.com/rust-lang/crates.io-index" 64 | checksum = "0f7467345e67a6f1d4b862b9763a4160ad89d18c247b8c902807768f7b6e23df" 65 | dependencies = [ 66 | "anchor-syn", 67 | "proc-macro2", 68 | "quote", 69 | "syn", 70 | ] 71 | 72 | [[package]] 73 | name = "anchor-attribute-event" 74 | version = "0.25.0" 75 | source = "registry+https://github.com/rust-lang/crates.io-index" 76 | checksum = "8774e4c1ac71f71a5aea7e4932fb69c30e3b8155c4fa59fd69401195434528a9" 77 | dependencies = [ 78 | "anchor-syn", 79 | "anyhow", 80 | "proc-macro2", 81 | "quote", 82 | "syn", 83 | ] 84 | 85 | [[package]] 86 | name = "anchor-attribute-interface" 87 | version = "0.25.0" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "90eeb6e1c80f9f94fcef93a52813f6472186200e275e83cb3fac92b801de92f7" 90 | dependencies = [ 91 | "anchor-syn", 92 | "anyhow", 93 | "heck", 94 | "proc-macro2", 95 | "quote", 96 | "syn", 97 | ] 98 | 99 | [[package]] 100 | name = "anchor-attribute-program" 101 | version = "0.25.0" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | checksum = "ac515a7a5a4fea7fc768b1cec40ddb948e148ea657637c75f94f283212326cb9" 104 | dependencies = [ 105 | "anchor-syn", 106 | "anyhow", 107 | "proc-macro2", 108 | "quote", 109 | "syn", 110 | ] 111 | 112 | [[package]] 113 | name = "anchor-attribute-state" 114 | version = "0.25.0" 115 | source = "registry+https://github.com/rust-lang/crates.io-index" 116 | checksum = "43dc667b62ff71450f19dcfcc37b0c408fd4ddd89e8650368c2b0984b110603f" 117 | dependencies = [ 118 | "anchor-syn", 119 | "anyhow", 120 | "proc-macro2", 121 | "quote", 122 | "syn", 123 | ] 124 | 125 | [[package]] 126 | name = "anchor-derive-accounts" 127 | version = "0.25.0" 128 | source = "registry+https://github.com/rust-lang/crates.io-index" 129 | checksum = "7354d583a06701d24800a8ec4c2b0491f62581a331af349205e23421e0b56643" 130 | dependencies = [ 131 | "anchor-syn", 132 | "anyhow", 133 | "proc-macro2", 134 | "quote", 135 | "syn", 136 | ] 137 | 138 | [[package]] 139 | name = "anchor-lang" 140 | version = "0.25.0" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "ff5f57ec5e12fa6874b27f3d5c1f6f44302d3ad86c1266197ff7611bf6f5d251" 143 | dependencies = [ 144 | "anchor-attribute-access-control", 145 | "anchor-attribute-account", 146 | "anchor-attribute-constant", 147 | "anchor-attribute-error", 148 | "anchor-attribute-event", 149 | "anchor-attribute-interface", 150 | "anchor-attribute-program", 151 | "anchor-attribute-state", 152 | "anchor-derive-accounts", 153 | "arrayref", 154 | "base64 0.13.0", 155 | "bincode", 156 | "borsh", 157 | "bytemuck", 158 | "solana-program", 159 | "thiserror", 160 | ] 161 | 162 | [[package]] 163 | name = "anchor-syn" 164 | version = "0.25.0" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "55aa1e680d9471342122ed5b6bc13bf5da473b0f7e4677d41a6954e5cc8ad155" 167 | dependencies = [ 168 | "anyhow", 169 | "bs58 0.3.1", 170 | "heck", 171 | "proc-macro2", 172 | "proc-macro2-diagnostics", 173 | "quote", 174 | "serde", 175 | "serde_json", 176 | "sha2 0.9.9", 177 | "syn", 178 | "thiserror", 179 | ] 180 | 181 | [[package]] 182 | name = "anyhow" 183 | version = "1.0.38" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | checksum = "afddf7f520a80dbf76e6f50a35bca42a2331ef227a28b3b6dc5c2e2338d114b1" 186 | 187 | [[package]] 188 | name = "arrayref" 189 | version = "0.3.6" 190 | source = "registry+https://github.com/rust-lang/crates.io-index" 191 | checksum = "a4c527152e37cf757a3f78aae5a06fbeefdb07ccc535c980a3208ee3060dd544" 192 | 193 | [[package]] 194 | name = "arrayvec" 195 | version = "0.7.2" 196 | source = "registry+https://github.com/rust-lang/crates.io-index" 197 | checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" 198 | 199 | [[package]] 200 | name = "autocfg" 201 | version = "1.1.0" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" 204 | 205 | [[package]] 206 | name = "base64" 207 | version = "0.12.3" 208 | source = "registry+https://github.com/rust-lang/crates.io-index" 209 | checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" 210 | 211 | [[package]] 212 | name = "base64" 213 | version = "0.13.0" 214 | source = "registry+https://github.com/rust-lang/crates.io-index" 215 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 216 | 217 | [[package]] 218 | name = "bincode" 219 | version = "1.3.3" 220 | source = "registry+https://github.com/rust-lang/crates.io-index" 221 | checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" 222 | dependencies = [ 223 | "serde", 224 | ] 225 | 226 | [[package]] 227 | name = "bitflags" 228 | version = "1.3.2" 229 | source = "registry+https://github.com/rust-lang/crates.io-index" 230 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 231 | 232 | [[package]] 233 | name = "bitmaps" 234 | version = "2.1.0" 235 | source = "registry+https://github.com/rust-lang/crates.io-index" 236 | checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2" 237 | dependencies = [ 238 | "typenum", 239 | ] 240 | 241 | [[package]] 242 | name = "blake3" 243 | version = "1.3.1" 244 | source = "registry+https://github.com/rust-lang/crates.io-index" 245 | checksum = "a08e53fc5a564bb15bfe6fae56bd71522205f1f91893f9c0116edad6496c183f" 246 | dependencies = [ 247 | "arrayref", 248 | "arrayvec", 249 | "cc", 250 | "cfg-if", 251 | "constant_time_eq", 252 | "digest 0.10.5", 253 | ] 254 | 255 | [[package]] 256 | name = "block-buffer" 257 | version = "0.9.0" 258 | source = "registry+https://github.com/rust-lang/crates.io-index" 259 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 260 | dependencies = [ 261 | "generic-array", 262 | ] 263 | 264 | [[package]] 265 | name = "block-buffer" 266 | version = "0.10.2" 267 | source = "registry+https://github.com/rust-lang/crates.io-index" 268 | checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324" 269 | dependencies = [ 270 | "generic-array", 271 | ] 272 | 273 | [[package]] 274 | name = "borsh" 275 | version = "0.9.1" 276 | source = "registry+https://github.com/rust-lang/crates.io-index" 277 | checksum = "18dda7dc709193c0d86a1a51050a926dc3df1cf262ec46a23a25dba421ea1924" 278 | dependencies = [ 279 | "borsh-derive", 280 | "hashbrown", 281 | ] 282 | 283 | [[package]] 284 | name = "borsh-derive" 285 | version = "0.9.1" 286 | source = "registry+https://github.com/rust-lang/crates.io-index" 287 | checksum = "684155372435f578c0fa1acd13ebbb182cc19d6b38b64ae7901da4393217d264" 288 | dependencies = [ 289 | "borsh-derive-internal", 290 | "borsh-schema-derive-internal", 291 | "proc-macro-crate", 292 | "proc-macro2", 293 | "syn", 294 | ] 295 | 296 | [[package]] 297 | name = "borsh-derive-internal" 298 | version = "0.9.1" 299 | source = "registry+https://github.com/rust-lang/crates.io-index" 300 | checksum = "2102f62f8b6d3edeab871830782285b64cc1830168094db05c8e458f209bc5c3" 301 | dependencies = [ 302 | "proc-macro2", 303 | "quote", 304 | "syn", 305 | ] 306 | 307 | [[package]] 308 | name = "borsh-schema-derive-internal" 309 | version = "0.9.1" 310 | source = "registry+https://github.com/rust-lang/crates.io-index" 311 | checksum = "196c978c4c9b0b142d446ef3240690bf5a8a33497074a113ff9a337ccb750483" 312 | dependencies = [ 313 | "proc-macro2", 314 | "quote", 315 | "syn", 316 | ] 317 | 318 | [[package]] 319 | name = "bs58" 320 | version = "0.3.1" 321 | source = "registry+https://github.com/rust-lang/crates.io-index" 322 | checksum = "476e9cd489f9e121e02ffa6014a8ef220ecb15c05ed23fc34cca13925dc283fb" 323 | 324 | [[package]] 325 | name = "bs58" 326 | version = "0.4.0" 327 | source = "registry+https://github.com/rust-lang/crates.io-index" 328 | checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" 329 | 330 | [[package]] 331 | name = "bumpalo" 332 | version = "3.9.1" 333 | source = "registry+https://github.com/rust-lang/crates.io-index" 334 | checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" 335 | 336 | [[package]] 337 | name = "bv" 338 | version = "0.11.1" 339 | source = "registry+https://github.com/rust-lang/crates.io-index" 340 | checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" 341 | dependencies = [ 342 | "feature-probe", 343 | "serde", 344 | ] 345 | 346 | [[package]] 347 | name = "bytemuck" 348 | version = "1.7.3" 349 | source = "registry+https://github.com/rust-lang/crates.io-index" 350 | checksum = "439989e6b8c38d1b6570a384ef1e49c8848128f5a97f3914baef02920842712f" 351 | dependencies = [ 352 | "bytemuck_derive", 353 | ] 354 | 355 | [[package]] 356 | name = "bytemuck_derive" 357 | version = "1.0.1" 358 | source = "registry+https://github.com/rust-lang/crates.io-index" 359 | checksum = "8e215f8c2f9f79cb53c8335e687ffd07d5bfcb6fe5fc80723762d0be46e7cc54" 360 | dependencies = [ 361 | "proc-macro2", 362 | "quote", 363 | "syn", 364 | ] 365 | 366 | [[package]] 367 | name = "byteorder" 368 | version = "1.3.4" 369 | source = "registry+https://github.com/rust-lang/crates.io-index" 370 | checksum = "08c48aae112d48ed9f069b33538ea9e3e90aa263cfa3d1c24309612b1f7472de" 371 | 372 | [[package]] 373 | name = "cc" 374 | version = "1.0.67" 375 | source = "registry+https://github.com/rust-lang/crates.io-index" 376 | checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" 377 | 378 | [[package]] 379 | name = "cfg-if" 380 | version = "1.0.0" 381 | source = "registry+https://github.com/rust-lang/crates.io-index" 382 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 383 | 384 | [[package]] 385 | name = "console_error_panic_hook" 386 | version = "0.1.7" 387 | source = "registry+https://github.com/rust-lang/crates.io-index" 388 | checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" 389 | dependencies = [ 390 | "cfg-if", 391 | "wasm-bindgen", 392 | ] 393 | 394 | [[package]] 395 | name = "console_log" 396 | version = "0.2.0" 397 | source = "registry+https://github.com/rust-lang/crates.io-index" 398 | checksum = "501a375961cef1a0d44767200e66e4a559283097e91d0730b1d75dfb2f8a1494" 399 | dependencies = [ 400 | "log", 401 | "web-sys", 402 | ] 403 | 404 | [[package]] 405 | name = "constant_time_eq" 406 | version = "0.1.5" 407 | source = "registry+https://github.com/rust-lang/crates.io-index" 408 | checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 409 | 410 | [[package]] 411 | name = "coral-multisig" 412 | version = "0.9.0" 413 | dependencies = [ 414 | "anchor-lang", 415 | ] 416 | 417 | [[package]] 418 | name = "cpufeatures" 419 | version = "0.2.2" 420 | source = "registry+https://github.com/rust-lang/crates.io-index" 421 | checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b" 422 | dependencies = [ 423 | "libc", 424 | ] 425 | 426 | [[package]] 427 | name = "crossbeam-channel" 428 | version = "0.5.6" 429 | source = "registry+https://github.com/rust-lang/crates.io-index" 430 | checksum = "c2dd04ddaf88237dc3b8d8f9a3c1004b506b54b3313403944054d23c0870c521" 431 | dependencies = [ 432 | "cfg-if", 433 | "crossbeam-utils", 434 | ] 435 | 436 | [[package]] 437 | name = "crossbeam-deque" 438 | version = "0.8.2" 439 | source = "registry+https://github.com/rust-lang/crates.io-index" 440 | checksum = "715e8152b692bba2d374b53d4875445368fdf21a94751410af607a5ac677d1fc" 441 | dependencies = [ 442 | "cfg-if", 443 | "crossbeam-epoch", 444 | "crossbeam-utils", 445 | ] 446 | 447 | [[package]] 448 | name = "crossbeam-epoch" 449 | version = "0.9.11" 450 | source = "registry+https://github.com/rust-lang/crates.io-index" 451 | checksum = "f916dfc5d356b0ed9dae65f1db9fc9770aa2851d2662b988ccf4fe3516e86348" 452 | dependencies = [ 453 | "autocfg", 454 | "cfg-if", 455 | "crossbeam-utils", 456 | "memoffset", 457 | "scopeguard", 458 | ] 459 | 460 | [[package]] 461 | name = "crossbeam-utils" 462 | version = "0.8.12" 463 | source = "registry+https://github.com/rust-lang/crates.io-index" 464 | checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" 465 | dependencies = [ 466 | "cfg-if", 467 | ] 468 | 469 | [[package]] 470 | name = "crunchy" 471 | version = "0.2.2" 472 | source = "registry+https://github.com/rust-lang/crates.io-index" 473 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 474 | 475 | [[package]] 476 | name = "crypto-common" 477 | version = "0.1.6" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" 480 | dependencies = [ 481 | "generic-array", 482 | "typenum", 483 | ] 484 | 485 | [[package]] 486 | name = "crypto-mac" 487 | version = "0.8.0" 488 | source = "registry+https://github.com/rust-lang/crates.io-index" 489 | checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" 490 | dependencies = [ 491 | "generic-array", 492 | "subtle", 493 | ] 494 | 495 | [[package]] 496 | name = "curve25519-dalek" 497 | version = "3.2.1" 498 | source = "registry+https://github.com/rust-lang/crates.io-index" 499 | checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" 500 | dependencies = [ 501 | "byteorder", 502 | "digest 0.9.0", 503 | "rand_core 0.5.1", 504 | "subtle", 505 | "zeroize", 506 | ] 507 | 508 | [[package]] 509 | name = "digest" 510 | version = "0.9.0" 511 | source = "registry+https://github.com/rust-lang/crates.io-index" 512 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 513 | dependencies = [ 514 | "generic-array", 515 | ] 516 | 517 | [[package]] 518 | name = "digest" 519 | version = "0.10.5" 520 | source = "registry+https://github.com/rust-lang/crates.io-index" 521 | checksum = "adfbc57365a37acbd2ebf2b64d7e69bb766e2fea813521ed536f5d0520dcf86c" 522 | dependencies = [ 523 | "block-buffer 0.10.2", 524 | "crypto-common", 525 | "subtle", 526 | ] 527 | 528 | [[package]] 529 | name = "either" 530 | version = "1.6.1" 531 | source = "registry+https://github.com/rust-lang/crates.io-index" 532 | checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" 533 | 534 | [[package]] 535 | name = "feature-probe" 536 | version = "0.1.1" 537 | source = "registry+https://github.com/rust-lang/crates.io-index" 538 | checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" 539 | 540 | [[package]] 541 | name = "generic-array" 542 | version = "0.14.6" 543 | source = "registry+https://github.com/rust-lang/crates.io-index" 544 | checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" 545 | dependencies = [ 546 | "serde", 547 | "typenum", 548 | "version_check", 549 | ] 550 | 551 | [[package]] 552 | name = "getrandom" 553 | version = "0.1.16" 554 | source = "registry+https://github.com/rust-lang/crates.io-index" 555 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 556 | dependencies = [ 557 | "cfg-if", 558 | "js-sys", 559 | "libc", 560 | "wasi", 561 | "wasm-bindgen", 562 | ] 563 | 564 | [[package]] 565 | name = "hashbrown" 566 | version = "0.9.1" 567 | source = "registry+https://github.com/rust-lang/crates.io-index" 568 | checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" 569 | dependencies = [ 570 | "ahash", 571 | ] 572 | 573 | [[package]] 574 | name = "heck" 575 | version = "0.3.2" 576 | source = "registry+https://github.com/rust-lang/crates.io-index" 577 | checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac" 578 | dependencies = [ 579 | "unicode-segmentation", 580 | ] 581 | 582 | [[package]] 583 | name = "hermit-abi" 584 | version = "0.1.18" 585 | source = "registry+https://github.com/rust-lang/crates.io-index" 586 | checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" 587 | dependencies = [ 588 | "libc", 589 | ] 590 | 591 | [[package]] 592 | name = "hmac" 593 | version = "0.8.1" 594 | source = "registry+https://github.com/rust-lang/crates.io-index" 595 | checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" 596 | dependencies = [ 597 | "crypto-mac", 598 | "digest 0.9.0", 599 | ] 600 | 601 | [[package]] 602 | name = "hmac-drbg" 603 | version = "0.3.0" 604 | source = "registry+https://github.com/rust-lang/crates.io-index" 605 | checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" 606 | dependencies = [ 607 | "digest 0.9.0", 608 | "generic-array", 609 | "hmac", 610 | ] 611 | 612 | [[package]] 613 | name = "im" 614 | version = "15.1.0" 615 | source = "registry+https://github.com/rust-lang/crates.io-index" 616 | checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9" 617 | dependencies = [ 618 | "bitmaps", 619 | "rand_core 0.6.4", 620 | "rand_xoshiro", 621 | "rayon", 622 | "serde", 623 | "sized-chunks", 624 | "typenum", 625 | "version_check", 626 | ] 627 | 628 | [[package]] 629 | name = "itertools" 630 | version = "0.10.3" 631 | source = "registry+https://github.com/rust-lang/crates.io-index" 632 | checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" 633 | dependencies = [ 634 | "either", 635 | ] 636 | 637 | [[package]] 638 | name = "itoa" 639 | version = "0.4.7" 640 | source = "registry+https://github.com/rust-lang/crates.io-index" 641 | checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736" 642 | 643 | [[package]] 644 | name = "js-sys" 645 | version = "0.3.57" 646 | source = "registry+https://github.com/rust-lang/crates.io-index" 647 | checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397" 648 | dependencies = [ 649 | "wasm-bindgen", 650 | ] 651 | 652 | [[package]] 653 | name = "keccak" 654 | version = "0.1.0" 655 | source = "registry+https://github.com/rust-lang/crates.io-index" 656 | checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" 657 | 658 | [[package]] 659 | name = "lazy_static" 660 | version = "1.4.0" 661 | source = "registry+https://github.com/rust-lang/crates.io-index" 662 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 663 | 664 | [[package]] 665 | name = "libc" 666 | version = "0.2.125" 667 | source = "registry+https://github.com/rust-lang/crates.io-index" 668 | checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b" 669 | 670 | [[package]] 671 | name = "libsecp256k1" 672 | version = "0.6.0" 673 | source = "registry+https://github.com/rust-lang/crates.io-index" 674 | checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" 675 | dependencies = [ 676 | "arrayref", 677 | "base64 0.12.3", 678 | "digest 0.9.0", 679 | "hmac-drbg", 680 | "libsecp256k1-core", 681 | "libsecp256k1-gen-ecmult", 682 | "libsecp256k1-gen-genmult", 683 | "rand", 684 | "serde", 685 | "sha2 0.9.9", 686 | "typenum", 687 | ] 688 | 689 | [[package]] 690 | name = "libsecp256k1-core" 691 | version = "0.2.2" 692 | source = "registry+https://github.com/rust-lang/crates.io-index" 693 | checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" 694 | dependencies = [ 695 | "crunchy", 696 | "digest 0.9.0", 697 | "subtle", 698 | ] 699 | 700 | [[package]] 701 | name = "libsecp256k1-gen-ecmult" 702 | version = "0.2.1" 703 | source = "registry+https://github.com/rust-lang/crates.io-index" 704 | checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" 705 | dependencies = [ 706 | "libsecp256k1-core", 707 | ] 708 | 709 | [[package]] 710 | name = "libsecp256k1-gen-genmult" 711 | version = "0.2.1" 712 | source = "registry+https://github.com/rust-lang/crates.io-index" 713 | checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" 714 | dependencies = [ 715 | "libsecp256k1-core", 716 | ] 717 | 718 | [[package]] 719 | name = "lock_api" 720 | version = "0.4.7" 721 | source = "registry+https://github.com/rust-lang/crates.io-index" 722 | checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53" 723 | dependencies = [ 724 | "autocfg", 725 | "scopeguard", 726 | ] 727 | 728 | [[package]] 729 | name = "log" 730 | version = "0.4.14" 731 | source = "registry+https://github.com/rust-lang/crates.io-index" 732 | checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" 733 | dependencies = [ 734 | "cfg-if", 735 | ] 736 | 737 | [[package]] 738 | name = "memchr" 739 | version = "2.3.4" 740 | source = "registry+https://github.com/rust-lang/crates.io-index" 741 | checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" 742 | 743 | [[package]] 744 | name = "memmap2" 745 | version = "0.5.3" 746 | source = "registry+https://github.com/rust-lang/crates.io-index" 747 | checksum = "057a3db23999c867821a7a59feb06a578fcb03685e983dff90daf9e7d24ac08f" 748 | dependencies = [ 749 | "libc", 750 | ] 751 | 752 | [[package]] 753 | name = "memoffset" 754 | version = "0.6.5" 755 | source = "registry+https://github.com/rust-lang/crates.io-index" 756 | checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" 757 | dependencies = [ 758 | "autocfg", 759 | ] 760 | 761 | [[package]] 762 | name = "num-derive" 763 | version = "0.3.3" 764 | source = "registry+https://github.com/rust-lang/crates.io-index" 765 | checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" 766 | dependencies = [ 767 | "proc-macro2", 768 | "quote", 769 | "syn", 770 | ] 771 | 772 | [[package]] 773 | name = "num-traits" 774 | version = "0.2.14" 775 | source = "registry+https://github.com/rust-lang/crates.io-index" 776 | checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" 777 | dependencies = [ 778 | "autocfg", 779 | ] 780 | 781 | [[package]] 782 | name = "num_cpus" 783 | version = "1.13.1" 784 | source = "registry+https://github.com/rust-lang/crates.io-index" 785 | checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1" 786 | dependencies = [ 787 | "hermit-abi", 788 | "libc", 789 | ] 790 | 791 | [[package]] 792 | name = "once_cell" 793 | version = "1.7.2" 794 | source = "registry+https://github.com/rust-lang/crates.io-index" 795 | checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" 796 | 797 | [[package]] 798 | name = "opaque-debug" 799 | version = "0.3.0" 800 | source = "registry+https://github.com/rust-lang/crates.io-index" 801 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 802 | 803 | [[package]] 804 | name = "parking_lot" 805 | version = "0.12.1" 806 | source = "registry+https://github.com/rust-lang/crates.io-index" 807 | checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" 808 | dependencies = [ 809 | "lock_api", 810 | "parking_lot_core", 811 | ] 812 | 813 | [[package]] 814 | name = "parking_lot_core" 815 | version = "0.9.4" 816 | source = "registry+https://github.com/rust-lang/crates.io-index" 817 | checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0" 818 | dependencies = [ 819 | "cfg-if", 820 | "libc", 821 | "redox_syscall", 822 | "smallvec", 823 | "windows-sys", 824 | ] 825 | 826 | [[package]] 827 | name = "ppv-lite86" 828 | version = "0.2.10" 829 | source = "registry+https://github.com/rust-lang/crates.io-index" 830 | checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" 831 | 832 | [[package]] 833 | name = "proc-macro-crate" 834 | version = "0.1.5" 835 | source = "registry+https://github.com/rust-lang/crates.io-index" 836 | checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" 837 | dependencies = [ 838 | "toml", 839 | ] 840 | 841 | [[package]] 842 | name = "proc-macro2" 843 | version = "1.0.36" 844 | source = "registry+https://github.com/rust-lang/crates.io-index" 845 | checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" 846 | dependencies = [ 847 | "unicode-xid", 848 | ] 849 | 850 | [[package]] 851 | name = "proc-macro2-diagnostics" 852 | version = "0.9.1" 853 | source = "registry+https://github.com/rust-lang/crates.io-index" 854 | checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" 855 | dependencies = [ 856 | "proc-macro2", 857 | "quote", 858 | "syn", 859 | "version_check", 860 | "yansi", 861 | ] 862 | 863 | [[package]] 864 | name = "quote" 865 | version = "1.0.9" 866 | source = "registry+https://github.com/rust-lang/crates.io-index" 867 | checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" 868 | dependencies = [ 869 | "proc-macro2", 870 | ] 871 | 872 | [[package]] 873 | name = "rand" 874 | version = "0.7.3" 875 | source = "registry+https://github.com/rust-lang/crates.io-index" 876 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 877 | dependencies = [ 878 | "getrandom", 879 | "libc", 880 | "rand_chacha", 881 | "rand_core 0.5.1", 882 | "rand_hc", 883 | ] 884 | 885 | [[package]] 886 | name = "rand_chacha" 887 | version = "0.2.2" 888 | source = "registry+https://github.com/rust-lang/crates.io-index" 889 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 890 | dependencies = [ 891 | "ppv-lite86", 892 | "rand_core 0.5.1", 893 | ] 894 | 895 | [[package]] 896 | name = "rand_core" 897 | version = "0.5.1" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 900 | dependencies = [ 901 | "getrandom", 902 | ] 903 | 904 | [[package]] 905 | name = "rand_core" 906 | version = "0.6.4" 907 | source = "registry+https://github.com/rust-lang/crates.io-index" 908 | checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" 909 | 910 | [[package]] 911 | name = "rand_hc" 912 | version = "0.2.0" 913 | source = "registry+https://github.com/rust-lang/crates.io-index" 914 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 915 | dependencies = [ 916 | "rand_core 0.5.1", 917 | ] 918 | 919 | [[package]] 920 | name = "rand_xoshiro" 921 | version = "0.6.0" 922 | source = "registry+https://github.com/rust-lang/crates.io-index" 923 | checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" 924 | dependencies = [ 925 | "rand_core 0.6.4", 926 | ] 927 | 928 | [[package]] 929 | name = "rayon" 930 | version = "1.5.3" 931 | source = "registry+https://github.com/rust-lang/crates.io-index" 932 | checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d" 933 | dependencies = [ 934 | "autocfg", 935 | "crossbeam-deque", 936 | "either", 937 | "rayon-core", 938 | ] 939 | 940 | [[package]] 941 | name = "rayon-core" 942 | version = "1.9.3" 943 | source = "registry+https://github.com/rust-lang/crates.io-index" 944 | checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f" 945 | dependencies = [ 946 | "crossbeam-channel", 947 | "crossbeam-deque", 948 | "crossbeam-utils", 949 | "num_cpus", 950 | ] 951 | 952 | [[package]] 953 | name = "redox_syscall" 954 | version = "0.2.13" 955 | source = "registry+https://github.com/rust-lang/crates.io-index" 956 | checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42" 957 | dependencies = [ 958 | "bitflags", 959 | ] 960 | 961 | [[package]] 962 | name = "regex" 963 | version = "1.4.3" 964 | source = "registry+https://github.com/rust-lang/crates.io-index" 965 | checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a" 966 | dependencies = [ 967 | "aho-corasick", 968 | "memchr", 969 | "regex-syntax", 970 | "thread_local", 971 | ] 972 | 973 | [[package]] 974 | name = "regex-syntax" 975 | version = "0.6.22" 976 | source = "registry+https://github.com/rust-lang/crates.io-index" 977 | checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581" 978 | 979 | [[package]] 980 | name = "rustc_version" 981 | version = "0.4.0" 982 | source = "registry+https://github.com/rust-lang/crates.io-index" 983 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 984 | dependencies = [ 985 | "semver", 986 | ] 987 | 988 | [[package]] 989 | name = "rustversion" 990 | version = "1.0.4" 991 | source = "registry+https://github.com/rust-lang/crates.io-index" 992 | checksum = "cb5d2a036dc6d2d8fd16fde3498b04306e29bd193bf306a57427019b823d5acd" 993 | 994 | [[package]] 995 | name = "ryu" 996 | version = "1.0.5" 997 | source = "registry+https://github.com/rust-lang/crates.io-index" 998 | checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" 999 | 1000 | [[package]] 1001 | name = "scopeguard" 1002 | version = "1.1.0" 1003 | source = "registry+https://github.com/rust-lang/crates.io-index" 1004 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 1005 | 1006 | [[package]] 1007 | name = "semver" 1008 | version = "1.0.9" 1009 | source = "registry+https://github.com/rust-lang/crates.io-index" 1010 | checksum = "8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd" 1011 | 1012 | [[package]] 1013 | name = "serde" 1014 | version = "1.0.137" 1015 | source = "registry+https://github.com/rust-lang/crates.io-index" 1016 | checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1" 1017 | dependencies = [ 1018 | "serde_derive", 1019 | ] 1020 | 1021 | [[package]] 1022 | name = "serde_bytes" 1023 | version = "0.11.5" 1024 | source = "registry+https://github.com/rust-lang/crates.io-index" 1025 | checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" 1026 | dependencies = [ 1027 | "serde", 1028 | ] 1029 | 1030 | [[package]] 1031 | name = "serde_derive" 1032 | version = "1.0.137" 1033 | source = "registry+https://github.com/rust-lang/crates.io-index" 1034 | checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be" 1035 | dependencies = [ 1036 | "proc-macro2", 1037 | "quote", 1038 | "syn", 1039 | ] 1040 | 1041 | [[package]] 1042 | name = "serde_json" 1043 | version = "1.0.64" 1044 | source = "registry+https://github.com/rust-lang/crates.io-index" 1045 | checksum = "799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79" 1046 | dependencies = [ 1047 | "itoa", 1048 | "ryu", 1049 | "serde", 1050 | ] 1051 | 1052 | [[package]] 1053 | name = "sha2" 1054 | version = "0.9.9" 1055 | source = "registry+https://github.com/rust-lang/crates.io-index" 1056 | checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" 1057 | dependencies = [ 1058 | "block-buffer 0.9.0", 1059 | "cfg-if", 1060 | "cpufeatures", 1061 | "digest 0.9.0", 1062 | "opaque-debug", 1063 | ] 1064 | 1065 | [[package]] 1066 | name = "sha2" 1067 | version = "0.10.6" 1068 | source = "registry+https://github.com/rust-lang/crates.io-index" 1069 | checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" 1070 | dependencies = [ 1071 | "cfg-if", 1072 | "cpufeatures", 1073 | "digest 0.10.5", 1074 | ] 1075 | 1076 | [[package]] 1077 | name = "sha3" 1078 | version = "0.10.6" 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" 1080 | checksum = "bdf0c33fae925bdc080598b84bc15c55e7b9a4a43b3c704da051f977469691c9" 1081 | dependencies = [ 1082 | "digest 0.10.5", 1083 | "keccak", 1084 | ] 1085 | 1086 | [[package]] 1087 | name = "sized-chunks" 1088 | version = "0.6.5" 1089 | source = "registry+https://github.com/rust-lang/crates.io-index" 1090 | checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e" 1091 | dependencies = [ 1092 | "bitmaps", 1093 | "typenum", 1094 | ] 1095 | 1096 | [[package]] 1097 | name = "smallvec" 1098 | version = "1.8.0" 1099 | source = "registry+https://github.com/rust-lang/crates.io-index" 1100 | checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" 1101 | 1102 | [[package]] 1103 | name = "solana-frozen-abi" 1104 | version = "1.10.41" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | checksum = "d343b3838e95561548a2a651787d17aebf0a3f490f193746ee58f174f65bd7c3" 1107 | dependencies = [ 1108 | "bs58 0.4.0", 1109 | "bv", 1110 | "generic-array", 1111 | "im", 1112 | "lazy_static", 1113 | "log", 1114 | "memmap2", 1115 | "rustc_version", 1116 | "serde", 1117 | "serde_bytes", 1118 | "serde_derive", 1119 | "sha2 0.10.6", 1120 | "solana-frozen-abi-macro", 1121 | "thiserror", 1122 | ] 1123 | 1124 | [[package]] 1125 | name = "solana-frozen-abi-macro" 1126 | version = "1.10.41" 1127 | source = "registry+https://github.com/rust-lang/crates.io-index" 1128 | checksum = "a37211ec8dff16b08fcb422807fa7f046bbc6417bc43e00a2f2effd8fafec6bc" 1129 | dependencies = [ 1130 | "proc-macro2", 1131 | "quote", 1132 | "rustc_version", 1133 | "syn", 1134 | ] 1135 | 1136 | [[package]] 1137 | name = "solana-program" 1138 | version = "1.10.41" 1139 | source = "registry+https://github.com/rust-lang/crates.io-index" 1140 | checksum = "f9622af117fe254208f1fe99a533ea523624d64745d6cffecd986da6753662ef" 1141 | dependencies = [ 1142 | "base64 0.13.0", 1143 | "bincode", 1144 | "bitflags", 1145 | "blake3", 1146 | "borsh", 1147 | "borsh-derive", 1148 | "bs58 0.4.0", 1149 | "bv", 1150 | "bytemuck", 1151 | "console_error_panic_hook", 1152 | "console_log", 1153 | "curve25519-dalek", 1154 | "getrandom", 1155 | "itertools", 1156 | "js-sys", 1157 | "lazy_static", 1158 | "libsecp256k1", 1159 | "log", 1160 | "num-derive", 1161 | "num-traits", 1162 | "parking_lot", 1163 | "rand", 1164 | "rustc_version", 1165 | "rustversion", 1166 | "serde", 1167 | "serde_bytes", 1168 | "serde_derive", 1169 | "sha2 0.10.6", 1170 | "sha3", 1171 | "solana-frozen-abi", 1172 | "solana-frozen-abi-macro", 1173 | "solana-sdk-macro", 1174 | "thiserror", 1175 | "wasm-bindgen", 1176 | ] 1177 | 1178 | [[package]] 1179 | name = "solana-sdk-macro" 1180 | version = "1.10.41" 1181 | source = "registry+https://github.com/rust-lang/crates.io-index" 1182 | checksum = "8d036e3a52e5570114ec9ab56a1d0a6659e1ebd1c948605318b4e35eafca4515" 1183 | dependencies = [ 1184 | "bs58 0.4.0", 1185 | "proc-macro2", 1186 | "quote", 1187 | "rustversion", 1188 | "syn", 1189 | ] 1190 | 1191 | [[package]] 1192 | name = "subtle" 1193 | version = "2.4.0" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" 1196 | 1197 | [[package]] 1198 | name = "syn" 1199 | version = "1.0.94" 1200 | source = "registry+https://github.com/rust-lang/crates.io-index" 1201 | checksum = "a07e33e919ebcd69113d5be0e4d70c5707004ff45188910106854f38b960df4a" 1202 | dependencies = [ 1203 | "proc-macro2", 1204 | "quote", 1205 | "unicode-xid", 1206 | ] 1207 | 1208 | [[package]] 1209 | name = "thiserror" 1210 | version = "1.0.24" 1211 | source = "registry+https://github.com/rust-lang/crates.io-index" 1212 | checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" 1213 | dependencies = [ 1214 | "thiserror-impl", 1215 | ] 1216 | 1217 | [[package]] 1218 | name = "thiserror-impl" 1219 | version = "1.0.24" 1220 | source = "registry+https://github.com/rust-lang/crates.io-index" 1221 | checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" 1222 | dependencies = [ 1223 | "proc-macro2", 1224 | "quote", 1225 | "syn", 1226 | ] 1227 | 1228 | [[package]] 1229 | name = "thread_local" 1230 | version = "1.1.3" 1231 | source = "registry+https://github.com/rust-lang/crates.io-index" 1232 | checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" 1233 | dependencies = [ 1234 | "once_cell", 1235 | ] 1236 | 1237 | [[package]] 1238 | name = "toml" 1239 | version = "0.5.8" 1240 | source = "registry+https://github.com/rust-lang/crates.io-index" 1241 | checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" 1242 | dependencies = [ 1243 | "serde", 1244 | ] 1245 | 1246 | [[package]] 1247 | name = "typenum" 1248 | version = "1.15.0" 1249 | source = "registry+https://github.com/rust-lang/crates.io-index" 1250 | checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" 1251 | 1252 | [[package]] 1253 | name = "unicode-segmentation" 1254 | version = "1.7.1" 1255 | source = "registry+https://github.com/rust-lang/crates.io-index" 1256 | checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796" 1257 | 1258 | [[package]] 1259 | name = "unicode-xid" 1260 | version = "0.2.1" 1261 | source = "registry+https://github.com/rust-lang/crates.io-index" 1262 | checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" 1263 | 1264 | [[package]] 1265 | name = "version_check" 1266 | version = "0.9.2" 1267 | source = "registry+https://github.com/rust-lang/crates.io-index" 1268 | checksum = "b5a972e5669d67ba988ce3dc826706fb0a8b01471c088cb0b6110b805cc36aed" 1269 | 1270 | [[package]] 1271 | name = "wasi" 1272 | version = "0.9.0+wasi-snapshot-preview1" 1273 | source = "registry+https://github.com/rust-lang/crates.io-index" 1274 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 1275 | 1276 | [[package]] 1277 | name = "wasm-bindgen" 1278 | version = "0.2.80" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad" 1281 | dependencies = [ 1282 | "cfg-if", 1283 | "wasm-bindgen-macro", 1284 | ] 1285 | 1286 | [[package]] 1287 | name = "wasm-bindgen-backend" 1288 | version = "0.2.80" 1289 | source = "registry+https://github.com/rust-lang/crates.io-index" 1290 | checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4" 1291 | dependencies = [ 1292 | "bumpalo", 1293 | "lazy_static", 1294 | "log", 1295 | "proc-macro2", 1296 | "quote", 1297 | "syn", 1298 | "wasm-bindgen-shared", 1299 | ] 1300 | 1301 | [[package]] 1302 | name = "wasm-bindgen-macro" 1303 | version = "0.2.80" 1304 | source = "registry+https://github.com/rust-lang/crates.io-index" 1305 | checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5" 1306 | dependencies = [ 1307 | "quote", 1308 | "wasm-bindgen-macro-support", 1309 | ] 1310 | 1311 | [[package]] 1312 | name = "wasm-bindgen-macro-support" 1313 | version = "0.2.80" 1314 | source = "registry+https://github.com/rust-lang/crates.io-index" 1315 | checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b" 1316 | dependencies = [ 1317 | "proc-macro2", 1318 | "quote", 1319 | "syn", 1320 | "wasm-bindgen-backend", 1321 | "wasm-bindgen-shared", 1322 | ] 1323 | 1324 | [[package]] 1325 | name = "wasm-bindgen-shared" 1326 | version = "0.2.80" 1327 | source = "registry+https://github.com/rust-lang/crates.io-index" 1328 | checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744" 1329 | 1330 | [[package]] 1331 | name = "web-sys" 1332 | version = "0.3.57" 1333 | source = "registry+https://github.com/rust-lang/crates.io-index" 1334 | checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283" 1335 | dependencies = [ 1336 | "js-sys", 1337 | "wasm-bindgen", 1338 | ] 1339 | 1340 | [[package]] 1341 | name = "windows-sys" 1342 | version = "0.42.0" 1343 | source = "registry+https://github.com/rust-lang/crates.io-index" 1344 | checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" 1345 | dependencies = [ 1346 | "windows_aarch64_gnullvm", 1347 | "windows_aarch64_msvc", 1348 | "windows_i686_gnu", 1349 | "windows_i686_msvc", 1350 | "windows_x86_64_gnu", 1351 | "windows_x86_64_gnullvm", 1352 | "windows_x86_64_msvc", 1353 | ] 1354 | 1355 | [[package]] 1356 | name = "windows_aarch64_gnullvm" 1357 | version = "0.42.0" 1358 | source = "registry+https://github.com/rust-lang/crates.io-index" 1359 | checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" 1360 | 1361 | [[package]] 1362 | name = "windows_aarch64_msvc" 1363 | version = "0.42.0" 1364 | source = "registry+https://github.com/rust-lang/crates.io-index" 1365 | checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" 1366 | 1367 | [[package]] 1368 | name = "windows_i686_gnu" 1369 | version = "0.42.0" 1370 | source = "registry+https://github.com/rust-lang/crates.io-index" 1371 | checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" 1372 | 1373 | [[package]] 1374 | name = "windows_i686_msvc" 1375 | version = "0.42.0" 1376 | source = "registry+https://github.com/rust-lang/crates.io-index" 1377 | checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" 1378 | 1379 | [[package]] 1380 | name = "windows_x86_64_gnu" 1381 | version = "0.42.0" 1382 | source = "registry+https://github.com/rust-lang/crates.io-index" 1383 | checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" 1384 | 1385 | [[package]] 1386 | name = "windows_x86_64_gnullvm" 1387 | version = "0.42.0" 1388 | source = "registry+https://github.com/rust-lang/crates.io-index" 1389 | checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" 1390 | 1391 | [[package]] 1392 | name = "windows_x86_64_msvc" 1393 | version = "0.42.0" 1394 | source = "registry+https://github.com/rust-lang/crates.io-index" 1395 | checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" 1396 | 1397 | [[package]] 1398 | name = "yansi" 1399 | version = "0.5.0" 1400 | source = "registry+https://github.com/rust-lang/crates.io-index" 1401 | checksum = "9fc79f4a1e39857fc00c3f662cbf2651c771f00e9c15fe2abc341806bd46bd71" 1402 | 1403 | [[package]] 1404 | name = "zeroize" 1405 | version = "1.2.0" 1406 | source = "registry+https://github.com/rust-lang/crates.io-index" 1407 | checksum = "81a974bcdd357f0dca4d41677db03436324d45a4c9ed2d0b873a5a360ce41c36" 1408 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | members = [ 3 | "programs/*" 4 | ] 5 | 6 | [profile.release] 7 | overflow-checks = true 8 | lto = "fat" 9 | codegen-units = 1 10 | 11 | [profile.release.build-override] 12 | opt-level = 3 13 | incremental = false 14 | codegen-units = 1 15 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | 2 | Apache License 3 | Version 2.0, January 2004 4 | http://www.apache.org/licenses/ 5 | 6 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 7 | 8 | 1. Definitions. 9 | 10 | "License" shall mean the terms and conditions for use, reproduction, 11 | and distribution as defined by Sections 1 through 9 of this document. 12 | 13 | "Licensor" shall mean the copyright owner or entity authorized by 14 | the copyright owner that is granting the License. 15 | 16 | "Legal Entity" shall mean the union of the acting entity and all 17 | other entities that control, are controlled by, or are under common 18 | control with that entity. For the purposes of this definition, 19 | "control" means (i) the power, direct or indirect, to cause the 20 | direction or management of such entity, whether by contract or 21 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 22 | outstanding shares, or (iii) beneficial ownership of such entity. 23 | 24 | "You" (or "Your") shall mean an individual or Legal Entity 25 | exercising permissions granted by this License. 26 | 27 | "Source" form shall mean the preferred form for making modifications, 28 | including but not limited to software source code, documentation 29 | source, and configuration files. 30 | 31 | "Object" form shall mean any form resulting from mechanical 32 | transformation or translation of a Source form, including but 33 | not limited to compiled object code, generated documentation, 34 | and conversions to other media types. 35 | 36 | "Work" shall mean the work of authorship, whether in Source or 37 | Object form, made available under the License, as indicated by a 38 | copyright notice that is included in or attached to the work 39 | (an example is provided in the Appendix below). 40 | 41 | "Derivative Works" shall mean any work, whether in Source or Object 42 | form, that is based on (or derived from) the Work and for which the 43 | editorial revisions, annotations, elaborations, or other modifications 44 | represent, as a whole, an original work of authorship. For the purposes 45 | of this License, Derivative Works shall not include works that remain 46 | separable from, or merely link (or bind by name) to the interfaces of, 47 | the Work and Derivative Works thereof. 48 | 49 | "Contribution" shall mean any work of authorship, including 50 | the original version of the Work and any modifications or additions 51 | to that Work or Derivative Works thereof, that is intentionally 52 | submitted to Licensor for inclusion in the Work by the copyright owner 53 | or by an individual or Legal Entity authorized to submit on behalf of 54 | the copyright owner. For the purposes of this definition, "submitted" 55 | means any form of electronic, verbal, or written communication sent 56 | to the Licensor or its representatives, including but not limited to 57 | communication on electronic mailing lists, source code control systems, 58 | and issue tracking systems that are managed by, or on behalf of, the 59 | Licensor for the purpose of discussing and improving the Work, but 60 | excluding communication that is conspicuously marked or otherwise 61 | designated in writing by the copyright owner as "Not a Contribution." 62 | 63 | "Contributor" shall mean Licensor and any individual or Legal Entity 64 | on behalf of whom a Contribution has been received by Licensor and 65 | subsequently incorporated within the Work. 66 | 67 | 2. Grant of Copyright License. Subject to the terms and conditions of 68 | this License, each Contributor hereby grants to You a perpetual, 69 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 70 | copyright license to reproduce, prepare Derivative Works of, 71 | publicly display, publicly perform, sublicense, and distribute the 72 | Work and such Derivative Works in Source or Object form. 73 | 74 | 3. Grant of Patent License. Subject to the terms and conditions of 75 | this License, each Contributor hereby grants to You a perpetual, 76 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 77 | (except as stated in this section) patent license to make, have made, 78 | use, offer to sell, sell, import, and otherwise transfer the Work, 79 | where such license applies only to those patent claims licensable 80 | by such Contributor that are necessarily infringed by their 81 | Contribution(s) alone or by combination of their Contribution(s) 82 | with the Work to which such Contribution(s) was submitted. If You 83 | institute patent litigation against any entity (including a 84 | cross-claim or counterclaim in a lawsuit) alleging that the Work 85 | or a Contribution incorporated within the Work constitutes direct 86 | or contributory patent infringement, then any patent licenses 87 | granted to You under this License for that Work shall terminate 88 | as of the date such litigation is filed. 89 | 90 | 4. Redistribution. You may reproduce and distribute copies of the 91 | Work or Derivative Works thereof in any medium, with or without 92 | modifications, and in Source or Object form, provided that You 93 | meet the following conditions: 94 | 95 | (a) You must give any other recipients of the Work or 96 | Derivative Works a copy of this License; and 97 | 98 | (b) You must cause any modified files to carry prominent notices 99 | stating that You changed the files; and 100 | 101 | (c) You must retain, in the Source form of any Derivative Works 102 | that You distribute, all copyright, patent, trademark, and 103 | attribution notices from the Source form of the Work, 104 | excluding those notices that do not pertain to any part of 105 | the Derivative Works; and 106 | 107 | (d) If the Work includes a "NOTICE" text file as part of its 108 | distribution, then any Derivative Works that You distribute must 109 | include a readable copy of the attribution notices contained 110 | within such NOTICE file, excluding those notices that do not 111 | pertain to any part of the Derivative Works, in at least one 112 | of the following places: within a NOTICE text file distributed 113 | as part of the Derivative Works; within the Source form or 114 | documentation, if provided along with the Derivative Works; or, 115 | within a display generated by the Derivative Works, if and 116 | wherever such third-party notices normally appear. The contents 117 | of the NOTICE file are for informational purposes only and 118 | do not modify the License. You may add Your own attribution 119 | notices within Derivative Works that You distribute, alongside 120 | or as an addendum to the NOTICE text from the Work, provided 121 | that such additional attribution notices cannot be construed 122 | as modifying the License. 123 | 124 | You may add Your own copyright statement to Your modifications and 125 | may provide additional or different license terms and conditions 126 | for use, reproduction, or distribution of Your modifications, or 127 | for any such Derivative Works as a whole, provided Your use, 128 | reproduction, and distribution of the Work otherwise complies with 129 | the conditions stated in this License. 130 | 131 | 5. Submission of Contributions. Unless You explicitly state otherwise, 132 | any Contribution intentionally submitted for inclusion in the Work 133 | by You to the Licensor shall be under the terms and conditions of 134 | this License, without any additional terms or conditions. 135 | Notwithstanding the above, nothing herein shall supersede or modify 136 | the terms of any separate license agreement you may have executed 137 | with Licensor regarding such Contributions. 138 | 139 | 6. Trademarks. This License does not grant permission to use the trade 140 | names, trademarks, service marks, or product names of the Licensor, 141 | except as required for reasonable and customary use in describing the 142 | origin of the Work and reproducing the content of the NOTICE file. 143 | 144 | 7. Disclaimer of Warranty. Unless required by applicable law or 145 | agreed to in writing, Licensor provides the Work (and each 146 | Contributor provides its Contributions) on an "AS IS" BASIS, 147 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 148 | implied, including, without limitation, any warranties or conditions 149 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 150 | PARTICULAR PURPOSE. You are solely responsible for determining the 151 | appropriateness of using or redistributing the Work and assume any 152 | risks associated with Your exercise of permissions under this License. 153 | 154 | 8. Limitation of Liability. In no event and under no legal theory, 155 | whether in tort (including negligence), contract, or otherwise, 156 | unless required by applicable law (such as deliberate and grossly 157 | negligent acts) or agreed to in writing, shall any Contributor be 158 | liable to You for damages, including any direct, indirect, special, 159 | incidental, or consequential damages of any character arising as a 160 | result of this License or out of the use or inability to use the 161 | Work (including but not limited to damages for loss of goodwill, 162 | work stoppage, computer failure or malfunction, or any and all 163 | other commercial damages or losses), even if such Contributor 164 | has been advised of the possibility of such damages. 165 | 166 | 9. Accepting Warranty or Additional Liability. While redistributing 167 | the Work or Derivative Works thereof, You may choose to offer, 168 | and charge a fee for, acceptance of support, warranty, indemnity, 169 | or other liability obligations and/or rights consistent with this 170 | License. However, in accepting such obligations, You may act only 171 | on Your own behalf and on Your sole responsibility, not on behalf 172 | of any other Contributor, and only if You agree to indemnify, 173 | defend, and hold each Contributor harmless for any liability 174 | incurred by, or claims asserted against, such Contributor by reason 175 | of your accepting any such warranty or additional liability. 176 | 177 | END OF TERMS AND CONDITIONS 178 | 179 | APPENDIX: How to apply the Apache License to your work. 180 | 181 | To apply the Apache License to your work, attach the following 182 | boilerplate notice, with the fields enclosed by brackets "[]" 183 | replaced with your own identifying information. (Don't include 184 | the brackets!) The text should be enclosed in the appropriate 185 | comment syntax for the file format. We also recommend that a 186 | file or class name and description of purpose be included on the 187 | same "printed page" as the copyright notice for easier 188 | identification within third-party archives. 189 | 190 | Copyright 2020 Serum Foundation 191 | 192 | Licensed under the Apache License, Version 2.0 (the "License"); 193 | you may not use this file except in compliance with the License. 194 | You may obtain a copy of the License at 195 | 196 | http://www.apache.org/licenses/LICENSE-2.0 197 | 198 | Unless required by applicable law or agreed to in writing, software 199 | distributed under the License is distributed on an "AS IS" BASIS, 200 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 201 | See the License for the specific language governing permissions and 202 | limitations under the License. 203 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Multisig 2 | 3 | An example of a multisig to execute arbitrary Solana transactions. 4 | 5 | This program can be used to allow a multisig to govern anything a regular 6 | Pubkey can govern. One can use the multisig as a BPF program upgrade 7 | authority, a mint authority, etc. 8 | 9 | To use, one must first create a `Multisig` account, specifying two important 10 | parameters: 11 | 12 | 1. Owners - the set of addresses that sign transactions for the multisig. 13 | 2. Threshold - the number of signers required to execute a transaction. 14 | 15 | Once the `Multisig` account is created, one can create a `Transaction` 16 | account, specifying the parameters for a normal solana transaction. 17 | 18 | To sign, owners should invoke the `approve` instruction, and finally, 19 | the `execute_transaction`, once enough (i.e. `threshold`) of the owners have 20 | signed. 21 | 22 | ## Note 23 | 24 | * **This code (0.9.0) is [audited](./SECURITY_AUDIT_REPORT.pdf). Audit commissioned by [Streamflow](https://github.com/streamflow-finance).** 25 | 26 | ## Developing 27 | 28 | [Anchor](https://github.com/coral-xyz/anchor) is used for developoment, and it's 29 | recommended workflow is used here. To get started, see the [guide](https://anchor-lang.com). 30 | 31 | ### Build 32 | 33 | ```bash 34 | anchor build --verifiable 35 | ``` 36 | 37 | The `--verifiable` flag should be used before deploying so that your build artifacts 38 | can be deterministically generated with docker. 39 | 40 | ### Test 41 | 42 | ```bash 43 | anchor test 44 | ``` 45 | 46 | ### Verify 47 | 48 | To verify the program deployed on Solana matches your local source code, install 49 | docker, `cd programs/multisig`, and run 50 | 51 | ```bash 52 | anchor verify 53 | ``` 54 | 55 | A list of build artifacts can be found under [releases](https://github.com/coral-xyz/multisig/releases). 56 | -------------------------------------------------------------------------------- /SECURITY_AUDIT_REPORT.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/coral-xyz/multisig/435d6eb15f10c9e99d81323890bc042cfcaa402f/SECURITY_AUDIT_REPORT.pdf -------------------------------------------------------------------------------- /migrations/deploy.js: -------------------------------------------------------------------------------- 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("@project-serum/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-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "multisig", 3 | "lockfileVersion": 2, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "name": "multisig", 8 | "devDependencies": { 9 | "@project-serum/anchor": "=0.24.2", 10 | "@project-serum/anchor-cli": "=0.24.2", 11 | "mocha": "^9.1.3", 12 | "prettier": "^2.5.1" 13 | } 14 | }, 15 | "node_modules/@babel/runtime": { 16 | "version": "7.17.9", 17 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", 18 | "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", 19 | "dev": true, 20 | "dependencies": { 21 | "regenerator-runtime": "^0.13.4" 22 | }, 23 | "engines": { 24 | "node": ">=6.9.0" 25 | } 26 | }, 27 | "node_modules/@ethersproject/bytes": { 28 | "version": "5.6.1", 29 | "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz", 30 | "integrity": "sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==", 31 | "dev": true, 32 | "funding": [ 33 | { 34 | "type": "individual", 35 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 36 | }, 37 | { 38 | "type": "individual", 39 | "url": "https://www.buymeacoffee.com/ricmoo" 40 | } 41 | ], 42 | "dependencies": { 43 | "@ethersproject/logger": "^5.6.0" 44 | } 45 | }, 46 | "node_modules/@ethersproject/logger": { 47 | "version": "5.6.0", 48 | "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.6.0.tgz", 49 | "integrity": "sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg==", 50 | "dev": true, 51 | "funding": [ 52 | { 53 | "type": "individual", 54 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 55 | }, 56 | { 57 | "type": "individual", 58 | "url": "https://www.buymeacoffee.com/ricmoo" 59 | } 60 | ] 61 | }, 62 | "node_modules/@ethersproject/sha2": { 63 | "version": "5.6.0", 64 | "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.6.0.tgz", 65 | "integrity": "sha512-1tNWCPFLu1n3JM9t4/kytz35DkuF9MxqkGGEHNauEbaARdm2fafnOyw1s0tIQDPKF/7bkP1u3dbrmjpn5CelyA==", 66 | "dev": true, 67 | "funding": [ 68 | { 69 | "type": "individual", 70 | "url": "https://gitcoin.co/grants/13/ethersjs-complete-simple-and-tiny-2" 71 | }, 72 | { 73 | "type": "individual", 74 | "url": "https://www.buymeacoffee.com/ricmoo" 75 | } 76 | ], 77 | "dependencies": { 78 | "@ethersproject/bytes": "^5.6.0", 79 | "@ethersproject/logger": "^5.6.0", 80 | "hash.js": "1.1.7" 81 | } 82 | }, 83 | "node_modules/@project-serum/anchor": { 84 | "version": "0.24.2", 85 | "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.24.2.tgz", 86 | "integrity": "sha512-0/718g8/DnEuwAidUwh5wLYphUYXhUbiClkuRNhvNoa+1Y8a4g2tJyxoae+emV+PG/Gikd/QUBNMkIcimiIRTA==", 87 | "dev": true, 88 | "dependencies": { 89 | "@project-serum/borsh": "^0.2.5", 90 | "@solana/web3.js": "^1.36.0", 91 | "base64-js": "^1.5.1", 92 | "bn.js": "^5.1.2", 93 | "bs58": "^4.0.1", 94 | "buffer-layout": "^1.2.2", 95 | "camelcase": "^5.3.1", 96 | "cross-fetch": "^3.1.5", 97 | "crypto-hash": "^1.3.0", 98 | "eventemitter3": "^4.0.7", 99 | "js-sha256": "^0.9.0", 100 | "pako": "^2.0.3", 101 | "snake-case": "^3.0.4", 102 | "toml": "^3.0.0" 103 | }, 104 | "engines": { 105 | "node": ">=11" 106 | } 107 | }, 108 | "node_modules/@project-serum/anchor-cli": { 109 | "version": "0.24.2", 110 | "resolved": "https://registry.npmjs.org/@project-serum/anchor-cli/-/anchor-cli-0.24.2.tgz", 111 | "integrity": "sha512-3D+fB3n/PAmY5AF2P+zxNvV2ZKx6YLoDlqHXqFa7wGqxVZfTo4WM2O7ChJjU2WIxS/WoTt6qXnehbuGUJ1JXig==", 112 | "dev": true, 113 | "bin": { 114 | "anchor": "anchor.js" 115 | } 116 | }, 117 | "node_modules/@project-serum/borsh": { 118 | "version": "0.2.5", 119 | "resolved": "https://registry.npmjs.org/@project-serum/borsh/-/borsh-0.2.5.tgz", 120 | "integrity": "sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==", 121 | "dev": true, 122 | "dependencies": { 123 | "bn.js": "^5.1.2", 124 | "buffer-layout": "^1.2.0" 125 | }, 126 | "engines": { 127 | "node": ">=10" 128 | }, 129 | "peerDependencies": { 130 | "@solana/web3.js": "^1.2.0" 131 | } 132 | }, 133 | "node_modules/@solana/buffer-layout": { 134 | "version": "4.0.0", 135 | "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.0.tgz", 136 | "integrity": "sha512-lR0EMP2HC3+Mxwd4YcnZb0smnaDw7Bl2IQWZiTevRH5ZZBZn6VRWn3/92E3qdU4SSImJkA6IDHawOHAnx/qUvQ==", 137 | "dev": true, 138 | "dependencies": { 139 | "buffer": "~6.0.3" 140 | }, 141 | "engines": { 142 | "node": ">=5.10" 143 | } 144 | }, 145 | "node_modules/@solana/buffer-layout-utils": { 146 | "version": "0.2.0", 147 | "resolved": "https://registry.npmjs.org/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz", 148 | "integrity": "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==", 149 | "dev": true, 150 | "dependencies": { 151 | "@solana/buffer-layout": "^4.0.0", 152 | "@solana/web3.js": "^1.32.0", 153 | "bigint-buffer": "^1.1.5", 154 | "bignumber.js": "^9.0.1" 155 | }, 156 | "engines": { 157 | "node": ">= 10" 158 | } 159 | }, 160 | "node_modules/@solana/buffer-layout/node_modules/buffer": { 161 | "version": "6.0.3", 162 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 163 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 164 | "dev": true, 165 | "funding": [ 166 | { 167 | "type": "github", 168 | "url": "https://github.com/sponsors/feross" 169 | }, 170 | { 171 | "type": "patreon", 172 | "url": "https://www.patreon.com/feross" 173 | }, 174 | { 175 | "type": "consulting", 176 | "url": "https://feross.org/support" 177 | } 178 | ], 179 | "dependencies": { 180 | "base64-js": "^1.3.1", 181 | "ieee754": "^1.2.1" 182 | } 183 | }, 184 | "node_modules/@solana/web3.js": { 185 | "version": "1.41.10", 186 | "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.41.10.tgz", 187 | "integrity": "sha512-2mPNoxGDt5jZ4MYA+aK7qKzvdXdN0niy7suYfkbrcgAWahJ/WSfPD2W0IvySDdLLfCQojSs7sdHIW+xsKV9dyQ==", 188 | "dev": true, 189 | "dependencies": { 190 | "@babel/runtime": "^7.12.5", 191 | "@ethersproject/sha2": "^5.5.0", 192 | "@solana/buffer-layout": "^4.0.0", 193 | "@solana/buffer-layout-utils": "^0.2.0", 194 | "bn.js": "^5.0.0", 195 | "borsh": "^0.7.0", 196 | "bs58": "^4.0.1", 197 | "buffer": "6.0.1", 198 | "cross-fetch": "^3.1.4", 199 | "fast-stable-stringify": "^1.0.0", 200 | "jayson": "^3.4.4", 201 | "js-sha3": "^0.8.0", 202 | "rpc-websockets": "^7.4.2", 203 | "secp256k1": "^4.0.2", 204 | "superstruct": "^0.14.2", 205 | "tweetnacl": "^1.0.0" 206 | }, 207 | "engines": { 208 | "node": ">=12.20.0" 209 | } 210 | }, 211 | "node_modules/@types/connect": { 212 | "version": "3.4.35", 213 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 214 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 215 | "dev": true, 216 | "dependencies": { 217 | "@types/node": "*" 218 | } 219 | }, 220 | "node_modules/@types/express-serve-static-core": { 221 | "version": "4.17.28", 222 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", 223 | "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", 224 | "dev": true, 225 | "dependencies": { 226 | "@types/node": "*", 227 | "@types/qs": "*", 228 | "@types/range-parser": "*" 229 | } 230 | }, 231 | "node_modules/@types/lodash": { 232 | "version": "4.14.182", 233 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", 234 | "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==", 235 | "dev": true 236 | }, 237 | "node_modules/@types/node": { 238 | "version": "12.20.52", 239 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.52.tgz", 240 | "integrity": "sha512-cfkwWw72849SNYp3Zx0IcIs25vABmFh73xicxhCkTcvtZQeIez15PpwQN8fY3RD7gv1Wrxlc9MEtfMORZDEsGw==", 241 | "dev": true 242 | }, 243 | "node_modules/@types/qs": { 244 | "version": "6.9.7", 245 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", 246 | "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", 247 | "dev": true 248 | }, 249 | "node_modules/@types/range-parser": { 250 | "version": "1.2.4", 251 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", 252 | "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", 253 | "dev": true 254 | }, 255 | "node_modules/@types/ws": { 256 | "version": "7.4.7", 257 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", 258 | "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", 259 | "dev": true, 260 | "dependencies": { 261 | "@types/node": "*" 262 | } 263 | }, 264 | "node_modules/@ungap/promise-all-settled": { 265 | "version": "1.1.2", 266 | "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", 267 | "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", 268 | "dev": true 269 | }, 270 | "node_modules/ansi-colors": { 271 | "version": "4.1.1", 272 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 273 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 274 | "dev": true, 275 | "engines": { 276 | "node": ">=6" 277 | } 278 | }, 279 | "node_modules/ansi-regex": { 280 | "version": "5.0.1", 281 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 282 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 283 | "dev": true, 284 | "engines": { 285 | "node": ">=8" 286 | } 287 | }, 288 | "node_modules/ansi-styles": { 289 | "version": "4.3.0", 290 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 291 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 292 | "dev": true, 293 | "dependencies": { 294 | "color-convert": "^2.0.1" 295 | }, 296 | "engines": { 297 | "node": ">=8" 298 | }, 299 | "funding": { 300 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 301 | } 302 | }, 303 | "node_modules/anymatch": { 304 | "version": "3.1.2", 305 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 306 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 307 | "dev": true, 308 | "dependencies": { 309 | "normalize-path": "^3.0.0", 310 | "picomatch": "^2.0.4" 311 | }, 312 | "engines": { 313 | "node": ">= 8" 314 | } 315 | }, 316 | "node_modules/argparse": { 317 | "version": "2.0.1", 318 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 319 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 320 | "dev": true 321 | }, 322 | "node_modules/balanced-match": { 323 | "version": "1.0.2", 324 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 325 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 326 | "dev": true 327 | }, 328 | "node_modules/base-x": { 329 | "version": "3.0.9", 330 | "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", 331 | "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", 332 | "dev": true, 333 | "dependencies": { 334 | "safe-buffer": "^5.0.1" 335 | } 336 | }, 337 | "node_modules/base64-js": { 338 | "version": "1.5.1", 339 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 340 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 341 | "dev": true, 342 | "funding": [ 343 | { 344 | "type": "github", 345 | "url": "https://github.com/sponsors/feross" 346 | }, 347 | { 348 | "type": "patreon", 349 | "url": "https://www.patreon.com/feross" 350 | }, 351 | { 352 | "type": "consulting", 353 | "url": "https://feross.org/support" 354 | } 355 | ] 356 | }, 357 | "node_modules/bigint-buffer": { 358 | "version": "1.1.5", 359 | "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", 360 | "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==", 361 | "dev": true, 362 | "hasInstallScript": true, 363 | "dependencies": { 364 | "bindings": "^1.3.0" 365 | }, 366 | "engines": { 367 | "node": ">= 10.0.0" 368 | } 369 | }, 370 | "node_modules/bignumber.js": { 371 | "version": "9.0.2", 372 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", 373 | "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", 374 | "dev": true, 375 | "engines": { 376 | "node": "*" 377 | } 378 | }, 379 | "node_modules/binary-extensions": { 380 | "version": "2.2.0", 381 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 382 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 383 | "dev": true, 384 | "engines": { 385 | "node": ">=8" 386 | } 387 | }, 388 | "node_modules/bindings": { 389 | "version": "1.5.0", 390 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 391 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 392 | "dev": true, 393 | "dependencies": { 394 | "file-uri-to-path": "1.0.0" 395 | } 396 | }, 397 | "node_modules/bn.js": { 398 | "version": "5.2.0", 399 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", 400 | "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", 401 | "dev": true 402 | }, 403 | "node_modules/borsh": { 404 | "version": "0.7.0", 405 | "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", 406 | "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", 407 | "dev": true, 408 | "dependencies": { 409 | "bn.js": "^5.2.0", 410 | "bs58": "^4.0.0", 411 | "text-encoding-utf-8": "^1.0.2" 412 | } 413 | }, 414 | "node_modules/brace-expansion": { 415 | "version": "1.1.11", 416 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 417 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 418 | "dev": true, 419 | "dependencies": { 420 | "balanced-match": "^1.0.0", 421 | "concat-map": "0.0.1" 422 | } 423 | }, 424 | "node_modules/braces": { 425 | "version": "3.0.2", 426 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 427 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 428 | "dev": true, 429 | "dependencies": { 430 | "fill-range": "^7.0.1" 431 | }, 432 | "engines": { 433 | "node": ">=8" 434 | } 435 | }, 436 | "node_modules/brorand": { 437 | "version": "1.1.0", 438 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 439 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", 440 | "dev": true 441 | }, 442 | "node_modules/browser-stdout": { 443 | "version": "1.3.1", 444 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 445 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 446 | "dev": true 447 | }, 448 | "node_modules/bs58": { 449 | "version": "4.0.1", 450 | "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", 451 | "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", 452 | "dev": true, 453 | "dependencies": { 454 | "base-x": "^3.0.2" 455 | } 456 | }, 457 | "node_modules/buffer": { 458 | "version": "6.0.1", 459 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", 460 | "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", 461 | "dev": true, 462 | "funding": [ 463 | { 464 | "type": "github", 465 | "url": "https://github.com/sponsors/feross" 466 | }, 467 | { 468 | "type": "patreon", 469 | "url": "https://www.patreon.com/feross" 470 | }, 471 | { 472 | "type": "consulting", 473 | "url": "https://feross.org/support" 474 | } 475 | ], 476 | "dependencies": { 477 | "base64-js": "^1.3.1", 478 | "ieee754": "^1.2.1" 479 | } 480 | }, 481 | "node_modules/buffer-layout": { 482 | "version": "1.2.2", 483 | "resolved": "https://registry.npmjs.org/buffer-layout/-/buffer-layout-1.2.2.tgz", 484 | "integrity": "sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==", 485 | "dev": true, 486 | "engines": { 487 | "node": ">=4.5" 488 | } 489 | }, 490 | "node_modules/bufferutil": { 491 | "version": "4.0.6", 492 | "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", 493 | "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", 494 | "dev": true, 495 | "hasInstallScript": true, 496 | "optional": true, 497 | "dependencies": { 498 | "node-gyp-build": "^4.3.0" 499 | }, 500 | "engines": { 501 | "node": ">=6.14.2" 502 | } 503 | }, 504 | "node_modules/camelcase": { 505 | "version": "5.3.1", 506 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 507 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 508 | "dev": true, 509 | "engines": { 510 | "node": ">=6" 511 | } 512 | }, 513 | "node_modules/chalk": { 514 | "version": "4.1.2", 515 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 516 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 517 | "dev": true, 518 | "dependencies": { 519 | "ansi-styles": "^4.1.0", 520 | "supports-color": "^7.1.0" 521 | }, 522 | "engines": { 523 | "node": ">=10" 524 | }, 525 | "funding": { 526 | "url": "https://github.com/chalk/chalk?sponsor=1" 527 | } 528 | }, 529 | "node_modules/chalk/node_modules/supports-color": { 530 | "version": "7.2.0", 531 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 532 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 533 | "dev": true, 534 | "dependencies": { 535 | "has-flag": "^4.0.0" 536 | }, 537 | "engines": { 538 | "node": ">=8" 539 | } 540 | }, 541 | "node_modules/chokidar": { 542 | "version": "3.5.3", 543 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 544 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 545 | "dev": true, 546 | "funding": [ 547 | { 548 | "type": "individual", 549 | "url": "https://paulmillr.com/funding/" 550 | } 551 | ], 552 | "dependencies": { 553 | "anymatch": "~3.1.2", 554 | "braces": "~3.0.2", 555 | "glob-parent": "~5.1.2", 556 | "is-binary-path": "~2.1.0", 557 | "is-glob": "~4.0.1", 558 | "normalize-path": "~3.0.0", 559 | "readdirp": "~3.6.0" 560 | }, 561 | "engines": { 562 | "node": ">= 8.10.0" 563 | }, 564 | "optionalDependencies": { 565 | "fsevents": "~2.3.2" 566 | } 567 | }, 568 | "node_modules/cliui": { 569 | "version": "7.0.4", 570 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 571 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 572 | "dev": true, 573 | "dependencies": { 574 | "string-width": "^4.2.0", 575 | "strip-ansi": "^6.0.0", 576 | "wrap-ansi": "^7.0.0" 577 | } 578 | }, 579 | "node_modules/color-convert": { 580 | "version": "2.0.1", 581 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 582 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 583 | "dev": true, 584 | "dependencies": { 585 | "color-name": "~1.1.4" 586 | }, 587 | "engines": { 588 | "node": ">=7.0.0" 589 | } 590 | }, 591 | "node_modules/color-name": { 592 | "version": "1.1.4", 593 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 594 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 595 | "dev": true 596 | }, 597 | "node_modules/commander": { 598 | "version": "2.20.3", 599 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 600 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 601 | "dev": true 602 | }, 603 | "node_modules/concat-map": { 604 | "version": "0.0.1", 605 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 606 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 607 | "dev": true 608 | }, 609 | "node_modules/cross-fetch": { 610 | "version": "3.1.5", 611 | "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", 612 | "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", 613 | "dev": true, 614 | "dependencies": { 615 | "node-fetch": "2.6.7" 616 | } 617 | }, 618 | "node_modules/crypto-hash": { 619 | "version": "1.3.0", 620 | "resolved": "https://registry.npmjs.org/crypto-hash/-/crypto-hash-1.3.0.tgz", 621 | "integrity": "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==", 622 | "dev": true, 623 | "engines": { 624 | "node": ">=8" 625 | }, 626 | "funding": { 627 | "url": "https://github.com/sponsors/sindresorhus" 628 | } 629 | }, 630 | "node_modules/debug": { 631 | "version": "4.3.3", 632 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 633 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 634 | "dev": true, 635 | "dependencies": { 636 | "ms": "2.1.2" 637 | }, 638 | "engines": { 639 | "node": ">=6.0" 640 | }, 641 | "peerDependenciesMeta": { 642 | "supports-color": { 643 | "optional": true 644 | } 645 | } 646 | }, 647 | "node_modules/debug/node_modules/ms": { 648 | "version": "2.1.2", 649 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 650 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 651 | "dev": true 652 | }, 653 | "node_modules/decamelize": { 654 | "version": "4.0.0", 655 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 656 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 657 | "dev": true, 658 | "engines": { 659 | "node": ">=10" 660 | }, 661 | "funding": { 662 | "url": "https://github.com/sponsors/sindresorhus" 663 | } 664 | }, 665 | "node_modules/delay": { 666 | "version": "5.0.0", 667 | "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", 668 | "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", 669 | "dev": true, 670 | "engines": { 671 | "node": ">=10" 672 | }, 673 | "funding": { 674 | "url": "https://github.com/sponsors/sindresorhus" 675 | } 676 | }, 677 | "node_modules/diff": { 678 | "version": "5.0.0", 679 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 680 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 681 | "dev": true, 682 | "engines": { 683 | "node": ">=0.3.1" 684 | } 685 | }, 686 | "node_modules/dot-case": { 687 | "version": "3.0.4", 688 | "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", 689 | "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", 690 | "dev": true, 691 | "dependencies": { 692 | "no-case": "^3.0.4", 693 | "tslib": "^2.0.3" 694 | } 695 | }, 696 | "node_modules/elliptic": { 697 | "version": "6.5.4", 698 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", 699 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", 700 | "dev": true, 701 | "dependencies": { 702 | "bn.js": "^4.11.9", 703 | "brorand": "^1.1.0", 704 | "hash.js": "^1.0.0", 705 | "hmac-drbg": "^1.0.1", 706 | "inherits": "^2.0.4", 707 | "minimalistic-assert": "^1.0.1", 708 | "minimalistic-crypto-utils": "^1.0.1" 709 | } 710 | }, 711 | "node_modules/elliptic/node_modules/bn.js": { 712 | "version": "4.12.0", 713 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 714 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 715 | "dev": true 716 | }, 717 | "node_modules/emoji-regex": { 718 | "version": "8.0.0", 719 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 720 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 721 | "dev": true 722 | }, 723 | "node_modules/es6-promise": { 724 | "version": "4.2.8", 725 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 726 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 727 | "dev": true 728 | }, 729 | "node_modules/es6-promisify": { 730 | "version": "5.0.0", 731 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 732 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 733 | "dev": true, 734 | "dependencies": { 735 | "es6-promise": "^4.0.3" 736 | } 737 | }, 738 | "node_modules/escalade": { 739 | "version": "3.1.1", 740 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 741 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 742 | "dev": true, 743 | "engines": { 744 | "node": ">=6" 745 | } 746 | }, 747 | "node_modules/escape-string-regexp": { 748 | "version": "4.0.0", 749 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 750 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 751 | "dev": true, 752 | "engines": { 753 | "node": ">=10" 754 | }, 755 | "funding": { 756 | "url": "https://github.com/sponsors/sindresorhus" 757 | } 758 | }, 759 | "node_modules/eventemitter3": { 760 | "version": "4.0.7", 761 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 762 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", 763 | "dev": true 764 | }, 765 | "node_modules/eyes": { 766 | "version": "0.1.8", 767 | "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 768 | "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", 769 | "dev": true, 770 | "engines": { 771 | "node": "> 0.1.90" 772 | } 773 | }, 774 | "node_modules/fast-stable-stringify": { 775 | "version": "1.0.0", 776 | "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", 777 | "integrity": "sha1-XFVDRisiru79NtBbNOUceMuG0xM=", 778 | "dev": true 779 | }, 780 | "node_modules/file-uri-to-path": { 781 | "version": "1.0.0", 782 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 783 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", 784 | "dev": true 785 | }, 786 | "node_modules/fill-range": { 787 | "version": "7.0.1", 788 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 789 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 790 | "dev": true, 791 | "dependencies": { 792 | "to-regex-range": "^5.0.1" 793 | }, 794 | "engines": { 795 | "node": ">=8" 796 | } 797 | }, 798 | "node_modules/find-up": { 799 | "version": "5.0.0", 800 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 801 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 802 | "dev": true, 803 | "dependencies": { 804 | "locate-path": "^6.0.0", 805 | "path-exists": "^4.0.0" 806 | }, 807 | "engines": { 808 | "node": ">=10" 809 | }, 810 | "funding": { 811 | "url": "https://github.com/sponsors/sindresorhus" 812 | } 813 | }, 814 | "node_modules/flat": { 815 | "version": "5.0.2", 816 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 817 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 818 | "dev": true, 819 | "bin": { 820 | "flat": "cli.js" 821 | } 822 | }, 823 | "node_modules/fs.realpath": { 824 | "version": "1.0.0", 825 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 826 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 827 | "dev": true 828 | }, 829 | "node_modules/fsevents": { 830 | "version": "2.3.2", 831 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 832 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 833 | "dev": true, 834 | "hasInstallScript": true, 835 | "optional": true, 836 | "os": [ 837 | "darwin" 838 | ], 839 | "engines": { 840 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 841 | } 842 | }, 843 | "node_modules/get-caller-file": { 844 | "version": "2.0.5", 845 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 846 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 847 | "dev": true, 848 | "engines": { 849 | "node": "6.* || 8.* || >= 10.*" 850 | } 851 | }, 852 | "node_modules/glob": { 853 | "version": "7.2.0", 854 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 855 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 856 | "dev": true, 857 | "dependencies": { 858 | "fs.realpath": "^1.0.0", 859 | "inflight": "^1.0.4", 860 | "inherits": "2", 861 | "minimatch": "^3.0.4", 862 | "once": "^1.3.0", 863 | "path-is-absolute": "^1.0.0" 864 | }, 865 | "engines": { 866 | "node": "*" 867 | }, 868 | "funding": { 869 | "url": "https://github.com/sponsors/isaacs" 870 | } 871 | }, 872 | "node_modules/glob-parent": { 873 | "version": "5.1.2", 874 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 875 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 876 | "dev": true, 877 | "dependencies": { 878 | "is-glob": "^4.0.1" 879 | }, 880 | "engines": { 881 | "node": ">= 6" 882 | } 883 | }, 884 | "node_modules/glob/node_modules/minimatch": { 885 | "version": "3.1.2", 886 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 887 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 888 | "dev": true, 889 | "dependencies": { 890 | "brace-expansion": "^1.1.7" 891 | }, 892 | "engines": { 893 | "node": "*" 894 | } 895 | }, 896 | "node_modules/growl": { 897 | "version": "1.10.5", 898 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 899 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 900 | "dev": true, 901 | "engines": { 902 | "node": ">=4.x" 903 | } 904 | }, 905 | "node_modules/has-flag": { 906 | "version": "4.0.0", 907 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 908 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 909 | "dev": true, 910 | "engines": { 911 | "node": ">=8" 912 | } 913 | }, 914 | "node_modules/hash.js": { 915 | "version": "1.1.7", 916 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 917 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 918 | "dev": true, 919 | "dependencies": { 920 | "inherits": "^2.0.3", 921 | "minimalistic-assert": "^1.0.1" 922 | } 923 | }, 924 | "node_modules/he": { 925 | "version": "1.2.0", 926 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 927 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 928 | "dev": true, 929 | "bin": { 930 | "he": "bin/he" 931 | } 932 | }, 933 | "node_modules/hmac-drbg": { 934 | "version": "1.0.1", 935 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 936 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 937 | "dev": true, 938 | "dependencies": { 939 | "hash.js": "^1.0.3", 940 | "minimalistic-assert": "^1.0.0", 941 | "minimalistic-crypto-utils": "^1.0.1" 942 | } 943 | }, 944 | "node_modules/ieee754": { 945 | "version": "1.2.1", 946 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 947 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 948 | "dev": true, 949 | "funding": [ 950 | { 951 | "type": "github", 952 | "url": "https://github.com/sponsors/feross" 953 | }, 954 | { 955 | "type": "patreon", 956 | "url": "https://www.patreon.com/feross" 957 | }, 958 | { 959 | "type": "consulting", 960 | "url": "https://feross.org/support" 961 | } 962 | ] 963 | }, 964 | "node_modules/inflight": { 965 | "version": "1.0.6", 966 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 967 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 968 | "dev": true, 969 | "dependencies": { 970 | "once": "^1.3.0", 971 | "wrappy": "1" 972 | } 973 | }, 974 | "node_modules/inherits": { 975 | "version": "2.0.4", 976 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 977 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 978 | "dev": true 979 | }, 980 | "node_modules/is-binary-path": { 981 | "version": "2.1.0", 982 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 983 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 984 | "dev": true, 985 | "dependencies": { 986 | "binary-extensions": "^2.0.0" 987 | }, 988 | "engines": { 989 | "node": ">=8" 990 | } 991 | }, 992 | "node_modules/is-extglob": { 993 | "version": "2.1.1", 994 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 995 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 996 | "dev": true, 997 | "engines": { 998 | "node": ">=0.10.0" 999 | } 1000 | }, 1001 | "node_modules/is-fullwidth-code-point": { 1002 | "version": "3.0.0", 1003 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1004 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1005 | "dev": true, 1006 | "engines": { 1007 | "node": ">=8" 1008 | } 1009 | }, 1010 | "node_modules/is-glob": { 1011 | "version": "4.0.3", 1012 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1013 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1014 | "dev": true, 1015 | "dependencies": { 1016 | "is-extglob": "^2.1.1" 1017 | }, 1018 | "engines": { 1019 | "node": ">=0.10.0" 1020 | } 1021 | }, 1022 | "node_modules/is-number": { 1023 | "version": "7.0.0", 1024 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1025 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1026 | "dev": true, 1027 | "engines": { 1028 | "node": ">=0.12.0" 1029 | } 1030 | }, 1031 | "node_modules/is-plain-obj": { 1032 | "version": "2.1.0", 1033 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 1034 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 1035 | "dev": true, 1036 | "engines": { 1037 | "node": ">=8" 1038 | } 1039 | }, 1040 | "node_modules/is-unicode-supported": { 1041 | "version": "0.1.0", 1042 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 1043 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 1044 | "dev": true, 1045 | "engines": { 1046 | "node": ">=10" 1047 | }, 1048 | "funding": { 1049 | "url": "https://github.com/sponsors/sindresorhus" 1050 | } 1051 | }, 1052 | "node_modules/isexe": { 1053 | "version": "2.0.0", 1054 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1055 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1056 | "dev": true 1057 | }, 1058 | "node_modules/isomorphic-ws": { 1059 | "version": "4.0.1", 1060 | "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", 1061 | "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", 1062 | "dev": true, 1063 | "peerDependencies": { 1064 | "ws": "*" 1065 | } 1066 | }, 1067 | "node_modules/jayson": { 1068 | "version": "3.6.6", 1069 | "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.6.6.tgz", 1070 | "integrity": "sha512-f71uvrAWTtrwoww6MKcl9phQTC+56AopLyEenWvKVAIMz+q0oVGj6tenLZ7Z6UiPBkJtKLj4kt0tACllFQruGQ==", 1071 | "dev": true, 1072 | "dependencies": { 1073 | "@types/connect": "^3.4.33", 1074 | "@types/express-serve-static-core": "^4.17.9", 1075 | "@types/lodash": "^4.14.159", 1076 | "@types/node": "^12.12.54", 1077 | "@types/ws": "^7.4.4", 1078 | "commander": "^2.20.3", 1079 | "delay": "^5.0.0", 1080 | "es6-promisify": "^5.0.0", 1081 | "eyes": "^0.1.8", 1082 | "isomorphic-ws": "^4.0.1", 1083 | "json-stringify-safe": "^5.0.1", 1084 | "JSONStream": "^1.3.5", 1085 | "lodash": "^4.17.20", 1086 | "uuid": "^8.3.2", 1087 | "ws": "^7.4.5" 1088 | }, 1089 | "bin": { 1090 | "jayson": "bin/jayson.js" 1091 | }, 1092 | "engines": { 1093 | "node": ">=8" 1094 | } 1095 | }, 1096 | "node_modules/js-sha256": { 1097 | "version": "0.9.0", 1098 | "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", 1099 | "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", 1100 | "dev": true 1101 | }, 1102 | "node_modules/js-sha3": { 1103 | "version": "0.8.0", 1104 | "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", 1105 | "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", 1106 | "dev": true 1107 | }, 1108 | "node_modules/js-yaml": { 1109 | "version": "4.1.0", 1110 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 1111 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 1112 | "dev": true, 1113 | "dependencies": { 1114 | "argparse": "^2.0.1" 1115 | }, 1116 | "bin": { 1117 | "js-yaml": "bin/js-yaml.js" 1118 | } 1119 | }, 1120 | "node_modules/json-stringify-safe": { 1121 | "version": "5.0.1", 1122 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1123 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 1124 | "dev": true 1125 | }, 1126 | "node_modules/jsonparse": { 1127 | "version": "1.3.1", 1128 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 1129 | "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", 1130 | "dev": true, 1131 | "engines": [ 1132 | "node >= 0.2.0" 1133 | ] 1134 | }, 1135 | "node_modules/JSONStream": { 1136 | "version": "1.3.5", 1137 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", 1138 | "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", 1139 | "dev": true, 1140 | "dependencies": { 1141 | "jsonparse": "^1.2.0", 1142 | "through": ">=2.2.7 <3" 1143 | }, 1144 | "bin": { 1145 | "JSONStream": "bin.js" 1146 | }, 1147 | "engines": { 1148 | "node": "*" 1149 | } 1150 | }, 1151 | "node_modules/locate-path": { 1152 | "version": "6.0.0", 1153 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 1154 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 1155 | "dev": true, 1156 | "dependencies": { 1157 | "p-locate": "^5.0.0" 1158 | }, 1159 | "engines": { 1160 | "node": ">=10" 1161 | }, 1162 | "funding": { 1163 | "url": "https://github.com/sponsors/sindresorhus" 1164 | } 1165 | }, 1166 | "node_modules/lodash": { 1167 | "version": "4.17.21", 1168 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1169 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 1170 | "dev": true 1171 | }, 1172 | "node_modules/log-symbols": { 1173 | "version": "4.1.0", 1174 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 1175 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 1176 | "dev": true, 1177 | "dependencies": { 1178 | "chalk": "^4.1.0", 1179 | "is-unicode-supported": "^0.1.0" 1180 | }, 1181 | "engines": { 1182 | "node": ">=10" 1183 | }, 1184 | "funding": { 1185 | "url": "https://github.com/sponsors/sindresorhus" 1186 | } 1187 | }, 1188 | "node_modules/lower-case": { 1189 | "version": "2.0.2", 1190 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 1191 | "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 1192 | "dev": true, 1193 | "dependencies": { 1194 | "tslib": "^2.0.3" 1195 | } 1196 | }, 1197 | "node_modules/minimalistic-assert": { 1198 | "version": "1.0.1", 1199 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 1200 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", 1201 | "dev": true 1202 | }, 1203 | "node_modules/minimalistic-crypto-utils": { 1204 | "version": "1.0.1", 1205 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 1206 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", 1207 | "dev": true 1208 | }, 1209 | "node_modules/minimatch": { 1210 | "version": "4.2.1", 1211 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", 1212 | "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", 1213 | "dev": true, 1214 | "dependencies": { 1215 | "brace-expansion": "^1.1.7" 1216 | }, 1217 | "engines": { 1218 | "node": ">=10" 1219 | } 1220 | }, 1221 | "node_modules/mocha": { 1222 | "version": "9.2.2", 1223 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", 1224 | "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", 1225 | "dev": true, 1226 | "dependencies": { 1227 | "@ungap/promise-all-settled": "1.1.2", 1228 | "ansi-colors": "4.1.1", 1229 | "browser-stdout": "1.3.1", 1230 | "chokidar": "3.5.3", 1231 | "debug": "4.3.3", 1232 | "diff": "5.0.0", 1233 | "escape-string-regexp": "4.0.0", 1234 | "find-up": "5.0.0", 1235 | "glob": "7.2.0", 1236 | "growl": "1.10.5", 1237 | "he": "1.2.0", 1238 | "js-yaml": "4.1.0", 1239 | "log-symbols": "4.1.0", 1240 | "minimatch": "4.2.1", 1241 | "ms": "2.1.3", 1242 | "nanoid": "3.3.1", 1243 | "serialize-javascript": "6.0.0", 1244 | "strip-json-comments": "3.1.1", 1245 | "supports-color": "8.1.1", 1246 | "which": "2.0.2", 1247 | "workerpool": "6.2.0", 1248 | "yargs": "16.2.0", 1249 | "yargs-parser": "20.2.4", 1250 | "yargs-unparser": "2.0.0" 1251 | }, 1252 | "bin": { 1253 | "_mocha": "bin/_mocha", 1254 | "mocha": "bin/mocha" 1255 | }, 1256 | "engines": { 1257 | "node": ">= 12.0.0" 1258 | }, 1259 | "funding": { 1260 | "type": "opencollective", 1261 | "url": "https://opencollective.com/mochajs" 1262 | } 1263 | }, 1264 | "node_modules/ms": { 1265 | "version": "2.1.3", 1266 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1267 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 1268 | "dev": true 1269 | }, 1270 | "node_modules/nanoid": { 1271 | "version": "3.3.1", 1272 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", 1273 | "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", 1274 | "dev": true, 1275 | "bin": { 1276 | "nanoid": "bin/nanoid.cjs" 1277 | }, 1278 | "engines": { 1279 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 1280 | } 1281 | }, 1282 | "node_modules/no-case": { 1283 | "version": "3.0.4", 1284 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 1285 | "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 1286 | "dev": true, 1287 | "dependencies": { 1288 | "lower-case": "^2.0.2", 1289 | "tslib": "^2.0.3" 1290 | } 1291 | }, 1292 | "node_modules/node-addon-api": { 1293 | "version": "2.0.2", 1294 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", 1295 | "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", 1296 | "dev": true 1297 | }, 1298 | "node_modules/node-fetch": { 1299 | "version": "2.6.7", 1300 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 1301 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 1302 | "dev": true, 1303 | "dependencies": { 1304 | "whatwg-url": "^5.0.0" 1305 | }, 1306 | "engines": { 1307 | "node": "4.x || >=6.0.0" 1308 | }, 1309 | "peerDependencies": { 1310 | "encoding": "^0.1.0" 1311 | }, 1312 | "peerDependenciesMeta": { 1313 | "encoding": { 1314 | "optional": true 1315 | } 1316 | } 1317 | }, 1318 | "node_modules/node-gyp-build": { 1319 | "version": "4.4.0", 1320 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", 1321 | "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", 1322 | "dev": true, 1323 | "bin": { 1324 | "node-gyp-build": "bin.js", 1325 | "node-gyp-build-optional": "optional.js", 1326 | "node-gyp-build-test": "build-test.js" 1327 | } 1328 | }, 1329 | "node_modules/normalize-path": { 1330 | "version": "3.0.0", 1331 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 1332 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 1333 | "dev": true, 1334 | "engines": { 1335 | "node": ">=0.10.0" 1336 | } 1337 | }, 1338 | "node_modules/once": { 1339 | "version": "1.4.0", 1340 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1341 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1342 | "dev": true, 1343 | "dependencies": { 1344 | "wrappy": "1" 1345 | } 1346 | }, 1347 | "node_modules/p-limit": { 1348 | "version": "3.1.0", 1349 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 1350 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 1351 | "dev": true, 1352 | "dependencies": { 1353 | "yocto-queue": "^0.1.0" 1354 | }, 1355 | "engines": { 1356 | "node": ">=10" 1357 | }, 1358 | "funding": { 1359 | "url": "https://github.com/sponsors/sindresorhus" 1360 | } 1361 | }, 1362 | "node_modules/p-locate": { 1363 | "version": "5.0.0", 1364 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 1365 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 1366 | "dev": true, 1367 | "dependencies": { 1368 | "p-limit": "^3.0.2" 1369 | }, 1370 | "engines": { 1371 | "node": ">=10" 1372 | }, 1373 | "funding": { 1374 | "url": "https://github.com/sponsors/sindresorhus" 1375 | } 1376 | }, 1377 | "node_modules/pako": { 1378 | "version": "2.0.4", 1379 | "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.4.tgz", 1380 | "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==", 1381 | "dev": true 1382 | }, 1383 | "node_modules/path-exists": { 1384 | "version": "4.0.0", 1385 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 1386 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 1387 | "dev": true, 1388 | "engines": { 1389 | "node": ">=8" 1390 | } 1391 | }, 1392 | "node_modules/path-is-absolute": { 1393 | "version": "1.0.1", 1394 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1395 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 1396 | "dev": true, 1397 | "engines": { 1398 | "node": ">=0.10.0" 1399 | } 1400 | }, 1401 | "node_modules/picomatch": { 1402 | "version": "2.3.1", 1403 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 1404 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 1405 | "dev": true, 1406 | "engines": { 1407 | "node": ">=8.6" 1408 | }, 1409 | "funding": { 1410 | "url": "https://github.com/sponsors/jonschlinkert" 1411 | } 1412 | }, 1413 | "node_modules/prettier": { 1414 | "version": "2.5.1", 1415 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", 1416 | "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", 1417 | "dev": true, 1418 | "bin": { 1419 | "prettier": "bin-prettier.js" 1420 | }, 1421 | "engines": { 1422 | "node": ">=10.13.0" 1423 | } 1424 | }, 1425 | "node_modules/randombytes": { 1426 | "version": "2.1.0", 1427 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 1428 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 1429 | "dev": true, 1430 | "dependencies": { 1431 | "safe-buffer": "^5.1.0" 1432 | } 1433 | }, 1434 | "node_modules/readdirp": { 1435 | "version": "3.6.0", 1436 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 1437 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 1438 | "dev": true, 1439 | "dependencies": { 1440 | "picomatch": "^2.2.1" 1441 | }, 1442 | "engines": { 1443 | "node": ">=8.10.0" 1444 | } 1445 | }, 1446 | "node_modules/regenerator-runtime": { 1447 | "version": "0.13.9", 1448 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", 1449 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", 1450 | "dev": true 1451 | }, 1452 | "node_modules/require-directory": { 1453 | "version": "2.1.1", 1454 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1455 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 1456 | "dev": true, 1457 | "engines": { 1458 | "node": ">=0.10.0" 1459 | } 1460 | }, 1461 | "node_modules/rpc-websockets": { 1462 | "version": "7.4.18", 1463 | "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.4.18.tgz", 1464 | "integrity": "sha512-bVu+4qM5CkGVlTqJa6FaAxLbb5uRnyH4te7yjFvoCzbnif7PT4BcvXtNTprHlNvsH+/StB81zUQicxMrUrIomA==", 1465 | "dev": true, 1466 | "dependencies": { 1467 | "@babel/runtime": "^7.17.2", 1468 | "eventemitter3": "^4.0.7", 1469 | "uuid": "^8.3.2", 1470 | "ws": "^8.5.0" 1471 | }, 1472 | "funding": { 1473 | "type": "paypal", 1474 | "url": "https://paypal.me/kozjak" 1475 | }, 1476 | "optionalDependencies": { 1477 | "bufferutil": "^4.0.1", 1478 | "utf-8-validate": "^5.0.2" 1479 | } 1480 | }, 1481 | "node_modules/rpc-websockets/node_modules/ws": { 1482 | "version": "8.6.0", 1483 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", 1484 | "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", 1485 | "dev": true, 1486 | "engines": { 1487 | "node": ">=10.0.0" 1488 | }, 1489 | "peerDependencies": { 1490 | "bufferutil": "^4.0.1", 1491 | "utf-8-validate": "^5.0.2" 1492 | }, 1493 | "peerDependenciesMeta": { 1494 | "bufferutil": { 1495 | "optional": true 1496 | }, 1497 | "utf-8-validate": { 1498 | "optional": true 1499 | } 1500 | } 1501 | }, 1502 | "node_modules/safe-buffer": { 1503 | "version": "5.2.1", 1504 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1505 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 1506 | "dev": true, 1507 | "funding": [ 1508 | { 1509 | "type": "github", 1510 | "url": "https://github.com/sponsors/feross" 1511 | }, 1512 | { 1513 | "type": "patreon", 1514 | "url": "https://www.patreon.com/feross" 1515 | }, 1516 | { 1517 | "type": "consulting", 1518 | "url": "https://feross.org/support" 1519 | } 1520 | ] 1521 | }, 1522 | "node_modules/secp256k1": { 1523 | "version": "4.0.3", 1524 | "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", 1525 | "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", 1526 | "dev": true, 1527 | "hasInstallScript": true, 1528 | "dependencies": { 1529 | "elliptic": "^6.5.4", 1530 | "node-addon-api": "^2.0.0", 1531 | "node-gyp-build": "^4.2.0" 1532 | }, 1533 | "engines": { 1534 | "node": ">=10.0.0" 1535 | } 1536 | }, 1537 | "node_modules/serialize-javascript": { 1538 | "version": "6.0.0", 1539 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 1540 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 1541 | "dev": true, 1542 | "dependencies": { 1543 | "randombytes": "^2.1.0" 1544 | } 1545 | }, 1546 | "node_modules/snake-case": { 1547 | "version": "3.0.4", 1548 | "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", 1549 | "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", 1550 | "dev": true, 1551 | "dependencies": { 1552 | "dot-case": "^3.0.4", 1553 | "tslib": "^2.0.3" 1554 | } 1555 | }, 1556 | "node_modules/string-width": { 1557 | "version": "4.2.3", 1558 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 1559 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 1560 | "dev": true, 1561 | "dependencies": { 1562 | "emoji-regex": "^8.0.0", 1563 | "is-fullwidth-code-point": "^3.0.0", 1564 | "strip-ansi": "^6.0.1" 1565 | }, 1566 | "engines": { 1567 | "node": ">=8" 1568 | } 1569 | }, 1570 | "node_modules/strip-ansi": { 1571 | "version": "6.0.1", 1572 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 1573 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 1574 | "dev": true, 1575 | "dependencies": { 1576 | "ansi-regex": "^5.0.1" 1577 | }, 1578 | "engines": { 1579 | "node": ">=8" 1580 | } 1581 | }, 1582 | "node_modules/strip-json-comments": { 1583 | "version": "3.1.1", 1584 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 1585 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 1586 | "dev": true, 1587 | "engines": { 1588 | "node": ">=8" 1589 | }, 1590 | "funding": { 1591 | "url": "https://github.com/sponsors/sindresorhus" 1592 | } 1593 | }, 1594 | "node_modules/superstruct": { 1595 | "version": "0.14.2", 1596 | "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", 1597 | "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==", 1598 | "dev": true 1599 | }, 1600 | "node_modules/supports-color": { 1601 | "version": "8.1.1", 1602 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 1603 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 1604 | "dev": true, 1605 | "dependencies": { 1606 | "has-flag": "^4.0.0" 1607 | }, 1608 | "engines": { 1609 | "node": ">=10" 1610 | }, 1611 | "funding": { 1612 | "url": "https://github.com/chalk/supports-color?sponsor=1" 1613 | } 1614 | }, 1615 | "node_modules/text-encoding-utf-8": { 1616 | "version": "1.0.2", 1617 | "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", 1618 | "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==", 1619 | "dev": true 1620 | }, 1621 | "node_modules/through": { 1622 | "version": "2.3.8", 1623 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1624 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1625 | "dev": true 1626 | }, 1627 | "node_modules/to-regex-range": { 1628 | "version": "5.0.1", 1629 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 1630 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 1631 | "dev": true, 1632 | "dependencies": { 1633 | "is-number": "^7.0.0" 1634 | }, 1635 | "engines": { 1636 | "node": ">=8.0" 1637 | } 1638 | }, 1639 | "node_modules/toml": { 1640 | "version": "3.0.0", 1641 | "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", 1642 | "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", 1643 | "dev": true 1644 | }, 1645 | "node_modules/tr46": { 1646 | "version": "0.0.3", 1647 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 1648 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", 1649 | "dev": true 1650 | }, 1651 | "node_modules/tslib": { 1652 | "version": "2.3.1", 1653 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 1654 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", 1655 | "dev": true 1656 | }, 1657 | "node_modules/tweetnacl": { 1658 | "version": "1.0.3", 1659 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 1660 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", 1661 | "dev": true 1662 | }, 1663 | "node_modules/utf-8-validate": { 1664 | "version": "5.0.9", 1665 | "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", 1666 | "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", 1667 | "dev": true, 1668 | "hasInstallScript": true, 1669 | "optional": true, 1670 | "dependencies": { 1671 | "node-gyp-build": "^4.3.0" 1672 | }, 1673 | "engines": { 1674 | "node": ">=6.14.2" 1675 | } 1676 | }, 1677 | "node_modules/uuid": { 1678 | "version": "8.3.2", 1679 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 1680 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 1681 | "dev": true, 1682 | "bin": { 1683 | "uuid": "dist/bin/uuid" 1684 | } 1685 | }, 1686 | "node_modules/webidl-conversions": { 1687 | "version": "3.0.1", 1688 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 1689 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", 1690 | "dev": true 1691 | }, 1692 | "node_modules/whatwg-url": { 1693 | "version": "5.0.0", 1694 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 1695 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 1696 | "dev": true, 1697 | "dependencies": { 1698 | "tr46": "~0.0.3", 1699 | "webidl-conversions": "^3.0.0" 1700 | } 1701 | }, 1702 | "node_modules/which": { 1703 | "version": "2.0.2", 1704 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 1705 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 1706 | "dev": true, 1707 | "dependencies": { 1708 | "isexe": "^2.0.0" 1709 | }, 1710 | "bin": { 1711 | "node-which": "bin/node-which" 1712 | }, 1713 | "engines": { 1714 | "node": ">= 8" 1715 | } 1716 | }, 1717 | "node_modules/workerpool": { 1718 | "version": "6.2.0", 1719 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", 1720 | "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", 1721 | "dev": true 1722 | }, 1723 | "node_modules/wrap-ansi": { 1724 | "version": "7.0.0", 1725 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 1726 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 1727 | "dev": true, 1728 | "dependencies": { 1729 | "ansi-styles": "^4.0.0", 1730 | "string-width": "^4.1.0", 1731 | "strip-ansi": "^6.0.0" 1732 | }, 1733 | "engines": { 1734 | "node": ">=10" 1735 | }, 1736 | "funding": { 1737 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 1738 | } 1739 | }, 1740 | "node_modules/wrappy": { 1741 | "version": "1.0.2", 1742 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1743 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 1744 | "dev": true 1745 | }, 1746 | "node_modules/ws": { 1747 | "version": "7.5.7", 1748 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", 1749 | "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", 1750 | "dev": true, 1751 | "engines": { 1752 | "node": ">=8.3.0" 1753 | }, 1754 | "peerDependencies": { 1755 | "bufferutil": "^4.0.1", 1756 | "utf-8-validate": "^5.0.2" 1757 | }, 1758 | "peerDependenciesMeta": { 1759 | "bufferutil": { 1760 | "optional": true 1761 | }, 1762 | "utf-8-validate": { 1763 | "optional": true 1764 | } 1765 | } 1766 | }, 1767 | "node_modules/y18n": { 1768 | "version": "5.0.8", 1769 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 1770 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 1771 | "dev": true, 1772 | "engines": { 1773 | "node": ">=10" 1774 | } 1775 | }, 1776 | "node_modules/yargs": { 1777 | "version": "16.2.0", 1778 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 1779 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 1780 | "dev": true, 1781 | "dependencies": { 1782 | "cliui": "^7.0.2", 1783 | "escalade": "^3.1.1", 1784 | "get-caller-file": "^2.0.5", 1785 | "require-directory": "^2.1.1", 1786 | "string-width": "^4.2.0", 1787 | "y18n": "^5.0.5", 1788 | "yargs-parser": "^20.2.2" 1789 | }, 1790 | "engines": { 1791 | "node": ">=10" 1792 | } 1793 | }, 1794 | "node_modules/yargs-parser": { 1795 | "version": "20.2.4", 1796 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 1797 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 1798 | "dev": true, 1799 | "engines": { 1800 | "node": ">=10" 1801 | } 1802 | }, 1803 | "node_modules/yargs-unparser": { 1804 | "version": "2.0.0", 1805 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 1806 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 1807 | "dev": true, 1808 | "dependencies": { 1809 | "camelcase": "^6.0.0", 1810 | "decamelize": "^4.0.0", 1811 | "flat": "^5.0.2", 1812 | "is-plain-obj": "^2.1.0" 1813 | }, 1814 | "engines": { 1815 | "node": ">=10" 1816 | } 1817 | }, 1818 | "node_modules/yargs-unparser/node_modules/camelcase": { 1819 | "version": "6.3.0", 1820 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 1821 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 1822 | "dev": true, 1823 | "engines": { 1824 | "node": ">=10" 1825 | }, 1826 | "funding": { 1827 | "url": "https://github.com/sponsors/sindresorhus" 1828 | } 1829 | }, 1830 | "node_modules/yocto-queue": { 1831 | "version": "0.1.0", 1832 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 1833 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 1834 | "dev": true, 1835 | "engines": { 1836 | "node": ">=10" 1837 | }, 1838 | "funding": { 1839 | "url": "https://github.com/sponsors/sindresorhus" 1840 | } 1841 | } 1842 | }, 1843 | "dependencies": { 1844 | "@babel/runtime": { 1845 | "version": "7.17.9", 1846 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.17.9.tgz", 1847 | "integrity": "sha512-lSiBBvodq29uShpWGNbgFdKYNiFDo5/HIYsaCEY9ff4sb10x9jizo2+pRrSyF4jKZCXqgzuqBOQKbUm90gQwJg==", 1848 | "dev": true, 1849 | "requires": { 1850 | "regenerator-runtime": "^0.13.4" 1851 | } 1852 | }, 1853 | "@ethersproject/bytes": { 1854 | "version": "5.6.1", 1855 | "resolved": "https://registry.npmjs.org/@ethersproject/bytes/-/bytes-5.6.1.tgz", 1856 | "integrity": "sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==", 1857 | "dev": true, 1858 | "requires": { 1859 | "@ethersproject/logger": "^5.6.0" 1860 | } 1861 | }, 1862 | "@ethersproject/logger": { 1863 | "version": "5.6.0", 1864 | "resolved": "https://registry.npmjs.org/@ethersproject/logger/-/logger-5.6.0.tgz", 1865 | "integrity": "sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg==", 1866 | "dev": true 1867 | }, 1868 | "@ethersproject/sha2": { 1869 | "version": "5.6.0", 1870 | "resolved": "https://registry.npmjs.org/@ethersproject/sha2/-/sha2-5.6.0.tgz", 1871 | "integrity": "sha512-1tNWCPFLu1n3JM9t4/kytz35DkuF9MxqkGGEHNauEbaARdm2fafnOyw1s0tIQDPKF/7bkP1u3dbrmjpn5CelyA==", 1872 | "dev": true, 1873 | "requires": { 1874 | "@ethersproject/bytes": "^5.6.0", 1875 | "@ethersproject/logger": "^5.6.0", 1876 | "hash.js": "1.1.7" 1877 | } 1878 | }, 1879 | "@project-serum/anchor": { 1880 | "version": "0.24.2", 1881 | "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.24.2.tgz", 1882 | "integrity": "sha512-0/718g8/DnEuwAidUwh5wLYphUYXhUbiClkuRNhvNoa+1Y8a4g2tJyxoae+emV+PG/Gikd/QUBNMkIcimiIRTA==", 1883 | "dev": true, 1884 | "requires": { 1885 | "@project-serum/borsh": "^0.2.5", 1886 | "@solana/web3.js": "^1.36.0", 1887 | "base64-js": "^1.5.1", 1888 | "bn.js": "^5.1.2", 1889 | "bs58": "^4.0.1", 1890 | "buffer-layout": "^1.2.2", 1891 | "camelcase": "^5.3.1", 1892 | "cross-fetch": "^3.1.5", 1893 | "crypto-hash": "^1.3.0", 1894 | "eventemitter3": "^4.0.7", 1895 | "js-sha256": "^0.9.0", 1896 | "pako": "^2.0.3", 1897 | "snake-case": "^3.0.4", 1898 | "toml": "^3.0.0" 1899 | } 1900 | }, 1901 | "@project-serum/anchor-cli": { 1902 | "version": "0.24.2", 1903 | "resolved": "https://registry.npmjs.org/@project-serum/anchor-cli/-/anchor-cli-0.24.2.tgz", 1904 | "integrity": "sha512-3D+fB3n/PAmY5AF2P+zxNvV2ZKx6YLoDlqHXqFa7wGqxVZfTo4WM2O7ChJjU2WIxS/WoTt6qXnehbuGUJ1JXig==", 1905 | "dev": true 1906 | }, 1907 | "@project-serum/borsh": { 1908 | "version": "0.2.5", 1909 | "resolved": "https://registry.npmjs.org/@project-serum/borsh/-/borsh-0.2.5.tgz", 1910 | "integrity": "sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==", 1911 | "dev": true, 1912 | "requires": { 1913 | "bn.js": "^5.1.2", 1914 | "buffer-layout": "^1.2.0" 1915 | } 1916 | }, 1917 | "@solana/buffer-layout": { 1918 | "version": "4.0.0", 1919 | "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.0.tgz", 1920 | "integrity": "sha512-lR0EMP2HC3+Mxwd4YcnZb0smnaDw7Bl2IQWZiTevRH5ZZBZn6VRWn3/92E3qdU4SSImJkA6IDHawOHAnx/qUvQ==", 1921 | "dev": true, 1922 | "requires": { 1923 | "buffer": "~6.0.3" 1924 | }, 1925 | "dependencies": { 1926 | "buffer": { 1927 | "version": "6.0.3", 1928 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 1929 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 1930 | "dev": true, 1931 | "requires": { 1932 | "base64-js": "^1.3.1", 1933 | "ieee754": "^1.2.1" 1934 | } 1935 | } 1936 | } 1937 | }, 1938 | "@solana/buffer-layout-utils": { 1939 | "version": "0.2.0", 1940 | "resolved": "https://registry.npmjs.org/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz", 1941 | "integrity": "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==", 1942 | "dev": true, 1943 | "requires": { 1944 | "@solana/buffer-layout": "^4.0.0", 1945 | "@solana/web3.js": "^1.32.0", 1946 | "bigint-buffer": "^1.1.5", 1947 | "bignumber.js": "^9.0.1" 1948 | } 1949 | }, 1950 | "@solana/web3.js": { 1951 | "version": "1.41.10", 1952 | "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.41.10.tgz", 1953 | "integrity": "sha512-2mPNoxGDt5jZ4MYA+aK7qKzvdXdN0niy7suYfkbrcgAWahJ/WSfPD2W0IvySDdLLfCQojSs7sdHIW+xsKV9dyQ==", 1954 | "dev": true, 1955 | "requires": { 1956 | "@babel/runtime": "^7.12.5", 1957 | "@ethersproject/sha2": "^5.5.0", 1958 | "@solana/buffer-layout": "^4.0.0", 1959 | "@solana/buffer-layout-utils": "^0.2.0", 1960 | "bn.js": "^5.0.0", 1961 | "borsh": "^0.7.0", 1962 | "bs58": "^4.0.1", 1963 | "buffer": "6.0.1", 1964 | "cross-fetch": "^3.1.4", 1965 | "fast-stable-stringify": "^1.0.0", 1966 | "jayson": "^3.4.4", 1967 | "js-sha3": "^0.8.0", 1968 | "rpc-websockets": "^7.4.2", 1969 | "secp256k1": "^4.0.2", 1970 | "superstruct": "^0.14.2", 1971 | "tweetnacl": "^1.0.0" 1972 | } 1973 | }, 1974 | "@types/connect": { 1975 | "version": "3.4.35", 1976 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", 1977 | "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", 1978 | "dev": true, 1979 | "requires": { 1980 | "@types/node": "*" 1981 | } 1982 | }, 1983 | "@types/express-serve-static-core": { 1984 | "version": "4.17.28", 1985 | "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", 1986 | "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", 1987 | "dev": true, 1988 | "requires": { 1989 | "@types/node": "*", 1990 | "@types/qs": "*", 1991 | "@types/range-parser": "*" 1992 | } 1993 | }, 1994 | "@types/lodash": { 1995 | "version": "4.14.182", 1996 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.182.tgz", 1997 | "integrity": "sha512-/THyiqyQAP9AfARo4pF+aCGcyiQ94tX/Is2I7HofNRqoYLgN1PBoOWu2/zTA5zMxzP5EFutMtWtGAFRKUe961Q==", 1998 | "dev": true 1999 | }, 2000 | "@types/node": { 2001 | "version": "12.20.52", 2002 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.52.tgz", 2003 | "integrity": "sha512-cfkwWw72849SNYp3Zx0IcIs25vABmFh73xicxhCkTcvtZQeIez15PpwQN8fY3RD7gv1Wrxlc9MEtfMORZDEsGw==", 2004 | "dev": true 2005 | }, 2006 | "@types/qs": { 2007 | "version": "6.9.7", 2008 | "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", 2009 | "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", 2010 | "dev": true 2011 | }, 2012 | "@types/range-parser": { 2013 | "version": "1.2.4", 2014 | "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", 2015 | "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", 2016 | "dev": true 2017 | }, 2018 | "@types/ws": { 2019 | "version": "7.4.7", 2020 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", 2021 | "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", 2022 | "dev": true, 2023 | "requires": { 2024 | "@types/node": "*" 2025 | } 2026 | }, 2027 | "@ungap/promise-all-settled": { 2028 | "version": "1.1.2", 2029 | "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", 2030 | "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", 2031 | "dev": true 2032 | }, 2033 | "ansi-colors": { 2034 | "version": "4.1.1", 2035 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", 2036 | "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", 2037 | "dev": true 2038 | }, 2039 | "ansi-regex": { 2040 | "version": "5.0.1", 2041 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2042 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2043 | "dev": true 2044 | }, 2045 | "ansi-styles": { 2046 | "version": "4.3.0", 2047 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 2048 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 2049 | "dev": true, 2050 | "requires": { 2051 | "color-convert": "^2.0.1" 2052 | } 2053 | }, 2054 | "anymatch": { 2055 | "version": "3.1.2", 2056 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", 2057 | "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", 2058 | "dev": true, 2059 | "requires": { 2060 | "normalize-path": "^3.0.0", 2061 | "picomatch": "^2.0.4" 2062 | } 2063 | }, 2064 | "argparse": { 2065 | "version": "2.0.1", 2066 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", 2067 | "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", 2068 | "dev": true 2069 | }, 2070 | "balanced-match": { 2071 | "version": "1.0.2", 2072 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 2073 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 2074 | "dev": true 2075 | }, 2076 | "base-x": { 2077 | "version": "3.0.9", 2078 | "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", 2079 | "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", 2080 | "dev": true, 2081 | "requires": { 2082 | "safe-buffer": "^5.0.1" 2083 | } 2084 | }, 2085 | "base64-js": { 2086 | "version": "1.5.1", 2087 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 2088 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 2089 | "dev": true 2090 | }, 2091 | "bigint-buffer": { 2092 | "version": "1.1.5", 2093 | "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", 2094 | "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==", 2095 | "dev": true, 2096 | "requires": { 2097 | "bindings": "^1.3.0" 2098 | } 2099 | }, 2100 | "bignumber.js": { 2101 | "version": "9.0.2", 2102 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.2.tgz", 2103 | "integrity": "sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw==", 2104 | "dev": true 2105 | }, 2106 | "binary-extensions": { 2107 | "version": "2.2.0", 2108 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", 2109 | "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", 2110 | "dev": true 2111 | }, 2112 | "bindings": { 2113 | "version": "1.5.0", 2114 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 2115 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 2116 | "dev": true, 2117 | "requires": { 2118 | "file-uri-to-path": "1.0.0" 2119 | } 2120 | }, 2121 | "bn.js": { 2122 | "version": "5.2.0", 2123 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.0.tgz", 2124 | "integrity": "sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw==", 2125 | "dev": true 2126 | }, 2127 | "borsh": { 2128 | "version": "0.7.0", 2129 | "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", 2130 | "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", 2131 | "dev": true, 2132 | "requires": { 2133 | "bn.js": "^5.2.0", 2134 | "bs58": "^4.0.0", 2135 | "text-encoding-utf-8": "^1.0.2" 2136 | } 2137 | }, 2138 | "brace-expansion": { 2139 | "version": "1.1.11", 2140 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 2141 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 2142 | "dev": true, 2143 | "requires": { 2144 | "balanced-match": "^1.0.0", 2145 | "concat-map": "0.0.1" 2146 | } 2147 | }, 2148 | "braces": { 2149 | "version": "3.0.2", 2150 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", 2151 | "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", 2152 | "dev": true, 2153 | "requires": { 2154 | "fill-range": "^7.0.1" 2155 | } 2156 | }, 2157 | "brorand": { 2158 | "version": "1.1.0", 2159 | "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", 2160 | "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", 2161 | "dev": true 2162 | }, 2163 | "browser-stdout": { 2164 | "version": "1.3.1", 2165 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 2166 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 2167 | "dev": true 2168 | }, 2169 | "bs58": { 2170 | "version": "4.0.1", 2171 | "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", 2172 | "integrity": "sha1-vhYedsNU9veIrkBx9j806MTwpCo=", 2173 | "dev": true, 2174 | "requires": { 2175 | "base-x": "^3.0.2" 2176 | } 2177 | }, 2178 | "buffer": { 2179 | "version": "6.0.1", 2180 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.1.tgz", 2181 | "integrity": "sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ==", 2182 | "dev": true, 2183 | "requires": { 2184 | "base64-js": "^1.3.1", 2185 | "ieee754": "^1.2.1" 2186 | } 2187 | }, 2188 | "buffer-layout": { 2189 | "version": "1.2.2", 2190 | "resolved": "https://registry.npmjs.org/buffer-layout/-/buffer-layout-1.2.2.tgz", 2191 | "integrity": "sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==", 2192 | "dev": true 2193 | }, 2194 | "bufferutil": { 2195 | "version": "4.0.6", 2196 | "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.6.tgz", 2197 | "integrity": "sha512-jduaYOYtnio4aIAyc6UbvPCVcgq7nYpVnucyxr6eCYg/Woad9Hf/oxxBRDnGGjPfjUm6j5O/uBWhIu4iLebFaw==", 2198 | "dev": true, 2199 | "optional": true, 2200 | "requires": { 2201 | "node-gyp-build": "^4.3.0" 2202 | } 2203 | }, 2204 | "camelcase": { 2205 | "version": "5.3.1", 2206 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 2207 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 2208 | "dev": true 2209 | }, 2210 | "chalk": { 2211 | "version": "4.1.2", 2212 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", 2213 | "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", 2214 | "dev": true, 2215 | "requires": { 2216 | "ansi-styles": "^4.1.0", 2217 | "supports-color": "^7.1.0" 2218 | }, 2219 | "dependencies": { 2220 | "supports-color": { 2221 | "version": "7.2.0", 2222 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", 2223 | "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", 2224 | "dev": true, 2225 | "requires": { 2226 | "has-flag": "^4.0.0" 2227 | } 2228 | } 2229 | } 2230 | }, 2231 | "chokidar": { 2232 | "version": "3.5.3", 2233 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", 2234 | "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", 2235 | "dev": true, 2236 | "requires": { 2237 | "anymatch": "~3.1.2", 2238 | "braces": "~3.0.2", 2239 | "fsevents": "~2.3.2", 2240 | "glob-parent": "~5.1.2", 2241 | "is-binary-path": "~2.1.0", 2242 | "is-glob": "~4.0.1", 2243 | "normalize-path": "~3.0.0", 2244 | "readdirp": "~3.6.0" 2245 | } 2246 | }, 2247 | "cliui": { 2248 | "version": "7.0.4", 2249 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", 2250 | "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", 2251 | "dev": true, 2252 | "requires": { 2253 | "string-width": "^4.2.0", 2254 | "strip-ansi": "^6.0.0", 2255 | "wrap-ansi": "^7.0.0" 2256 | } 2257 | }, 2258 | "color-convert": { 2259 | "version": "2.0.1", 2260 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 2261 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 2262 | "dev": true, 2263 | "requires": { 2264 | "color-name": "~1.1.4" 2265 | } 2266 | }, 2267 | "color-name": { 2268 | "version": "1.1.4", 2269 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 2270 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 2271 | "dev": true 2272 | }, 2273 | "commander": { 2274 | "version": "2.20.3", 2275 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 2276 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 2277 | "dev": true 2278 | }, 2279 | "concat-map": { 2280 | "version": "0.0.1", 2281 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 2282 | "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", 2283 | "dev": true 2284 | }, 2285 | "cross-fetch": { 2286 | "version": "3.1.5", 2287 | "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", 2288 | "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", 2289 | "dev": true, 2290 | "requires": { 2291 | "node-fetch": "2.6.7" 2292 | } 2293 | }, 2294 | "crypto-hash": { 2295 | "version": "1.3.0", 2296 | "resolved": "https://registry.npmjs.org/crypto-hash/-/crypto-hash-1.3.0.tgz", 2297 | "integrity": "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==", 2298 | "dev": true 2299 | }, 2300 | "debug": { 2301 | "version": "4.3.3", 2302 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", 2303 | "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", 2304 | "dev": true, 2305 | "requires": { 2306 | "ms": "2.1.2" 2307 | }, 2308 | "dependencies": { 2309 | "ms": { 2310 | "version": "2.1.2", 2311 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 2312 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 2313 | "dev": true 2314 | } 2315 | } 2316 | }, 2317 | "decamelize": { 2318 | "version": "4.0.0", 2319 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", 2320 | "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", 2321 | "dev": true 2322 | }, 2323 | "delay": { 2324 | "version": "5.0.0", 2325 | "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", 2326 | "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", 2327 | "dev": true 2328 | }, 2329 | "diff": { 2330 | "version": "5.0.0", 2331 | "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", 2332 | "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", 2333 | "dev": true 2334 | }, 2335 | "dot-case": { 2336 | "version": "3.0.4", 2337 | "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", 2338 | "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", 2339 | "dev": true, 2340 | "requires": { 2341 | "no-case": "^3.0.4", 2342 | "tslib": "^2.0.3" 2343 | } 2344 | }, 2345 | "elliptic": { 2346 | "version": "6.5.4", 2347 | "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", 2348 | "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", 2349 | "dev": true, 2350 | "requires": { 2351 | "bn.js": "^4.11.9", 2352 | "brorand": "^1.1.0", 2353 | "hash.js": "^1.0.0", 2354 | "hmac-drbg": "^1.0.1", 2355 | "inherits": "^2.0.4", 2356 | "minimalistic-assert": "^1.0.1", 2357 | "minimalistic-crypto-utils": "^1.0.1" 2358 | }, 2359 | "dependencies": { 2360 | "bn.js": { 2361 | "version": "4.12.0", 2362 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", 2363 | "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", 2364 | "dev": true 2365 | } 2366 | } 2367 | }, 2368 | "emoji-regex": { 2369 | "version": "8.0.0", 2370 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2371 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2372 | "dev": true 2373 | }, 2374 | "es6-promise": { 2375 | "version": "4.2.8", 2376 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 2377 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 2378 | "dev": true 2379 | }, 2380 | "es6-promisify": { 2381 | "version": "5.0.0", 2382 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 2383 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 2384 | "dev": true, 2385 | "requires": { 2386 | "es6-promise": "^4.0.3" 2387 | } 2388 | }, 2389 | "escalade": { 2390 | "version": "3.1.1", 2391 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", 2392 | "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", 2393 | "dev": true 2394 | }, 2395 | "escape-string-regexp": { 2396 | "version": "4.0.0", 2397 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 2398 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 2399 | "dev": true 2400 | }, 2401 | "eventemitter3": { 2402 | "version": "4.0.7", 2403 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 2404 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", 2405 | "dev": true 2406 | }, 2407 | "eyes": { 2408 | "version": "0.1.8", 2409 | "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 2410 | "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", 2411 | "dev": true 2412 | }, 2413 | "fast-stable-stringify": { 2414 | "version": "1.0.0", 2415 | "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", 2416 | "integrity": "sha1-XFVDRisiru79NtBbNOUceMuG0xM=", 2417 | "dev": true 2418 | }, 2419 | "file-uri-to-path": { 2420 | "version": "1.0.0", 2421 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 2422 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", 2423 | "dev": true 2424 | }, 2425 | "fill-range": { 2426 | "version": "7.0.1", 2427 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", 2428 | "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", 2429 | "dev": true, 2430 | "requires": { 2431 | "to-regex-range": "^5.0.1" 2432 | } 2433 | }, 2434 | "find-up": { 2435 | "version": "5.0.0", 2436 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", 2437 | "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", 2438 | "dev": true, 2439 | "requires": { 2440 | "locate-path": "^6.0.0", 2441 | "path-exists": "^4.0.0" 2442 | } 2443 | }, 2444 | "flat": { 2445 | "version": "5.0.2", 2446 | "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", 2447 | "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", 2448 | "dev": true 2449 | }, 2450 | "fs.realpath": { 2451 | "version": "1.0.0", 2452 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 2453 | "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", 2454 | "dev": true 2455 | }, 2456 | "fsevents": { 2457 | "version": "2.3.2", 2458 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", 2459 | "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", 2460 | "dev": true, 2461 | "optional": true 2462 | }, 2463 | "get-caller-file": { 2464 | "version": "2.0.5", 2465 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 2466 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 2467 | "dev": true 2468 | }, 2469 | "glob": { 2470 | "version": "7.2.0", 2471 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 2472 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 2473 | "dev": true, 2474 | "requires": { 2475 | "fs.realpath": "^1.0.0", 2476 | "inflight": "^1.0.4", 2477 | "inherits": "2", 2478 | "minimatch": "^3.0.4", 2479 | "once": "^1.3.0", 2480 | "path-is-absolute": "^1.0.0" 2481 | }, 2482 | "dependencies": { 2483 | "minimatch": { 2484 | "version": "3.1.2", 2485 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", 2486 | "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", 2487 | "dev": true, 2488 | "requires": { 2489 | "brace-expansion": "^1.1.7" 2490 | } 2491 | } 2492 | } 2493 | }, 2494 | "glob-parent": { 2495 | "version": "5.1.2", 2496 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 2497 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 2498 | "dev": true, 2499 | "requires": { 2500 | "is-glob": "^4.0.1" 2501 | } 2502 | }, 2503 | "growl": { 2504 | "version": "1.10.5", 2505 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 2506 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 2507 | "dev": true 2508 | }, 2509 | "has-flag": { 2510 | "version": "4.0.0", 2511 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 2512 | "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", 2513 | "dev": true 2514 | }, 2515 | "hash.js": { 2516 | "version": "1.1.7", 2517 | "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", 2518 | "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", 2519 | "dev": true, 2520 | "requires": { 2521 | "inherits": "^2.0.3", 2522 | "minimalistic-assert": "^1.0.1" 2523 | } 2524 | }, 2525 | "he": { 2526 | "version": "1.2.0", 2527 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 2528 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 2529 | "dev": true 2530 | }, 2531 | "hmac-drbg": { 2532 | "version": "1.0.1", 2533 | "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", 2534 | "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", 2535 | "dev": true, 2536 | "requires": { 2537 | "hash.js": "^1.0.3", 2538 | "minimalistic-assert": "^1.0.0", 2539 | "minimalistic-crypto-utils": "^1.0.1" 2540 | } 2541 | }, 2542 | "ieee754": { 2543 | "version": "1.2.1", 2544 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 2545 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 2546 | "dev": true 2547 | }, 2548 | "inflight": { 2549 | "version": "1.0.6", 2550 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 2551 | "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", 2552 | "dev": true, 2553 | "requires": { 2554 | "once": "^1.3.0", 2555 | "wrappy": "1" 2556 | } 2557 | }, 2558 | "inherits": { 2559 | "version": "2.0.4", 2560 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 2561 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 2562 | "dev": true 2563 | }, 2564 | "is-binary-path": { 2565 | "version": "2.1.0", 2566 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 2567 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 2568 | "dev": true, 2569 | "requires": { 2570 | "binary-extensions": "^2.0.0" 2571 | } 2572 | }, 2573 | "is-extglob": { 2574 | "version": "2.1.1", 2575 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 2576 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 2577 | "dev": true 2578 | }, 2579 | "is-fullwidth-code-point": { 2580 | "version": "3.0.0", 2581 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 2582 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 2583 | "dev": true 2584 | }, 2585 | "is-glob": { 2586 | "version": "4.0.3", 2587 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 2588 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 2589 | "dev": true, 2590 | "requires": { 2591 | "is-extglob": "^2.1.1" 2592 | } 2593 | }, 2594 | "is-number": { 2595 | "version": "7.0.0", 2596 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 2597 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 2598 | "dev": true 2599 | }, 2600 | "is-plain-obj": { 2601 | "version": "2.1.0", 2602 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", 2603 | "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", 2604 | "dev": true 2605 | }, 2606 | "is-unicode-supported": { 2607 | "version": "0.1.0", 2608 | "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", 2609 | "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", 2610 | "dev": true 2611 | }, 2612 | "isexe": { 2613 | "version": "2.0.0", 2614 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 2615 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 2616 | "dev": true 2617 | }, 2618 | "isomorphic-ws": { 2619 | "version": "4.0.1", 2620 | "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", 2621 | "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", 2622 | "dev": true, 2623 | "requires": {} 2624 | }, 2625 | "jayson": { 2626 | "version": "3.6.6", 2627 | "resolved": "https://registry.npmjs.org/jayson/-/jayson-3.6.6.tgz", 2628 | "integrity": "sha512-f71uvrAWTtrwoww6MKcl9phQTC+56AopLyEenWvKVAIMz+q0oVGj6tenLZ7Z6UiPBkJtKLj4kt0tACllFQruGQ==", 2629 | "dev": true, 2630 | "requires": { 2631 | "@types/connect": "^3.4.33", 2632 | "@types/express-serve-static-core": "^4.17.9", 2633 | "@types/lodash": "^4.14.159", 2634 | "@types/node": "^12.12.54", 2635 | "@types/ws": "^7.4.4", 2636 | "commander": "^2.20.3", 2637 | "delay": "^5.0.0", 2638 | "es6-promisify": "^5.0.0", 2639 | "eyes": "^0.1.8", 2640 | "isomorphic-ws": "^4.0.1", 2641 | "json-stringify-safe": "^5.0.1", 2642 | "JSONStream": "^1.3.5", 2643 | "lodash": "^4.17.20", 2644 | "uuid": "^8.3.2", 2645 | "ws": "^7.4.5" 2646 | } 2647 | }, 2648 | "js-sha256": { 2649 | "version": "0.9.0", 2650 | "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", 2651 | "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==", 2652 | "dev": true 2653 | }, 2654 | "js-sha3": { 2655 | "version": "0.8.0", 2656 | "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", 2657 | "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", 2658 | "dev": true 2659 | }, 2660 | "js-yaml": { 2661 | "version": "4.1.0", 2662 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", 2663 | "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", 2664 | "dev": true, 2665 | "requires": { 2666 | "argparse": "^2.0.1" 2667 | } 2668 | }, 2669 | "json-stringify-safe": { 2670 | "version": "5.0.1", 2671 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 2672 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 2673 | "dev": true 2674 | }, 2675 | "jsonparse": { 2676 | "version": "1.3.1", 2677 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 2678 | "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", 2679 | "dev": true 2680 | }, 2681 | "JSONStream": { 2682 | "version": "1.3.5", 2683 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", 2684 | "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", 2685 | "dev": true, 2686 | "requires": { 2687 | "jsonparse": "^1.2.0", 2688 | "through": ">=2.2.7 <3" 2689 | } 2690 | }, 2691 | "locate-path": { 2692 | "version": "6.0.0", 2693 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", 2694 | "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", 2695 | "dev": true, 2696 | "requires": { 2697 | "p-locate": "^5.0.0" 2698 | } 2699 | }, 2700 | "lodash": { 2701 | "version": "4.17.21", 2702 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 2703 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", 2704 | "dev": true 2705 | }, 2706 | "log-symbols": { 2707 | "version": "4.1.0", 2708 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", 2709 | "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", 2710 | "dev": true, 2711 | "requires": { 2712 | "chalk": "^4.1.0", 2713 | "is-unicode-supported": "^0.1.0" 2714 | } 2715 | }, 2716 | "lower-case": { 2717 | "version": "2.0.2", 2718 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 2719 | "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 2720 | "dev": true, 2721 | "requires": { 2722 | "tslib": "^2.0.3" 2723 | } 2724 | }, 2725 | "minimalistic-assert": { 2726 | "version": "1.0.1", 2727 | "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", 2728 | "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", 2729 | "dev": true 2730 | }, 2731 | "minimalistic-crypto-utils": { 2732 | "version": "1.0.1", 2733 | "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", 2734 | "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", 2735 | "dev": true 2736 | }, 2737 | "minimatch": { 2738 | "version": "4.2.1", 2739 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", 2740 | "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", 2741 | "dev": true, 2742 | "requires": { 2743 | "brace-expansion": "^1.1.7" 2744 | } 2745 | }, 2746 | "mocha": { 2747 | "version": "9.2.2", 2748 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", 2749 | "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", 2750 | "dev": true, 2751 | "requires": { 2752 | "@ungap/promise-all-settled": "1.1.2", 2753 | "ansi-colors": "4.1.1", 2754 | "browser-stdout": "1.3.1", 2755 | "chokidar": "3.5.3", 2756 | "debug": "4.3.3", 2757 | "diff": "5.0.0", 2758 | "escape-string-regexp": "4.0.0", 2759 | "find-up": "5.0.0", 2760 | "glob": "7.2.0", 2761 | "growl": "1.10.5", 2762 | "he": "1.2.0", 2763 | "js-yaml": "4.1.0", 2764 | "log-symbols": "4.1.0", 2765 | "minimatch": "4.2.1", 2766 | "ms": "2.1.3", 2767 | "nanoid": "3.3.1", 2768 | "serialize-javascript": "6.0.0", 2769 | "strip-json-comments": "3.1.1", 2770 | "supports-color": "8.1.1", 2771 | "which": "2.0.2", 2772 | "workerpool": "6.2.0", 2773 | "yargs": "16.2.0", 2774 | "yargs-parser": "20.2.4", 2775 | "yargs-unparser": "2.0.0" 2776 | } 2777 | }, 2778 | "ms": { 2779 | "version": "2.1.3", 2780 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2781 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2782 | "dev": true 2783 | }, 2784 | "nanoid": { 2785 | "version": "3.3.1", 2786 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", 2787 | "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", 2788 | "dev": true 2789 | }, 2790 | "no-case": { 2791 | "version": "3.0.4", 2792 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 2793 | "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 2794 | "dev": true, 2795 | "requires": { 2796 | "lower-case": "^2.0.2", 2797 | "tslib": "^2.0.3" 2798 | } 2799 | }, 2800 | "node-addon-api": { 2801 | "version": "2.0.2", 2802 | "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-2.0.2.tgz", 2803 | "integrity": "sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==", 2804 | "dev": true 2805 | }, 2806 | "node-fetch": { 2807 | "version": "2.6.7", 2808 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", 2809 | "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", 2810 | "dev": true, 2811 | "requires": { 2812 | "whatwg-url": "^5.0.0" 2813 | } 2814 | }, 2815 | "node-gyp-build": { 2816 | "version": "4.4.0", 2817 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", 2818 | "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", 2819 | "dev": true 2820 | }, 2821 | "normalize-path": { 2822 | "version": "3.0.0", 2823 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2824 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2825 | "dev": true 2826 | }, 2827 | "once": { 2828 | "version": "1.4.0", 2829 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 2830 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 2831 | "dev": true, 2832 | "requires": { 2833 | "wrappy": "1" 2834 | } 2835 | }, 2836 | "p-limit": { 2837 | "version": "3.1.0", 2838 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", 2839 | "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", 2840 | "dev": true, 2841 | "requires": { 2842 | "yocto-queue": "^0.1.0" 2843 | } 2844 | }, 2845 | "p-locate": { 2846 | "version": "5.0.0", 2847 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", 2848 | "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", 2849 | "dev": true, 2850 | "requires": { 2851 | "p-limit": "^3.0.2" 2852 | } 2853 | }, 2854 | "pako": { 2855 | "version": "2.0.4", 2856 | "resolved": "https://registry.npmjs.org/pako/-/pako-2.0.4.tgz", 2857 | "integrity": "sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg==", 2858 | "dev": true 2859 | }, 2860 | "path-exists": { 2861 | "version": "4.0.0", 2862 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", 2863 | "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", 2864 | "dev": true 2865 | }, 2866 | "path-is-absolute": { 2867 | "version": "1.0.1", 2868 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 2869 | "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", 2870 | "dev": true 2871 | }, 2872 | "picomatch": { 2873 | "version": "2.3.1", 2874 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2875 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2876 | "dev": true 2877 | }, 2878 | "prettier": { 2879 | "version": "2.5.1", 2880 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.5.1.tgz", 2881 | "integrity": "sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg==", 2882 | "dev": true 2883 | }, 2884 | "randombytes": { 2885 | "version": "2.1.0", 2886 | "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", 2887 | "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", 2888 | "dev": true, 2889 | "requires": { 2890 | "safe-buffer": "^5.1.0" 2891 | } 2892 | }, 2893 | "readdirp": { 2894 | "version": "3.6.0", 2895 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2896 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2897 | "dev": true, 2898 | "requires": { 2899 | "picomatch": "^2.2.1" 2900 | } 2901 | }, 2902 | "regenerator-runtime": { 2903 | "version": "0.13.9", 2904 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", 2905 | "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", 2906 | "dev": true 2907 | }, 2908 | "require-directory": { 2909 | "version": "2.1.1", 2910 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2911 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 2912 | "dev": true 2913 | }, 2914 | "rpc-websockets": { 2915 | "version": "7.4.18", 2916 | "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.4.18.tgz", 2917 | "integrity": "sha512-bVu+4qM5CkGVlTqJa6FaAxLbb5uRnyH4te7yjFvoCzbnif7PT4BcvXtNTprHlNvsH+/StB81zUQicxMrUrIomA==", 2918 | "dev": true, 2919 | "requires": { 2920 | "@babel/runtime": "^7.17.2", 2921 | "bufferutil": "^4.0.1", 2922 | "eventemitter3": "^4.0.7", 2923 | "utf-8-validate": "^5.0.2", 2924 | "uuid": "^8.3.2", 2925 | "ws": "^8.5.0" 2926 | }, 2927 | "dependencies": { 2928 | "ws": { 2929 | "version": "8.6.0", 2930 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.6.0.tgz", 2931 | "integrity": "sha512-AzmM3aH3gk0aX7/rZLYvjdvZooofDu3fFOzGqcSnQ1tOcTWwhM/o+q++E8mAyVVIyUdajrkzWUGftaVSDLn1bw==", 2932 | "dev": true, 2933 | "requires": {} 2934 | } 2935 | } 2936 | }, 2937 | "safe-buffer": { 2938 | "version": "5.2.1", 2939 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2940 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2941 | "dev": true 2942 | }, 2943 | "secp256k1": { 2944 | "version": "4.0.3", 2945 | "resolved": "https://registry.npmjs.org/secp256k1/-/secp256k1-4.0.3.tgz", 2946 | "integrity": "sha512-NLZVf+ROMxwtEj3Xa562qgv2BK5e2WNmXPiOdVIPLgs6lyTzMvBq0aWTYMI5XCP9jZMVKOcqZLw/Wc4vDkuxhA==", 2947 | "dev": true, 2948 | "requires": { 2949 | "elliptic": "^6.5.4", 2950 | "node-addon-api": "^2.0.0", 2951 | "node-gyp-build": "^4.2.0" 2952 | } 2953 | }, 2954 | "serialize-javascript": { 2955 | "version": "6.0.0", 2956 | "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", 2957 | "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", 2958 | "dev": true, 2959 | "requires": { 2960 | "randombytes": "^2.1.0" 2961 | } 2962 | }, 2963 | "snake-case": { 2964 | "version": "3.0.4", 2965 | "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", 2966 | "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", 2967 | "dev": true, 2968 | "requires": { 2969 | "dot-case": "^3.0.4", 2970 | "tslib": "^2.0.3" 2971 | } 2972 | }, 2973 | "string-width": { 2974 | "version": "4.2.3", 2975 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2976 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2977 | "dev": true, 2978 | "requires": { 2979 | "emoji-regex": "^8.0.0", 2980 | "is-fullwidth-code-point": "^3.0.0", 2981 | "strip-ansi": "^6.0.1" 2982 | } 2983 | }, 2984 | "strip-ansi": { 2985 | "version": "6.0.1", 2986 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2987 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2988 | "dev": true, 2989 | "requires": { 2990 | "ansi-regex": "^5.0.1" 2991 | } 2992 | }, 2993 | "strip-json-comments": { 2994 | "version": "3.1.1", 2995 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2996 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2997 | "dev": true 2998 | }, 2999 | "superstruct": { 3000 | "version": "0.14.2", 3001 | "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", 3002 | "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==", 3003 | "dev": true 3004 | }, 3005 | "supports-color": { 3006 | "version": "8.1.1", 3007 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", 3008 | "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", 3009 | "dev": true, 3010 | "requires": { 3011 | "has-flag": "^4.0.0" 3012 | } 3013 | }, 3014 | "text-encoding-utf-8": { 3015 | "version": "1.0.2", 3016 | "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", 3017 | "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==", 3018 | "dev": true 3019 | }, 3020 | "through": { 3021 | "version": "2.3.8", 3022 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 3023 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 3024 | "dev": true 3025 | }, 3026 | "to-regex-range": { 3027 | "version": "5.0.1", 3028 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 3029 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 3030 | "dev": true, 3031 | "requires": { 3032 | "is-number": "^7.0.0" 3033 | } 3034 | }, 3035 | "toml": { 3036 | "version": "3.0.0", 3037 | "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", 3038 | "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==", 3039 | "dev": true 3040 | }, 3041 | "tr46": { 3042 | "version": "0.0.3", 3043 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 3044 | "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", 3045 | "dev": true 3046 | }, 3047 | "tslib": { 3048 | "version": "2.3.1", 3049 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", 3050 | "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", 3051 | "dev": true 3052 | }, 3053 | "tweetnacl": { 3054 | "version": "1.0.3", 3055 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", 3056 | "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", 3057 | "dev": true 3058 | }, 3059 | "utf-8-validate": { 3060 | "version": "5.0.9", 3061 | "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.9.tgz", 3062 | "integrity": "sha512-Yek7dAy0v3Kl0orwMlvi7TPtiCNrdfHNd7Gcc/pLq4BLXqfAmd0J7OWMizUQnTTJsyjKn02mU7anqwfmUP4J8Q==", 3063 | "dev": true, 3064 | "optional": true, 3065 | "requires": { 3066 | "node-gyp-build": "^4.3.0" 3067 | } 3068 | }, 3069 | "uuid": { 3070 | "version": "8.3.2", 3071 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 3072 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 3073 | "dev": true 3074 | }, 3075 | "webidl-conversions": { 3076 | "version": "3.0.1", 3077 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 3078 | "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=", 3079 | "dev": true 3080 | }, 3081 | "whatwg-url": { 3082 | "version": "5.0.0", 3083 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 3084 | "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=", 3085 | "dev": true, 3086 | "requires": { 3087 | "tr46": "~0.0.3", 3088 | "webidl-conversions": "^3.0.0" 3089 | } 3090 | }, 3091 | "which": { 3092 | "version": "2.0.2", 3093 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3094 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3095 | "dev": true, 3096 | "requires": { 3097 | "isexe": "^2.0.0" 3098 | } 3099 | }, 3100 | "workerpool": { 3101 | "version": "6.2.0", 3102 | "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", 3103 | "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", 3104 | "dev": true 3105 | }, 3106 | "wrap-ansi": { 3107 | "version": "7.0.0", 3108 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3109 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3110 | "dev": true, 3111 | "requires": { 3112 | "ansi-styles": "^4.0.0", 3113 | "string-width": "^4.1.0", 3114 | "strip-ansi": "^6.0.0" 3115 | } 3116 | }, 3117 | "wrappy": { 3118 | "version": "1.0.2", 3119 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 3120 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", 3121 | "dev": true 3122 | }, 3123 | "ws": { 3124 | "version": "7.5.7", 3125 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", 3126 | "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", 3127 | "dev": true, 3128 | "requires": {} 3129 | }, 3130 | "y18n": { 3131 | "version": "5.0.8", 3132 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 3133 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 3134 | "dev": true 3135 | }, 3136 | "yargs": { 3137 | "version": "16.2.0", 3138 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", 3139 | "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", 3140 | "dev": true, 3141 | "requires": { 3142 | "cliui": "^7.0.2", 3143 | "escalade": "^3.1.1", 3144 | "get-caller-file": "^2.0.5", 3145 | "require-directory": "^2.1.1", 3146 | "string-width": "^4.2.0", 3147 | "y18n": "^5.0.5", 3148 | "yargs-parser": "^20.2.2" 3149 | } 3150 | }, 3151 | "yargs-parser": { 3152 | "version": "20.2.4", 3153 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", 3154 | "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", 3155 | "dev": true 3156 | }, 3157 | "yargs-unparser": { 3158 | "version": "2.0.0", 3159 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", 3160 | "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", 3161 | "dev": true, 3162 | "requires": { 3163 | "camelcase": "^6.0.0", 3164 | "decamelize": "^4.0.0", 3165 | "flat": "^5.0.2", 3166 | "is-plain-obj": "^2.1.0" 3167 | }, 3168 | "dependencies": { 3169 | "camelcase": { 3170 | "version": "6.3.0", 3171 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", 3172 | "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", 3173 | "dev": true 3174 | } 3175 | } 3176 | }, 3177 | "yocto-queue": { 3178 | "version": "0.1.0", 3179 | "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", 3180 | "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", 3181 | "dev": true 3182 | } 3183 | } 3184 | } 3185 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "lint": "npx prettier --check tests/", 5 | "lint:fix": "npx prettier --write tests/", 6 | "test": "npx anchor test" 7 | }, 8 | "devDependencies": { 9 | "@project-serum/anchor": "=0.24.2", 10 | "@project-serum/anchor-cli": "=0.24.2", 11 | "mocha": "^9.1.3", 12 | "prettier": "^2.5.1" 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /programs/multisig/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "coral-multisig" 3 | version = "0.9.0" 4 | description = "Created with Anchor" 5 | edition = "2021" 6 | license = "Apache-2.0" 7 | 8 | [lib] 9 | crate-type = ["cdylib", "lib"] 10 | name = "coral_multisig" 11 | 12 | [features] 13 | no-entrypoint = [] 14 | no-idl = [] 15 | cpi = ["no-entrypoint"] 16 | default = [] 17 | 18 | [dependencies] 19 | anchor-lang = "0.25.0" 20 | -------------------------------------------------------------------------------- /programs/multisig/Xargo.toml: -------------------------------------------------------------------------------- 1 | [target.bpfel-unknown-unknown.dependencies.std] 2 | features = [] -------------------------------------------------------------------------------- /programs/multisig/src/lib.rs: -------------------------------------------------------------------------------- 1 | //! An example of a multisig to execute arbitrary Solana transactions. 2 | //! 3 | //! This program can be used to allow a multisig to govern anything a regular 4 | //! Pubkey can govern. One can use the multisig as a BPF program upgrade 5 | //! authority, a mint authority, etc. 6 | //! 7 | //! To use, one must first create a `Multisig` account, specifying two important 8 | //! parameters: 9 | //! 10 | //! 1. Owners - the set of addresses that sign transactions for the multisig. 11 | //! 2. Threshold - the number of signers required to execute a transaction. 12 | //! 13 | //! Once the `Multisig` account is created, one can create a `Transaction` 14 | //! account, specifying the parameters for a normal solana transaction. 15 | //! 16 | //! To sign, owners should invoke the `approve` instruction, and finally, 17 | //! the `execute_transaction`, once enough (i.e. `threshold`) of the owners have 18 | //! signed. 19 | 20 | use anchor_lang::prelude::*; 21 | use anchor_lang::solana_program; 22 | use anchor_lang::solana_program::instruction::Instruction; 23 | use std::convert::Into; 24 | use std::ops::Deref; 25 | 26 | declare_id!("msigUdDBsR4zSUYqYEDrc1LcgtmuSDDM7KxpRUXNC6U"); 27 | 28 | #[program] 29 | pub mod coral_multisig { 30 | use super::*; 31 | 32 | // Initializes a new multisig account with a set of owners and a threshold. 33 | pub fn create_multisig( 34 | ctx: Context, 35 | owners: Vec, 36 | threshold: u64, 37 | nonce: u8, 38 | ) -> Result<()> { 39 | assert_unique_owners(&owners)?; 40 | require!( 41 | threshold > 0 && threshold <= owners.len() as u64, 42 | InvalidThreshold 43 | ); 44 | require!(!owners.is_empty(), InvalidOwnersLen); 45 | 46 | let multisig = &mut ctx.accounts.multisig; 47 | multisig.owners = owners; 48 | multisig.threshold = threshold; 49 | multisig.nonce = nonce; 50 | multisig.owner_set_seqno = 0; 51 | Ok(()) 52 | } 53 | 54 | // Creates a new transaction account, automatically signed by the creator, 55 | // which must be one of the owners of the multisig. 56 | pub fn create_transaction( 57 | ctx: Context, 58 | pid: Pubkey, 59 | accs: Vec, 60 | data: Vec, 61 | ) -> Result<()> { 62 | let owner_index = ctx 63 | .accounts 64 | .multisig 65 | .owners 66 | .iter() 67 | .position(|a| a == ctx.accounts.proposer.key) 68 | .ok_or(ErrorCode::InvalidOwner)?; 69 | 70 | let mut signers = Vec::new(); 71 | signers.resize(ctx.accounts.multisig.owners.len(), false); 72 | signers[owner_index] = true; 73 | 74 | let tx = &mut ctx.accounts.transaction; 75 | tx.program_id = pid; 76 | tx.accounts = accs; 77 | tx.data = data; 78 | tx.signers = signers; 79 | tx.multisig = ctx.accounts.multisig.key(); 80 | tx.did_execute = false; 81 | tx.owner_set_seqno = ctx.accounts.multisig.owner_set_seqno; 82 | 83 | Ok(()) 84 | } 85 | 86 | // Approves a transaction on behalf of an owner of the multisig. 87 | pub fn approve(ctx: Context) -> Result<()> { 88 | let owner_index = ctx 89 | .accounts 90 | .multisig 91 | .owners 92 | .iter() 93 | .position(|a| a == ctx.accounts.owner.key) 94 | .ok_or(ErrorCode::InvalidOwner)?; 95 | 96 | ctx.accounts.transaction.signers[owner_index] = true; 97 | 98 | Ok(()) 99 | } 100 | 101 | // Set owners and threshold at once. 102 | pub fn set_owners_and_change_threshold<'info>( 103 | ctx: Context<'_, '_, '_, 'info, Auth<'info>>, 104 | owners: Vec, 105 | threshold: u64, 106 | ) -> Result<()> { 107 | set_owners( 108 | Context::new( 109 | ctx.program_id, 110 | ctx.accounts, 111 | ctx.remaining_accounts, 112 | ctx.bumps.clone(), 113 | ), 114 | owners, 115 | )?; 116 | change_threshold(ctx, threshold) 117 | } 118 | 119 | // Sets the owners field on the multisig. The only way this can be invoked 120 | // is via a recursive call from execute_transaction -> set_owners. 121 | pub fn set_owners(ctx: Context, owners: Vec) -> Result<()> { 122 | assert_unique_owners(&owners)?; 123 | require!(!owners.is_empty(), InvalidOwnersLen); 124 | 125 | let multisig = &mut ctx.accounts.multisig; 126 | 127 | if (owners.len() as u64) < multisig.threshold { 128 | multisig.threshold = owners.len() as u64; 129 | } 130 | 131 | multisig.owners = owners; 132 | multisig.owner_set_seqno += 1; 133 | 134 | Ok(()) 135 | } 136 | 137 | // Changes the execution threshold of the multisig. The only way this can be 138 | // invoked is via a recursive call from execute_transaction -> 139 | // change_threshold. 140 | pub fn change_threshold(ctx: Context, threshold: u64) -> Result<()> { 141 | require!(threshold > 0, InvalidThreshold); 142 | if threshold > ctx.accounts.multisig.owners.len() as u64 { 143 | return Err(ErrorCode::InvalidThreshold.into()); 144 | } 145 | let multisig = &mut ctx.accounts.multisig; 146 | multisig.threshold = threshold; 147 | Ok(()) 148 | } 149 | 150 | // Executes the given transaction if threshold owners have signed it. 151 | pub fn execute_transaction(ctx: Context) -> Result<()> { 152 | // Has this been executed already? 153 | if ctx.accounts.transaction.did_execute { 154 | return Err(ErrorCode::AlreadyExecuted.into()); 155 | } 156 | 157 | // Do we have enough signers. 158 | let sig_count = ctx 159 | .accounts 160 | .transaction 161 | .signers 162 | .iter() 163 | .filter(|&did_sign| *did_sign) 164 | .count() as u64; 165 | if sig_count < ctx.accounts.multisig.threshold { 166 | return Err(ErrorCode::NotEnoughSigners.into()); 167 | } 168 | 169 | // Execute the transaction signed by the multisig. 170 | let mut ix: Instruction = (*ctx.accounts.transaction).deref().into(); 171 | ix.accounts = ix 172 | .accounts 173 | .iter() 174 | .map(|acc| { 175 | let mut acc = acc.clone(); 176 | if &acc.pubkey == ctx.accounts.multisig_signer.key { 177 | acc.is_signer = true; 178 | } 179 | acc 180 | }) 181 | .collect(); 182 | let multisig_key = ctx.accounts.multisig.key(); 183 | let seeds = &[multisig_key.as_ref(), &[ctx.accounts.multisig.nonce]]; 184 | let signer = &[&seeds[..]]; 185 | let accounts = ctx.remaining_accounts; 186 | solana_program::program::invoke_signed(&ix, accounts, signer)?; 187 | 188 | // Burn the transaction to ensure one time use. 189 | ctx.accounts.transaction.did_execute = true; 190 | 191 | Ok(()) 192 | } 193 | } 194 | 195 | #[derive(Accounts)] 196 | pub struct CreateMultisig<'info> { 197 | #[account(zero, signer)] 198 | multisig: Box>, 199 | } 200 | 201 | #[derive(Accounts)] 202 | pub struct CreateTransaction<'info> { 203 | multisig: Box>, 204 | #[account(zero, signer)] 205 | transaction: Box>, 206 | // One of the owners. Checked in the handler. 207 | proposer: Signer<'info>, 208 | } 209 | 210 | #[derive(Accounts)] 211 | pub struct Approve<'info> { 212 | #[account(constraint = multisig.owner_set_seqno == transaction.owner_set_seqno)] 213 | multisig: Box>, 214 | #[account(mut, has_one = multisig)] 215 | transaction: Box>, 216 | // One of the multisig owners. Checked in the handler. 217 | owner: Signer<'info>, 218 | } 219 | 220 | #[derive(Accounts)] 221 | pub struct Auth<'info> { 222 | #[account(mut)] 223 | multisig: Box>, 224 | #[account( 225 | seeds = [multisig.key().as_ref()], 226 | bump = multisig.nonce, 227 | )] 228 | multisig_signer: Signer<'info>, 229 | } 230 | 231 | #[derive(Accounts)] 232 | pub struct ExecuteTransaction<'info> { 233 | #[account(constraint = multisig.owner_set_seqno == transaction.owner_set_seqno)] 234 | multisig: Box>, 235 | /// CHECK: multisig_signer is a PDA program signer. Data is never read or written to 236 | #[account( 237 | seeds = [multisig.key().as_ref()], 238 | bump = multisig.nonce, 239 | )] 240 | multisig_signer: UncheckedAccount<'info>, 241 | #[account(mut, has_one = multisig)] 242 | transaction: Box>, 243 | } 244 | 245 | #[account] 246 | pub struct Multisig { 247 | pub owners: Vec, 248 | pub threshold: u64, 249 | pub nonce: u8, 250 | pub owner_set_seqno: u32, 251 | } 252 | 253 | #[account] 254 | pub struct Transaction { 255 | // The multisig account this transaction belongs to. 256 | pub multisig: Pubkey, 257 | // Target program to execute against. 258 | pub program_id: Pubkey, 259 | // Accounts requried for the transaction. 260 | pub accounts: Vec, 261 | // Instruction data for the transaction. 262 | pub data: Vec, 263 | // signers[index] is true iff multisig.owners[index] signed the transaction. 264 | pub signers: Vec, 265 | // Boolean ensuring one time execution. 266 | pub did_execute: bool, 267 | // Owner set sequence number. 268 | pub owner_set_seqno: u32, 269 | } 270 | 271 | impl From<&Transaction> for Instruction { 272 | fn from(tx: &Transaction) -> Instruction { 273 | Instruction { 274 | program_id: tx.program_id, 275 | accounts: tx.accounts.iter().map(Into::into).collect(), 276 | data: tx.data.clone(), 277 | } 278 | } 279 | } 280 | 281 | #[derive(AnchorSerialize, AnchorDeserialize, Clone)] 282 | pub struct TransactionAccount { 283 | pub pubkey: Pubkey, 284 | pub is_signer: bool, 285 | pub is_writable: bool, 286 | } 287 | 288 | impl From<&TransactionAccount> for AccountMeta { 289 | fn from(account: &TransactionAccount) -> AccountMeta { 290 | match account.is_writable { 291 | false => AccountMeta::new_readonly(account.pubkey, account.is_signer), 292 | true => AccountMeta::new(account.pubkey, account.is_signer), 293 | } 294 | } 295 | } 296 | 297 | impl From<&AccountMeta> for TransactionAccount { 298 | fn from(account_meta: &AccountMeta) -> TransactionAccount { 299 | TransactionAccount { 300 | pubkey: account_meta.pubkey, 301 | is_signer: account_meta.is_signer, 302 | is_writable: account_meta.is_writable, 303 | } 304 | } 305 | } 306 | 307 | fn assert_unique_owners(owners: &[Pubkey]) -> Result<()> { 308 | for (i, owner) in owners.iter().enumerate() { 309 | require!( 310 | !owners.iter().skip(i + 1).any(|item| item == owner), 311 | UniqueOwners 312 | ) 313 | } 314 | Ok(()) 315 | } 316 | 317 | #[error_code] 318 | pub enum ErrorCode { 319 | #[msg("The given owner is not part of this multisig.")] 320 | InvalidOwner, 321 | #[msg("Owners length must be non zero.")] 322 | InvalidOwnersLen, 323 | #[msg("Not enough owners signed this transaction.")] 324 | NotEnoughSigners, 325 | #[msg("Cannot delete a transaction that has been signed by an owner.")] 326 | TransactionAlreadySigned, 327 | #[msg("Overflow when adding.")] 328 | Overflow, 329 | #[msg("Cannot delete a transaction the owner did not create.")] 330 | UnableToDelete, 331 | #[msg("The given transaction has already been executed.")] 332 | AlreadyExecuted, 333 | #[msg("Threshold must be less than or equal to the number of owners.")] 334 | InvalidThreshold, 335 | #[msg("Owners must be unique")] 336 | UniqueOwners, 337 | } 338 | -------------------------------------------------------------------------------- /tests/multisig.js: -------------------------------------------------------------------------------- 1 | const anchor = require("@project-serum/anchor"); 2 | const assert = require("assert"); 3 | 4 | describe("multisig", () => { 5 | // Configure the client to use the local cluster. 6 | anchor.setProvider(anchor.getProvider()); 7 | 8 | const program = anchor.workspace.CoralMultisig; 9 | 10 | it("Tests the multisig program", async () => { 11 | const multisig = anchor.web3.Keypair.generate(); 12 | const [multisigSigner, nonce] = 13 | await anchor.web3.PublicKey.findProgramAddress( 14 | [multisig.publicKey.toBuffer()], 15 | program.programId 16 | ); 17 | const multisigSize = 200; // Big enough. 18 | 19 | const ownerA = anchor.web3.Keypair.generate(); 20 | const ownerB = anchor.web3.Keypair.generate(); 21 | const ownerC = anchor.web3.Keypair.generate(); 22 | const ownerD = anchor.web3.Keypair.generate(); 23 | const owners = [ownerA.publicKey, ownerB.publicKey, ownerC.publicKey]; 24 | 25 | const threshold = new anchor.BN(2); 26 | await program.rpc.createMultisig(owners, threshold, nonce, { 27 | accounts: { 28 | multisig: multisig.publicKey, 29 | }, 30 | instructions: [ 31 | await program.account.multisig.createInstruction( 32 | multisig, 33 | multisigSize 34 | ), 35 | ], 36 | signers: [multisig], 37 | }); 38 | 39 | let multisigAccount = await program.account.multisig.fetch( 40 | multisig.publicKey 41 | ); 42 | assert.strictEqual(multisigAccount.nonce, nonce); 43 | assert.ok(multisigAccount.threshold.eq(new anchor.BN(2))); 44 | assert.deepStrictEqual(multisigAccount.owners, owners); 45 | assert.ok(multisigAccount.ownerSetSeqno === 0); 46 | 47 | const pid = program.programId; 48 | const accounts = [ 49 | { 50 | pubkey: multisig.publicKey, 51 | isWritable: true, 52 | isSigner: false, 53 | }, 54 | { 55 | pubkey: multisigSigner, 56 | isWritable: false, 57 | isSigner: true, 58 | }, 59 | ]; 60 | const newOwners = [ownerA.publicKey, ownerB.publicKey, ownerD.publicKey]; 61 | const data = program.coder.instruction.encode("set_owners", { 62 | owners: newOwners, 63 | }); 64 | 65 | const transaction = anchor.web3.Keypair.generate(); 66 | const txSize = 1000; // Big enough, cuz I'm lazy. 67 | await program.rpc.createTransaction(pid, accounts, data, { 68 | accounts: { 69 | multisig: multisig.publicKey, 70 | transaction: transaction.publicKey, 71 | proposer: ownerA.publicKey, 72 | }, 73 | instructions: [ 74 | await program.account.transaction.createInstruction( 75 | transaction, 76 | txSize 77 | ), 78 | ], 79 | signers: [transaction, ownerA], 80 | }); 81 | 82 | const txAccount = await program.account.transaction.fetch( 83 | transaction.publicKey 84 | ); 85 | 86 | assert.ok(txAccount.programId.equals(pid)); 87 | assert.deepStrictEqual(txAccount.accounts, accounts); 88 | assert.deepStrictEqual(txAccount.data, data); 89 | assert.ok(txAccount.multisig.equals(multisig.publicKey)); 90 | assert.deepStrictEqual(txAccount.didExecute, false); 91 | assert.ok(txAccount.ownerSetSeqno === 0); 92 | 93 | // Other owner approves transactoin. 94 | await program.rpc.approve({ 95 | accounts: { 96 | multisig: multisig.publicKey, 97 | transaction: transaction.publicKey, 98 | owner: ownerB.publicKey, 99 | }, 100 | signers: [ownerB], 101 | }); 102 | 103 | // Now that we've reached the threshold, send the transactoin. 104 | await program.rpc.executeTransaction({ 105 | accounts: { 106 | multisig: multisig.publicKey, 107 | multisigSigner, 108 | transaction: transaction.publicKey, 109 | }, 110 | remainingAccounts: program.instruction.setOwners 111 | .accounts({ 112 | multisig: multisig.publicKey, 113 | multisigSigner, 114 | }) 115 | // Change the signer status on the vendor signer since it's signed by the program, not the client. 116 | .map((meta) => 117 | meta.pubkey.equals(multisigSigner) 118 | ? { ...meta, isSigner: false } 119 | : meta 120 | ) 121 | .concat({ 122 | pubkey: program.programId, 123 | isWritable: false, 124 | isSigner: false, 125 | }), 126 | }); 127 | 128 | multisigAccount = await program.account.multisig.fetch(multisig.publicKey); 129 | 130 | assert.strictEqual(multisigAccount.nonce, nonce); 131 | assert.ok(multisigAccount.threshold.eq(new anchor.BN(2))); 132 | assert.deepStrictEqual(multisigAccount.owners, newOwners); 133 | assert.ok(multisigAccount.ownerSetSeqno === 1); 134 | }); 135 | 136 | it("Assert Unique Owners", async () => { 137 | const multisig = anchor.web3.Keypair.generate(); 138 | const [_multisigSigner, nonce] = 139 | await anchor.web3.PublicKey.findProgramAddress( 140 | [multisig.publicKey.toBuffer()], 141 | program.programId 142 | ); 143 | const multisigSize = 200; // Big enough. 144 | 145 | const ownerA = anchor.web3.Keypair.generate(); 146 | const ownerB = anchor.web3.Keypair.generate(); 147 | const owners = [ownerA.publicKey, ownerB.publicKey, ownerA.publicKey]; 148 | 149 | const threshold = new anchor.BN(2); 150 | try { 151 | await program.rpc.createMultisig(owners, threshold, nonce, { 152 | accounts: { 153 | multisig: multisig.publicKey, 154 | rent: anchor.web3.SYSVAR_RENT_PUBKEY, 155 | }, 156 | instructions: [ 157 | await program.account.multisig.createInstruction( 158 | multisig, 159 | multisigSize 160 | ), 161 | ], 162 | signers: [multisig], 163 | }); 164 | assert.fail(); 165 | } catch (err) { 166 | const error = err.error; 167 | assert.strictEqual(error.errorCode.number, 6008); 168 | assert.strictEqual(error.errorMessage, "Owners must be unique"); 169 | } 170 | }); 171 | }); 172 | --------------------------------------------------------------------------------