├── .gitignore ├── Anchor.toml ├── Cargo.lock ├── Cargo.toml ├── app ├── .env ├── .env.devnet ├── .env.mainnet ├── .gitignore ├── README.md ├── babel.config.js ├── jsconfig.json ├── package-lock.json ├── package.json ├── postcss.config.js ├── public │ ├── android-chrome-192x192.png │ ├── android-chrome-512x512.png │ ├── apple-touch-icon.png │ ├── browserconfig.xml │ ├── favicon-16x16.png │ ├── favicon-32x32.png │ ├── favicon.ico │ ├── index.html │ ├── mstile-144x144.png │ ├── mstile-150x150.png │ ├── mstile-310x150.png │ ├── mstile-310x310.png │ ├── mstile-70x70.png │ ├── safari-pinned-tab.svg │ └── site.webmanifest ├── src │ ├── App.vue │ ├── api │ │ ├── delete-tweet.js │ │ ├── fetch-tweets.js │ │ ├── get-tweet.js │ │ ├── index.js │ │ ├── send-tweet.js │ │ └── update-tweet.js │ ├── assets │ │ └── logo.png │ ├── components │ │ ├── PageHome.vue │ │ ├── PageNotFound.vue │ │ ├── PageProfile.vue │ │ ├── PageTopics.vue │ │ ├── PageTweet.vue │ │ ├── PageUsers.vue │ │ ├── TheSidebar.vue │ │ ├── TweetCard.vue │ │ ├── TweetForm.vue │ │ ├── TweetFormUpdate.vue │ │ ├── TweetList.vue │ │ └── TweetSearch.vue │ ├── composables │ │ ├── index.js │ │ ├── useAutoresizeTextarea.js │ │ ├── useCountCharacterLimit.js │ │ ├── useFromRoute.js │ │ ├── usePagination.js │ │ ├── useSlug.js │ │ └── useWorkspace.js │ ├── idl │ │ └── solana_twitter.json │ ├── main.css │ ├── main.js │ ├── models │ │ ├── Tweet.js │ │ └── index.js │ └── routes.js ├── tailwind.config.js └── vue.config.js ├── migrations └── deploy.ts ├── package.json ├── programs └── solana-twitter │ ├── Cargo.toml │ ├── Xargo.toml │ └── src │ └── lib.rs ├── tests └── solana-twitter.ts ├── tsconfig.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | .anchor 3 | .DS_Store 4 | target 5 | **/*.rs.bk 6 | node_modules 7 | test-ledger 8 | -------------------------------------------------------------------------------- /Anchor.toml: -------------------------------------------------------------------------------- 1 | [programs.localnet] 2 | solana_twitter = "BNDCEb5uXCuWDxJW9BGmbfvR1JBMAKckfhYrEKW2Bv1W" 3 | 4 | [programs.devnet] 5 | solana_twitter = "BNDCEb5uXCuWDxJW9BGmbfvR1JBMAKckfhYrEKW2Bv1W" 6 | 7 | [programs.mainnet] 8 | solana_twitter = "BNDCEb5uXCuWDxJW9BGmbfvR1JBMAKckfhYrEKW2Bv1W" 9 | 10 | [registry] 11 | url = "https://anchor.projectserum.com" 12 | 13 | [provider] 14 | cluster = "localnet" 15 | wallet = "/Users/loris/.config/solana/id.json" 16 | 17 | [scripts] 18 | test = "yarn run ts-mocha -p ./tsconfig.json -t 1000000 tests/**/*.ts" 19 | copy-idl = "mkdir -p app/src/idl && cp target/idl/solana_twitter.json app/src/idl/solana_twitter.json" 20 | -------------------------------------------------------------------------------- /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.18" 14 | source = "registry+https://github.com/rust-lang/crates.io-index" 15 | checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" 16 | dependencies = [ 17 | "memchr", 18 | ] 19 | 20 | [[package]] 21 | name = "anchor-attribute-access-control" 22 | version = "0.21.0" 23 | source = "registry+https://github.com/rust-lang/crates.io-index" 24 | checksum = "8573731461c6e39febd16026fe95cbc99955585b08acddc0baaeefb803da191b" 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.21.0" 37 | source = "registry+https://github.com/rust-lang/crates.io-index" 38 | checksum = "537c6e7014f727f3396759f73a847bdbca92379499d918c99ae1c7075d6d32e3" 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.21.0" 52 | source = "registry+https://github.com/rust-lang/crates.io-index" 53 | checksum = "4fce62e28b84fe3622044d5777e6962cf090049ef45d1bc29d0fbbc027b848d8" 54 | dependencies = [ 55 | "anchor-syn", 56 | "proc-macro2", 57 | "syn", 58 | ] 59 | 60 | [[package]] 61 | name = "anchor-attribute-error" 62 | version = "0.21.0" 63 | source = "registry+https://github.com/rust-lang/crates.io-index" 64 | checksum = "2cd2fe5dd4d1e82ff9d0b948170ab4ad3b12fa16ad6f45a3a3ce4dd97e543935" 65 | dependencies = [ 66 | "anchor-syn", 67 | "proc-macro2", 68 | "quote", 69 | "syn", 70 | ] 71 | 72 | [[package]] 73 | name = "anchor-attribute-event" 74 | version = "0.21.0" 75 | source = "registry+https://github.com/rust-lang/crates.io-index" 76 | checksum = "8437fd23a6c92e0d7ee6378aef4e95596976008eb3a0be100ac832b7b3eaf240" 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.21.0" 88 | source = "registry+https://github.com/rust-lang/crates.io-index" 89 | checksum = "8567efb892ec10df7cb479dc0246257f896b2de1406c6901621d5437080fc041" 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.21.0" 102 | source = "registry+https://github.com/rust-lang/crates.io-index" 103 | checksum = "4b8674fa15f24b311451294595034617b96348faed14c821fe191183d46258af" 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.21.0" 115 | source = "registry+https://github.com/rust-lang/crates.io-index" 116 | checksum = "e3921cd5b29b8fe7ff10368a5dd8398f37b1dabef489d18a01a4befd86ce09d6" 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.21.0" 128 | source = "registry+https://github.com/rust-lang/crates.io-index" 129 | checksum = "5f41be15286b4fc2753cd2dab130ca7c87d81a2817adb7d0af5316715ddf4b46" 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.21.0" 141 | source = "registry+https://github.com/rust-lang/crates.io-index" 142 | checksum = "f4300d151a09cb0c0775cdd63100040c8dba325b406c55ffb4f845f4b78d9e9b" 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.21.0" 165 | source = "registry+https://github.com/rust-lang/crates.io-index" 166 | checksum = "7c8a4e39f655a9e32037c238f51f09b168a7d56ab6a2727777da81849559c77c" 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", 177 | "syn", 178 | "thiserror", 179 | ] 180 | 181 | [[package]] 182 | name = "anyhow" 183 | version = "1.0.52" 184 | source = "registry+https://github.com/rust-lang/crates.io-index" 185 | checksum = "84450d0b4a8bd1ba4144ce8ce718fbc5d071358b1e5384bace6536b3d1f2d5b3" 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 = "atty" 201 | version = "0.2.14" 202 | source = "registry+https://github.com/rust-lang/crates.io-index" 203 | checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" 204 | dependencies = [ 205 | "hermit-abi", 206 | "libc", 207 | "winapi", 208 | ] 209 | 210 | [[package]] 211 | name = "autocfg" 212 | version = "1.0.1" 213 | source = "registry+https://github.com/rust-lang/crates.io-index" 214 | checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" 215 | 216 | [[package]] 217 | name = "base64" 218 | version = "0.12.3" 219 | source = "registry+https://github.com/rust-lang/crates.io-index" 220 | checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" 221 | 222 | [[package]] 223 | name = "base64" 224 | version = "0.13.0" 225 | source = "registry+https://github.com/rust-lang/crates.io-index" 226 | checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" 227 | 228 | [[package]] 229 | name = "bincode" 230 | version = "1.3.3" 231 | source = "registry+https://github.com/rust-lang/crates.io-index" 232 | checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" 233 | dependencies = [ 234 | "serde", 235 | ] 236 | 237 | [[package]] 238 | name = "bitflags" 239 | version = "1.3.2" 240 | source = "registry+https://github.com/rust-lang/crates.io-index" 241 | checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" 242 | 243 | [[package]] 244 | name = "blake3" 245 | version = "1.3.0" 246 | source = "registry+https://github.com/rust-lang/crates.io-index" 247 | checksum = "882e99e4a0cb2ae6cb6e442102e8e6b7131718d94110e64c3e6a34ea9b106f37" 248 | dependencies = [ 249 | "arrayref", 250 | "arrayvec", 251 | "cc", 252 | "cfg-if", 253 | "constant_time_eq", 254 | "digest 0.10.1", 255 | ] 256 | 257 | [[package]] 258 | name = "block-buffer" 259 | version = "0.9.0" 260 | source = "registry+https://github.com/rust-lang/crates.io-index" 261 | checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" 262 | dependencies = [ 263 | "block-padding", 264 | "generic-array", 265 | ] 266 | 267 | [[package]] 268 | name = "block-buffer" 269 | version = "0.10.0" 270 | source = "registry+https://github.com/rust-lang/crates.io-index" 271 | checksum = "f1d36a02058e76b040de25a4464ba1c80935655595b661505c8b39b664828b95" 272 | dependencies = [ 273 | "generic-array", 274 | ] 275 | 276 | [[package]] 277 | name = "block-padding" 278 | version = "0.2.1" 279 | source = "registry+https://github.com/rust-lang/crates.io-index" 280 | checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" 281 | 282 | [[package]] 283 | name = "borsh" 284 | version = "0.9.1" 285 | source = "registry+https://github.com/rust-lang/crates.io-index" 286 | checksum = "18dda7dc709193c0d86a1a51050a926dc3df1cf262ec46a23a25dba421ea1924" 287 | dependencies = [ 288 | "borsh-derive", 289 | "hashbrown", 290 | ] 291 | 292 | [[package]] 293 | name = "borsh-derive" 294 | version = "0.9.1" 295 | source = "registry+https://github.com/rust-lang/crates.io-index" 296 | checksum = "684155372435f578c0fa1acd13ebbb182cc19d6b38b64ae7901da4393217d264" 297 | dependencies = [ 298 | "borsh-derive-internal", 299 | "borsh-schema-derive-internal", 300 | "proc-macro-crate", 301 | "proc-macro2", 302 | "syn", 303 | ] 304 | 305 | [[package]] 306 | name = "borsh-derive-internal" 307 | version = "0.9.1" 308 | source = "registry+https://github.com/rust-lang/crates.io-index" 309 | checksum = "2102f62f8b6d3edeab871830782285b64cc1830168094db05c8e458f209bc5c3" 310 | dependencies = [ 311 | "proc-macro2", 312 | "quote", 313 | "syn", 314 | ] 315 | 316 | [[package]] 317 | name = "borsh-schema-derive-internal" 318 | version = "0.9.1" 319 | source = "registry+https://github.com/rust-lang/crates.io-index" 320 | checksum = "196c978c4c9b0b142d446ef3240690bf5a8a33497074a113ff9a337ccb750483" 321 | dependencies = [ 322 | "proc-macro2", 323 | "quote", 324 | "syn", 325 | ] 326 | 327 | [[package]] 328 | name = "bs58" 329 | version = "0.3.1" 330 | source = "registry+https://github.com/rust-lang/crates.io-index" 331 | checksum = "476e9cd489f9e121e02ffa6014a8ef220ecb15c05ed23fc34cca13925dc283fb" 332 | 333 | [[package]] 334 | name = "bs58" 335 | version = "0.4.0" 336 | source = "registry+https://github.com/rust-lang/crates.io-index" 337 | checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3" 338 | 339 | [[package]] 340 | name = "bumpalo" 341 | version = "3.9.1" 342 | source = "registry+https://github.com/rust-lang/crates.io-index" 343 | checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899" 344 | 345 | [[package]] 346 | name = "bv" 347 | version = "0.11.1" 348 | source = "registry+https://github.com/rust-lang/crates.io-index" 349 | checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" 350 | dependencies = [ 351 | "feature-probe", 352 | "serde", 353 | ] 354 | 355 | [[package]] 356 | name = "bytemuck" 357 | version = "1.7.3" 358 | source = "registry+https://github.com/rust-lang/crates.io-index" 359 | checksum = "439989e6b8c38d1b6570a384ef1e49c8848128f5a97f3914baef02920842712f" 360 | dependencies = [ 361 | "bytemuck_derive", 362 | ] 363 | 364 | [[package]] 365 | name = "bytemuck_derive" 366 | version = "1.0.1" 367 | source = "registry+https://github.com/rust-lang/crates.io-index" 368 | checksum = "8e215f8c2f9f79cb53c8335e687ffd07d5bfcb6fe5fc80723762d0be46e7cc54" 369 | dependencies = [ 370 | "proc-macro2", 371 | "quote", 372 | "syn", 373 | ] 374 | 375 | [[package]] 376 | name = "byteorder" 377 | version = "1.4.3" 378 | source = "registry+https://github.com/rust-lang/crates.io-index" 379 | checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" 380 | 381 | [[package]] 382 | name = "cc" 383 | version = "1.0.72" 384 | source = "registry+https://github.com/rust-lang/crates.io-index" 385 | checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" 386 | 387 | [[package]] 388 | name = "cfg-if" 389 | version = "1.0.0" 390 | source = "registry+https://github.com/rust-lang/crates.io-index" 391 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" 392 | 393 | [[package]] 394 | name = "console_error_panic_hook" 395 | version = "0.1.7" 396 | source = "registry+https://github.com/rust-lang/crates.io-index" 397 | checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" 398 | dependencies = [ 399 | "cfg-if", 400 | "wasm-bindgen", 401 | ] 402 | 403 | [[package]] 404 | name = "console_log" 405 | version = "0.2.0" 406 | source = "registry+https://github.com/rust-lang/crates.io-index" 407 | checksum = "501a375961cef1a0d44767200e66e4a559283097e91d0730b1d75dfb2f8a1494" 408 | dependencies = [ 409 | "log", 410 | "web-sys", 411 | ] 412 | 413 | [[package]] 414 | name = "constant_time_eq" 415 | version = "0.1.5" 416 | source = "registry+https://github.com/rust-lang/crates.io-index" 417 | checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" 418 | 419 | [[package]] 420 | name = "cpufeatures" 421 | version = "0.2.1" 422 | source = "registry+https://github.com/rust-lang/crates.io-index" 423 | checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" 424 | dependencies = [ 425 | "libc", 426 | ] 427 | 428 | [[package]] 429 | name = "crunchy" 430 | version = "0.2.2" 431 | source = "registry+https://github.com/rust-lang/crates.io-index" 432 | checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" 433 | 434 | [[package]] 435 | name = "crypto-common" 436 | version = "0.1.1" 437 | source = "registry+https://github.com/rust-lang/crates.io-index" 438 | checksum = "683d6b536309245c849479fba3da410962a43ed8e51c26b729208ec0ac2798d0" 439 | dependencies = [ 440 | "generic-array", 441 | ] 442 | 443 | [[package]] 444 | name = "crypto-mac" 445 | version = "0.8.0" 446 | source = "registry+https://github.com/rust-lang/crates.io-index" 447 | checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" 448 | dependencies = [ 449 | "generic-array", 450 | "subtle", 451 | ] 452 | 453 | [[package]] 454 | name = "curve25519-dalek" 455 | version = "3.2.0" 456 | source = "registry+https://github.com/rust-lang/crates.io-index" 457 | checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" 458 | dependencies = [ 459 | "byteorder", 460 | "digest 0.9.0", 461 | "rand_core", 462 | "subtle", 463 | "zeroize", 464 | ] 465 | 466 | [[package]] 467 | name = "digest" 468 | version = "0.9.0" 469 | source = "registry+https://github.com/rust-lang/crates.io-index" 470 | checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" 471 | dependencies = [ 472 | "generic-array", 473 | ] 474 | 475 | [[package]] 476 | name = "digest" 477 | version = "0.10.1" 478 | source = "registry+https://github.com/rust-lang/crates.io-index" 479 | checksum = "b697d66081d42af4fba142d56918a3cb21dc8eb63372c6b85d14f44fb9c5979b" 480 | dependencies = [ 481 | "block-buffer 0.10.0", 482 | "crypto-common", 483 | "generic-array", 484 | "subtle", 485 | ] 486 | 487 | [[package]] 488 | name = "either" 489 | version = "1.6.1" 490 | source = "registry+https://github.com/rust-lang/crates.io-index" 491 | checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" 492 | 493 | [[package]] 494 | name = "env_logger" 495 | version = "0.9.0" 496 | source = "registry+https://github.com/rust-lang/crates.io-index" 497 | checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3" 498 | dependencies = [ 499 | "atty", 500 | "humantime", 501 | "log", 502 | "regex", 503 | "termcolor", 504 | ] 505 | 506 | [[package]] 507 | name = "feature-probe" 508 | version = "0.1.1" 509 | source = "registry+https://github.com/rust-lang/crates.io-index" 510 | checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" 511 | 512 | [[package]] 513 | name = "generic-array" 514 | version = "0.14.5" 515 | source = "registry+https://github.com/rust-lang/crates.io-index" 516 | checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803" 517 | dependencies = [ 518 | "serde", 519 | "typenum", 520 | "version_check", 521 | ] 522 | 523 | [[package]] 524 | name = "getrandom" 525 | version = "0.1.16" 526 | source = "registry+https://github.com/rust-lang/crates.io-index" 527 | checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" 528 | dependencies = [ 529 | "cfg-if", 530 | "js-sys", 531 | "libc", 532 | "wasi", 533 | "wasm-bindgen", 534 | ] 535 | 536 | [[package]] 537 | name = "hashbrown" 538 | version = "0.9.1" 539 | source = "registry+https://github.com/rust-lang/crates.io-index" 540 | checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" 541 | dependencies = [ 542 | "ahash", 543 | ] 544 | 545 | [[package]] 546 | name = "heck" 547 | version = "0.3.3" 548 | source = "registry+https://github.com/rust-lang/crates.io-index" 549 | checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" 550 | dependencies = [ 551 | "unicode-segmentation", 552 | ] 553 | 554 | [[package]] 555 | name = "hermit-abi" 556 | version = "0.1.19" 557 | source = "registry+https://github.com/rust-lang/crates.io-index" 558 | checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" 559 | dependencies = [ 560 | "libc", 561 | ] 562 | 563 | [[package]] 564 | name = "hmac" 565 | version = "0.8.1" 566 | source = "registry+https://github.com/rust-lang/crates.io-index" 567 | checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" 568 | dependencies = [ 569 | "crypto-mac", 570 | "digest 0.9.0", 571 | ] 572 | 573 | [[package]] 574 | name = "hmac-drbg" 575 | version = "0.3.0" 576 | source = "registry+https://github.com/rust-lang/crates.io-index" 577 | checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" 578 | dependencies = [ 579 | "digest 0.9.0", 580 | "generic-array", 581 | "hmac", 582 | ] 583 | 584 | [[package]] 585 | name = "humantime" 586 | version = "2.1.0" 587 | source = "registry+https://github.com/rust-lang/crates.io-index" 588 | checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" 589 | 590 | [[package]] 591 | name = "instant" 592 | version = "0.1.12" 593 | source = "registry+https://github.com/rust-lang/crates.io-index" 594 | checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" 595 | dependencies = [ 596 | "cfg-if", 597 | ] 598 | 599 | [[package]] 600 | name = "itertools" 601 | version = "0.10.3" 602 | source = "registry+https://github.com/rust-lang/crates.io-index" 603 | checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" 604 | dependencies = [ 605 | "either", 606 | ] 607 | 608 | [[package]] 609 | name = "itoa" 610 | version = "1.0.1" 611 | source = "registry+https://github.com/rust-lang/crates.io-index" 612 | checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" 613 | 614 | [[package]] 615 | name = "js-sys" 616 | version = "0.3.55" 617 | source = "registry+https://github.com/rust-lang/crates.io-index" 618 | checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" 619 | dependencies = [ 620 | "wasm-bindgen", 621 | ] 622 | 623 | [[package]] 624 | name = "keccak" 625 | version = "0.1.0" 626 | source = "registry+https://github.com/rust-lang/crates.io-index" 627 | checksum = "67c21572b4949434e4fc1e1978b99c5f77064153c59d998bf13ecd96fb5ecba7" 628 | 629 | [[package]] 630 | name = "lazy_static" 631 | version = "1.4.0" 632 | source = "registry+https://github.com/rust-lang/crates.io-index" 633 | checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" 634 | 635 | [[package]] 636 | name = "libc" 637 | version = "0.2.112" 638 | source = "registry+https://github.com/rust-lang/crates.io-index" 639 | checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" 640 | 641 | [[package]] 642 | name = "libsecp256k1" 643 | version = "0.6.0" 644 | source = "registry+https://github.com/rust-lang/crates.io-index" 645 | checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" 646 | dependencies = [ 647 | "arrayref", 648 | "base64 0.12.3", 649 | "digest 0.9.0", 650 | "hmac-drbg", 651 | "libsecp256k1-core", 652 | "libsecp256k1-gen-ecmult", 653 | "libsecp256k1-gen-genmult", 654 | "rand", 655 | "serde", 656 | "sha2", 657 | "typenum", 658 | ] 659 | 660 | [[package]] 661 | name = "libsecp256k1-core" 662 | version = "0.2.2" 663 | source = "registry+https://github.com/rust-lang/crates.io-index" 664 | checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" 665 | dependencies = [ 666 | "crunchy", 667 | "digest 0.9.0", 668 | "subtle", 669 | ] 670 | 671 | [[package]] 672 | name = "libsecp256k1-gen-ecmult" 673 | version = "0.2.1" 674 | source = "registry+https://github.com/rust-lang/crates.io-index" 675 | checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" 676 | dependencies = [ 677 | "libsecp256k1-core", 678 | ] 679 | 680 | [[package]] 681 | name = "libsecp256k1-gen-genmult" 682 | version = "0.2.1" 683 | source = "registry+https://github.com/rust-lang/crates.io-index" 684 | checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" 685 | dependencies = [ 686 | "libsecp256k1-core", 687 | ] 688 | 689 | [[package]] 690 | name = "lock_api" 691 | version = "0.4.5" 692 | source = "registry+https://github.com/rust-lang/crates.io-index" 693 | checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" 694 | dependencies = [ 695 | "scopeguard", 696 | ] 697 | 698 | [[package]] 699 | name = "log" 700 | version = "0.4.14" 701 | source = "registry+https://github.com/rust-lang/crates.io-index" 702 | checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" 703 | dependencies = [ 704 | "cfg-if", 705 | ] 706 | 707 | [[package]] 708 | name = "memchr" 709 | version = "2.4.1" 710 | source = "registry+https://github.com/rust-lang/crates.io-index" 711 | checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" 712 | 713 | [[package]] 714 | name = "memmap2" 715 | version = "0.5.2" 716 | source = "registry+https://github.com/rust-lang/crates.io-index" 717 | checksum = "fe3179b85e1fd8b14447cbebadb75e45a1002f541b925f0bfec366d56a81c56d" 718 | dependencies = [ 719 | "libc", 720 | ] 721 | 722 | [[package]] 723 | name = "num-derive" 724 | version = "0.3.3" 725 | source = "registry+https://github.com/rust-lang/crates.io-index" 726 | checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" 727 | dependencies = [ 728 | "proc-macro2", 729 | "quote", 730 | "syn", 731 | ] 732 | 733 | [[package]] 734 | name = "num-traits" 735 | version = "0.2.14" 736 | source = "registry+https://github.com/rust-lang/crates.io-index" 737 | checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" 738 | dependencies = [ 739 | "autocfg", 740 | ] 741 | 742 | [[package]] 743 | name = "opaque-debug" 744 | version = "0.3.0" 745 | source = "registry+https://github.com/rust-lang/crates.io-index" 746 | checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" 747 | 748 | [[package]] 749 | name = "parking_lot" 750 | version = "0.11.2" 751 | source = "registry+https://github.com/rust-lang/crates.io-index" 752 | checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" 753 | dependencies = [ 754 | "instant", 755 | "lock_api", 756 | "parking_lot_core", 757 | ] 758 | 759 | [[package]] 760 | name = "parking_lot_core" 761 | version = "0.8.5" 762 | source = "registry+https://github.com/rust-lang/crates.io-index" 763 | checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" 764 | dependencies = [ 765 | "cfg-if", 766 | "instant", 767 | "libc", 768 | "redox_syscall", 769 | "smallvec", 770 | "winapi", 771 | ] 772 | 773 | [[package]] 774 | name = "ppv-lite86" 775 | version = "0.2.16" 776 | source = "registry+https://github.com/rust-lang/crates.io-index" 777 | checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872" 778 | 779 | [[package]] 780 | name = "proc-macro-crate" 781 | version = "0.1.5" 782 | source = "registry+https://github.com/rust-lang/crates.io-index" 783 | checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" 784 | dependencies = [ 785 | "toml", 786 | ] 787 | 788 | [[package]] 789 | name = "proc-macro2" 790 | version = "1.0.36" 791 | source = "registry+https://github.com/rust-lang/crates.io-index" 792 | checksum = "c7342d5883fbccae1cc37a2353b09c87c9b0f3afd73f5fb9bba687a1f733b029" 793 | dependencies = [ 794 | "unicode-xid", 795 | ] 796 | 797 | [[package]] 798 | name = "proc-macro2-diagnostics" 799 | version = "0.9.1" 800 | source = "registry+https://github.com/rust-lang/crates.io-index" 801 | checksum = "4bf29726d67464d49fa6224a1d07936a8c08bb3fba727c7493f6cf1616fdaada" 802 | dependencies = [ 803 | "proc-macro2", 804 | "quote", 805 | "syn", 806 | "version_check", 807 | "yansi", 808 | ] 809 | 810 | [[package]] 811 | name = "quote" 812 | version = "1.0.14" 813 | source = "registry+https://github.com/rust-lang/crates.io-index" 814 | checksum = "47aa80447ce4daf1717500037052af176af5d38cc3e571d9ec1c7353fc10c87d" 815 | dependencies = [ 816 | "proc-macro2", 817 | ] 818 | 819 | [[package]] 820 | name = "rand" 821 | version = "0.7.3" 822 | source = "registry+https://github.com/rust-lang/crates.io-index" 823 | checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" 824 | dependencies = [ 825 | "getrandom", 826 | "libc", 827 | "rand_chacha", 828 | "rand_core", 829 | "rand_hc", 830 | ] 831 | 832 | [[package]] 833 | name = "rand_chacha" 834 | version = "0.2.2" 835 | source = "registry+https://github.com/rust-lang/crates.io-index" 836 | checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" 837 | dependencies = [ 838 | "ppv-lite86", 839 | "rand_core", 840 | ] 841 | 842 | [[package]] 843 | name = "rand_core" 844 | version = "0.5.1" 845 | source = "registry+https://github.com/rust-lang/crates.io-index" 846 | checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" 847 | dependencies = [ 848 | "getrandom", 849 | ] 850 | 851 | [[package]] 852 | name = "rand_hc" 853 | version = "0.2.0" 854 | source = "registry+https://github.com/rust-lang/crates.io-index" 855 | checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" 856 | dependencies = [ 857 | "rand_core", 858 | ] 859 | 860 | [[package]] 861 | name = "redox_syscall" 862 | version = "0.2.10" 863 | source = "registry+https://github.com/rust-lang/crates.io-index" 864 | checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" 865 | dependencies = [ 866 | "bitflags", 867 | ] 868 | 869 | [[package]] 870 | name = "regex" 871 | version = "1.5.4" 872 | source = "registry+https://github.com/rust-lang/crates.io-index" 873 | checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" 874 | dependencies = [ 875 | "aho-corasick", 876 | "memchr", 877 | "regex-syntax", 878 | ] 879 | 880 | [[package]] 881 | name = "regex-syntax" 882 | version = "0.6.25" 883 | source = "registry+https://github.com/rust-lang/crates.io-index" 884 | checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" 885 | 886 | [[package]] 887 | name = "rustc_version" 888 | version = "0.4.0" 889 | source = "registry+https://github.com/rust-lang/crates.io-index" 890 | checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" 891 | dependencies = [ 892 | "semver", 893 | ] 894 | 895 | [[package]] 896 | name = "rustversion" 897 | version = "1.0.6" 898 | source = "registry+https://github.com/rust-lang/crates.io-index" 899 | checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" 900 | 901 | [[package]] 902 | name = "ryu" 903 | version = "1.0.9" 904 | source = "registry+https://github.com/rust-lang/crates.io-index" 905 | checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" 906 | 907 | [[package]] 908 | name = "scopeguard" 909 | version = "1.1.0" 910 | source = "registry+https://github.com/rust-lang/crates.io-index" 911 | checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" 912 | 913 | [[package]] 914 | name = "semver" 915 | version = "1.0.4" 916 | source = "registry+https://github.com/rust-lang/crates.io-index" 917 | checksum = "568a8e6258aa33c13358f81fd834adb854c6f7c9468520910a9b1e8fac068012" 918 | 919 | [[package]] 920 | name = "serde" 921 | version = "1.0.133" 922 | source = "registry+https://github.com/rust-lang/crates.io-index" 923 | checksum = "97565067517b60e2d1ea8b268e59ce036de907ac523ad83a0475da04e818989a" 924 | dependencies = [ 925 | "serde_derive", 926 | ] 927 | 928 | [[package]] 929 | name = "serde_bytes" 930 | version = "0.11.5" 931 | source = "registry+https://github.com/rust-lang/crates.io-index" 932 | checksum = "16ae07dd2f88a366f15bd0632ba725227018c69a1c8550a927324f8eb8368bb9" 933 | dependencies = [ 934 | "serde", 935 | ] 936 | 937 | [[package]] 938 | name = "serde_derive" 939 | version = "1.0.133" 940 | source = "registry+https://github.com/rust-lang/crates.io-index" 941 | checksum = "ed201699328568d8d08208fdd080e3ff594e6c422e438b6705905da01005d537" 942 | dependencies = [ 943 | "proc-macro2", 944 | "quote", 945 | "syn", 946 | ] 947 | 948 | [[package]] 949 | name = "serde_json" 950 | version = "1.0.74" 951 | source = "registry+https://github.com/rust-lang/crates.io-index" 952 | checksum = "ee2bb9cd061c5865d345bb02ca49fcef1391741b672b54a0bf7b679badec3142" 953 | dependencies = [ 954 | "itoa", 955 | "ryu", 956 | "serde", 957 | ] 958 | 959 | [[package]] 960 | name = "sha2" 961 | version = "0.9.9" 962 | source = "registry+https://github.com/rust-lang/crates.io-index" 963 | checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" 964 | dependencies = [ 965 | "block-buffer 0.9.0", 966 | "cfg-if", 967 | "cpufeatures", 968 | "digest 0.9.0", 969 | "opaque-debug", 970 | ] 971 | 972 | [[package]] 973 | name = "sha3" 974 | version = "0.9.1" 975 | source = "registry+https://github.com/rust-lang/crates.io-index" 976 | checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" 977 | dependencies = [ 978 | "block-buffer 0.9.0", 979 | "digest 0.9.0", 980 | "keccak", 981 | "opaque-debug", 982 | ] 983 | 984 | [[package]] 985 | name = "smallvec" 986 | version = "1.8.0" 987 | source = "registry+https://github.com/rust-lang/crates.io-index" 988 | checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" 989 | 990 | [[package]] 991 | name = "solana-frozen-abi" 992 | version = "1.9.4" 993 | source = "registry+https://github.com/rust-lang/crates.io-index" 994 | checksum = "c89bcde59ac3e8d4dbf7c4d990b0627b8ca0d25394c4ce17896dde7a1452e40c" 995 | dependencies = [ 996 | "bs58 0.4.0", 997 | "bv", 998 | "generic-array", 999 | "log", 1000 | "memmap2", 1001 | "rustc_version", 1002 | "serde", 1003 | "serde_derive", 1004 | "sha2", 1005 | "solana-frozen-abi-macro", 1006 | "solana-logger", 1007 | "thiserror", 1008 | ] 1009 | 1010 | [[package]] 1011 | name = "solana-frozen-abi-macro" 1012 | version = "1.9.4" 1013 | source = "registry+https://github.com/rust-lang/crates.io-index" 1014 | checksum = "56a7d630da35993631ecc4dd155f92d0d58000cdde3d5e2764fe9fd49d20a3a8" 1015 | dependencies = [ 1016 | "proc-macro2", 1017 | "quote", 1018 | "rustc_version", 1019 | "syn", 1020 | ] 1021 | 1022 | [[package]] 1023 | name = "solana-logger" 1024 | version = "1.9.4" 1025 | source = "registry+https://github.com/rust-lang/crates.io-index" 1026 | checksum = "6eaf925bb665de46f96fcea2c8a900d0d870a96fd1f50cf2bad16e22a1da71c4" 1027 | dependencies = [ 1028 | "env_logger", 1029 | "lazy_static", 1030 | "log", 1031 | ] 1032 | 1033 | [[package]] 1034 | name = "solana-program" 1035 | version = "1.9.4" 1036 | source = "registry+https://github.com/rust-lang/crates.io-index" 1037 | checksum = "2fc4d7a0baa649a3bda06d6a1cc30bd3d8ac692702a75fa8e76369cf7b3f6329" 1038 | dependencies = [ 1039 | "base64 0.13.0", 1040 | "bincode", 1041 | "bitflags", 1042 | "blake3", 1043 | "borsh", 1044 | "borsh-derive", 1045 | "bs58 0.4.0", 1046 | "bv", 1047 | "bytemuck", 1048 | "console_error_panic_hook", 1049 | "console_log", 1050 | "curve25519-dalek", 1051 | "getrandom", 1052 | "itertools", 1053 | "js-sys", 1054 | "lazy_static", 1055 | "libsecp256k1", 1056 | "log", 1057 | "num-derive", 1058 | "num-traits", 1059 | "parking_lot", 1060 | "rand", 1061 | "rustc_version", 1062 | "rustversion", 1063 | "serde", 1064 | "serde_bytes", 1065 | "serde_derive", 1066 | "sha2", 1067 | "sha3", 1068 | "solana-frozen-abi", 1069 | "solana-frozen-abi-macro", 1070 | "solana-logger", 1071 | "solana-sdk-macro", 1072 | "thiserror", 1073 | "wasm-bindgen", 1074 | ] 1075 | 1076 | [[package]] 1077 | name = "solana-sdk-macro" 1078 | version = "1.9.4" 1079 | source = "registry+https://github.com/rust-lang/crates.io-index" 1080 | checksum = "ec22a924c73abe3376a2046715a2f6a9ae4094095b8ea08e8e56e8de198264ad" 1081 | dependencies = [ 1082 | "bs58 0.4.0", 1083 | "proc-macro2", 1084 | "quote", 1085 | "rustversion", 1086 | "syn", 1087 | ] 1088 | 1089 | [[package]] 1090 | name = "solana-twitter" 1091 | version = "0.1.0" 1092 | dependencies = [ 1093 | "anchor-lang", 1094 | ] 1095 | 1096 | [[package]] 1097 | name = "subtle" 1098 | version = "2.4.1" 1099 | source = "registry+https://github.com/rust-lang/crates.io-index" 1100 | checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" 1101 | 1102 | [[package]] 1103 | name = "syn" 1104 | version = "1.0.85" 1105 | source = "registry+https://github.com/rust-lang/crates.io-index" 1106 | checksum = "a684ac3dcd8913827e18cd09a68384ee66c1de24157e3c556c9ab16d85695fb7" 1107 | dependencies = [ 1108 | "proc-macro2", 1109 | "quote", 1110 | "unicode-xid", 1111 | ] 1112 | 1113 | [[package]] 1114 | name = "termcolor" 1115 | version = "1.1.2" 1116 | source = "registry+https://github.com/rust-lang/crates.io-index" 1117 | checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" 1118 | dependencies = [ 1119 | "winapi-util", 1120 | ] 1121 | 1122 | [[package]] 1123 | name = "thiserror" 1124 | version = "1.0.30" 1125 | source = "registry+https://github.com/rust-lang/crates.io-index" 1126 | checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" 1127 | dependencies = [ 1128 | "thiserror-impl", 1129 | ] 1130 | 1131 | [[package]] 1132 | name = "thiserror-impl" 1133 | version = "1.0.30" 1134 | source = "registry+https://github.com/rust-lang/crates.io-index" 1135 | checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" 1136 | dependencies = [ 1137 | "proc-macro2", 1138 | "quote", 1139 | "syn", 1140 | ] 1141 | 1142 | [[package]] 1143 | name = "toml" 1144 | version = "0.5.8" 1145 | source = "registry+https://github.com/rust-lang/crates.io-index" 1146 | checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" 1147 | dependencies = [ 1148 | "serde", 1149 | ] 1150 | 1151 | [[package]] 1152 | name = "typenum" 1153 | version = "1.15.0" 1154 | source = "registry+https://github.com/rust-lang/crates.io-index" 1155 | checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987" 1156 | 1157 | [[package]] 1158 | name = "unicode-segmentation" 1159 | version = "1.8.0" 1160 | source = "registry+https://github.com/rust-lang/crates.io-index" 1161 | checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" 1162 | 1163 | [[package]] 1164 | name = "unicode-xid" 1165 | version = "0.2.2" 1166 | source = "registry+https://github.com/rust-lang/crates.io-index" 1167 | checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" 1168 | 1169 | [[package]] 1170 | name = "version_check" 1171 | version = "0.9.4" 1172 | source = "registry+https://github.com/rust-lang/crates.io-index" 1173 | checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" 1174 | 1175 | [[package]] 1176 | name = "wasi" 1177 | version = "0.9.0+wasi-snapshot-preview1" 1178 | source = "registry+https://github.com/rust-lang/crates.io-index" 1179 | checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" 1180 | 1181 | [[package]] 1182 | name = "wasm-bindgen" 1183 | version = "0.2.78" 1184 | source = "registry+https://github.com/rust-lang/crates.io-index" 1185 | checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" 1186 | dependencies = [ 1187 | "cfg-if", 1188 | "wasm-bindgen-macro", 1189 | ] 1190 | 1191 | [[package]] 1192 | name = "wasm-bindgen-backend" 1193 | version = "0.2.78" 1194 | source = "registry+https://github.com/rust-lang/crates.io-index" 1195 | checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" 1196 | dependencies = [ 1197 | "bumpalo", 1198 | "lazy_static", 1199 | "log", 1200 | "proc-macro2", 1201 | "quote", 1202 | "syn", 1203 | "wasm-bindgen-shared", 1204 | ] 1205 | 1206 | [[package]] 1207 | name = "wasm-bindgen-macro" 1208 | version = "0.2.78" 1209 | source = "registry+https://github.com/rust-lang/crates.io-index" 1210 | checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" 1211 | dependencies = [ 1212 | "quote", 1213 | "wasm-bindgen-macro-support", 1214 | ] 1215 | 1216 | [[package]] 1217 | name = "wasm-bindgen-macro-support" 1218 | version = "0.2.78" 1219 | source = "registry+https://github.com/rust-lang/crates.io-index" 1220 | checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" 1221 | dependencies = [ 1222 | "proc-macro2", 1223 | "quote", 1224 | "syn", 1225 | "wasm-bindgen-backend", 1226 | "wasm-bindgen-shared", 1227 | ] 1228 | 1229 | [[package]] 1230 | name = "wasm-bindgen-shared" 1231 | version = "0.2.78" 1232 | source = "registry+https://github.com/rust-lang/crates.io-index" 1233 | checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" 1234 | 1235 | [[package]] 1236 | name = "web-sys" 1237 | version = "0.3.55" 1238 | source = "registry+https://github.com/rust-lang/crates.io-index" 1239 | checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" 1240 | dependencies = [ 1241 | "js-sys", 1242 | "wasm-bindgen", 1243 | ] 1244 | 1245 | [[package]] 1246 | name = "winapi" 1247 | version = "0.3.9" 1248 | source = "registry+https://github.com/rust-lang/crates.io-index" 1249 | checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" 1250 | dependencies = [ 1251 | "winapi-i686-pc-windows-gnu", 1252 | "winapi-x86_64-pc-windows-gnu", 1253 | ] 1254 | 1255 | [[package]] 1256 | name = "winapi-i686-pc-windows-gnu" 1257 | version = "0.4.0" 1258 | source = "registry+https://github.com/rust-lang/crates.io-index" 1259 | checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" 1260 | 1261 | [[package]] 1262 | name = "winapi-util" 1263 | version = "0.1.5" 1264 | source = "registry+https://github.com/rust-lang/crates.io-index" 1265 | checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" 1266 | dependencies = [ 1267 | "winapi", 1268 | ] 1269 | 1270 | [[package]] 1271 | name = "winapi-x86_64-pc-windows-gnu" 1272 | version = "0.4.0" 1273 | source = "registry+https://github.com/rust-lang/crates.io-index" 1274 | checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" 1275 | 1276 | [[package]] 1277 | name = "yansi" 1278 | version = "0.5.0" 1279 | source = "registry+https://github.com/rust-lang/crates.io-index" 1280 | checksum = "9fc79f4a1e39857fc00c3f662cbf2651c771f00e9c15fe2abc341806bd46bd71" 1281 | 1282 | [[package]] 1283 | name = "zeroize" 1284 | version = "1.5.0" 1285 | source = "registry+https://github.com/rust-lang/crates.io-index" 1286 | checksum = "cc222aec311c323c717f56060324f32b82da1ce1dd81d9a09aa6a9030bfe08db" 1287 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [workspace] 2 | members = [ 3 | "programs/*" 4 | ] 5 | -------------------------------------------------------------------------------- /app/.env: -------------------------------------------------------------------------------- 1 | VUE_APP_CLUSTER_URL="http://127.0.0.1:8899" 2 | -------------------------------------------------------------------------------- /app/.env.devnet: -------------------------------------------------------------------------------- 1 | VUE_APP_CLUSTER_URL="https://api.devnet.solana.com" 2 | -------------------------------------------------------------------------------- /app/.env.mainnet: -------------------------------------------------------------------------------- 1 | VUE_APP_CLUSTER_URL="https://api.mainnet-beta.solana.com" 2 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | pnpm-debug.log* 15 | 16 | # Editor directories and files 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw? 24 | -------------------------------------------------------------------------------- /app/README.md: -------------------------------------------------------------------------------- 1 | # app 2 | 3 | ## Project setup 4 | ``` 5 | npm install 6 | ``` 7 | 8 | ### Compiles and hot-reloads for development 9 | ``` 10 | npm run serve 11 | ``` 12 | 13 | ### Compiles and minifies for production 14 | ``` 15 | npm run build 16 | ``` 17 | 18 | ### Lints and fixes files 19 | ``` 20 | npm run lint 21 | ``` 22 | 23 | ### Customize configuration 24 | See [Configuration Reference](https://cli.vuejs.org/config/). 25 | -------------------------------------------------------------------------------- /app/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/cli-plugin-babel/preset' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /app/jsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "esnext", 5 | "baseUrl": "./", 6 | "moduleResolution": "node", 7 | "paths": { 8 | "@/*": [ 9 | "src/*" 10 | ] 11 | }, 12 | "lib": [ 13 | "esnext", 14 | "dom", 15 | "dom.iterable", 16 | "scripthost" 17 | ] 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "app", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "vue-cli-service serve", 7 | "serve:devnet": "vue-cli-service serve --mode devnet", 8 | "serve:mainnet": "vue-cli-service serve --mode mainnet", 9 | "build": "vue-cli-service build", 10 | "build:devnet": "vue-cli-service build --mode devnet", 11 | "build:mainnet": "vue-cli-service build --mode mainnet", 12 | "lint": "vue-cli-service lint" 13 | }, 14 | "dependencies": { 15 | "@project-serum/anchor": "^0.21.0", 16 | "@solana/wallet-adapter-wallets": "^0.15.4", 17 | "@solana/web3.js": "^1.31.0", 18 | "autoprefixer": "^10.4.0", 19 | "core-js": "^3.8.3", 20 | "dayjs": "^1.10.7", 21 | "postcss": "^8.4.1", 22 | "solana-wallets-vue": "^0.3.2", 23 | "tailwindcss": "^2.2.19", 24 | "vue": "^3.2.13", 25 | "vue-router": "^4.0.12" 26 | }, 27 | "devDependencies": { 28 | "@babel/core": "^7.12.16", 29 | "@babel/eslint-parser": "^7.12.16", 30 | "@vue/cli-plugin-babel": "~5.0.0-rc.1", 31 | "@vue/cli-plugin-eslint": "~5.0.0-rc.1", 32 | "@vue/cli-service": "~5.0.0-rc.1", 33 | "eslint": "^7.32.0", 34 | "eslint-plugin-vue": "^8.0.3" 35 | }, 36 | "eslintConfig": { 37 | "root": true, 38 | "env": { 39 | "node": true, 40 | "vue/setup-compiler-macros": true 41 | }, 42 | "extends": [ 43 | "plugin:vue/vue3-essential", 44 | "eslint:recommended" 45 | ], 46 | "parserOptions": { 47 | "parser": "@babel/eslint-parser" 48 | }, 49 | "rules": { 50 | "vue/script-setup-uses-vars": "error" 51 | } 52 | }, 53 | "browserslist": [ 54 | "> 1%", 55 | "last 2 versions", 56 | "not dead", 57 | "not ie 11" 58 | ] 59 | } 60 | -------------------------------------------------------------------------------- /app/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /app/public/android-chrome-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorisleiva/solana-twitter/75d654cc6a8d3ee09bbc3506435347f2a768ef0e/app/public/android-chrome-192x192.png -------------------------------------------------------------------------------- /app/public/android-chrome-512x512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorisleiva/solana-twitter/75d654cc6a8d3ee09bbc3506435347f2a768ef0e/app/public/android-chrome-512x512.png -------------------------------------------------------------------------------- /app/public/apple-touch-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorisleiva/solana-twitter/75d654cc6a8d3ee09bbc3506435347f2a768ef0e/app/public/apple-touch-icon.png -------------------------------------------------------------------------------- /app/public/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | #ec4899 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /app/public/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorisleiva/solana-twitter/75d654cc6a8d3ee09bbc3506435347f2a768ef0e/app/public/favicon-16x16.png -------------------------------------------------------------------------------- /app/public/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorisleiva/solana-twitter/75d654cc6a8d3ee09bbc3506435347f2a768ef0e/app/public/favicon-32x32.png -------------------------------------------------------------------------------- /app/public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorisleiva/solana-twitter/75d654cc6a8d3ee09bbc3506435347f2a768ef0e/app/public/favicon.ico -------------------------------------------------------------------------------- /app/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | Solana Twitter 15 | 16 | 17 | 20 |
21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /app/public/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorisleiva/solana-twitter/75d654cc6a8d3ee09bbc3506435347f2a768ef0e/app/public/mstile-144x144.png -------------------------------------------------------------------------------- /app/public/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorisleiva/solana-twitter/75d654cc6a8d3ee09bbc3506435347f2a768ef0e/app/public/mstile-150x150.png -------------------------------------------------------------------------------- /app/public/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorisleiva/solana-twitter/75d654cc6a8d3ee09bbc3506435347f2a768ef0e/app/public/mstile-310x150.png -------------------------------------------------------------------------------- /app/public/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorisleiva/solana-twitter/75d654cc6a8d3ee09bbc3506435347f2a768ef0e/app/public/mstile-310x310.png -------------------------------------------------------------------------------- /app/public/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorisleiva/solana-twitter/75d654cc6a8d3ee09bbc3506435347f2a768ef0e/app/public/mstile-70x70.png -------------------------------------------------------------------------------- /app/public/safari-pinned-tab.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | Created by potrace 1.14, written by Peter Selinger 2001-2017 9 | 10 | 12 | 18 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /app/public/site.webmanifest: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "short_name": "", 4 | "icons": [ 5 | { 6 | "src": "/android-chrome-192x192.png", 7 | "sizes": "192x192", 8 | "type": "image/png" 9 | }, 10 | { 11 | "src": "/android-chrome-512x512.png", 12 | "sizes": "512x512", 13 | "type": "image/png" 14 | } 15 | ], 16 | "theme_color": "#ffffff", 17 | "background_color": "#ffffff", 18 | "display": "standalone" 19 | } 20 | -------------------------------------------------------------------------------- /app/src/App.vue: -------------------------------------------------------------------------------- 1 | 18 | 19 | 34 | -------------------------------------------------------------------------------- /app/src/api/delete-tweet.js: -------------------------------------------------------------------------------- 1 | import { useWorkspace } from '@/composables' 2 | 3 | export const deleteTweet = async (tweet) => { 4 | const { wallet, program } = useWorkspace() 5 | await program.value.rpc.deleteTweet({ 6 | accounts: { 7 | author: wallet.value.publicKey, 8 | tweet: tweet.publicKey, 9 | }, 10 | }) 11 | } 12 | -------------------------------------------------------------------------------- /app/src/api/fetch-tweets.js: -------------------------------------------------------------------------------- 1 | import { useWorkspace, usePagination } from '@/composables' 2 | import { Tweet } from '@/models' 3 | import bs58 from 'bs58' 4 | import { BN } from '@project-serum/anchor' 5 | import { computed, ref } from 'vue' 6 | 7 | export const fetchTweets = async (filters = []) => { 8 | const { program } = useWorkspace() 9 | const tweets = await program.value.account.tweet.all(filters); 10 | return tweets.map(tweet => new Tweet(tweet.publicKey, tweet.account)) 11 | } 12 | 13 | export const paginateTweets = (filters = [], perPage = 6, onNewPage = () => {}) => { 14 | filters = ref(filters) 15 | const { program, connection } = useWorkspace() 16 | const page = ref(0) 17 | 18 | const prefetchCb = async () => { 19 | // Reset page number. 20 | page.value = 0 21 | 22 | // Prepare the discriminator filter. 23 | const tweetClient = program.value.account.tweet 24 | const tweetAccountName = tweetClient._idlAccount.name 25 | const tweetDiscriminatorFilter = { 26 | memcmp: tweetClient.coder.accounts.memcmp(tweetAccountName) 27 | } 28 | 29 | // Prefetch all tweets with their timestamps only. 30 | const allTweets = await connection.getProgramAccounts(program.value.programId, { 31 | filters: [tweetDiscriminatorFilter, ...filters.value], 32 | dataSlice: { offset: 40, length: 8 }, 33 | }) 34 | 35 | // Parse the timestamp from the account's data. 36 | const allTweetsWithTimestamps = allTweets.map(({ account, pubkey }) => ({ 37 | pubkey, 38 | timestamp: new BN(account.data, 'le'), 39 | })) 40 | 41 | return allTweetsWithTimestamps 42 | .sort((a, b) => b.timestamp.cmp(a.timestamp)) 43 | .map(({ pubkey }) => pubkey) 44 | } 45 | 46 | const pageCb = async (page, paginatedPublicKeys) => { 47 | const tweets = await program.value.account.tweet.fetchMultiple(paginatedPublicKeys) 48 | 49 | return tweets.reduce((accumulator, tweet, index) => { 50 | const publicKey = paginatedPublicKeys[index] 51 | accumulator.push(new Tweet(publicKey, tweet)) 52 | return accumulator 53 | }, []) 54 | } 55 | 56 | const pagination = usePagination(perPage, prefetchCb, pageCb) 57 | const { hasPage, getPage } = pagination 58 | 59 | const hasNextPage = computed(() => hasPage(page.value + 1)) 60 | const getNextPage = async () => { 61 | const newPageTweets = await getPage(page.value + 1) 62 | page.value += 1 63 | onNewPage(newPageTweets) 64 | } 65 | 66 | return { page, hasNextPage, getNextPage, ...pagination } 67 | } 68 | 69 | export const authorFilter = authorBase58PublicKey => ({ 70 | memcmp: { 71 | offset: 8, // Discriminator. 72 | bytes: authorBase58PublicKey, 73 | } 74 | }) 75 | 76 | export const topicFilter = topic => ({ 77 | memcmp: { 78 | offset: 8 + // Discriminator. 79 | 32 + // Author public key. 80 | 8 + // Timestamp. 81 | 4, // Topic string prefix. 82 | bytes: bs58.encode(Buffer.from(topic)), 83 | } 84 | }) 85 | -------------------------------------------------------------------------------- /app/src/api/get-tweet.js: -------------------------------------------------------------------------------- 1 | import { useWorkspace } from '@/composables' 2 | import { Tweet } from '@/models' 3 | 4 | export const getTweet = async (publicKey) => { 5 | const { program } = useWorkspace() 6 | const account = await program.value.account.tweet.fetch(publicKey); 7 | return new Tweet(publicKey, account) 8 | } 9 | -------------------------------------------------------------------------------- /app/src/api/index.js: -------------------------------------------------------------------------------- 1 | export * from './delete-tweet' 2 | export * from './fetch-tweets' 3 | export * from './get-tweet' 4 | export * from './send-tweet' 5 | export * from './update-tweet' 6 | -------------------------------------------------------------------------------- /app/src/api/send-tweet.js: -------------------------------------------------------------------------------- 1 | import { web3 } from '@project-serum/anchor' 2 | import { useWorkspace } from '@/composables' 3 | import { Tweet } from '@/models' 4 | 5 | export const sendTweet = async (topic, content) => { 6 | const { wallet, program } = useWorkspace() 7 | const tweet = web3.Keypair.generate() 8 | 9 | await program.value.rpc.sendTweet(topic, content, { 10 | accounts: { 11 | author: wallet.value.publicKey, 12 | tweet: tweet.publicKey, 13 | systemProgram: web3.SystemProgram.programId, 14 | }, 15 | signers: [tweet] 16 | }) 17 | 18 | const tweetAccount = await program.value.account.tweet.fetch(tweet.publicKey) 19 | return new Tweet(tweet.publicKey, tweetAccount) 20 | } 21 | -------------------------------------------------------------------------------- /app/src/api/update-tweet.js: -------------------------------------------------------------------------------- 1 | import { useWorkspace } from '@/composables' 2 | 3 | export const updateTweet = async (tweet, topic, content) => { 4 | const { wallet, program } = useWorkspace() 5 | await program.value.rpc.updateTweet(topic, content, { 6 | accounts: { 7 | author: wallet.value.publicKey, 8 | tweet: tweet.publicKey, 9 | }, 10 | }) 11 | 12 | tweet.topic = topic 13 | tweet.content = content 14 | } 15 | -------------------------------------------------------------------------------- /app/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/lorisleiva/solana-twitter/75d654cc6a8d3ee09bbc3506435347f2a768ef0e/app/src/assets/logo.png -------------------------------------------------------------------------------- /app/src/components/PageHome.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 19 | -------------------------------------------------------------------------------- /app/src/components/PageNotFound.vue: -------------------------------------------------------------------------------- 1 | 9 | -------------------------------------------------------------------------------- /app/src/components/PageProfile.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 32 | -------------------------------------------------------------------------------- /app/src/components/PageTopics.vue: -------------------------------------------------------------------------------- 1 | 47 | 48 | 64 | -------------------------------------------------------------------------------- /app/src/components/PageTweet.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 34 | -------------------------------------------------------------------------------- /app/src/components/PageUsers.vue: -------------------------------------------------------------------------------- 1 | 43 | 44 | 59 | -------------------------------------------------------------------------------- /app/src/components/TheSidebar.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 58 | -------------------------------------------------------------------------------- /app/src/components/TweetCard.vue: -------------------------------------------------------------------------------- 1 | 30 | 31 | 68 | -------------------------------------------------------------------------------- /app/src/components/TweetForm.vue: -------------------------------------------------------------------------------- 1 | 45 | 46 | 99 | -------------------------------------------------------------------------------- /app/src/components/TweetFormUpdate.vue: -------------------------------------------------------------------------------- 1 | 42 | 43 | 118 | -------------------------------------------------------------------------------- /app/src/components/TweetList.vue: -------------------------------------------------------------------------------- 1 | 22 | 23 | 36 | -------------------------------------------------------------------------------- /app/src/components/TweetSearch.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 39 | -------------------------------------------------------------------------------- /app/src/composables/index.js: -------------------------------------------------------------------------------- 1 | export * from './useAutoresizeTextarea' 2 | export * from './useCountCharacterLimit' 3 | export * from './useFromRoute' 4 | export * from './usePagination' 5 | export * from './useSlug' 6 | export * from './useWorkspace' 7 | -------------------------------------------------------------------------------- /app/src/composables/useAutoresizeTextarea.js: -------------------------------------------------------------------------------- 1 | import { watchEffect } from "vue" 2 | 3 | export const useAutoresizeTextarea = (element) => { 4 | const resizeTextarea = () => { 5 | element.value.style.height = 'auto' 6 | element.value.style.height = element.value.scrollHeight + 'px' 7 | } 8 | 9 | watchEffect(onInvalidate => { 10 | if (! element.value) return 11 | resizeTextarea() 12 | element.value.addEventListener('input', resizeTextarea) 13 | onInvalidate(() => element.value?.removeEventListener('input', resizeTextarea)) 14 | }) 15 | } 16 | -------------------------------------------------------------------------------- /app/src/composables/useCountCharacterLimit.js: -------------------------------------------------------------------------------- 1 | import { ref, watchEffect } from "vue" 2 | 3 | export const useCountCharacterLimit = (text, limit) => { 4 | const characterLimit = ref(0) 5 | watchEffect(() => characterLimit.value = limit - text.value?.length) 6 | 7 | return characterLimit 8 | } 9 | -------------------------------------------------------------------------------- /app/src/composables/useFromRoute.js: -------------------------------------------------------------------------------- 1 | import { onBeforeRouteUpdate, useRoute } from 'vue-router' 2 | 3 | export const useFromRoute = (fn) => { 4 | fn(useRoute(), null) 5 | onBeforeRouteUpdate((to, from, next) => { 6 | fn(to, from) 7 | next() 8 | }) 9 | } 10 | -------------------------------------------------------------------------------- /app/src/composables/usePagination.js: -------------------------------------------------------------------------------- 1 | import { computed, ref } from 'vue'; 2 | 3 | export const usePagination = (perPage, prefetchCb, pageCb) => { 4 | perPage = ref(perPage); 5 | const allPublicKeys = ref([]); 6 | const prefetchLoading = ref(true); 7 | const pageLoading = ref(false); 8 | const loading = computed(() => prefetchLoading.value || pageLoading.value); 9 | 10 | let prefetchPromise = null 11 | 12 | const prefetch = () => { 13 | prefetchPromise = (async () => { 14 | try { 15 | prefetchLoading.value = true 16 | allPublicKeys.value = await prefetchCb() 17 | } finally { 18 | prefetchLoading.value = false 19 | } 20 | })() 21 | 22 | return prefetchPromise 23 | } 24 | 25 | const getPagePublicKeys = (page) => { 26 | return allPublicKeys.value.slice( 27 | (page - 1) * perPage.value, 28 | page * perPage.value, 29 | ); 30 | } 31 | 32 | const hasPage = (page) => { 33 | return getPagePublicKeys(page).length > 0; 34 | } 35 | 36 | const getPage = async (page) => { 37 | await prefetchPromise; 38 | if (!hasPage(page)) return []; 39 | try { 40 | pageLoading.value = true; 41 | return await pageCb(page, getPagePublicKeys(page)); 42 | } finally { 43 | pageLoading.value = false; 44 | } 45 | } 46 | 47 | return { 48 | perPage, 49 | allPublicKeys, 50 | prefetchLoading, 51 | pageLoading, 52 | loading, 53 | getPagePublicKeys, 54 | hasPage, 55 | getPage, 56 | prefetch, 57 | }; 58 | } 59 | -------------------------------------------------------------------------------- /app/src/composables/useSlug.js: -------------------------------------------------------------------------------- 1 | import { computed } from 'vue' 2 | 3 | export const useSlug = text => { 4 | return computed(() => { 5 | return (text.value || '') 6 | .toLowerCase() 7 | .replace(/[^a-z0-9 -]/g, '') 8 | .replace(/\s+/g, '-') 9 | .replace(/-+/g, '-') 10 | }) 11 | } 12 | -------------------------------------------------------------------------------- /app/src/composables/useWorkspace.js: -------------------------------------------------------------------------------- 1 | import { computed } from 'vue' 2 | import { useAnchorWallet } from 'solana-wallets-vue' 3 | import { Connection, PublicKey } from '@solana/web3.js' 4 | import { Provider, Program } from '@project-serum/anchor' 5 | import idl from '@/idl/solana_twitter.json' 6 | 7 | const clusterUrl = process.env.VUE_APP_CLUSTER_URL 8 | const preflightCommitment = 'processed' 9 | const commitment = 'processed' 10 | const programID = new PublicKey(idl.metadata.address) 11 | let workspace = null 12 | 13 | export const useWorkspace = () => workspace 14 | 15 | export const initWorkspace = () => { 16 | const wallet = useAnchorWallet() 17 | const connection = new Connection(clusterUrl, commitment) 18 | const provider = computed(() => new Provider(connection, wallet.value, { preflightCommitment, commitment })) 19 | const program = computed(() => new Program(idl, programID, provider.value)) 20 | 21 | workspace = { 22 | wallet, 23 | connection, 24 | provider, 25 | program, 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/idl/solana_twitter.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.0", 3 | "name": "solana_twitter", 4 | "instructions": [ 5 | { 6 | "name": "sendTweet", 7 | "accounts": [ 8 | { 9 | "name": "tweet", 10 | "isMut": true, 11 | "isSigner": true 12 | }, 13 | { 14 | "name": "author", 15 | "isMut": true, 16 | "isSigner": true 17 | }, 18 | { 19 | "name": "systemProgram", 20 | "isMut": false, 21 | "isSigner": false 22 | } 23 | ], 24 | "args": [ 25 | { 26 | "name": "topic", 27 | "type": "string" 28 | }, 29 | { 30 | "name": "content", 31 | "type": "string" 32 | } 33 | ] 34 | }, 35 | { 36 | "name": "updateTweet", 37 | "accounts": [ 38 | { 39 | "name": "tweet", 40 | "isMut": true, 41 | "isSigner": false 42 | }, 43 | { 44 | "name": "author", 45 | "isMut": false, 46 | "isSigner": true 47 | } 48 | ], 49 | "args": [ 50 | { 51 | "name": "topic", 52 | "type": "string" 53 | }, 54 | { 55 | "name": "content", 56 | "type": "string" 57 | } 58 | ] 59 | }, 60 | { 61 | "name": "deleteTweet", 62 | "accounts": [ 63 | { 64 | "name": "tweet", 65 | "isMut": true, 66 | "isSigner": false 67 | }, 68 | { 69 | "name": "author", 70 | "isMut": false, 71 | "isSigner": true 72 | } 73 | ], 74 | "args": [] 75 | } 76 | ], 77 | "accounts": [ 78 | { 79 | "name": "Tweet", 80 | "type": { 81 | "kind": "struct", 82 | "fields": [ 83 | { 84 | "name": "author", 85 | "type": "publicKey" 86 | }, 87 | { 88 | "name": "timestamp", 89 | "type": "i64" 90 | }, 91 | { 92 | "name": "topic", 93 | "type": "string" 94 | }, 95 | { 96 | "name": "content", 97 | "type": "string" 98 | } 99 | ] 100 | } 101 | } 102 | ], 103 | "errors": [ 104 | { 105 | "code": 6000, 106 | "name": "TopicTooLong", 107 | "msg": "The provided topic should be 50 characters long maximum." 108 | }, 109 | { 110 | "code": 6001, 111 | "name": "ContentTooLong", 112 | "msg": "The provided content should be 280 characters long maximum." 113 | } 114 | ], 115 | "metadata": { 116 | "address": "BNDCEb5uXCuWDxJW9BGmbfvR1JBMAKckfhYrEKW2Bv1W" 117 | } 118 | } -------------------------------------------------------------------------------- /app/src/main.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | .swv-dropdown { 6 | @apply w-full; 7 | } 8 | 9 | .swv-button { 10 | @apply rounded-full w-full; 11 | } 12 | 13 | .swv-button-trigger { 14 | @apply bg-pink-500 justify-center !important; 15 | } 16 | 17 | .swv-dropdown-list { 18 | @apply top-auto bottom-full md:top-full md:bottom-auto md:left-0 md:right-auto; 19 | } 20 | 21 | .swv-dropdown-list-active { 22 | @apply transform -translate-y-3 md:translate-y-3; 23 | } 24 | -------------------------------------------------------------------------------- /app/src/main.js: -------------------------------------------------------------------------------- 1 | // CSS. 2 | import 'solana-wallets-vue/styles.css' 3 | import './main.css' 4 | 5 | // Day.js 6 | import dayjs from 'dayjs' 7 | import localizedFormat from 'dayjs/plugin/localizedFormat' 8 | import relativeTime from 'dayjs/plugin/relativeTime' 9 | dayjs.extend(localizedFormat) 10 | dayjs.extend(relativeTime) 11 | 12 | // Routing. 13 | import { createRouter, createWebHashHistory } from 'vue-router' 14 | import routes from './routes' 15 | const router = createRouter({ 16 | history: createWebHashHistory(), 17 | routes, 18 | }) 19 | 20 | // Create the app. 21 | import { createApp } from 'vue' 22 | import App from './App.vue' 23 | createApp(App).use(router).mount('#app') 24 | -------------------------------------------------------------------------------- /app/src/models/Tweet.js: -------------------------------------------------------------------------------- 1 | import dayjs from "dayjs" 2 | 3 | export class Tweet 4 | { 5 | constructor (publicKey, accountData) { 6 | this.publicKey = publicKey 7 | this.author = accountData.author 8 | this.timestamp = accountData.timestamp.toString() 9 | this.topic = accountData.topic 10 | this.content = accountData.content 11 | } 12 | 13 | get key () { 14 | return this.publicKey.toBase58() 15 | } 16 | 17 | get author_display () { 18 | const author = this.author.toBase58() 19 | return author.slice(0,4) + '..' + author.slice(-4) 20 | } 21 | 22 | get created_at () { 23 | return dayjs.unix(this.timestamp).format('lll') 24 | } 25 | 26 | get created_ago () { 27 | return dayjs.unix(this.timestamp).fromNow() 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/models/index.js: -------------------------------------------------------------------------------- 1 | export * from './Tweet' 2 | -------------------------------------------------------------------------------- /app/src/routes.js: -------------------------------------------------------------------------------- 1 | export default [ 2 | { 3 | name: 'Home', 4 | path: '/', 5 | component: require('@/components/PageHome').default, 6 | }, 7 | { 8 | name: 'Topics', 9 | path: '/topics/:topic?', 10 | component: require('@/components/PageTopics').default, 11 | }, 12 | { 13 | name: 'Users', 14 | path: '/users/:author?', 15 | component: require('@/components/PageUsers').default, 16 | }, 17 | { 18 | name: 'Profile', 19 | path: '/profile', 20 | component: require('@/components/PageProfile').default, 21 | }, 22 | { 23 | name: 'Tweet', 24 | path: '/tweet/:tweet', 25 | component: require('@/components/PageTweet').default, 26 | }, 27 | { 28 | name: 'NotFound', 29 | path: '/:pathMatch(.*)*', 30 | component: require('@/components/PageNotFound').default, 31 | }, 32 | ] 33 | -------------------------------------------------------------------------------- /app/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | purge: [ 3 | './public/index.html', 4 | './src/**/*.{vue,js,ts,jsx,tsx}', 5 | ], 6 | darkMode: false, // or 'media' or 'class' 7 | theme: { 8 | extend: {}, 9 | }, 10 | variants: { 11 | extend: {}, 12 | }, 13 | plugins: [], 14 | } 15 | -------------------------------------------------------------------------------- /app/vue.config.js: -------------------------------------------------------------------------------- 1 | const webpack = require('webpack') 2 | const { defineConfig } = require('@vue/cli-service') 3 | 4 | module.exports = defineConfig({ 5 | transpileDependencies: true, 6 | configureWebpack: { 7 | plugins: [ 8 | new webpack.ProvidePlugin({ 9 | Buffer: ['buffer', 'Buffer'] 10 | }) 11 | ], 12 | resolve: { 13 | fallback: { 14 | crypto: false, 15 | fs: false, 16 | assert: false, 17 | process: false, 18 | util: false, 19 | path: false, 20 | stream: false, 21 | } 22 | } 23 | } 24 | }) 25 | -------------------------------------------------------------------------------- /migrations/deploy.ts: -------------------------------------------------------------------------------- 1 | // Migrations are an early feature. Currently, they're nothing more than this 2 | // single deploy script that's invoked from the CLI, injecting a provider 3 | // configured from the workspace's Anchor.toml. 4 | 5 | const anchor = require("@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.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "@project-serum/anchor": "^0.21.0" 4 | }, 5 | "devDependencies": { 6 | "chai": "^4.3.4", 7 | "mocha": "^9.0.3", 8 | "ts-mocha": "^8.0.0", 9 | "@types/mocha": "^9.0.0", 10 | "typescript": "^4.3.5" 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /programs/solana-twitter/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "solana-twitter" 3 | version = "0.1.0" 4 | description = "Created with Anchor" 5 | edition = "2018" 6 | 7 | [lib] 8 | crate-type = ["cdylib", "lib"] 9 | name = "solana_twitter" 10 | 11 | [features] 12 | no-entrypoint = [] 13 | no-idl = [] 14 | cpi = ["no-entrypoint"] 15 | default = [] 16 | 17 | [dependencies] 18 | anchor-lang = "0.21.0" 19 | -------------------------------------------------------------------------------- /programs/solana-twitter/Xargo.toml: -------------------------------------------------------------------------------- 1 | [target.bpfel-unknown-unknown.dependencies.std] 2 | features = [] 3 | -------------------------------------------------------------------------------- /programs/solana-twitter/src/lib.rs: -------------------------------------------------------------------------------- 1 | use anchor_lang::prelude::*; 2 | use anchor_lang::solana_program::system_program; 3 | 4 | declare_id!("BNDCEb5uXCuWDxJW9BGmbfvR1JBMAKckfhYrEKW2Bv1W"); 5 | 6 | #[program] 7 | pub mod solana_twitter { 8 | use super::*; 9 | pub fn send_tweet(ctx: Context, topic: String, content: String) -> ProgramResult { 10 | let tweet: &mut Account = &mut ctx.accounts.tweet; 11 | let author: &Signer = &ctx.accounts.author; 12 | let clock: Clock = Clock::get().unwrap(); 13 | 14 | if topic.chars().count() > 50 { 15 | return Err(ErrorCode::TopicTooLong.into()) 16 | } 17 | 18 | if content.chars().count() > 280 { 19 | return Err(ErrorCode::ContentTooLong.into()) 20 | } 21 | 22 | tweet.author = *author.key; 23 | tweet.timestamp = clock.unix_timestamp; 24 | tweet.topic = topic; 25 | tweet.content = content; 26 | 27 | Ok(()) 28 | } 29 | 30 | pub fn update_tweet(ctx: Context, topic: String, content: String) -> ProgramResult { 31 | let tweet: &mut Account = &mut ctx.accounts.tweet; 32 | 33 | if topic.chars().count() > 50 { 34 | return Err(ErrorCode::TopicTooLong.into()) 35 | } 36 | 37 | if content.chars().count() > 280 { 38 | return Err(ErrorCode::ContentTooLong.into()) 39 | } 40 | 41 | tweet.topic = topic; 42 | tweet.content = content; 43 | 44 | Ok(()) 45 | } 46 | 47 | pub fn delete_tweet(_ctx: Context) -> ProgramResult { 48 | Ok(()) 49 | } 50 | } 51 | 52 | #[derive(Accounts)] 53 | pub struct SendTweet<'info> { 54 | #[account(init, payer = author, space = Tweet::LEN)] 55 | pub tweet: Account<'info, Tweet>, 56 | #[account(mut)] 57 | pub author: Signer<'info>, 58 | #[account(address = system_program::ID)] 59 | pub system_program: AccountInfo<'info>, 60 | } 61 | 62 | #[derive(Accounts)] 63 | pub struct UpdateTweet<'info> { 64 | #[account(mut, has_one = author)] 65 | pub tweet: Account<'info, Tweet>, 66 | pub author: Signer<'info>, 67 | } 68 | 69 | #[derive(Accounts)] 70 | pub struct DeleteTweet<'info> { 71 | #[account(mut, has_one = author, close = author)] 72 | pub tweet: Account<'info, Tweet>, 73 | pub author: Signer<'info>, 74 | } 75 | 76 | #[account] 77 | pub struct Tweet { 78 | pub author: Pubkey, 79 | pub timestamp: i64, 80 | pub topic: String, 81 | pub content: String, 82 | } 83 | 84 | const DISCRIMINATOR_LENGTH: usize = 8; 85 | const PUBLIC_KEY_LENGTH: usize = 32; 86 | const TIMESTAMP_LENGTH: usize = 8; 87 | const STRING_LENGTH_PREFIX: usize = 4; // Stores the size of the string. 88 | const MAX_TOPIC_LENGTH: usize = 50 * 4; // 50 chars max. 89 | const MAX_CONTENT_LENGTH: usize = 280 * 4; // 280 chars max. 90 | 91 | impl Tweet { 92 | const LEN: usize = DISCRIMINATOR_LENGTH 93 | + PUBLIC_KEY_LENGTH // Author. 94 | + TIMESTAMP_LENGTH // Timestamp. 95 | + STRING_LENGTH_PREFIX + MAX_TOPIC_LENGTH // Topic. 96 | + STRING_LENGTH_PREFIX + MAX_CONTENT_LENGTH; // Content. 97 | } 98 | 99 | #[error] 100 | pub enum ErrorCode { 101 | #[msg("The provided topic should be 50 characters long maximum.")] 102 | TopicTooLong, 103 | #[msg("The provided content should be 280 characters long maximum.")] 104 | ContentTooLong, 105 | } 106 | -------------------------------------------------------------------------------- /tests/solana-twitter.ts: -------------------------------------------------------------------------------- 1 | import * as anchor from '@project-serum/anchor'; 2 | import { Program } from '@project-serum/anchor'; 3 | import { SolanaTwitter } from '../target/types/solana_twitter'; 4 | import * as assert from "assert"; 5 | import * as bs58 from "bs58"; 6 | 7 | describe('solana-twitter', () => { 8 | // Configure the client to use the local cluster. 9 | anchor.setProvider(anchor.Provider.env()); 10 | const program = anchor.workspace.SolanaTwitter as Program; 11 | const sendTweet = async (author, topic, content) => { 12 | const tweet = anchor.web3.Keypair.generate(); 13 | await program.rpc.sendTweet(topic, content, { 14 | accounts: { 15 | tweet: tweet.publicKey, 16 | author, 17 | systemProgram: anchor.web3.SystemProgram.programId, 18 | }, 19 | signers: [tweet], 20 | }); 21 | 22 | return tweet 23 | } 24 | 25 | it('can send a new tweet', async () => { 26 | // Call the "SendTweet" instruction. 27 | const tweet = anchor.web3.Keypair.generate(); 28 | await program.rpc.sendTweet('veganism', 'Hummus, am I right?', { 29 | accounts: { 30 | tweet: tweet.publicKey, 31 | author: program.provider.wallet.publicKey, 32 | systemProgram: anchor.web3.SystemProgram.programId, 33 | }, 34 | signers: [tweet], 35 | }); 36 | 37 | // Fetch the account details of the created tweet. 38 | const tweetAccount = await program.account.tweet.fetch(tweet.publicKey); 39 | 40 | // Ensure it has the right data. 41 | assert.equal(tweetAccount.author.toBase58(), program.provider.wallet.publicKey.toBase58()); 42 | assert.equal(tweetAccount.topic, 'veganism'); 43 | assert.equal(tweetAccount.content, 'Hummus, am I right?'); 44 | assert.ok(tweetAccount.timestamp); 45 | }); 46 | 47 | it('can send a new tweet without a topic', async () => { 48 | // Call the "SendTweet" instruction. 49 | const tweet = anchor.web3.Keypair.generate(); 50 | await program.rpc.sendTweet('', 'gm', { 51 | accounts: { 52 | tweet: tweet.publicKey, 53 | author: program.provider.wallet.publicKey, 54 | systemProgram: anchor.web3.SystemProgram.programId, 55 | }, 56 | signers: [tweet], 57 | }); 58 | 59 | // Fetch the account details of the created tweet. 60 | const tweetAccount = await program.account.tweet.fetch(tweet.publicKey); 61 | 62 | // Ensure it has the right data. 63 | assert.equal(tweetAccount.author.toBase58(), program.provider.wallet.publicKey.toBase58()); 64 | assert.equal(tweetAccount.topic, ''); 65 | assert.equal(tweetAccount.content, 'gm'); 66 | assert.ok(tweetAccount.timestamp); 67 | }); 68 | 69 | it('can send a new tweet from a different author', async () => { 70 | // Generate another user and airdrop them some SOL. 71 | const otherUser = anchor.web3.Keypair.generate(); 72 | const signature = await program.provider.connection.requestAirdrop(otherUser.publicKey, 1000000000); 73 | await program.provider.connection.confirmTransaction(signature); 74 | 75 | // Call the "SendTweet" instruction on behalf of this other user. 76 | const tweet = anchor.web3.Keypair.generate(); 77 | await program.rpc.sendTweet('veganism', 'Yay Tofu!', { 78 | accounts: { 79 | tweet: tweet.publicKey, 80 | author: otherUser.publicKey, 81 | systemProgram: anchor.web3.SystemProgram.programId, 82 | }, 83 | signers: [otherUser, tweet], 84 | }); 85 | 86 | // Fetch the account details of the created tweet. 87 | const tweetAccount = await program.account.tweet.fetch(tweet.publicKey); 88 | 89 | // Ensure it has the right data. 90 | assert.equal(tweetAccount.author.toBase58(), otherUser.publicKey.toBase58()); 91 | assert.equal(tweetAccount.topic, 'veganism'); 92 | assert.equal(tweetAccount.content, 'Yay Tofu!'); 93 | assert.ok(tweetAccount.timestamp); 94 | }); 95 | 96 | it('cannot provide a topic with more than 50 characters', async () => { 97 | try { 98 | const tweet = anchor.web3.Keypair.generate(); 99 | const topicWith51Chars = 'x'.repeat(51); 100 | await program.rpc.sendTweet(topicWith51Chars, 'Hummus, am I right?', { 101 | accounts: { 102 | tweet: tweet.publicKey, 103 | author: program.provider.wallet.publicKey, 104 | systemProgram: anchor.web3.SystemProgram.programId, 105 | }, 106 | signers: [tweet], 107 | }); 108 | } catch (error) { 109 | assert.equal(error.msg, 'The provided topic should be 50 characters long maximum.'); 110 | return; 111 | } 112 | 113 | assert.fail('The instruction should have failed with a 51-character topic.'); 114 | }); 115 | 116 | it('cannot provide a content with more than 280 characters', async () => { 117 | try { 118 | const tweet = anchor.web3.Keypair.generate(); 119 | const contentWith281Chars = 'x'.repeat(281); 120 | await program.rpc.sendTweet('veganism', contentWith281Chars, { 121 | accounts: { 122 | tweet: tweet.publicKey, 123 | author: program.provider.wallet.publicKey, 124 | systemProgram: anchor.web3.SystemProgram.programId, 125 | }, 126 | signers: [tweet], 127 | }); 128 | } catch (error) { 129 | assert.equal(error.msg, 'The provided content should be 280 characters long maximum.'); 130 | return; 131 | } 132 | 133 | assert.fail('The instruction should have failed with a 281-character content.'); 134 | }); 135 | 136 | it('can fetch all tweets', async () => { 137 | const tweetAccounts = await program.account.tweet.all(); 138 | assert.equal(tweetAccounts.length, 3); 139 | }); 140 | 141 | it('can filter tweets by author', async () => { 142 | const authorPublicKey = program.provider.wallet.publicKey 143 | const tweetAccounts = await program.account.tweet.all([ 144 | { 145 | memcmp: { 146 | offset: 8, // Discriminator. 147 | bytes: authorPublicKey.toBase58(), 148 | } 149 | } 150 | ]); 151 | 152 | assert.equal(tweetAccounts.length, 2); 153 | assert.ok(tweetAccounts.every(tweetAccount => { 154 | return tweetAccount.account.author.toBase58() === authorPublicKey.toBase58() 155 | })) 156 | }); 157 | 158 | it('can filter tweets by topics', async () => { 159 | const tweetAccounts = await program.account.tweet.all([ 160 | { 161 | memcmp: { 162 | offset: 8 + // Discriminator. 163 | 32 + // Author public key. 164 | 8 + // Timestamp. 165 | 4, // Topic string prefix. 166 | bytes: bs58.encode(Buffer.from('veganism')), 167 | } 168 | } 169 | ]); 170 | 171 | assert.equal(tweetAccounts.length, 2); 172 | assert.ok(tweetAccounts.every(tweetAccount => { 173 | return tweetAccount.account.topic === 'veganism' 174 | })) 175 | }); 176 | 177 | it('can update a tweet', async () => { 178 | // Send a tweet and fetch its account. 179 | const author = program.provider.wallet.publicKey; 180 | const tweet = await sendTweet(author, 'web2', 'Hello World!'); 181 | const tweetAccount = await program.account.tweet.fetch(tweet.publicKey); 182 | 183 | // Ensure it has the right data. 184 | assert.equal(tweetAccount.topic, 'web2'); 185 | assert.equal(tweetAccount.content, 'Hello World!'); 186 | 187 | // Update the Tweet. 188 | await program.rpc.updateTweet('solana', 'gm everyone!', { 189 | accounts: { 190 | tweet: tweet.publicKey, 191 | author, 192 | }, 193 | }); 194 | 195 | // Ensure the updated tweet has the updated data. 196 | const updatedTweetAccount = await program.account.tweet.fetch(tweet.publicKey); 197 | assert.equal(updatedTweetAccount.topic, 'solana'); 198 | assert.equal(updatedTweetAccount.content, 'gm everyone!'); 199 | }); 200 | 201 | it('cannot update someone else\'s tweet', async () => { 202 | // Send a tweet. 203 | const author = program.provider.wallet.publicKey; 204 | const tweet = await sendTweet(author, 'solana', 'Solana is awesome!'); 205 | 206 | // Update the Tweet. 207 | try { 208 | await program.rpc.updateTweet('eth', 'Ethereum is awesome!', { 209 | accounts: { 210 | tweet: tweet.publicKey, 211 | author: anchor.web3.Keypair.generate().publicKey, 212 | }, 213 | }); 214 | assert.fail('We were able to update someone else\'s tweet.'); 215 | } catch (error) { 216 | // Ensure the tweet account kept the initial data. 217 | const tweetAccount = await program.account.tweet.fetch(tweet.publicKey); 218 | assert.equal(tweetAccount.topic, 'solana'); 219 | assert.equal(tweetAccount.content, 'Solana is awesome!'); 220 | } 221 | }); 222 | 223 | it('can delete a tweet', async () => { 224 | // Create a new tweet. 225 | const author = program.provider.wallet.publicKey; 226 | const tweet = await sendTweet(author, 'solana', 'gm'); 227 | 228 | // Delete the Tweet. 229 | await program.rpc.deleteTweet({ 230 | accounts: { 231 | tweet: tweet.publicKey, 232 | author, 233 | }, 234 | }); 235 | 236 | // Ensure fetching the tweet account returns null. 237 | const tweetAccount = await program.account.tweet.fetchNullable(tweet.publicKey); 238 | assert.ok(tweetAccount === null); 239 | }); 240 | 241 | it('cannot delete someone else\'s tweet', async () => { 242 | // Create a new tweet. 243 | const author = program.provider.wallet.publicKey; 244 | const tweet = await sendTweet(author, 'solana', 'gm'); 245 | 246 | // Try to delete the Tweet from a different author. 247 | try { 248 | await program.rpc.deleteTweet({ 249 | accounts: { 250 | tweet: tweet.publicKey, 251 | author: anchor.web3.Keypair.generate().publicKey, 252 | }, 253 | }); 254 | assert.fail('We were able to delete someone else\'s tweet.'); 255 | } catch (error) { 256 | // Ensure the tweet account still exists with the right data. 257 | const tweetAccount = await program.account.tweet.fetch(tweet.publicKey); 258 | assert.equal(tweetAccount.topic, 'solana'); 259 | assert.equal(tweetAccount.content, 'gm'); 260 | } 261 | }); 262 | }); 263 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "types": ["mocha", "chai"], 4 | "typeRoots": ["./node_modules/@types"], 5 | "lib": ["es2015"], 6 | "module": "commonjs", 7 | "target": "es6", 8 | "esModuleInterop": true 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5": 6 | version "7.16.3" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5" 8 | integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ== 9 | dependencies: 10 | regenerator-runtime "^0.13.4" 11 | 12 | "@ethersproject/bytes@^5.5.0": 13 | version "5.5.0" 14 | resolved "https://registry.yarnpkg.com/@ethersproject/bytes/-/bytes-5.5.0.tgz#cb11c526de657e7b45d2e0f0246fb3b9d29a601c" 15 | integrity sha512-ABvc7BHWhZU9PNM/tANm/Qx4ostPGadAuQzWTr3doklZOhDlmcBqclrQe/ZXUIj3K8wC28oYeuRa+A37tX9kog== 16 | dependencies: 17 | "@ethersproject/logger" "^5.5.0" 18 | 19 | "@ethersproject/logger@^5.5.0": 20 | version "5.5.0" 21 | resolved "https://registry.yarnpkg.com/@ethersproject/logger/-/logger-5.5.0.tgz#0c2caebeff98e10aefa5aef27d7441c7fd18cf5d" 22 | integrity sha512-rIY/6WPm7T8n3qS2vuHTUBPdXHl+rGxWxW5okDfo9J4Z0+gRRZT0msvUdIJkE4/HS29GUMziwGaaKO2bWONBrg== 23 | 24 | "@ethersproject/sha2@^5.5.0": 25 | version "5.5.0" 26 | resolved "https://registry.yarnpkg.com/@ethersproject/sha2/-/sha2-5.5.0.tgz#a40a054c61f98fd9eee99af2c3cc6ff57ec24db7" 27 | integrity sha512-B5UBoglbCiHamRVPLA110J+2uqsifpZaTmid2/7W5rbtYVz6gus6/hSDieIU/6gaKIDcOj12WnOdiymEUHIAOA== 28 | dependencies: 29 | "@ethersproject/bytes" "^5.5.0" 30 | "@ethersproject/logger" "^5.5.0" 31 | hash.js "1.1.7" 32 | 33 | "@project-serum/anchor@^0.21.0": 34 | version "0.21.0" 35 | resolved "https://registry.yarnpkg.com/@project-serum/anchor/-/anchor-0.21.0.tgz#ad5fb33744991ec1900cdb2fd22707c908b12b5f" 36 | integrity sha512-flRuW/F+iC8mitNokx82LOXyND7Dyk6n5UUPJpQv/+NfySFrNFlzuQZaBZJ4CG5g9s8HS/uaaIz1nVkDR8V/QA== 37 | dependencies: 38 | "@project-serum/borsh" "^0.2.4" 39 | "@solana/web3.js" "^1.17.0" 40 | base64-js "^1.5.1" 41 | bn.js "^5.1.2" 42 | bs58 "^4.0.1" 43 | buffer-layout "^1.2.2" 44 | camelcase "^5.3.1" 45 | cross-fetch "^3.1.5" 46 | crypto-hash "^1.3.0" 47 | eventemitter3 "^4.0.7" 48 | find "^0.3.0" 49 | js-sha256 "^0.9.0" 50 | pako "^2.0.3" 51 | snake-case "^3.0.4" 52 | toml "^3.0.0" 53 | 54 | "@project-serum/borsh@^0.2.4": 55 | version "0.2.4" 56 | resolved "https://registry.yarnpkg.com/@project-serum/borsh/-/borsh-0.2.4.tgz#8884c3a759984a39d54bf5b7390bd1ee0b579f16" 57 | integrity sha512-tQPc1ktAp1Jtn9D72DmObAfhAic9ivfYBOS5b+T4H7MvkQ84uML88LY1LfvGep30mCy+ua5rf+X9ocPfg6u9MA== 58 | dependencies: 59 | bn.js "^5.1.2" 60 | buffer-layout "^1.2.0" 61 | 62 | "@solana/buffer-layout@^3.0.0": 63 | version "3.0.0" 64 | resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-3.0.0.tgz#b9353caeb9a1589cb77a1b145bcb1a9a93114326" 65 | integrity sha512-MVdgAKKL39tEs0l8je0hKaXLQFb7Rdfb0Xg2LjFZd8Lfdazkg6xiS98uAZrEKvaoF3i4M95ei9RydkGIDMeo3w== 66 | dependencies: 67 | buffer "~6.0.3" 68 | 69 | "@solana/web3.js@^1.17.0": 70 | version "1.30.2" 71 | resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.30.2.tgz#e85da75e0825dc64f53eb64a1ff0115b27bec135" 72 | integrity sha512-hznCj+rkfvM5taRP3Z+l5lumB7IQnDrB4l55Wpsg4kDU9Zds8pE5YOH5Z9bbF/pUzZJKQjyBjnY/6kScBm3Ugg== 73 | dependencies: 74 | "@babel/runtime" "^7.12.5" 75 | "@ethersproject/sha2" "^5.5.0" 76 | "@solana/buffer-layout" "^3.0.0" 77 | bn.js "^5.0.0" 78 | borsh "^0.4.0" 79 | bs58 "^4.0.1" 80 | buffer "6.0.1" 81 | cross-fetch "^3.1.4" 82 | jayson "^3.4.4" 83 | js-sha3 "^0.8.0" 84 | rpc-websockets "^7.4.2" 85 | secp256k1 "^4.0.2" 86 | superstruct "^0.14.2" 87 | tweetnacl "^1.0.0" 88 | 89 | "@types/bn.js@^4.11.5": 90 | version "4.11.6" 91 | resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-4.11.6.tgz#c306c70d9358aaea33cd4eda092a742b9505967c" 92 | integrity sha512-pqr857jrp2kPuO9uRjZ3PwnJTjoQy+fcdxvBTvHm6dkmEL9q+hDD/2j/0ELOBPtPnS8LjCX0gI9nbl8lVkadpg== 93 | dependencies: 94 | "@types/node" "*" 95 | 96 | "@types/connect@^3.4.33": 97 | version "3.4.35" 98 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1" 99 | integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== 100 | dependencies: 101 | "@types/node" "*" 102 | 103 | "@types/express-serve-static-core@^4.17.9": 104 | version "4.17.25" 105 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.25.tgz#e42f7046adc65ece2eb6059b77aecfbe9e9f82e0" 106 | integrity sha512-OUJIVfRMFijZukGGwTpKNFprqCCXk5WjNGvUgB/CxxBR40QWSjsNK86+yvGKlCOGc7sbwfHLaXhkG+NsytwBaQ== 107 | dependencies: 108 | "@types/node" "*" 109 | "@types/qs" "*" 110 | "@types/range-parser" "*" 111 | 112 | "@types/json5@^0.0.29": 113 | version "0.0.29" 114 | resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" 115 | integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= 116 | 117 | "@types/lodash@^4.14.159": 118 | version "4.14.177" 119 | resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.177.tgz#f70c0d19c30fab101cad46b52be60363c43c4578" 120 | integrity sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw== 121 | 122 | "@types/mocha@^9.0.0": 123 | version "9.0.0" 124 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.0.0.tgz#3205bcd15ada9bc681ac20bef64e9e6df88fd297" 125 | integrity sha512-scN0hAWyLVAvLR9AyW7HoFF5sJZglyBsbPuHO4fv7JRvfmPBMfp1ozWqOf/e4wwPNxezBZXRfWzMb6iFLgEVRA== 126 | 127 | "@types/node@*": 128 | version "16.11.7" 129 | resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.7.tgz#36820945061326978c42a01e56b61cd223dfdc42" 130 | integrity sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw== 131 | 132 | "@types/node@^12.12.54": 133 | version "12.20.37" 134 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.37.tgz#abb38afa9d6e8a2f627a8cb52290b3c80fbe61ed" 135 | integrity sha512-i1KGxqcvJaLQali+WuypQnXwcplhtNtjs66eNsZpp2P2FL/trJJxx/VWsM0YCL2iMoIJrbXje48lvIQAQ4p2ZA== 136 | 137 | "@types/qs@*": 138 | version "6.9.7" 139 | resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb" 140 | integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== 141 | 142 | "@types/range-parser@*": 143 | version "1.2.4" 144 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc" 145 | integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== 146 | 147 | "@types/ws@^7.4.4": 148 | version "7.4.7" 149 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" 150 | integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== 151 | dependencies: 152 | "@types/node" "*" 153 | 154 | "@ungap/promise-all-settled@1.1.2": 155 | version "1.1.2" 156 | resolved "https://registry.yarnpkg.com/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz#aa58042711d6e3275dd37dc597e5d31e8c290a44" 157 | integrity sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q== 158 | 159 | JSONStream@^1.3.5: 160 | version "1.3.5" 161 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" 162 | integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== 163 | dependencies: 164 | jsonparse "^1.2.0" 165 | through ">=2.2.7 <3" 166 | 167 | ansi-colors@4.1.1: 168 | version "4.1.1" 169 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 170 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 171 | 172 | ansi-regex@^5.0.1: 173 | version "5.0.1" 174 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 175 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 176 | 177 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 178 | version "4.3.0" 179 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 180 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 181 | dependencies: 182 | color-convert "^2.0.1" 183 | 184 | anymatch@~3.1.2: 185 | version "3.1.2" 186 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 187 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 188 | dependencies: 189 | normalize-path "^3.0.0" 190 | picomatch "^2.0.4" 191 | 192 | argparse@^2.0.1: 193 | version "2.0.1" 194 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 195 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 196 | 197 | arrify@^1.0.0: 198 | version "1.0.1" 199 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 200 | integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= 201 | 202 | assertion-error@^1.1.0: 203 | version "1.1.0" 204 | resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" 205 | integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== 206 | 207 | balanced-match@^1.0.0: 208 | version "1.0.2" 209 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 210 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 211 | 212 | base-x@^3.0.2: 213 | version "3.0.9" 214 | resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" 215 | integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== 216 | dependencies: 217 | safe-buffer "^5.0.1" 218 | 219 | base64-js@^1.3.1, base64-js@^1.5.1: 220 | version "1.5.1" 221 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 222 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 223 | 224 | binary-extensions@^2.0.0: 225 | version "2.2.0" 226 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 227 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 228 | 229 | bn.js@^4.11.9: 230 | version "4.12.0" 231 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" 232 | integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== 233 | 234 | bn.js@^5.0.0, bn.js@^5.1.2: 235 | version "5.2.0" 236 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.0.tgz#358860674396c6997771a9d051fcc1b57d4ae002" 237 | integrity sha512-D7iWRBvnZE8ecXiLj/9wbxH7Tk79fAh8IHaTNq1RWRixsS02W+5qS+iE9yq6RYl0asXx5tw0bLhmT5pIfbSquw== 238 | 239 | borsh@^0.4.0: 240 | version "0.4.0" 241 | resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.4.0.tgz#9dd6defe741627f1315eac2a73df61421f6ddb9f" 242 | integrity sha512-aX6qtLya3K0AkT66CmYWCCDr77qsE9arV05OmdFpmat9qu8Pg9J5tBUPDztAW5fNh/d/MyVG/OYziP52Ndzx1g== 243 | dependencies: 244 | "@types/bn.js" "^4.11.5" 245 | bn.js "^5.0.0" 246 | bs58 "^4.0.0" 247 | text-encoding-utf-8 "^1.0.2" 248 | 249 | brace-expansion@^1.1.7: 250 | version "1.1.11" 251 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 252 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 253 | dependencies: 254 | balanced-match "^1.0.0" 255 | concat-map "0.0.1" 256 | 257 | braces@~3.0.2: 258 | version "3.0.2" 259 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 260 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 261 | dependencies: 262 | fill-range "^7.0.1" 263 | 264 | brorand@^1.1.0: 265 | version "1.1.0" 266 | resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" 267 | integrity sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8= 268 | 269 | browser-stdout@1.3.1: 270 | version "1.3.1" 271 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 272 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 273 | 274 | bs58@^4.0.0, bs58@^4.0.1: 275 | version "4.0.1" 276 | resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" 277 | integrity sha1-vhYedsNU9veIrkBx9j806MTwpCo= 278 | dependencies: 279 | base-x "^3.0.2" 280 | 281 | buffer-from@^1.0.0, buffer-from@^1.1.0: 282 | version "1.1.2" 283 | resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" 284 | integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== 285 | 286 | buffer-layout@^1.2.0, buffer-layout@^1.2.2: 287 | version "1.2.2" 288 | resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" 289 | integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== 290 | 291 | buffer@6.0.1: 292 | version "6.0.1" 293 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.1.tgz#3cbea8c1463e5a0779e30b66d4c88c6ffa182ac2" 294 | integrity sha512-rVAXBwEcEoYtxnHSO5iWyhzV/O1WMtkUYWlfdLS7FjU4PnSJJHEfHXi/uHPI5EwltmOA794gN3bm3/pzuctWjQ== 295 | dependencies: 296 | base64-js "^1.3.1" 297 | ieee754 "^1.2.1" 298 | 299 | buffer@~6.0.3: 300 | version "6.0.3" 301 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" 302 | integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== 303 | dependencies: 304 | base64-js "^1.3.1" 305 | ieee754 "^1.2.1" 306 | 307 | bufferutil@^4.0.1: 308 | version "4.0.5" 309 | resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.5.tgz#da9ea8166911cc276bf677b8aed2d02d31f59028" 310 | integrity sha512-HTm14iMQKK2FjFLRTM5lAVcyaUzOnqbPtesFIvREgXpJHdQm8bWS+GkQgIkfaBYRHuCnea7w8UVNfwiAQhlr9A== 311 | dependencies: 312 | node-gyp-build "^4.3.0" 313 | 314 | camelcase@^5.3.1: 315 | version "5.3.1" 316 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" 317 | integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== 318 | 319 | camelcase@^6.0.0: 320 | version "6.2.1" 321 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" 322 | integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== 323 | 324 | chai@^4.3.4: 325 | version "4.3.4" 326 | resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49" 327 | integrity sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA== 328 | dependencies: 329 | assertion-error "^1.1.0" 330 | check-error "^1.0.2" 331 | deep-eql "^3.0.1" 332 | get-func-name "^2.0.0" 333 | pathval "^1.1.1" 334 | type-detect "^4.0.5" 335 | 336 | chalk@^4.1.0: 337 | version "4.1.2" 338 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 339 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 340 | dependencies: 341 | ansi-styles "^4.1.0" 342 | supports-color "^7.1.0" 343 | 344 | check-error@^1.0.2: 345 | version "1.0.2" 346 | resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 347 | integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= 348 | 349 | chokidar@3.5.2: 350 | version "3.5.2" 351 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" 352 | integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== 353 | dependencies: 354 | anymatch "~3.1.2" 355 | braces "~3.0.2" 356 | glob-parent "~5.1.2" 357 | is-binary-path "~2.1.0" 358 | is-glob "~4.0.1" 359 | normalize-path "~3.0.0" 360 | readdirp "~3.6.0" 361 | optionalDependencies: 362 | fsevents "~2.3.2" 363 | 364 | circular-json@^0.5.9: 365 | version "0.5.9" 366 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" 367 | integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== 368 | 369 | cliui@^7.0.2: 370 | version "7.0.4" 371 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 372 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 373 | dependencies: 374 | string-width "^4.2.0" 375 | strip-ansi "^6.0.0" 376 | wrap-ansi "^7.0.0" 377 | 378 | color-convert@^2.0.1: 379 | version "2.0.1" 380 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 381 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 382 | dependencies: 383 | color-name "~1.1.4" 384 | 385 | color-name@~1.1.4: 386 | version "1.1.4" 387 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 388 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 389 | 390 | commander@^2.20.3: 391 | version "2.20.3" 392 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 393 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 394 | 395 | concat-map@0.0.1: 396 | version "0.0.1" 397 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 398 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 399 | 400 | cross-fetch@^3.1.4: 401 | version "3.1.4" 402 | resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.4.tgz#9723f3a3a247bf8b89039f3a380a9244e8fa2f39" 403 | integrity sha512-1eAtFWdIubi6T4XPy6ei9iUFoKpUkIF971QLN8lIvvvwueI65+Nw5haMNKUwfJxabqlIIDODJKGrQ66gxC0PbQ== 404 | dependencies: 405 | node-fetch "2.6.1" 406 | 407 | cross-fetch@^3.1.5: 408 | version "3.1.5" 409 | resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.5.tgz#e1389f44d9e7ba767907f7af8454787952ab534f" 410 | integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== 411 | dependencies: 412 | node-fetch "2.6.7" 413 | 414 | crypto-hash@^1.3.0: 415 | version "1.3.0" 416 | resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" 417 | integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== 418 | 419 | debug@4.3.2: 420 | version "4.3.2" 421 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.2.tgz#f0a49c18ac8779e31d4a0c6029dfb76873c7428b" 422 | integrity sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw== 423 | dependencies: 424 | ms "2.1.2" 425 | 426 | decamelize@^4.0.0: 427 | version "4.0.0" 428 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 429 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 430 | 431 | deep-eql@^3.0.1: 432 | version "3.0.1" 433 | resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" 434 | integrity sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw== 435 | dependencies: 436 | type-detect "^4.0.0" 437 | 438 | delay@^5.0.0: 439 | version "5.0.0" 440 | resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" 441 | integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== 442 | 443 | diff@5.0.0: 444 | version "5.0.0" 445 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 446 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 447 | 448 | diff@^3.1.0: 449 | version "3.5.0" 450 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 451 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 452 | 453 | dot-case@^3.0.4: 454 | version "3.0.4" 455 | resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" 456 | integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== 457 | dependencies: 458 | no-case "^3.0.4" 459 | tslib "^2.0.3" 460 | 461 | elliptic@^6.5.2: 462 | version "6.5.4" 463 | resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" 464 | integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== 465 | dependencies: 466 | bn.js "^4.11.9" 467 | brorand "^1.1.0" 468 | hash.js "^1.0.0" 469 | hmac-drbg "^1.0.1" 470 | inherits "^2.0.4" 471 | minimalistic-assert "^1.0.1" 472 | minimalistic-crypto-utils "^1.0.1" 473 | 474 | emoji-regex@^8.0.0: 475 | version "8.0.0" 476 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 477 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 478 | 479 | es6-promise@^4.0.3: 480 | version "4.2.8" 481 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" 482 | integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== 483 | 484 | es6-promisify@^5.0.0: 485 | version "5.0.0" 486 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 487 | integrity sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM= 488 | dependencies: 489 | es6-promise "^4.0.3" 490 | 491 | escalade@^3.1.1: 492 | version "3.1.1" 493 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 494 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 495 | 496 | escape-string-regexp@4.0.0: 497 | version "4.0.0" 498 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 499 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 500 | 501 | eventemitter3@^4.0.7: 502 | version "4.0.7" 503 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" 504 | integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== 505 | 506 | eyes@^0.1.8: 507 | version "0.1.8" 508 | resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" 509 | integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= 510 | 511 | fill-range@^7.0.1: 512 | version "7.0.1" 513 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 514 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 515 | dependencies: 516 | to-regex-range "^5.0.1" 517 | 518 | find-up@5.0.0: 519 | version "5.0.0" 520 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 521 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 522 | dependencies: 523 | locate-path "^6.0.0" 524 | path-exists "^4.0.0" 525 | 526 | find@^0.3.0: 527 | version "0.3.0" 528 | resolved "https://registry.yarnpkg.com/find/-/find-0.3.0.tgz#4082e8fc8d8320f1a382b5e4f521b9bc50775cb8" 529 | integrity sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw== 530 | dependencies: 531 | traverse-chain "~0.1.0" 532 | 533 | flat@^5.0.2: 534 | version "5.0.2" 535 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 536 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 537 | 538 | fs.realpath@^1.0.0: 539 | version "1.0.0" 540 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 541 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 542 | 543 | fsevents@~2.3.2: 544 | version "2.3.2" 545 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 546 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 547 | 548 | get-caller-file@^2.0.5: 549 | version "2.0.5" 550 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 551 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 552 | 553 | get-func-name@^2.0.0: 554 | version "2.0.0" 555 | resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 556 | integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= 557 | 558 | glob-parent@~5.1.2: 559 | version "5.1.2" 560 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 561 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 562 | dependencies: 563 | is-glob "^4.0.1" 564 | 565 | glob@7.1.7: 566 | version "7.1.7" 567 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.7.tgz#3b193e9233f01d42d0b3f78294bbeeb418f94a90" 568 | integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ== 569 | dependencies: 570 | fs.realpath "^1.0.0" 571 | inflight "^1.0.4" 572 | inherits "2" 573 | minimatch "^3.0.4" 574 | once "^1.3.0" 575 | path-is-absolute "^1.0.0" 576 | 577 | growl@1.10.5: 578 | version "1.10.5" 579 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 580 | integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== 581 | 582 | has-flag@^4.0.0: 583 | version "4.0.0" 584 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 585 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 586 | 587 | hash.js@1.1.7, hash.js@^1.0.0, hash.js@^1.0.3: 588 | version "1.1.7" 589 | resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" 590 | integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== 591 | dependencies: 592 | inherits "^2.0.3" 593 | minimalistic-assert "^1.0.1" 594 | 595 | he@1.2.0: 596 | version "1.2.0" 597 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 598 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 599 | 600 | hmac-drbg@^1.0.1: 601 | version "1.0.1" 602 | resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 603 | integrity sha1-0nRXAQJabHdabFRXk+1QL8DGSaE= 604 | dependencies: 605 | hash.js "^1.0.3" 606 | minimalistic-assert "^1.0.0" 607 | minimalistic-crypto-utils "^1.0.1" 608 | 609 | ieee754@^1.2.1: 610 | version "1.2.1" 611 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 612 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 613 | 614 | inflight@^1.0.4: 615 | version "1.0.6" 616 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 617 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 618 | dependencies: 619 | once "^1.3.0" 620 | wrappy "1" 621 | 622 | inherits@2, inherits@^2.0.3, inherits@^2.0.4: 623 | version "2.0.4" 624 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 625 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 626 | 627 | is-binary-path@~2.1.0: 628 | version "2.1.0" 629 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 630 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 631 | dependencies: 632 | binary-extensions "^2.0.0" 633 | 634 | is-extglob@^2.1.1: 635 | version "2.1.1" 636 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 637 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 638 | 639 | is-fullwidth-code-point@^3.0.0: 640 | version "3.0.0" 641 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 642 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 643 | 644 | is-glob@^4.0.1, is-glob@~4.0.1: 645 | version "4.0.3" 646 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 647 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 648 | dependencies: 649 | is-extglob "^2.1.1" 650 | 651 | is-number@^7.0.0: 652 | version "7.0.0" 653 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 654 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 655 | 656 | is-plain-obj@^2.1.0: 657 | version "2.1.0" 658 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 659 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 660 | 661 | is-unicode-supported@^0.1.0: 662 | version "0.1.0" 663 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 664 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 665 | 666 | isexe@^2.0.0: 667 | version "2.0.0" 668 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 669 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 670 | 671 | isomorphic-ws@^4.0.1: 672 | version "4.0.1" 673 | resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" 674 | integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== 675 | 676 | jayson@^3.4.4: 677 | version "3.6.5" 678 | resolved "https://registry.yarnpkg.com/jayson/-/jayson-3.6.5.tgz#e560bcad4daf098c7391f46ba8efc9d6f34a4102" 679 | integrity sha512-wmOjX+eQcnCDyPF4KORomaIj9wj3h0B5VEbeD0+2VHfTfErB+h1zpR7oBkgCZp36AFjp3+a4CLz6U72BYpFHAw== 680 | dependencies: 681 | "@types/connect" "^3.4.33" 682 | "@types/express-serve-static-core" "^4.17.9" 683 | "@types/lodash" "^4.14.159" 684 | "@types/node" "^12.12.54" 685 | "@types/ws" "^7.4.4" 686 | JSONStream "^1.3.5" 687 | commander "^2.20.3" 688 | delay "^5.0.0" 689 | es6-promisify "^5.0.0" 690 | eyes "^0.1.8" 691 | isomorphic-ws "^4.0.1" 692 | json-stringify-safe "^5.0.1" 693 | lodash "^4.17.20" 694 | uuid "^3.4.0" 695 | ws "^7.4.5" 696 | 697 | js-sha256@^0.9.0: 698 | version "0.9.0" 699 | resolved "https://registry.yarnpkg.com/js-sha256/-/js-sha256-0.9.0.tgz#0b89ac166583e91ef9123644bd3c5334ce9d0966" 700 | integrity sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA== 701 | 702 | js-sha3@^0.8.0: 703 | version "0.8.0" 704 | resolved "https://registry.yarnpkg.com/js-sha3/-/js-sha3-0.8.0.tgz#b9b7a5da73afad7dedd0f8c463954cbde6818840" 705 | integrity sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q== 706 | 707 | js-yaml@4.1.0: 708 | version "4.1.0" 709 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 710 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 711 | dependencies: 712 | argparse "^2.0.1" 713 | 714 | json-stringify-safe@^5.0.1: 715 | version "5.0.1" 716 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 717 | integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= 718 | 719 | json5@^1.0.1: 720 | version "1.0.1" 721 | resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" 722 | integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== 723 | dependencies: 724 | minimist "^1.2.0" 725 | 726 | jsonparse@^1.2.0: 727 | version "1.3.1" 728 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" 729 | integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= 730 | 731 | locate-path@^6.0.0: 732 | version "6.0.0" 733 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 734 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 735 | dependencies: 736 | p-locate "^5.0.0" 737 | 738 | lodash@^4.17.20: 739 | version "4.17.21" 740 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" 741 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 742 | 743 | log-symbols@4.1.0: 744 | version "4.1.0" 745 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 746 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 747 | dependencies: 748 | chalk "^4.1.0" 749 | is-unicode-supported "^0.1.0" 750 | 751 | lower-case@^2.0.2: 752 | version "2.0.2" 753 | resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" 754 | integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== 755 | dependencies: 756 | tslib "^2.0.3" 757 | 758 | make-error@^1.1.1: 759 | version "1.3.6" 760 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 761 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 762 | 763 | minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: 764 | version "1.0.1" 765 | resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" 766 | integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== 767 | 768 | minimalistic-crypto-utils@^1.0.1: 769 | version "1.0.1" 770 | resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 771 | integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= 772 | 773 | minimatch@3.0.4, minimatch@^3.0.4: 774 | version "3.0.4" 775 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 776 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 777 | dependencies: 778 | brace-expansion "^1.1.7" 779 | 780 | minimist@^1.2.0, minimist@^1.2.5: 781 | version "1.2.5" 782 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" 783 | integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw== 784 | 785 | mkdirp@^0.5.1: 786 | version "0.5.5" 787 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" 788 | integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== 789 | dependencies: 790 | minimist "^1.2.5" 791 | 792 | mocha@^9.0.3: 793 | version "9.1.3" 794 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-9.1.3.tgz#8a623be6b323810493d8c8f6f7667440fa469fdb" 795 | integrity sha512-Xcpl9FqXOAYqI3j79pEtHBBnQgVXIhpULjGQa7DVb0Po+VzmSIK9kanAiWLHoRR/dbZ2qpdPshuXr8l1VaHCzw== 796 | dependencies: 797 | "@ungap/promise-all-settled" "1.1.2" 798 | ansi-colors "4.1.1" 799 | browser-stdout "1.3.1" 800 | chokidar "3.5.2" 801 | debug "4.3.2" 802 | diff "5.0.0" 803 | escape-string-regexp "4.0.0" 804 | find-up "5.0.0" 805 | glob "7.1.7" 806 | growl "1.10.5" 807 | he "1.2.0" 808 | js-yaml "4.1.0" 809 | log-symbols "4.1.0" 810 | minimatch "3.0.4" 811 | ms "2.1.3" 812 | nanoid "3.1.25" 813 | serialize-javascript "6.0.0" 814 | strip-json-comments "3.1.1" 815 | supports-color "8.1.1" 816 | which "2.0.2" 817 | workerpool "6.1.5" 818 | yargs "16.2.0" 819 | yargs-parser "20.2.4" 820 | yargs-unparser "2.0.0" 821 | 822 | ms@2.1.2: 823 | version "2.1.2" 824 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 825 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 826 | 827 | ms@2.1.3: 828 | version "2.1.3" 829 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 830 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 831 | 832 | nanoid@3.1.25: 833 | version "3.1.25" 834 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" 835 | integrity sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q== 836 | 837 | no-case@^3.0.4: 838 | version "3.0.4" 839 | resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" 840 | integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== 841 | dependencies: 842 | lower-case "^2.0.2" 843 | tslib "^2.0.3" 844 | 845 | node-addon-api@^2.0.0: 846 | version "2.0.2" 847 | resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-2.0.2.tgz#432cfa82962ce494b132e9d72a15b29f71ff5d32" 848 | integrity sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA== 849 | 850 | node-fetch@2.6.1: 851 | version "2.6.1" 852 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" 853 | integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== 854 | 855 | node-fetch@2.6.7: 856 | version "2.6.7" 857 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" 858 | integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== 859 | dependencies: 860 | whatwg-url "^5.0.0" 861 | 862 | node-gyp-build@^4.2.0, node-gyp-build@^4.3.0: 863 | version "4.3.0" 864 | resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.3.0.tgz#9f256b03e5826150be39c764bf51e993946d71a3" 865 | integrity sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q== 866 | 867 | normalize-path@^3.0.0, normalize-path@~3.0.0: 868 | version "3.0.0" 869 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 870 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 871 | 872 | once@^1.3.0: 873 | version "1.4.0" 874 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 875 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 876 | dependencies: 877 | wrappy "1" 878 | 879 | p-limit@^3.0.2: 880 | version "3.1.0" 881 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 882 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 883 | dependencies: 884 | yocto-queue "^0.1.0" 885 | 886 | p-locate@^5.0.0: 887 | version "5.0.0" 888 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 889 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 890 | dependencies: 891 | p-limit "^3.0.2" 892 | 893 | pako@^2.0.3: 894 | version "2.0.4" 895 | resolved "https://registry.yarnpkg.com/pako/-/pako-2.0.4.tgz#6cebc4bbb0b6c73b0d5b8d7e8476e2b2fbea576d" 896 | integrity sha512-v8tweI900AUkZN6heMU/4Uy4cXRc2AYNRggVmTR+dEncawDJgCdLMximOVA2p4qO57WMynangsfGRb5WD6L1Bg== 897 | 898 | path-exists@^4.0.0: 899 | version "4.0.0" 900 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 901 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 902 | 903 | path-is-absolute@^1.0.0: 904 | version "1.0.1" 905 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 906 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 907 | 908 | pathval@^1.1.1: 909 | version "1.1.1" 910 | resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.1.tgz#8534e77a77ce7ac5a2512ea21e0fdb8fcf6c3d8d" 911 | integrity sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ== 912 | 913 | picomatch@^2.0.4, picomatch@^2.2.1: 914 | version "2.3.0" 915 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" 916 | integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== 917 | 918 | randombytes@^2.1.0: 919 | version "2.1.0" 920 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 921 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 922 | dependencies: 923 | safe-buffer "^5.1.0" 924 | 925 | readdirp@~3.6.0: 926 | version "3.6.0" 927 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 928 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 929 | dependencies: 930 | picomatch "^2.2.1" 931 | 932 | regenerator-runtime@^0.13.4: 933 | version "0.13.9" 934 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52" 935 | integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA== 936 | 937 | require-directory@^2.1.1: 938 | version "2.1.1" 939 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 940 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 941 | 942 | rpc-websockets@^7.4.2: 943 | version "7.4.16" 944 | resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.4.16.tgz#eb701cdef577d4357ba5f526d50e25f370396fac" 945 | integrity sha512-0b7OVhutzwRIaYAtJo5tqtaQTWKfwAsKnaThOSOy+VkhVdleNUgb8eZnWSdWITRZZEigV5uPEIDr5KZe4DBrdQ== 946 | dependencies: 947 | "@babel/runtime" "^7.11.2" 948 | circular-json "^0.5.9" 949 | eventemitter3 "^4.0.7" 950 | uuid "^8.3.0" 951 | ws "^7.4.5" 952 | optionalDependencies: 953 | bufferutil "^4.0.1" 954 | utf-8-validate "^5.0.2" 955 | 956 | safe-buffer@^5.0.1, safe-buffer@^5.1.0: 957 | version "5.2.1" 958 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 959 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 960 | 961 | secp256k1@^4.0.2: 962 | version "4.0.2" 963 | resolved "https://registry.yarnpkg.com/secp256k1/-/secp256k1-4.0.2.tgz#15dd57d0f0b9fdb54ac1fa1694f40e5e9a54f4a1" 964 | integrity sha512-UDar4sKvWAksIlfX3xIaQReADn+WFnHvbVujpcbr+9Sf/69odMwy2MUsz5CKLQgX9nsIyrjuxL2imVyoNHa3fg== 965 | dependencies: 966 | elliptic "^6.5.2" 967 | node-addon-api "^2.0.0" 968 | node-gyp-build "^4.2.0" 969 | 970 | serialize-javascript@6.0.0: 971 | version "6.0.0" 972 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 973 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 974 | dependencies: 975 | randombytes "^2.1.0" 976 | 977 | snake-case@^3.0.4: 978 | version "3.0.4" 979 | resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" 980 | integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== 981 | dependencies: 982 | dot-case "^3.0.4" 983 | tslib "^2.0.3" 984 | 985 | source-map-support@^0.5.6: 986 | version "0.5.20" 987 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" 988 | integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== 989 | dependencies: 990 | buffer-from "^1.0.0" 991 | source-map "^0.6.0" 992 | 993 | source-map@^0.6.0: 994 | version "0.6.1" 995 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 996 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 997 | 998 | string-width@^4.1.0, string-width@^4.2.0: 999 | version "4.2.3" 1000 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1001 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1002 | dependencies: 1003 | emoji-regex "^8.0.0" 1004 | is-fullwidth-code-point "^3.0.0" 1005 | strip-ansi "^6.0.1" 1006 | 1007 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1008 | version "6.0.1" 1009 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1010 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1011 | dependencies: 1012 | ansi-regex "^5.0.1" 1013 | 1014 | strip-bom@^3.0.0: 1015 | version "3.0.0" 1016 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 1017 | integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= 1018 | 1019 | strip-json-comments@3.1.1: 1020 | version "3.1.1" 1021 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1022 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1023 | 1024 | superstruct@^0.14.2: 1025 | version "0.14.2" 1026 | resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" 1027 | integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== 1028 | 1029 | supports-color@8.1.1: 1030 | version "8.1.1" 1031 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1032 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1033 | dependencies: 1034 | has-flag "^4.0.0" 1035 | 1036 | supports-color@^7.1.0: 1037 | version "7.2.0" 1038 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1039 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1040 | dependencies: 1041 | has-flag "^4.0.0" 1042 | 1043 | text-encoding-utf-8@^1.0.2: 1044 | version "1.0.2" 1045 | resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" 1046 | integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== 1047 | 1048 | "through@>=2.2.7 <3": 1049 | version "2.3.8" 1050 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 1051 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 1052 | 1053 | to-regex-range@^5.0.1: 1054 | version "5.0.1" 1055 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1056 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1057 | dependencies: 1058 | is-number "^7.0.0" 1059 | 1060 | toml@^3.0.0: 1061 | version "3.0.0" 1062 | resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" 1063 | integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== 1064 | 1065 | tr46@~0.0.3: 1066 | version "0.0.3" 1067 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 1068 | integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= 1069 | 1070 | traverse-chain@~0.1.0: 1071 | version "0.1.0" 1072 | resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1" 1073 | integrity sha1-YdvC1Ttp/2CRoSoWj9fUMxB+QPE= 1074 | 1075 | ts-mocha@^8.0.0: 1076 | version "8.0.0" 1077 | resolved "https://registry.yarnpkg.com/ts-mocha/-/ts-mocha-8.0.0.tgz#962d0fa12eeb6468aa1a6b594bb3bbc818da3ef0" 1078 | integrity sha512-Kou1yxTlubLnD5C3unlCVO7nh0HERTezjoVhVw/M5S1SqoUec0WgllQvPk3vzPMc6by8m6xD1uR1yRf8lnVUbA== 1079 | dependencies: 1080 | ts-node "7.0.1" 1081 | optionalDependencies: 1082 | tsconfig-paths "^3.5.0" 1083 | 1084 | ts-node@7.0.1: 1085 | version "7.0.1" 1086 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-7.0.1.tgz#9562dc2d1e6d248d24bc55f773e3f614337d9baf" 1087 | integrity sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw== 1088 | dependencies: 1089 | arrify "^1.0.0" 1090 | buffer-from "^1.1.0" 1091 | diff "^3.1.0" 1092 | make-error "^1.1.1" 1093 | minimist "^1.2.0" 1094 | mkdirp "^0.5.1" 1095 | source-map-support "^0.5.6" 1096 | yn "^2.0.0" 1097 | 1098 | tsconfig-paths@^3.5.0: 1099 | version "3.11.0" 1100 | resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz#954c1fe973da6339c78e06b03ce2e48810b65f36" 1101 | integrity sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA== 1102 | dependencies: 1103 | "@types/json5" "^0.0.29" 1104 | json5 "^1.0.1" 1105 | minimist "^1.2.0" 1106 | strip-bom "^3.0.0" 1107 | 1108 | tslib@^2.0.3: 1109 | version "2.3.1" 1110 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" 1111 | integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== 1112 | 1113 | tweetnacl@^1.0.0: 1114 | version "1.0.3" 1115 | resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-1.0.3.tgz#ac0af71680458d8a6378d0d0d050ab1407d35596" 1116 | integrity sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw== 1117 | 1118 | type-detect@^4.0.0, type-detect@^4.0.5: 1119 | version "4.0.8" 1120 | resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" 1121 | integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== 1122 | 1123 | typescript@^4.3.5: 1124 | version "4.5.2" 1125 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.5.2.tgz#8ac1fba9f52256fdb06fb89e4122fa6a346c2998" 1126 | integrity sha512-5BlMof9H1yGt0P8/WF+wPNw6GfctgGjXp5hkblpyT+8rkASSmkUKMXrxR0Xg8ThVCi/JnHQiKXeBaEwCeQwMFw== 1127 | 1128 | utf-8-validate@^5.0.2: 1129 | version "5.0.7" 1130 | resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.7.tgz#c15a19a6af1f7ad9ec7ddc425747ca28c3644922" 1131 | integrity sha512-vLt1O5Pp+flcArHGIyKEQq883nBt8nN8tVBcoL0qUXj2XT1n7p70yGIq2VK98I5FdZ1YHc0wk/koOnHjnXWk1Q== 1132 | dependencies: 1133 | node-gyp-build "^4.3.0" 1134 | 1135 | uuid@^3.4.0: 1136 | version "3.4.0" 1137 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" 1138 | integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== 1139 | 1140 | uuid@^8.3.0: 1141 | version "8.3.2" 1142 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 1143 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 1144 | 1145 | webidl-conversions@^3.0.0: 1146 | version "3.0.1" 1147 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 1148 | integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= 1149 | 1150 | whatwg-url@^5.0.0: 1151 | version "5.0.0" 1152 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 1153 | integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= 1154 | dependencies: 1155 | tr46 "~0.0.3" 1156 | webidl-conversions "^3.0.0" 1157 | 1158 | which@2.0.2: 1159 | version "2.0.2" 1160 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1161 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1162 | dependencies: 1163 | isexe "^2.0.0" 1164 | 1165 | workerpool@6.1.5: 1166 | version "6.1.5" 1167 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.5.tgz#0f7cf076b6215fd7e1da903ff6f22ddd1886b581" 1168 | integrity sha512-XdKkCK0Zqc6w3iTxLckiuJ81tiD/o5rBE/m+nXpRCB+/Sq4DqkfXZ/x0jW02DG1tGsfUGXbTJyZDP+eu67haSw== 1169 | 1170 | wrap-ansi@^7.0.0: 1171 | version "7.0.0" 1172 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1173 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1174 | dependencies: 1175 | ansi-styles "^4.0.0" 1176 | string-width "^4.1.0" 1177 | strip-ansi "^6.0.0" 1178 | 1179 | wrappy@1: 1180 | version "1.0.2" 1181 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1182 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 1183 | 1184 | ws@^7.4.5: 1185 | version "7.5.5" 1186 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.5.tgz#8b4bc4af518cfabd0473ae4f99144287b33eb881" 1187 | integrity sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w== 1188 | 1189 | y18n@^5.0.5: 1190 | version "5.0.8" 1191 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1192 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1193 | 1194 | yargs-parser@20.2.4: 1195 | version "20.2.4" 1196 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 1197 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 1198 | 1199 | yargs-parser@^20.2.2: 1200 | version "20.2.9" 1201 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1202 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1203 | 1204 | yargs-unparser@2.0.0: 1205 | version "2.0.0" 1206 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1207 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1208 | dependencies: 1209 | camelcase "^6.0.0" 1210 | decamelize "^4.0.0" 1211 | flat "^5.0.2" 1212 | is-plain-obj "^2.1.0" 1213 | 1214 | yargs@16.2.0: 1215 | version "16.2.0" 1216 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1217 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1218 | dependencies: 1219 | cliui "^7.0.2" 1220 | escalade "^3.1.1" 1221 | get-caller-file "^2.0.5" 1222 | require-directory "^2.1.1" 1223 | string-width "^4.2.0" 1224 | y18n "^5.0.5" 1225 | yargs-parser "^20.2.2" 1226 | 1227 | yn@^2.0.0: 1228 | version "2.0.0" 1229 | resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" 1230 | integrity sha1-5a2ryKz0CPY4X8dklWhMiOavaJo= 1231 | 1232 | yocto-queue@^0.1.0: 1233 | version "0.1.0" 1234 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1235 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1236 | --------------------------------------------------------------------------------